Index: trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj	(revision 3702)
+++ trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj	(revision 3710)
@@ -87,8 +87,9 @@
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Symbolic\Analyzers\BestSymbolicRegressionSolutionAnalyzer.cs" />
-    <Compile Include="Symbolic\Analyzers\SymbolicRegressionMeanSquaredErrorCalculator.cs" />
     <Compile Include="Symbolic\Analyzers\ISymbolicRegressionAnalyzer.cs" />
     <Compile Include="Symbolic\Analyzers\SymbolicRegressionModelQualityAnalyzer.cs" />
-    <Compile Include="Symbolic\Analyzers\SymbolicRegressionModelQualityCalculator.cs" />
+    <Compile Include="Symbolic\Analyzers\SymbolicRegressionModelQualityCalculator.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="Symbolic\Analyzers\SymbolicRegressionSolutionLinearScaler.cs" />
     <Compile Include="Symbolic\Analyzers\SymbolicRegressionVariableFrequencyAnalyzer.cs" />
Index: trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/BestSymbolicRegressionSolutionAnalyzer.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/BestSymbolicRegressionSolutionAnalyzer.cs	(revision 3702)
+++ trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/BestSymbolicRegressionSolutionAnalyzer.cs	(revision 3710)
@@ -34,4 +34,5 @@
 using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols;
 using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Evaluators;
 
 namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers {
@@ -48,7 +49,12 @@
     private const string BestSolutionQualityParameterName = "BestSolutionQuality";
     private const string ResultsParameterName = "Results";
-
-    private const string BestSolutionResultName = "Best Solution (on validiation set)";
-    private const string BestSolutionInputvariableCountResultName = "Variables Used by Best Solution";
+    private const string BestSolutionResultName = "Best solution (on validiation set)";
+    private const string BestSolutionInputvariableCountResultName = "Variables used by best solution";
+    private const string BestSolutionTrainingRSquared = "Best solution R² (training)";
+    private const string BestSolutionTestRSquared = "Best solution R² (test)";
+    private const string BestSolutionTrainingMse = "Best solution mean squared error (training)";
+    private const string BestSolutionTestMse = "Best solution mean squared error (test)";
+    private const string BestSolutionTrainingRelativeError = "Best solution average relative error (training)";
+    private const string BestSolutionTestRelativeError = "Best solution average relative error (test)";
 
     public ScopeTreeLookupParameter<SymbolicExpressionTree> SymbolicExpressionTreeParameter {
@@ -112,4 +118,26 @@
         results.Add(new Result(BestSolutionResultName, solution));
         results.Add(new Result(BestSolutionInputvariableCountResultName, new IntValue(model.InputVariables.Count())));
+        #region calculate R2,MSE,Rel Error
+        double[] trainingValues = problemData.Dataset.GetVariableValues(
+          problemData.TargetVariable.Value,
+          problemData.TrainingSamplesStart.Value,
+          problemData.TrainingSamplesEnd.Value);
+        double[] testValues = problemData.Dataset.GetVariableValues(
+          problemData.TargetVariable.Value,
+          problemData.TestSamplesStart.Value,
+          problemData.TestSamplesEnd.Value);
+        double trainingR2 = SimpleRSquaredEvaluator.Calculate(trainingValues, solution.EstimatedTrainingValues);
+        double testR2 = SimpleRSquaredEvaluator.Calculate(testValues, solution.EstimatedTestValues);
+        double trainingMse = SimpleMSEEvaluator.Calculate(trainingValues, solution.EstimatedTrainingValues);
+        double testMse = SimpleMSEEvaluator.Calculate(testValues, solution.EstimatedTestValues);
+        double trainingRelError = SimpleMeanAbsolutePercentageErrorEvaluator.Calculate(trainingValues, solution.EstimatedTrainingValues);
+        double testRelError = SimpleMeanAbsolutePercentageErrorEvaluator.Calculate(testValues, solution.EstimatedTestValues);
+        results.Add(new Result(BestSolutionTrainingRSquared, new DoubleValue(trainingR2)));
+        results.Add(new Result(BestSolutionTestRSquared, new DoubleValue(testR2)));
+        results.Add(new Result(BestSolutionTrainingMse, new DoubleValue(trainingMse)));
+        results.Add(new Result(BestSolutionTestMse, new DoubleValue(testMse)));
+        results.Add(new Result(BestSolutionTrainingRelativeError, new DoubleValue(trainingRelError)));
+        results.Add(new Result(BestSolutionTestRelativeError, new DoubleValue(testRelError)));
+        #endregion
       } else {
         if (BestSolutionQualityParameter.ActualValue.Value > qualities[i].Value) {
@@ -120,4 +148,26 @@
           results[BestSolutionResultName].Value = solution;
           results[BestSolutionInputvariableCountResultName].Value = new IntValue(model.InputVariables.Count());
+          #region update R2,MSE, Rel Error
+          double[] trainingValues = problemData.Dataset.GetVariableValues(
+            problemData.TargetVariable.Value,
+            problemData.TrainingSamplesStart.Value,
+            problemData.TrainingSamplesEnd.Value);
+          double[] testValues = problemData.Dataset.GetVariableValues(
+            problemData.TargetVariable.Value,
+            problemData.TestSamplesStart.Value,
+            problemData.TestSamplesEnd.Value);
+          double trainingR2 = SimpleRSquaredEvaluator.Calculate(trainingValues, solution.EstimatedTrainingValues);
+          double testR2 = SimpleRSquaredEvaluator.Calculate(testValues, solution.EstimatedTestValues);
+          double trainingMse = SimpleMSEEvaluator.Calculate(trainingValues, solution.EstimatedTrainingValues);
+          double testMse = SimpleMSEEvaluator.Calculate(testValues, solution.EstimatedTestValues);
+          double trainingRelError = SimpleMeanAbsolutePercentageErrorEvaluator.Calculate(trainingValues, solution.EstimatedTrainingValues);
+          double testRelError = SimpleMeanAbsolutePercentageErrorEvaluator.Calculate(testValues, solution.EstimatedTestValues);
+          results[BestSolutionTrainingRSquared].Value = new DoubleValue(trainingR2);
+          results[BestSolutionTestRSquared].Value = new DoubleValue(testR2);
+          results[BestSolutionTrainingMse].Value = new DoubleValue(trainingMse);
+          results[BestSolutionTestMse].Value = new DoubleValue(testMse);
+          results[BestSolutionTrainingRelativeError].Value = new DoubleValue(trainingRelError);
+          results[BestSolutionTestRelativeError].Value = new DoubleValue(testRelError);
+          #endregion
         }
       }
Index: trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityAnalyzer.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityAnalyzer.cs	(revision 3702)
+++ trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityAnalyzer.cs	(revision 3710)
@@ -51,43 +51,43 @@
     private const string ResultsParameterName = "Results";
 
-    private const string TrainingMeanSquaredErrorQualityParameterName = "TrainingMeanSquaredError";
-    private const string MinTrainingMeanSquaredErrorQualityParameterName = "MinTrainingMeanSquaredError";
-    private const string MaxTrainingMeanSquaredErrorQualityParameterName = "MaxTrainingMeanSquaredError";
-    private const string AverageTrainingMeanSquaredErrorQualityParameterName = "AverageTrainingMeanSquaredError";
-    private const string BestTrainingMeanSquaredErrorQualityParameterName = "BestTrainingMeanSquaredError";
-
-    private const string TrainingAverageRelativeErrorQualityParameterName = "TrainingAverageRelativeError";
-    private const string MinTrainingAverageRelativeErrorQualityParameterName = "MinTrainingAverageRelativeError";
-    private const string MaxTrainingAverageRelativeErrorQualityParameterName = "MaxTrainingAverageRelativeError";
-    private const string AverageTrainingAverageRelativeErrorQualityParameterName = "AverageTrainingAverageRelativeError";
-    private const string BestTrainingAverageRelativeErrorQualityParameterName = "BestTrainingAverageRelativeError";
-
-    private const string TrainingRSquaredQualityParameterName = "TrainingRSquared";
-    private const string MinTrainingRSquaredQualityParameterName = "MinTrainingRSquared";
-    private const string MaxTrainingRSquaredQualityParameterName = "MaxTrainingRSquared";
-    private const string AverageTrainingRSquaredQualityParameterName = "AverageTrainingRSquared";
-    private const string BestTrainingRSquaredQualityParameterName = "BestTrainingRSquared";
-
-    private const string TestMeanSquaredErrorQualityParameterName = "TestMeanSquaredError";
-    private const string MinTestMeanSquaredErrorQualityParameterName = "MinTestMeanSquaredError";
-    private const string MaxTestMeanSquaredErrorQualityParameterName = "MaxTestMeanSquaredError";
-    private const string AverageTestMeanSquaredErrorQualityParameterName = "AverageTestMeanSquaredError";
-    private const string BestTestMeanSquaredErrorQualityParameterName = "BestTestMeanSquaredError";
-
-    private const string TestAverageRelativeErrorQualityParameterName = "TestAverageRelativeError";
-    private const string MinTestAverageRelativeErrorQualityParameterName = "MinTestAverageRelativeError";
-    private const string MaxTestAverageRelativeErrorQualityParameterName = "MaxTestAverageRelativeError";
-    private const string AverageTestAverageRelativeErrorQualityParameterName = "AverageTestAverageRelativeError";
-    private const string BestTestAverageRelativeErrorQualityParameterName = "BestTestAverageRelativeError";
-
-    private const string TestRSquaredQualityParameterName = "TestRSquared";
-    private const string MinTestRSquaredQualityParameterName = "MinTestRSquared";
-    private const string MaxTestRSquaredQualityParameterName = "MaxTestRSquared";
-    private const string AverageTestRSquaredQualityParameterName = "AverageTestRSquared";
-    private const string BestTestRSquaredQualityParameterName = "BestTestRSquared";
-
-    private const string RSquaredValuesParameterName = "R-squared Values";
-    private const string MeanSquaredErrorValuesParameterName = "Mean Squared Error Values";
-    private const string RelativeErrorValuesParameterName = "Average Relative Error Values";
+    private const string TrainingMeanSquaredErrorQualityParameterName = "Mean squared error (training)";
+    private const string MinTrainingMeanSquaredErrorQualityParameterName = "Min mean squared error (training)";
+    private const string MaxTrainingMeanSquaredErrorQualityParameterName = "Max mean squared error (training)";
+    private const string AverageTrainingMeanSquaredErrorQualityParameterName = "Average mean squared error (training)";
+    private const string BestTrainingMeanSquaredErrorQualityParameterName = "Best mean squared error (training)";
+
+    private const string TrainingAverageRelativeErrorQualityParameterName = "Average relative error (training)";
+    private const string MinTrainingAverageRelativeErrorQualityParameterName = "Min average relative error (training)";
+    private const string MaxTrainingAverageRelativeErrorQualityParameterName = "Max average relative error (training)";
+    private const string AverageTrainingAverageRelativeErrorQualityParameterName = "Average average relative error (training)";
+    private const string BestTrainingAverageRelativeErrorQualityParameterName = "Best average relative error (training)";
+
+    private const string TrainingRSquaredQualityParameterName = "R² (training)";
+    private const string MinTrainingRSquaredQualityParameterName = "Min R² (training)";
+    private const string MaxTrainingRSquaredQualityParameterName = "Max R² (training)";
+    private const string AverageTrainingRSquaredQualityParameterName = "Average R² (training)";
+    private const string BestTrainingRSquaredQualityParameterName = "Best R² (training)";
+
+    private const string TestMeanSquaredErrorQualityParameterName = "Mean squared error (test)";
+    private const string MinTestMeanSquaredErrorQualityParameterName = "Min mean squared error (test)";
+    private const string MaxTestMeanSquaredErrorQualityParameterName = "Max mean squared error (test)";
+    private const string AverageTestMeanSquaredErrorQualityParameterName = "Average mean squared error (test)";
+    private const string BestTestMeanSquaredErrorQualityParameterName = "Best mean squared error (test)";
+
+    private const string TestAverageRelativeErrorQualityParameterName = "Average relative error (test)";
+    private const string MinTestAverageRelativeErrorQualityParameterName = "Min average relative error (test)";
+    private const string MaxTestAverageRelativeErrorQualityParameterName = "Max average relative error (test)";
+    private const string AverageTestAverageRelativeErrorQualityParameterName = "Average average relative error (test)";
+    private const string BestTestAverageRelativeErrorQualityParameterName = "Best average relative error (test)";
+
+    private const string TestRSquaredQualityParameterName = "R² (test)";
+    private const string MinTestRSquaredQualityParameterName = "Min R² (test)";
+    private const string MaxTestRSquaredQualityParameterName = "Max R² (test)";
+    private const string AverageTestRSquaredQualityParameterName = "Average R² (test)";
+    private const string BestTestRSquaredQualityParameterName = "Best R² (test)";
+
+    private const string RSquaredValuesParameterName = "R²";
+    private const string MeanSquaredErrorValuesParameterName = "Mean squared error";
+    private const string RelativeErrorValuesParameterName = "Average relative error";
 
     private const string TrainingSamplesStartParameterName = "TrainingSamplesStart";
@@ -132,7 +132,5 @@
 
     [Storable]
-    private SymbolicRegressionModelQualityCalculator trainingQualityCalculator;
-    [Storable]
-    private SymbolicRegressionModelQualityCalculator testQualityCalculator;
+    private UniformSubScopesProcessor subScopesProcessor;
     [Storable]
     private MinAverageMaxValueAnalyzer minAvgMaxTrainingMseAnalyzer;
@@ -165,6 +163,7 @@
 
       #region operator initialization
-      trainingQualityCalculator = new SymbolicRegressionModelQualityCalculator();
-      testQualityCalculator = new SymbolicRegressionModelQualityCalculator();
+      subScopesProcessor = new UniformSubScopesProcessor();
+      SymbolicRegressionModelQualityCalculator trainingQualityCalculator = new SymbolicRegressionModelQualityCalculator();
+      SymbolicRegressionModelQualityCalculator testQualityCalculator = new SymbolicRegressionModelQualityCalculator();
       minAvgMaxTrainingMseAnalyzer = new MinAverageMaxValueAnalyzer();
       minAvgMaxTestMseAnalyzer = new MinAverageMaxValueAnalyzer();
@@ -178,4 +177,5 @@
 
       #region parameter wiring
+      subScopesProcessor.Depth.Value = SymbolicExpressionTreeParameter.Depth;
       trainingQualityCalculator.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
       trainingQualityCalculator.ProblemDataParameter.ActualName = ProblemDataParameter.Name;
@@ -184,5 +184,4 @@
       trainingQualityCalculator.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
       trainingQualityCalculator.SymbolicExpressionTreeParameter.ActualName = SymbolicExpressionTreeParameter.Name;
-      trainingQualityCalculator.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
       trainingQualityCalculator.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
       trainingQualityCalculator.AverageRelativeErrorQualityParameter.ActualName = TrainingAverageRelativeErrorQualityParameterName;
@@ -196,5 +195,4 @@
       testQualityCalculator.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
       testQualityCalculator.SymbolicExpressionTreeParameter.ActualName = SymbolicExpressionTreeParameter.Name;
-      testQualityCalculator.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
       testQualityCalculator.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
       testQualityCalculator.AverageRelativeErrorQualityParameter.ActualName = TestAverageRelativeErrorQualityParameterName;
@@ -209,4 +207,7 @@
       minAvgMaxTrainingMseAnalyzer.ValuesParameter.ActualName = MeanSquaredErrorValuesParameterName;
       minAvgMaxTrainingMseAnalyzer.ResultsParameter.ActualName = ResultsParameter.Name;
+      minAvgMaxTrainingMseAnalyzer.CollectMinValueInResultsParameter.Value = new BoolValue(false);
+      minAvgMaxTrainingMseAnalyzer.CollectAverageValueInResultsParameter.Value = new BoolValue(false);
+      minAvgMaxTrainingMseAnalyzer.CollectMaxValueInResultsParameter.Value = new BoolValue(false);
 
       minAvgMaxTestMseAnalyzer.ValueParameter.ActualName = TestMeanSquaredErrorQualityParameterName;
@@ -217,4 +218,8 @@
       minAvgMaxTestMseAnalyzer.ValuesParameter.ActualName = MeanSquaredErrorValuesParameterName;
       minAvgMaxTestMseAnalyzer.ResultsParameter.ActualName = ResultsParameter.Name;
+      minAvgMaxTestMseAnalyzer.CollectMinValueInResultsParameter.Value = new BoolValue(false);
+      minAvgMaxTestMseAnalyzer.CollectAverageValueInResultsParameter.Value = new BoolValue(false);
+      minAvgMaxTestMseAnalyzer.CollectMaxValueInResultsParameter.Value = new BoolValue(false);
+
       #endregion
       #region training/test R²
@@ -226,4 +231,8 @@
       minAvgMaxTrainingRSquaredAnalyzer.ValuesParameter.ActualName = RSquaredValuesParameterName;
       minAvgMaxTrainingRSquaredAnalyzer.ResultsParameter.ActualName = ResultsParameter.Name;
+      minAvgMaxTrainingRSquaredAnalyzer.CollectMinValueInResultsParameter.Value = new BoolValue(false);
+      minAvgMaxTrainingRSquaredAnalyzer.CollectAverageValueInResultsParameter.Value = new BoolValue(false);
+      minAvgMaxTrainingRSquaredAnalyzer.CollectMaxValueInResultsParameter.Value = new BoolValue(false);
+
 
       minAvgMaxTestRSquaredAnalyzer.ValueParameter.ActualName = TestRSquaredQualityParameterName;
@@ -234,4 +243,8 @@
       minAvgMaxTestRSquaredAnalyzer.ValuesParameter.ActualName = RSquaredValuesParameterName;
       minAvgMaxTestRSquaredAnalyzer.ResultsParameter.ActualName = ResultsParameter.Name;
+      minAvgMaxTestRSquaredAnalyzer.CollectMinValueInResultsParameter.Value = new BoolValue(false);
+      minAvgMaxTestRSquaredAnalyzer.CollectAverageValueInResultsParameter.Value = new BoolValue(false);
+      minAvgMaxTestRSquaredAnalyzer.CollectMaxValueInResultsParameter.Value = new BoolValue(false);
+
       #endregion
       #region training/test avg. rel. error
@@ -243,4 +256,7 @@
       minAvgMaxTrainingRelErrorAnalyzer.ValuesParameter.ActualName = RelativeErrorValuesParameterName;
       minAvgMaxTrainingRelErrorAnalyzer.ResultsParameter.ActualName = ResultsParameter.Name;
+      minAvgMaxTrainingRelErrorAnalyzer.CollectMinValueInResultsParameter.Value = new BoolValue(false);
+      minAvgMaxTrainingRelErrorAnalyzer.CollectAverageValueInResultsParameter.Value = new BoolValue(false);
+      minAvgMaxTrainingRelErrorAnalyzer.CollectMaxValueInResultsParameter.Value = new BoolValue(false);
 
       minAvgMaxTestRelErrorAnalyzer.ValueParameter.ActualName = TestAverageRelativeErrorQualityParameterName;
@@ -251,11 +267,16 @@
       minAvgMaxTestRelErrorAnalyzer.ValuesParameter.ActualName = RelativeErrorValuesParameterName;
       minAvgMaxTestRelErrorAnalyzer.ResultsParameter.ActualName = ResultsParameter.Name;
+      minAvgMaxTestRelErrorAnalyzer.CollectMinValueInResultsParameter.Value = new BoolValue(false);
+      minAvgMaxTestRelErrorAnalyzer.CollectAverageValueInResultsParameter.Value = new BoolValue(false);
+      minAvgMaxTestRelErrorAnalyzer.CollectMaxValueInResultsParameter.Value = new BoolValue(false);
       #endregion
       #endregion
 
       #region operator graph
-      OperatorGraph.InitialOperator = trainingQualityCalculator;
+      OperatorGraph.InitialOperator = subScopesProcessor;
+      subScopesProcessor.Operator = trainingQualityCalculator;
       trainingQualityCalculator.Successor = testQualityCalculator;
-      testQualityCalculator.Successor = minAvgMaxTrainingMseAnalyzer;
+      testQualityCalculator.Successor = null;
+      subScopesProcessor.Successor = minAvgMaxTrainingMseAnalyzer;
       minAvgMaxTrainingMseAnalyzer.Successor = minAvgMaxTestMseAnalyzer;
       minAvgMaxTestMseAnalyzer.Successor = minAvgMaxTrainingRSquaredAnalyzer;
@@ -284,6 +305,5 @@
 
     private void SymbolicExpressionTreeParameter_DepthChanged(object sender, EventArgs e) {
-      trainingQualityCalculator.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
-      testQualityCalculator.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
+      subScopesProcessor.Depth.Value = SymbolicExpressionTreeParameter.Depth;
       minAvgMaxTrainingMseAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
       minAvgMaxTrainingRelErrorAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
Index: trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityCalculator.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityCalculator.cs	(revision 3702)
+++ trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityCalculator.cs	(revision 3710)
@@ -57,6 +57,6 @@
 
     #region parameter properties
-    public ScopeTreeLookupParameter<SymbolicExpressionTree> SymbolicExpressionTreeParameter {
-      get { return (ScopeTreeLookupParameter<SymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
+    public ILookupParameter<SymbolicExpressionTree> SymbolicExpressionTreeParameter {
+      get { return (ILookupParameter<SymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
     }
     public IValueLookupParameter<ISymbolicExpressionTreeInterpreter> SymbolicExpressionTreeInterpreterParameter {
@@ -91,6 +91,6 @@
     public SymbolicRegressionModelQualityCalculator()
       : base() {
+      Parameters.Add(new LookupParameter<SymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression tree to analyze."));
       Parameters.Add(new ValueLookupParameter<ISymbolicExpressionTreeInterpreter>(SymbolicExpressionTreeInterpreterParameterName, "The interpreter that should be used to calculate the output values of the symbolic expression tree."));
-      Parameters.Add(new ScopeTreeLookupParameter<SymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression tree to analyze."));
       Parameters.Add(new ValueLookupParameter<DataAnalysisProblemData>(ProblemDataParameterName, "The problem data containing the input varaibles for the symbolic regression problem."));
       Parameters.Add(new ValueLookupParameter<IntValue>(SamplesStartParameterName, "The first index of the data set partition on which the model quality values should be calculated."));
@@ -102,4 +102,5 @@
       Parameters.Add(new ValueLookupParameter<DoubleValue>(RSQuaredQualityParameterName, "The R² correlation coefficient of the output of the model and the original target values."));
       Parameters.Add(new ValueLookupParameter<DoubleValue>(RelativeErrorQualityParameterName, "The average relative percentage error of the output of the model."));
+      
       #region operator initialization
       SimpleSymbolicRegressionEvaluator simpleEvaluator = new SimpleSymbolicRegressionEvaluator();
@@ -143,26 +144,4 @@
 
     }
-
-    // need to create custom operations for each solution scope (this has to be adapted on basis of the depth value of SymbolicExpressionTreeParameter)
-    public override IOperation Apply() {
-      var scopes = GetScopesOnLevel(ExecutionContext.Scope, SymbolicExpressionTreeParameter.Depth);
-      OperationCollection operations = new OperationCollection();
-      foreach (IScope treeScopes in scopes) {
-        operations.Add(ExecutionContext.CreateChildOperation(OperatorGraph.InitialOperator, treeScopes));
-      }
-      if (Successor != null) operations.Add(ExecutionContext.CreateOperation(Successor));
-      return operations;
-    }
-
-    private IEnumerable<IScope> GetScopesOnLevel(IScope scope, int d) {
-      if (d == 0) yield return scope;
-      else {
-        foreach (IScope subScope in scope.SubScopes) {
-          foreach (IScope scopesOfSubScope in GetScopesOnLevel(subScope, d - 1)) {
-            yield return scopesOfSubScope;
-          }
-        }
-      }
-    }
   }
 }
Index: trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionSolutionLinearScaler.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionSolutionLinearScaler.cs	(revision 3702)
+++ trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionSolutionLinearScaler.cs	(revision 3710)
@@ -47,44 +47,40 @@
     private const string BetaParameterName = "Beta";
 
-    public ScopeTreeLookupParameter<SymbolicExpressionTree> SymbolicExpressionTreeParameter {
-      get { return (ScopeTreeLookupParameter<SymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
+    public ILookupParameter<SymbolicExpressionTree> SymbolicExpressionTreeParameter {
+      get { return (ILookupParameter<SymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
     }
-    public ScopeTreeLookupParameter<SymbolicExpressionTree> ScaledSymbolicExpressionTreeParameter {
-      get { return (ScopeTreeLookupParameter<SymbolicExpressionTree>)Parameters[ScaledSymbolicExpressionTreeParameterName]; }
+    public ILookupParameter<SymbolicExpressionTree> ScaledSymbolicExpressionTreeParameter {
+      get { return (ILookupParameter<SymbolicExpressionTree>)Parameters[ScaledSymbolicExpressionTreeParameterName]; }
     }
-    public ScopeTreeLookupParameter<DoubleValue> AlphaParameter {
-      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters[AlphaParameterName]; }
+    public ILookupParameter<DoubleValue> AlphaParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[AlphaParameterName]; }
     }
-    public ScopeTreeLookupParameter<DoubleValue> BetaParameter {
-      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters[BetaParameterName]; }
+    public ILookupParameter<DoubleValue> BetaParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[BetaParameterName]; }
     }
 
     public SymbolicRegressionSolutionLinearScaler()
       : base() {
-      Parameters.Add(new ScopeTreeLookupParameter<SymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression trees to transform."));
-      Parameters.Add(new ScopeTreeLookupParameter<SymbolicExpressionTree>(ScaledSymbolicExpressionTreeParameterName, "The resulting symbolic expression trees after transformation."));
-      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>(AlphaParameterName, "Alpha parameter for linear transformation."));
-      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>(BetaParameterName, "Beta parameter for linear transformation."));
+      Parameters.Add(new LookupParameter<SymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression trees to transform."));
+      Parameters.Add(new LookupParameter<SymbolicExpressionTree>(ScaledSymbolicExpressionTreeParameterName, "The resulting symbolic expression trees after transformation."));
+      Parameters.Add(new LookupParameter<DoubleValue>(AlphaParameterName, "Alpha parameter for linear transformation."));
+      Parameters.Add(new LookupParameter<DoubleValue>(BetaParameterName, "Beta parameter for linear transformation."));
     }
 
     public override IOperation Apply() {
-      ItemArray<SymbolicExpressionTree> trees = SymbolicExpressionTreeParameter.ActualValue;
-      ItemArray<DoubleValue> alphas = AlphaParameter.ActualValue;
-      ItemArray<DoubleValue> betas = BetaParameter.ActualValue;
-      ItemArray<SymbolicExpressionTree> scaledTrees = new ItemArray<SymbolicExpressionTree>(trees.Length);
-      for (int i = 0; i < trees.Length; i++) {
-        var mainBranch = trees[i].Root.SubTrees[0].SubTrees[0];
-        var scaledMainBranch = MakeSum(MakeProduct(betas[i].Value, mainBranch), alphas[i].Value);
+      SymbolicExpressionTree tree = SymbolicExpressionTreeParameter.ActualValue;
+      DoubleValue alpha = AlphaParameter.ActualValue;
+      DoubleValue beta = BetaParameter.ActualValue;
+      var mainBranch = tree.Root.SubTrees[0].SubTrees[0];
+      var scaledMainBranch = MakeSum(MakeProduct(beta.Value, mainBranch), alpha.Value);
 
-        // remove the main branch before cloning to prevent cloning of sub-trees
-        trees[i].Root.SubTrees[0].RemoveSubTree(0);
-        var scaledTree = (SymbolicExpressionTree)trees[i].Clone();
-        // insert main branch into the original tree again 
-        trees[i].Root.SubTrees[0].InsertSubTree(0, mainBranch);
-        // insert the scaled main branch into the cloned tree
-        scaledTree.Root.SubTrees[0].InsertSubTree(0, scaledMainBranch);
-        scaledTrees[i] = scaledTree;
-      }
-      ScaledSymbolicExpressionTreeParameter.ActualValue = scaledTrees;
+      // remove the main branch before cloning to prevent cloning of sub-trees
+      tree.Root.SubTrees[0].RemoveSubTree(0);
+      var scaledTree = (SymbolicExpressionTree)tree.Clone();
+      // insert main branch into the original tree again 
+      tree.Root.SubTrees[0].InsertSubTree(0, mainBranch);
+      // insert the scaled main branch into the cloned tree
+      scaledTree.Root.SubTrees[0].InsertSubTree(0, scaledMainBranch);
+      ScaledSymbolicExpressionTreeParameter.ActualValue = scaledTree;
       return base.Apply();
     }
Index: trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/ValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/ValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs	(revision 3702)
+++ trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/ValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs	(revision 3710)
@@ -56,6 +56,7 @@
     private const string AlphaParameterName = "Alpha";
     private const string BetaParameterName = "Beta";
-    private const string BestSolutionParameterName = "ValidationBestSolution";
-    private const string BestSolutionQualityParameterName = "ValidationBestSolutionQuality";
+    private const string BestSolutionParameterName = "Best solution (validation)";
+    private const string BestSolutionQualityParameterName = "Best solution quality (validation)";
+    private const string CurrentBestValidationQualityParameterName = "Current best validation quality";
     private const string ResultsParameterName = "Results";
 
@@ -91,12 +92,10 @@
     }
 
-    [Storable]
-    private BestQualityMemorizer validationQualityMemorizer;
     [Storable]
     private BestSymbolicRegressionSolutionAnalyzer bestSolutionAnalyzer;
     [Storable]
-    private SymbolicRegressionSolutionLinearScaler linearScaler;
+    private UniformSubScopesProcessor subScopesProcessor;
     [Storable]
-    private SymbolicRegressionMeanSquaredErrorCalculator validationMseCalculator;
+    private BestAverageWorstQualityCalculator bestAvgWorstValidationQualityCalculator;
 
     public ValidationBestScaledSymbolicRegressionSolutionAnalyzer()
@@ -114,9 +113,9 @@
 
       #region operator initialization
-      linearScaler = new SymbolicRegressionSolutionLinearScaler();
-      validationMseCalculator = new SymbolicRegressionMeanSquaredErrorCalculator();
+      subScopesProcessor = new UniformSubScopesProcessor();
+      SymbolicRegressionSolutionLinearScaler linearScaler = new SymbolicRegressionSolutionLinearScaler();
+      SymbolicRegressionMeanSquaredErrorEvaluator validationMseEvaluator = new SymbolicRegressionMeanSquaredErrorEvaluator();
       bestSolutionAnalyzer = new BestSymbolicRegressionSolutionAnalyzer();
-      validationQualityMemorizer = new BestQualityMemorizer();
-      BestAverageWorstQualityCalculator bestAvgWorstValidationQualityCalculator = new BestAverageWorstQualityCalculator();
+       bestAvgWorstValidationQualityCalculator = new BestAverageWorstQualityCalculator();
       DataTableValuesCollector validationValuesCollector = new DataTableValuesCollector();
       ResultsCollector resultsCollector = new ResultsCollector();
@@ -124,22 +123,19 @@
 
       #region parameter wiring
+      subScopesProcessor.Depth.Value = SymbolicExpressionTreeParameter.Depth;
+
       linearScaler.AlphaParameter.ActualName = AlphaParameterName;
-      linearScaler.AlphaParameter.Depth = SymbolicExpressionTreeParameter.Depth;
       linearScaler.BetaParameter.ActualName = BetaParameterName;
-      linearScaler.BetaParameter.Depth = SymbolicExpressionTreeParameter.Depth;
       linearScaler.SymbolicExpressionTreeParameter.ActualName = SymbolicExpressionTreeParameter.Name;
-      linearScaler.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
       linearScaler.ScaledSymbolicExpressionTreeParameter.ActualName = ScaledSymbolicExpressionTreeParameterName;
-      linearScaler.ScaledSymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
-
-      validationMseCalculator.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
-      validationMseCalculator.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
-      validationMseCalculator.SymbolicExpressionTreeParameter.ActualName = ScaledSymbolicExpressionTreeParameterName;
-      validationMseCalculator.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
-      validationMseCalculator.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
-      validationMseCalculator.QualityParameter.ActualName = QualityParameterName;
-      validationMseCalculator.ProblemDataParameter.ActualName = ProblemDataParameter.Name;
-      validationMseCalculator.SamplesStartParameter.ActualName = SamplesStartParameter.Name;
-      validationMseCalculator.SamplesEndParameter.ActualName = SamplesEndParameter.Name;
+
+      validationMseEvaluator.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
+      validationMseEvaluator.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
+      validationMseEvaluator.SymbolicExpressionTreeParameter.ActualName = ScaledSymbolicExpressionTreeParameterName;
+      validationMseEvaluator.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
+      validationMseEvaluator.QualityParameter.ActualName = QualityParameterName;
+      validationMseEvaluator.RegressionProblemDataParameter.ActualName = ProblemDataParameter.Name;
+      validationMseEvaluator.SamplesStartParameter.ActualName = SamplesStartParameter.Name;
+      validationMseEvaluator.SamplesEndParameter.ActualName = SamplesEndParameter.Name;
 
       bestSolutionAnalyzer.BestSolutionParameter.ActualName = BestSolutionParameter.Name;
@@ -154,31 +150,29 @@
       bestSolutionAnalyzer.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
 
-      bestAvgWorstValidationQualityCalculator.AverageQualityParameter.ActualName = "Current Average Validation Quality";
-      bestAvgWorstValidationQualityCalculator.BestQualityParameter.ActualName = "Current Best Validation Quality";
+      bestAvgWorstValidationQualityCalculator.AverageQualityParameter.ActualName = "Current average validation quality";
+      bestAvgWorstValidationQualityCalculator.BestQualityParameter.ActualName = CurrentBestValidationQualityParameterName;
       bestAvgWorstValidationQualityCalculator.MaximizationParameter.Value = new BoolValue(false);
       bestAvgWorstValidationQualityCalculator.QualityParameter.ActualName = QualityParameterName;
-      bestAvgWorstValidationQualityCalculator.WorstQualityParameter.ActualName = "Current Worst Validation Quality";
-
-      validationQualityMemorizer.BestQualityParameter.ActualName = "Best Validation Quality";
-      validationQualityMemorizer.QualityParameter.ActualName = QualityParameterName;
-      validationQualityMemorizer.QualityParameter.Depth = SymbolicExpressionTreeParameter.Depth;
-
-      validationValuesCollector.DataTableParameter.ActualName = "Validation Qualities";
-      validationValuesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best Validation Quality", null, "Current Best Validation Quality"));
-      validationValuesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Validation Quality", null, "Best Validation Quality"));
-
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best Validation Quality", null, "Current Best Validation Quality"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Validation Quality", null, "Best Validation Quality"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>("Validation Qualities"));
+      bestAvgWorstValidationQualityCalculator.QualityParameter.Depth = SymbolicExpressionTreeParameter.Depth;
+      bestAvgWorstValidationQualityCalculator.WorstQualityParameter.ActualName = "Current worst validation quality";
+
+      validationValuesCollector.DataTableParameter.ActualName = "Validation quality";
+      validationValuesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(CurrentBestValidationQualityParameterName, null, CurrentBestValidationQualityParameterName));
+      validationValuesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(BestSolutionQualityParameter.Name, null, BestSolutionQualityParameter.Name));
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(CurrentBestValidationQualityParameterName, null, CurrentBestValidationQualityParameterName));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(BestSolutionQualityParameter.Name, null, BestSolutionQualityParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>("Validation quality"));
       resultsCollector.ResultsParameter.ActualName = ResultsParameter.Name;
       #endregion
 
       #region operator graph
-      OperatorGraph.InitialOperator = linearScaler;
-      linearScaler.Successor = validationMseCalculator;
-      validationMseCalculator.Successor = bestSolutionAnalyzer;
+      OperatorGraph.InitialOperator = subScopesProcessor;
+      subScopesProcessor.Operator = linearScaler;
+      linearScaler.Successor = validationMseEvaluator;
+      validationMseEvaluator.Successor = null;
+      subScopesProcessor.Successor = bestSolutionAnalyzer;
       bestSolutionAnalyzer.Successor = bestAvgWorstValidationQualityCalculator;
-      bestAvgWorstValidationQualityCalculator.Successor = validationQualityMemorizer;
-      validationQualityMemorizer.Successor = validationValuesCollector;
+      bestAvgWorstValidationQualityCalculator.Successor = validationValuesCollector;
       validationValuesCollector.Successor = resultsCollector;
       resultsCollector.Successor = null;
@@ -203,12 +197,8 @@
 
     private void SymbolicExpressionTreeParameter_DepthChanged(object sender, EventArgs e) {
-      validationMseCalculator.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
-      validationQualityMemorizer.QualityParameter.Depth = SymbolicExpressionTreeParameter.Depth;
+      subScopesProcessor.Depth.Value = SymbolicExpressionTreeParameter.Depth;
       bestSolutionAnalyzer.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
       bestSolutionAnalyzer.QualityParameter.Depth = SymbolicExpressionTreeParameter.Depth;
-      linearScaler.AlphaParameter.Depth = SymbolicExpressionTreeParameter.Depth;
-      linearScaler.BetaParameter.Depth = SymbolicExpressionTreeParameter.Depth;
-      linearScaler.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
-      linearScaler.ScaledSymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
+      bestAvgWorstValidationQualityCalculator.QualityParameter.Depth = SymbolicExpressionTreeParameter.Depth;
     }
   }
Index: trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs	(revision 3702)
+++ trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs	(revision 3710)
@@ -28,4 +28,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Drawing;
 
 namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic {
@@ -36,4 +37,7 @@
   [StorableClass]
   public sealed class SymbolicRegressionSolution : DataAnalysisSolution {
+    public override Image ItemImage {
+      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Function; }
+    }
     [Storable]
     private SymbolicRegressionModel model;
