Index: branches/MathNetNumerics-Exploration-2789/HeuristicLab.Algorithms.DataAnalysis.Experimental/HeuristicLab.Algorithms.DataAnalysis.Experimental.csproj
===================================================================
--- branches/MathNetNumerics-Exploration-2789/HeuristicLab.Algorithms.DataAnalysis.Experimental/HeuristicLab.Algorithms.DataAnalysis.Experimental.csproj	(revision 15360)
+++ branches/MathNetNumerics-Exploration-2789/HeuristicLab.Algorithms.DataAnalysis.Experimental/HeuristicLab.Algorithms.DataAnalysis.Experimental.csproj	(revision 15362)
@@ -120,4 +120,7 @@
       <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Random-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="MathNet.Numerics, Version=3.20.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\MathNet.Numerics.3.20.0\lib\net40\MathNet.Numerics.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core" />
Index: branches/MathNetNumerics-Exploration-2789/HeuristicLab.Algorithms.DataAnalysis.Experimental/Splines.cs
===================================================================
--- branches/MathNetNumerics-Exploration-2789/HeuristicLab.Algorithms.DataAnalysis.Experimental/Splines.cs	(revision 15360)
+++ branches/MathNetNumerics-Exploration-2789/HeuristicLab.Algorithms.DataAnalysis.Experimental/Splines.cs	(revision 15362)
@@ -36,4 +36,5 @@
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
 using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
+using MathNet.Numerics.Interpolation;
 
 namespace HeuristicLab.Algorithms.DataAnalysis.Experimental {
@@ -59,5 +60,10 @@
       var validTypes = new ItemSet<StringValue>(
         new[] {
-        "Monotone", "Akima", "Catmull-Rom", "Cubic", "Linear"
+        "Monotone", "Akima", "Catmull-Rom", "Cubic", "Linear",
+          "Cubic - Natural (Math.NET)",
+          "Polynomial (Math.NET)",
+          "Rational (Math.NET)",
+          "LogLinear (Math.NET)",
+          "Common (Math.NET)",
       }.Select(s => new StringValue(s)));
 
@@ -83,20 +89,62 @@
         switch (type) {
           case "Monotone":
-            alglib.spline1dbuildmonotone(x, y, out c); break;
+            alglib.spline1dbuildmonotone(x, y, out c); 
+            AddAlglibSplineResult(c, inputVars);
+            break;
           case "Akima":
-            alglib.spline1dbuildakima(x, y, out c); break;
+            alglib.spline1dbuildakima(x, y, out c); AddAlglibSplineResult(c, inputVars);
+            break;
+            ;
           case "Catmull-Rom":
-            alglib.spline1dbuildcatmullrom(x, y, out c); break;
+            alglib.spline1dbuildcatmullrom(x, y, out c); AddAlglibSplineResult(c, inputVars);
+            break;
+
           case "Cubic":
-            alglib.spline1dbuildcubic(x, y, out c); break;
+            alglib.spline1dbuildcubic(x, y, out c); AddAlglibSplineResult(c, inputVars);
+            break;
+
           case "Linear":
-            alglib.spline1dbuildlinear(x, y, out c); break;
-
+            alglib.spline1dbuildlinear(x, y, out c); AddAlglibSplineResult(c, inputVars);
+            break;
+          case "Cubic - Natural (Math.NET)": {
+              var spline = MathNet.Numerics.Interpolation.CubicSpline.InterpolateNatural(x, y);
+              AddMathNetSplineResult(spline, inputVars);
+              break;
+            }
+          case "Common (Math.NET)": {
+              var spline = MathNet.Numerics.Interpolate.Common(x, y);
+              AddMathNetSplineResult(spline, inputVars);
+              break;
+            }
+          case "LogLinear (Math.NET)": {
+              var spline = MathNet.Numerics.Interpolate.LogLinear(x, y);
+              AddMathNetSplineResult(spline, inputVars);
+              break;
+            }
+          case "Polynomial (Math.NET)": {
+              var spline = MathNet.Numerics.Interpolate.Polynomial(x, y);
+              AddMathNetSplineResult(spline, inputVars);
+              break;
+            }
+          case "Rational (Math.NET)": {
+              var spline = MathNet.Numerics.Interpolate.RationalWithoutPoles(x, y);
+              AddMathNetSplineResult(spline, inputVars);
+              break;
+            }
           default: throw new NotSupportedException();
         }
 
-        Results.Add(new Result("Solution", new RegressionSolution(new Spline1dModel(c, Problem.ProblemData.TargetVariable, inputVars),
-          (IRegressionProblemData)Problem.ProblemData.Clone())));
       }
+    }
+
+    private void AddAlglibSplineResult(alglib.spline1dinterpolant c, string[] inputVars) {
+      Results.Add(new Result("Solution", new RegressionSolution(new Spline1dModel(c, Problem.ProblemData.TargetVariable, inputVars),
+        (IRegressionProblemData)Problem.ProblemData.Clone())));
+
+    }
+    private void AddMathNetSplineResult(IInterpolation c, string[] inputVars) {
+      Results.Add(new Result("Solution", new RegressionSolution(new MathNetSplineModel(c, Problem.ProblemData.TargetVariable, inputVars),
+        (IRegressionProblemData)Problem.ProblemData.Clone())));
+
     }
   }
@@ -138,3 +186,40 @@
     }
   }
+
+
+  // UNFINISHED
+  public class MathNetSplineModel : NamedItem, IRegressionModel {
+    private IInterpolation interpolant;
+
+    public string TargetVariable { get; set; }
+
+    public IEnumerable<string> VariablesUsedForPrediction { get; private set; }
+
+    public event EventHandler TargetVariableChanged;
+
+    public MathNetSplineModel(MathNetSplineModel orig, Cloner cloner) : base(orig, cloner) {
+      this.TargetVariable = orig.TargetVariable;
+      this.VariablesUsedForPrediction = orig.VariablesUsedForPrediction.ToArray();
+      this.interpolant = orig.interpolant; // TODO COPY!
+    }
+    public MathNetSplineModel(IInterpolation interpolant, string targetVar, string[] inputs) : base("SplineModel", "SplineModel") {
+      this.interpolant = interpolant;
+      this.TargetVariable = targetVar;
+      this.VariablesUsedForPrediction = inputs;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MathNetSplineModel(this, cloner);
+    }
+
+    public IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
+      return new RegressionSolution(this, (IRegressionProblemData)problemData.Clone());
+    }
+
+    public IEnumerable<double> GetEstimatedValues(IDataset dataset, IEnumerable<int> rows) {
+      foreach (var x in dataset.GetDoubleValues(VariablesUsedForPrediction.First(), rows)) {
+        yield return interpolant.Interpolate(x);
+      }
+    }
+  }
 }
Index: branches/MathNetNumerics-Exploration-2789/HeuristicLab.Algorithms.DataAnalysis.Experimental/packages.config
===================================================================
--- branches/MathNetNumerics-Exploration-2789/HeuristicLab.Algorithms.DataAnalysis.Experimental/packages.config	(revision 15360)
+++ branches/MathNetNumerics-Exploration-2789/HeuristicLab.Algorithms.DataAnalysis.Experimental/packages.config	(revision 15362)
@@ -4,3 +4,4 @@
   <package id="FSharp.Core" version="4.0.0.1" targetFramework="net46" />
   <package id="FSharp.Quotations.Evaluator" version="1.0.6" targetFramework="net46" />
+  <package id="MathNet.Numerics" version="3.20.0" targetFramework="net46" />
 </packages>
