Index: /trunk/sources/HeuristicLab.DataAnalysis/DatasetParser.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAnalysis/DatasetParser.cs	(revision 362)
+++ /trunk/sources/HeuristicLab.DataAnalysis/DatasetParser.cs	(revision 363)
@@ -35,4 +35,6 @@
     private const string TRAININGSAMPLESSTART = "TRAININGSAMPLESSTART";
     private const string TRAININGSAMPLESEND = "TRAININGSAMPLESEND";
+    private const string VALIDATIONSAMPLESSTART = "VALIDATIONSAMPLESSTART";
+    private const string VALIDATIONSAMPLESEND = "VALIDATIONSAMPLESEND";
     private Tokenizer tokenizer;
     private Dictionary<string, List<Token>> metadata;
@@ -121,4 +123,19 @@
         if(metadata.ContainsKey(TRAININGSAMPLESEND)) {
           return metadata[TRAININGSAMPLESEND][0].intValue;
+        } else return rows;
+      }
+    }
+    public int ValidationSamplesStart {
+      get {
+        if(metadata.ContainsKey(VALIDATIONSAMPLESSTART)) {
+          return metadata[VALIDATIONSAMPLESSTART][0].intValue;
+        } else return 0;
+      }
+    }
+
+    public int ValidationSamplesEnd {
+      get {
+        if(metadata.ContainsKey(VALIDATIONSAMPLESEND)) {
+          return metadata[VALIDATIONSAMPLESEND][0].intValue;
         } else return rows;
       }
Index: /trunk/sources/HeuristicLab.Functions/BakedFunctionTree.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/BakedFunctionTree.cs	(revision 362)
+++ /trunk/sources/HeuristicLab.Functions/BakedFunctionTree.cs	(revision 363)
@@ -262,13 +262,12 @@
     }
 
-    bool evaluatorReset = false;
-    public double Evaluate(Dataset dataset, int sampleIndex) {
+    public void PrepareEvaluation(Dataset dataset) {
       FlattenVariables();
       FlattenTrees();
-      if(!evaluatorReset) {
-        BakedTreeEvaluator.ResetEvaluator(linearRepresentation);
-        evaluatorReset = true;
-      }
-      return BakedTreeEvaluator.Evaluate(dataset, sampleIndex);
+      BakedTreeEvaluator.ResetEvaluator(dataset, linearRepresentation);
+    }
+
+    public double Evaluate(int sampleIndex) {
+      return BakedTreeEvaluator.Evaluate(sampleIndex);
     }
 
Index: /trunk/sources/HeuristicLab.Functions/BakedTreeEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/BakedTreeEvaluator.cs	(revision 362)
+++ /trunk/sources/HeuristicLab.Functions/BakedTreeEvaluator.cs	(revision 363)
@@ -53,6 +53,7 @@
     }
 
