Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourModel.cs	(revision 16332)
@@ -262,4 +262,22 @@
 
 
+    public bool IsProblemDataCompatible(IRegressionProblemData problemData, out string errorMessage) {
+      return RegressionModel.IsProblemDataCompatible(this, problemData, out errorMessage);
+    }
+
+    public override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+
+      var regressionProblemData = problemData as IRegressionProblemData;
+      if (regressionProblemData != null)
+        return IsProblemDataCompatible(regressionProblemData, out errorMessage);
+
+      var classificationProblemData = problemData as IClassificationProblemData;
+      if (classificationProblemData != null)
+        return IsProblemDataCompatible(classificationProblemData, out errorMessage);
+
+      throw new ArgumentException("The problem data is not a regression nor a classification problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
+    }
+
     IRegressionSolution IRegressionModel.CreateRegressionSolution(IRegressionProblemData problemData) {
       return new NearestNeighbourRegressionSolution(this, new RegressionProblemData(problemData));
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkEnsembleModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkEnsembleModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkEnsembleModel.cs	(revision 16332)
@@ -130,4 +130,23 @@
     }
 
+
+    public bool IsProblemDataCompatible(IRegressionProblemData problemData, out string errorMessage) {
+      return RegressionModel.IsProblemDataCompatible(this, problemData, out errorMessage);
+    }
+
+    public override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+
+      var regressionProblemData = problemData as IRegressionProblemData;
+      if (regressionProblemData != null)
+        return IsProblemDataCompatible(regressionProblemData, out errorMessage);
+
+      var classificationProblemData = problemData as IClassificationProblemData;
+      if (classificationProblemData != null)
+        return IsProblemDataCompatible(classificationProblemData, out errorMessage);
+
+      throw new ArgumentException("The problem data is not a regression nor a classification problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
+    }
+
     public IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
       return new NeuralNetworkEnsembleRegressionSolution(this, new RegressionEnsembleProblemData(problemData));
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkModel.cs	(revision 16332)
@@ -134,4 +134,22 @@
     }
 
+    public bool IsProblemDataCompatible(IRegressionProblemData problemData, out string errorMessage) {
+      return RegressionModel.IsProblemDataCompatible(this, problemData, out errorMessage);
+    }
+
+    public override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+
+      var regressionProblemData = problemData as IRegressionProblemData;
+      if (regressionProblemData != null)
+        return IsProblemDataCompatible(regressionProblemData, out errorMessage);
+
+      var classificationProblemData = problemData as IClassificationProblemData;
+      if (classificationProblemData != null)
+        return IsProblemDataCompatible(classificationProblemData, out errorMessage);
+
+      throw new ArgumentException("The problem data is not a regression nor a classification problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
+    }
+
     public IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
       return new NeuralNetworkRegressionSolution(this, new RegressionProblemData(problemData));
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestModel.cs	(revision 16332)
@@ -286,4 +286,22 @@
     }
 
+    public bool IsProblemDataCompatible(IRegressionProblemData problemData, out string errorMessage) {
+      return RegressionModel.IsProblemDataCompatible(this, problemData, out errorMessage);
+    }
+
+    public override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+
+      var regressionProblemData = problemData as IRegressionProblemData;
+      if (regressionProblemData != null)
+        return IsProblemDataCompatible(regressionProblemData, out errorMessage);
+
+      var classificationProblemData = problemData as IClassificationProblemData;
+      if (classificationProblemData != null)
+        return IsProblemDataCompatible(classificationProblemData, out errorMessage);
+
+      throw new ArgumentException("The problem data is not a regression nor a classification problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
+    }
+
     public static RandomForestModel CreateRegressionModel(IRegressionProblemData problemData, int nTrees, double r, double m, int seed,
       out double rmsError, out double outOfBagRmsError, out double avgRelError, out double outOfBagAvgRelError) {
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorMachineModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorMachineModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorMachineModel.cs	(revision 16332)
@@ -126,5 +126,23 @@
       return new SupportVectorRegressionSolution(this, new RegressionProblemData(problemData));
     }
-    #endregion
+
+    public bool IsProblemDataCompatible(IRegressionProblemData problemData, out string errorMessage) {
+      return RegressionModel.IsProblemDataCompatible(this, problemData, out errorMessage);
+    }
+    #endregion
+
+    public override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+
+      var regressionProblemData = problemData as IRegressionProblemData;
+      if (regressionProblemData != null)
+        return IsProblemDataCompatible(regressionProblemData, out errorMessage);
+
+      var classificationProblemData = problemData as IClassificationProblemData;
+      if (classificationProblemData != null)
+        return IsProblemDataCompatible(classificationProblemData, out errorMessage);
+
+      throw new ArgumentException("The problem data is not a regression nor a classification problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
+    }
 
     #region IClassificationModel Members
@@ -153,4 +171,5 @@
     }
     #endregion
+
     private IEnumerable<double> GetEstimatedValuesHelper(IDataset dataset, IEnumerable<int> rows) {
       // calculate predictions for the currently requested rows
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/kMeans/KMeansClusteringModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/kMeans/KMeansClusteringModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Algorithms.DataAnalysis/3.4/kMeans/KMeansClusteringModel.cs	(revision 16332)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.Drawing;
@@ -34,10 +35,10 @@
   [StorableClass]
   [Item("KMeansClusteringModel", "Represents a k-Means clustering model.")]
-  public sealed class KMeansClusteringModel : NamedItem, IClusteringModel {
+  public sealed class KMeansClusteringModel : DataAnalysisModel, IClusteringModel {
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Function; }
     }
 
-    public IEnumerable<string> VariablesUsedForPrediction {
+    public override IEnumerable<string> VariablesUsedForPrediction {
       get { return allowedInputVariables; }
     }
@@ -84,4 +85,9 @@
     }
 
+    public override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+      return IsDatasetCompatible(problemData.Dataset, out errorMessage);
+    }
+
 
     public IEnumerable<int> GetClusterValues(IDataset dataset, IEnumerable<int> rows) {
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Data/3.3/StringMatrix.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 16332)
@@ -209,4 +209,20 @@
     }
 
