Index: branches/2925_AutoDiffForDynamicalModels/HeuristicLab.Problems.DynamicalSystemsModelling/3.3/HeuristicLab.Problems.DynamicalSystemsModelling-3.3.csproj
===================================================================
--- branches/2925_AutoDiffForDynamicalModels/HeuristicLab.Problems.DynamicalSystemsModelling/3.3/HeuristicLab.Problems.DynamicalSystemsModelling-3.3.csproj	(revision 16663)
+++ branches/2925_AutoDiffForDynamicalModels/HeuristicLab.Problems.DynamicalSystemsModelling/3.3/HeuristicLab.Problems.DynamicalSystemsModelling-3.3.csproj	(revision 16664)
@@ -220,4 +220,8 @@
       <Private>False</Private>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis.Symbolic.Regression\3.4\HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.csproj">
+      <Project>{5AC82412-911B-4FA2-A013-EDC5E3F3FCC2}</Project>
+      <Name>HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis.Symbolic\3.4\HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj">
       <Project>{3D28463F-EC96-4D82-AFEE-38BE91A0CA00}</Project>
Index: branches/2925_AutoDiffForDynamicalModels/HeuristicLab.Problems.DynamicalSystemsModelling/3.3/Problem.cs
===================================================================
--- branches/2925_AutoDiffForDynamicalModels/HeuristicLab.Problems.DynamicalSystemsModelling/3.3/Problem.cs	(revision 16663)
+++ branches/2925_AutoDiffForDynamicalModels/HeuristicLab.Problems.DynamicalSystemsModelling/3.3/Problem.cs	(revision 16664)
@@ -39,4 +39,5 @@
 using Variable = HeuristicLab.Problems.DataAnalysis.Symbolic.Variable;
 using HEAL.Attic;
+using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
 
 namespace HeuristicLab.Problems.DynamicalSystemsModelling {
@@ -766,8 +767,23 @@
           simplifiedTreeVar.Value = TreeSimplifier.Simplify(tree);
           models.Add(simplifiedTreeVar);
-
         }
 
         results["Models"].Value = models;
+        #endregion
+
+        #region produce classical solutions to allow visualization with PDP
+        for (int treeIdx = 0; treeIdx < trees.Length; treeIdx++) {
+          var t = (ISymbolicExpressionTree)trees[treeIdx].Clone();
+          var name = targetVars.Concat(latentVariables).ElementAt(treeIdx); // whatever
+          var model = new SymbolicRegressionModel(name + "_diff", t, new SymbolicDataAnalysisExpressionTreeLinearInterpreter());
+          var solutionDataset = ((Dataset)problemData.Dataset).ToModifiable();
+          if (treeIdx < targetVars.Length) {
+            var absValues = solutionDataset.GetDoubleValues(name).ToArray();
+            solutionDataset.AddVariable(name + "_diff", absValues.Skip(1).Zip(absValues, (v1, v0) => v1 - v0).Concat(new double[] { 0.0 }).ToList());
+          }
+          var solutionProblemData = new RegressionProblemData(solutionDataset, problemData.AllowedInputVariables, name + "_diff");
+          var solution = model.CreateRegressionSolution(solutionProblemData);
+          results.AddOrUpdateResult("Solution " + name, solution);
+        }
         #endregion
       }
@@ -1333,4 +1349,15 @@
         var f = InterpretRec(node.GetSubtree(0), nodeValues);
         return Math.Log(f);
+      } else if (node.Symbol is HyperbolicTangent) {
+        Assert(node.SubtreeCount == 1);
+
+        var f = InterpretRec(node.GetSubtree(0), nodeValues);
+        return Math.Tanh(f);
+      } else if (node.Symbol is AnalyticQuotient) {
+        Assert(node.SubtreeCount == 2);
+
+        var f = InterpretRec(node.GetSubtree(0), nodeValues);
+        var g = InterpretRec(node.GetSubtree(1), nodeValues);
+        return f / Math.Sqrt(1 + g * g);
       } else throw new NotSupportedException("unsupported symbol");
     }
@@ -1440,4 +1467,16 @@
         z = Math.Log(f);
         dz = df.Scale(1.0 / f);
+      } else if (node.Symbol is HyperbolicTangent) {
+        Assert(node.SubtreeCount == 1);
+        InterpretRec(node.GetSubtree(0), nodeValues, out f, out df);
+        z = Math.Tanh(f);
+        dz = df.Scale(1 - z * z); // tanh(f(x))' = f(x)'sech²(f(x)) = f(x)'(1 - tanh²(f(x)))
+      } else if (node.Symbol is AnalyticQuotient) {
+        Assert(node.SubtreeCount == 2);
+        InterpretRec(node.GetSubtree(0), nodeValues, out f, out df);
+        InterpretRec(node.GetSubtree(0), nodeValues, out g, out dg);
+        z = f / Math.Sqrt(1 + g * g);
+        var denom = 1.0 / Math.Pow(1 + g * g, 1.5);
+        dz = df.Scale(1 + g * g).Subtract(dg.Scale(f * g)).Scale(denom);
       } else {
         throw new NotSupportedException("unsupported symbol");
@@ -1545,4 +1584,8 @@
       l.Add(new StringValue("Cosine").AsReadOnly());
       l.Add(new StringValue("Square").AsReadOnly());
+      l.Add(new StringValue("Logarithm").AsReadOnly());
+      l.Add(new StringValue("Exponential").AsReadOnly());
+      l.Add(new StringValue("HyperbolicTangent").AsReadOnly());
+      l.Add(new StringValue("AnalyticQuotient").AsReadOnly());
       return l.AsReadOnly();
     }
