Index: /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Compiler/LinearInstruction.cs
===================================================================
--- /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Compiler/LinearInstruction.cs	(revision 9775)
+++ /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Compiler/LinearInstruction.cs	(revision 9776)
@@ -26,4 +26,5 @@
     public double value;
     public byte childIndex;
+    public bool skip;
   }
 }
Index: /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeInterpreter.cs
===================================================================
--- /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeInterpreter.cs	(revision 9775)
+++ /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeInterpreter.cs	(revision 9776)
@@ -132,5 +132,5 @@
 
 
-    protected virtual double Evaluate(Dataset dataset, ref int row, InterpreterState state) {
+    public virtual double Evaluate(Dataset dataset, ref int row, InterpreterState state) {
       Instruction currentInstr = state.NextInstruction();
       switch (currentInstr.opCode) {
Index: /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeLinearInterpreter.cs
===================================================================
--- /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeLinearInterpreter.cs	(revision 9775)
+++ /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeLinearInterpreter.cs	(revision 9776)
@@ -37,4 +37,6 @@
     private const string EvaluatedSolutionsParameterName = "EvaluatedSolutions";
 
+    private SymbolicDataAnalysisExpressionTreeInterpreter interpreter;
+
     public override bool CanChangeName {
       get { return false; }
@@ -74,4 +76,5 @@
       SymbolicDataAnalysisExpressionTreeLinearInterpreter original, Cloner cloner)
       : base(original, cloner) {
+      interpreter = original.interpreter;
     }
 
@@ -84,4 +87,5 @@
       Parameters.Add(new ValueParameter<BoolValue>(CheckExpressionsWithIntervalArithmeticParameterName, "Switch that determines if the interpreter checks the validity of expressions with interval arithmetic before evaluating the expression.", new BoolValue(false)));
       Parameters.Add(new ValueParameter<IntValue>(EvaluatedSolutionsParameterName, "A counter for the total number of solutions the interpreter has evaluated", new IntValue(0)));
+      interpreter = new SymbolicDataAnalysisExpressionTreeInterpreter();
     }
 
@@ -90,4 +94,5 @@
       Parameters.Add(new ValueParameter<BoolValue>(CheckExpressionsWithIntervalArithmeticParameterName, "Switch that determines if the interpreter checks the validity of expressions with interval arithmetic before evaluating the expression.", new BoolValue(false)));
       Parameters.Add(new ValueParameter<IntValue>(EvaluatedSolutionsParameterName, "A counter for the total number of solutions the interpreter has evaluated", new IntValue(0)));
+      interpreter = new SymbolicDataAnalysisExpressionTreeInterpreter();
     }
 
@@ -96,4 +101,5 @@
       if (!Parameters.ContainsKey(EvaluatedSolutionsParameterName))
         Parameters.Add(new ValueParameter<IntValue>(EvaluatedSolutionsParameterName, "A counter for the total number of solutions the interpreter has evaluated", new IntValue(0)));
+      if (interpreter == null) interpreter = new SymbolicDataAnalysisExpressionTreeInterpreter();
     }
 
@@ -122,6 +128,23 @@
     }
 
+    private static LinearInstruction[] GetPrefixSequence(LinearInstruction[] code, int startIndex) {
+      var instr = code[startIndex];
+      var list = new List<LinearInstruction> { instr };
+      for (int i = 0; i != instr.nArguments; ++i) {
+        list.AddRange(GetPrefixSequence(code, instr.childIndex + i));
+      }
+      return list.ToArray();
+    }
+
     private static void PrepareInstructions(LinearInstruction[] code, Dataset dataset) {
-      for (int i = code.Length - 1; i >= 0; --i) {
+      Action<LinearInstruction> setSkip = null;
+      setSkip = instruction => {
+        instruction.skip = true;
+        for (int j = 0; j != instruction.nArguments; ++j) {
+          setSkip(code[instruction.childIndex + j]);
+        }
+      };
+
+      for (int i = 0; i != code.Length; ++i) {
         var instr = code[i];
         #region opcode switch
@@ -130,4 +153,5 @@
               var constTreeNode = (ConstantTreeNode)instr.dynamicNode;
               instr.value = constTreeNode.Value;
+              instr.skip = true; // the value is already set so this instruction should be skipped in the evaluation phase
             }
             break;
@@ -147,4 +171,12 @@
             }
             break;
+          case OpCodes.TimeLag:
+          case OpCodes.Integral:
+          case OpCodes.Derivative: {
+              for (int j = 0; j != instr.nArguments; ++j) {
+                setSkip(code[instr.childIndex + j]);
+              }
+            }
+            break;
         }
         #endregion
@@ -152,7 +184,7 @@
     }
 
-    private static double Evaluate(Dataset dataset, ref int row, LinearInstruction[] code) {
+    private double Evaluate(Dataset dataset, ref int row, LinearInstruction[] code) {
       for (int i = code.Length - 1; i >= 0; --i) {
-        if (code[i].opCode == OpCodes.Constant) continue;
+        if (code[i].skip) continue;
         #region opcode switch
         var instr = code[i];
@@ -304,5 +336,5 @@
               else {
                 alglib.sinecosineintegrals(x, out si, out ci);
-                instr.value = si;
+                instr.value = ci;
               }
             }
@@ -431,4 +463,14 @@
             }
             break;
+          case OpCodes.TimeLag:
+          case OpCodes.Integral:
+          case OpCodes.Derivative: {
+              if (instr.iArg0 == null) {
+                instr.iArg0 = GetPrefixSequence(code, i); ;
+              }
+              var interpreterState = new InterpreterState((LinearInstruction[])instr.iArg0, 0);
+              instr.value = interpreter.Evaluate(dataset, ref row, interpreterState);
+            }
+            break;
           default:
             var errorText = string.Format("The {0} symbol is not supported by the linear interpreter. To support this symbol, please use another interpreter.", instr.dynamicNode.Symbol.Name);
Index: /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/SymbolicDataAnalysisExpressionTreeInterpreterTest.cs
===================================================================
--- /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/SymbolicDataAnalysisExpressionTreeInterpreterTest.cs	(revision 9775)
+++ /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/SymbolicDataAnalysisExpressionTreeInterpreterTest.cs	(revision 9776)
@@ -173,5 +173,5 @@
     [TestMethod]
     public void SymbolicDataAnalysisExpressionTreeLinearInterpreterEvaluateTest() {
-      var interpreter = new SymbolicDataAnalysisExpressionTreeInterpreter();
+      var interpreter = new SymbolicDataAnalysisExpressionTreeLinearInterpreter();
       Dataset ds = new Dataset(new string[] { "Y", "A", "B" }, new double[,] {
         { 1.0, 1.0, 1.0 },
@@ -191,4 +191,5 @@
       EvaluateTerminals(interpreter, ds);
       EvaluateOperations(interpreter, ds);
+      EvaluateTimeSymbols(interpreter, ds);
     }
 
Index: /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/LinearInterpreter.sln
===================================================================
--- /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/LinearInterpreter.sln	(revision 9775)
+++ /branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/LinearInterpreter.sln	(revision 9776)
@@ -58,6 +58,3 @@
 		HideSolutionNode = FALSE
 	EndGlobalSection
-	GlobalSection(Performance) = preSolution
-		HasPerformanceSessions = true
-	EndGlobalSection
 EndGlobal