+    public string[,] CloneAsMatrix() {
+      return (string[,])matrix.Clone();
+    }
+
+    public virtual IEnumerable<string> GetRow(int row) {
+      for (var col = 0; col < Columns; col++) {
+        yield return matrix[row, col];
+      }
+    }
+
+    public virtual IEnumerable<string> GetColumn(int col) {
+      for (var row = 0; row < Rows; row++) {
+        yield return matrix[row, col];
+      }
+    }
+
     public override string ToString() {
       if (matrix.Length == 0) return "[]";
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs.sln
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs.sln	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs.sln	(revision 16332)
@@ -1,6 +1,6 @@
 ﻿
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.40629.0
+# Visual Studio 15
+VisualStudioVersion = 15.0.28010.2048
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DayView-1.0", "HeuristicLab.ExtLibs\HeuristicLab.DayView\1.0\HeuristicLab.DayView-1.0.csproj", "{02766ECC-D0F5-4115-9ECA-47409167B638}"
@@ -71,7 +71,9 @@
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.SimSharp-3.0.11", "HeuristicLab.ExtLibs\HeuristicLab.SimSharp\3.0.11\HeuristicLab.SimSharp-3.0.11\HeuristicLab.SimSharp-3.0.11.csproj", "{5C93CAF7-AE6A-4540-95B2-5DA6761A2677}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.MathJax-2.6.1", "HeuristicLab.ExtLibs\HeuristicLab.MathJax\2.6.1\HeuristicLab.MathJax-2.6.1\HeuristicLab.MathJax-2.6.1.csproj", "{BCDA17A6-5B4A-495C-B182-E856CA081BE6}"
-EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.IGraph-0.8.0-pre", "HeuristicLab.ExtLibs\HeuristicLab.Igraph\0.8.0-pre\HeuristicLab.Igraph-0.8.0-pre\HeuristicLab.IGraph-0.8.0-pre.csproj", "{088D34F2-32EA-43FF-BAA8-22428D5B66BE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.NativeInterpreter-0.1", "HeuristicLab.ExtLibs\HeuristicLab.NativeInterpreter\0.1\HeuristicLab.NativeInterpreter-0.1\HeuristicLab.NativeInterpreter-0.1.csproj", "{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.MathJax-2.7.5", "HeuristicLab.ExtLibs\HeuristicLab.MathJax\2.7.5\HeuristicLab.MathJax-2.7.5\HeuristicLab.MathJax-2.7.5.csproj", "{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}"
 EndProject
 Global
@@ -457,16 +459,4 @@
 		{5C93CAF7-AE6A-4540-95B2-5DA6761A2677}.Release|x86.ActiveCfg = Release|x86
 		{5C93CAF7-AE6A-4540-95B2-5DA6761A2677}.Release|x86.Build.0 = Release|x86
-		{BCDA17A6-5B4A-495C-B182-E856CA081BE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{BCDA17A6-5B4A-495C-B182-E856CA081BE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{BCDA17A6-5B4A-495C-B182-E856CA081BE6}.Debug|x64.ActiveCfg = Debug|x64
-		{BCDA17A6-5B4A-495C-B182-E856CA081BE6}.Debug|x64.Build.0 = Debug|x64
-		{BCDA17A6-5B4A-495C-B182-E856CA081BE6}.Debug|x86.ActiveCfg = Debug|x86
-		{BCDA17A6-5B4A-495C-B182-E856CA081BE6}.Debug|x86.Build.0 = Debug|x86
-		{BCDA17A6-5B4A-495C-B182-E856CA081BE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{BCDA17A6-5B4A-495C-B182-E856CA081BE6}.Release|Any CPU.Build.0 = Release|Any CPU
-		{BCDA17A6-5B4A-495C-B182-E856CA081BE6}.Release|x64.ActiveCfg = Release|x64
-		{BCDA17A6-5B4A-495C-B182-E856CA081BE6}.Release|x64.Build.0 = Release|x64
-		{BCDA17A6-5B4A-495C-B182-E856CA081BE6}.Release|x86.ActiveCfg = Release|x86
-		{BCDA17A6-5B4A-495C-B182-E856CA081BE6}.Release|x86.Build.0 = Release|x86
 		{088D34F2-32EA-43FF-BAA8-22428D5B66BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{088D34F2-32EA-43FF-BAA8-22428D5B66BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
@@ -477,7 +467,34 @@
 		{088D34F2-32EA-43FF-BAA8-22428D5B66BE}.Release|x64.ActiveCfg = Release|Any CPU
 		{088D34F2-32EA-43FF-BAA8-22428D5B66BE}.Release|x86.ActiveCfg = Release|Any CPU
+		{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}.Debug|x64.Build.0 = Debug|Any CPU
+		{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}.Debug|x86.Build.0 = Debug|Any CPU
+		{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}.Release|x64.ActiveCfg = Release|Any CPU
+		{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}.Release|x64.Build.0 = Release|Any CPU
+		{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}.Release|x86.ActiveCfg = Release|Any CPU
+		{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}.Release|x86.Build.0 = Release|Any CPU
+		{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}.Debug|x64.ActiveCfg = Debug|x64
+		{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}.Debug|x64.Build.0 = Debug|x64
+		{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}.Debug|x86.ActiveCfg = Debug|x86
+		{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}.Debug|x86.Build.0 = Debug|x86
+		{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}.Release|x64.ActiveCfg = Release|x64
+		{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}.Release|x64.Build.0 = Release|x64
+		{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}.Release|x86.ActiveCfg = Release|x86
+		{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {7851D6F6-9C5F-4A36-8159-8F1C316DFAE0}
+	EndGlobalSection
 EndGlobal
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.7.5/HeuristicLab.MathJax-2.7.5/HeuristicLab.MathJax-2.7.5.csproj
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.7.5/HeuristicLab.MathJax-2.7.5/HeuristicLab.MathJax-2.7.5.csproj	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.7.5/HeuristicLab.MathJax-2.7.5/HeuristicLab.MathJax-2.7.5.csproj	(revision 16332)
@@ -0,0 +1,190 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{31C09AD0-9610-4AFB-AE57-0F10AAC82BE5}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.MathJax</RootNamespace>
+    <AssemblyName>HeuristicLab.MathJax-2.7.5</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.IO.Compression" />
+    <Reference Include="System.IO.Compression.FileSystem" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="MathJax.zip">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="obj\Debug\DesignTimeResolveAssemblyReferencesInput.cache" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="MathJax license.txt">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="obj\Debug\TempPE\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.7.5/HeuristicLab.MathJax-2.7.5/MathJax license.txt
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.7.5/HeuristicLab.MathJax-2.7.5/MathJax license.txt	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.7.5/HeuristicLab.MathJax-2.7.5/MathJax license.txt	(revision 16332)
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.7.5/HeuristicLab.MathJax-2.7.5/Plugin.cs.frame
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.7.5/HeuristicLab.MathJax-2.7.5/Plugin.cs.frame	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.7.5/HeuristicLab.MathJax-2.7.5/Plugin.cs.frame	(revision 16332)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.IO;
+using System.IO.Compression;
+using System.Linq;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.MathJax {
+  [Plugin("HeuristicLab.MathJax", "HeuristicLab transport plugin for MathJax (www.mathjax.org) , an open source JavaScript display engine for mathematics that works in all browsers", "1.2.$WCREV$")]
+  [PluginFile("HeuristicLab.MathJax-2.7.5.dll", PluginFileType.Assembly)]
+  [PluginFile("MathJax license.txt", PluginFileType.License)]
+  [PluginFile("mathjax.zip", PluginFileType.Data)]
+
+  public class HeuristicLabMathJaxPlugin : PluginBase {
+    public override void OnLoad() {
+      base.OnLoad();
+      if (!Directory.EnumerateDirectories(AppDomain.CurrentDomain.BaseDirectory, "MathJax", SearchOption.TopDirectoryOnly).Any()) {
+        ZipFile.ExtractToDirectory(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "mathjax.zip"), AppDomain.CurrentDomain.BaseDirectory);
+      }
+    }
+  }
+}
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.7.5/HeuristicLab.MathJax-2.7.5/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.7.5/HeuristicLab.MathJax-2.7.5/Properties/AssemblyInfo.cs.frame	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.7.5/HeuristicLab.MathJax-2.7.5/Properties/AssemblyInfo.cs.frame	(revision 16332)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.MathJax")]
+[assembly: AssemblyDescription("HeuristicLab transport plugin for MathJax (www.mathjax.org) , an open source JavaScript display engine for mathematics that works in all browsers")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("A154E1A6-13D2-4ED2-9746-C75D8C8EEB09")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("2.7.5")]
+[assembly: AssemblyFileVersion("2.7.5.$WCREV$")]
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/DllImporter.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/DllImporter.cs	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/DllImporter.cs	(revision 16332)
@@ -0,0 +1,65 @@
+﻿using System;
+using System.Runtime.InteropServices;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
+  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+  public struct NativeInstruction {
+    public byte opcode;
+    public ushort narg;
+    public int childIndex;
+    public double value;
+    public double weight;
+
+    public IntPtr buf;
+    public IntPtr data;
+  }
+
+  public class NativeWrapper {
+    private const string x86dll = "hl-native-interpreter-msvc-x86.dll";
+    private const string x64dll = "hl-native-interpreter-msvc-x64.dll";
+
+    private readonly static bool is64;
+
+    static NativeWrapper() {
+      is64 = Environment.Is64BitProcess;
+    }
+
+    public static double GetValue(NativeInstruction[] code, int len, int row) {
+      return is64 ? GetValue64(code, len, row) : GetValue32(code, len, row);
+    }
+
+    public static void GetValues(NativeInstruction[] code, int len, int[] rows, int nRows, double[] result) {
+      if (is64)
+        GetValues64(code, len, rows, nRows, result);
+      else
+        GetValues32(code, len, rows, nRows, result);
+    }
+
+    public static void GetValuesVectorized(NativeInstruction[] code, int len, int[] rows, int nRows, double[] result) {
+      if (is64)
+        GetValuesVectorized64(code, len, rows, nRows, result);
+      else
+        GetValuesVectorized32(code, len, rows, nRows, result);
+    }
+
+    // x86
+    [DllImport(x86dll, EntryPoint = "GetValue", CallingConvention = CallingConvention.Cdecl)]
+    internal static extern double GetValue32(NativeInstruction[] code, int len, int row);
+
+    [DllImport(x86dll, EntryPoint = "GetValues", CallingConvention = CallingConvention.Cdecl)]
+    internal static extern void GetValues32(NativeInstruction[] code, int len, int[] rows, int nRows, double[] result);
+
+    [DllImport(x86dll, EntryPoint = "GetValuesVectorized", CallingConvention = CallingConvention.Cdecl)]
+    internal static extern void GetValuesVectorized32(NativeInstruction[] code, int len, int[] rows, int nRows, double[] result);
+
+    // x64
+    [DllImport(x64dll, EntryPoint = "GetValue", CallingConvention = CallingConvention.Cdecl)]
+    internal static extern double GetValue64(NativeInstruction[] code, int len, int row);
+
+    [DllImport(x64dll, EntryPoint = "GetValues", CallingConvention = CallingConvention.Cdecl)]
+    internal static extern void GetValues64(NativeInstruction[] code, int len, int[] rows, int nRows, double[] result);
+
+    [DllImport(x64dll, EntryPoint = "GetValuesVectorized", CallingConvention = CallingConvention.Cdecl)]
+    internal static extern void GetValuesVectorized64(NativeInstruction[] code, int len, int[] rows, int nRows, double[] result);
+  }
+}
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/HeuristicLab.NativeInterpreter-0.1.csproj
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/HeuristicLab.NativeInterpreter-0.1.csproj	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/HeuristicLab.NativeInterpreter-0.1.csproj	(revision 16332)
@@ -0,0 +1,72 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.DataAnalysis.Symbolic.NativeInterpreter</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.DataAnalysis.Symbolic.NativeInterpreter-0.1</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <Deterministic>true</Deterministic>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="DllImporter.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="hl-native-interpreter-msvc-x64.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="hl-native-interpreter-msvc-x86.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/Plugin.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/Plugin.cs	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/Plugin.cs	(revision 16332)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
+  [Plugin("HeuristicLab.NativeInterpreter", "Provides a native (C++) interpreter for symbolic expression trees", "0.0.0.1")]
+  [PluginFile("HeuristicLab.Problems.DataAnalysis.Symbolic.NativeInterpreter-0.1.dll", PluginFileType.Assembly)]
+  [PluginFile("hl-native-interpreter-msvc-x86.dll", PluginFileType.NativeDll)]
+  [PluginFile("hl-native-interpreter-msvc-x64.dll", PluginFileType.NativeDll)]
+  public class HeuristicLabNativeInterpreterPlugin : PluginBase {
+  }
+}
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/Properties/AssemblyInfo.cs	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/Properties/AssemblyInfo.cs	(revision 16332)
@@ -0,0 +1,36 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.DataAnalysis.Symbolic.NativeInterpreter-0.1")]
+[assembly: AssemblyDescription("A wrapper for a native code implementation of a tree interpreter")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab.Problems.DataAnalysis.Symbolic.NativeInterpreter-0.1")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("e05ac63f-6924-4c83-bd0a-edf3c103c1d8")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("0.0.0.1")]
+[assembly: AssemblyFileVersion("0.0.0.1")]
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/.ycm_extra_conf.py
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/.ycm_extra_conf.py	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/.ycm_extra_conf.py	(revision 16332)
@@ -0,0 +1,145 @@
+# Generated by YCM Generator at 2018-11-01 01:38:35.867002
+
+# This file is NOT licensed under the GPLv3, which is the license for the rest
+# of YouCompleteMe.
+#
+# Here's the license text for this file:
+#
+# This is free and unencumbered software released into the public domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a compiled
+# binary, for any purpose, commercial or non-commercial, and by any
+# means.
+#
+# In jurisdictions that recognize copyright laws, the author or authors
+# of this software dedicate any and all copyright interest in the
+# software to the public domain. We make this dedication for the benefit
+# of the public at large and to the detriment of our heirs and
+# successors. We intend this dedication to be an overt act of
+# relinquishment in perpetuity of all present and future rights to this
+# software under copyright law.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# For more information, please refer to <http://unlicense.org/>
+
+import os
+import ycm_core
+
+flags = [
+    '-x',
+    'c++',
+    '-Dhl_native_interpreter_EXPORTS',
+    '-I/mnt/c/Projects/hl-native-interpreter/src',
+    '-I/mnt/c/Projects/hl-native-interpreter/lib',
+    '-Wall',
+    '-Werror',
+    '-Wextra',
+    '-fdeclspec',
+    '-std=c++14',
+]
+
+
+# Set this to the absolute path to the folder (NOT the file!) containing the
+# compile_commands.json file to use that instead of 'flags'. See here for
+# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
+#
+# You can get CMake to generate this file for you by adding:
+#   set( CMAKE_EXPORT_COMPILE_COMMANDS 1 )
+# to your CMakeLists.txt file.
+#
+# Most projects will NOT need to set this to anything; you can just change the
+# 'flags' list of compilation flags. Notice that YCM itself uses that approach.
+compilation_database_folder = ''
+
+if os.path.exists( compilation_database_folder ):
+  database = ycm_core.CompilationDatabase( compilation_database_folder )
+else:
+  database = None
+
+SOURCE_EXTENSIONS = [ '.C', '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ]
+
+def DirectoryOfThisScript():
+  return os.path.dirname( os.path.abspath( __file__ ) )
+
+
+def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
+  if not working_directory:
+    return list( flags )
+  new_flags = []
+  make_next_absolute = False
+  path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ]
+  for flag in flags:
+    new_flag = flag
+
+    if make_next_absolute:
+      make_next_absolute = False
+      if not flag.startswith( '/' ):
+        new_flag = os.path.join( working_directory, flag )
+
+    for path_flag in path_flags:
+      if flag == path_flag:
+        make_next_absolute = True
+        break
+
+      if flag.startswith( path_flag ):
+        path = flag[ len( path_flag ): ]
+        new_flag = path_flag + os.path.join( working_directory, path )
+        break
+
+    if new_flag:
+      new_flags.append( new_flag )
+  return new_flags
+
+
+def IsHeaderFile( filename ):
+  extension = os.path.splitext( filename )[ 1 ]
+  return extension in [ '.H', '.h', '.hxx', '.hpp', '.hh' ]
+
+
+def GetCompilationInfoForFile( filename ):
+  # The compilation_commands.json file generated by CMake does not have entries
+  # for header files. So we do our best by asking the db for flags for a
+  # corresponding source file, if any. If one exists, the flags for that file
+  # should be good enough.
+  if IsHeaderFile( filename ):
+    basename = os.path.splitext( filename )[ 0 ]
+    for extension in SOURCE_EXTENSIONS:
+      replacement_file = basename + extension
+      if os.path.exists( replacement_file ):
+        compilation_info = database.GetCompilationInfoForFile(
+          replacement_file )
+        if compilation_info.compiler_flags_:
+          return compilation_info
+    return None
+  return database.GetCompilationInfoForFile( filename )
+
+
+def FlagsForFile( filename, **kwargs ):
+  if database:
+    # Bear in mind that compilation_info.compiler_flags_ does NOT return a
+    # python list, but a "list-like" StringVec object
+    compilation_info = GetCompilationInfoForFile( filename )
+    if not compilation_info:
+      return None
+
+    final_flags = MakeRelativePathsInFlagsAbsolute(
+      compilation_info.compiler_flags_,
+      compilation_info.compiler_working_dir_ )
+
+  else:
+    relative_to = DirectoryOfThisScript()
+    final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )
+
+  return {
+    'flags': final_flags,
+    'do_cache': True
+  }
+
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/CMakeLists.txt
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/CMakeLists.txt	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/CMakeLists.txt	(revision 16332)
@@ -0,0 +1,28 @@
+cmake_minimum_required(VERSION 3.0)
+
+project(
+    hl-native-interpreter
+    VERSION 0.1
+    DESCRIPTION "Native C++ interpreter for HeuristicLab symbolic expression trees"
+    LANGUAGES CXX
+)
+
+add_library(hl-native-interpreter SHARED src/interpreter.cpp)
+target_include_directories(hl-native-interpreter PRIVATE ${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/lib)
+target_compile_features(hl-native-interpreter PRIVATE cxx_std_17)
+
+add_library(hl-native-interpreter-vdt SHARED src/interpreter.cpp)
+target_include_directories(hl-native-interpreter-vdt PRIVATE ${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/lib)
+target_compile_features(hl-native-interpreter-vdt PRIVATE cxx_std_17)
+
+if(MSVC)
+    target_compile_options(hl-native-interpreter PRIVATE "/W4" "/Qvec-report:2" "$<$<CONFIG:Release>:/O2>")
+    target_compile_options(hl-native-interpreter-vdt PRIVATE "/W4" "/Qvec-report:2" "$<$<CONFIG:Release>:/O2>")
+    target_compile_definitions(hl-native-interpreter-vdt PRIVATE "USE_VDT")
+else()
+    target_compile_options(hl-native-interpreter PRIVATE "-Wall" "-Wextra" "-Werror" "-fopt-info-vec-optimized" "$<$<CONFIG:Release>:-O3;-march=x86-64>")
+    target_compile_options(hl-native-interpreter-vdt PRIVATE "-Wall" "-Wextra" "-Werror" "-fopt-info-vec-optimized" "$<$<CONFIG:Release>:-O3;-march=x86-64>")
+    target_compile_definitions(hl-native-interpreter-vdt PRIVATE "USE_VDT")
+    set_target_properties(hl-native-interpreter PROPERTIES PREFIX "")
+    set_target_properties(hl-native-interpreter-vdt PROPERTIES PREFIX "")
+endif()
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/README.md
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/README.md	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/README.md	(revision 16332)
@@ -0,0 +1,66 @@
+# Build instructions
+
+1) Create a folder to hold the build 
+
+`mkdir build` 
+
+`cd build`
+
+2) Run CMake 
+
+- Visual Studio
+
+    `cmake -G "Microsoft Visual Studio 15 2017 [arch]" <path-to-repository>`. Leave `arch` empty for x86 or `Win64` for x64. 
+    
+    `cmake --build . --config Release`
+
+- MinGW
+
+    `cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release|Debug`. CMake supports different build types: `Release`, `Debug`, `MinSizeRel` and `RelWithDebInfo`. 
+    
+    `cmake --build .` or `make` or `make VERBOSE=1`
+    
+The build system generates two targets, one using the standard math library functions (`std::exp`, `std::log`, etc.) and the other using functions from the [vdt](https://github.com/dpiparo/vdt) library (described in more detail in [this talk from CERN](https://indico.cern.ch/event/202688/contributions/1487957/attachments/305612/426820/OpenLabFPWorkshop_9_2012.pdf)). A performance comparison with existing HL interpreters is given below. MinGW and MSVC builds of this library were tested. The non-vdt MinGW binary suffers significant peformance loss due to trancendental functions `log` and `exp`. All MinGW binaries also exhibit performance loss with the `pow` and `root` functions. Batched versions take advantage of auto-vectorization. Overall the `Native-MinGW-Vdt[BatchSize=64]` performs the best on the selected grammars. Units in the table correspond to billion node evaluations per second.
+    
+    
+# Performance
+
+## Arithmetic Grammar 
+
+|  Rows | StandardInterpreter | LinerInterpreter | ILEmittingInterpreter | CompiledTreeInterpreter | Native-MSVC-Std | Native-MSVC-Vdt | Native-MinGW-Std | Native-MinGW-Vdt | Native-MSVC-Std[BatchSize=64] | Native-MSVC-Vdt[BatchSize=64] | Native-MinGW-Std[BatchSize=64] | Native-MinGW-Vdt[BatchSize=64] |
+|:-----:|:-------------------:|:----------------:|:---------------------:|:-----------------------:|:---------------:|:---------------:|:----------------:|:----------------:|:-----------------------------:|:-----------------------------:|:------------------------------:|:------------------------------:|
+|  1000 |        0.0430       |      0.2115      |         0.0922        |          0.0817         |      0.5487     |      0.5118     |      0.5512      |      0.5665      |             1.2304            |             1.1942            |             1.1942             |             1.2688             |
+|  2000 |        0.0488       |      0.2048      |         0.1584        |          0.1501         |      0.5845     |      0.5803     |      0.5817      |      0.5668      |             1.3247            |             1.1497            |             1.3693             |             1.3617             |
+|  3000 |        0.0487       |      0.2087      |         0.2142        |          0.2049         |      0.5832     |      0.5678     |      0.5851      |      0.5722      |             1.4745            |             1.2876            |             1.4986             |             1.4986             |
+|  4000 |        0.0488       |      0.2113      |         0.2492        |          0.2423         |      0.4828     |      0.5254     |      0.5472      |      0.5696      |             1.5237            |             1.5190            |             1.4555             |             1.4341             |
+|  5000 |        0.0489       |      0.2072      |         0.2645        |          0.2576         |      0.5394     |      0.4646     |      0.5788      |      0.5618      |             1.3790            |             1.0923            |             1.5276             |             1.5509             |
+|  6000 |        0.0486       |      0.2065      |         0.3038        |          0.3248         |      0.5875     |      0.5861     |      0.5020      |      0.4713      |             1.5239            |             1.0601            |             1.4897             |             1.5399             |
+|  7000 |        0.0489       |      0.2082      |         0.3261        |          0.3518         |      0.5751     |      0.5869     |      0.5805      |      0.5993      |             1.1952            |             1.0627            |             1.2332             |             1.2191             |
+|  8000 |        0.0487       |      0.2086      |         0.3467        |          0.3760         |      0.5890     |      0.5737     |      0.5781      |      0.6024      |             1.3660            |             1.5192            |             1.3622             |             1.4428             |
+|  9000 |        0.0485       |      0.2033      |         0.3653        |          0.3924         |      0.5915     |      0.5918     |      0.5778      |      0.5855      |             1.4990            |             1.5476            |             1.5742             |             1.5325             |
+| 10000 |        0.0486       |      0.2048      |         0.3749        |          0.4080         |      0.5825     |      0.6015     |      0.5797      |      0.6069      |             1.5221            |             1.5671            |             1.4601             |             1.5958             |
+
+## TypeCoherent Grammar
+
+|  Rows | StandardInterpreter | LinerInterpreter | ILEmittingInterpreter | CompiledTreeInterpreter | Native-MSVC-Std | Native-MSVC-Vdt | Native-MinGW-Std | Native-MinGW-Vdt | Native-MSVC-Std[BatchSize=64] | Native-MSVC-Vdt[BatchSize=64] | Native-MinGW-Std[BatchSize=64] | Native-MinGW-Vdt[BatchSize=64] |
+|:-----:|:-------------------:|:----------------:|:---------------------:|:-----------------------:|:---------------:|:---------------:|:----------------:|:----------------:|:-----------------------------:|:-----------------------------:|:------------------------------:|:------------------------------:|
+|  1000 |        0.0435       |      0.1522      |         0.0813        |          0.0732         |      0.3049     |      0.3074     |      0.2419      |      0.3098      |             0.7542            |             0.7928            |             0.3049             |             1.1368             |
+|  2000 |        0.0441       |      0.1569      |         0.1254        |          0.1165         |      0.3066     |      0.3138     |      0.2407      |      0.3170      |             0.7932            |             0.8429            |             0.3199             |             1.2424             |
+|  3000 |        0.0441       |      0.1536      |         0.1521        |          0.1476         |      0.3115     |      0.3088     |      0.2397      |      0.3136      |             0.8595            |             0.8675            |             0.3268             |             1.3074             |
+|  4000 |        0.0440       |      0.1559      |         0.1708        |          0.1692         |      0.3122     |      0.3166     |      0.2420      |      0.3172      |             0.8443            |             0.8918            |             0.3247             |             1.3084             |
+|  5000 |        0.0436       |      0.1543      |         0.1829        |          0.1852         |      0.3119     |      0.3138     |      0.2355      |      0.3175      |             0.8634            |             0.8872            |             0.3165             |             1.3024             |
+|  6000 |        0.0439       |      0.1539      |         0.1950        |          0.1939         |      0.3091     |      0.3060     |      0.2389      |      0.3127      |             0.8758            |             0.9049            |             0.3284             |             1.3058             |
+|  7000 |        0.0437       |      0.1553      |         0.2013        |          0.2055         |      0.3131     |      0.2835     |      0.2403      |      0.3141      |             0.8542            |             0.8989            |             0.3292             |             1.2941             |
+|  8000 |        0.0442       |      0.1530      |         0.2084        |          0.2095         |      0.3109     |      0.3096     |      0.2381      |      0.3132      |             0.8804            |             0.9049            |             0.3286             |             1.3383             |
+|  9000 |        0.0440       |      0.1552      |         0.2127        |          0.2222         |      0.3107     |      0.2944     |      0.2385      |      0.3035      |             0.8359            |             0.9049            |             0.3171             |             1.2707             |
+| 10000 |        0.0439       |      0.1554      |         0.2133        |          0.2274         |      0.3118     |      0.2870     |      0.2385      |      0.3089      |             0.8424            |             0.9023            |             0.3187             |             1.3271             |
+
+
+
+
+
+
+
+
+
+
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/asin.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/asin.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/asin.h	(revision 16332)
@@ -0,0 +1,217 @@
+/*
+ * aasin.h
+ * The basic idea is to exploit Pade' polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ASIN_H_
+#define ASIN_H_
+
+#include "vdtcore_common.h"
+
+namespace vdt{
+
+namespace details{
+
+const double RX1asin = 2.967721961301243206100E-3;
+const double RX2asin = -5.634242780008963776856E-1;
+const double RX3asin = 6.968710824104713396794E0;
+const double RX4asin = -2.556901049652824852289E1;
+const double RX5asin = 2.853665548261061424989E1;
+
+const double SX1asin = -2.194779531642920639778E1;
+const double SX2asin =  1.470656354026814941758E2;
+const double SX3asin = -3.838770957603691357202E2;
+const double SX4asin = 3.424398657913078477438E2;
+
+const double PX1asin = 4.253011369004428248960E-3;
+const double PX2asin = -6.019598008014123785661E-1;
+const double PX3asin = 5.444622390564711410273E0;
+const double PX4asin = -1.626247967210700244449E1;
+const double PX5asin = 1.956261983317594739197E1;
+const double PX6asin = -8.198089802484824371615E0;
+
+const double QX1asin = -1.474091372988853791896E1;
+const double QX2asin =  7.049610280856842141659E1;
+const double QX3asin = -1.471791292232726029859E2;
+const double QX4asin = 1.395105614657485689735E2;
+const double QX5asin = -4.918853881490881290097E1;
+
+inline double getRX(const double x){
+	double rx = RX1asin;
+	rx*= x;
+	rx+= RX2asin;
+	rx*= x;    
+	rx+= RX3asin;
+	rx*= x;    
+	rx+= RX4asin;
+	rx*= x;    
+	rx+= RX5asin;
+	return rx;
+}
+inline double getSX(const double x){
+	double sx = x;
+	sx+= SX1asin;
+	sx*= x;    
+	sx+= SX2asin;
+	sx*= x;    
+	sx+= SX3asin;
+	sx*= x;    
+	sx+= SX4asin;
+	return sx;
+}
+
+inline double getPX(const double x){
+	double px = PX1asin;
+	px*= x;
+	px+= PX2asin;
+	px*= x;    
+	px+= PX3asin;
+	px*= x;    
+	px+= PX4asin;
+	px*= x;    
+	px+= PX5asin;
+	px*= x;    
+	px+= PX6asin;
+	return px;
+}
+
+inline double getQX(const double x){
+	double qx = x;
+	qx+= QX1asin;
+	qx*= x;    
+	qx+= QX2asin;
+	qx*= x;    
+	qx+= QX3asin;
+	qx*= x;    
+	qx+= QX4asin;
+	qx*= x;    
+	qx+= QX5asin;
+	return qx;
+	}
+}
+
+}
+
+namespace vdt{
+
+// asin double precision --------------------------------------------------------
+/// Double Precision asin
+inline double fast_asin(double x){	
+
+	const uint64_t sign_mask = details::getSignMask(x);
+	x = std::fabs(x);
+	const double a = x;
+	
+	
+	double zz = 1.0 - a;
+	double px = details::getRX(zz);
+	double qx = details::getSX(zz);
+
+	const double p = zz * px/qx;
+
+	zz = std::sqrt(zz+zz);
+	double z = details::PIO4 - zz;
+	zz = zz * p - details::MOREBITS;
+	z -= zz;
+	z += details::PIO4;
+	
+	if( a < 0.625 ){
+		zz = a * a;
+		px = details::getPX(zz);
+		qx = details::getQX(zz);
+		z = zz*px/qx;    
+		z = a * z + a;
+	}
+	
+
+	// Linear approx, not sooo needed but seable. Price is cheap though
+	double res = a < 1e-8? a : z ;
+        // Restore Sign	
+	return details::dpORuint64(res,sign_mask);
+
+}
+
+//------------------------------------------------------------------------------
+/// Single Precision asin
+inline float fast_asinf(float x){      
+
+
+    uint32_t flag=0;
+
+    const uint32_t sign_mask = details::getSignMask(x);
+    const float a = std::fabs(x);
+
+    float z;
+    if( a > 0.5f )
+        {
+        z = 0.5f * (1.0f - a);
+        x = sqrtf( z );
+        flag = 1;
+        }
+    else
+        {
+        x = a;
+        z = x * x;
+        }
+        
+    z = (((( 4.2163199048E-2f * z
+            + 2.4181311049E-2f) * z
+            + 4.5470025998E-2f) * z
+            + 7.4953002686E-2f) * z
+            + 1.6666752422E-1f) * z * x
+            + x;
+
+//     if( flag != 0 )
+//       {
+//       z = z + z;
+//       z = PIO2F - z;
+//       }
+
+    // No branch with the two coefficients
+            
+    float tmp = z + z;
+    tmp = details::PIO2F - tmp;
+
+    // Linear approx, not sooo needed but seable. Price is cheap though
+    float res = a < 1e-4f? a : tmp * flag + (1-flag) * z ;
+    
+    // Restore Sign 
+    return details::spORuint32(res,sign_mask);
+
+}
+
+//------------------------------------------------------------------------------
+// The cos is in this file as well
+
+inline double fast_acos( double x ){return details::PIO2  - fast_asin(x);}
+
+//------------------------------------------------------------------------------
+
+inline float fast_acosf( float x ){return details::PIO2F  - fast_asinf(x);}
+
+//------------------------------------------------------------------------------
+
+} //vdt namespace
+
+#endif /* ASIN_H_ */
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/atan.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/atan.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/atan.h	(revision 16332)
@@ -0,0 +1,163 @@
+/*
+ * atan.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ATAN_H_
+#define ATAN_H_
+
+#include "vdtcore_common.h"
+
+namespace vdt{
+
+namespace details{
+const double T3PO8 = 2.41421356237309504880;
+const double MOREBITSO2 = MOREBITS * 0.5;
+
+inline double get_atan_px(const double x2){
+
+	const double PX1atan = -8.750608600031904122785E-1;
+	const double PX2atan = -1.615753718733365076637E1;
+	const double PX3atan = -7.500855792314704667340E1;
+	const double PX4atan = -1.228866684490136173410E2;
+	const double PX5atan = -6.485021904942025371773E1;
+
+	double px = PX1atan;
+	px *= x2;
+	px += PX2atan;
+	px *= x2;
+	px += PX3atan;
+	px *= x2;
+	px += PX4atan;
+	px *= x2;
+	px += PX5atan;
+
+	return px;
+}
+
+
+inline double get_atan_qx(const double x2){
+	const double QX1atan = 2.485846490142306297962E1;
+	const double QX2atan = 1.650270098316988542046E2;
+	const double QX3atan = 4.328810604912902668951E2;
+	const double QX4atan = 4.853903996359136964868E2;
+	const double QX5atan = 1.945506571482613964425E2;
+
+	double qx=x2;
+	qx += QX1atan;
+	qx *=x2;
+	qx += QX2atan;
+	qx *=x2;
+	qx += QX3atan;
+	qx *=x2;
+	qx += QX4atan;
+	qx *=x2;
+	qx += QX5atan;
+
+	return qx;
+}
+
+}
+
+
+
+/// Fast Atan implementation double precision
+inline double fast_atan(double x){
+
+	/* make argument positive and save the sign */
+	const uint64_t sign_mask = details::getSignMask(x);
+	x=std::fabs(x);
+
+	/* range reduction */
+	const double originalx=x;
+
+	double y = details::PIO4;
+	double factor = details::MOREBITSO2;
+	x = (x-1.0) / (x+1.0);
+
+	if( originalx > details::T3PO8 ) {
+		y = details::PIO2;
+		factor = details::MOREBITS;
+		x = -1.0 / originalx ;
+	}
+	if ( originalx <= 0.66 ) {
+		y = 0.;
+		factor = 0.;
+		x = originalx;
+	}
+
+	const double x2 = x * x;
+
+	const double px = details::get_atan_px(x2);
+	const double qx = details::get_atan_qx(x2);
+
+	//double res = y +x * x2 * px / qx + x +factor;
+
+	const double poq=px / qx;
+
+	double res = x * x2 * poq + x;
+	res+=y;
+
+	res+=factor;
+
+	return details::dpORuint64(res,sign_mask);
+}
+
+//------------------------------------------------------------------------------
+/// Fast Atan implementation single precision
+inline float fast_atanf( float xx ) {
+
+	const uint32_t sign_mask = details::getSignMask(xx);
+
+	float x= std::fabs(xx);
+	const float x0=x;
+	float y=0.0f;
+
+	/* range reduction */
+	if( x0 > 0.4142135623730950f ){ // * tan pi/8
+		x = (x0-1.0f)/(x0+1.0f);
+		y = details::PIO4F;
+	}
+	if( x0 > 2.414213562373095f ){  // tan 3pi/8
+		x = -( 1.0f/x0 );
+		y = details::PIO2F;
+	}
+
+
+	const float x2 = x * x;
+	y +=
+			((( 8.05374449538e-2f * x2
+					- 1.38776856032E-1f) * x2
+					+ 1.99777106478E-1f) * x2
+					- 3.33329491539E-1f) * x2 * x
+					+ x;
+
+	return details::spORuint32(y,sign_mask);
+}
+
+//------------------------------------------------------------------------------
+
+}// end of vdt
+
+#endif // end of atan
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/atan2.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/atan2.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/atan2.h	(revision 16332)
@@ -0,0 +1,143 @@
+/*
+ * atan2.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code.
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ *
+ *  Created on: Sept 20, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/*
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ATAN2_H_
+#define ATAN2_H_
+
+#include "vdtcore_common.h"
+#include "atan.h"
+
+namespace vdt{
+
+inline double fast_atan2( double y, double x ) {
+    // move in first octant
+    double xx = std::fabs(x);
+    double yy = std::fabs(y);
+    double tmp (0.0);
+    if (yy>xx) {
+        tmp = yy;
+        yy=xx; xx=tmp;
+        tmp=1.;
+    }
+
+    // To avoid the fpe, we protect against /0.
+    const double oneIfXXZero = (xx==0.);
+    double t=yy/(xx+oneIfXXZero);
+    double z=t;
+
+    double s = details::PIO4;
+    double factor = details::MOREBITSO2;
+    t = (t-1.0) / (t+1.0);
+
+    if( z > details::T3PO8 ) {
+        s = details::PIO2;
+        factor = details::MOREBITS;
+        t = -1.0 / z ;
+    }
+    if ( z <= 0.66 ) {
+        s = 0.;
+        factor = 0.;
+        t = z;
+    }
+
+    const double t2 = t * t;
+
+    const double px = details::get_atan_px(t2);
+    const double qx = details::get_atan_qx(t2);
+
+    //double res = y +x * x2 * px / qx + x +factor;
+
+    const double poq=px / qx;
+
+    double ret = t * t2 * poq + t;
+    ret+=s;
+
+    ret+=factor;
+
+    // Here we put the result to 0 if xx was 0, if not nothing happens!
+    ret*= (1.-oneIfXXZero);
+
+    // move back in place
+    if (y==0) ret=0.0;
+    if (tmp!=0) ret = details::PIO2 - ret;
+    if (x<0) ret = details::PI - ret;
+    if (y<0) ret = -ret;
+
+
+    return ret;
+}
+
+inline float fast_atan2f( float y, float x ) {
+
+    // move in first octant
+    float xx = std::fabs(x);
+    float yy = std::fabs(y);
+    float tmp (0.0f);
+    if (yy>xx) {
+        tmp = yy;
+        yy=xx; xx=tmp;
+        tmp =1.f;
+    }
+
+    // To avoid the fpe, we protect against /0.
+    const float oneIfXXZero = (xx==0.f);
+    
+    float t=yy/(xx/*+oneIfXXZero*/);
+    float z=t;
+    if( t > 0.4142135623730950f ) // * tan pi/8
+            z = (t-1.0f)/(t+1.0f);
+
+    //printf("%e %e %e %e\n",yy,xx,t,z);
+    float z2 = z * z;
+    
+    float ret =(((( 8.05374449538e-2f * z2
+                    - 1.38776856032E-1f) * z2
+                    + 1.99777106478E-1f) * z2
+                    - 3.33329491539E-1f) * z2 * z
+                    + z );
+
+    // Here we put the result to 0 if xx was 0, if not nothing happens!
+    ret*= (1.f - oneIfXXZero);
+    
+    // move back in place
+    if (y==0.f) ret=0.f;
+    if( t > 0.4142135623730950f ) ret += details::PIO4F;
+    if (tmp!=0) ret = details::PIO2F - ret;
+    if (x<0.f) ret = details::PIF - ret;
+    if (y<0.f) ret = -ret;
+
+    return ret;
+
+}
+
+
+
+//------------------------------------------------------------------------------
+
+} // end namespace vdt
+
+
+#endif
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/cos.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/cos.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/cos.h	(revision 16332)
@@ -0,0 +1,32 @@
+/*
+ * cos.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+#ifndef COS_H_
+#define COS_H_
+
+#include "sincos.h"
+
+namespace vdt{
+
+// Cos double precision --------------------------------------------------------
+
+/// Double precision cosine: just call sincos.
+inline double fast_cos(double x){double s,c;fast_sincos(x,s,c);return c;}
+
+//------------------------------------------------------------------------------
+
+inline float fast_cosf(float x){float s,c;fast_sincosf(x,s,c);return c;}
+
+//------------------------------------------------------------------------------
+
+} //vdt namespace
+
+#endif /* COS_H_ */
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/exp.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/exp.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/exp.h	(revision 16332)
@@ -0,0 +1,157 @@
+/*
+ * exp.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _VDT_EXP_
+#define _VDT_EXP_
+
+#include "vdtcore_common.h"
+#include <limits>
+
+namespace vdt{
+
+namespace details{
+  
+  const double EXP_LIMIT = 708;
+
+  const double PX1exp = 1.26177193074810590878E-4;
+  const double PX2exp = 3.02994407707441961300E-2;
+  const double PX3exp = 9.99999999999999999910E-1;
+  const double QX1exp = 3.00198505138664455042E-6;
+  const double QX2exp = 2.52448340349684104192E-3;
+  const double QX3exp = 2.27265548208155028766E-1;
+  const double QX4exp = 2.00000000000000000009E0;
+
+  const double LOG2E = 1.4426950408889634073599; // 1/log(2)
+
+  const float MAXLOGF = 88.72283905206835f;
+  const float MINLOGF = -88.f;
+
+  const float C1F =   0.693359375f;
+  const float C2F =  -2.12194440e-4f;
+
+  const float PX1expf = 1.9875691500E-4f;
+  const float PX2expf =1.3981999507E-3f;
+  const float PX3expf =8.3334519073E-3f;
+  const float PX4expf =4.1665795894E-2f;
+  const float PX5expf =1.6666665459E-1f;
+  const float PX6expf =5.0000001201E-1f;
+
+  const float LOG2EF = 1.44269504088896341f;
+
+}
+
+// Exp double precision --------------------------------------------------------
+
+
+/// Exponential Function double precision
+inline double fast_exp(double initial_x){
+
+    double x = initial_x;
+    double px=details::fpfloor(details::LOG2E * x +0.5);
+ 
+    const int32_t n = int32_t(px);
+
+    x -= px * 6.93145751953125E-1;
+    x -= px * 1.42860682030941723212E-6;
+
+    const double xx = x * x;
+
+    // px = x * P(x**2).
+    px = details::PX1exp;
+    px *= xx;
+    px += details::PX2exp;
+    px *= xx;
+    px += details::PX3exp;
+    px *= x;
+
+    // Evaluate Q(x**2).
+    double qx = details::QX1exp;
+    qx *= xx;
+    qx += details::QX2exp;
+    qx *= xx;
+    qx += details::QX3exp;
+    qx *= xx;
+    qx += details::QX4exp;
+
+    // e**x = 1 + 2x P(x**2)/( Q(x**2) - P(x**2) )
+    x = px / (qx - px);
+    x = 1.0 + 2.0 * x;
+
+    // Build 2^n in double.
+    x *= details::uint642dp(( ((uint64_t)n) +1023)<<52);
+
+    if (initial_x > details::EXP_LIMIT)
+            x = std::numeric_limits<double>::infinity();
+    if (initial_x < -details::EXP_LIMIT)
+            x = 0.;
+
+    return x;
+    
+}
+
+// Exp single precision --------------------------------------------------------
+
+/// Exponential Function single precision
+inline float fast_expf(float initial_x) {
+	
+    float x = initial_x;
+
+    float z = details::fpfloor( details::LOG2EF * x +0.5f ); /* floor() truncates toward -infinity. */
+
+    x -= z * details::C1F;
+    x -= z * details::C2F;
+    const int32_t n = int32_t ( z );
+
+    const float x2 = x * x;
+
+    z = x*details::PX1expf;
+    z += details::PX2expf;
+    z *= x;
+    z += details::PX3expf;
+    z *= x;
+    z += details::PX4expf;
+    z *= x;
+    z += details::PX5expf;
+    z *= x;
+    z += details::PX6expf;
+    z *= x2;
+    z += x + 1.0f;
+
+    /* multiply by power of 2 */
+    z *=  details::uint322sp((n+0x7f)<<23);
+
+    if (initial_x > details::MAXLOGF) z=std::numeric_limits<float>::infinity();
+    if (initial_x < details::MINLOGF) z=0.f;
+
+    return z;
+
+  }
+
+//------------------------------------------------------------------------------
+
+} // end namespace vdt
+
+#endif
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/inv.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/inv.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/inv.h	(revision 16332)
@@ -0,0 +1,92 @@
+/*
+ * inv.h
+ * An experiment: implement division with the square fo the approximate 
+ * inverse square root.
+ * In other words one transforms a shift, multiplications and sums into a 
+ * sqrt.
+ * 
+ *  Created on: Jun 24, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ * 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef INV_H_
+#define INV_H_
+
+#include "vdtcore_common.h"
+#include "sqrt.h"
+#include <cmath>
+#include <limits>
+
+namespace vdt{
+
+//------------------------------------------------------------------------------
+
+/// General implementation of the inversion
+inline double fast_inv_general(double x, const uint32_t isqrt_iterations) {  
+  const uint64_t sign_mask = details::getSignMask(x);
+  const double sqrt_one_over_x = fast_isqrt_general(std::fabs(x),
+                                                   isqrt_iterations);
+  return sqrt_one_over_x*(details::dpORuint64(sqrt_one_over_x , sign_mask ));
+}
+
+//------------------------------------------------------------------------------
+
+/// Four iterations inversion
+inline double fast_inv(double x) {return fast_inv_general(x,4);}
+
+//------------------------------------------------------------------------------
+
+/// Three iterations
+inline double fast_approx_inv(double x) {return fast_inv_general(x,3);}
+
+//------------------------------------------------------------------------------
+
+/// For comparisons
+inline double inv (double x) {return 1./x;}
+
+//------------------------------------------------------------------------------
+// Single precision          
+
+
+
+/// General implementation of the inversion
+inline float fast_invf_general(float x, const uint32_t isqrt_iterations) { 
+  const uint32_t sign_mask = details::getSignMask(x);
+  const float sqrt_one_over_x = fast_isqrtf_general(std::fabs(x),
+                                                   isqrt_iterations);
+  return sqrt_one_over_x*(details::spORuint32(sqrt_one_over_x , sign_mask ));
+}
+
+//------------------------------------------------------------------------------
+
+/// Two iterations
+inline float fast_invf(float x) {return fast_invf_general(x,2);}
+
+//------------------------------------------------------------------------------
+
+/// One iterations
+inline float fast_approx_invf(float x) {return fast_invf_general(x,1);}
+
+//------------------------------------------------------------------------------
+
+/// For comparisons
+inline float invf (float x) {return 1.f/x;}
+
+//------------------------------------------------------------------------------
+
+} // end namespace vdt
+
+#endif /* INV_H_ */
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/log.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/log.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/log.h	(revision 16332)
@@ -0,0 +1,207 @@
+/*
+ * log.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LOG_H_
+#define LOG_H_
+
+#include "vdtcore_common.h"
+#include <limits>
+
+namespace vdt{
+
+// local namespace for the constants/functions which are necessary only here
+namespace details{
+
+const double LOG_UPPER_LIMIT = 1e307;
+const double LOG_LOWER_LIMIT = 0;
+
+const double SQRTH = 0.70710678118654752440;
+
+inline double get_log_px(const double x){
+	const double PX1log = 1.01875663804580931796E-4;
+	const double PX2log = 4.97494994976747001425E-1;
+	const double PX3log = 4.70579119878881725854E0;
+	const double PX4log = 1.44989225341610930846E1;
+	const double PX5log = 1.79368678507819816313E1;
+	const double PX6log = 7.70838733755885391666E0;
+
+	double px = PX1log;
+	px *= x;
+	px += PX2log;
+	px *= x;
+	px += PX3log;
+	px *= x;
+	px += PX4log;
+	px *= x;
+	px += PX5log;
+	px *= x;
+	px += PX6log;
+	return px;
+
+}
+
+inline double get_log_qx(const double x){
+	const double QX1log = 1.12873587189167450590E1;
+	const double QX2log = 4.52279145837532221105E1;
+	const double QX3log = 8.29875266912776603211E1;
+	const double QX4log = 7.11544750618563894466E1;
+	const double QX5log = 2.31251620126765340583E1;
+
+	double qx = x;
+	qx += QX1log;
+	qx *=x;
+	qx += QX2log;
+	qx *=x;
+	qx += QX3log;
+	qx *=x;
+	qx += QX4log;
+	qx *=x;
+	qx += QX5log;
+	return qx;
+}
+
+}
+
+// Log double precision --------------------------------------------------------
+inline double fast_log(double x){
+
+	const double original_x = x;
+
+	/* separate mantissa from exponent */
+	double fe;
+	x = details::getMantExponent(x,fe);
+
+	// blending
+	x > details::SQRTH? fe+=1. : x+=x ;
+	x -= 1.0;
+
+	/* rational form */
+	double px =  details::get_log_px(x);
+
+	//for the final formula
+	const double x2 = x*x;
+	px *= x;
+	px *= x2;
+
+	const double qx = details::get_log_qx(x);
+
+	double res = px / qx ;
+
+	res -= fe * 2.121944400546905827679e-4;
+	res -= 0.5 * x2  ;
+
+	res = x + res;
+	res += fe * 0.693359375;
+
+	if (original_x > details::LOG_UPPER_LIMIT)
+		res = std::numeric_limits<double>::infinity();
+	if (original_x < details::LOG_LOWER_LIMIT) // THIS IS NAN!
+		res =  - std::numeric_limits<double>::quiet_NaN();
+
+	return res;
+
+}
+
+// Log single precision --------------------------------------------------------
+
+
+
+namespace details{
+
+const float LOGF_UPPER_LIMIT = MAXNUMF;
+const float LOGF_LOWER_LIMIT = 0;
+
+const float PX1logf = 7.0376836292E-2f;
+const float PX2logf	= -1.1514610310E-1f;
+const float PX3logf	= 1.1676998740E-1f;
+const float PX4logf	= -1.2420140846E-1f;
+const float PX5logf	= 1.4249322787E-1f;
+const float PX6logf	= -1.6668057665E-1f;
+const float PX7logf	= 2.0000714765E-1f;
+const float PX8logf	= -2.4999993993E-1f;
+const float PX9logf	= 3.3333331174E-1f;
+
+inline float get_log_poly(const float x){
+	float y = x*PX1logf;
+	y += PX2logf;
+	y *= x;
+	y += PX3logf;
+	y *= x;
+	y += PX4logf;
+	y *= x;
+	y += PX5logf;
+	y *= x;
+	y += PX6logf;
+	y *= x;
+	y += PX7logf;
+	y *= x;
+	y += PX8logf;
+	y *= x;
+	y += PX9logf;
+	return y;
+}
+
+const float SQRTHF = 0.707106781186547524f;
+
+}
+
+// Log single precision --------------------------------------------------------
+inline float fast_logf( float x ) {
+
+	const float original_x = x;
+
+	float fe;
+	x = details::getMantExponentf( x, fe);
+
+	x > details::SQRTHF? fe+=1.f : x+=x ;
+	x -= 1.0f;
+
+	const float x2 = x*x;
+
+	float res = details::get_log_poly(x);
+	res *= x2*x;
+
+	res += -2.12194440e-4f * fe;
+	res +=  -0.5f * x2;
+
+	res= x + res;
+
+	res += 0.693359375f * fe;
+
+	if (original_x > details::LOGF_UPPER_LIMIT)
+		res = std::numeric_limits<float>::infinity();
+	if (original_x < details::LOGF_LOWER_LIMIT)
+		res = -std::numeric_limits<float>::quiet_NaN();
+
+	return res;
+}
+
+
+//------------------------------------------------------------------------------
+
+} //vdt namespace
+
+#endif /* LOG_H_ */
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sin.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sin.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sin.h	(revision 16332)
@@ -0,0 +1,48 @@
+/*
+ * cos.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SIN_H_
+#define SIN_H_
+
+#include "sincos.h"
+
+namespace vdt{
+
+// Sin double precision --------------------------------------------------------
+
+/// Double precision sine: just call sincos.
+inline double fast_sin(double x){double s,c;fast_sincos(x,s,c);return s;}
+
+//------------------------------------------------------------------------------
+
+inline float fast_sinf(float x){float s,c;fast_sincosf(x,s,c);return s;}
+
+//------------------------------------------------------------------------------
+
+
+} //vdt namespace
+
+#endif /* SIN_H_ */
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sincos.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sincos.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sincos.h	(revision 16332)
@@ -0,0 +1,238 @@
+/*
+ * sincos_common.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "vdtcore_common.h"
+#include <cmath>
+#include <limits>
+
+#ifndef SINCOS_COMMON_H_
+#define SINCOS_COMMON_H_
+
+namespace vdt{
+
+namespace details{
+
+// double precision constants
+
+const double DP1sc = 7.85398125648498535156E-1;
+const double DP2sc = 3.77489470793079817668E-8;
+const double DP3sc = 2.69515142907905952645E-15;
+
+const double C1sin = 1.58962301576546568060E-10;
+const double C2sin =-2.50507477628578072866E-8;
+const double C3sin = 2.75573136213857245213E-6;
+const double C4sin =-1.98412698295895385996E-4;
+const double C5sin = 8.33333333332211858878E-3;
+const double C6sin =-1.66666666666666307295E-1;
+
+const double C1cos =-1.13585365213876817300E-11;
+const double C2cos = 2.08757008419747316778E-9;
+const double C3cos =-2.75573141792967388112E-7;
+const double C4cos = 2.48015872888517045348E-5;
+const double C5cos =-1.38888888888730564116E-3;
+const double C6cos = 4.16666666666665929218E-2;
+
+const double DP1 = 7.853981554508209228515625E-1;
+const double DP2 = 7.94662735614792836714E-9;
+const double DP3 = 3.06161699786838294307E-17;
+
+// single precision constants 
+
+const float DP1F = 0.78515625;
+const float DP2F = 2.4187564849853515625e-4;
+const float DP3F = 3.77489497744594108e-8;
+
+const float T24M1 = 16777215.;
+
+//------------------------------------------------------------------------------
+
+inline double get_sin_px(const double x){
+	double px=C1sin;
+	px *= x;
+	px += C2sin;
+	px *= x;
+	px += C3sin;
+	px *= x;
+	px += C4sin;
+	px *= x;
+	px += C5sin;
+	px *= x;
+	px += C6sin;
+	return px;
+}
+
+//------------------------------------------------------------------------------
+
+inline double get_cos_px(const double x){
+	double px=C1cos;
+	px *= x;
+	px += C2cos;
+	px *= x;
+	px += C3cos;
+	px *= x;
+	px += C4cos;
+	px *= x;
+	px += C5cos;
+	px *= x;
+	px += C6cos;
+	return px;
+}
+
+
+//------------------------------------------------------------------------------
+/// Reduce to 0 to 45
+inline double reduce2quadrant(double x, int32_t& quad) {
+
+    x = fabs(x);
+    quad = int (ONEOPIO4 * x); // always positive, so (int) == std::floor
+    quad = (quad+1) & (~1);    
+    const double y = double (quad);
+    // Extended precision modular arithmetic
+    return ((x - y * DP1) - y * DP2) - y * DP3;
+  }
+
+//------------------------------------------------------------------------------
+/// Sincos only for -45deg < x < 45deg
+inline void fast_sincos_m45_45( const double z, double & s, double &c ) {
+
+    double zz = z * z;    
+    s = z  +  z * zz * get_sin_px(zz);                
+    c = 1.0 - zz * .5 + zz * zz * get_cos_px(zz);
+  }
+
+
+//------------------------------------------------------------------------------
+
+} // End namespace details
+
+/// Double precision sincos
+inline void fast_sincos( const double xx, double & s, double &c ) {
+    // I have to use doubles to make it vectorise...
+
+    int j;
+    double x = details::reduce2quadrant(xx,j);
+    const double signS = (j&4); 
+
+    j-=2;
+
+    const double signC = (j&4);
+    const double poly = j&2;
+
+    details::fast_sincos_m45_45(x,s,c);
+    
+    //swap
+    if( poly==0 ) {
+      const double tmp = c;
+      c=s; 
+      s=tmp;
+    }
+
+    if(signC == 0.) 
+      c = -c;
+    if(signS != 0.) 
+      s = -s;
+    if (xx < 0.)  
+      s = -s;
+
+  }
+
+
+// Single precision functions
+
+namespace details {
+//------------------------------------------------------------------------------
+/// Reduce to 0 to 45
+inline float reduce2quadrant(float x, int & quad) {
+    /* make argument positive */
+    x = fabs(x);
+
+    quad = int (ONEOPIO4F * x); /* integer part of x/PIO4 */
+
+    quad = (quad+1) & (~1);
+    const float y = float(quad);
+    // quad &=4;
+    // Extended precision modular arithmetic
+    return ((x - y * DP1F) - y * DP2F) - y * DP3F;
+  }
+  
+  
+//------------------------------------------------------------------------------
+
+
+
+/// Sincos only for -45deg < x < 45deg
+inline void fast_sincosf_m45_45( const float x, float & s, float &c ) {
+
+    float z = x * x;
+
+    s = (((-1.9515295891E-4f * z
+       + 8.3321608736E-3f) * z
+      - 1.6666654611E-1f) * z * x)
+      + x;
+
+    c = ((  2.443315711809948E-005f * z
+        - 1.388731625493765E-003f) * z
+     + 4.166664568298827E-002f) * z * z
+      - 0.5f * z + 1.0f;
+  }
+
+//------------------------------------------------------------------------------
+
+} // end details namespace
+
+/// Single precision sincos
+inline void fast_sincosf( const float xx, float & s, float &c ) {
+	
+
+    int j;
+    const float x = details::reduce2quadrant(xx,j);
+    int signS = (j&4); 
+
+    j-=2;
+
+    const int signC = (j&4);
+    const int poly = j&2;
+
+    float ls,lc;
+    details::fast_sincosf_m45_45(x,ls,lc);
+
+    //swap
+    if( poly==0 ) {
+      const float tmp = lc;
+      lc=ls; ls=tmp;
+    }
+
+    if(signC == 0) lc = -lc;
+    if(signS != 0) ls = -ls;
+    if (xx<0)  ls = -ls;
+    c=lc;
+    s=ls;
+  }
+
+
+} // end namespace vdt
+
+#endif 
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sqrt.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sqrt.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sqrt.h	(revision 16332)
@@ -0,0 +1,99 @@
+/*
+ * sqrt.h
+ * Implementations born on the Quake 3 fast inverse square root 
+ * function.
+ * http://en.wikipedia.org/wiki/Fast_inverse_square_root
+ * 
+ *  Created on: Jun 24, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SQRT_H_
+#define SQRT_H_
+
+#include "vdtcore_common.h"
+
+namespace vdt{
+
+//------------------------------------------------------------------------------
+
+
+/// Sqrt implmentation from Quake3
+inline double fast_isqrt_general(double x, const uint32_t ISQRT_ITERATIONS) {
+
+  const double threehalfs = 1.5;
+  const double x2 = x * 0.5;
+  double y  = x;
+  uint64_t i  = details::dp2uint64(y);
+  // Evil!
+  i  = 0x5fe6eb50c7aa19f9ULL  - ( i >> 1 );
+  y  = details::uint642dp(i);
+  for (uint32_t j=0;j<ISQRT_ITERATIONS;++j)
+      y *= threehalfs - ( x2 * y * y ) ;
+
+  return y;
+}
+
+//------------------------------------------------------------------------------
+
+/// Four iterations
+inline double fast_isqrt(double x) {return fast_isqrt_general(x,4);}
+
+/// Three iterations
+inline double fast_approx_isqrt(double x) {return fast_isqrt_general(x,3);}
+
+//------------------------------------------------------------------------------
+
+/// For comparisons
+inline double isqrt (double x) {return 1./std::sqrt(x);}
+
+//------------------------------------------------------------------------------
+
+/// Sqrt implmentation from Quake3
+inline float fast_isqrtf_general(float x, const uint32_t ISQRT_ITERATIONS) {
+
+	const float threehalfs = 1.5f;
+	const float x2 = x * 0.5f;
+	float y  = x;
+	uint32_t i  = details::sp2uint32(y);
+	i  = 0x5f3759df - ( i >> 1 );
+	y  = details::uint322sp(i);
+	for (uint32_t j=0;j<ISQRT_ITERATIONS;++j)
+		y  *= ( threehalfs - ( x2 * y * y ) );
+
+	return y;
+}
+
+//------------------------------------------------------------------------------
+
+/// Two iterations
+inline float fast_isqrtf(float x) {return fast_isqrtf_general(x,2);}
+
+/// One (!) iterations
+inline float fast_approx_isqrtf(float x) {return fast_isqrtf_general(x,1);}
+
+//------------------------------------------------------------------------------
+
+/// For comparisons
+inline float isqrtf (float x) {return 1.f/std::sqrt(x);}
+
+//------------------------------------------------------------------------------
+
+} // end namespace vdt
+
+#endif /* SQRT_H_ */
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/stdwrap.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/stdwrap.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/stdwrap.h	(revision 16332)
@@ -0,0 +1,30 @@
+#ifndef _VDT_STD_H_
+#define _VDT_STD_H_
+
+#include <cmath>
+
+// wrapper around std function just to benefit of naming
+// to be used in vectorized wrappers
+
+namespace vdt {
+  
+  template<typename T>
+  inline T fast_sqrt(T x) { return std::sqrt(x); }
+
+  template<typename T>
+  inline T fast_div(T x,T y) { return x/y; }
+
+  template<typename T>
+  inline T fast_fma(T x,T y, T z) { return x*y+z; }
+
+  // correclty rounded
+  template<typename T>
+  inline T fast_fmac(T x, T y, T z) { return std::fma(x,y,z); }
+  
+  template<typename T>
+  inline T fast_pow(T x, T y) { return std::pow(x, y); }
+
+  template<typename T>
+  inline T fast_round(T x) { return std::round(x); }
+}
+#endif
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/tan.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/tan.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/tan.h	(revision 16332)
@@ -0,0 +1,171 @@
+/*
+ * tan.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TAN_H_
+#define TAN_H_
+
+#include "vdtcore_common.h"
+#include "sincos.h"
+
+namespace vdt{
+
+
+namespace details{
+
+const double PX1tan=-1.30936939181383777646E4;
+const double PX2tan=1.15351664838587416140E6;
+const double PX3tan=-1.79565251976484877988E7;
+
+const double QX1tan = 1.36812963470692954678E4;
+const double QX2tan = -1.32089234440210967447E6;
+const double QX3tan = 2.50083801823357915839E7;
+const double QX4tan = -5.38695755929454629881E7;
+
+const double DP1tan = 7.853981554508209228515625E-1;
+const double DP2tan = 7.94662735614792836714E-9;
+const double DP3tan = 3.06161699786838294307E-17;
+
+const float DP1Ftan = 0.78515625;
+const float DP2Ftan = 2.4187564849853515625e-4;
+const float DP3Ftan = 3.77489497744594108e-8;
+
+
+//------------------------------------------------------------------------------
+/// Reduce to -45 to 45
+inline double reduce2quadranttan(double x, int32_t& quad) {
+
+    x = fabs(x);
+    quad = int( ONEOPIO4 * x ); // always positive, so (int) == std::floor
+    quad = (quad+1) & (~1);
+    const double y = quad;
+    // Extended precision modular arithmetic
+    return ((x - y * DP1tan) - y * DP2tan) - y * DP3tan;
+  }
+
+//------------------------------------------------------------------------------
+/// Reduce to -45 to 45
+inline float reduce2quadranttan(float x, int32_t& quad) {
+
+    x = fabs(x);
+    quad = int( ONEOPIO4F * x ); // always positive, so (int) == std::floor
+    quad = (quad+1) & (~1);
+    const float y = quad;
+    // Extended precision modular arithmetic
+    return ((x - y * DP1Ftan) - y * DP2Ftan) - y * DP3Ftan;
+  }
+
+}
+
+//------------------------------------------------------------------------------
+/// Double precision tangent implementation
+inline double fast_tan(double x){
+
+    const uint64_t sign_mask = details::getSignMask(x);
+
+    int32_t quad =0;
+    const double z=details::reduce2quadranttan(x,quad);
+
+    const double zz = z * z;
+
+    double res=z;
+
+    if( zz > 1.0e-14 ){
+        double px = details::PX1tan;
+        px *= zz;
+        px += details::PX2tan;
+        px *= zz;
+        px += details::PX3tan;
+
+        double qx=zz;
+        qx += details::QX1tan;
+        qx *=zz; 
+        qx += details::QX2tan;
+        qx *=zz;
+        qx += details::QX3tan;
+        qx *=zz;
+        qx += details::QX4tan;
+
+        res = z + z * zz * px / qx;
+    }
+
+    // A no branching way to say: if j&2 res = -1/res. You can!!!
+    quad &=2;
+    quad >>=1;
+    const int32_t alt = quad^1;
+    // Avoid fpe generated by 1/0 if res is 0
+    const double zeroIfXNonZero = (x==0.);
+    res += zeroIfXNonZero;
+    res = quad * (-1./res) + alt * res; // one coeff is one and one is 0!
+
+    // Again, return 0 if res==0, the correct result otherwhise
+    return details::dpXORuint64(res,sign_mask) * (1.-zeroIfXNonZero);
+
+}
+
+// Single precision ------------------------------------------------------------
+
+inline float fast_tanf(float x){
+    const uint32_t sign_mask = details::getSignMask(x);
+
+    int32_t quad =0;
+    const float z=details::reduce2quadranttan(x,quad);
+
+    const float zz = z * z;
+
+    float res=z;
+
+    if( zz > 1.0e-14f ){
+      res =
+        ((((( 9.38540185543E-3f * zz
+        + 3.11992232697E-3f) * zz
+        + 2.44301354525E-2f) * zz
+        + 5.34112807005E-2f) * zz
+        + 1.33387994085E-1f) * zz
+        + 3.33331568548E-1f) * zz * z
+        + z;
+    }
+
+    // A no branching way to say: if j&2 res = -1/res. You can!!!
+    quad &=2;
+    quad >>=1;
+    const int32_t alt = quad^1;
+    // Avoid fpe generated by 1/0 if res is 0
+    const float zeroIfXNonZero = (x==0.f);
+    res += zeroIfXNonZero;
+    res = quad * (-1.f/res) + alt * res; // one coeff is one and one is 0!
+
+    return details::spXORuint32(res,sign_mask) * (1.f-zeroIfXNonZero);
+
+}
+
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+
+} //vdt namespace
+
+
+#endif /* TAN_H_ */
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/tanh.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/tanh.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/tanh.h	(revision 16332)
@@ -0,0 +1,77 @@
+/*
+ * tanh.h
+ * The basic idea is to exploit Pade polynomials.
+ * Implemented by Manuel Schiller for LHCb.
+ * 
+ *  Created on: Sep 23, 2017
+ *      Author: Paul Seyfert, Manuel Schiller
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TANH_H_
+#define TANH_H_
+
+#include "vdtcore_common.h"
+
+namespace vdt{
+
+
+
+
+/// Fast tanh implementation double precision
+inline double fast_tanh(double x){
+	// for very large |x| > 20, tanh(x) is x/|x| anyway (at least to double
+	// precision)
+	//
+	// NB: branch-free code takes longer to execute
+	if (std::abs(x) > 20.) return std::copysign(1., x);
+	// strategy for large arguments: tanh(2x) = 2 tanh(x)/(1 + tanh^2(x))
+	// idea is to use this "argument halving" a couple of times, and use a
+	// very short PadÃ© approximation for the rest of the way
+	const auto xx = x * 0.125;
+	const auto xx2 = xx * xx;
+	const auto numer = 135135 + xx2 * (17325 + xx2 * ( 378 + xx2 *  1));
+	const auto denom = 135135 + xx2 * (62370 + xx2 * (3150 + xx2 * 28));
+
+	auto tanh = xx * numer / denom;
+	tanh = 2 * tanh / (tanh * tanh + 1);
+	tanh = 2 * tanh / (tanh * tanh + 1);
+	return 2 * tanh / (tanh * tanh + 1);
+}
+
+//------------------------------------------------------------------------------
+/// Fast tanh implementation single precision
+inline float fast_tanhf( float x ) {
+	// same strategy as double version above, but even shorter PadÃ©
+	// approximation is sufficient for float
+	//
+	// NB: branch-free code takes longer to execute
+	if (std::abs(x) > 9.1f) return std::copysign(1.f, x);
+	const auto xx = x * 0.125f;
+	const auto xx2 = xx * xx;
+	auto tanh = xx * (xx2 + 15) / (6 * xx2 + 15);
+	tanh = 2 * tanh / (tanh * tanh + 1);
+	tanh = 2 * tanh / (tanh * tanh + 1);
+	return 2 * tanh / (tanh * tanh + 1);
+}
+
+//------------------------------------------------------------------------------
+// Vector signatures
+
+}// end of vdt
+
+#endif // end of tanh
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/vdtMath.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/vdtMath.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/vdtMath.h	(revision 16332)
@@ -0,0 +1,23 @@
+#ifndef _VDT_MATH_H_
+#define _VDT_MATH_H_
+
+// Include all the VDT fucntions
+
+#include "sin.h"
+#include "asin.h"
+
+#include "cos.h"
+
+#include "tan.h"
+#include "tanh.h"
+#include "atan.h"
+#include "atan2.h"
+
+#include "exp.h"
+#include "log.h"
+
+#include "sqrt.h"
+
+#include "inv.h"
+
+#endif
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/vdtcore_common.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/vdtcore_common.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/vdtcore_common.h	(revision 16332)
@@ -0,0 +1,243 @@
+/*
+ * vdtcore_common.h
+ * Common functions for the vdt routines.
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code for the exp, log, sin, cos, 
+ * tan, asin, acos and atan functions. The Cephes library can be found here:
+ * http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef VDTCOMMON_H_
+#define VDTCOMMON_H_
+
+#include <cinttypes>
+#include <cmath>
+
+namespace vdt{
+
+namespace details{
+
+// Constants
+const double TWOPI = 2.*M_PI;
+const double PI = M_PI;
+const double PIO2 = M_PI_2;
+const double PIO4 = M_PI_4;
+const double ONEOPIO4 = 4./M_PI;
+
+const float TWOPIF = 2.*M_PI;
+const float PIF = M_PI;
+const float PIO2F = M_PI_2;
+const float PIO4F = M_PI_4;
+const float ONEOPIO4F = 4./M_PI;
+
+const double MOREBITS = 6.123233995736765886130E-17;
+
+
+const float MAXNUMF = 3.4028234663852885981170418348451692544e38f;
+
+//------------------------------------------------------------------------------
+
+/// Used to switch between different type of interpretations of the data (64 bits)
+union ieee754{
+	inline ieee754 () {};
+	inline ieee754 (double thed) {d=thed;};
+	inline ieee754 (uint64_t thell) {ll=thell;};
+	inline ieee754 (float thef) {f[0]=thef;};
+	inline ieee754 (uint32_t thei) {i[0]=thei;};
+  double d;
+  float f[2];
+  uint32_t i[2];
+  uint64_t ll;
+  uint16_t s[4];
+};
+
+//------------------------------------------------------------------------------
+
+/// Converts an unsigned long long to a double
+inline double uint642dp(uint64_t ll) {
+  ieee754 tmp;
+  tmp.ll=ll;
+  return tmp.d;
+}
+
+//------------------------------------------------------------------------------
+
+/// Converts a double to an unsigned long long
+inline uint64_t dp2uint64(double x) {
+  ieee754 tmp;
+  tmp.d=x;
+  return tmp.ll;
+}
+
+//------------------------------------------------------------------------------
+/// Makes an AND of a double and a unsigned long long
+inline double dpANDuint64(const double x, const uint64_t i ){
+  return uint642dp(dp2uint64(x) & i); 
+}
+//------------------------------------------------------------------------------
+/// Makes an OR of a double and a unsigned long long
+inline double dpORuint64(const double x, const uint64_t i ){
+  return uint642dp(dp2uint64(x) | i); 
+}
+
+/// Makes a XOR of a double and a unsigned long long
+inline double dpXORuint64(const double x, const uint64_t i ){
+  return uint642dp(dp2uint64(x) ^ i); 
+}
+
+//------------------------------------------------------------------------------
+inline uint64_t getSignMask(const double x){
+  const uint64_t mask=0x8000000000000000ULL;
+  return dp2uint64(x) & mask;
+}
+
+//------------------------------------------------------------------------------
+/// Converts an int to a float
+inline float uint322sp(int x) {
+    ieee754 tmp;
+    tmp.i[0]=x;
+    return tmp.f[0];
+  }
+
+//------------------------------------------------------------------------------
+/// Converts a float to an int
+inline uint32_t sp2uint32(float x) {
+    ieee754 tmp;
+    tmp.f[0]=x;
+    return tmp.i[0];
+  }
+
+//------------------------------------------------------------------------------
+/// Makes an AND of a float and a unsigned long
+inline float spANDuint32(const float x, const uint32_t i ){
+  return uint322sp(sp2uint32(x) & i); 
+}
+//------------------------------------------------------------------------------
+/// Makes an OR of a float and a unsigned long
+inline float spORuint32(const float x, const uint32_t i ){
+  return uint322sp(sp2uint32(x) | i); 
+}
+
+//------------------------------------------------------------------------------
+/// Makes an OR of a float and a unsigned long
+inline float spXORuint32(const float x, const uint32_t i ){
+  return uint322sp(sp2uint32(x) ^ i); 
+}
+//------------------------------------------------------------------------------
+/// Get the sign mask
+inline uint32_t getSignMask(const float x){
+  const uint32_t mask=0x80000000;
+  return sp2uint32(x) & mask;
+}
+
+//------------------------------------------------------------------------------
+/// Like frexp but vectorising and the exponent is a double.
+inline double getMantExponent(const double x, double & fe){
+
+  uint64_t n = dp2uint64(x);
+
+  // Shift to the right up to the beginning of the exponent.
+  // Then with a mask, cut off the sign bit
+  uint64_t le = (n >> 52);
+
+  // chop the head of the number: an int contains more than 11 bits (32)
+  int32_t e = le; // This is important since sums on uint64_t do not vectorise
+  fe = e-1023 ;
+
+  // This puts to 11 zeroes the exponent
+  n &=0x800FFFFFFFFFFFFFULL;
+  // build a mask which is 0.5, i.e. an exponent equal to 1022
+  // which means *2, see the above +1.
+  const uint64_t p05 = 0x3FE0000000000000ULL; //dp2uint64(0.5);
+  n |= p05;
+
+  return uint642dp(n);
+}
+
+//------------------------------------------------------------------------------
+/// Like frexp but vectorising and the exponent is a float.
+inline float getMantExponentf(const float x, float & fe){
+
+    uint32_t n = sp2uint32(x);
+    int32_t e = (n >> 23)-127;
+    fe = e;
+
+    // fractional part
+    const uint32_t p05f = 0x3f000000; // //sp2uint32(0.5);
+    n &= 0x807fffff;// ~0x7f800000;
+    n |= p05f;
+
+    return uint322sp(n);
+
+}
+
+//------------------------------------------------------------------------------
+/// Converts a fp to an int
+inline uint32_t fp2uint(float x) {
+    return sp2uint32(x);
+  }
+/// Converts a fp to an int
+inline uint64_t fp2uint(double x) {
+    return dp2uint64(x);
+  }
+/// Converts an int to fp
+inline float int2fp(uint32_t i) {
+    return uint322sp(i);
+  }
+/// Converts an int to fp
+inline double int2fp(uint64_t i) {
+    return uint642dp(i);
+  }
+
+//------------------------------------------------------------------------------
+/**
+ * A vectorisable floor implementation, not only triggered by fast-math.
+ * These functions do not distinguish between -0.0 and 0.0, so are not IEC6509 
+ * compliant for argument -0.0
+**/ 
+inline double fpfloor(const double x){
+  // no problem since exp is defined between -708 and 708. Int is enough for it!
+  int32_t ret = int32_t (x);
+  ret-=(sp2uint32(x)>>31);  
+  return ret;
+
+}
+//------------------------------------------------------------------------------
+/**
+ * A vectorisable floor implementation, not only triggered by fast-math.
+ * These functions do not distinguish between -0.0 and 0.0, so are not IEC6509 
+ * compliant for argument -0.0
+**/ 
+inline float fpfloor(const float x){
+  int32_t ret = int32_t (x);
+  ret-=(sp2uint32(x)>>31);  
+  return ret;
+
+}
+
+//------------------------------------------------------------------------------
+
+}
+
+} // end of namespace vdt
+
+#endif /* VDTCOMMON_H_ */
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/instruction.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/instruction.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/instruction.h	(revision 16332)
@@ -0,0 +1,45 @@
+#ifndef INSTRUCTION_H
+#define INSTRUCTION_H
+
+#include <cstdint>
+
+#include "vector_operations.h"
+
+enum OpCodes : uint8_t
+{
+    // same values as in OpCodes.cs
+    Add = 1,
+    Sub = 2,
+    Mul = 3,
+    Div = 4,
+    Sin = 5,
+    Cos = 6,
+    Tan = 7,
+    Log = 8,
+    Exp = 9,
+    Var = 18,
+    Const = 20,
+    Power = 22,
+    Root = 23,
+    Square = 28,
+    Sqrt = 29
+};
+
+struct instruction
+{
+    // from Instruction.cs
+    uint8_t opcode;
+    uint16_t narg;
+
+    int childIndex;
+
+    // from LinearInstruction.cs
+    double value;
+    double weight; // necessary for variables
+
+    // pointer to data
+    double *buf;
+    double *data;
+};
+
+#endif
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.cpp
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.cpp	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.cpp	(revision 16332)
@@ -0,0 +1,63 @@
+#include "interpreter.h" 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+constexpr size_t BUFSIZE = BATCHSIZE * sizeof(double);
+
+// slow (ish?)
+__declspec(dllexport) 
+double __cdecl GetValue(instruction* code, int codeLength, int row) noexcept
+{
+    return evaluate(code, codeLength, row);
+}
+
+__declspec(dllexport) 
+void __cdecl GetValues(instruction* code, int codeLength, int* rows, int totalRows, double* result) noexcept
+{
+    for (int i = 0; i < totalRows; ++i)
+    {
+        result[i] = evaluate(code, codeLength, rows[i]);
+    }
+}
+
+__declspec(dllexport)
+void __cdecl GetValuesVectorized(instruction* code, int codeLength, int* rows, int totalRows, double* __restrict result) noexcept
+{
+    double* buffer = static_cast<double*>(_aligned_malloc(codeLength * BUFSIZE, 16));
+    for (int i = 0; i < codeLength; ++i)
+    {
+        instruction& in = code[i];
+        in.buf = buffer + (i * BATCHSIZE);
+
+        if (in.opcode == OpCodes::Const)
+        {
+            load(in.buf, in.value);
+        }
+    }
+
+    int remainingRows = totalRows % BATCHSIZE;
+    int total = totalRows - remainingRows;
+
+    for (int rowIndex = 0; rowIndex < total; rowIndex += BATCHSIZE)
+    {
+        evaluate(code, codeLength, rows, rowIndex, BATCHSIZE);
+        std::memcpy(result + rowIndex, code[0].buf, BUFSIZE);
+    }
+
+    // are there any rows left?
+    if (remainingRows > 0) 
+    {
+        for (int rowIndex = total; rowIndex < totalRows; rowIndex += remainingRows)
+        {
+            evaluate(code, codeLength, rows, rowIndex, remainingRows);
+            std::memcpy(result + rowIndex, code[0].buf, remainingRows * sizeof(double));
+        }
+    }
+    _aligned_free(buffer);
+}
+
+#ifdef __cplusplus
+}
+#endif
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.h	(revision 16332)
@@ -0,0 +1,231 @@
+#ifndef NATIVE_TREE_INTERPRETER_CLANG_H
+#define NATIVE_TREE_INTERPRETER_CLANG_H
+
+#include "vector_operations.h"
+#include "instruction.h"
+
+inline double evaluate(instruction *code, int len, int row) noexcept
+{
+    for (int i = len - 1; i >= 0; --i)
+    {
+        instruction &in = code[i];
+        switch (in.opcode)
+        {
+            case OpCodes::Var:
+                {
+                    in.value = in.weight * in.data[row];
+                    break;
+                }
+            case OpCodes::Add:
+                {
+                    in.value = code[in.childIndex].value;
+                    for (int j = 1; j < in.narg; ++j)
+                    {
+                        in.value += code[in.childIndex + j].value;
+                    }
+                    break;
+                }
+            case OpCodes::Sub:
+                {
+                    in.value = code[in.childIndex].value;
+                    for (int j = 1; j < in.narg; ++j)
+                    {
+                        in.value -= code[in.childIndex + j].value;
+                    }
+                    if (in.narg == 1)
+                    {
+                        in.value = -in.value;
+                    }
+                    break;
+                }
+            case OpCodes::Mul:
+                {
+                    in.value = code[in.childIndex].value;
+                    for (int j = 1; j < in.narg; ++j)
+                    {
+                        in.value *= code[in.childIndex + j].value;
+                    }
+                    break;
+                }
+            case OpCodes::Div:
+                {
+                    in.value = code[in.childIndex].value;
+                    for (int j = 1; j < in.narg; ++j)
+                    {
+                        in.value /= code[in.childIndex + j].value;
+                    }
+                    if (in.narg == 1)
+                    {
+                        in.value = 1 / in.value;
+                    }
+                    break;
+                }
+            case OpCodes::Exp:
+                {
+                    in.value = std::exp(code[in.childIndex].value);
+                    break;
+                }
+            case OpCodes::Log:
+                {
+                    in.value = std::log(code[in.childIndex].value);
+                    break;
+                }
+            case OpCodes::Sin:
+                {
+                    in.value = std::sin(code[in.childIndex].value);
+                    break;
+                }
+            case OpCodes::Cos:
+                {
+                    in.value = std::cos(code[in.childIndex].value);
+                    break;
+                }
+            case OpCodes::Tan:
+                {
+                    in.value = std::tan(code[in.childIndex].value);
+                    break;
+                }
+            case OpCodes::Power:
+                {
+                    double x = code[in.childIndex].value;
+                    double y = std::round(code[in.childIndex + 1].value);
+                    in.value = std::pow(x, y);
+                    break;
+                }
+            case OpCodes::Root:
+                {
+                    double x = code[in.childIndex].value;
+                    double y = std::round(code[in.childIndex + 1].value);
+                    in.value = std::pow(x, 1 / y);
+                    break;
+                }
+            case OpCodes::Sqrt:
+                {
+                    in.value = std::sqrt(code[in.childIndex].value);
+                    break;
+                }
+        }
+    }
+    return code[0].value;
+}
+
+inline void load_data(instruction &in, int* __restrict rows, int rowIndex, int batchSize) noexcept
+{
+    for (int i = 0; i < batchSize; ++i)
+    {
+        auto row = rows[rowIndex + i];
+        in.buf[i] = in.weight * in.data[row];
+    }
+}
+
+inline void evaluate(instruction* code, int len, int* __restrict rows, int rowIndex, int batchSize) noexcept
+{
+    for (int i = len - 1; i >= 0; --i)
+    {
+        instruction &in = code[i];
+        switch (in.opcode)
+        {
+            case OpCodes::Var:
+                {
+                    load_data(in, rows, rowIndex, batchSize); // buffer data
+                    break;
+                }
+            case OpCodes::Add:
+                {
+                    load(in.buf, code[in.childIndex].buf);
+                    for (int j = 1; j < in.narg; ++j)
+                    {
+                        add(in.buf, code[in.childIndex + j].buf);
+                    }
+                    break;
+                }
+            case OpCodes::Sub:
+                {
+                    if (in.narg == 1)
+                    {
+                        neg(in.buf, code[in.childIndex].buf);
+                        break;
+                    }
+                    else
+                    {
+                        load(in.buf, code[in.childIndex].buf);
+                        for (int j = 1; j < in.narg; ++j)
+                        {
+                            sub(in.buf, code[in.childIndex + j].buf);
+                        }
+                    }
+                    break;
+                }
+            case OpCodes::Mul:
+                {
+                    load(in.buf, code[in.childIndex].buf);
+                    for (int j = 1; j < in.narg; ++j)
+                    {
+                        mul(in.buf, code[in.childIndex + j].buf);
+                    }
+                    break;
+                }
+            case OpCodes::Div:
+                {
+                    if (in.narg == 1)
+                    {
+                        inv(in.buf, code[in.childIndex].buf);
+                        break;
+                    }
+                    else
+                    {
+                        load(in.buf, code[in.childIndex].buf);
+                        for (int j = 1; j < in.narg; ++j)
+                        {
+                            div(in.buf, code[in.childIndex + j].buf);
+                        }
+                    }
+                    break;
+                }
+            case OpCodes::Sin:
+                {
+                    sin(in.buf, code[in.childIndex].buf);
+                    break;
+                }
+            case OpCodes::Cos:
+                {
+                    cos(in.buf, code[in.childIndex].buf);
+                    break;
+                }
+            case OpCodes::Tan:
+                {
+                    tan(in.buf, code[in.childIndex].buf);
+                    break;
+                }
+            case OpCodes::Log:
+                {
+                    log(in.buf, code[in.childIndex].buf);
+                    break;
+                }
+            case OpCodes::Exp:
+                {
+                    exp(in.buf, code[in.childIndex].buf);
+                    break;
+                }
+            case OpCodes::Power:
+                {
+                    load(in.buf, code[in.childIndex].buf);
+                    pow(in.buf, code[in.childIndex + 1].buf);
+                    break;
+                }
+            case OpCodes::Root:
+                {
+                    load(in.buf, code[in.childIndex].buf);
+                    root(in.buf, code[in.childIndex + 1].buf);
+                    break;
+                }
+            case OpCodes::Square:
+                {
+                    square(in.buf, code[in.childIndex].buf);
+                    break;
+                }
+        }
+    }
+}
+
+#endif
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/vector_operations.h
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/vector_operations.h	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/vector_operations.h	(revision 16332)
@@ -0,0 +1,75 @@
+#ifndef VECTOR_OPERATIONS_H
+#define VECTOR_OPERATIONS_H
+
+#define _USE_MATH_DEFINES
+#include <cmath>
+#include <cstring>
+
+#ifdef USE_VDT
+#include "vdt/vdtMath.h"
+#include "vdt/stdwrap.h"
+#define hl_exp vdt::fast_exp
+#define hl_log vdt::fast_log
+#define hl_sin vdt::fast_sin
+#define hl_cos vdt::fast_cos
+#define hl_tan vdt::fast_tan
+#define hl_sqrt vdt::fast_sqrt
+#define hl_pow vdt::fast_pow
+#define hl_round vdt::fast_round
+#else
+#define hl_exp std::exp
+#define hl_log std::log
+#define hl_sin std::sin
+#define hl_cos std::cos
+#define hl_tan std::tan
+#define hl_sqrt std::sqrt
+#define hl_pow std::pow
+#define hl_round std::round
+#endif
+
+constexpr int BATCHSIZE = 64;
+
+#define FOR(i) for(int i = 0; i < BATCHSIZE; ++i)
+
+// When auto-vectorizing without __restrict,
+// gcc and clang check for overlap (with a bunch of integer code)
+// before running the vectorized loop
+
+// vector - vector operations
+inline void load(double* __restrict a, double const * __restrict b) noexcept { std::memcpy(a, b, BATCHSIZE * sizeof(double)); }
+inline void add(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] += b[i]; }
+inline void sub(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] -= b[i]; }
+inline void mul(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] *= b[i]; }
+inline void div(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] /= b[i]; }
+inline void exp(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_exp(b[i]); }
+inline void log(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_log(b[i]); }
+inline void sin(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_sin(b[i]); }
+inline void cos(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_cos(b[i]); }
+inline void tan(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_tan(b[i]); }
+inline void sqrt(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_sqrt(b[i]); }
+inline void pow(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_pow(a[i], hl_round(b[i])); };
+inline void root(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_pow(a[i], 1. / hl_round(b[i])); };
+inline void square(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_pow(b[i], 2.); };
+inline void inv(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = 1. / b[i]; }
+inline void neg(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = -b[i]; }
+
+// vector - scalar operations
+inline void load(double* __restrict a, double s) noexcept { FOR(i) a[i] = s; }
+inline void add(double* __restrict a, double s) noexcept { FOR(i) a[i] += s; }
+inline void sub(double* __restrict a, double s) noexcept { FOR(i) a[i] -= s; }
+inline void mul(double* __restrict a, double s) noexcept { FOR(i) a[i] *= s; }
+inline void div(double* __restrict a, double s) noexcept { FOR(i) a[i] /= s; }
+
+// vector operations
+inline void neg(double* __restrict a) noexcept { FOR(i) a[i] = -a[i]; }
+inline void inv(double* __restrict a) noexcept { FOR(i) a[i] = 1. / a[i]; }
+inline void exp(double* __restrict a) noexcept { FOR(i) a[i] = hl_exp(a[i]); }
+inline void log(double* __restrict a) noexcept { FOR(i) a[i] = hl_log(a[i]); }
+inline void sin(double* __restrict a) noexcept { FOR(i) a[i] = hl_sin(a[i]); }
+inline void cos(double* __restrict a) noexcept { FOR(i) a[i] = hl_cos(a[i]); }
+inline void sqrt(double* __restrict a) noexcept { FOR(i) a[i] = hl_sqrt(a[i]); }
+inline void round(double* __restrict a) noexcept { FOR(i) a[i] = hl_round(a[i]); }
+inline void square(double* __restrict a) noexcept { FOR(i) a[i] = hl_pow(a[i], 2.); }
+
+#undef FOR
+#endif
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationModel.cs	(revision 16332)
@@ -74,4 +74,16 @@
     }
 