-    public static void ResetEvaluator(List<LightWeightFunction> linearRepresentation) {
+    public static void ResetEvaluator(Dataset dataset, List<LightWeightFunction> linearRepresentation) {
       int i = 0;
+      BakedTreeEvaluator.dataset = dataset;
       foreach(LightWeightFunction f in linearRepresentation) {
         TranslateToInstr(f, codeArr[i++]);
@@ -78,8 +79,7 @@
     }
 
-    internal static double Evaluate(Dataset dataset, int sampleIndex) {
+    internal static double Evaluate(int sampleIndex) {
       PC = 0;
       BakedTreeEvaluator.sampleIndex = sampleIndex;
-      BakedTreeEvaluator.dataset = dataset;
       return EvaluateBakedCode();
     }
Index: /trunk/sources/HeuristicLab.Functions/IFunctionTree.cs
===================================================================
--- /trunk/sources/HeuristicLab.Functions/IFunctionTree.cs	(revision 362)
+++ /trunk/sources/HeuristicLab.Functions/IFunctionTree.cs	(revision 363)
@@ -40,5 +40,6 @@
     void RemoveSubTree(int index);
 
-    double Evaluate(Dataset dataset, int sampleIndex);
+    void PrepareEvaluation(Dataset dataset);
+    double Evaluate(int sampleIndex);
   }
 }
Index: /trunk/sources/HeuristicLab.Logging/BestSolutionStorer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Logging/BestSolutionStorer.cs	(revision 363)
+++ /trunk/sources/HeuristicLab.Logging/BestSolutionStorer.cs	(revision 363)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Logging {
+  public class BestSolutionStorer : OperatorBase {
+    public override string Description {
+      get { return @"Keeps a variable in the global scope that contains the scope representing the best of run solution."; }
+    }
+
+    public BestSolutionStorer()
+      : base() {
+      AddVariableInfo(new VariableInfo("Quality", "Quality value of a solution", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Maximization", "Maximization problem", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("BestSolution", "The best solution of the run", typeof(IScope), VariableKind.New | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      double[] qualities = new double[scope.SubScopes.Count];
+
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        qualities[i] = scope.SubScopes[i].GetVariableValue<DoubleData>("Quality", false).Data;
+
+      double smallest = qualities[0]; int smallestIndex = 0;
+      double biggest = qualities[0]; int biggestIndex = 0;
+      for (int i = 1; i < qualities.Length; i++) {
+        if(qualities[i] < smallest) {
+          smallest = qualities[i];
+          smallestIndex = i;
+        }
+        if(qualities[i] > biggest) {
+          biggest = qualities[i];
+          biggestIndex = i;
+        }
+      }
+
+      if(!GetVariableValue<BoolData>("Maximization", scope, true).Data) {
+        SetValue(GetVariableInfo("BestSolution"), (IScope)scope.SubScopes[smallestIndex].Clone(), scope);
+      } else {
+        SetValue(GetVariableInfo("BestSolution"), (IScope)scope.SubScopes[biggestIndex].Clone(), scope);
+      }
+      return null;
+    }
+
+    private void SetValue(IVariableInfo info, IScope data, IScope scope) {
+      IVariable var = scope.GetVariable(info.FormalName);
+      if(var == null) {
+        var = new Variable(scope.TranslateName(info.FormalName), data);
+        scope.AddVariable(var);
+      } else {
+        var.Value = data;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Logging/HeuristicLab.Logging.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Logging/HeuristicLab.Logging.csproj	(revision 362)
+++ /trunk/sources/HeuristicLab.Logging/HeuristicLab.Logging.csproj	(revision 363)
@@ -46,4 +46,5 @@
   <ItemGroup>
     <Compile Include="BestAverageWorstQualityCalculator.cs" />
+    <Compile Include="BestSolutionStorer.cs" />
     <Compile Include="Logger.cs" />
     <Compile Include="Linechart.cs" />
Index: /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/CoefficientOfDeterminationEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/CoefficientOfDeterminationEvaluator.cs	(revision 362)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/CoefficientOfDeterminationEvaluator.cs	(revision 363)
@@ -47,6 +47,7 @@
       double originalDeviationTotalSumOfSquares = 0.0;
       double targetMean = dataset.GetMean(targetVariable);
+      functionTree.PrepareEvaluation(dataset);
       for(int sample = 0; sample < dataset.Rows; sample++) {
-        double estimated = functionTree.Evaluate(dataset, sample);
+        double estimated = functionTree.Evaluate(sample);
         double original = dataset.GetValue(sample, targetVariable);
         if(!double.IsNaN(original) && !double.IsInfinity(original)) {
Index: /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/EarlyStoppingMeanSquaredErrorEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/EarlyStoppingMeanSquaredErrorEvaluator.cs	(revision 362)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/EarlyStoppingMeanSquaredErrorEvaluator.cs	(revision 363)
@@ -60,6 +60,7 @@
       double errorsSquaredSum = 0;
       double targetMean = dataset.GetMean(targetVariable);
+      functionTree.PrepareEvaluation(dataset);
       for(int sample = trainingStart; sample < trainingEnd; sample++) {
-        double estimated = functionTree.Evaluate(dataset, sample);
+        double estimated = functionTree.Evaluate(sample);
         double original = dataset.GetValue(sample, targetVariable);
         if(double.IsNaN(estimated) || double.IsInfinity(estimated)) {
Index: /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/GPEvaluatorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/GPEvaluatorBase.cs	(revision 362)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/GPEvaluatorBase.cs	(revision 363)
@@ -57,5 +57,12 @@
       this.totalEvaluatedNodes = scope.GetVariableValue<DoubleData>("TotalEvaluatedNodes", true).Data;
       double result = Evaluate(scope, functionTree, targetVariable, dataset);
-      scope.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName("Quality"), new DoubleData(result)));
+
+      DoubleData quality = GetVariableValue<DoubleData>("Quality", scope, false, false);
+      if(quality == null) {
+        scope.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName("Quality"), new DoubleData(result)));
+      } else {
+        quality.Data = result;
+      }
+
       return null;
     }
Index: /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/MCCEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/MCCEvaluator.cs	(revision 362)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/MCCEvaluator.cs	(revision 363)
@@ -54,6 +54,7 @@
       double negative = 0;
       double targetMean = dataset.GetMean(targetVariable);
+      functionTree.PrepareEvaluation(dataset);
       for(int sample = 0; sample < dataset.Rows; sample++) {
-        double est = functionTree.Evaluate(dataset, sample);
+        double est = functionTree.Evaluate(sample);
         double orig = dataset.GetValue(sample, targetVariable);
         if(double.IsNaN(est) || double.IsInfinity(est)) {
Index: /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/MeanSquaredErrorEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/MeanSquaredErrorEvaluator.cs	(revision 362)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/MeanSquaredErrorEvaluator.cs	(revision 363)
@@ -60,6 +60,7 @@
       }
 
+      functionTree.PrepareEvaluation(dataset);
       for(int sample = trainingStart; sample < trainingEnd; sample++) {
-        double estimated = functionTree.Evaluate(dataset, sample);
+        double estimated = functionTree.Evaluate(sample);
         double original = dataset.GetValue(sample, targetVariable);
         if(double.IsNaN(estimated) || double.IsInfinity(estimated)) {
Index: /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/SimpleEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/SimpleEvaluator.cs	(revision 363)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/SimpleEvaluator.cs	(revision 363)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Functions;
+using HeuristicLab.DataAnalysis;
+
+namespace HeuristicLab.StructureIdentification {
+  public class SimpleEvaluator : OperatorBase {
+    protected int treeSize;
+    protected double totalEvaluatedNodes;
+
+    public SimpleEvaluator()
+      : base() {
+      AddVariableInfo(new VariableInfo("FunctionTree", "The function tree that should be evaluated", typeof(IFunctionTree), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TreeSize", "Size (number of nodes) of the tree to evaluate", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Dataset", "Dataset with all samples on which to apply the function", typeof(Dataset), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TargetVariable", "Index of the column of the dataset that holds the target variable", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TotalEvaluatedNodes", "Number of evaluated nodes", typeof(DoubleData), VariableKind.In | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("TrainingSamplesStart", "Start index of training samples in dataset", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("TrainingSamplesEnd", "End index of training samples in dataset", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Values", "The values of the target variable as predicted by the model and the original value of the target variable", typeof(ItemList), VariableKind.New | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      int targetVariable = GetVariableValue<IntData>("TargetVariable", scope, true).Data;
+      Dataset dataset = GetVariableValue<Dataset>("Dataset", scope, true);
+      IFunctionTree functionTree = GetVariableValue<IFunctionTree>("FunctionTree", scope, true);
+      this.treeSize = scope.GetVariableValue<IntData>("TreeSize", false).Data;
+      this.totalEvaluatedNodes = scope.GetVariableValue<DoubleData>("TotalEvaluatedNodes", true).Data;
+      int trainingStart = GetVariableValue<IntData>("TrainingSamplesStart", scope, true).Data;
+      int trainingEnd = GetVariableValue<IntData>("TrainingSamplesEnd", scope, true).Data;
+
+      ItemList values = GetVariableValue<ItemList>("Values", scope, false, false);
+      if(values == null) {
+        values = new ItemList();
+        IVariableInfo info = GetVariableInfo("Values");
+        if(info.Local)
+          AddVariable(new HeuristicLab.Core.Variable(info.ActualName, values));
+        else
+          scope.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName(info.FormalName), values));
+      }
+      values.Clear();
+      functionTree.PrepareEvaluation(dataset);
+      for(int sample = trainingStart; sample < trainingEnd; sample++) {
+        ItemList row = new ItemList();
+        row.Add(new DoubleData(functionTree.Evaluate(sample)));
+        row.Add(new DoubleData(dataset.GetValue(sample, targetVariable)));
+        values.Add(row);
+      }
+      scope.GetVariableValue<DoubleData>("TotalEvaluatedNodes", true).Data = totalEvaluatedNodes + treeSize * (trainingEnd - trainingStart);
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/VarianceAccountedForEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/VarianceAccountedForEvaluator.cs	(revision 362)
+++ /trunk/sources/HeuristicLab.StructureIdentification/Evaluation/VarianceAccountedForEvaluator.cs	(revision 363)
@@ -57,6 +57,7 @@
       double[] originalTargetVariableValues = new double[dataset.Rows];
       double targetMean = dataset.GetMean(targetVariable);
+      functionTree.PrepareEvaluation(dataset);
       for(int sample = 0; sample < dataset.Rows; sample++) {
-        double estimated = functionTree.Evaluate(dataset, sample);
+        double estimated = functionTree.Evaluate(sample);
         double original = dataset.GetValue(sample, targetVariable);
         if(!double.IsNaN(original) && !double.IsInfinity(original)) {
Index: /trunk/sources/HeuristicLab.StructureIdentification/HeuristicLab.StructureIdentification.csproj
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/HeuristicLab.StructureIdentification.csproj	(revision 362)
+++ /trunk/sources/HeuristicLab.StructureIdentification/HeuristicLab.StructureIdentification.csproj	(revision 363)
@@ -48,4 +48,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Evaluation\SimpleEvaluator.cs" />
     <Compile Include="ProbabilisticTreeCreator.cs" />
     <Compile Include="Evaluation\CoefficientOfDeterminationEvaluator.cs" />
Index: /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjector.cs	(revision 362)
+++ /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjector.cs	(revision 363)
@@ -41,4 +41,12 @@
       AddVariableInfo(new VariableInfo("TargetVariable", "TargetVariable", typeof(IntData), VariableKind.New));
       AddVariable(new Variable("TargetVariable", new IntData()));
+      AddVariableInfo(new VariableInfo("TrainingSamplesStart", "TrainingSamplesStart", typeof(IntData), VariableKind.New));
+      AddVariable(new Variable("TrainingSamplesStart", new IntData()));
+      AddVariableInfo(new VariableInfo("TrainingSamplesEnd", "TrainingSamplesEnd", typeof(IntData), VariableKind.New));
+      AddVariable(new Variable("TrainingSamplesEnd", new IntData()));
+      AddVariableInfo(new VariableInfo("ValidationSamplesStart", "ValidationSamplesStart", typeof(IntData), VariableKind.New));
+      AddVariable(new Variable("ValidationSamplesStart", new IntData()));
+      AddVariableInfo(new VariableInfo("ValidationSamplesEnd", "ValidationSamplesEnd", typeof(IntData), VariableKind.New));
+      AddVariable(new Variable("ValidationSamplesEnd", new IntData()));
     }
 
@@ -50,4 +58,8 @@
       scope.AddVariable(new Variable(scope.TranslateName("Dataset"), (IItem)GetVariable("Dataset").Value.Clone()));
       scope.AddVariable(new Variable(scope.TranslateName("TargetVariable"), (IItem)GetVariable("TargetVariable").Value.Clone()));
+      scope.AddVariable(new Variable(scope.TranslateName("TrainingSamplesStart"), (IItem)GetVariable("TrainingSamplesStart").Value.Clone()));
+      scope.AddVariable(new Variable(scope.TranslateName("TrainingSamplesEnd"), (IItem)GetVariable("TrainingSamplesEnd").Value.Clone()));
+      scope.AddVariable(new Variable(scope.TranslateName("ValidationSamplesStart"), (IItem)GetVariable("ValidationSamplesStart").Value.Clone()));
+      scope.AddVariable(new Variable(scope.TranslateName("ValidationSamplesEnd"), (IItem)GetVariable("ValidationSamplesEnd").Value.Clone()));
       return null;
     }
Index: /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.Designer.cs	(revision 362)
+++ /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.Designer.cs	(revision 363)
@@ -51,4 +51,6 @@
       this.variableInfosTabPage = new System.Windows.Forms.TabPage();
       this.operatorBaseVariableInfosView = new HeuristicLab.Core.OperatorBaseVariableInfosView();
+      this.tabPage1 = new System.Windows.Forms.TabPage();
+      this.operatorBaseVariablesView = new HeuristicLab.Core.OperatorBaseVariablesView();
       this.descriptionTabPage = new System.Windows.Forms.TabPage();
       this.operatorBaseDescriptionView = new HeuristicLab.Core.OperatorBaseDescriptionView();
@@ -57,4 +59,5 @@
       this.dataTabPage.SuspendLayout();
       this.variableInfosTabPage.SuspendLayout();
+      this.tabPage1.SuspendLayout();
       this.descriptionTabPage.SuspendLayout();
       this.SuspendLayout();
@@ -81,4 +84,5 @@
       this.tabControl.Controls.Add(this.dataTabPage);
       this.tabControl.Controls.Add(this.variableInfosTabPage);
+      this.tabControl.Controls.Add(this.tabPage1);
       this.tabControl.Controls.Add(this.descriptionTabPage);
       this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
@@ -122,4 +126,25 @@
       this.operatorBaseVariableInfosView.TabIndex = 0;
       // 
+      // tabPage1
+      // 
+      this.tabPage1.Controls.Add(this.operatorBaseVariablesView);
+      this.tabPage1.Location = new System.Drawing.Point(4, 22);
+      this.tabPage1.Name = "tabPage1";
+      this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPage1.Size = new System.Drawing.Size(499, 425);
+      this.tabPage1.TabIndex = 3;
+      this.tabPage1.Text = "Variables";
+      this.tabPage1.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseVariablesView
+      // 
+      this.operatorBaseVariablesView.Caption = "Operator";
+      this.operatorBaseVariablesView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseVariablesView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariablesView.Name = "operatorBaseVariablesView";
+      this.operatorBaseVariablesView.Operator = null;
+      this.operatorBaseVariablesView.Size = new System.Drawing.Size(493, 419);
+      this.operatorBaseVariablesView.TabIndex = 0;
+      // 
       // descriptionTabPage
       // 
@@ -143,12 +168,14 @@
       this.operatorBaseDescriptionView.TabIndex = 0;
       // 
-      // datasetView
+      // datasetView1
       // 
       this.datasetView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                   | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.datasetView.Caption = "View";
+      this.datasetView.Caption = "Editor";
+      this.datasetView.Dataset = null;
+      this.datasetView.Filename = null;
       this.datasetView.Location = new System.Drawing.Point(6, 33);
-      this.datasetView.Name = "datasetView";
+      this.datasetView.Name = "datasetView1";
       this.datasetView.Size = new System.Drawing.Size(487, 386);
       this.datasetView.TabIndex = 7;
@@ -164,4 +191,5 @@
       this.dataTabPage.ResumeLayout(false);
       this.variableInfosTabPage.ResumeLayout(false);
+      this.tabPage1.ResumeLayout(false);
       this.descriptionTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
@@ -179,4 +207,6 @@
     private System.Windows.Forms.TabPage descriptionTabPage;
     private HeuristicLab.Core.OperatorBaseDescriptionView operatorBaseDescriptionView;
+    private System.Windows.Forms.TabPage tabPage1;
+    private HeuristicLab.Core.OperatorBaseVariablesView operatorBaseVariablesView;
     private HeuristicLab.DataAnalysis.DatasetView datasetView;
   }
Index: /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.cs
===================================================================
--- /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.cs	(revision 362)
+++ /trunk/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.cs	(revision 363)
@@ -89,5 +89,5 @@
         if (success) {
           Dataset dataset = (Dataset)StructIdProblemInjector.GetVariable("Dataset").Value;
-          dataset.Rows = parser.TrainingSamplesEnd - parser.TrainingSamplesStart;
+          dataset.Rows = parser.Rows;
           dataset.Columns = parser.Columns;
           dataset.VariableNames = parser.VariableNames;
@@ -95,5 +95,8 @@
           dataset.Samples = new double[dataset.Rows * dataset.Columns];
           Array.Copy(parser.Samples, dataset.Samples, dataset.Columns * dataset.Rows);
-
+          ((IntData)StructIdProblemInjector.GetVariable("TrainingSamplesStart").Value).Data = parser.TrainingSamplesStart;
+          ((IntData)StructIdProblemInjector.GetVariable("TrainingSamplesEnd").Value).Data = parser.TrainingSamplesEnd;
+          ((IntData)StructIdProblemInjector.GetVariable("ValidationSamplesStart").Value).Data = parser.ValidationSamplesStart;
+          ((IntData)StructIdProblemInjector.GetVariable("ValidationSamplesEnd").Value).Data = parser.ValidationSamplesEnd;
           ((IntData)StructIdProblemInjector.GetVariable("TargetVariable").Value).Data = parser.TargetVariable;
           Refresh();