+    public virtual bool IsProblemDataCompatible(IClassificationProblemData problemData, out string errorMessage) {
+      return ClassificationModel.IsProblemDataCompatible(this, problemData, out errorMessage);
+    }
+
+    public override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+      var classificationProblemData = problemData as IClassificationProblemData;
+      if (classificationProblemData == null)
+        throw new ArgumentException("The problem data is not a regression problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
+      return IsProblemDataCompatible(classificationProblemData, out errorMessage);
+    }
+
     #region events
     public event EventHandler TargetVariableChanged;
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionModel.cs	(revision 16332)
@@ -83,4 +83,16 @@
     }
 
+    public virtual bool IsProblemDataCompatible(IRegressionProblemData problemData, out string errorMessage) {
+      return RegressionModel.IsProblemDataCompatible(this, problemData, out errorMessage);
+    }
+
+    public override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+      var regressionProblemData = problemData as IRegressionProblemData;
+      if (regressionProblemData == null)
+        throw new ArgumentException("The problem data is not a regression problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
+      return IsProblemDataCompatible(regressionProblemData, out errorMessage);
+    }
+
     #region events
     public event EventHandler TargetVariableChanged;
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Plugin.cs.frame
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Plugin.cs.frame	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Plugin.cs.frame	(revision 16332)
@@ -42,5 +42,5 @@
   [PluginDependency("HeuristicLab.MainForm", "3.3")]
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
-  [PluginDependency("HeuristicLab.MathJax", "1.1")]
+  [PluginDependency("HeuristicLab.MathJax", "1.2")]
   [PluginDependency("HeuristicLab.Optimization","3.3")]
   [PluginDependency("HeuristicLab.Problems.DataAnalysis", "3.4")]
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Trading/3.4/ProblemData.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Trading/3.4/ProblemData.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Trading/3.4/ProblemData.cs	(revision 16332)
@@ -1650,33 +1650,4 @@
       OnChanged();
     }
-
-    public override void AdjustProblemDataProperties(IDataAnalysisProblemData problemData) {
-      var data = problemData as ProblemData;
-      if (data == null) throw new ArgumentException("The problem data is not a problem data set for trading. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
-
-      string errorMessage;
-      if (!data.IsProblemDataCompatible(this, out errorMessage)) {
-        throw new InvalidOperationException(errorMessage);
-      }
-
-      base.AdjustProblemDataProperties(data);
-
-      var toDelete = PriceChangeVariableParameter.ValidValues.ToList();
-      foreach (var entry in data.PriceChangeVariableParameter.ValidValues) {
-        if (toDelete.Any(x => x.Value == entry.Value)) {
-          toDelete.RemoveAll(x => x.Value == entry.Value);
-        } else {
-          PriceChangeVariableParameter.ValidValues.Add(new StringValue(entry.Value));
-        }
-      }
-      PriceChangeVariableParameter.Value =
-        PriceChangeVariableParameter.ValidValues.Single(v => v.Value == data.PriceChangeVariable);
-
-      foreach (var varToDelete in toDelete) PriceChangeVariableParameter.ValidValues.Remove(varToDelete);
-
-      TransactionCostsParameter.Value.Value = data.TransactionCosts;
-
-      OnChanged();
-    }
   }
 }
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Trading/3.4/Symbolic/Model.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Trading/3.4/Symbolic/Model.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Trading/3.4/Symbolic/Model.cs	(revision 16332)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -53,4 +54,10 @@
     }
 
+    public override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+      return IsDatasetCompatible(problemData.Dataset, out errorMessage);
+    }
+
+
     // Transforms an enumerable of real values to an enumerable of trading signals (buy(1) / hold(0) / sell(-1))
     public static IEnumerable<double> GetSignals(IEnumerable<double> xs) {
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/DataAnalysisSolutionView.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/DataAnalysisSolutionView.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/DataAnalysisSolutionView.cs	(revision 16332)
@@ -141,6 +141,4 @@
 
         var solution = (IDataAnalysisSolution)Content.Clone();
-        problemData.AdjustProblemDataProperties(solution.ProblemData);
-
         solution.ProblemData = problemData;
         if (!solution.Name.EndsWith(" with loaded problemData"))
@@ -231,5 +229,4 @@
 
       try {
-        problemData.AdjustProblemDataProperties(Content.ProblemData);
         Content.ProblemData = problemData;
 
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs	(revision 16332)
@@ -167,4 +167,8 @@
       }
     }
+
+    public bool ContainsVariable(string variableName) {
+      return variableValues.ContainsKey(variableName);
+    }
     public IEnumerable<string> DoubleVariables {
       get { return variableValues.Where(p => p.Value is IList<double>).Select(p => p.Key); }
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationModel.cs	(revision 16332)
@@ -66,4 +66,32 @@
     public abstract IClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData);
 
+    public virtual bool IsProblemDataCompatible(IClassificationProblemData problemData, out string errorMessage) {
+      return IsProblemDataCompatible(this, problemData, out errorMessage);
+    }
+
+    public override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+      var classificationProblemData = problemData as IClassificationProblemData;
+      if (classificationProblemData == null)
+        throw new ArgumentException("The problem data is not a regression problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
+      return IsProblemDataCompatible(classificationProblemData, out errorMessage);
+    }
+
+    public static bool IsProblemDataCompatible(IClassificationModel model, IClassificationProblemData problemData, out string errorMessage) {
+      if (model == null) throw new ArgumentNullException("model", "The provided model is null.");
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+      errorMessage = string.Empty;
+
+      if (model.TargetVariable != problemData.TargetVariable)
+        errorMessage = string.Format("The target variable of the model {0} does not match the target variable of the problemData {1}.", model.TargetVariable, problemData.TargetVariable);
+
+      var evaluationErrorMessage = string.Empty;
+      var datasetCompatible = model.IsDatasetCompatible(problemData.Dataset, out evaluationErrorMessage);
+      if (!datasetCompatible)
+        errorMessage += evaluationErrorMessage;
+
+      return string.IsNullOrEmpty(errorMessage);
+    }
+
     #region events
     public event EventHandler TargetVariableChanged;
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs	(revision 16332)
@@ -467,53 +467,4 @@
     }
     #endregion
-
-    protected override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
-      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
-      IClassificationProblemData classificationProblemData = problemData as IClassificationProblemData;
-      if (classificationProblemData == null)
-        throw new ArgumentException("The problem data is no classification problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
-
-      var returnValue = base.IsProblemDataCompatible(classificationProblemData, out errorMessage);
-      //check targetVariable
-      if (classificationProblemData.InputVariables.All(var => var.Value != TargetVariable)) {
-        errorMessage = string.Format("The target variable {0} is not present in the new problem data.", TargetVariable)
-                       + Environment.NewLine + errorMessage;
-        return false;
-      }
-
-      var newClassValues = classificationProblemData.Dataset.GetDoubleValues(TargetVariable).Distinct().OrderBy(x => x);
-      if (!newClassValues.SequenceEqual(ClassValues)) {
-        errorMessage = errorMessage + string.Format("The class values differ in the provided classification problem data.");
-        returnValue = false;
-      }
-
-      var newPositivieClassName = classificationProblemData.PositiveClass;
-      if (newPositivieClassName != PositiveClass) {
-        errorMessage = errorMessage + string.Format("The positive class differs in the provided classification problem data.");
-        returnValue = false;
-      }
-
-      return returnValue;
-    }
-
-    public override void AdjustProblemDataProperties(IDataAnalysisProblemData problemData) {
-      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
-      ClassificationProblemData classificationProblemData = problemData as ClassificationProblemData;
-      if (classificationProblemData == null)
-        throw new ArgumentException("The problem data is not a classification problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
-
-      base.AdjustProblemDataProperties(problemData);
-      TargetVariable = classificationProblemData.TargetVariable;
-      for (int i = 0; i < classificationProblemData.ClassNames.Count(); i++)
-        ClassNamesParameter.Value[i, 0] = classificationProblemData.ClassNames.ElementAt(i);
-
-      PositiveClass = classificationProblemData.PositiveClass;
-
-      for (int i = 0; i < Classes; i++) {
-        for (int j = 0; j < Classes; j++) {
-          ClassificationPenaltiesParameter.Value[i, j] = classificationProblemData.GetClassificationPenalty(ClassValuesCache[i], ClassValuesCache[j]);
-        }
-      }
-    }
   }
 }
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationSolutionBase.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationSolutionBase.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationSolutionBase.cs	(revision 16332)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -44,5 +45,11 @@
     public new IClassificationProblemData ProblemData {
       get { return (IClassificationProblemData)base.ProblemData; }
-      set { base.ProblemData = value; }
+      set {
+        if (value == null) throw new ArgumentNullException("The problemData must not be null.");
+        string errorMessage = string.Empty;
+        if (!Model.IsProblemDataCompatible(value, out errorMessage)) throw new ArgumentException(errorMessage);
+
+        base.ProblemData = value;
+      }
     }
 
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/ConstantModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/ConstantModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/ConstantModel.cs	(revision 16332)
@@ -83,4 +83,22 @@
     }
 
+    public virtual bool IsProblemDataCompatible(IClassificationProblemData problemData, out string errorMessage) {
+      return ClassificationModel.IsProblemDataCompatible(this, problemData, out errorMessage);
+    }
+
+    public override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+
+      var regressionProblemData = problemData as IRegressionProblemData;
+      if (regressionProblemData != null)
+        return IsProblemDataCompatible(regressionProblemData, out errorMessage);
+
+      var classificationProblemData = problemData as IClassificationProblemData;
+      if (classificationProblemData != null)
+        return IsProblemDataCompatible(classificationProblemData, out errorMessage);
+
+      throw new ArgumentException("The problem data is not a regression nor a classification problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
+    }
+
     #region IStringConvertibleValue
     public bool ReadOnly { get; private set; }
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisModel.cs	(revision 16332)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using HeuristicLab.Common;
@@ -38,4 +39,28 @@
 
     public abstract IEnumerable<string> VariablesUsedForPrediction { get; }
+
+    public virtual bool IsDatasetCompatible(IDataset dataset, out string errorMessage) {
+      if (dataset == null) throw new ArgumentNullException("dataset", "The provided dataset is null.");
+      return IsDatasetCompatible(this, dataset, out errorMessage);
+    }
+
+    public abstract bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage);
+
+    public static bool IsDatasetCompatible(IDataAnalysisModel model, IDataset dataset, out string errorMessage) {
+      if(model == null) throw new ArgumentNullException("model", "The provided model is null.");
+      if (dataset == null) throw new ArgumentNullException("dataset", "The provided dataset is null.");
+      errorMessage = string.Empty;
+
+      foreach (var variable in model.VariablesUsedForPrediction) {
+        if (!dataset.ContainsVariable(variable)) {
+          if (string.IsNullOrEmpty(errorMessage)) {
+            errorMessage = "The following variables must be present in the dataset for model evaluation:";
+          }
+          errorMessage += System.Environment.NewLine + " " + variable;
+        }
+      }
+
+      return string.IsNullOrEmpty(errorMessage);
+    }
   }
 }
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs	(revision 16332)
@@ -207,39 +207,4 @@
       if (listeners != null) listeners(this, EventArgs.Empty);
     }
-
-    protected virtual bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
-      errorMessage = string.Empty;
-      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
-
-      //check allowed input variables
-      StringBuilder message = new StringBuilder();
-      var variables = new HashSet<string>(problemData.InputVariables.Select(x => x.Value));
-      foreach (var item in AllowedInputVariables) {
-        if (!variables.Contains(item))
-          message.AppendLine("Input variable '" + item + "' is not present in the new problem data.");
-      }
-
-      if (message.Length != 0) {
-        errorMessage = message.ToString();
-        return false;
-      }
-      return true;
-
-    }
-
-    public virtual void AdjustProblemDataProperties(IDataAnalysisProblemData problemData) {
-      DataAnalysisProblemData data = problemData as DataAnalysisProblemData;
-      if (data == null) throw new ArgumentException("The problem data is not a data analysis problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
-
-      string errorMessage;
-      if (!data.IsProblemDataCompatible(this, out errorMessage)) {
-        throw new InvalidOperationException(errorMessage);
-      }
-
-      foreach (var inputVariable in InputVariables) {
-        var variable = data.InputVariables.FirstOrDefault(i => i.Value == inputVariable.Value);
-        InputVariables.SetItemCheckedState(inputVariable, variable != null && data.InputVariables.ItemChecked(variable));
-      }
-    }
   }
 }
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisSolution.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisSolution.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisSolution.cs	(revision 16332)
@@ -58,12 +58,13 @@
       get { return (IDataAnalysisProblemData)this[ProblemDataResultName].Value; }
       set {
-        if (this[ProblemDataResultName].Value != value) {
-          if (value != null) {
-            ProblemData.Changed -= new EventHandler(ProblemData_Changed);
-            this[ProblemDataResultName].Value = value;
-            ProblemData.Changed += new EventHandler(ProblemData_Changed);
-            OnProblemDataChanged();
-          }
-        }
+        if (value == null) throw new ArgumentNullException("The problemData must not be null.");
+        if (this[ProblemDataResultName].Value == value) return;
+        string errorMessage = string.Empty;
+        if (!Model.IsProblemDataCompatible(value, out errorMessage)) throw new ArgumentException(errorMessage);
+
+        ProblemData.Changed -= new EventHandler(ProblemData_Changed);
+        this[ProblemDataResultName].Value = value;
+        ProblemData.Changed += new EventHandler(ProblemData_Changed);
+        OnProblemDataChanged();
       }
     }
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionModel.cs	(revision 16332)
@@ -67,4 +67,32 @@
     public abstract IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData);
 
+    public virtual bool IsProblemDataCompatible(IRegressionProblemData problemData, out string errorMessage) {
+      return IsProblemDataCompatible(this, problemData, out errorMessage);
+    }
+
+    public override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+      var regressionProblemData = problemData as IRegressionProblemData;
+      if (regressionProblemData == null)
+        throw new ArgumentException("The problem data is not a regression problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
+      return IsProblemDataCompatible(regressionProblemData, out errorMessage);
+    }
+
+    public static bool IsProblemDataCompatible(IRegressionModel model, IRegressionProblemData problemData, out string errorMessage) {
+      if (model == null) throw new ArgumentNullException("model", "The provided model is null.");
+      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
+      errorMessage = string.Empty;
+
+      if (model.TargetVariable != problemData.TargetVariable)
+        errorMessage = string.Format("The target variable of the model {0} does not match the target variable of the problemData {1}.", model.TargetVariable, problemData.TargetVariable);
+
+      var evaluationErrorMessage = string.Empty;
+      var datasetCompatible = model.IsDatasetCompatible(problemData.Dataset, out evaluationErrorMessage);
+      if (!datasetCompatible)
+        errorMessage += evaluationErrorMessage;
+
+      return string.IsNullOrEmpty(errorMessage);
+    }
+
     #region events
     public event EventHandler TargetVariableChanged;
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs	(revision 16332)
@@ -161,23 +161,4 @@
       OnChanged();
     }
-
-    protected override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
-      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
-      IRegressionProblemData regressionProblemData = problemData as IRegressionProblemData;
-      if (regressionProblemData == null)
-        throw new ArgumentException("The problem data is not a regression problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
-
-      var returnValue = base.IsProblemDataCompatible(problemData, out errorMessage);
-      return returnValue;
-    }
-
-    public override void AdjustProblemDataProperties(IDataAnalysisProblemData problemData) {
-      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
-      RegressionProblemData regressionProblemData = problemData as RegressionProblemData;
-      if (regressionProblemData == null)
-        throw new ArgumentException("The problem data is not a regression problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
-
-      base.AdjustProblemDataProperties(problemData);
-    }
   }
 }
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionSolutionBase.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionSolutionBase.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionSolutionBase.cs	(revision 16332)
@@ -70,5 +70,11 @@
     public new IRegressionProblemData ProblemData {
       get { return (IRegressionProblemData)base.ProblemData; }
-      set { base.ProblemData = value; }
+      set {
+        if (value == null) throw new ArgumentNullException("The problemData must not be null.");
+        string errorMessage = string.Empty;
+        if (!Model.IsProblemDataCompatible(value, out errorMessage)) throw new ArgumentException(errorMessage);
+
+        base.ProblemData = value;
+      }
     }
 
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/TimeSeriesPrognosisProblemData.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/TimeSeriesPrognosisProblemData.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/TimeSeriesPrognosisProblemData.cs	(revision 16332)
@@ -1620,36 +1620,4 @@
       OnChanged();
     }
-
-    protected override bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage) {
-      if (problemData == null) throw new ArgumentNullException("problemData", "The provided problemData is null.");
-      ITimeSeriesPrognosisProblemData timeseriesProblemData = problemData as ITimeSeriesPrognosisProblemData;
-      if (timeseriesProblemData == null)
-        throw new ArgumentException("The problem data is not a time-series problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
-
-      var returnValue = base.IsProblemDataCompatible(problemData, out errorMessage);
-      //check targetVariable
-      if (problemData.InputVariables.All(var => var.Value != TargetVariable)) {
-        errorMessage = string.Format("The target variable {0} is not present in the new problem data.", TargetVariable)
-                       + Environment.NewLine + errorMessage;
-        return false;
-      }
-      return returnValue;
-    }
-
-    public override void AdjustProblemDataProperties(IDataAnalysisProblemData problemData) {
-      TimeSeriesPrognosisProblemData timeSeriesProblemData = problemData as TimeSeriesPrognosisProblemData;
-      if (timeSeriesProblemData == null)
-        throw new ArgumentException("The problem data is not a timeseries problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
-
-      var trainingDataStart = TrainingIndices.First();
-
-      base.AdjustProblemDataProperties(problemData);
-
-      TestPartition.Start = trainingDataStart;
-
-      TrainingHorizon = timeSeriesProblemData.TrainingHorizon;
-      TestHorizon = timeSeriesProblemData.TestHorizon;
-    }
-
   }
 }
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Classification/IClassificationModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Classification/IClassificationModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Classification/IClassificationModel.cs	(revision 16332)
@@ -31,4 +31,5 @@
     IEnumerable<double> GetEstimatedClassValues(IDataset dataset, IEnumerable<int> rows);
     IClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData);
+    bool IsProblemDataCompatible(IClassificationProblemData problemData, out string errorMessage);
     string TargetVariable { get; set; }
     event EventHandler TargetVariableChanged;
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisModel.cs	(revision 16332)
@@ -30,4 +30,6 @@
   public interface IDataAnalysisModel : INamedItem {
     IEnumerable<string> VariablesUsedForPrediction { get; }
+    bool IsDatasetCompatible(IDataset dataset, out string errorMessage);
+    bool IsProblemDataCompatible(IDataAnalysisProblemData problemData, out string errorMessage);
   }
 }
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisProblemData.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisProblemData.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisProblemData.cs	(revision 16332)
@@ -49,6 +49,4 @@
 
     event EventHandler Changed;
-
-    void AdjustProblemDataProperties(IDataAnalysisProblemData problemData);
   }
 }
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataset.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataset.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataset.cs	(revision 16332)
@@ -33,4 +33,5 @@
     IEnumerable<string> DateTimeVariables { get; }
 
+    bool ContainsVariable(string variablename);
     bool VariableHasType<T>(string variableName);
 
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/IRegressionModel.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/IRegressionModel.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/IRegressionModel.cs	(revision 16332)
@@ -31,4 +31,5 @@
     IEnumerable<double> GetEstimatedValues(IDataset dataset, IEnumerable<int> rows);
     IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData);
+    bool IsProblemDataCompatible(IRegressionProblemData problemData, out string errorMessage);
     string TargetVariable { get; set; }
     event EventHandler TargetVariableChanged;
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/ModifiableDataset.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/ModifiableDataset.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis/3.4/ModifiableDataset.cs	(revision 16332)
@@ -56,4 +56,7 @@
 
     public IEnumerable<object> GetRow(int row) {
+      if (row < 0 || row >= Rows)
+        throw new ArgumentException(string.Format("Invalid row {0} specified. The dataset contains {1} row(s).", row, Rows));
+
       return variableValues.Select(x => x.Value[row]);
     }
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/HeuristicLab.Problems.Instances.DataAnalysis-3.3.csproj
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/HeuristicLab.Problems.Instances.DataAnalysis-3.3.csproj	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/HeuristicLab.Problems.Instances.DataAnalysis-3.3.csproj	(revision 16332)
@@ -169,4 +169,9 @@
     <Compile Include="Regression\PennML\PennMLRegressionDataDescriptor.cs" />
     <Compile Include="Regression\PennML\PennMLRegressionInstanceProvider.cs" />
+    <Compile Include="Regression\Physics\AircraftLift.cs" />
+    <Compile Include="Regression\Physics\AircraftMaximumLift.cs" />
+    <Compile Include="Regression\Physics\FluidDynamics.cs" />
+    <Compile Include="Regression\Physics\PhysicsInstanceProvider.cs" />
+    <Compile Include="Regression\Physics\RocketFuelFlow.cs" />
     <Compile Include="Regression\VariableNetworks\LinearVariableNetwork.cs" />
     <Compile Include="Regression\VariableNetworks\GaussianProcessVariableNetwork.cs" />
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/AircraftLift.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/AircraftLift.cs	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/AircraftLift.cs	(revision 16332)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.Instances.DataAnalysis {
+  class AircraftLift : ArtificialRegressionDataDescriptor {
+    public override string Name { get { return "Aircraft Lift Coefficient C_L = x1*(x2 - 2) + x3*x4*x5/x6"; } }
+
+    public override string Description {
+      get {
+        return "A full description of this problem instance is given in the paper: A multilevel block building algorithm for fast modeling generalized separable systems. " + Environment.NewLine +
+               "Authors: Chen Chen, Changtong Luo, Zonglin Jiang" + Environment.NewLine +
+               "Function: f(X) = x1*(x2 - 2) + x3*x4*x5/x6" + Environment.NewLine +
+               "with x1 in [0.4, 0.8], x2 in [5, 10], x3 in [0.4, 0.8], x4 in [5, 10], x5 in [1, 1.5], x6 in [5, 7]";
+      }
+    }
+
+    protected override string TargetVariable { get { return "f(X)"; } }
+    protected override string[] VariableNames { get { return new string[] { "x1", "x2", "x3", "x4", "x5", "x6", "f(X)" }; } }
+    protected override string[] AllowedInputVariables { get { return new string[] { "x1", "x2", "x3", "x4", "x5", "x6" }; } }
+    protected override int TrainingPartitionStart { get { return 0; } }
+    protected override int TrainingPartitionEnd { get { return 100; } }
+    protected override int TestPartitionStart { get { return 100; } }
+    protected override int TestPartitionEnd { get { return 200; } }
+
+    public int Seed { get; private set; }
+
+    public AircraftLift() : this((int)System.DateTime.Now.Ticks) { }
+
+    public AircraftLift(int seed) {
+      Seed = seed;
+    }
+
+    protected override List<List<double>> GenerateValues() {
+      var rand = new MersenneTwister((uint)Seed);
+
+      List<List<double>> data = new List<List<double>>();
+      var x1 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.4, 0.8).ToList();
+      var x2 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 5.0, 10.0).ToList();
+      var x3 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.4, 0.8).ToList();
+      var x4 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 5.0, 10.0).ToList();
+      var x5 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 1.5).ToList();
+      var x6 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 5.0, 7.0).ToList();
+
+      List<double> fx = new List<double>();
+      data.Add(x1);
+      data.Add(x2);
+      data.Add(x3);
+      data.Add(x4);
+      data.Add(x5);
+      data.Add(x6);
+      data.Add(fx);
+
+      for (int i = 0; i < x1.Count; i++) {
+        double fxi = x1[i] * (x2[i] - 2.0) + x3[i] * x4[i] * x5[i] / x6[i];
+        fx.Add(fxi);
+      }
+
+      return data;
+    }
+  }
+}
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/AircraftMaximumLift.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/AircraftMaximumLift.cs	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/AircraftMaximumLift.cs	(revision 16332)
@@ -0,0 +1,136 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.Instances.DataAnalysis {
+  class AircraftMaximumLift : ArtificialRegressionDataDescriptor {
+    public override string Name { get { return "Aircraft Maximum Lift Coefficient"; } }
+
+    public override string Description {
+      get {
+        return "A full description of this problem instance is given in the paper: A multilevel block building algorithm for fast modeling generalized separable systems. " + Environment.NewLine +
+               "Authors: Chen Chen, Changtong Luo, Zonglin Jiang" + Environment.NewLine +
+               "Function: f(X) = x1 - 0.25 x4 x5 x6 (4 + 0.1 x2/x3 - x2²/x3²) + x13 x14/x15 x18 x7 - x13 x14/x15 x8 + x13 x14/x15 x9 + x16 x17/x15 x18 x10 - x16 x17/x15 x11 + x16 x17/x15 x12" + Environment.NewLine +
+               "with x1 in [0.4, 0.8], " +
+               "x2 in [3, 4], " +
+               "x3 in [20, 30], " +
+               "x4, x13, x16 in [2, 5]," +
+               "x14, x17 in [1, 1.5], " +
+               "x15 in [5, 7]," +
+               "x18 in [10, 20]," +
+               "x8, x11 in [1, 1.5]," +
+               "x9, x12 in [1, 2]," +
+               "x7, x10 in [0.5, 1.5]";
+      }
+    }
+
+    protected override string TargetVariable { get { return "f(X)"; } }
+    protected override string[] VariableNames { get { return new string[] { "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "f(X)" }; } }
+    protected override string[] AllowedInputVariables { get { return VariableNames.Except(new string[] { TargetVariable }).ToArray(); } }
+    protected override int TrainingPartitionStart { get { return 0; } }
+    protected override int TrainingPartitionEnd { get { return 100; } }
+    protected override int TestPartitionStart { get { return 100; } }
+    protected override int TestPartitionEnd { get { return 200; } }
+
+    public int Seed { get; private set; }
+
+    public AircraftMaximumLift() : this((int)System.DateTime.Now.Ticks) { }
+
+    public AircraftMaximumLift(int seed) {
+      Seed = seed;
+    }
+
+    protected override List<List<double>> GenerateValues() {
+      var rand = new MersenneTwister((uint)Seed);
+
+      List<List<double>> data = new List<List<double>>();
+      var x1 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.4, 0.8).ToList();
+
+      var x2 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 3.0, 4.0).ToList();
+
+      var x3 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 20.0, 30.0).ToList();
+
+      var x4 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 2.0, 5.0).ToList();
+      var x13 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 2.0, 5.0).ToList();
+      var x16 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 2.0, 5.0).ToList();
+
+
+      var x5 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 1.5).ToList(); // TODO: range for X5 is not specified in the paper
+      var x6 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 5.0, 7.0).ToList(); // TODO: range for X6 is not specified in the paper
+
+      var x7 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.5, 1.5).ToList();
+      var x10 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.5, 1.5).ToList();
+
+      var x8 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 1.5).ToList();
+      var x11 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 1.5).ToList();
+
+      var x9 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 2.0).ToList();
+      var x12 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 2.0).ToList();
+
+      var x14 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 1.5).ToList();
+      var x17 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 1.5).ToList();
+
+      var x15 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 5.0, 7.0).ToList();
+
+      var x18 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 10.0, 20.0).ToList();
+
+      List<double> fx = new List<double>();
+      data.Add(x1);
+      data.Add(x2);
+      data.Add(x3);
+      data.Add(x4);
+      data.Add(x5);
+      data.Add(x6);
+      data.Add(x7);
+      data.Add(x8);
+      data.Add(x9);
+      data.Add(x10);
+      data.Add(x11);
+      data.Add(x12);
+      data.Add(x13);
+      data.Add(x14);
+      data.Add(x15);
+      data.Add(x16);
+      data.Add(x17);
+      data.Add(x18);
+      data.Add(fx);
+
+      for (int i = 0; i < x1.Count; i++) {
+        double fxi = x1[i];
+        fxi = fxi - 0.25 * x4[i] * x5[i] * x6[i] * (4 + 0.1 * (x2[i] / x3[i]) - (x2[i] / x3[i]) * (x2[i] / x3[i]));
+        fxi = fxi + x13[i] * (x14[i] / x15[i]) * x18[i] * x7[i];
+        fxi = fxi - x13[i] * (x14[i] / x15[i]) * x8[i];
+        fxi = fxi + x13[i] * (x14[i] / x15[i]) * x9[i];
+        fxi = fxi + x16[i] * (x17[i] / x15[i]) * x18[i] * x10[i];
+        fxi = fxi - x16[i] * (x17[i] / x15[i]) * x11[i];
+        fxi = fxi + x16[i] * (x17[i] / x15[i]) * x12[i];
+
+        fx.Add(fxi);
+      }
+
+      return data;
+    }
+  }
+}
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/FluidDynamics.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/FluidDynamics.cs	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/FluidDynamics.cs	(revision 16332)
@@ -0,0 +1,83 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.Instances.DataAnalysis {
+  class FluidDynamics : ArtificialRegressionDataDescriptor {
+    public override string Name { get { return "Flow psi = x1*x2*x5*(1 - x4²/x5²) + 1/(2*Pi) * x3*log(x5/x4)"; } }
+
+    public override string Description {
+      get {
+        return "A full description of this problem instance is given in the paper: A multilevel block building algorithm for fast modeling generalized separable systems. " + Environment.NewLine +
+               "Authors: Chen Chen, Changtong Luo, Zonglin Jiang" + Environment.NewLine +
+               "Function: f(X) = x1*x2*x5*(1 - x4²/x5²) + 1/(2*Pi) * x3*log(x5/x4)" + Environment.NewLine +
+               "with x1 in [60,65], x2 in [30, 40], x3 in [5,10], x4 in [0.5,0.8], x5 in [0.2,0.5]";
+      }
+    }
+
+    protected override string TargetVariable { get { return "f(X)"; } }
+    protected override string[] VariableNames { get { return new string[] { "x1", "x2", "x3", "x4", "x5", "f(X)" }; } }
+    protected override string[] AllowedInputVariables { get { return new string[] { "x1", "x2", "x3", "x4", "x5" }; } }
+    protected override int TrainingPartitionStart { get { return 0; } }
+    protected override int TrainingPartitionEnd { get { return 100; } }
+    protected override int TestPartitionStart { get { return 100; } }
+    protected override int TestPartitionEnd { get { return 200; } }
+
+    public int Seed { get; private set; }
+
+    public FluidDynamics() : this((int)System.DateTime.Now.Ticks) { }
+
+    public FluidDynamics(int seed) {
+      Seed = seed;
+    }
+
+    protected override List<List<double>> GenerateValues() {
+      var rand = new MersenneTwister((uint)Seed);
+
+      List<List<double>> data = new List<List<double>>();
+      var x1 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 60.0, 65.0).ToList();
+      var x2 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 30.0, 40.0).ToList();
+      var x3 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 5.0, 10.0).ToList();
+      var x4 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.5, 0.8).ToList();
+      var x5 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.2, 0.5).ToList();
+
+      List<double> fx = new List<double>();
+      data.Add(x1);
+      data.Add(x2);
+      data.Add(x3);
+      data.Add(x4);
+      data.Add(x5);
+      data.Add(fx);
+
+      for (int i = 0; i < x1.Count; i++) {
+        double fxi = x1[i] * x2[i] * x5[i] * (1 - (x4[i] * x4[i]) / (x5[i] * x5[i])) +
+                     (1 / (2 * Math.PI)) * x3[i] * Math.Log(x5[i] / x4[i]);
+        fx.Add(fxi);
+      }
+
+      return data;
+    }
+  }
+}
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/PhysicsInstanceProvider.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/PhysicsInstanceProvider.cs	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/PhysicsInstanceProvider.cs	(revision 16332)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.Instances.DataAnalysis {
+  class PhysicsInstanceProvider : ArtificialRegressionInstanceProvider {
+    public override IEnumerable<IDataDescriptor> GetDataDescriptors() {
+      return new List<IDataDescriptor>()
+      {
+         new RocketFuelFlow(123),
+         new AircraftLift(456),
+         new FluidDynamics(789),
+         new AircraftMaximumLift(321)
+      };
+    }
+
+    public override string Name { get { return "Physics Benchmark Problems"; } }
+    public override string Description { get { return ""; } }
+    public override Uri WebLink { get { return new Uri(@"https://arxiv.org/abs/1706.02281"); } }
+    public override string ReferencePublication {
+      get {
+        return "Chen Chen, Changtong Luo, Zonglin Jiang, 2017 " +
+"\"A multilevel block search algorithm for fast modeling generalized separable systems.\" arXiv preprint arXiv:1706.02281, v3";
+      }
+    }
+  }
+}
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/RocketFuelFlow.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/RocketFuelFlow.cs	(revision 16332)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/Physics/RocketFuelFlow.cs	(revision 16332)
@@ -0,0 +1,78 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.Instances.DataAnalysis {
+  class RocketFuelFlow : ArtificialRegressionDataDescriptor {
+    public override string Name { get { return "Rocket Fuel Flow f(X) = 4000*x1*x2/sqrt(x3)"; } }
+
+    public override string Description {
+      get {
+        return "A full description of this problem instance is given in the paper: A multilevel block building algorithm for fast modeling generalized separable systems. " + Environment.NewLine +
+               "Authors: Chen Chen, Changtong Luo, Zonglin Jiang" + Environment.NewLine +
+               "Function: f(X) = 4000*x1*x2/sqrt(x3)" + Environment.NewLine +
+               "with x1 in [4,6], x2 in [0.5, 1.5], x3 in [250,260]";
+      }
+    }
+
+    protected override string TargetVariable { get { return "f(X)"; } }
+    protected override string[] VariableNames { get { return new string[] { "x1", "x2", "x3", "f(X)" }; } }
+    protected override string[] AllowedInputVariables { get { return new string[] { "x1", "x2", "x3" }; } }
+    protected override int TrainingPartitionStart { get { return 0; } }
+    protected override int TrainingPartitionEnd { get { return 100; } }
+    protected override int TestPartitionStart { get { return 100; } }
+    protected override int TestPartitionEnd { get { return 200; } }
+
+    public int Seed { get; private set; }
+
+    public RocketFuelFlow() : this((int)System.DateTime.Now.Ticks) { }
+
+    public RocketFuelFlow(int seed) {
+      Seed = seed;
+    }
+
+    protected override List<List<double>> GenerateValues() {
+      var rand = new MersenneTwister((uint)Seed);
+
+      List<List<double>> data = new List<List<double>>();
+      var x1 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 4.0, 6.0).ToList();
+      var x2 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.5, 1.5).ToList();
+      var x3 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 250.0, 260.0).ToList();
+
+      List<double> fx = new List<double>();
+      data.Add(x1);
+      data.Add(x2);
+      data.Add(x3);
+      data.Add(fx);
+
+      for (int i = 0; i < x1.Count; i++) {
+        double fxi = 4000 * x1[i] * x2[i] / Math.Sqrt(x3[i]);
+        fx.Add(fxi);
+      }
+
+      return data;
+    }
+  }
+}
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/ProjectDao.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/ProjectDao.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/ProjectDao.cs	(revision 16332)
@@ -41,5 +41,5 @@
     public void DeleteByIds(IEnumerable<Guid> ids) {
       string paramProjectIds = string.Join(",", ids.ToList().Select(x => string.Format("'{0}'", x)));
-      if(!string.IsNullOrWhiteSpace(paramProjectIds)) {
+      if (!string.IsNullOrWhiteSpace(paramProjectIds)) {
         string queryString = string.Format(DeleteByIdsQueryString, paramProjectIds);
         DataContext.ExecuteCommand(queryString);
@@ -117,25 +117,28 @@
       WITH rtree AS
       (
-	      SELECT ResourceId, ParentResourceId
-	      FROM [Resource]
-	      UNION ALL
-	      SELECT rt.ResourceId, r.ParentResourceId
-	      FROM [Resource] r
-	      JOIN rtree rt ON rt.ParentResourceId = r.ResourceId
-      )
-      SELECT apr.ProjectId, SUM(res.Cores) AS Cores, SUM(res.Memory) AS Memory
-      FROM rtree, [AssignedProjectResource] apr, [Resource] res
-      WHERE rtree.ResourceId = res.ResourceId
-      AND res.ResourceType = 'Slave'
-      AND (res.SlaveState = 'Idle' OR SlaveState = 'Calculating')
-      AND rtree.ParentResourceId = apr.ResourceId
-      GROUP BY apr.ProjectId
-      UNION
-      SELECT apr.ProjectId, SUM(res.Cores) AS Cores, SUM(res.Memory) AS Memory
-      FROM [AssignedProjectResource] apr, [Resource] res
-      WHERE apr.ResourceId = res.ResourceId
-      AND res.ResourceType = 'Slave'
-      AND (res.SlaveState = 'Idle' OR SlaveState = 'Calculating')
-      GROUP BY apr.ProjectId
+        SELECT ResourceId, ParentResourceId
+        FROM [Resource]
+        UNION ALL
+        SELECT rt.ResourceId, r.ParentResourceId
+        FROM [Resource] r
+        JOIN rtree rt ON rt.ParentResourceId = r.ResourceId
+      )
+      SELECT [union].ProjectId, SUM([union].Cores), SUM([union].Memory)
+      FROM
+      (
+        SELECT apr.ProjectId, res.Cores, res.Memory
+        FROM rtree, [AssignedProjectResource] apr, [Resource] res
+        WHERE rtree.ResourceId = res.ResourceId
+        AND res.ResourceType = 'Slave'
+        AND (res.SlaveState = 'Idle' OR SlaveState = 'Calculating')
+        AND rtree.ParentResourceId = apr.ResourceId
+        UNION ALL
+        SELECT apr.ProjectId, res.Cores, res.Memory
+        FROM [AssignedProjectResource] apr, [Resource] res
+        WHERE apr.ResourceId = res.ResourceId
+        AND res.ResourceType = 'Slave'
+        AND (res.SlaveState = 'Idle' OR SlaveState = 'Calculating')
+      ) AS [union]
+      GROUP BY [union].ProjectId
     ";
 
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Tests/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4/SubtreeCrossoverTest.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Tests/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4/SubtreeCrossoverTest.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Tests/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4/SubtreeCrossoverTest.cs	(revision 16332)
@@ -46,4 +46,6 @@
           SubroutineCreater.CreateSubroutine(random, trees[i], 100, 10, 3, 3);
       }
+      var children = new List<ISymbolicExpressionTree>(trees);
+
       Stopwatch stopwatch = new Stopwatch();
       stopwatch.Start();
@@ -52,6 +54,7 @@
           var par0 = (ISymbolicExpressionTree)trees.SampleRandom(random).Clone();
           var par1 = (ISymbolicExpressionTree)trees.SampleRandom(random).Clone();
-          SubtreeCrossover.Cross(random, par0, par1, 0.9, 100, 10);
+          children[i] = SubtreeCrossover.Cross(random, par0, par1, 0.9, 100, 10);
         }
+        trees = children;
       }
       stopwatch.Stop();
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/DeriveTest.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/DeriveTest.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/DeriveTest.cs	(revision 16332)
@@ -45,5 +45,5 @@
       Assert.AreEqual("6", Derive("2*3*x", "x"));
       Assert.AreEqual("(10*'y')", Derive("10*x*y+20*y", "x"));
-      Assert.AreEqual("(1 / (SQR('x') * (-1)))",  Derive("1/x", "x"));
+      Assert.AreEqual("(1 / (SQR('x') * (-1)))", Derive("1/x", "x"));
       Assert.AreEqual("('y' / (SQR('x') * (-1)))", Derive("y/x", "x"));
       Assert.AreEqual("((((-2*'x') + (-1)) * ('a' + 'b')) / SQR(('x' + ('x' * 'x'))))",
@@ -58,20 +58,68 @@
       Assert.AreEqual("(COS((3*'x')) * 3)", Derive("sin(3*x)", "x"));
       Assert.AreEqual("(SIN((3*'x')) * (-3))", Derive("cos(3*x)", "x"));
+      Assert.AreEqual("(1 / (SQR(COS((3*'x'))) * 0.333333333333333))", Derive("tan(3*x)", "x")); // diff(tan(f(x)), x) = 1.0 / cos²(f(x)), simplifier puts constant factor into the denominator
 
+      {
+        // special case: Inv(x) using only one argument to the division symbol
+        // f(x) = 1/x
+        var root = new ProgramRootSymbol().CreateTreeNode();
+        var start = new StartSymbol().CreateTreeNode();
+        var div = new Division().CreateTreeNode();
+        var varNode = (VariableTreeNode)(new Variable().CreateTreeNode());
+        varNode.Weight = 1.0;
+        varNode.VariableName = "x";
+        div.AddSubtree(varNode);
+        start.AddSubtree(div);
+        root.AddSubtree(start);
+        var t = new SymbolicExpressionTree(root);
+        Assert.AreEqual("(1 / (SQR('x') * (-1)))",
+          formatter.Format(DerivativeCalculator.Derive(t, "x")));
+      }
 
-      // special case: Inv(x) using only one argument to the division symbol
-      // f(x) = 1/x
-      var root = new ProgramRootSymbol().CreateTreeNode();
-      var start = new StartSymbol().CreateTreeNode();
-      var div = new Division().CreateTreeNode();
-      var varNode = (VariableTreeNode)(new Variable().CreateTreeNode());
-      varNode.Weight = 1.0;
-      varNode.VariableName = "x";
-      div.AddSubtree(varNode);
-      start.AddSubtree(div);
-      root.AddSubtree(start);
-      var t = new SymbolicExpressionTree(root);
-      Assert.AreEqual("(1 / (SQR('x') * (-1)))", 
-        formatter.Format(DerivativeCalculator.Derive(t, "x")));
+      {
+        // special case: multiplication with only one argument
+        var root = new ProgramRootSymbol().CreateTreeNode();
+        var start = new StartSymbol().CreateTreeNode();
+        var mul = new Multiplication().CreateTreeNode();
+        var varNode = (VariableTreeNode)(new Variable().CreateTreeNode());
+        varNode.Weight = 3.0;
+        varNode.VariableName = "x";
+        mul.AddSubtree(varNode);
+        start.AddSubtree(mul);
+        root.AddSubtree(start);
+        var t = new SymbolicExpressionTree(root);
+        Assert.AreEqual("3",
+          formatter.Format(DerivativeCalculator.Derive(t, "x")));
+      }
+
+      {
+        // division with multiple arguments
+        // div(x, y, z) is interpreted as (x / y) / z
+        var root = new ProgramRootSymbol().CreateTreeNode();
+        var start = new StartSymbol().CreateTreeNode();
+        var div = new Division().CreateTreeNode();
+        var varNode1 = (VariableTreeNode)(new Variable().CreateTreeNode());
+        varNode1.Weight = 3.0;
+        varNode1.VariableName = "x";
+        var varNode2 = (VariableTreeNode)(new Variable().CreateTreeNode());
+        varNode2.Weight = 4.0;
+        varNode2.VariableName = "y";
+        var varNode3 = (VariableTreeNode)(new Variable().CreateTreeNode());
+        varNode3.Weight = 5.0;
+        varNode3.VariableName = "z";
+        div.AddSubtree(varNode1); div.AddSubtree(varNode2); div.AddSubtree(varNode3);
+        start.AddSubtree(div);
+        root.AddSubtree(start);
+        var t = new SymbolicExpressionTree(root);
+
+        Assert.AreEqual("(('y' * 'z' * 60) / SQR(('y' * 'z' * 20)))", // actually 3 / (4y  5z) but simplifier is not smart enough to cancel numerator and denominator
+                                                                      // 60 y z / y² z² 20² == 6 / y z 40 == 3 / y z 20
+          formatter.Format(DerivativeCalculator.Derive(t, "x")));
+        Assert.AreEqual("(('x' * 'z' * (-60)) / SQR(('y' * 'z' * 20)))", // actually 3x * -(4 5 z) / (4y 5z)² = -3x / (20 y² z)
+                                                                         // -3 4 5 x z / 4² y² 5² z² = -60 x z / 20² z² y² ==    -60 x z / y² z² 20² 
+          formatter.Format(DerivativeCalculator.Derive(t, "y")));
+        Assert.AreEqual("(('x' * 'y' * (-60)) / SQR(('y' * 'z' * 20)))",
+          formatter.Format(DerivativeCalculator.Derive(t, "z")));
+      }
     }
 
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/SymbolicDataAnalysisExpressionTreeInterpreterTest.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/SymbolicDataAnalysisExpressionTreeInterpreterTest.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/SymbolicDataAnalysisExpressionTreeInterpreterTest.cs	(revision 16332)
@@ -119,4 +119,17 @@
     public void LinearInterpreterTestArithmeticGrammarPerformance() {
       TestArithmeticGrammarPerformance(new SymbolicDataAnalysisExpressionTreeLinearInterpreter(), 12.5e6);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.DataAnalysis.Symbolic")]
+    [TestProperty("Time", "long")]
+    public void BatchInterpreterTestTypeCoherentGrammarPerformance() {
+      TestTypeCoherentGrammarPerformance(new SymbolicDataAnalysisExpressionTreeBatchInterpreter(), 12.5e6);
+    }
+    [TestMethod]
+    [TestCategory("Problems.DataAnalysis.Symbolic")]
+    [TestProperty("Time", "long")]
+    public void BatchInterpreterTestArithmeticGrammarPerformance() {
+      TestArithmeticGrammarPerformance(new SymbolicDataAnalysisExpressionTreeBatchInterpreter(), 12.5e6);
     }
 
Index: /branches/2915-AbsoluteSymbol/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/SymbolicExpressionTreeBottomUpSimilarityCalculatorTest.cs
===================================================================
--- /branches/2915-AbsoluteSymbol/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/SymbolicExpressionTreeBottomUpSimilarityCalculatorTest.cs	(revision 16331)
+++ /branches/2915-AbsoluteSymbol/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/SymbolicExpressionTreeBottomUpSimilarityCalculatorTest.cs	(revision 16332)
@@ -7,14 +7,13 @@
   [TestClass]
   public class BottomUpSimilarityCalculatorTest {
-    private readonly SymbolicExpressionTreeBottomUpSimilarityCalculator busCalculator;
-    private readonly SymbolicExpressionImporter importer;
+    private readonly SymbolicExpressionTreeBottomUpSimilarityCalculator similarityCalculator = new SymbolicExpressionTreeBottomUpSimilarityCalculator() { MatchConstantValues = false, MatchVariableWeights = false };
+    private readonly SymbolicExpressionImporter importer = new SymbolicExpressionImporter();
 
-    private const int N = 150;
+    private const int N = 1000;
     private const int Rows = 1;
     private const int Columns = 10;
 
     public BottomUpSimilarityCalculatorTest() {
-      busCalculator = new SymbolicExpressionTreeBottomUpSimilarityCalculator();
-      importer = new SymbolicExpressionImporter();
+      var parser = new InfixExpressionParser();
     }
 
@@ -23,39 +22,24 @@
     [TestProperty("Time", "short")]
     public void BottomUpTreeSimilarityCalculatorTestMapping() {
-      TestMatchedNodes("(+ 1 2)", "(+ 2 1)", 5);
-      TestMatchedNodes("(- 2 1)", "(- 1 2)", 2);
-      TestMatchedNodes("(* (variable 1 X1) (variable 1 X2))", "(* (+ (variable 1 X1) 1) (+ (variable 1 X2) 1))", 2);
+      TestMatchedNodes("(+ 1 1)", "(+ 2 2)", 0, strict: true);
+      TestMatchedNodes("(+ 1 1)", "(+ 2 2)", 3, strict: false);
+      TestMatchedNodes("(+ 1 1)", "(+ 1 2)", 1, strict: true);
+      TestMatchedNodes("(+ 2 1)", "(+ 1 2)", 3, strict: true);
 
-      TestMatchedNodes("(* (variable 1 X1) (variable 1 X2))", "(* (+ (variable 1 X1) 1) (variable 1 X2))", 2);
+      TestMatchedNodes("(- 1 1)", "(- 2 2)", 0, strict: true);
+      TestMatchedNodes("(- 1 1)", "(- 2 2)", 3, strict: false);
 
-      TestMatchedNodes("(+ (variable 1 a) (variable 1 b))", "(+ (variable 1 a) (variable 1 a))", 1);
-      TestMatchedNodes("(+ (+ (variable 1 a) (variable 1 b)) (variable 1 b))", "(+ (* (+ (variable 1 a) (variable 1 b)) (variable 1 b)) (+ (+ (variable 1 a) (variable 1 b)) (variable 1 b)))", 5);
-
-      TestMatchedNodes(
-        "(* (+ 2.84 (exp (+ (log (/ (variable 2.0539 X5) (variable -9.2452e-1 X6))) (/ (variable 2.0539 X5) (variable -9.2452e-1 X6))))) 2.9081)",
-        "(* (- (variable 9.581e-1 X6) (+ (- (variable 5.1491e-1 X5) 1.614e+1) (+ (/ (variable 2.0539 X5) (variable -9.2452e-1 X6)) (log (/ (variable 2.0539 X5) (variable -9.2452e-1 X6)))))) 2.9081)",
-        9);
-
-      TestMatchedNodes("(* (* (* (variable 1.68 x) (* (variable 1.68 x) (variable 2.55 x))) (variable 1.68 x)) (* (* (variable 1.68 x) (* (variable 1.68 x) (* (variable 1.68 x) (variable 2.55 x)))) (variable 2.55 x)))", "(* (variable 2.55 x) (* (variable 1.68 x) (* (variable 1.68 x) (* (variable 1.68 x) (variable 2.55 x)))))", 9);
-
-      TestMatchedNodes("(+ (exp 2.1033) (/ -4.3072 (variable 2.4691 X7)))", "(/ 1 (+ (/ -4.3072 (variable 2.4691 X7)) (exp 2.1033)))", 6);
-      TestMatchedNodes("(+ (exp 2.1033) (/ -4.3072 (variable 2.4691 X7)))", "(/ 1 (+ (/ (variable 2.4691 X7) -4.3072) (exp 2.1033)))", 4);
-
-      const string expr1 = "(* (- 1.2175e+1 (+ (/ (exp -1.4134e+1) (exp 9.2013)) (exp (log (exp (/ (exp (- (* -4.2461 (variable 2.2634 X5)) (- -9.6267e-1 3.3243))) (- (/ (/ (variable 1.0883 X1) (variable 6.9620e-1 X2)) (log 1.3011e+1)) (variable -4.3098e-1 X7)))))))) (log 1.3011e+1))";
-      const string expr2 = "(* (- 1.2175e+1 (+ (/ (/ (+ (variable 3.0140 X9) (variable 1.3430 X8)) -1.0864e+1) (exp 9.2013)) (exp (log (exp (/ (exp (- (* -4.2461 (variable 2.2634 X5)) (- -9.6267e-1 3.3243))) (- (/ (/ (variable 1.0883 X1) (variable 6.9620e-1 X2)) (log 1.3011e+1)) (variable -4.3098e-1 X7)))))))) (exp (variable 4.0899e-1 X7)))";
-
-      TestMatchedNodes(expr1, expr2, 23);
-
+      TestMatchedNodes("(- 2 1)", "(- 1 2)", 2, strict: true);
+      TestMatchedNodes("(- 2 1)", "(- 1 2)", 3, strict: false);
     }
 
-    private void TestMatchedNodes(string expr1, string expr2, int expected) {
+    private void TestMatchedNodes(string expr1, string expr2, int expected, bool strict) {
       var t1 = importer.Import(expr1);
       var t2 = importer.Import(expr2);
 
-      var mapping = busCalculator.ComputeBottomUpMapping(t1.Root, t2.Root);
-      var c = mapping.Count;
+      var map = SymbolicExpressionTreeBottomUpSimilarityCalculator.ComputeBottomUpMapping(t1, t2, strict);
 
-      if (c != expected) {
-        throw new Exception("Match count " + c + " is different than expected value " + expected);
+      if (map.Count != expected) {
+        throw new Exception($"Match count {map.Count} is different than expected value {expected} for expressions:\n{expr1} and {expr2} (strict = {strict})");
       }
     }
@@ -77,5 +61,5 @@
       for (int i = 0; i < trees.Length - 1; ++i) {
         for (int j = i + 1; j < trees.Length; ++j) {
-          s += busCalculator.CalculateSimilarity(trees[i], trees[j]);
+          s += similarityCalculator.CalculateSimilarity(trees[i], trees[j]);
         }
       }
