Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab 3.3.sln
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab 3.3.sln	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab 3.3.sln	(revision 10479)
@@ -112,6 +112,8 @@
 		{AB687BBE-1BFE-476B-906D-44237135431D} = {AB687BBE-1BFE-476B-906D-44237135431D}
 		{66D249C3-A01D-42A8-82A2-919BC8EC3D83} = {66D249C3-A01D-42A8-82A2-919BC8EC3D83}
+		{21977CC3-1757-4B3B-87BD-FF817AAA900F} = {21977CC3-1757-4B3B-87BD-FF817AAA900F}
 		{E4CFB0C3-0589-4893-B38E-8BEDF885C765} = {E4CFB0C3-0589-4893-B38E-8BEDF885C765}
 		{E6CB1FC5-78EC-4EB8-BF12-35303C36F962} = {E6CB1FC5-78EC-4EB8-BF12-35303C36F962}
+		{0C2917C8-7AA8-4E18-800A-C4D064F992ED} = {0C2917C8-7AA8-4E18-800A-C4D064F992ED}
 		{79271BC8-4446-40E2-BB89-9BE4E17174FE} = {79271BC8-4446-40E2-BB89-9BE4E17174FE}
 		{7A2531CE-3F7C-4F13-BCCA-ED6DC27A7086} = {7A2531CE-3F7C-4F13-BCCA-ED6DC27A7086}
@@ -381,4 +383,8 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.DataAnalysis.Trading.Views-3.4", "HeuristicLab.Problems.DataAnalysis.Trading.Views\3.4\HeuristicLab.Problems.DataAnalysis.Trading.Views-3.4.csproj", "{CB3D0A1E-1BE8-476B-A53C-2B189E30064F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.HLScript-3.3", "HeuristicLab.HLScript\3.3\HeuristicLab.HLScript-3.3.csproj", "{21977CC3-1757-4B3B-87BD-FF817AAA900F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.HLScript.Views-3.3", "HeuristicLab.HLScript.Views\3.3\HeuristicLab.HLScript.Views-3.3.csproj", "{0C2917C8-7AA8-4E18-800A-C4D064F992ED}"
 EndProject
 Global
@@ -1856,4 +1862,28 @@
 		{CB3D0A1E-1BE8-476B-A53C-2B189E30064F}.Release|x86.ActiveCfg = Release|x86
 		{CB3D0A1E-1BE8-476B-A53C-2B189E30064F}.Release|x86.Build.0 = Release|x86
+		{21977CC3-1757-4B3B-87BD-FF817AAA900F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{21977CC3-1757-4B3B-87BD-FF817AAA900F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{21977CC3-1757-4B3B-87BD-FF817AAA900F}.Debug|x64.ActiveCfg = Debug|x64
+		{21977CC3-1757-4B3B-87BD-FF817AAA900F}.Debug|x64.Build.0 = Debug|x64
+		{21977CC3-1757-4B3B-87BD-FF817AAA900F}.Debug|x86.ActiveCfg = Debug|x86
+		{21977CC3-1757-4B3B-87BD-FF817AAA900F}.Debug|x86.Build.0 = Debug|x86
+		{21977CC3-1757-4B3B-87BD-FF817AAA900F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{21977CC3-1757-4B3B-87BD-FF817AAA900F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{21977CC3-1757-4B3B-87BD-FF817AAA900F}.Release|x64.ActiveCfg = Release|x64
+		{21977CC3-1757-4B3B-87BD-FF817AAA900F}.Release|x64.Build.0 = Release|x64
+		{21977CC3-1757-4B3B-87BD-FF817AAA900F}.Release|x86.ActiveCfg = Release|x86
+		{21977CC3-1757-4B3B-87BD-FF817AAA900F}.Release|x86.Build.0 = Release|x86
+		{0C2917C8-7AA8-4E18-800A-C4D064F992ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0C2917C8-7AA8-4E18-800A-C4D064F992ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0C2917C8-7AA8-4E18-800A-C4D064F992ED}.Debug|x64.ActiveCfg = Debug|x64
+		{0C2917C8-7AA8-4E18-800A-C4D064F992ED}.Debug|x64.Build.0 = Debug|x64
+		{0C2917C8-7AA8-4E18-800A-C4D064F992ED}.Debug|x86.ActiveCfg = Debug|x86
+		{0C2917C8-7AA8-4E18-800A-C4D064F992ED}.Debug|x86.Build.0 = Debug|x86
+		{0C2917C8-7AA8-4E18-800A-C4D064F992ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0C2917C8-7AA8-4E18-800A-C4D064F992ED}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0C2917C8-7AA8-4E18-800A-C4D064F992ED}.Release|x64.ActiveCfg = Release|x64
+		{0C2917C8-7AA8-4E18-800A-C4D064F992ED}.Release|x64.Build.0 = Release|x64
+		{0C2917C8-7AA8-4E18-800A-C4D064F992ED}.Release|x86.ActiveCfg = Release|x86
+		{0C2917C8-7AA8-4E18-800A-C4D064F992ED}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SuccessfulOffspringAnalysis/SuccessfulOffspringAnalyzer.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SuccessfulOffspringAnalysis/SuccessfulOffspringAnalyzer.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SuccessfulOffspringAnalysis/SuccessfulOffspringAnalyzer.cs	(revision 10479)
@@ -81,4 +81,7 @@
       Parameters.Add(new LookupParameter<ResultCollection>("SuccessfulOffspringAnalysis", "The successful offspring analysis which is created."));
       Parameters.Add(new ValueParameter<IntValue>("Depth", "The depth of the individuals in the scope tree.", new IntValue(1)));
+
+      CollectedValuesParameter.Value.Add(new StringValue("SelectedCrossoverOperator"));
+      CollectedValuesParameter.Value.Add(new StringValue("SelectedManipulationOperator"));
     }
 
@@ -110,57 +113,59 @@
         }
 
-        //create a data table containing the collected values
-        ResultCollection successfulOffspringAnalysis;
+        if (counts.Count > 0) {
+          //create a data table containing the collected values
+          ResultCollection successfulOffspringAnalysis;
 
-        if (SuccessfulOffspringAnalysisParameter.ActualValue == null) {
-          successfulOffspringAnalysis = new ResultCollection();
-          SuccessfulOffspringAnalysisParameter.ActualValue = successfulOffspringAnalysis;
-        } else {
-          successfulOffspringAnalysis = SuccessfulOffspringAnalysisParameter.ActualValue;
-        }
-
-        string resultKey = "SuccessfulOffspringAnalyzer Results";
-        if (!results.ContainsKey(resultKey)) {
-          results.Add(new Result(resultKey, successfulOffspringAnalysis));
-        } else {
-          results[resultKey].Value = successfulOffspringAnalysis;
-        }
-
-        DataTable successProgressAnalysis;
-        if (!successfulOffspringAnalysis.ContainsKey(collected.Value)) {
-          successProgressAnalysis = new DataTable();
-          successProgressAnalysis.Name = collected.Value;
-          successfulOffspringAnalysis.Add(new Result(collected.Value, successProgressAnalysis));
-        } else {
-          successProgressAnalysis = successfulOffspringAnalysis[collected.Value].Value as DataTable;
-        }
-
-        int successfulCount = 0;
-        foreach (string key in counts.Keys) {
-          successfulCount += counts[key];
-        }
-
-        foreach (String value in counts.Keys) {
-          DataRow row;
-          if (!successProgressAnalysis.Rows.ContainsKey(value)) {
-            row = new DataRow(value);
-            int iterations = GenerationsParameter.ActualValue.Value;
-
-            //fill up all values seen the first time
-            for (int i = 1; i < iterations; i++)
-              row.Values.Add(0);
-
-            successProgressAnalysis.Rows.Add(row);
+          if (SuccessfulOffspringAnalysisParameter.ActualValue == null) {
+            successfulOffspringAnalysis = new ResultCollection();
+            SuccessfulOffspringAnalysisParameter.ActualValue = successfulOffspringAnalysis;
           } else {
-            row = successProgressAnalysis.Rows[value];
+            successfulOffspringAnalysis = SuccessfulOffspringAnalysisParameter.ActualValue;
           }
 
-          row.Values.Add(counts[value] / (double)successfulCount);
-        }
+          string resultKey = "SuccessfulOffspringAnalyzer Results";
+          if (!results.ContainsKey(resultKey)) {
+            results.Add(new Result(resultKey, successfulOffspringAnalysis));
+          } else {
+            results[resultKey].Value = successfulOffspringAnalysis;
+          }
 
-        //fill up all values that are not present in the current generation
-        foreach (DataRow row in successProgressAnalysis.Rows) {
-          if (!counts.ContainsKey(row.Name))
-            row.Values.Add(0);
+          DataTable successProgressAnalysis;
+          if (!successfulOffspringAnalysis.ContainsKey(collected.Value)) {
+            successProgressAnalysis = new DataTable();
+            successProgressAnalysis.Name = collected.Value;
+            successfulOffspringAnalysis.Add(new Result(collected.Value, successProgressAnalysis));
+          } else {
+            successProgressAnalysis = successfulOffspringAnalysis[collected.Value].Value as DataTable;
+          }
+
+          int successfulCount = 0;
+          foreach (string key in counts.Keys) {
+            successfulCount += counts[key];
+          }
+
+          foreach (String value in counts.Keys) {
+            DataRow row;
+            if (!successProgressAnalysis.Rows.ContainsKey(value)) {
+              row = new DataRow(value);
+              int iterations = GenerationsParameter.ActualValue.Value;
+
+              //fill up all values seen the first time
+              for (int i = 1; i < iterations; i++)
+                row.Values.Add(0);
+
+              successProgressAnalysis.Rows.Add(row);
+            } else {
+              row = successProgressAnalysis.Rows[value];
+            }
+
+            row.Values.Add(counts[value] / (double)successfulCount);
+          }
+
+          //fill up all values that are not present in the current generation
+          foreach (DataRow row in successProgressAnalysis.Rows) {
+            if (!counts.ContainsKey(row.Name))
+              row.Values.Add(0);
+          }
         }
       }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Analysis/3.3/MultiAnalyzer.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Analysis/3.3/MultiAnalyzer.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Analysis/3.3/MultiAnalyzer.cs	(revision 10479)
@@ -69,5 +69,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IntValue interval = UpdateIntervalParameter.ActualValue;
       if (interval == null) interval = new IntValue(1);
@@ -84,8 +84,8 @@
         foreach (IndexedItem<IAnalyzer> item in Operators.CheckedItems)
           next.Add(ExecutionContext.CreateOperation(item.Value));
-        next.Add(base.Apply());
+        next.Add(base.InstrumentedApply());
         return next;
       } else {
-        return base.Apply();
+        return base.InstrumentedApply();
       }
     }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/HiveTaskView.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/HiveTaskView.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/HiveTaskView.cs	(revision 10479)
@@ -96,5 +96,5 @@
             this.priorityComboBox.SelectedIndex = Content.Task.Priority;
           } else {
-            this.priorityComboBox.SelectedIndex = 0;
+            this.priorityComboBox.SelectedIndex = 1;
           }
           this.coresNeededComboBox.Text = Content.Task.CoresNeeded.ToString();
@@ -103,5 +103,5 @@
           this.jobIdTextBox.Text = string.Empty;
           this.dateCreatedTextBox.Text = string.Empty;
-          this.priorityComboBox.SelectedIndex = 0;
+          this.priorityComboBox.SelectedIndex = 1;
           this.coresNeededComboBox.Text = "1";
           this.memoryNeededComboBox.Text = "128";
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/HiveTaskView.designer.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/HiveTaskView.designer.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/HiveTaskView.designer.cs	(revision 10479)
@@ -109,7 +109,7 @@
       // stateLogViewHost
       // 
-      this.stateLogViewHost.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.stateLogViewHost.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.stateLogViewHost.Caption = "View";
       this.stateLogViewHost.Content = null;
@@ -137,6 +137,6 @@
       // splitContainer1
       // 
-      this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.splitContainer1.Location = new System.Drawing.Point(6, 6);
       this.splitContainer1.Name = "splitContainer1";
@@ -189,9 +189,10 @@
       // priorityComboBox
       // 
-      this.priorityComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.priorityComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.priorityComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.priorityComboBox.FormattingEnabled = true;
       this.priorityComboBox.Items.AddRange(new object[] {
+            "Low",
             "Normal",
             "Urgent",
@@ -214,6 +215,6 @@
       // jobIdTextBox
       // 
-      this.jobIdTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.jobIdTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.jobIdTextBox.Location = new System.Drawing.Point(87, 13);
       this.jobIdTextBox.Name = "jobIdTextBox";
@@ -232,6 +233,6 @@
       // lastUpdatedTextBox
       // 
-      this.lastUpdatedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.lastUpdatedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.lastUpdatedTextBox.Location = new System.Drawing.Point(87, 66);
       this.lastUpdatedTextBox.Name = "lastUpdatedTextBox";
@@ -266,6 +267,6 @@
       // memoryNeededComboBox
       // 
-      this.memoryNeededComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.memoryNeededComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.memoryNeededComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.memoryNeededComboBox.FormattingEnabled = true;
@@ -283,6 +284,6 @@
       // coresNeededComboBox
       // 
-      this.coresNeededComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.coresNeededComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.coresNeededComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.coresNeededComboBox.FormattingEnabled = true;
@@ -360,6 +361,6 @@
       // commandTextBox
       // 
-      this.commandTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.commandTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.commandTextBox.Location = new System.Drawing.Point(95, 39);
       this.commandTextBox.Name = "commandTextBox";
@@ -378,6 +379,6 @@
       // stateTextBox
       // 
-      this.stateTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.stateTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.stateTextBox.Location = new System.Drawing.Point(95, 13);
       this.stateTextBox.Name = "stateTextBox";
@@ -405,6 +406,6 @@
       // dateCalculatedText
       // 
-      this.dateCalculatedText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dateCalculatedText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.dateCalculatedText.Location = new System.Drawing.Point(95, 117);
       this.dateCalculatedText.Name = "dateCalculatedText";
@@ -414,6 +415,6 @@
       // dateFinishedTextBox
       // 
-      this.dateFinishedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dateFinishedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.dateFinishedTextBox.Location = new System.Drawing.Point(95, 143);
       this.dateFinishedTextBox.Name = "dateFinishedTextBox";
@@ -423,6 +424,6 @@
       // executionTimeTextBox
       // 
-      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.executionTimeTextBox.Location = new System.Drawing.Point(95, 65);
       this.executionTimeTextBox.Name = "executionTimeTextBox";
@@ -432,6 +433,6 @@
       // dateCreatedTextBox
       // 
-      this.dateCreatedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dateCreatedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.dateCreatedTextBox.Location = new System.Drawing.Point(95, 91);
       this.dateCreatedTextBox.Name = "dateCreatedTextBox";
@@ -477,6 +478,6 @@
       // exceptionTextBox
       // 
-      this.exceptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.exceptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.exceptionTextBox.Location = new System.Drawing.Point(95, 169);
       this.exceptionTextBox.Name = "exceptionTextBox";
@@ -487,6 +488,6 @@
       // modifyItemButton
       // 
-      this.modifyItemButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.modifyItemButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.modifyItemButton.Location = new System.Drawing.Point(3, 224);
       this.modifyItemButton.Name = "modifyItemButton";
@@ -499,7 +500,7 @@
       // tabControl
       // 
-      this.tabControl.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.tabControl.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.tabControl.Controls.Add(this.detailsTabPage);
       this.tabControl.Controls.Add(this.stateLogTabPage);
@@ -512,5 +513,4 @@
       // HiveTaskView
       // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.Controls.Add(this.tabControl);
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Clients.Hive/3.3/ServiceClients/Task.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Clients.Hive/3.3/ServiceClients/Task.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Clients.Hive/3.3/ServiceClients/Task.cs	(revision 10479)
@@ -27,5 +27,7 @@
   public partial class Task : LightweightTask {
 
-    public Task() { }
+    public Task() {
+      Priority = 1;
+    }
 
     protected Task(Task original, Cloner cloner)
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.CodeEditor/3.3/CodeEditor.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.CodeEditor/3.3/CodeEditor.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.CodeEditor/3.3/CodeEditor.cs	(revision 10479)
@@ -140,4 +140,11 @@
       if (TextEditorValidated != null)
         TextEditorValidated(this, EventArgs.Empty);
+    }
+
+    public event EventHandler TextEditorTextChanged;
+
+    protected void OnTextEditorTextChanged() {
+      if (TextEditorTextChanged != null)
+        TextEditorTextChanged(this, EventArgs.Empty);
     }
 
@@ -188,4 +195,5 @@
 
       textEditor.Validated += (s, a) => { OnTextEditorValidated(); };
+      textEditor.TextChanged += (s, a) => { OnTextEditorTextChanged(); };
       InitializeImageList();
     }
@@ -298,19 +306,19 @@
     public void AddAssembly(Assembly a) {
       ShowMessage("Loading " + a.GetName().Name + "...");
-      if (assemblies.Contains(a))
-        return;
-      var reference = projectContentRegistry.GetProjectContentForReference(a.GetName().Name, a.Location);
-      projectContent.AddReferencedContent(reference);
-      assemblies.Add(a);
+      if (!assemblies.Contains(a)) {
+        var reference = projectContentRegistry.GetProjectContentForReference(a.GetName().Name, a.Location);
+        projectContent.AddReferencedContent(reference);
+        assemblies.Add(a);
+      }
       ShowMessage("Ready");
     }
     public void RemoveAssembly(Assembly a) {
       ShowMessage("Unloading " + a.GetName().Name + "...");
-      if (!assemblies.Contains(a))
-        return;
-      var content = projectContentRegistry.GetExistingProjectContent(a.Location);
-      if (content != null) {
-        projectContent.ReferencedContents.Remove(content);
-        projectContentRegistry.UnloadProjectContent(content);
+      if (assemblies.Contains(a)) {
+        var content = projectContentRegistry.GetExistingProjectContent(a.Location);
+        if (content != null) {
+          projectContent.ReferencedContents.Remove(content);
+          projectContentRegistry.UnloadProjectContent(content);
+        }
       }
       ShowMessage("Ready");
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/BidirectionalDictionary.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/BidirectionalDictionary.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/BidirectionalDictionary.cs	(revision 10479)
@@ -67,9 +67,9 @@
     }
 
-    public IEnumerable<TFirst> FirstValues {
+    public IEnumerable<TFirst> FirstKeys {
       get { return firstToSecond.Keys; }
     }
 
-    public IEnumerable<TSecond> SecondValues {
+    public IEnumerable<TSecond> SecondKeys {
       get { return secondToFirst.Keys; }
     }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/BidirectionalLookup.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/BidirectionalLookup.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/BidirectionalLookup.cs	(revision 10479)
@@ -62,10 +62,10 @@
     }
 
-    public IEnumerable<IEnumerable<TSecond>> FirstValues {
-      get { return firstToSecond.Values.AsEnumerable(); }
-    }
-
-    public IEnumerable<IEnumerable<TFirst>> SecondValues {
-      get { return secondToFirst.Values.AsEnumerable(); }
+    public IEnumerable<TFirst> FirstKeys {
+      get { return firstToSecond.Keys.AsEnumerable(); }
+    }
+
+    public IEnumerable<TSecond> SecondKeys {
+      get { return secondToFirst.Keys.AsEnumerable(); }
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/HeuristicLab.Collections-3.3.csproj
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/HeuristicLab.Collections-3.3.csproj	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/HeuristicLab.Collections-3.3.csproj	(revision 10479)
@@ -157,4 +157,8 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
       <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/ObservableArray.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/ObservableArray.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/ObservableArray.cs	(revision 10479)
@@ -25,4 +25,5 @@
 using System.ComponentModel;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -168,5 +169,5 @@
         Array.Clear(array, index, length);
         OnPropertyChanged("Item[]");
-        OnItemsReplaced(GetIndexedItems(index, length), oldItems); 
+        OnItemsReplaced(GetIndexedItems(index, length), oldItems);
       }
     }
@@ -205,5 +206,5 @@
       if (array.Length > 1) {
         IndexedItem<T>[] oldItems = GetIndexedItems();
-        Array.Sort<T>(array);
+        array.StableSort();
         OnPropertyChanged("Item[]");
         OnItemsMoved(GetIndexedItems(), oldItems);
@@ -213,5 +214,5 @@
       if (array.Length > 1) {
         IndexedItem<T>[] oldItems = GetIndexedItems();
-        Array.Sort<T>(array, comparison);
+        array.StableSort(comparison);
         OnPropertyChanged("Item[]");
         OnItemsMoved(GetIndexedItems(), oldItems);
@@ -221,5 +222,5 @@
       if (array.Length > 1) {
         IndexedItem<T>[] oldItems = GetIndexedItems();
-        Array.Sort<T>(array, comparer);
+        array.StableSort(comparer);
         OnPropertyChanged("Item[]");
         OnItemsMoved(GetIndexedItems(), oldItems);
@@ -229,5 +230,5 @@
       if (length > 1) {
         IndexedItem<T>[] oldItems = GetIndexedItems(index, length);
-        Array.Sort<T>(array, index, length);
+        array.StableSort(index, length);
         OnPropertyChanged("Item[]");
         OnItemsMoved(GetIndexedItems(index, length), oldItems);
@@ -237,5 +238,5 @@
       if (length > 1) {
         IndexedItem<T>[] oldItems = GetIndexedItems(index, length);
-        Array.Sort<T>(array, index, length, comparer);
+        array.StableSort(index, length, comparer);
         OnPropertyChanged("Item[]");
         OnItemsMoved(GetIndexedItems(index, length), oldItems);
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/ObservableList.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/ObservableList.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/ObservableList.cs	(revision 10479)
@@ -25,4 +25,5 @@
 using System.ComponentModel;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -320,5 +321,5 @@
       if (list.Count > 1) {
         IndexedItem<T>[] oldItems = GetIndexedItems();
-        list.Sort();
+        list.StableSort();
         OnItemsMoved(GetIndexedItems(), oldItems);
         OnPropertyChanged("Item[]");
@@ -328,5 +329,5 @@
       if (list.Count > 1) {
         IndexedItem<T>[] oldItems = GetIndexedItems();
-        list.Sort(comparison);
+        list.StableSort(comparison);
         OnItemsMoved(GetIndexedItems(), oldItems);
         OnPropertyChanged("Item[]");
@@ -336,5 +337,5 @@
       if (list.Count > 1) {
         IndexedItem<T>[] oldItems = GetIndexedItems();
-        list.Sort(comparer);
+        list.StableSort(comparer);
         OnItemsMoved(GetIndexedItems(), oldItems);
         OnPropertyChanged("Item[]");
@@ -344,5 +345,5 @@
       if (count > 1) {
         IndexedItem<T>[] oldItems = GetIndexedItems(index, count);
-        list.Sort(index, count, comparer);
+        list.StableSort(index, count, comparer);
         OnItemsMoved(GetIndexedItems(index, count), oldItems);
         OnPropertyChanged("Item[]");
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/Plugin.cs.frame
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/Plugin.cs.frame	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Collections/3.3/Plugin.cs.frame	(revision 10479)
@@ -29,4 +29,5 @@
   [PluginFile("HeuristicLab.Collections-3.3.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
   public class HeuristicLabCollectionsPlugin : PluginBase {
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Common/3.3/ArrayExtensions.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Common/3.3/ArrayExtensions.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Common/3.3/ArrayExtensions.cs	(revision 10479)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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;
+
+namespace HeuristicLab.Common {
+  public static class ArrayExtensions {
+    public static void StableSort<T>(this T[] values) {
+      values.StableSort(0, values.Length);
+    }
+
+    public static void StableSort<T>(this T[] values, int index, int count) {
+      var sortedArray = values.Skip(index).Take(count).OrderBy(x => x).ToArray();
+      Array.ConstrainedCopy(sortedArray, 0, values, index, count);
+    }
+
+    public static void StableSort<T>(this T[] values, IComparer<T> comparer) {
+      values.StableSort(0, values.Length, comparer);
+    }
+
+    public static void StableSort<T>(this T[] values, int index, int count, IComparer<T> comparer) {
+      var sortedArray = values.Skip(index).Take(count).OrderBy(x => x, comparer).ToArray();
+      Array.ConstrainedCopy(sortedArray, 0, values, index, count);
+    }
+
+    public static void StableSort<T>(this T[] values, Comparison<T> comparison) {
+      values.StableSort(0, values.Length, comparison);
+    }
+
+    public static void StableSort<T>(this T[] values, int index, int count, Comparison<T> comparison) {
+      var sortedArray = values.Skip(index).Take(count).OrderBy(x => x, new StableSortComparer<T>(comparison)).ToArray();
+      Array.ConstrainedCopy(sortedArray, 0, values, index, count);
+    }
+
+    public class StableSortComparer<T> : IComparer<T> {
+      public StableSortComparer(Comparison<T> comparison) {
+        this.comparison = comparison;
+      }
+      public int Compare(T x, T y) {
+        return comparison(x, y);
+      }
+      private readonly Comparison<T> comparison;
+    }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Common/3.3/HeuristicLab.Common-3.3.csproj
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Common/3.3/HeuristicLab.Common-3.3.csproj	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Common/3.3/HeuristicLab.Common-3.3.csproj	(revision 10479)
@@ -124,4 +124,6 @@
     <Compile Include="Content\IStorableContent.cs" />
     <Compile Include="Constants.cs" />
+    <Compile Include="ArrayExtensions.cs" />
+    <Compile Include="ListExtensions.cs" />
     <Compile Include="Point2D.cs" />
     <Compile Include="EnumerableExtensions.cs" />
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Common/3.3/ListExtensions.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Common/3.3/ListExtensions.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Common/3.3/ListExtensions.cs	(revision 10479)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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;
+
+namespace HeuristicLab.Common {
+  public static class ListExtensions {
+    public static void StableSort<T>(this List<T> values) {
+      values.StableSort(0, values.Count);
+    }
+
+    public static void StableSort<T>(this List<T> values, int index, int count) {
+      var orderedList = values.Skip(index).Take(count).OrderBy(x => x);
+      int i = index;
+      foreach (var e in orderedList)
+        values[i++] = e;
+    }
+
+    public static void StableSort<T>(this List<T> values, IComparer<T> comparer) {
+      values.StableSort(0, values.Count, comparer);
+    }
+
+    public static void StableSort<T>(this List<T> values, int index, int count, IComparer<T> comparer) {
+      var orderedList = values.OrderBy(x => x, comparer);
+      int i = 0;
+      foreach (var e in orderedList)
+        values[i++] = e;
+    }
+
+    public static void StableSort<T>(this List<T> values, Comparison<T> comparison) {
+      values.StableSort(0, values.Count, comparison);
+    }
+
+    public static void StableSort<T>(this List<T> values, int index, int count, Comparison<T> comparison) {
+      var orderedList = values.OrderBy(x => x, new StableSortComparer<T>(comparison));
+      int i = 0;
+      foreach (var e in orderedList)
+        values[i++] = e;
+    }
+
+    public class StableSortComparer<T> : IComparer<T> {
+      public StableSortComparer(Comparison<T> comparison) {
+        this.comparison = comparison;
+      }
+      public int Compare(T x, T y) {
+        return comparison(x, y);
+      }
+      private readonly Comparison<T> comparison;
+    }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj	(revision 10479)
@@ -150,4 +150,5 @@
     <Compile Include="Interfaces\ICheckedMultiOperator.cs" />
     <Compile Include="Interfaces\IConstrainedValueParameter.cs" />
+    <Compile Include="Interfaces\IInstrumentedOperator.cs" />
     <Compile Include="Interfaces\IMultiOperator.cs" />
     <Compile Include="Interfaces\IFixedValueParameter.cs" />
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Core/3.3/Interfaces/IInstrumentedOperator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Core/3.3/Interfaces/IInstrumentedOperator.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Core/3.3/Interfaces/IInstrumentedOperator.cs	(revision 10479)
@@ -0,0 +1,32 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Collections;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Core {
+  public interface IInstrumentedOperator : IOperator {
+    IEnumerable<IOperator> BeforeExecutionOperators { get; }
+    IEnumerable<IOperator> AfterExecutionOperators { get; }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Data/3.3/PercentValue.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Data/3.3/PercentValue.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Data/3.3/PercentValue.cs	(revision 10479)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -28,11 +29,35 @@
   [StorableClass]
   public class PercentValue : DoubleValue {
+    [Storable(DefaultValue = false)]
+    private bool restrictToUnitInterval = false;
+    public bool RestrictToUnitInterval {
+      get { return restrictToUnitInterval; }
+    }
+
+    public override double Value {
+      get { return base.Value; }
+      set {
+        if (restrictToUnitInterval && (value < 0 || value > 1))
+          throw new ArgumentException("Value must lie in the interval [0,1].");
+        base.Value = value;
+      }
+    }
+
     [StorableConstructor]
     protected PercentValue(bool deserializing) : base(deserializing) { }
     protected PercentValue(PercentValue original, Cloner cloner)
       : base(original, cloner) {
+      restrictToUnitInterval = original.restrictToUnitInterval;
     }
     public PercentValue() : base() { }
     public PercentValue(double value) : base(value) { }
+
+    public PercentValue(double value, bool restrictToUnitInterval)
+      : base() {
+      this.restrictToUnitInterval = restrictToUnitInterval;
+      if (restrictToUnitInterval && (value < 0 || value > 1))
+        throw new ArgumentException("Value must lie in the interval [0,1].");
+      this.value = value;
+    }
 
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -46,6 +71,15 @@
     protected override bool Validate(string value, out string errorMessage) {
       value = value.Replace("%", " ");
-      return base.Validate(value, out errorMessage);
+      bool valid = base.Validate(value, out errorMessage);
+      if (!restrictToUnitInterval || !valid) return valid;
+
+      double val = double.Parse(value);
+      if (val < 0 || val > 1) {
+        errorMessage = "Value must lie in the interval [0,1].";
+        return false;
+      }
+      return true;
     }
+
     protected override string GetValue() {
       return Value.ToString("#0.#################### %");  // percent format
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorCreator.cs	(revision 10479)
@@ -34,5 +34,5 @@
   [Item("BinaryVectorCreator", "A base class for operators creating bool-valued vectors.")]
   [StorableClass]
-  public abstract class BinaryVectorCreator : SingleSuccessorOperator, IBinaryVectorCreator, IStochasticOperator {
+  public abstract class BinaryVectorCreator : InstrumentedOperator, IBinaryVectorCreator, IStochasticOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -58,7 +58,7 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       BinaryVectorParameter.ActualValue = Create(RandomParameter.ActualValue, LengthParameter.ActualValue);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorCrossover.cs	(revision 10479)
@@ -33,5 +33,5 @@
   [Item("BinaryVectorCrossover", "A base class for operators that perform a crossover of bool-valued vectors.")]
   [StorableClass]
-  public abstract class BinaryVectorCrossover : SingleSuccessorOperator, IBinaryVectorCrossover, IStochasticOperator {
+  public abstract class BinaryVectorCrossover : InstrumentedOperator, IBinaryVectorCrossover, IStochasticOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -59,7 +59,7 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       ChildParameter.ActualValue = Cross(RandomParameter.ActualValue, ParentsParameter.ActualValue);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorManipulator.cs	(revision 10479)
@@ -33,5 +33,5 @@
   [Item("BinaryVectorManipulator", "A base class for operators that manipulate bool-valued vectors.")]
   [StorableClass]
-  public abstract class BinaryVectorManipulator : SingleSuccessorOperator, IBinaryVectorManipulator, IStochasticOperator {
+  public abstract class BinaryVectorManipulator : InstrumentedOperator, IBinaryVectorManipulator, IStochasticOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -53,7 +53,7 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       Manipulate(RandomParameter.ActualValue, BinaryVectorParameter.ActualValue);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/Crossovers/MultiBinaryVectorCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/Crossovers/MultiBinaryVectorCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/Crossovers/MultiBinaryVectorCrossover.cs	(revision 10479)
@@ -64,4 +64,6 @@
           Operators.Add((IBinaryVectorCrossover)Activator.CreateInstance(type), true);
       }
+
+      SelectedOperatorParameter.ActualName = "SelectedCrossoverOperator";
     }
 
@@ -90,7 +92,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one binary vector crossover to choose from.");
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/Crossovers/MultiIntegerVectorCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/Crossovers/MultiIntegerVectorCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/Crossovers/MultiIntegerVectorCrossover.cs	(revision 10479)
@@ -70,4 +70,6 @@
           Operators.Add((IIntegerVectorCrossover)Activator.CreateInstance(type), true);
       }
+
+      SelectedOperatorParameter.ActualName = "SelectedCrossoverOperator";
     }
 
@@ -99,7 +101,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one integer vector crossover to choose from.");
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorCreator.cs	(revision 10479)
@@ -34,5 +34,5 @@
   [Item("IntegerVectorCreator", "A base class for operators creating int-valued vectors.")]
   [StorableClass]
-  public abstract class IntegerVectorCreator : SingleSuccessorOperator, IIntegerVectorCreator, IStochasticOperator {
+  public abstract class IntegerVectorCreator : InstrumentedOperator, IIntegerVectorCreator, IStochasticOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -79,7 +79,7 @@
     #endregion
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       IntegerVectorParameter.ActualValue = Create(RandomParameter.ActualValue, LengthParameter.ActualValue, BoundsParameter.ActualValue);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorCrossover.cs	(revision 10479)
@@ -58,7 +58,7 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       ChildParameter.ActualValue = Cross(RandomParameter.ActualValue, ParentsParameter.ActualValue);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorManipulator.cs	(revision 10479)
@@ -52,7 +52,7 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       Manipulate(RandomParameter.ActualValue, IntegerVectorParameter.ActualValue);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorOperator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorOperator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorOperator.cs	(revision 10479)
@@ -29,5 +29,5 @@
   [Item("IntegerVectorOperator", "Base class for integer vectoro operators.")]
   [StorableClass]
-  public abstract class IntegerVectorOperator : SingleSuccessorOperator, IIntegerVectorOperator {
+  public abstract class IntegerVectorOperator : InstrumentedOperator, IIntegerVectorOperator {
 
     [StorableConstructor]
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/Creators/RandomPermutationCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/Creators/RandomPermutationCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/Creators/RandomPermutationCreator.cs	(revision 10479)
@@ -34,5 +34,5 @@
   [Item("RandomPermutationCreator", "An operator which creates a new random permutation of integer values.")]
   [StorableClass]
-  public sealed class RandomPermutationCreator : SingleSuccessorOperator, IPermutationCreator, IStochasticOperator {
+  public sealed class RandomPermutationCreator : InstrumentedOperator, IPermutationCreator, IStochasticOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -72,7 +72,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       PermutationParameter.ActualValue = new Permutation(PermutationType, LengthParameter.ActualValue.Value, RandomParameter.ActualValue);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/MultiPermutationCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/MultiPermutationCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/MultiPermutationCrossover.cs	(revision 10479)
@@ -64,4 +64,6 @@
           Operators.Add((IPermutationCrossover)Activator.CreateInstance(type), true);
       }
+
+      SelectedOperatorParameter.ActualName = "SelectedCrossoverOperator";
     }
 
@@ -90,7 +92,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one permutation crossover to choose from.");
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/MultiPermutationManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/MultiPermutationManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/MultiPermutationManipulator.cs	(revision 10479)
@@ -57,4 +57,6 @@
           Operators.Add((IPermutationManipulator)Activator.CreateInstance(type), true);
       }
+
+      SelectedOperatorParameter.ActualName = "SelectedManipulationOperator";
     }
 
@@ -82,7 +84,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one permutation manipulator to choose from.");
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationCrossover.cs	(revision 10479)
@@ -33,5 +33,5 @@
   [Item("PermutationCrossover", "A base class for permutation crossover operators.")]
   [StorableClass]
-  public abstract class PermutationCrossover : SingleSuccessorOperator, IPermutationCrossover, IStochasticOperator {
+  public abstract class PermutationCrossover : InstrumentedOperator, IPermutationCrossover, IStochasticOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -60,7 +60,7 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       ChildParameter.ActualValue = Cross(RandomParameter.ActualValue, ParentsParameter.ActualValue);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationManipulator.cs	(revision 10479)
@@ -33,5 +33,5 @@
   [Item("PermutationManipulator", "A base class for permutation manipulation operators.")]
   [StorableClass]
-  public abstract class PermutationManipulator : SingleSuccessorOperator, IPermutationManipulator, IStochasticOperator {
+  public abstract class PermutationManipulator : InstrumentedOperator, IPermutationManipulator, IStochasticOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -54,7 +54,7 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       Manipulate(RandomParameter.ActualValue, PermutationParameter.ActualValue);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/Crossovers/MultiRealVectorCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/Crossovers/MultiRealVectorCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/Crossovers/MultiRealVectorCrossover.cs	(revision 10479)
@@ -70,4 +70,6 @@
           Operators.Add((IRealVectorCrossover)Activator.CreateInstance(type), true);
       }
+
+      SelectedOperatorParameter.ActualName = "SelectedCrossoverOperator";
     }
 
@@ -97,7 +99,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one real vector crossover to choose from.");
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/Manipulators/MultiRealVectorManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/Manipulators/MultiRealVectorManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/Manipulators/MultiRealVectorManipulator.cs	(revision 10479)
@@ -62,4 +62,6 @@
       Operators.Add(new PolynomialOnePositionManipulator());
       Operators.Add(new UniformOnePositionManipulator());
+
+      SelectedOperatorParameter.ActualName = "SelectedManipulationOperator";
     }
 
@@ -88,7 +90,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one real vector manipulator to choose from.");
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorCreator.cs	(revision 10479)
@@ -34,5 +34,5 @@
   [Item("RealVectorCreator", "A base class for operators creating real-valued vectors.")]
   [StorableClass]
-  public abstract class RealVectorCreator : SingleSuccessorOperator, IRealVectorCreator, IStochasticOperator {
+  public abstract class RealVectorCreator : InstrumentedOperator, IRealVectorCreator, IStochasticOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -63,7 +63,7 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       RealVectorParameter.ActualValue = Create(RandomParameter.ActualValue, LengthParameter.ActualValue, BoundsParameter.ActualValue);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorCrossover.cs	(revision 10479)
@@ -35,5 +35,5 @@
   [Item("RealVectorCrossover", "A base class for operators that perform a crossover of real-valued vectors.")]
   [StorableClass]
-  public abstract class RealVectorCrossover : SingleSuccessorOperator, IRealVectorCrossover, IStochasticOperator {
+  public abstract class RealVectorCrossover : InstrumentedOperator, IRealVectorCrossover, IStochasticOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -96,9 +96,9 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       RealVector result = Cross(RandomParameter.ActualValue, ParentsParameter.ActualValue);
       ChildParameter.ActualValue = result;
 
-      IOperation successor = base.Apply();
+      IOperation successor = base.InstrumentedApply();
       if (BoundsChecker != null) {
         IOperation checkerOperation = ExecutionContext.CreateChildOperation(BoundsChecker);
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorManipulator.cs	(revision 10479)
@@ -35,5 +35,5 @@
   [Item("RealVectorManipulator", "A base class for operators that manipulate real-valued vectors.")]
   [StorableClass]
-  public abstract class RealVectorManipulator : SingleSuccessorOperator, IRealVectorManipulator, IStochasticOperator {
+  public abstract class RealVectorManipulator : InstrumentedOperator, IRealVectorManipulator, IStochasticOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -90,9 +90,9 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       RealVector vector = RealVectorParameter.ActualValue;
       Manipulate(RandomParameter.ActualValue, vector);
 
-      IOperation successor = base.Apply();
+      IOperation successor = base.InstrumentedApply();
       if (BoundsChecker != null) {
         IOperation checkerOperation = ExecutionContext.CreateChildOperation(BoundsChecker);
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/JobView.Designer.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/JobView.Designer.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/JobView.Designer.cs	(revision 10479)
@@ -80,5 +80,5 @@
       this.dueDateLabel.Name = "dueDateLabel";
       this.dueDateLabel.Size = new System.Drawing.Size(56, 13);
-      this.dueDateLabel.TabIndex = 0;
+      this.dueDateLabel.TabIndex = 2;
       this.dueDateLabel.Text = "Due Date:";
       // 
@@ -90,5 +90,5 @@
       this.dueDateTextBox.Name = "dueDateTextBox";
       this.dueDateTextBox.Size = new System.Drawing.Size(451, 20);
-      this.dueDateTextBox.TabIndex = 1;
+      this.dueDateTextBox.TabIndex = 3;
       this.dueDateTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.dueDateTextBox_Validating);
       // 
@@ -101,5 +101,5 @@
       this.tasksGroupBox.Name = "tasksGroupBox";
       this.tasksGroupBox.Size = new System.Drawing.Size(510, 214);
-      this.tasksGroupBox.TabIndex = 2;
+      this.tasksGroupBox.TabIndex = 4;
       this.tasksGroupBox.TabStop = false;
       this.tasksGroupBox.Text = "Tasks";
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/TaskView.Designer.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/TaskView.Designer.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/TaskView.Designer.cs	(revision 10479)
@@ -83,5 +83,5 @@
       this.resourceNrLabel.Name = "resourceNrLabel";
       this.resourceNrLabel.Size = new System.Drawing.Size(70, 13);
-      this.resourceNrLabel.TabIndex = 0;
+      this.resourceNrLabel.TabIndex = 2;
       this.resourceNrLabel.Text = "Resource Nr:";
       // 
@@ -93,5 +93,5 @@
       this.resourceNrTextBox.Name = "resourceNrTextBox";
       this.resourceNrTextBox.Size = new System.Drawing.Size(437, 20);
-      this.resourceNrTextBox.TabIndex = 1;
+      this.resourceNrTextBox.TabIndex = 3;
       this.resourceNrTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.resourceNrTextBox_Validating);
       // 
@@ -106,5 +106,5 @@
       this.jobNrLabel.Name = "jobNrLabel";
       this.jobNrLabel.Size = new System.Drawing.Size(41, 13);
-      this.jobNrLabel.TabIndex = 0;
+      this.jobNrLabel.TabIndex = 4;
       this.jobNrLabel.Text = "Job Nr:";
       // 
@@ -116,5 +116,5 @@
       this.jobNrTextBox.Name = "jobNrTextBox";
       this.jobNrTextBox.Size = new System.Drawing.Size(437, 20);
-      this.jobNrTextBox.TabIndex = 1;
+      this.jobNrTextBox.TabIndex = 5;
       this.jobNrTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.jobNrTextBox_Validating);
       // 
@@ -125,5 +125,5 @@
       this.durationLabel.Name = "durationLabel";
       this.durationLabel.Size = new System.Drawing.Size(50, 13);
-      this.durationLabel.TabIndex = 0;
+      this.durationLabel.TabIndex = 6;
       this.durationLabel.Text = "Duration:";
       // 
@@ -135,5 +135,5 @@
       this.durationTextBox.Name = "durationTextBox";
       this.durationTextBox.Size = new System.Drawing.Size(437, 20);
-      this.durationTextBox.TabIndex = 1;
+      this.durationTextBox.TabIndex = 7;
       this.durationTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.durationTextBox_Validating);
       // 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/Crossovers/JSMCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/Crossovers/JSMCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/Crossovers/JSMCrossover.cs	(revision 10479)
@@ -40,5 +40,5 @@
     public abstract JSMEncoding Cross(IRandom random, JSMEncoding parent1, JSMEncoding parent2);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var parents = ParentsParameter.ActualValue;
 
@@ -46,5 +46,5 @@
         Cross(RandomParameter.ActualValue, parents[0] as JSMEncoding, parents[1] as JSMEncoding);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/JSMEncoding.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/JSMEncoding.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/JSMEncoding.cs	(revision 10479)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Text;
 using HeuristicLab.Common;
@@ -53,5 +54,5 @@
 
       foreach (Permutation p in JobSequenceMatrix) {
-        sb.Append(p.ToString() + " \n");
+        sb.AppendLine(p.ToString());
       }
 
@@ -59,38 +60,4 @@
       return sb.ToString();
     }
-
-
-    public override bool Equals(object obj) {
-      if (obj.GetType() == typeof(JSMEncoding))
-        return AreEqual(this, obj as JSMEncoding);
-
-      return false;
-    }
-    public override int GetHashCode() {
-      if (JobSequenceMatrix.Count == 1)
-        return JobSequenceMatrix[0].GetHashCode();
-      if (JobSequenceMatrix.Count == 2)
-        return JobSequenceMatrix[0].GetHashCode() ^ JobSequenceMatrix[1].GetHashCode();
-      return 0;
-    }
-    private static bool AreEqual(JSMEncoding jSMEncoding1, JSMEncoding jSMEncoding2) {
-      if (jSMEncoding1.JobSequenceMatrix.Count != jSMEncoding2.JobSequenceMatrix.Count)
-        return false;
-      for (int i = 0; i < jSMEncoding1.JobSequenceMatrix.Count; i++) {
-        if (!AreEqual(jSMEncoding1.JobSequenceMatrix[i], jSMEncoding2.JobSequenceMatrix[i]))
-          return false;
-      }
-      return true;
-    }
-
-    private static bool AreEqual(Permutation p1, Permutation p2) {
-      if (p1.Length != p2.Length)
-        return false;
-      for (int i = 0; i < p1.Length; i++) {
-        if (p1[i] != p2[i])
-          return false;
-      }
-      return true;
-    }
   }
 }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/Manipulators/JSMManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/Manipulators/JSMManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/Manipulators/JSMManipulator.cs	(revision 10479)
@@ -39,9 +39,9 @@
     protected abstract void Manipulate(IRandom random, IScheduleEncoding individual);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = ScheduleEncodingParameter.ActualValue as JSMEncoding;
       if (solution == null) throw new InvalidOperationException("ScheduleEncoding was not found or is not of type JSMEncoding.");
       Manipulate(RandomParameter.ActualValue, solution);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/Crossovers/PWRCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/Crossovers/PWRCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/Crossovers/PWRCrossover.cs	(revision 10479)
@@ -40,5 +40,5 @@
     public abstract PWREncoding Cross(IRandom random, PWREncoding parent1, PWREncoding parent2);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var parents = ParentsParameter.ActualValue;
 
@@ -46,5 +46,5 @@
         Cross(RandomParameter.ActualValue, parents[0] as PWREncoding, parents[1] as PWREncoding);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/Manipulators/PWRManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/Manipulators/PWRManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/Manipulators/PWRManipulator.cs	(revision 10479)
@@ -40,9 +40,9 @@
     protected abstract void Manipulate(IRandom random, PWREncoding individual);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = ScheduleEncodingParameter.ActualValue as PWREncoding;
       if (solution == null) throw new InvalidOperationException("ScheduleEncoding was not found or is not of type PWREncoding.");
       Manipulate(RandomParameter.ActualValue, solution);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/PWREncoding.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/PWREncoding.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/PWREncoding.cs	(revision 10479)
@@ -75,29 +75,4 @@
       return sb.ToString();
     }
-
-    public override bool Equals(object obj) {
-      if (obj.GetType() == typeof(PWREncoding))
-        return AreEqual(this, obj as PWREncoding);
-      else
-        return base.Equals(obj);
-    }
-
-    public override int GetHashCode() {
-      if (PermutationWithRepetition.Length == 1)
-        return PermutationWithRepetition[0].GetHashCode();
-      if (PermutationWithRepetition.Length == 2)
-        return PermutationWithRepetition[0].GetHashCode() ^ PermutationWithRepetition[1].GetHashCode();
-      return 0;
-    }
-
-    private bool AreEqual(PWREncoding pWREncoding1, PWREncoding pWREncoding2) {
-      if (pWREncoding1.PermutationWithRepetition.Length != pWREncoding2.PermutationWithRepetition.Length)
-        return false;
-      for (int i = 0; i < pWREncoding1.PermutationWithRepetition.Length; i++) {
-        if (pWREncoding1.PermutationWithRepetition[i] != pWREncoding2.PermutationWithRepetition[i])
-          return false;
-      }
-      return true;
-    }
   }
 }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/Crossovers/PRVCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/Crossovers/PRVCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/Crossovers/PRVCrossover.cs	(revision 10479)
@@ -40,9 +40,9 @@
     public abstract PRVEncoding Cross(IRandom random, PRVEncoding parent1, PRVEncoding parent2);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var parents = ParentsParameter.ActualValue;
       ChildParameter.ActualValue =
         Cross(RandomParameter.ActualValue, parents[0] as PRVEncoding, parents[1] as PRVEncoding);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/Manipulators/PRVManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/Manipulators/PRVManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/Manipulators/PRVManipulator.cs	(revision 10479)
@@ -39,9 +39,9 @@
     protected abstract void Manipulate(IRandom random, PRVEncoding individual);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = ScheduleEncodingParameter.ActualValue as PRVEncoding;
       if (solution == null) throw new InvalidOperationException("ScheduleEncoding was not found or is not of type PRVEncoding.");
       Manipulate(RandomParameter.ActualValue, solution);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/PRVEncoding.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/PRVEncoding.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/PRVEncoding.cs	(revision 10479)
@@ -74,5 +74,5 @@
 
       foreach (int i in PriorityRulesVector) {
-        sb.Append(i.ToString() + " ");
+        sb.Append(i + " ");
       }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleCreator.cs	(revision 10479)
@@ -29,5 +29,5 @@
   [Item("ScheduleCreator", "Represents the generalized form of creators for Scheduling Problems.")]
   [StorableClass]
-  public abstract class ScheduleCreator : SingleSuccessorOperator, IScheduleCreator {
+  public abstract class ScheduleCreator : InstrumentedOperator, IScheduleCreator {
 
     public ILookupParameter<IScheduleEncoding> ScheduleEncodingParameter {
@@ -43,7 +43,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       ScheduleEncodingParameter.ActualValue = CreateSolution();
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleCrossover.cs	(revision 10479)
@@ -30,5 +30,5 @@
   [Item("ScheduleCrossover", "A scheduling crossover operation.")]
   [StorableClass]
-  public abstract class ScheduleCrossover : SingleSuccessorOperator, IScheduleCrossover, IStochasticOperator {
+  public abstract class ScheduleCrossover : InstrumentedOperator, IScheduleCrossover, IStochasticOperator {
 
     public ILookupParameter<IScheduleEncoding> ChildParameter {
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Crossovers/DirectScheduleCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Crossovers/DirectScheduleCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Crossovers/DirectScheduleCrossover.cs	(revision 10479)
@@ -45,9 +45,9 @@
     public abstract Schedule Cross(IRandom random, Schedule parent1, Schedule parent2);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var parents = ParentsParameter.ActualValue;
       ChildParameter.ActualValue =
         Cross(RandomParameter.ActualValue, parents[0] as Schedule, parents[1] as Schedule);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Job.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Job.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Job.cs	(revision 10479)
@@ -20,6 +20,8 @@
 #endregion
 
+using System;
 using System.ComponentModel;
 using System.Text;
+using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -38,5 +40,8 @@
         bool changed = dueDate != value;
         dueDate = value;
-        if (changed) OnPropertyChanged("DueDate");
+        if (changed) {
+          OnPropertyChanged("DueDate");
+          OnToStringChanged();
+        }
       }
     }
@@ -49,5 +54,8 @@
         bool changed = index != value;
         index = value;
-        if (changed) OnPropertyChanged("Index");
+        if (changed) {
+          OnPropertyChanged("Index");
+          OnToStringChanged();
+        }
       }
     }
@@ -68,14 +76,16 @@
     protected Job(Job original, Cloner cloner)
       : base(original, cloner) {
-      this.DueDate = original.DueDate;
-      this.Index = original.Index;
-      this.Tasks = cloner.Clone(original.Tasks);
+      this.dueDate = original.DueDate;
+      this.index = original.Index;
+      this.tasks = cloner.Clone(original.Tasks);
+      RegisterEventHandlers();
     }
     public Job() : this(-1, double.MaxValue) { }
     public Job(int index, double dueDate)
       : base() {
-      DueDate = dueDate;
-      Index = index;
-      Tasks = new ItemList<Task>();
+      this.dueDate = dueDate;
+      this.index = index;
+      this.tasks = new ItemList<Task>();
+      RegisterEventHandlers();
     }
 
@@ -84,9 +94,46 @@
     }
 
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    private void RegisterEventHandlers() {
+      Tasks.ItemsAdded += TasksOnItemsChanged;
+      Tasks.ItemsRemoved += TasksOnItemsChanged;
+      Tasks.ItemsReplaced += TasksOnItemsChanged;
+      Tasks.CollectionReset += TasksOnItemsChanged;
+      foreach (var task in Tasks) {
+        task.PropertyChanged += TaskOnPropertyChanged;
+        task.ToStringChanged += TaskOnToStringChanged;
+      }
+    }
+
+    private void TasksOnItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<Task>> e) {
+      foreach (var task in e.OldItems) {
+        task.Value.PropertyChanged -= TaskOnPropertyChanged;
+        task.Value.ToStringChanged -= TaskOnToStringChanged;
+      }
+      foreach (var task in e.Items) {
+        task.Value.PropertyChanged += TaskOnPropertyChanged;
+        task.Value.ToStringChanged += TaskOnToStringChanged;
+      }
+      OnTasksChanged();
+      OnToStringChanged();
+    }
+
+    private void TaskOnPropertyChanged(object sender, EventArgs e) {
+      OnTasksChanged();
+    }
+
+    private void TaskOnToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
     public override string ToString() {
       var sb = new StringBuilder();
       sb.Append("Job#" + Index + " [ ");
       foreach (Task t in Tasks) {
-        sb.Append(t.ToString() + " ");
+        sb.Append(t + " ");
       }
       sb.Append("{" + DueDate + "} ");
@@ -100,4 +147,10 @@
     }
 
+    public event EventHandler TasksChanged;
+    protected virtual void OnTasksChanged() {
+      var handler = TasksChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Manipulators/DirectScheduleManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Manipulators/DirectScheduleManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Manipulators/DirectScheduleManipulator.cs	(revision 10479)
@@ -40,9 +40,9 @@
     protected abstract void Manipulate(IRandom random, Schedule individual);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var schedule = ScheduleEncodingParameter.ActualValue as Schedule;
       if (schedule == null) throw new InvalidOperationException("ScheduleEncoding was not found or is not of type Schedule.");
       Manipulate(RandomParameter.ActualValue, schedule);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Resource.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Resource.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Resource.cs	(revision 10479)
@@ -73,36 +73,9 @@
       sb.Append("Resource#" + Index + " [ ");
       foreach (ScheduledTask t in Tasks) {
-        sb.Append(t.ToString() + " ");
+        sb.Append(t+ " ");
       }
       sb.Append("]");
       return sb.ToString();
     }
-
-
-    public override bool Equals(object obj) {
-      if (obj.GetType() == typeof(Resource))
-        return AreEqual(this, obj as Resource);
-      else
-        return false;
-    }
-
-    public override int GetHashCode() {
-      if (Tasks.Count == 1)
-        return Tasks[0].GetHashCode();
-      if (Tasks.Count == 2)
-        return Tasks[0].GetHashCode() ^ Tasks[1].GetHashCode();
-      return 0;
-    }
-
-    private static bool AreEqual(Resource res1, Resource res2) {
-      if (res1.Tasks.Count != res2.Tasks.Count)
-        return false;
-      for (int i = 0; i < res1.Tasks.Count; i++) {
-        if (!res1.Tasks[i].Equals(res2.Tasks[i]))
-          return false;
-      }
-
-      return true;
-    }
   }
 }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Schedule.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Schedule.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Schedule.cs	(revision 10479)
@@ -149,5 +149,5 @@
       sb.Append("[ ");
       foreach (Resource r in Resources) {
-        sb.Append(r.ToString() + " \n");
+        sb.AppendLine(r.ToString());
       }
       sb.Append("]");
@@ -164,30 +164,4 @@
       return quality;
     }
-
-    public override bool Equals(object obj) {
-      if (obj.GetType() == typeof(Schedule))
-        return AreEqual(this, obj as Schedule);
-      else
-        return false;
-    }
-    public override int GetHashCode() {
-      if (Resources.Count == 1)
-        return Resources[0].GetHashCode();
-      if (Resources.Count == 2)
-        return Resources[0].GetHashCode() ^ Resources[1].GetHashCode();
-      return 0;
-    }
-
-    private static bool AreEqual(Schedule schedule1, Schedule schedule2) {
-      if (schedule1.Resources.Count != schedule2.Resources.Count)
-        return false;
-      for (int i = 0; i < schedule1.Resources.Count; i++) {
-        if (!schedule1.Resources[i].Equals(schedule2.Resources[i]))
-          return false;
-      }
-
-      return true;
-    }
-
   }
 }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/ScheduledTask.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/ScheduledTask.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/ScheduledTask.cs	(revision 10479)
@@ -75,25 +75,4 @@
       return sb.ToString();
     }
-
-    public override bool Equals(object obj) {
-      if (obj.GetType() == typeof(ScheduledTask))
-        return AreEqual(this, obj as ScheduledTask);
-      else
-        return false;
-    }
-
-    public override int GetHashCode() {
-      return TaskNr ^ JobNr;
-    }
-
-    public static bool AreEqual(ScheduledTask task1, ScheduledTask task2) {
-      return (
-        task1.TaskNr == task2.TaskNr &&
-        task1.Duration == task2.Duration &&
-        task1.JobNr == task2.JobNr &&
-        task1.ResourceNr == task2.ResourceNr &&
-        task1.StartTime == task2.StartTime &&
-        task1.EndTime == task2.EndTime);
-    }
   }
 }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Task.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Task.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Task.cs	(revision 10479)
@@ -38,5 +38,8 @@
         bool changed = taskNr != value;
         taskNr = value;
-        if (changed) OnPropertyChanged("TaskNr");
+        if (changed) {
+          OnPropertyChanged("TaskNr");
+          OnToStringChanged();
+        }
       }
     }
@@ -48,5 +51,8 @@
         bool changed = resourceNr != value;
         resourceNr = value;
-        if (changed) OnPropertyChanged("ResourceNr");
+        if (changed) {
+          OnPropertyChanged("ResourceNr");
+          OnToStringChanged();
+        }
       }
     }
@@ -89,18 +95,18 @@
     protected Task(Task original, Cloner cloner)
       : base(original, cloner) {
-      this.ResourceNr = original.ResourceNr;
-      this.JobNr = original.JobNr;
-      this.Duration = original.Duration;
-      this.TaskNr = original.TaskNr;
-      this.IsScheduled = original.IsScheduled;
+      this.resourceNr = original.ResourceNr;
+      this.jobNr = original.JobNr;
+      this.duration = original.Duration;
+      this.taskNr = original.TaskNr;
+      this.isScheduled = original.IsScheduled;
     }
     public Task() : this(-1, -1, -1, 0) { }
     public Task(int taskNr, int resNr, int jobNr, double duration)
       : base() {
-      Duration = duration;
-      ResourceNr = resNr;
-      JobNr = jobNr;
-      TaskNr = taskNr;
-      IsScheduled = false;
+      this.duration = duration;
+      this.resourceNr = resNr;
+      this.jobNr = jobNr;
+      this.taskNr = taskNr;
+      this.isScheduled = false;
     }
 
@@ -115,23 +121,4 @@
     }
 
-    public override bool Equals(object obj) {
-      if (obj.GetType() == typeof(Task))
-        return AreEqual(this, obj as Task);
-      else
-        return false;
-    }
-
-    public override int GetHashCode() {
-      return TaskNr ^ JobNr;
-    }
-
-    public static bool AreEqual(Task task1, Task task2) {
-      return (task1.Duration == task2.Duration &&
-        task1.IsScheduled == task2.IsScheduled &&
-        task1.JobNr == task2.JobNr &&
-        task1.ResourceNr == task2.ResourceNr &&
-        task1.TaskNr == task2.TaskNr);
-    }
-
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleManipulator.cs	(revision 10479)
@@ -30,5 +30,5 @@
   [Item("ScheduleManipulator", "A scheduling manipulation operation.")]
   [StorableClass]
-  public abstract class ScheduleManipulator : SingleSuccessorOperator, IScheduleManipulator, IStochasticOperator {
+  public abstract class ScheduleManipulator : InstrumentedOperator, IScheduleManipulator, IStochasticOperator {
 
     public ILookupParameter<IScheduleEncoding> ScheduleEncodingParameter {
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/ArchitectureManipulators/MultiSymbolicExpressionTreeArchitectureManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/ArchitectureManipulators/MultiSymbolicExpressionTreeArchitectureManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/ArchitectureManipulators/MultiSymbolicExpressionTreeArchitectureManipulator.cs	(revision 10479)
@@ -106,4 +106,6 @@
       Operators = checkedItemList.AsReadOnly();
       Operators_ItemsAdded(this, new CollectionItemsChangedEventArgs<IndexedItem<ISymbolicExpressionTreeManipulator>>(Operators.CheckedItems));
+
+      SelectedOperatorParameter.ActualName = "SelectedManipulationOperator";
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/FullTreeCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/FullTreeCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/FullTreeCreator.cs	(revision 10479)
@@ -94,5 +94,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (ClonedSymbolicExpressionTreeGrammarParameter.ActualValue == null) {
         SymbolicExpressionTreeGrammarParameter.ActualValue.ReadOnly = true;
@@ -104,5 +104,5 @@
           (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone()));
       }
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/GrowTreeCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/GrowTreeCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/GrowTreeCreator.cs	(revision 10479)
@@ -94,5 +94,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (ClonedSymbolicExpressionTreeGrammarParameter.ActualValue == null) {
         SymbolicExpressionTreeGrammarParameter.ActualValue.ReadOnly = true;
@@ -104,5 +104,5 @@
           (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone()));
       }
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/ProbabilisticTreeCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/ProbabilisticTreeCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/ProbabilisticTreeCreator.cs	(revision 10479)
@@ -87,5 +87,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (ClonedSymbolicExpressionTreeGrammarParameter.ActualValue == null) {
         SymbolicExpressionTreeGrammarParameter.ActualValue.ReadOnly = true;
@@ -96,5 +96,5 @@
         globalScope.Variables.Add(new Variable(ClonedSymbolicExpressionTreeGrammarParameterName, (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone()));
       }
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/RampedHalfAndHalfTreeCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/RampedHalfAndHalfTreeCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/RampedHalfAndHalfTreeCreator.cs	(revision 10479)
@@ -95,5 +95,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (ClonedSymbolicExpressionTreeGrammarParameter.ActualValue == null) {
         SymbolicExpressionTreeGrammarParameter.ActualValue.ReadOnly = true;
@@ -105,5 +105,5 @@
           (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone()));
       }
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/SymbolicExpressionTreeCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/SymbolicExpressionTreeCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/SymbolicExpressionTreeCreator.cs	(revision 10479)
@@ -54,7 +54,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       SymbolicExpressionTree = Create(Random);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SymbolicExpressionTreeCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SymbolicExpressionTreeCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SymbolicExpressionTreeCrossover.cs	(revision 10479)
@@ -63,5 +63,5 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       if (Parents.Length != 2)
         throw new ArgumentException("Number of parents must be exactly two for symbolic expression tree crossover operators.");
@@ -70,5 +70,5 @@
 
       Child = result;
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/MultiSymbolicExpressionTreeManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/MultiSymbolicExpressionTreeManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/MultiSymbolicExpressionTreeManipulator.cs	(revision 10479)
@@ -83,4 +83,6 @@
       Operators = checkedItemList.AsReadOnly();
       Operators_ItemsAdded(this, new CollectionItemsChangedEventArgs<IndexedItem<ISymbolicExpressionTreeManipulator>>(Operators.CheckedItems));
+
+      SelectedOperatorParameter.ActualName = "SelectedManipulationOperator";
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/SymbolicExpressionTreeManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/SymbolicExpressionTreeManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/SymbolicExpressionTreeManipulator.cs	(revision 10479)
@@ -22,5 +22,4 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -55,9 +54,9 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       ISymbolicExpressionTree tree = SymbolicExpressionTreeParameter.ActualValue;
       Manipulate(RandomParameter.ActualValue, tree);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeOperator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeOperator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeOperator.cs	(revision 10479)
@@ -34,5 +34,5 @@
   [Item("SymbolicExpressionTreeOperator", "A base class for operators for symbolic expression trees.")]
   [StorableClass]
-  public abstract class SymbolicExpressionTreeOperator : SingleSuccessorOperator, IStochasticOperator, ISymbolicExpressionTreeOperator {
+  public abstract class SymbolicExpressionTreeOperator : InstrumentedOperator, IStochasticOperator, ISymbolicExpressionTreeOperator {
     private const string RandomParameterName = "Random";
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/HeuristicLab.HLScript.Views-3.3.csproj
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/HeuristicLab.HLScript.Views-3.3.csproj	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/HeuristicLab.HLScript.Views-3.3.csproj	(revision 10479)
@@ -0,0 +1,180 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{0C2917C8-7AA8-4E18-800A-C4D064F992ED}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.HLScript.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.HLScript.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="ScriptView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ScriptView.Designer.cs">
+      <DependentUpon>ScriptView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="VariableStoreView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariableStoreView.Designer.cs">
+      <DependentUpon>VariableStoreView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.CodeEditor\3.3\HeuristicLab.CodeEditor-3.3.csproj">
+      <Project>{489cfe09-fdf7-4c89-bab5-bd09cadd61ad}</Project>
+      <Name>HeuristicLab.CodeEditor-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core.Views\3.3\HeuristicLab.Core.Views-3.3.csproj">
+      <Project>{e226881d-315f-423d-b419-a766fe0d8685}</Project>
+      <Name>HeuristicLab.Core.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{c36bd924-a541-4a00-afa8-41701378ddc5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.HLScript\3.3\HeuristicLab.HLScript-3.3.csproj">
+      <Project>{21977cc3-1757-4b3b-87bd-ff817aaa900f}</Project>
+      <Name>HeuristicLab.HLScript-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.3\HeuristicLab.MainForm.WindowsForms-3.3.csproj">
+      <Project>{ab687bbe-1bfe-476b-906d-44237135431d}</Project>
+      <Name>HeuristicLab.MainForm.WindowsForms-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm\3.3\HeuristicLab.MainForm-3.3.csproj">
+      <Project>{3bd61258-31da-4b09-89c0-4f71fef5f05a}</Project>
+      <Name>HeuristicLab.MainForm-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/Plugin.cs.frame
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/Plugin.cs.frame	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/Plugin.cs.frame	(revision 10479)
@@ -0,0 +1,39 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.HLScript.Views {
+  [Plugin("HeuristicLab.HLScript.Views", "3.3.9.$WCREV$")]
+  [PluginFile("HeuristicLab.HLScript.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.CodeEditor", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.HLScript", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  public class HeuristicLabHLScriptViewsPlugin : PluginBase {
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 10479)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.HLScript.Views")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2013 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("78ef015f-0dd7-4dea-9808-a605fe30fbd3")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.9.$WCREV$")]
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/ScriptView.Designer.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/ScriptView.Designer.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/ScriptView.Designer.cs	(revision 10479)
@@ -0,0 +1,327 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.HLScript.Views {
+  partial class ScriptView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.compilationLabel = new System.Windows.Forms.Label();
+      this.startStopButton = new System.Windows.Forms.Button();
+      this.errorListView = new System.Windows.Forms.ListView();
+      this.categoryColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.errorNumberColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.lineColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.columnColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.descriptionColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.codeEditor = new HeuristicLab.CodeEditor.CodeEditor();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.tabControl1 = new System.Windows.Forms.TabControl();
+      this.errorListTabPage = new System.Windows.Forms.TabPage();
+      this.outputTabPage = new System.Windows.Forms.TabPage();
+      this.outputTextBox = new System.Windows.Forms.TextBox();
+      this.variableStoreView = new HeuristicLab.HLScript.Views.VariableStoreView();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
+      this.splitContainer2.Panel1.SuspendLayout();
+      this.splitContainer2.Panel2.SuspendLayout();
+      this.splitContainer2.SuspendLayout();
+      this.tabControl1.SuspendLayout();
+      this.errorListTabPage.SuspendLayout();
+      this.outputTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(60, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(750, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(816, 4);
+      // 
+      // compilationLabel
+      // 
+      this.compilationLabel.AutoSize = true;
+      this.compilationLabel.ForeColor = System.Drawing.SystemColors.ControlDarkDark;
+      this.compilationLabel.Location = new System.Drawing.Point(33, 32);
+      this.compilationLabel.Name = "compilationLabel";
+      this.compilationLabel.Size = new System.Drawing.Size(69, 13);
+      this.compilationLabel.TabIndex = 3;
+      this.compilationLabel.Text = "Not compiled";
+      // 
+      // startStopButton
+      // 
+      this.startStopButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Play;
+      this.startStopButton.Location = new System.Drawing.Point(3, 26);
+      this.startStopButton.Name = "startStopButton";
+      this.startStopButton.Size = new System.Drawing.Size(24, 24);
+      this.startStopButton.TabIndex = 1;
+      this.startStopButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.startStopButton, "Run (F5)");
+      this.startStopButton.UseVisualStyleBackColor = true;
+      this.startStopButton.Click += new System.EventHandler(this.startStopButton_Click);
+      // 
+      // errorListView
+      // 
+      this.errorListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.categoryColumnHeader,
+            this.errorNumberColumnHeader,
+            this.lineColumnHeader,
+            this.columnColumnHeader,
+            this.descriptionColumnHeader});
+      this.errorListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.errorListView.FullRowSelect = true;
+      this.errorListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+      this.errorListView.HideSelection = false;
+      this.errorListView.Location = new System.Drawing.Point(3, 3);
+      this.errorListView.Name = "errorListView";
+      this.errorListView.Size = new System.Drawing.Size(623, 79);
+      this.errorListView.TabIndex = 0;
+      this.errorListView.UseCompatibleStateImageBehavior = false;
+      this.errorListView.View = System.Windows.Forms.View.Details;
+      // 
+      // categoryColumnHeader
+      // 
+      this.categoryColumnHeader.Text = "Category";
+      // 
+      // errorNumberColumnHeader
+      // 
+      this.errorNumberColumnHeader.Text = "Error Number";
+      this.errorNumberColumnHeader.Width = 78;
+      // 
+      // lineColumnHeader
+      // 
+      this.lineColumnHeader.Text = "Line";
+      this.lineColumnHeader.Width = 50;
+      // 
+      // columnColumnHeader
+      // 
+      this.columnColumnHeader.Text = "Column";
+      this.columnColumnHeader.Width = 50;
+      // 
+      // descriptionColumnHeader
+      // 
+      this.descriptionColumnHeader.Text = "Description";
+      this.descriptionColumnHeader.Width = 600;
+      // 
+      // codeEditor
+      // 
+      this.codeEditor.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.codeEditor.Location = new System.Drawing.Point(0, 0);
+      this.codeEditor.Name = "codeEditor";
+      this.codeEditor.Prefix = "";
+      this.codeEditor.Size = new System.Drawing.Size(637, 428);
+      this.codeEditor.Suffix = "";
+      this.codeEditor.TabIndex = 0;
+      this.codeEditor.UserCode = "";
+      this.codeEditor.TextEditorTextChanged += new System.EventHandler(this.codeEditor_TextEditorTextChanged);
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.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.splitContainer1.Location = new System.Drawing.Point(3, 56);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.splitContainer2);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.variableStoreView);
+      this.splitContainer1.Panel2.Controls.Add(this.viewHost);
+      this.splitContainer1.Size = new System.Drawing.Size(829, 543);
+      this.splitContainer1.SplitterDistance = 637;
+      this.splitContainer1.TabIndex = 7;
+      // 
+      // splitContainer2
+      // 
+      this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer2.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer2.Name = "splitContainer2";
+      this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer2.Panel1
+      // 
+      this.splitContainer2.Panel1.Controls.Add(this.codeEditor);
+      // 
+      // splitContainer2.Panel2
+      // 
+      this.splitContainer2.Panel2.Controls.Add(this.tabControl1);
+      this.splitContainer2.Size = new System.Drawing.Size(637, 543);
+      this.splitContainer2.SplitterDistance = 428;
+      this.splitContainer2.TabIndex = 5;
+      // 
+      // tabControl1
+      // 
+      this.tabControl1.Controls.Add(this.errorListTabPage);
+      this.tabControl1.Controls.Add(this.outputTabPage);
+      this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl1.Location = new System.Drawing.Point(0, 0);
+      this.tabControl1.Name = "tabControl1";
+      this.tabControl1.SelectedIndex = 0;
+      this.tabControl1.Size = new System.Drawing.Size(637, 111);
+      this.tabControl1.TabIndex = 1;
+      // 
+      // errorListTabPage
+      // 
+      this.errorListTabPage.Controls.Add(this.errorListView);
+      this.errorListTabPage.Location = new System.Drawing.Point(4, 22);
+      this.errorListTabPage.Name = "errorListTabPage";
+      this.errorListTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.errorListTabPage.Size = new System.Drawing.Size(629, 85);
+      this.errorListTabPage.TabIndex = 0;
+      this.errorListTabPage.Text = "Error List";
+      this.errorListTabPage.UseVisualStyleBackColor = true;
+      // 
+      // outputTabPage
+      // 
+      this.outputTabPage.Controls.Add(this.outputTextBox);
+      this.outputTabPage.Location = new System.Drawing.Point(4, 22);
+      this.outputTabPage.Name = "outputTabPage";
+      this.outputTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.outputTabPage.Size = new System.Drawing.Size(629, 85);
+      this.outputTabPage.TabIndex = 1;
+      this.outputTabPage.Text = "Output";
+      this.outputTabPage.UseVisualStyleBackColor = true;
+      // 
+      // outputTextBox
+      // 
+      this.outputTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.outputTextBox.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.outputTextBox.Location = new System.Drawing.Point(3, 3);
+      this.outputTextBox.Multiline = true;
+      this.outputTextBox.Name = "outputTextBox";
+      this.outputTextBox.ReadOnly = true;
+      this.outputTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+      this.outputTextBox.Size = new System.Drawing.Size(623, 79);
+      this.outputTextBox.TabIndex = 0;
+      this.outputTextBox.WordWrap = false;
+      // 
+      // variableStoreView
+      // 
+      this.variableStoreView.Caption = "ItemCollection View";
+      this.variableStoreView.Content = null;
+      this.variableStoreView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableStoreView.Location = new System.Drawing.Point(0, 0);
+      this.variableStoreView.Name = "variableStoreView";
+      this.variableStoreView.ReadOnly = false;
+      this.variableStoreView.Size = new System.Drawing.Size(188, 543);
+      this.variableStoreView.TabIndex = 0;
+      // 
+      // viewHost
+      // 
+      this.viewHost.Caption = "View";
+      this.viewHost.Content = null;
+      this.viewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.viewHost.Enabled = false;
+      this.viewHost.Location = new System.Drawing.Point(0, 0);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(188, 543);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewsLabelVisible = true;
+      this.viewHost.ViewType = null;
+      // 
+      // ScriptView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.splitContainer1);
+      this.Controls.Add(this.startStopButton);
+      this.Controls.Add(this.compilationLabel);
+      this.Name = "ScriptView";
+      this.Size = new System.Drawing.Size(835, 602);
+      this.Controls.SetChildIndex(this.compilationLabel, 0);
+      this.Controls.SetChildIndex(this.startStopButton, 0);
+      this.Controls.SetChildIndex(this.splitContainer1, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+      this.splitContainer1.ResumeLayout(false);
+      this.splitContainer2.Panel1.ResumeLayout(false);
+      this.splitContainer2.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();
+      this.splitContainer2.ResumeLayout(false);
+      this.tabControl1.ResumeLayout(false);
+      this.errorListTabPage.ResumeLayout(false);
+      this.outputTabPage.ResumeLayout(false);
+      this.outputTabPage.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label compilationLabel;
+    private System.Windows.Forms.Button startStopButton;
+    private System.Windows.Forms.ListView errorListView;
+    private System.Windows.Forms.ColumnHeader descriptionColumnHeader;
+    private System.Windows.Forms.ColumnHeader lineColumnHeader;
+    private System.Windows.Forms.ColumnHeader columnColumnHeader;
+    private CodeEditor.CodeEditor codeEditor;
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.SplitContainer splitContainer2;
+    private MainForm.WindowsForms.ViewHost viewHost;
+    private VariableStoreView variableStoreView;
+    private System.Windows.Forms.ColumnHeader errorNumberColumnHeader;
+    private System.Windows.Forms.ColumnHeader categoryColumnHeader;
+    private System.Windows.Forms.TabControl tabControl1;
+    private System.Windows.Forms.TabPage errorListTabPage;
+    private System.Windows.Forms.TabPage outputTabPage;
+    private System.Windows.Forms.TextBox outputTextBox;
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/ScriptView.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/ScriptView.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/ScriptView.cs	(revision 10479)
@@ -0,0 +1,211 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.CodeDom.Compiler;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.HLScript.Views {
+
+  [View("Script View")]
+  [Content(typeof(Script), true)]
+  public partial class ScriptView : NamedItemView {
+    private bool running;
+
+    public new Script Content {
+      get { return (Script)base.Content; }
+      set { base.Content = (Script)value; }
+    }
+
+    public ScriptView() {
+      InitializeComponent();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.CodeChanged += Content_CodeChanged;
+      Content.ScriptExecutionStarted += Content_ScriptExecutionStarted;
+      Content.ScriptExecutionFinished += Content_ScriptExecutionFinished;
+      Content.ConsoleOutputChanged += Content_ConsoleOutputChanged;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.CodeChanged -= Content_CodeChanged;
+      Content.ScriptExecutionStarted -= Content_ScriptExecutionStarted;
+      Content.ScriptExecutionFinished -= Content_ScriptExecutionFinished;
+      Content.ConsoleOutputChanged -= Content_ConsoleOutputChanged;
+      base.DeregisterContentEvents();
+    }
+
+    #region Content event handlers
+    private void Content_CodeChanged(object sender, EventArgs e) {
+      codeEditor.UserCode = Content.Code;
+    }
+    private void Content_ScriptExecutionStarted(object sender, EventArgs e) {
+      Locked = true;
+      ReadOnly = true;
+      startStopButton.Image = VSImageLibrary.Stop;
+    }
+    private void Content_ScriptExecutionFinished(object sender, EventArgs e) {
+      Locked = false;
+      ReadOnly = false;
+      startStopButton.Image = VSImageLibrary.Play;
+      running = false;
+    }
+    private void Content_ConsoleOutputChanged(object sender, EventArgs<string> e) {
+      if (InvokeRequired) Invoke((Action<object, EventArgs<string>>)Content_ConsoleOutputChanged, sender, e);
+      else {
+        outputTextBox.AppendText(e.Value);
+      }
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        codeEditor.UserCode = string.Empty;
+        variableStoreView.Content = null;
+      } else {
+        codeEditor.UserCode = Content.Code;
+        foreach (var asm in Content.GetAssemblies())
+          codeEditor.AddAssembly(asm);
+        variableStoreView.Content = Content.VariableStore;
+        if (Content.CompileErrors == null) {
+          compilationLabel.ForeColor = SystemColors.ControlDarkDark;
+          compilationLabel.Text = "Not compiled";
+        } else if (Content.CompileErrors.HasErrors) {
+          compilationLabel.ForeColor = Color.DarkRed;
+          compilationLabel.Text = "Compilation failed";
+        } else {
+          compilationLabel.ForeColor = Color.DarkGreen;
+          compilationLabel.Text = "Compilation successful";
+        }
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      startStopButton.Enabled = Content != null && (!Locked || running);
+      codeEditor.Enabled = Content != null && !Locked && !ReadOnly;
+    }
+
+    #region Child Control event handlers
+    private void startStopButton_Click(object sender, EventArgs e) {
+      if (running) {
+        Content.Kill();
+      } else
+        if (Compile()) {
+          outputTextBox.Clear();
+          Content.Execute();
+          running = true;
+        }
+    }
+
+    private void codeEditor_TextEditorTextChanged(object sender, EventArgs e) {
+      Content.Code = codeEditor.UserCode;
+    }
+    #endregion
+
+    #region global HotKeys
+    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
+      if (keyData == Keys.F5) {
+        if (Content == null || Locked)
+          return base.ProcessCmdKey(ref msg, keyData);
+        outputTextBox.Clear();
+        bool result = Compile();
+        if (result) {
+          outputTextBox.Clear();
+          Content.Execute();
+          running = true;
+        }
+        return true;
+      } else if (keyData == (Keys.F5 | Keys.Shift)) {
+        Content.Kill();
+      }
+      return base.ProcessCmdKey(ref msg, keyData);
+    }
+    #endregion
+
+    #region Auxiliary functions
+    private bool Compile() {
+      ReadOnly = true;
+      Locked = true;
+      errorListView.Items.Clear();
+      outputTextBox.Clear();
+      outputTextBox.AppendText("Compiling ... ");
+      try {
+        Content.Compile();
+        outputTextBox.AppendText("Compilation succeeded.");
+        return true;
+      } catch {
+        outputTextBox.AppendText("Compilation failed.");
+        ShowCompilationErrors();
+        return false;
+      } finally {
+        OnContentChanged();
+        ReadOnly = false;
+        Locked = false;
+      }
+    }
+    #endregion
+
+    private void ShowCompilationErrors() {
+      if (Content.CompileErrors.Count == 0) return;
+      var warnings = new List<CompilerError>();
+      var errors = new List<CompilerError>();
+      foreach (CompilerError ce in Content.CompileErrors) {
+        if (ce.IsWarning) warnings.Add(ce);
+        else errors.Add(ce);
+      }
+      var msgs = warnings.OrderBy(x => x.Line)
+                         .ThenBy(x => x.Column)
+                   .Concat(errors.OrderBy(x => x.Line)
+                                 .ThenBy(x => x.Column));
+      outputTextBox.AppendText(Environment.NewLine);
+      outputTextBox.AppendText("---");
+      outputTextBox.AppendText(Environment.NewLine);
+      foreach (var m in msgs) {
+        var item = new ListViewItem(new[] {
+          m.IsWarning ? "Warning" : "Error",
+          m.ErrorNumber,
+          m.Line.ToString(),
+          m.Column.ToString(),
+          m.ErrorText
+        });
+        errorListView.Items.Add(item);
+        outputTextBox.AppendText(string.Format("{0} {1} ({2}:{3}): {4}",
+                                 item.SubItems[0].Text,
+                                 item.SubItems[1].Text,
+                                 item.SubItems[2].Text,
+                                 item.SubItems[3].Text,
+                                 item.SubItems[4].Text));
+        outputTextBox.AppendText(Environment.NewLine);
+      }
+    }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/VariableStoreView.Designer.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/VariableStoreView.Designer.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/VariableStoreView.Designer.cs	(revision 10479)
@@ -0,0 +1,189 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Windows.Forms;
+
+namespace HeuristicLab.HLScript.Views {
+  partial class VariableStoreView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.variableListView = new System.Windows.Forms.ListView();
+      this.nameColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.valueColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.typeColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.sortDescendingButton = new System.Windows.Forms.Button();
+      this.sortAscendingButton = new System.Windows.Forms.Button();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.addButton = new System.Windows.Forms.Button();
+      this.variablesGroupBox = new System.Windows.Forms.GroupBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.variablesGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // variableListView
+      // 
+      this.variableListView.AllowDrop = true;
+      this.variableListView.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.variableListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameColumnHeader,
+            this.valueColumnHeader,
+            this.typeColumnHeader});
+      this.variableListView.FullRowSelect = true;
+      this.variableListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+      this.variableListView.HideSelection = false;
+      this.variableListView.LabelEdit = true;
+      this.variableListView.Location = new System.Drawing.Point(6, 49);
+      this.variableListView.MultiSelect = false;
+      this.variableListView.Name = "variableListView";
+      this.variableListView.ShowItemToolTips = true;
+      this.variableListView.Size = new System.Drawing.Size(224, 395);
+      this.variableListView.SmallImageList = this.imageList;
+      this.variableListView.TabIndex = 5;
+      this.variableListView.UseCompatibleStateImageBehavior = false;
+      this.variableListView.View = System.Windows.Forms.View.Details;
+      this.variableListView.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.variableListView_AfterLabelEdit);
+      this.variableListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.variableListView_ItemDrag);
+      this.variableListView.SelectedIndexChanged += new System.EventHandler(this.variableListView_SelectedIndexChanged);
+      this.variableListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.variableListView_DragDrop);
+      this.variableListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.variableListView_DragEnter);
+      this.variableListView.DragOver += new System.Windows.Forms.DragEventHandler(this.variableListView_DragOver);
+      this.variableListView.DoubleClick += new System.EventHandler(this.variableListView_DoubleClick);
+      this.variableListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.variableListView_KeyDown);
+      // 
+      // nameColumnHeader
+      // 
+      this.nameColumnHeader.Text = "Name";
+      // 
+      // valueColumnHeader
+      // 
+      this.valueColumnHeader.Text = "Value";
+      // 
+      // typeColumnHeader
+      // 
+      this.typeColumnHeader.Text = "Type";
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // sortDescendingButton
+      // 
+      this.sortDescendingButton.Enabled = false;
+      this.sortDescendingButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.SortUp;
+      this.sortDescendingButton.Location = new System.Drawing.Point(36, 19);
+      this.sortDescendingButton.Name = "sortDescendingButton";
+      this.sortDescendingButton.Size = new System.Drawing.Size(24, 24);
+      this.sortDescendingButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.sortDescendingButton, "Sort Descending");
+      this.sortDescendingButton.UseVisualStyleBackColor = true;
+      this.sortDescendingButton.Click += new System.EventHandler(this.sortDescendingButton_Click);
+      // 
+      // sortAscendingButton
+      // 
+      this.sortAscendingButton.Enabled = false;
+      this.sortAscendingButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Sort;
+      this.sortAscendingButton.Location = new System.Drawing.Point(66, 19);
+      this.sortAscendingButton.Name = "sortAscendingButton";
+      this.sortAscendingButton.Size = new System.Drawing.Size(24, 24);
+      this.sortAscendingButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.sortAscendingButton, "Sort Ascending");
+      this.sortAscendingButton.UseVisualStyleBackColor = true;
+      this.sortAscendingButton.Click += new System.EventHandler(this.sortAscendingButton_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.removeButton.Location = new System.Drawing.Point(96, 19);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(24, 24);
+      this.removeButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.removeButton, "Remove");
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // addButton
+      // 
+      this.addButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Add;
+      this.addButton.Location = new System.Drawing.Point(6, 19);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(24, 24);
+      this.addButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.addButton, "Add");
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // variablesGroupBox
+      // 
+      this.variablesGroupBox.Controls.Add(this.variableListView);
+      this.variablesGroupBox.Controls.Add(this.addButton);
+      this.variablesGroupBox.Controls.Add(this.sortDescendingButton);
+      this.variablesGroupBox.Controls.Add(this.removeButton);
+      this.variablesGroupBox.Controls.Add(this.sortAscendingButton);
+      this.variablesGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variablesGroupBox.Name = "variablesGroupBox";
+      this.variablesGroupBox.Size = new System.Drawing.Size(236, 450);
+      this.variablesGroupBox.TabIndex = 0;
+      this.variablesGroupBox.TabStop = false;
+      this.variablesGroupBox.Text = "Variables";
+      // 
+      // VariableStoreView
+      // 
+      this.Controls.Add(this.variablesGroupBox);
+      this.Name = "VariableStoreView";
+      this.Size = new System.Drawing.Size(236, 450);
+      this.variablesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.ColumnHeader nameColumnHeader;
+    protected GroupBox variablesGroupBox;
+    protected ListView variableListView;
+    protected Button addButton;
+    protected Button removeButton;
+    protected ToolTip toolTip;
+    protected ImageList imageList;
+    protected Button sortAscendingButton;
+    protected Button sortDescendingButton;
+    private ColumnHeader valueColumnHeader;
+    private ColumnHeader typeColumnHeader;
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/VariableStoreView.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/VariableStoreView.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript.Views/3.3/VariableStoreView.cs	(revision 10479)
@@ -0,0 +1,450 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Persistence.Core;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.HLScript.Views {
+  [View("ItemCollection View")]
+  [Content(typeof(VariableStore), true)]
+  public partial class VariableStoreView : AsynchronousContentView {
+    protected Dictionary<string, ListViewItem> itemListViewItemMapping;
+    protected TypeSelectorDialog typeSelectorDialog;
+    protected bool validDragOperation;
+
+    public new VariableStore Content {
+      get { return (VariableStore)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ListView ItemsListView {
+      get { return variableListView; }
+    }
+
+    public VariableStoreView() {
+      InitializeComponent();
+      itemListViewItemMapping = new Dictionary<string, ListViewItem>();
+      variableListView.SmallImageList.Images.AddRange(new Image[] {
+        HeuristicLab.Common.Resources.VSImageLibrary.Error,
+        HeuristicLab.Common.Resources.VSImageLibrary.Object,
+        HeuristicLab.Common.Resources.VSImageLibrary.Nothing
+      });
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ItemsAdded -= Content_ItemsAdded;
+      Content.ItemsReplaced -= Content_ItemsReplaced;
+      Content.ItemsRemoved -= Content_ItemsRemoved;
+      Content.CollectionReset -= Content_CollectionReset;
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsAdded += Content_ItemsAdded;
+      Content.ItemsReplaced += Content_ItemsReplaced;
+      Content.ItemsRemoved += Content_ItemsRemoved;
+      Content.CollectionReset += Content_CollectionReset;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      variableListView.Items.Clear();
+      itemListViewItemMapping.Clear();
+      RebuildImageList();
+      if (Content != null) {
+        Caption += " (" + Content.GetType().Name + ")";
+        foreach (var item in Content)
+          AddVariable(item);
+        AdjustListViewColumnSizes();
+        SortItemsListView(SortOrder.Ascending);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content == null) {
+        addButton.Enabled = false;
+        sortAscendingButton.Enabled = false;
+        sortDescendingButton.Enabled = false;
+        removeButton.Enabled = false;
+        variableListView.Enabled = false;
+      } else {
+        addButton.Enabled = !Locked && !ReadOnly;
+        sortAscendingButton.Enabled = variableListView.Items.Count > 1;
+        sortDescendingButton.Enabled = variableListView.Items.Count > 1;
+        removeButton.Enabled = !Locked && !ReadOnly && variableListView.SelectedItems.Count > 0;
+        variableListView.Enabled = true;
+        variableListView.LabelEdit = !Locked && !ReadOnly;
+      }
+    }
+
+    protected virtual object CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog { Caption = "Select Item" };
+        typeSelectorDialog.TypeSelector.Caption = "Available Items";
+        typeSelectorDialog.TypeSelector.Configure(typeof(IItem), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (object)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        } catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+
+    protected virtual void AddVariable(KeyValuePair<string, object> variable) {
+      if (string.IsNullOrEmpty(variable.Key)) throw new ArgumentException("The variable must have a name.", "variable");
+      string value = (variable.Value ?? "null").ToString();
+      string type = variable.Value == null ? "null" : variable.Value.GetType().ToString();
+      bool serializable = IsSerializable(variable);
+      var listViewItem = new ListViewItem(new[] { variable.Key, value, type }) { ToolTipText = GetToolTipText(variable, serializable), Tag = variable };
+      if (serializable) {
+        listViewItem.ImageIndex = variable.Value == null ? 2 : 1;
+      } else listViewItem.ImageIndex = 0;
+      variableListView.Items.Add(listViewItem);
+      itemListViewItemMapping[variable.Key] = listViewItem;
+      sortAscendingButton.Enabled = variableListView.Items.Count > 1;
+      sortDescendingButton.Enabled = variableListView.Items.Count > 1;
+      var item = variable.Value as IItem;
+      if (item != null) item.ToStringChanged += item_ToStringChanged;
+    }
+
+    protected virtual void RemoveVariable(KeyValuePair<string, object> variable) {
+      if (string.IsNullOrEmpty(variable.Key)) throw new ArgumentException("The variable must have a name.", "variable");
+      ListViewItem listViewItem;
+      if (itemListViewItemMapping.TryGetValue(variable.Key, out listViewItem)) {
+        itemListViewItemMapping.Remove(variable.Key);
+        variableListView.Items.Remove(listViewItem);
+        sortAscendingButton.Enabled = variableListView.Items.Count > 1;
+        sortDescendingButton.Enabled = variableListView.Items.Count > 1;
+        var item = variable.Value as IItem;
+        if (item != null) item.ToStringChanged -= item_ToStringChanged;
+      }
+    }
+
+    protected virtual void UpdateVariable(KeyValuePair<string, object> variable) {
+      if (string.IsNullOrEmpty(variable.Key)) throw new ArgumentException("The variable must have a name.", "variable");
+      ListViewItem listViewItem;
+      if (itemListViewItemMapping.TryGetValue(variable.Key, out listViewItem)) {
+        string value = (variable.Value ?? "null").ToString();
+        string type = variable.Value == null ? "null" : variable.Value.GetType().ToString();
+        bool serializable = IsSerializable(variable);
+        if (serializable) {
+          listViewItem.ImageIndex = variable.Value == null ? 2 : 1;
+        } else listViewItem.ImageIndex = 0;
+        listViewItem.SubItems[1].Text = value;
+        listViewItem.SubItems[2].Text = type;
+        listViewItem.ToolTipText = GetToolTipText(variable, serializable);
+        listViewItem.Tag = variable;
+      } else throw new ArgumentException("A variable with the specified name does not exist.", "variable");
+    }
+
+    #region ListView Events
+    protected virtual void variableListView_SelectedIndexChanged(object sender, EventArgs e) {
+      removeButton.Enabled = (Content != null) && !Locked && !ReadOnly && variableListView.SelectedItems.Count > 0;
+      AdjustListViewColumnSizes();
+    }
+    protected virtual void variableListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if ((variableListView.SelectedItems.Count > 0) && !Locked && !ReadOnly) {
+          foreach (ListViewItem item in variableListView.SelectedItems)
+            Content.Remove(item.Text);
+        }
+      }
+    }
+    protected virtual void variableListView_DoubleClick(object sender, EventArgs e) {
+      if (variableListView.SelectedItems.Count == 1) {
+        var item = variableListView.SelectedItems[0].Tag as KeyValuePair<string, object>?;
+        if (item != null) {
+          var value = item.Value.Value as IContent;
+          if (value != null) {
+            IContentView view = MainFormManager.MainForm.ShowContent(value);
+            if (view != null) {
+              view.ReadOnly = ReadOnly;
+              view.Locked = Locked;
+            }
+          }
+        }
+      }
+    }
+    protected virtual void variableListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      if (!Locked) {
+        var items = new List<object>();
+        foreach (ListViewItem listViewItem in variableListView.SelectedItems) {
+          var item = (KeyValuePair<string, object>)listViewItem.Tag as KeyValuePair<string, object>?;
+          if (item != null) items.Add(item.Value.Value);
+        }
+
+        if (items.Count > 0) {
+          DataObject data = new DataObject();
+          if (items.Count == 1) data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items[0]);
+          else data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items);
+          if (ReadOnly) {
+            DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
+          } else {
+            DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
+            if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
+              foreach (string item in items) Content.Remove(item);
+            }
+          }
+        }
+      }
+    }
+    protected virtual void variableListView_DragEnter(object sender, DragEventArgs e) {
+      validDragOperation = false;
+      if (!Locked && !ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is object)) {
+        validDragOperation = true;
+      } else if (!Locked && !ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IEnumerable)) {
+        validDragOperation = true;
+        IEnumerable items = (IEnumerable)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+        foreach (object item in items)
+          validDragOperation = validDragOperation && (item is object);
+      }
+    }
+    protected virtual void variableListView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (validDragOperation) {
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void variableListView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IEnumerable) {
+          IEnumerable<object> items = ((IEnumerable)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat)).Cast<object>();
+          if (e.Effect.HasFlag(DragDropEffects.Copy)) {
+            var cloner = new Cloner();
+            var clonedItems = new List<object>();
+            foreach (var item in items) {
+              var dc = item as IDeepCloneable;
+              clonedItems.Add(dc != null ? cloner.Clone(dc) : item);
+            }
+            items = clonedItems;
+          }
+          foreach (var item in items) {
+            string name = GenerateNewVariableName();
+            Content.Add(name, item);
+            var listViewItem = variableListView.FindItemWithText(name);
+            listViewItem.BeginEdit();
+          }
+        } else {
+          object item = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+          if (e.Effect.HasFlag(DragDropEffects.Copy)) {
+            var cloner = new Cloner();
+            var dc = item as IDeepCloneable;
+            if (dc != null) item = cloner.Clone(dc);
+          }
+          string name = GenerateNewVariableName();
+          Content.Add(name, item);
+          var listViewItem = variableListView.FindItemWithText(name);
+          listViewItem.BeginEdit();
+        }
+      }
+    }
+
+    private void variableListView_AfterLabelEdit(object sender, LabelEditEventArgs e) {
+      if (!string.IsNullOrEmpty(e.Label)) {
+        var variable = (KeyValuePair<string, object>)variableListView.Items[e.Item].Tag;
+        if (!Content.ContainsKey(e.Label)) {
+          Content.Remove(variable.Key);
+          Content.Add(e.Label, variable.Value);
+        }
+      }
+      e.CancelEdit = true;
+    }
+    #endregion
+
+    #region Button Events
+    protected virtual void addButton_Click(object sender, EventArgs e) {
+      object newVar = CreateItem();
+      if (newVar != null) {
+        string name = GenerateNewVariableName();
+        Content.Add(name, newVar);
+        var item = variableListView.FindItemWithText(name);
+        item.BeginEdit();
+      }
+    }
+    protected virtual void sortAscendingButton_Click(object sender, EventArgs e) {
+      SortItemsListView(SortOrder.Ascending);
+    }
+    protected virtual void sortDescendingButton_Click(object sender, EventArgs e) {
+      SortItemsListView(SortOrder.Descending);
+    }
+    protected virtual void removeButton_Click(object sender, EventArgs e) {
+      if (variableListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in variableListView.SelectedItems)
+          Content.Remove(item.Text);
+        variableListView.SelectedItems.Clear();
+      }
+    }
+    #endregion
+
+    #region Content Events
+    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<KeyValuePair<string, object>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<string, object>>(Content_ItemsAdded), sender, e);
+      else {
+        foreach (var item in e.Items)
+          AddVariable(item);
+        AdjustListViewColumnSizes();
+      }
+    }
+
+    protected virtual void Content_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<KeyValuePair<string, object>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<string, object>>(Content_ItemsReplaced), sender, e);
+      else {
+        foreach (var item in e.Items)
+          UpdateVariable(item);
+        AdjustListViewColumnSizes();
+      }
+    }
+
+    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<KeyValuePair<string, object>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<string, object>>(Content_ItemsRemoved), sender, e);
+      else {
+        foreach (var item in e.Items)
+          RemoveVariable(item);
+        RebuildImageList();
+        AdjustListViewColumnSizes();
+      }
+    }
+    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<KeyValuePair<string, object>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<string, object>>(Content_CollectionReset), sender, e);
+      else {
+        foreach (var item in e.OldItems)
+          RemoveVariable(item);
+        RebuildImageList();
+        foreach (var item in e.Items)
+          AddVariable(item);
+        AdjustListViewColumnSizes();
+      }
+    }
+
+    private void item_ToStringChanged(object sender, EventArgs e) {
+      foreach (ListViewItem item in variableListView.Items) {
+        var variable = item.Tag as KeyValuePair<string, object>?;
+        if (variable != null && variable.Value.Value == sender) {
+          string value = (variable.Value.Value ?? "null").ToString();
+          item.SubItems[1].Text = value;
+          item.SubItems[2].Text = variable.Value.Value.GetType().ToString();
+          item.ToolTipText = GetToolTipText(variable.Value, item.ImageIndex == 0);
+          return;
+        }
+      }
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual void SortItemsListView(SortOrder sortOrder) {
+      variableListView.Sorting = SortOrder.None;
+      variableListView.Sorting = sortOrder;
+      variableListView.Sorting = SortOrder.None;
+    }
+    protected virtual void AdjustListViewColumnSizes() {
+      if (variableListView.Items.Count > 0) {
+        for (int i = 0; i < variableListView.Columns.Count; i++)
+          variableListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+      }
+    }
+    protected virtual void RebuildImageList() {
+      variableListView.SmallImageList.Images.Clear();
+      variableListView.SmallImageList.Images.AddRange(new Image[] {
+        HeuristicLab.Common.Resources.VSImageLibrary.Error,
+        HeuristicLab.Common.Resources.VSImageLibrary.Object,
+        HeuristicLab.Common.Resources.VSImageLibrary.Nothing
+      });
+      foreach (ListViewItem listViewItem in variableListView.Items) {
+        var variable = (KeyValuePair<string, object>)listViewItem.Tag;
+        bool serializable = IsSerializable(variable);
+        if (serializable) {
+          listViewItem.ImageIndex = variable.Value == null ? 2 : 1;
+        } else listViewItem.ImageIndex = 0;
+      }
+    }
+
+    private string GetToolTipText(KeyValuePair<string, object> variable, bool serializable) {
+      if (string.IsNullOrEmpty(variable.Key)) throw new ArgumentException("The variable must have a name.", "variable");
+      string value = (variable.Value ?? "null").ToString();
+      string type = variable.Value == null ? "null" : variable.Value.GetType().ToString();
+      string[] lines = {
+        "Name: " + variable.Key,
+        "Value: " + value,
+        "Type: " + type
+      };
+      string toolTipText = string.Join(Environment.NewLine, lines);
+      if (!serializable)
+        toolTipText += Environment.NewLine + "CAUTION: Type is not serializable!";
+      return toolTipText;
+    }
+
+    private string GenerateNewVariableName(string defaultName = "enter_name") {
+      if (Content.ContainsKey(defaultName)) {
+        int i = 1;
+        string newName;
+        do {
+          newName = defaultName + i++;
+        } while (Content.ContainsKey(newName));
+        return newName;
+      }
+      return defaultName;
+    }
+
+    private bool IsSerializable(KeyValuePair<string, object> variable) {
+      var ser = new Serializer(variable, ConfigurationService.Instance.GetDefaultConfig(new XmlFormat()), "ROOT", true);
+      try {
+        return ser.Count() > 0;
+      } catch (PersistenceException) {
+        return false;
+      }
+    }
+    #endregion
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/HeuristicLab.HLScript-3.3.csproj
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/HeuristicLab.HLScript-3.3.csproj	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/HeuristicLab.HLScript-3.3.csproj	(revision 10479)
@@ -0,0 +1,146 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{21977CC3-1757-4B3B-87BD-FF817AAA900F}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.HLScript</RootNamespace>
+    <AssemblyName>HeuristicLab.HLScript-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="VariableStore.cs" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Script.cs" />
+    <Compile Include="UserScriptBase.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{c36bd924-a541-4a00-afa8-41701378ddc5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102bc7d3-0ef9-439c-8f6d-96ff0fdb8e1b}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/Plugin.cs.frame
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/Plugin.cs.frame	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/Plugin.cs.frame	(revision 10479)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.HLScript {
+  [Plugin("HeuristicLab.HLScript", "3.3.9.$WCREV$")]
+  [PluginFile("HeuristicLab.HLScript-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")] 
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  public class HeuristicLabHLScriptPlugin : PluginBase {
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/Properties/AssemblyInfo.cs.frame	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/Properties/AssemblyInfo.cs.frame	(revision 10479)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.HLScript")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2013 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("c8460c22-cba5-48ad-8283-1284313b2c17")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.9.$WCREV$")]
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/Script.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/Script.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/Script.cs	(revision 10479)
@@ -0,0 +1,264 @@
+﻿using System;
+using System.CodeDom;
+using System.CodeDom.Compiler;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using Microsoft.CSharp;
+
+namespace HeuristicLab.HLScript {
+  [Item("Script", "A HeuristicLab script.")]
+  [Creatable("Scripts")]
+  [StorableClass]
+  public sealed class Script : NamedItem, IStorableContent {
+    #region Constants
+    private const string ExecuteMethodName = "Execute";
+    private const string CodeTemplate =
+@"// use 'vars' to access global variables in the variable store
+
+using System;
+
+namespace UserScripts {
+  public class UserScript : HeuristicLab.HLScript.UserScriptBase {
+    public override void Main() {
+      // type your code here
+    }
+
+    // further classes and methods
+
+  }
+}";
+    #endregion
+
+    #region Fields & Properties
+    private UserScriptBase compiledScript;
+
+    public string Filename { get; set; }
+
+    public static new Image StaticItemImage {
+      get { return VSImageLibrary.Script; }
+    }
+
+    [Storable]
+    private VariableStore variableStore;
+    public VariableStore VariableStore {
+      get { return variableStore; }
+    }
+
+    [Storable]
+    private string code;
+    public string Code {
+      get { return code; }
+      set {
+        if (value == code) return;
+        code = value;
+        compiledScript = null;
+        OnCodeChanged();
+      }
+    }
+
+    private string compilationUnitCode;
+    public string CompilationUnitCode {
+      get { return compilationUnitCode; }
+    }
+
+    private CompilerErrorCollection compileErrors;
+    public CompilerErrorCollection CompileErrors {
+      get { return compileErrors; }
+      private set {
+        compileErrors = value;
+        OnCompileErrorsChanged();
+      }
+    }
+    #endregion
+
+    #region Construction & Initialization
+    [StorableConstructor]
+    private Script(bool deserializing) : base(deserializing) { }
+    private Script(Script original, Cloner cloner)
+      : base(original, cloner) {
+      code = original.code;
+      variableStore = new VariableStore();
+      compilationUnitCode = original.compilationUnitCode;
+      if (original.compileErrors != null)
+        compileErrors = new CompilerErrorCollection(original.compileErrors);
+    }
+
+    public Script()
+      : base("Script", "A HeuristicLab script.") {
+      code = CodeTemplate;
+      variableStore = new VariableStore();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Script(this, cloner);
+    }
+    #endregion
+
+    private void RegisterScriptEvents() {
+      if (compiledScript == null) return;
+      compiledScript.ConsoleOutputChanged += compiledScript_ConsoleOutputChanged;
+    }
+
+    private void DeregisterScriptEvents() {
+      if (compiledScript == null) return;
+      compiledScript.ConsoleOutputChanged -= compiledScript_ConsoleOutputChanged;
+    }
+
+    #region Compilation
+    private CSharpCodeProvider codeProvider =
+      new CSharpCodeProvider(
+        new Dictionary<string, string> {
+          { "CompilerVersion", "v4.0" },  // support C# 4.0 syntax
+        });
+
+    private CompilerResults DoCompile() {
+      var parameters = new CompilerParameters {
+        GenerateExecutable = false,
+        GenerateInMemory = true,
+        IncludeDebugInformation = false
+      };
+      parameters.ReferencedAssemblies.AddRange(
+        GetAssemblies()
+        .Select(a => a.Location)
+        .ToArray());
+      var unit = CreateCompilationUnit();
+      var writer = new StringWriter();
+      codeProvider.GenerateCodeFromCompileUnit(
+        unit,
+        writer,
+        new CodeGeneratorOptions {
+          ElseOnClosing = true,
+          IndentString = "  ",
+        });
+      compilationUnitCode = writer.ToString();
+      return codeProvider.CompileAssemblyFromDom(parameters, unit);
+    }
+
+    public void Compile() {
+      var results = DoCompile();
+      compiledScript = null;
+      CompileErrors = results.Errors;
+      if (results.Errors.HasErrors) {
+        var sb = new StringBuilder();
+        foreach (CompilerError error in results.Errors) {
+          sb.Append(error.Line).Append(':')
+            .Append(error.Column).Append(": ")
+            .AppendLine(error.ErrorText);
+        }
+        throw new Exception(string.Format(
+          "Compilation of \"{0}\" failed:{1}{2}",
+          Name, Environment.NewLine,
+          sb.ToString()));
+      } else {
+        var assembly = results.CompiledAssembly;
+        var types = assembly.GetTypes();
+        DeregisterScriptEvents();
+        compiledScript = (UserScriptBase)Activator.CreateInstance(types[0]);
+        RegisterScriptEvents();
+      }
+    }
+
+    public IEnumerable<Assembly> GetAssemblies() {
+      var assemblies = new List<Assembly>();
+      foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) {
+        try {
+          if (File.Exists(a.Location)) assemblies.Add(a);
+        } catch (NotSupportedException) {
+          // NotSupportedException is thrown while accessing 
+          // the Location property of the anonymously hosted
+          // dynamic methods assembly, which is related to
+          // LINQ queries
+        }
+      }
+      assemblies.Add(typeof(Microsoft.CSharp.RuntimeBinder.Binder).Assembly); // for dlr functionality
+      return assemblies;
+    }
+
+    private readonly Regex SafeTypeNameCharRegex = new Regex("[_a-zA-Z0-9]+");
+    private readonly Regex SafeTypeNameRegex = new Regex("[_a-zA-Z][_a-zA-Z0-9]*");
+
+    private CodeCompileUnit CreateCompilationUnit() {
+      var unit = new CodeSnippetCompileUnit(code);
+      return unit;
+    }
+
+    public string CompiledTypeName {
+      get {
+        var sb = new StringBuilder();
+        var strings = SafeTypeNameCharRegex.Matches(Name)
+                                           .Cast<Match>()
+                                           .Select(m => m.Value);
+        foreach (string s in strings)
+          sb.Append(s);
+        return SafeTypeNameRegex.Match(sb.ToString()).Value;
+      }
+    }
+    #endregion
+
+    private Thread scriptThread;
+    public void Execute() {
+      if (compiledScript == null) return;
+      var executeMethod = typeof(UserScriptBase).GetMethod(ExecuteMethodName, BindingFlags.NonPublic | BindingFlags.Instance);
+      if (executeMethod != null) {
+        scriptThread = new Thread(() => {
+          try {
+            OnScriptExecutionStarted();
+            executeMethod.Invoke(compiledScript, new[] { VariableStore });
+          } finally {
+            OnScriptExecutionFinished();
+          }
+        });
+        scriptThread.Start();
+      }
+    }
+
+    public void Kill() {
+      if (scriptThread.IsAlive)
+        scriptThread.Abort();
+    }
+
+    private void compiledScript_ConsoleOutputChanged(object sender, EventArgs<string> e) {
+      OnConsoleOutputChanged(e.Value);
+    }
+
+    public event EventHandler CodeChanged;
+    private void OnCodeChanged() {
+      var handler = CodeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler CompileErrorsChanged;
+    private void OnCompileErrorsChanged() {
+      var handler = CompileErrorsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ScriptExecutionStarted;
+    private void OnScriptExecutionStarted() {
+      var handler = ScriptExecutionStarted;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ScriptExecutionFinished;
+    private void OnScriptExecutionFinished() {
+      var handler = ScriptExecutionFinished;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler<EventArgs<string>> ConsoleOutputChanged;
+    private void OnConsoleOutputChanged(string args) {
+      var handler = ConsoleOutputChanged;
+      if (handler != null) handler(this, new EventArgs<string>(args));
+    }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/UserScriptBase.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/UserScriptBase.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/UserScriptBase.cs	(revision 10479)
@@ -0,0 +1,112 @@
+﻿using System;
+using System.Dynamic;
+using System.IO;
+using System.Text;
+using System.Threading;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.HLScript {
+  public abstract class UserScriptBase {
+    protected dynamic vars;
+
+    private readonly EventWriter console;
+    protected EventWriter Console {
+      get { return console; }
+    }
+
+    protected UserScriptBase() {
+      console = new EventWriter(this);
+    }
+
+    public abstract void Main();
+
+    private void Execute(VariableStore variableStore) {
+      vars = new Variables(variableStore);
+      try {
+        Main();
+      } catch (ThreadAbortException) {
+      } catch (Exception e) {
+        Console.WriteLine("---");
+        Console.WriteLine(e);
+      }
+    }
+
+    protected internal event EventHandler<EventArgs<string>> ConsoleOutputChanged;
+    private void OnConsoleOutputChanged(string args) {
+      var handler = ConsoleOutputChanged;
+      if (handler != null) handler(null, new EventArgs<string>(args));
+    }
+
+    private class Variables : DynamicObject {
+      private readonly VariableStore variableStore;
+
+      public Variables(VariableStore variableStore) {
+        this.variableStore = variableStore;
+      }
+
+      public override bool TryGetMember(GetMemberBinder binder, out object result) {
+        return variableStore.TryGetValue(binder.Name, out result);
+      }
+
+      public override bool TrySetMember(SetMemberBinder binder, object value) {
+        variableStore[binder.Name] = value;
+        return true;
+      }
+    }
+
+    protected class EventWriter : TextWriter {
+      private readonly UserScriptBase usb;
+
+      public EventWriter(UserScriptBase usb) {
+        this.usb = usb;
+      }
+
+      public override Encoding Encoding {
+        get { return Encoding.UTF8; }
+      }
+
+      #region Write/WriteLine Overrides
+      #region Write
+      public override void Write(bool value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(char value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(char[] buffer) { usb.OnConsoleOutputChanged(new string(buffer)); }
+      public override void Write(char[] buffer, int index, int count) { usb.OnConsoleOutputChanged(new string(buffer, index, count)); }
+      public override void Write(decimal value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(double value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(float value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(int value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(long value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(object value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(string value) { usb.OnConsoleOutputChanged(value); }
+      public override void Write(string format, object arg0) { usb.OnConsoleOutputChanged(string.Format(format, arg0)); }
+      public override void Write(string format, object arg0, object arg1) { usb.OnConsoleOutputChanged(string.Format(format, arg0, arg0)); }
+      public override void Write(string format, object arg0, object arg1, object arg2) { usb.OnConsoleOutputChanged(string.Format(format, arg0, arg1, arg2)); }
+      public override void Write(string format, params object[] arg) { usb.OnConsoleOutputChanged(string.Format(format, arg)); }
+      public override void Write(uint value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(ulong value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      #endregion
+
+      #region WriteLine
+      public override void WriteLine() { usb.OnConsoleOutputChanged(Environment.NewLine); }
+      public override void WriteLine(bool value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(char value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(char[] buffer) { usb.OnConsoleOutputChanged(new string(buffer) + Environment.NewLine); }
+      public override void WriteLine(char[] buffer, int index, int count) { usb.OnConsoleOutputChanged(new string(buffer, index, count) + Environment.NewLine); }
+      public override void WriteLine(decimal value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(double value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(float value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(int value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(long value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(object value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(string value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(string format, object arg0) { usb.OnConsoleOutputChanged(string.Format(format, arg0) + Environment.NewLine); }
+      public override void WriteLine(string format, object arg0, object arg1) { usb.OnConsoleOutputChanged(string.Format(format, arg0, arg1) + Environment.NewLine); }
+      public override void WriteLine(string format, object arg0, object arg1, object arg2) { usb.OnConsoleOutputChanged(string.Format(format, arg0, arg1, arg2) + Environment.NewLine); }
+      public override void WriteLine(string format, params object[] arg) { usb.OnConsoleOutputChanged(string.Format(format, arg) + Environment.NewLine); }
+      public override void WriteLine(uint value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(ulong value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      #endregion
+      #endregion
+    }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/VariableStore.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/VariableStore.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.HLScript/3.3/VariableStore.cs	(revision 10479)
@@ -0,0 +1,14 @@
+﻿using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.HLScript {
+  [Item("VariableStore", "Represents a variable store.")]
+  [StorableClass]
+  public class VariableStore : ObservableDictionary<string, object>, IContent {
+    [StorableConstructor]
+    protected VariableStore(bool deserializing) : base(deserializing) { }
+    public VariableStore() : base() { }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators.Views.GraphVisualization.Views/3.3/GraphVisualizationInfoView.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators.Views.GraphVisualization.Views/3.3/GraphVisualizationInfoView.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators.Views.GraphVisualization.Views/3.3/GraphVisualizationInfoView.cs	(revision 10479)
@@ -84,8 +84,8 @@
 
     private void UpdateContent() {
-      foreach (IConnectionInfo connectionInfo in this.connectionInfoConnectionMapping.FirstValues.ToList())
+      foreach (IConnectionInfo connectionInfo in this.connectionInfoConnectionMapping.FirstKeys.ToList())
         this.RemoveConnectionInfo(connectionInfo);
       this.connectionInfoConnectionMapping.Clear();
-      foreach (IShapeInfo shapeInfo in this.shapeInfoShapeMapping.FirstValues.ToList())
+      foreach (IShapeInfo shapeInfo in this.shapeInfoShapeMapping.FirstKeys.ToList())
         this.RemoveShapeInfo(shapeInfo);
       this.shapeInfoShapeMapping.Clear();
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators/3.3/InstrumentedOperator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators/3.3/InstrumentedOperator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators/3.3/InstrumentedOperator.cs	(revision 10479)
@@ -20,4 +20,6 @@
 #endregion
 
+using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -28,19 +30,22 @@
   [Item("InstrumentedOperator", "A operator that can execute pre- and post actions.")]
   [StorableClass]
-  public abstract class InstrumentedOperator : SingleSuccessorOperator {
+  public abstract class InstrumentedOperator : SingleSuccessorOperator, IInstrumentedOperator {
     private const string BeforeExecutionOperatorsParameterName = "BeforeExecutionOperators";
     private const string AfterExecutionOperatorsParameterName = "AfterExecutionOperators";
 
-    private IFixedValueParameter<ItemList<SingleSuccessorOperator>> BeforeExecutionOperatorsParameter {
-      get { return (IFixedValueParameter<ItemList<SingleSuccessorOperator>>)Parameters[BeforeExecutionOperatorsParameterName]; }
+    private IFixedValueParameter<OperatorList> BeforeExecutionOperatorsParameter {
+      get { return (IFixedValueParameter<OperatorList>)Parameters[BeforeExecutionOperatorsParameterName]; }
     }
-    private IFixedValueParameter<ItemList<SingleSuccessorOperator>> AfterExecutionOperatorsParameter {
-      get { return (IFixedValueParameter<ItemList<SingleSuccessorOperator>>)Parameters[AfterExecutionOperatorsParameterName]; }
+    private IFixedValueParameter<OperatorList> AfterExecutionOperatorsParameter {
+      get { return (IFixedValueParameter<OperatorList>)Parameters[AfterExecutionOperatorsParameterName]; }
     }
 
-    public ItemList<SingleSuccessorOperator> BeforeExecutionOperators {
+
+    IEnumerable<IOperator> IInstrumentedOperator.BeforeExecutionOperators { get { return BeforeExecutionOperators; } }
+    public OperatorList BeforeExecutionOperators {
       get { return BeforeExecutionOperatorsParameter.Value; }
     }
-    public ItemList<SingleSuccessorOperator> AfterExecutionOperators {
+    IEnumerable<IOperator> IInstrumentedOperator.AfterExecutionOperators { get { return AfterExecutionOperators; } }
+    public OperatorList AfterExecutionOperators {
       get { return AfterExecutionOperatorsParameter.Value; }
     }
@@ -53,6 +58,6 @@
     protected InstrumentedOperator()
       : base() {
-      Parameters.Add(new FixedValueParameter<ItemList<SingleSuccessorOperator>>(BeforeExecutionOperatorsParameterName, "Actions that are executed before the execution of the operator", new ItemList<SingleSuccessorOperator>()));
-      Parameters.Add(new FixedValueParameter<ItemList<SingleSuccessorOperator>>(AfterExecutionOperatorsParameterName, "Actions that are executed after the execution of the operator", new ItemList<SingleSuccessorOperator>()));
+      Parameters.Add(new FixedValueParameter<OperatorList>(BeforeExecutionOperatorsParameterName, "Actions that are executed before the execution of the operator", new OperatorList()));
+      Parameters.Add(new FixedValueParameter<OperatorList>(AfterExecutionOperatorsParameterName, "Actions that are executed after the execution of the operator", new OperatorList()));
       BeforeExecutionOperatorsParameter.Hidden = true;
       AfterExecutionOperatorsParameter.Hidden = true;
@@ -64,9 +69,9 @@
       #region Backwards compatible code, remove with 3.4
       if (!Parameters.ContainsKey(BeforeExecutionOperatorsParameterName)) {
-        Parameters.Add(new FixedValueParameter<ItemList<SingleSuccessorOperator>>(BeforeExecutionOperatorsParameterName, "Actions that are executed before the execution of the operator", new ItemList<SingleSuccessorOperator>()));
+        Parameters.Add(new FixedValueParameter<OperatorList>(BeforeExecutionOperatorsParameterName, "Actions that are executed before the execution of the operator", new OperatorList()));
         BeforeExecutionOperatorsParameter.Hidden = true;
       }
       if (!Parameters.ContainsKey(AfterExecutionOperatorsParameterName)) {
-        Parameters.Add(new FixedValueParameter<ItemList<SingleSuccessorOperator>>(AfterExecutionOperatorsParameterName, "Actions that are executed after the execution of the operator", new ItemList<SingleSuccessorOperator>()));
+        Parameters.Add(new FixedValueParameter<OperatorList>(AfterExecutionOperatorsParameterName, "Actions that are executed after the execution of the operator", new OperatorList()));
         AfterExecutionOperatorsParameter.Hidden = true;
       }
@@ -75,9 +80,12 @@
 
     public sealed override IOperation Apply() {
-      var opCol = new OperationCollection();
+      //to speed up the execution call instrumented apply directly if no before operators exists
+      if (!BeforeExecutionOperators.Any())
+        return InstrumentedApply();
 
       //build before operations
+      var opCol = new OperationCollection();
       foreach (var beforeAction in BeforeExecutionOperators) {
-        IOperation beforeActionOperation = ExecutionContext.CreateOperation(beforeAction);
+        var beforeActionOperation = ExecutionContext.CreateChildOperation(beforeAction);
         opCol.Add(beforeActionOperation);
       }
@@ -88,9 +96,15 @@
 
     public virtual IOperation InstrumentedApply() {
+      if (!AfterExecutionOperators.Any()) {
+        if (Successor != null) return ExecutionContext.CreateOperation(Successor);
+        return null;
+      }
+
       var opCol = new OperationCollection();
       foreach (var afterAction in AfterExecutionOperators) {
-        IOperation afterActionOperation = ExecutionContext.CreateOperation(afterAction);
+        var afterActionOperation = ExecutionContext.CreateChildOperation(afterAction);
         opCol.Add(afterActionOperation);
       }
+
       if (Successor != null)
         opCol.Add(ExecutionContext.CreateOperation(Successor));
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators/3.3/MultiOperator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators/3.3/MultiOperator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators/3.3/MultiOperator.cs	(revision 10479)
@@ -34,5 +34,5 @@
   [Item("MultiOperator", "A base class for operators which apply arbitrary many other operators of a specific type.")]
   [StorableClass]
-  public abstract class MultiOperator<T> : SingleSuccessorOperator, IMultiOperator<T> where T : class, IOperator {
+  public abstract class MultiOperator<T> : InstrumentedOperator, IMultiOperator<T> where T : class, IOperator {
     private List<IValueParameter<T>> operatorParameters;
     protected IEnumerable<IValueParameter<T>> OperatorParameters { get { return operatorParameters; } }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators/3.3/StochasticMultiBranch.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators/3.3/StochasticMultiBranch.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators/3.3/StochasticMultiBranch.cs	(revision 10479)
@@ -132,5 +132,5 @@
     /// or all selected operators have zero probabitlity.</exception>
     /// <returns>A new operation with the operator that was selected followed by the current operator's successor.</returns>
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IRandom random = RandomParameter.ActualValue;
       DoubleArray probabilities = ProbabilitiesParameter.ActualValue;
@@ -156,5 +156,5 @@
         }
       }
-      OperationCollection next = new OperationCollection(base.Apply());
+      OperationCollection next = new OperationCollection(base.InstrumentedApply());
       if (successor != null) {
         if (TraceSelectedOperatorParameter.Value.Value)
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators/3.3/SubScopesProcessor.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators/3.3/SubScopesProcessor.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Operators/3.3/SubScopesProcessor.cs	(revision 10479)
@@ -67,7 +67,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       List<IScope> scopes = GetScopesOnLevel(ExecutionContext.Scope, Depth.Value).ToList();
-      OperationCollection next = new OperationCollection(base.Apply());
+      OperationCollection next = new OperationCollection(base.InstrumentedApply());
       if (scopes.Count != Operators.Count)
         throw new ArgumentException("The number of operators doesn't match the number of sub-scopes at depth " + Depth.Value);
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Optimization.Operators/3.3/ParentCopyCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Optimization.Operators/3.3/ParentCopyCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Optimization.Operators/3.3/ParentCopyCrossover.cs	(revision 10479)
@@ -29,5 +29,5 @@
   [Item("ParentCopyCrossover", "This operator creates an offspring by creating a clone of a randomly chosen parent. It can be used in situations where no crossover should occur after selection.")]
   [StorableClass]
-  public class ParentCopyCrossover : SingleSuccessorOperator, ICrossover, IStochasticOperator {
+  public class ParentCopyCrossover : InstrumentedOperator, ICrossover, IStochasticOperator {
     public ILookupParameter<IRandom> RandomParameter {
       get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
@@ -43,5 +43,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IScope scope = ExecutionContext.Scope;
       int index = RandomParameter.ActualValue.Next(scope.SubScopes.Count);
@@ -51,5 +51,5 @@
         scope.Variables.Add((IVariable)var.Clone());
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Optimization.Operators/3.3/ShakingOperator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Optimization.Operators/3.3/ShakingOperator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Optimization.Operators/3.3/ShakingOperator.cs	(revision 10479)
@@ -56,5 +56,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (NeighborhoodCountParameter.ActualValue == null)
         NeighborhoodCountParameter.ActualValue = new IntValue(Operators.CheckedItems.Count());
@@ -64,5 +64,5 @@
       var shaker = base.Operators.CheckedItems.SingleOrDefault(x => x.Index == index);
 
-      OperationCollection next = new OperationCollection(base.Apply());
+      OperationCollection next = new OperationCollection(base.InstrumentedApply());
       if (shaker.Value != null)
         next.Insert(0, ExecutionContext.CreateChildOperation(shaker.Value));
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Optimization.Operators/3.3/UserDefinedOperator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Optimization.Operators/3.3/UserDefinedOperator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Optimization.Operators/3.3/UserDefinedOperator.cs	(revision 10479)
@@ -35,10 +35,10 @@
     public UserDefinedOperator() : base() { }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       OperationCollection result = new OperationCollection();
       foreach (IOperator op in Operators.CheckedItems.OrderBy(x => x.Index).Select(x => x.Value)) {
         result.Add(ExecutionContext.CreateOperation(op));
       }
-      result.Add(base.Apply());
+      result.Add(base.InstrumentedApply());
       return result;
     }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.ArtificialAnt/3.4/Evaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.ArtificialAnt/3.4/Evaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.ArtificialAnt/3.4/Evaluator.cs	(revision 10479)
@@ -32,5 +32,5 @@
   [Item("ArtificialAntEvaluator", "Evaluates an artificial ant solution.")]
   [StorableClass]
-  public class Evaluator : SingleSuccessorOperator, ISingleObjectiveEvaluator {
+  public class Evaluator : InstrumentedOperator, ISingleObjectiveEvaluator {
 
     public ILookupParameter<DoubleValue> QualityParameter {
@@ -60,5 +60,5 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       SymbolicExpressionTree expression = SymbolicExpressionTreeParameter.ActualValue;
       BoolMatrix world = WorldParameter.ActualValue;
@@ -72,5 +72,5 @@
 
       QualityParameter.ActualValue = new DoubleValue(interpreter.FoodEaten);
-      return null;
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification-3.4.csproj
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification-3.4.csproj	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification-3.4.csproj	(revision 10479)
@@ -120,4 +120,5 @@
     <Compile Include="ModelCreators\NormalDistributedThresholdsModelCreator.cs" />
     <Compile Include="MultiObjective\SymbolicClassificationMultiObjectiveValidationBestSolutionAnalyzer.cs" />
+    <Compile Include="SymbolicClassificationPruningAnalyzer.cs" />
     <Compile Include="SymbolicClassificationSolutionImpactValuesCalculator.cs" />
     <Compile Include="SymbolicNearestNeighbourClassificationModel.cs" />
@@ -149,4 +150,5 @@
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="SymbolicClassificationPruningOperator.cs" />
     <None Include="HeuristicLab.snk" />
     <None Include="Plugin.cs.frame" />
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveMeanSquaredErrorTreeSizeEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveMeanSquaredErrorTreeSizeEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveMeanSquaredErrorTreeSizeEvaluator.cs	(revision 10479)
@@ -44,10 +44,10 @@
     public override IEnumerable<bool> Maximization { get { return new bool[2] { false, false }; } }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IEnumerable<int> rows = GenerateRowsToEvaluate();
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows);
       QualitiesParameter.ActualValue = new DoubleArray(qualities);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectivePearsonRSquaredTreeSizeEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectivePearsonRSquaredTreeSizeEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectivePearsonRSquaredTreeSizeEvaluator.cs	(revision 10479)
@@ -44,10 +44,10 @@
     public override IEnumerable<bool> Maximization { get { return new bool[2] { true, false }; } }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IEnumerable<int> rows = GenerateRowsToEvaluate();
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value);
       QualitiesParameter.ActualValue = new DoubleArray(qualities);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveBoundedMeanSquaredErrorEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveBoundedMeanSquaredErrorEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveBoundedMeanSquaredErrorEvaluator.cs	(revision 10479)
@@ -44,10 +44,10 @@
     public override bool Maximization { get { return false; } }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IEnumerable<int> rows = GenerateRowsToEvaluate();
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value);
       QualityParameter.ActualValue = new DoubleValue(quality);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator.cs	(revision 10479)
@@ -45,10 +45,10 @@
     public override bool Maximization { get { return false; } }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IEnumerable<int> rows = GenerateRowsToEvaluate();
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value);
       QualityParameter.ActualValue = new DoubleValue(quality);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectivePearsonRSquaredEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectivePearsonRSquaredEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectivePearsonRSquaredEvaluator.cs	(revision 10479)
@@ -44,10 +44,10 @@
     public override bool Maximization { get { return true; } }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IEnumerable<int> rows = GenerateRowsToEvaluate();
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value);
       QualityParameter.ActualValue = new DoubleValue(quality);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectivePenaltyScoreEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectivePenaltyScoreEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectivePenaltyScoreEvaluator.cs	(revision 10479)
@@ -64,8 +64,8 @@
 
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       double quality = Evaluate(ExecutionContext, SymbolicExpressionTreeParameter.ActualValue, ProblemDataParameter.ActualValue, GenerateRowsToEvaluate());
       QualityParameter.ActualValue = new DoubleValue(quality);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationPruningAnalyzer.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationPruningAnalyzer.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationPruningAnalyzer.cs	(revision 10479)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification {
+  [Item("SymbolicClassificationPruningAnalyzer", "An analyzer that prunes introns from the population.")]
+  [StorableClass]
+  public sealed class SymbolicClassificationPruningAnalyzer : SymbolicDataAnalysisSingleObjectivePruningAnalyzer {
+    private const string ImpactValuesCalculatorParameterName = "ImpactValuesCalculator";
+    private const string PruningOperatorParameterName = "PruningOperator";
+    private SymbolicClassificationPruningAnalyzer(SymbolicClassificationPruningAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicClassificationPruningAnalyzer(this, cloner);
+    }
+
+    [StorableConstructor]
+    private SymbolicClassificationPruningAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public SymbolicClassificationPruningAnalyzer() {
+      Parameters.Add(new ValueParameter<SymbolicDataAnalysisSolutionImpactValuesCalculator>(ImpactValuesCalculatorParameterName, "The impact values calculator", new SymbolicClassificationSolutionImpactValuesCalculator()));
+      Parameters.Add(new ValueParameter<SymbolicDataAnalysisExpressionPruningOperator>(PruningOperatorParameterName, "The operator used to prune trees", new SymbolicClassificationPruningOperator()));
+    }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationPruningOperator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationPruningOperator.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationPruningOperator.cs	(revision 10479)
@@ -0,0 +1,65 @@
+﻿using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification {
+  [StorableClass]
+  [Item("SymbolicClassificationPruningOperator", "An operator which prunes symbolic classificaton trees.")]
+  public class SymbolicClassificationPruningOperator : SymbolicDataAnalysisExpressionPruningOperator {
+    private const string ImpactValuesCalculatorParameterName = "ImpactValuesCalculator";
+    private const string ModelCreatorParameterName = "ModelCreator";
+    private const string ApplyLinearScalingParmameterName = "ApplyLinearScaling";
+
+    #region parameter properties
+    public ILookupParameter<ISymbolicClassificationModelCreator> ModelCreatorParameter {
+      get { return (ILookupParameter<ISymbolicClassificationModelCreator>)Parameters[ModelCreatorParameterName]; }
+    }
+
+    public ILookupParameter<BoolValue> ApplyLinearScalingParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters[ApplyLinearScalingParmameterName]; }
+    }
+    #endregion
+    #region properties
+    private ISymbolicClassificationModelCreator ModelCreator { get { return ModelCreatorParameter.ActualValue; } }
+    private BoolValue ApplyLinearScaling { get { return ApplyLinearScalingParameter.ActualValue; } }
+    #endregion
+
+    protected SymbolicClassificationPruningOperator(SymbolicClassificationPruningOperator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicClassificationPruningOperator(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected SymbolicClassificationPruningOperator(bool deserializing) : base(deserializing) { }
+
+    public SymbolicClassificationPruningOperator() {
+      Parameters.Add(new ValueParameter<ISymbolicDataAnalysisSolutionImpactValuesCalculator>(ImpactValuesCalculatorParameterName, new SymbolicClassificationSolutionImpactValuesCalculator()));
+      Parameters.Add(new LookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName));
+    }
+
+    protected override ISymbolicDataAnalysisModel CreateModel() {
+      var model = ModelCreator.CreateSymbolicClassificationModel(SymbolicExpressionTree, Interpreter, EstimationLimits.Lower, EstimationLimits.Upper);
+      var rows = Enumerable.Range(FitnessCalculationPartition.Start, FitnessCalculationPartition.Size);
+      var problemData = (IClassificationProblemData)ProblemData;
+      model.RecalculateModelParameters(problemData, rows);
+      return model;
+    }
+
+    protected override double Evaluate(IDataAnalysisModel model) {
+      var classificationModel = (IClassificationModel)model;
+      var classificationProblemData = (IClassificationProblemData)ProblemData;
+      var trainingIndices = ProblemData.TrainingIndices.ToList();
+      var estimatedValues = classificationModel.GetEstimatedClassValues(ProblemData.Dataset, trainingIndices);
+      var targetValues = ProblemData.Dataset.GetDoubleValues(classificationProblemData.TargetVariable, trainingIndices);
+      OnlineCalculatorError errorState;
+      var quality = OnlinePearsonsRSquaredCalculator.Calculate(targetValues, estimatedValues, out errorState);
+      if (errorState != OnlineCalculatorError.None) return double.NaN;
+      return quality;
+    }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationSolutionImpactValuesCalculator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationSolutionImpactValuesCalculator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationSolutionImpactValuesCalculator.cs	(revision 10479)
@@ -20,10 +20,24 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using HeuristicLab.Common;
+using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification {
+  [StorableClass]
+  [Item("SymbolicClassificationSolutionImpactValuesCalculator", "Calculate symbolic expression tree node impact values for classification problems.")]
   public class SymbolicClassificationSolutionImpactValuesCalculator : SymbolicDataAnalysisSolutionImpactValuesCalculator {
+    public SymbolicClassificationSolutionImpactValuesCalculator() { }
+    protected SymbolicClassificationSolutionImpactValuesCalculator(SymbolicClassificationSolutionImpactValuesCalculator original, Cloner cloner)
+      : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicClassificationSolutionImpactValuesCalculator(this, cloner);
+    }
+    [StorableConstructor]
+    protected SymbolicClassificationSolutionImpactValuesCalculator(bool deserializing) : base(deserializing) { }
+
     public override double CalculateReplacementValue(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData, IEnumerable<int> rows) {
       var classificationModel = (ISymbolicClassificationModel)model;
@@ -34,4 +48,12 @@
 
     public override double CalculateImpactValue(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData, IEnumerable<int> rows, double originalQuality = double.NaN) {
+      double impactValue, replacementValue;
+      CalculateImpactAndReplacementValues(model, node, problemData, rows, out impactValue, out replacementValue, originalQuality);
+      return impactValue;
+    }
+
+    public override void CalculateImpactAndReplacementValues(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node,
+      IDataAnalysisProblemData problemData, IEnumerable<int> rows, out double impactValue, out double replacementValue,
+      double originalQuality = Double.NaN) {
       var classificationModel = (ISymbolicClassificationModel)model;
       var classificationProblemData = (IClassificationProblemData)problemData;
@@ -47,10 +69,15 @@
       }
 
-      var replacementValue = CalculateReplacementValue(classificationModel, node, classificationProblemData, rows);
+      replacementValue = CalculateReplacementValue(classificationModel, node, classificationProblemData, rows);
       var constantNode = new ConstantTreeNode(new Constant()) { Value = replacementValue };
+
       var cloner = new Cloner();
-      cloner.RegisterClonedObject(node, constantNode);
       var tempModel = cloner.Clone(classificationModel);
-      tempModel.RecalculateModelParameters(classificationProblemData, rows);
+      var tempModelNode = (ISymbolicExpressionTreeNode)cloner.GetClone(node);
+
+      var tempModelParentNode = tempModelNode.Parent;
+      int i = tempModelParentNode.IndexOfSubtree(tempModelNode);
+      tempModelParentNode.RemoveSubtree(i);
+      tempModelParentNode.InsertSubtree(i, constantNode);
 
       var estimatedClassValues = tempModel.GetEstimatedClassValues(dataset, rows);
@@ -58,7 +85,6 @@
       if (errorState != OnlineCalculatorError.None) newQuality = 0.0;
 
-      return originalQuality - newQuality;
+      impactValue = originalQuality - newQuality;
     }
-
   }
 }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.csproj
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.csproj	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.csproj	(revision 10479)
@@ -120,4 +120,6 @@
     <Compile Include="Plugin.cs" />
     <Compile Include="SingleObjective\ConstantOptimizationAnalyzer.cs" />
+    <Compile Include="SingleObjective\Evaluators\SymbolicRegressionMeanRelativeErrorEvaluator.cs" />
+    <Compile Include="SymbolicRegressionPruningAnalyzer.cs" />
     <Compile Include="SingleObjective\SymbolicRegressionSingleObjectiveValidationParetoBestSolutionAnalyzer.cs" />
     <Compile Include="SingleObjective\SymbolicRegressionSingleObjectiveTrainingParetoBestSolutionAnalyzer.cs" />
@@ -143,4 +145,5 @@
     <Compile Include="SingleObjective\Evaluators\SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator.cs" />
     <Compile Include="SingleObjective\Evaluators\SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.cs" />
+    <Compile Include="SymbolicRegressionPruningOperator.cs" />
     <Compile Include="SymbolicRegressionSolution.cs" />
     <Compile Include="SymbolicRegressionSolutionImpactValuesCalculator.cs" />
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveMeanSquaredErrorTreeSizeEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveMeanSquaredErrorTreeSizeEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveMeanSquaredErrorTreeSizeEvaluator.cs	(revision 10479)
@@ -44,10 +44,10 @@
     public override IEnumerable<bool> Maximization { get { return new bool[2] { false, false }; } }
 
-    public override Core.IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IEnumerable<int> rows = GenerateRowsToEvaluate();
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value);
       QualitiesParameter.ActualValue = new DoubleArray(qualities);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectivePearsonRSquaredTreeSizeEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectivePearsonRSquaredTreeSizeEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectivePearsonRSquaredTreeSizeEvaluator.cs	(revision 10479)
@@ -44,10 +44,10 @@
     public override IEnumerable<bool> Maximization { get { return new bool[2] { true, false }; } }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IEnumerable<int> rows = GenerateRowsToEvaluate();
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value);
       QualitiesParameter.ActualValue = new DoubleArray(qualities);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionConstantOptimizationEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionConstantOptimizationEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionConstantOptimizationEvaluator.cs	(revision 10479)
@@ -102,5 +102,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       double quality;
@@ -121,8 +121,5 @@
       QualityParameter.ActualValue = new DoubleValue(quality);
 
-      if (Successor != null)
-        return ExecutionContext.CreateOperation(Successor);
-      else
-        return null;
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionMeanRelativeErrorEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionMeanRelativeErrorEvaluator.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionMeanRelativeErrorEvaluator.cs	(revision 10479)
@@ -0,0 +1,86 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
+  [Item("Mean relative error Evaluator", "Evaluator for symbolic regression models that calculates the mean relative error avg( |y' - y| / (|y| + 1))." +
+                                         "The +1 is necessary to handle data with the value of 0.0 correctly. " +
+                                         "Notice: Linear scaling is ignored for this evaluator.")]
+  [StorableClass]
+  public class SymbolicRegressionMeanRelativeErrorEvaluator : SymbolicRegressionSingleObjectiveEvaluator {
+    public override bool Maximization { get { return false; } }
+    [StorableConstructor]
+    protected SymbolicRegressionMeanRelativeErrorEvaluator(bool deserializing) : base(deserializing) { }
+    protected SymbolicRegressionMeanRelativeErrorEvaluator(SymbolicRegressionMeanRelativeErrorEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionMeanRelativeErrorEvaluator(this, cloner);
+    }
+    public SymbolicRegressionMeanRelativeErrorEvaluator() : base() { }
+
+    public override IOperation InstrumentedApply() {
+      var solution = SymbolicExpressionTreeParameter.ActualValue;
+      IEnumerable<int> rows = GenerateRowsToEvaluate();
+
+      double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows);
+      QualityParameter.ActualValue = new DoubleValue(quality);
+
+      return base.InstrumentedApply();
+    }
+
+    public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows) {
+      IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows);
+      IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);
+      IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit);
+
+      var relResiduals = boundedEstimatedValues.Zip(targetValues, (e, t) => Math.Abs(t - e) / (Math.Abs(t) + 1.0));
+
+      OnlineCalculatorError errorState;
+      OnlineCalculatorError varErrorState;
+      double mre;
+      double variance;
+      OnlineMeanAndVarianceCalculator.Calculate(relResiduals, out mre, out variance, out errorState, out varErrorState);
+      if (errorState != OnlineCalculatorError.None) return double.NaN;
+      return mre;
+    }
+
+    public override double Evaluate(IExecutionContext context, ISymbolicExpressionTree tree, IRegressionProblemData problemData, IEnumerable<int> rows) {
+      SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context;
+      EstimationLimitsParameter.ExecutionContext = context;
+
+      double mre = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows);
+
+      SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null;
+      EstimationLimitsParameter.ExecutionContext = null;
+
+      return mre;
+    }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMaxAbsoluteErrorEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMaxAbsoluteErrorEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMaxAbsoluteErrorEvaluator.cs	(revision 10479)
@@ -42,5 +42,5 @@
     public SymbolicRegressionSingleObjectiveMaxAbsoluteErrorEvaluator() : base() { }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       IEnumerable<int> rows = GenerateRowsToEvaluate();
@@ -49,5 +49,5 @@
       QualityParameter.ActualValue = new DoubleValue(quality);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMeanAbsoluteErrorEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMeanAbsoluteErrorEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMeanAbsoluteErrorEvaluator.cs	(revision 10479)
@@ -42,5 +42,5 @@
     public SymbolicRegressionSingleObjectiveMeanAbsoluteErrorEvaluator() : base() { }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       IEnumerable<int> rows = GenerateRowsToEvaluate();
@@ -49,5 +49,5 @@
       QualityParameter.ActualValue = new DoubleValue(quality);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator.cs	(revision 10479)
@@ -42,5 +42,5 @@
     public SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator() : base() { }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       IEnumerable<int> rows = GenerateRowsToEvaluate();
@@ -49,5 +49,5 @@
       QualityParameter.ActualValue = new DoubleValue(quality);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.cs	(revision 10479)
@@ -44,5 +44,5 @@
     public override bool Maximization { get { return true; } }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       IEnumerable<int> rows = GenerateRowsToEvaluate();
@@ -51,5 +51,5 @@
       QualityParameter.ActualValue = new DoubleValue(quality);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningAnalyzer.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningAnalyzer.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningAnalyzer.cs	(revision 10479)
@@ -0,0 +1,50 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
+  [Item("SymbolicRegressionPruningAnalyzer", "An analyzer that prunes introns from the population.")]
+  [StorableClass]
+  public sealed class SymbolicRegressionPruningAnalyzer : SymbolicDataAnalysisSingleObjectivePruningAnalyzer {
+    private const string ImpactValuesCalculatorParameterName = "ImpactValuesCalculator";
+    private const string PruningOperatorParameterName = "PruningOperator";
+    private SymbolicRegressionPruningAnalyzer(SymbolicRegressionPruningAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionPruningAnalyzer(this, cloner);
+    }
+
+    [StorableConstructor]
+    private SymbolicRegressionPruningAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public SymbolicRegressionPruningAnalyzer() {
+      Parameters.Add(new ValueParameter<SymbolicDataAnalysisSolutionImpactValuesCalculator>(ImpactValuesCalculatorParameterName, "The impact values calculator", new SymbolicRegressionSolutionImpactValuesCalculator()));
+      Parameters.Add(new ValueParameter<SymbolicDataAnalysisExpressionPruningOperator>(PruningOperatorParameterName, "The operator used to prune trees", new SymbolicRegressionPruningOperator()));
+    }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningOperator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningOperator.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningOperator.cs	(revision 10479)
@@ -0,0 +1,52 @@
+﻿using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
+  [StorableClass]
+  [Item("SymbolicRegressionPruningOperator", "An operator which prunes symbolic regression trees.")]
+  public class SymbolicRegressionPruningOperator : SymbolicDataAnalysisExpressionPruningOperator {
+    private const string ImpactValuesCalculatorParameterName = "ImpactValuesCalculator";
+    private const string ImpactValuesCalculatorParameterDescription = "The impact values calculator to be used for figuring out the node impacts.";
+
+    private const string EvaluatorParameterName = "Evaluator";
+
+    public ILookupParameter<ISymbolicRegressionSingleObjectiveEvaluator> EvaluatorParameter {
+      get { return (ILookupParameter<ISymbolicRegressionSingleObjectiveEvaluator>)Parameters[EvaluatorParameterName]; }
+    }
+
+    protected SymbolicRegressionPruningOperator(SymbolicRegressionPruningOperator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionPruningOperator(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected SymbolicRegressionPruningOperator(bool deserializing) : base(deserializing) { }
+
+    public SymbolicRegressionPruningOperator() {
+      var impactValuesCalculator = new SymbolicRegressionSolutionImpactValuesCalculator();
+      Parameters.Add(new ValueParameter<ISymbolicDataAnalysisSolutionImpactValuesCalculator>(ImpactValuesCalculatorParameterName, ImpactValuesCalculatorParameterDescription, impactValuesCalculator));
+      Parameters.Add(new LookupParameter<ISymbolicRegressionSingleObjectiveEvaluator>(EvaluatorParameterName));
+    }
+
+    protected override ISymbolicDataAnalysisModel CreateModel() {
+      return new SymbolicRegressionModel(SymbolicExpressionTree, Interpreter, EstimationLimits.Lower, EstimationLimits.Upper);
+    }
+
+    protected override double Evaluate(IDataAnalysisModel model) {
+      var regressionModel = (IRegressionModel)model;
+      var regressionProblemData = (IRegressionProblemData)ProblemData;
+      var trainingIndices = ProblemData.TrainingIndices.ToList();
+      var estimatedValues = regressionModel.GetEstimatedValues(ProblemData.Dataset, trainingIndices); // also bounds the values
+      var targetValues = ProblemData.Dataset.GetDoubleValues(regressionProblemData.TargetVariable, trainingIndices);
+      OnlineCalculatorError errorState;
+      var quality = OnlinePearsonsRSquaredCalculator.Calculate(targetValues, estimatedValues, out errorState);
+      if (errorState != OnlineCalculatorError.None) return double.NaN;
+      return quality;
+    }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionSolutionImpactValuesCalculator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionSolutionImpactValuesCalculator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionSolutionImpactValuesCalculator.cs	(revision 10479)
@@ -20,10 +20,25 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using HeuristicLab.Common;
+using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
+  [StorableClass]
+  [Item("SymbolicRegressionSolutionImpactValuesCalculator", "Calculate symbolic expression tree node impact values for regression problems.")]
   public class SymbolicRegressionSolutionImpactValuesCalculator : SymbolicDataAnalysisSolutionImpactValuesCalculator {
+    public SymbolicRegressionSolutionImpactValuesCalculator() { }
+
+    protected SymbolicRegressionSolutionImpactValuesCalculator(SymbolicRegressionSolutionImpactValuesCalculator original, Cloner cloner)
+      : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionSolutionImpactValuesCalculator(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected SymbolicRegressionSolutionImpactValuesCalculator(bool deserializing) : base(deserializing) { }
     public override double CalculateReplacementValue(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData, IEnumerable<int> rows) {
       var regressionModel = (ISymbolicRegressionModel)model;
@@ -34,4 +49,12 @@
 
     public override double CalculateImpactValue(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData, IEnumerable<int> rows, double originalQuality = double.NaN) {
+      double impactValue, replacementValue;
+      CalculateImpactAndReplacementValues(model, node, problemData, rows, out impactValue, out replacementValue, originalQuality);
+      return impactValue;
+    }
+
+    public override void CalculateImpactAndReplacementValues(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node,
+      IDataAnalysisProblemData problemData, IEnumerable<int> rows, out double impactValue, out double replacementValue,
+      double originalQuality = Double.NaN) {
       var regressionModel = (ISymbolicRegressionModel)model;
       var regressionProblemData = (IRegressionProblemData)problemData;
@@ -47,5 +70,5 @@
       }
 
-      var replacementValue = CalculateReplacementValue(regressionModel, node, regressionProblemData, rows);
+      replacementValue = CalculateReplacementValue(regressionModel, node, regressionProblemData, rows);
       var constantNode = new ConstantTreeNode(new Constant()) { Value = replacementValue };
 
@@ -63,7 +86,6 @@
       if (errorState != OnlineCalculatorError.None) newQuality = 0.0;
 
-      return originalQuality - newQuality;
+      impactValue = originalQuality - newQuality;
     }
-
   }
 }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/SingleObjective/SymbolicTimeSeriesPrognosisSingleObjectiveMeanSquaredErrorEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/SingleObjective/SymbolicTimeSeriesPrognosisSingleObjectiveMeanSquaredErrorEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/SingleObjective/SymbolicTimeSeriesPrognosisSingleObjectiveMeanSquaredErrorEvaluator.cs	(revision 10479)
@@ -44,5 +44,5 @@
     public override bool Maximization { get { return false; } }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       IEnumerable<int> rows = GenerateRowsToEvaluate();
@@ -56,5 +56,5 @@
       QualityParameter.ActualValue = new DoubleValue(quality);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectivePruningAnalyzer.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectivePruningAnalyzer.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectivePruningAnalyzer.cs	(revision 10479)
@@ -0,0 +1,192 @@
+﻿using System;
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
+  [StorableClass]
+  [Item("SymbolicDataAnalysisSingleObjectivePruningAnalyzer", "An analyzer that prunes introns from trees in single objective symbolic data analysis problems.")]
+  public abstract class SymbolicDataAnalysisSingleObjectivePruningAnalyzer : SymbolicDataAnalysisSingleObjectiveAnalyzer {
+    #region parameter names
+    private const string ProblemDataParameterName = "ProblemData";
+    private const string UpdateIntervalParameterName = "UpdateInverval";
+    private const string UpdateCounterParameterName = "UpdateCounter";
+    private const string PopulationSliceParameterName = "PopulationSlice";
+    private const string PruningProbabilityParameterName = "PruningProbability";
+    private const string TotalNumberOfPrunedSubtreesParameterName = "Number of pruned subtrees";
+    private const string TotalNumberOfPrunedTreesParameterName = "Number of pruned trees";
+    private const string RandomParameterName = "Random";
+    private const string PruneOnlyZeroImpactNodesParameterName = "PruneOnlyZeroImpactNodes";
+    private const string NodeImpactThresholdParameterName = "ImpactThreshold";
+    private const string PruningOperatorParameterName = "PruningOperator";
+    private const string ResultsParameterName = "Results";
+    #endregion
+    #region private members
+    private DataReducer prunedSubtreesReducer;
+    private DataReducer prunedTreesReducer;
+    private DataTableValuesCollector valuesCollector;
+    private ResultsCollector resultsCollector;
+    private EmptyOperator emptyOp;
+    #endregion
+    #region parameter properties
+    public IValueParameter<SymbolicDataAnalysisExpressionPruningOperator> PruningOperatorParameter {
+      get { return (IValueParameter<SymbolicDataAnalysisExpressionPruningOperator>)Parameters[PruningOperatorParameterName]; }
+    }
+    public IFixedValueParameter<BoolValue> PruneOnlyZeroImpactNodesParameter {
+      get { return (IFixedValueParameter<BoolValue>)Parameters[PruneOnlyZeroImpactNodesParameterName]; }
+    }
+    public IFixedValueParameter<DoubleValue> NodeImpactThresholdParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters[NodeImpactThresholdParameterName]; }
+    }
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters[RandomParameterName]; }
+    }
+    private ILookupParameter<IDataAnalysisProblemData> ProblemDataParameter {
+      get { return (ILookupParameter<IDataAnalysisProblemData>)Parameters[ProblemDataParameterName]; }
+    }
+    public IValueParameter<IntValue> UpdateIntervalParameter {
+      get { return (IValueParameter<IntValue>)Parameters[UpdateIntervalParameterName]; }
+    }
+    public IValueParameter<IntValue> UpdateCounterParameter {
+      get { return (IValueParameter<IntValue>)Parameters[UpdateCounterParameterName]; }
+    }
+    public IValueParameter<DoubleRange> PopulationSliceParameter {
+      get { return (IValueParameter<DoubleRange>)Parameters[PopulationSliceParameterName]; }
+    }
+    public IValueParameter<DoubleValue> PruningProbabilityParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[PruningProbabilityParameterName]; }
+    }
+    #endregion
+    #region properties
+    protected SymbolicDataAnalysisExpressionPruningOperator PruningOperator { get { return PruningOperatorParameter.Value; } }
+    protected IDataAnalysisProblemData ProblemData { get { return ProblemDataParameter.ActualValue; } }
+    protected IntValue UpdateInterval { get { return UpdateIntervalParameter.Value; } }
+    protected IntValue UpdateCounter { get { return UpdateCounterParameter.Value; } }
+    protected DoubleRange PopulationSlice { get { return PopulationSliceParameter.Value; } }
+    protected DoubleValue PruningProbability { get { return PruningProbabilityParameter.Value; } }
+    protected IRandom Random { get { return RandomParameter.ActualValue; } }
+    protected DoubleValue NodeImpactThreshold { get { return NodeImpactThresholdParameter.Value; } }
+    protected BoolValue PruneOnlyZeroImpactNodes { get { return PruneOnlyZeroImpactNodesParameter.Value; } }
+    #endregion
+    #region IStatefulItem members
+    public override void InitializeState() {
+      base.InitializeState();
+      UpdateCounter.Value = 0;
+    }
+    public override void ClearState() {
+      base.ClearState();
+      UpdateCounter.Value = 0;
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected SymbolicDataAnalysisSingleObjectivePruningAnalyzer(bool deserializing) : base(deserializing) { }
+    protected SymbolicDataAnalysisSingleObjectivePruningAnalyzer(SymbolicDataAnalysisSingleObjectivePruningAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+      if (original.prunedSubtreesReducer != null)
+        this.prunedSubtreesReducer = (DataReducer)original.prunedSubtreesReducer.Clone();
+      if (original.prunedTreesReducer != null)
+        this.prunedTreesReducer = (DataReducer)original.prunedTreesReducer.Clone();
+      if (original.valuesCollector != null)
+        this.valuesCollector = (DataTableValuesCollector)original.valuesCollector.Clone();
+      if (original.resultsCollector != null)
+        this.resultsCollector = (ResultsCollector)original.resultsCollector.Clone();
+    }
+    protected SymbolicDataAnalysisSingleObjectivePruningAnalyzer() {
+      #region add parameters
+      Parameters.Add(new ValueParameter<DoubleRange>(PopulationSliceParameterName, new DoubleRange(0.75, 1)));
+      Parameters.Add(new ValueParameter<DoubleValue>(PruningProbabilityParameterName, new DoubleValue(0.5)));
+      Parameters.Add(new ValueParameter<IntValue>(UpdateIntervalParameterName, "The interval in which the tree length analysis should be applied.", new IntValue(1)));
+      Parameters.Add(new ValueParameter<IntValue>(UpdateCounterParameterName, "The value which counts how many times the operator was called", new IntValue(0)));
+      Parameters.Add(new LookupParameter<IRandom>(RandomParameterName));
+      Parameters.Add(new LookupParameter<IDataAnalysisProblemData>(ProblemDataParameterName));
+      Parameters.Add(new FixedValueParameter<DoubleValue>(NodeImpactThresholdParameterName, new DoubleValue(0.0)));
+      Parameters.Add(new FixedValueParameter<BoolValue>(PruneOnlyZeroImpactNodesParameterName, new BoolValue(false)));
+      #endregion
+    }
+
+    private void InitializeOperators() {
+      prunedSubtreesReducer = new DataReducer();
+      prunedSubtreesReducer.ParameterToReduce.ActualName = PruningOperator.PrunedSubtreesParameter.ActualName;
+      prunedSubtreesReducer.ReductionOperation.Value = new ReductionOperation(ReductionOperations.Sum); // sum all the pruned subtrees parameter values
+      prunedSubtreesReducer.TargetOperation.Value = new ReductionOperation(ReductionOperations.Assign); // asign the sum to the target parameter
+      prunedSubtreesReducer.TargetParameter.ActualName = TotalNumberOfPrunedSubtreesParameterName;
+
+      prunedTreesReducer = new DataReducer();
+      prunedTreesReducer.ParameterToReduce.ActualName = PruningOperator.PrunedTreesParameter.ActualName;
+      prunedTreesReducer.ReductionOperation.Value = new ReductionOperation(ReductionOperations.Sum);
+      prunedTreesReducer.TargetOperation.Value = new ReductionOperation(ReductionOperations.Assign);
+      prunedTreesReducer.TargetParameter.ActualName = TotalNumberOfPrunedTreesParameterName;
+
+      valuesCollector = new DataTableValuesCollector();
+      valuesCollector.CollectedValues.Add(new LookupParameter<IntValue>(TotalNumberOfPrunedSubtreesParameterName));
+      valuesCollector.CollectedValues.Add(new LookupParameter<IntValue>(TotalNumberOfPrunedTreesParameterName));
+      valuesCollector.DataTableParameter.ActualName = "Population pruning";
+
+      resultsCollector = new ResultsCollector();
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>("Population pruning"));
+      resultsCollector.ResultsParameter.ActualName = ResultsParameterName;
+
+      emptyOp = new EmptyOperator();
+    }
+
+    // 
+    /// <summary>
+    /// Computes the closed interval bounding the portion of the population that is to be pruned. 
+    /// </summary>
+    /// <returns>Returns an int range [start, end]</returns>
+    private IntRange GetSliceBounds() {
+      var count = ExecutionContext.Scope.SubScopes.Count;
+      var start = (int)Math.Round(PopulationSlice.Start * count);
+      var end = (int)Math.Round(PopulationSlice.End * count);
+      if (end > count) end = count;
+
+      if (start >= end) throw new ArgumentOutOfRangeException("Invalid PopulationSlice bounds.");
+      return new IntRange(start, end);
+    }
+
+    private IOperation CreatePruningOperation() {
+      var oc = new OperationCollection { Parallel = true };
+      var range = GetSliceBounds();
+      var qualities = Quality.Select(x => x.Value).ToArray();
+      var indices = Enumerable.Range(0, qualities.Length).ToArray();
+      Array.Sort(qualities, indices);
+      if (!Maximization.Value) Array.Reverse(indices);
+
+      var subscopes = ExecutionContext.Scope.SubScopes;
+
+      for (int i = 0; i < subscopes.Count; ++i) {
+        IOperator op;
+        if (range.Start <= i && i < range.End && Random.NextDouble() <= PruningProbability.Value)
+          op = PruningOperator;
+        else op = emptyOp;
+        var index = indices[i];
+        var subscope = subscopes[index];
+        oc.Add(ExecutionContext.CreateChildOperation(op, subscope));
+      }
+      return oc;
+    }
+
+    public override IOperation Apply() {
+      UpdateCounter.Value++;
+      if (UpdateCounter.Value != UpdateInterval.Value) return base.Apply();
+      UpdateCounter.Value = 0;
+
+      if (prunedSubtreesReducer == null || prunedTreesReducer == null || valuesCollector == null || resultsCollector == null) { InitializeOperators(); }
+
+      var prune = CreatePruningOperation();
+      var reducePrunedSubtrees = ExecutionContext.CreateChildOperation(prunedSubtreesReducer);
+      var reducePrunedTrees = ExecutionContext.CreateChildOperation(prunedTreesReducer);
+      var collectValues = ExecutionContext.CreateChildOperation(valuesCollector);
+      var collectResults = ExecutionContext.CreateChildOperation(resultsCollector);
+
+      return new OperationCollection { prune, reducePrunedSubtrees, reducePrunedTrees, collectValues, collectResults, base.Apply() };
+    }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Creators/MultiSymbolicDataAnalysisExpressionCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Creators/MultiSymbolicDataAnalysisExpressionCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Creators/MultiSymbolicDataAnalysisExpressionCreator.cs	(revision 10479)
@@ -95,5 +95,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (ClonedSymbolicExpressionTreeGrammarParameter.ActualValue == null) {
         SymbolicExpressionTreeGrammarParameter.ActualValue.ReadOnly = true;
@@ -104,5 +104,5 @@
         globalScope.Variables.Add(new Core.Variable(ClonedSymbolicExpressionTreeGrammarParameterName, (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone()));
       }
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/MultiSymbolicDataAnalysisExpressionCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/MultiSymbolicDataAnalysisExpressionCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/MultiSymbolicDataAnalysisExpressionCrossover.cs	(revision 10479)
@@ -109,4 +109,6 @@
       InitializeOperators();
       name = "MultiSymbolicDataAnalysisExpressionCrossover";
+
+      SelectedOperatorParameter.ActualName = "SelectedCrossoverOperator";
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Evaluators/SymbolicDataAnalysisEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Evaluators/SymbolicDataAnalysisEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Evaluators/SymbolicDataAnalysisEvaluator.cs	(revision 10479)
@@ -35,5 +35,5 @@
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
   [StorableClass]
-  public abstract class SymbolicDataAnalysisEvaluator<T> : SingleSuccessorOperator,
+  public abstract class SymbolicDataAnalysisEvaluator<T> : InstrumentedOperator,
     ISymbolicDataAnalysisEvaluator<T>, ISymbolicDataAnalysisInterpreterOperator, ISymbolicDataAnalysisBoundedOperator, IStochasticOperator
   where T : class, IDataAnalysisProblemData {
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj	(revision 10479)
@@ -112,4 +112,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Analyzers\SymbolicDataAnalysisSingleObjectivePruningAnalyzer.cs" />
     <Compile Include="Analyzers\SymbolicDataAnalysisSingleObjectiveValidationParetoBestSolutionAnalyzer.cs" />
     <Compile Include="Analyzers\SymbolicDataAnalysisSingleObjectiveTrainingParetoBestSolutionAnalyzer.cs" />
@@ -125,4 +126,5 @@
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="SymbolicDataAnalysisExpressionPruningOperator.cs" />
     <Compile Include="Analyzers\SymbolicDataAnalysisVariableFrequencyAnalyzer.cs" />
     <Compile Include="Analyzers\SymbolicDataAnalysisAlleleFrequencyAnalyzer.cs" />
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interfaces/ISymbolicDataAnalysisImpactValuesCalculator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interfaces/ISymbolicDataAnalysisImpactValuesCalculator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interfaces/ISymbolicDataAnalysisImpactValuesCalculator.cs	(revision 10479)
@@ -1,9 +1,12 @@
 ﻿using System.Collections.Generic;
+using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
-  public interface ISymbolicDataAnalysisSolutionImpactValuesCalculator {
+  public interface ISymbolicDataAnalysisSolutionImpactValuesCalculator : IItem {
     double CalculateReplacementValue(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData, IEnumerable<int> rows);
     double CalculateImpactValue(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData, IEnumerable<int> rows, double originalQuality = double.NaN);
+    void CalculateImpactAndReplacementValues(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData,
+      IEnumerable<int> rows, out double impactValue, out double replacementValue, double originalQuality = double.NaN);
   }
 }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Plugin.cs.frame
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Plugin.cs.frame	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Plugin.cs.frame	(revision 10479)
@@ -38,4 +38,5 @@
   [PluginDependency("HeuristicLab.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionPruningOperator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionPruningOperator.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionPruningOperator.cs	(revision 10479)
@@ -0,0 +1,163 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
+  [StorableClass]
+  [Item("SymbolicExpressionTreePruningOperator", "An operator that replaces introns with constant values in a symbolic expression tree.")]
+  public abstract class SymbolicDataAnalysisExpressionPruningOperator : SingleSuccessorOperator {
+    #region parameter names
+    private const string ProblemDataParameterName = "ProblemData";
+    private const string SymbolicDataAnalysisModelParameterName = "SymbolicDataAnalysisModel";
+    private const string ImpactValuesCalculatorParameterName = "ImpactValuesCalculator";
+    private const string PrunedSubtreesParameterName = "PrunedSubtrees";
+    private const string PrunedTreesParameterName = "PrunedTrees";
+    private const string FitnessCalculationPartitionParameterName = "FitnessCalculationPartition";
+    private const string NodeImpactThresholdParameterName = "ImpactThreshold";
+    private const string PruneOnlyZeroImpactNodesParameterName = "PruneOnlyZeroImpactNodes";
+    private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree"; // the tree to be pruned
+    private const string QualityParameterName = "Quality"; // the quality 
+    private const string EstimationLimitsParameterName = "EstimationLimits";
+    private const string InterpreterParameterName = "SymbolicExpressionTreeInterpreter";
+    #endregion
+
+    #region parameter properties
+    public ILookupParameter<ISymbolicExpressionTree> SymbolicExpressionTreeParameter {
+      get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
+    }
+    public ILookupParameter<IDataAnalysisProblemData> ProblemDataParameter {
+      get { return (ILookupParameter<IDataAnalysisProblemData>)Parameters[ProblemDataParameterName]; }
+    }
+    public IValueParameter<ISymbolicDataAnalysisSolutionImpactValuesCalculator> ImpactValuesCalculatorParameter {
+      get { return (IValueParameter<ISymbolicDataAnalysisSolutionImpactValuesCalculator>)Parameters[ImpactValuesCalculatorParameterName]; }
+    }
+    public ILookupParameter<IntRange> FitnessCalculationPartitionParameter {
+      get { return (ILookupParameter<IntRange>)Parameters[FitnessCalculationPartitionParameterName]; }
+    }
+    public ILookupParameter<IntValue> PrunedSubtreesParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[PrunedSubtreesParameterName]; }
+    }
+    public ILookupParameter<IntValue> PrunedTreesParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[PrunedTreesParameterName]; }
+    }
+    public IFixedValueParameter<DoubleValue> NodeImpactThresholdParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters[NodeImpactThresholdParameterName]; }
+    }
+    public IFixedValueParameter<BoolValue> PruneOnlyZeroImpactNodesParameter {
+      get { return (IFixedValueParameter<BoolValue>)Parameters[PruneOnlyZeroImpactNodesParameterName]; }
+    }
+    public ILookupParameter<DoubleLimit> EstimationLimitsParameter {
+      get { return (ILookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; }
+    }
+    public ILookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter> InterpreterParameter {
+      get { return (ILookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>)Parameters[InterpreterParameterName]; }
+    }
+    #endregion
+    #region properties
+    protected IDataAnalysisProblemData ProblemData { get { return ProblemDataParameter.ActualValue; } }
+    protected ISymbolicDataAnalysisSolutionImpactValuesCalculator ImpactValuesCalculator { get { return ImpactValuesCalculatorParameter.Value; } }
+    protected IntRange FitnessCalculationPartition { get { return FitnessCalculationPartitionParameter.ActualValue; } }
+    protected BoolValue PruneOnlyZeroImpactNodes { get { return PruneOnlyZeroImpactNodesParameter.Value; } }
+    protected DoubleValue NodeImpactThreshold { get { return NodeImpactThresholdParameter.Value; } }
+    protected ISymbolicExpressionTree SymbolicExpressionTree { get { return SymbolicExpressionTreeParameter.ActualValue; } }
+    protected DoubleValue Quality { get { return QualityParameter.ActualValue; } }
+    protected DoubleLimit EstimationLimits { get { return EstimationLimitsParameter.ActualValue; } }
+    protected ISymbolicDataAnalysisExpressionTreeInterpreter Interpreter { get { return InterpreterParameter.ActualValue; } }
+    #endregion
+
+    [StorableConstructor]
+    protected SymbolicDataAnalysisExpressionPruningOperator(bool deserializing) : base(deserializing) { }
+    protected SymbolicDataAnalysisExpressionPruningOperator(SymbolicDataAnalysisExpressionPruningOperator original, Cloner cloner)
+      : base(original, cloner) { }
+
+    protected SymbolicDataAnalysisExpressionPruningOperator() {
+      #region add parameters
+      Parameters.Add(new LookupParameter<IDataAnalysisProblemData>(ProblemDataParameterName));
+      Parameters.Add(new LookupParameter<ISymbolicDataAnalysisModel>(SymbolicDataAnalysisModelParameterName));
+      Parameters.Add(new LookupParameter<IntRange>(FitnessCalculationPartitionParameterName));
+      Parameters.Add(new LookupParameter<IntValue>(PrunedSubtreesParameterName, "A counter of how many subtrees were replaced."));
+      Parameters.Add(new LookupParameter<IntValue>(PrunedTreesParameterName, "A counter of how many trees were pruned."));
+      Parameters.Add(new FixedValueParameter<BoolValue>(PruneOnlyZeroImpactNodesParameterName, "Specify whether or not only zero impact nodes should be pruned."));
+      Parameters.Add(new FixedValueParameter<DoubleValue>(NodeImpactThresholdParameterName, "Specifies an impact value threshold below which nodes should be pruned."));
+      Parameters.Add(new LookupParameter<DoubleLimit>(EstimationLimitsParameterName));
+      Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(InterpreterParameterName));
+      Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(SymbolicExpressionTreeParameterName));
+      Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName));
+      #endregion
+    }
+    public override IOperation Apply() {
+      var model = CreateModel();
+      var nodes = SymbolicExpressionTree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix().ToList();
+      var rows = Enumerable.Range(FitnessCalculationPartition.Start, FitnessCalculationPartition.Size).ToList();
+
+      var prunedSubtrees = 0;
+      var prunedTrees = 0;
+
+      double quality = Evaluate(model);
+
+      for (int i = 0; i < nodes.Count; ++i) {
+        var node = nodes[i];
+        if (node is ConstantTreeNode) continue;
+
+        double impactValue, replacementValue;
+        ImpactValuesCalculator.CalculateImpactAndReplacementValues(model, node, ProblemData, rows, out impactValue, out replacementValue, quality);
+
+        if (PruneOnlyZeroImpactNodes.Value && (!impactValue.IsAlmost(0.0))) continue;
+        else if (NodeImpactThreshold.Value < impactValue) continue;
+
+        var constantNode = new ConstantTreeNode(new Constant()) { Value = replacementValue };
+        ReplaceWithConstant(node, constantNode);
+        i += node.GetLength() - 1; // skip subtrees under the node that was folded
+
+        quality -= impactValue;
+
+        prunedSubtrees++;
+      }
+
+      if (prunedSubtrees > 0) prunedTrees = 1;
+      PrunedSubtreesParameter.ActualValue = new IntValue(prunedSubtrees);
+      PrunedTreesParameter.ActualValue = new IntValue(prunedTrees);
+
+      return base.Apply();
+    }
+    private static void ReplaceWithConstant(ISymbolicExpressionTreeNode original, ISymbolicExpressionTreeNode replacement) {
+      var parent = original.Parent;
+      var i = parent.IndexOfSubtree(original);
+      parent.RemoveSubtree(i);
+      parent.InsertSubtree(i, replacement);
+    }
+    protected abstract ISymbolicDataAnalysisModel CreateModel();
+    protected abstract double Evaluate(IDataAnalysisModel model);
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisSolutionImpactValuesCalculator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisSolutionImpactValuesCalculator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisSolutionImpactValuesCalculator.cs	(revision 10479)
@@ -22,10 +22,21 @@
 using System.Collections.Generic;
 using HeuristicLab.Common;
+using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
-  public abstract class SymbolicDataAnalysisSolutionImpactValuesCalculator : ISymbolicDataAnalysisSolutionImpactValuesCalculator {
+  [StorableClass]
+  [Item("SymbolicDataAnalysisSolutionImpactValuesCalculator", "Calculates the impact values and replacements values for symbolic expression tree nodes.")]
+  public abstract class SymbolicDataAnalysisSolutionImpactValuesCalculator : Item, ISymbolicDataAnalysisSolutionImpactValuesCalculator {
+    protected SymbolicDataAnalysisSolutionImpactValuesCalculator() { }
+
+    protected SymbolicDataAnalysisSolutionImpactValuesCalculator(SymbolicDataAnalysisSolutionImpactValuesCalculator original, Cloner cloner)
+      : base(original, cloner) { }
+    [StorableConstructor]
+    protected SymbolicDataAnalysisSolutionImpactValuesCalculator(bool deserializing) : base(deserializing) { }
     public abstract double CalculateReplacementValue(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData, IEnumerable<int> rows);
     public abstract double CalculateImpactValue(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData, IEnumerable<int> rows, double originalQuality = double.NaN);
+    public abstract void CalculateImpactAndReplacementValues(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData, IEnumerable<int> rows, out double impactValue, out double replacementValue, double originalQuality = double.NaN);
 
     protected static double CalculateReplacementValue(ISymbolicExpressionTreeNode node, ISymbolicExpressionTree sourceTree, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter,
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Trading/3.4/Symbolic/SingleObjective/ProfitEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Trading/3.4/Symbolic/SingleObjective/ProfitEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Trading/3.4/Symbolic/SingleObjective/ProfitEvaluator.cs	(revision 10479)
@@ -47,5 +47,5 @@
     public override bool Maximization { get { return true; } }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       IEnumerable<int> rows = GenerateRowsToEvaluate();
@@ -54,5 +54,5 @@
       QualityParameter.ActualValue = new DoubleValue(quality);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Trading/3.4/Symbolic/SingleObjective/SharpeRatioEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Trading/3.4/Symbolic/SingleObjective/SharpeRatioEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Trading/3.4/Symbolic/SingleObjective/SharpeRatioEvaluator.cs	(revision 10479)
@@ -47,5 +47,5 @@
     public override bool Maximization { get { return true; } }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = SymbolicExpressionTreeParameter.ActualValue;
       IEnumerable<int> rows = GenerateRowsToEvaluate();
@@ -54,5 +54,5 @@
       QualityParameter.ActualValue = new DoubleValue(quality);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs	(revision 10479)
@@ -76,14 +76,14 @@
         var values = variableValues.ElementAt(i);
         IList clonedValues = null;
-        if (values is List<double>)
+        if (values is IList<double>)
           clonedValues = new List<double>(values.Cast<double>());
-        else if (values is List<string>)
+        else if (values is IList<string>)
           clonedValues = new List<string>(values.Cast<string>());
-        else if (values is List<DateTime>)
+        else if (values is IList<DateTime>)
           clonedValues = new List<DateTime>(values.Cast<DateTime>());
         else {
           this.variableNames = new List<string>();
           this.variableValues = new Dictionary<string, IList>();
-          throw new ArgumentException("The variable values must be of type List<double>, List<string> or List<DateTime>");
+          throw new ArgumentException("The variable values must be of type IList<double>, IList<string> or IList<DateTime>");
         }
         this.variableValues.Add(this.variableNames[i], clonedValues);
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/FeatureSelection/FeatureSelection.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/FeatureSelection/FeatureSelection.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/FeatureSelection/FeatureSelection.cs	(revision 10479)
@@ -48,5 +48,5 @@
                + "Where is the S is a N x d matrix containing the selected columns from N x k the matrix of all features X" + Environment.NewLine
                + "For each feature the probability that it is selected is " + selectionProbability + "%" + Environment.NewLine
-               + "X(i,j) ~ N(0, 1) iid, w(i) ~ U(0, 10) iid, n ~ N(0, sigma(w*S) * SQRT(" + noiseRatio + "))" + Environment.NewLine
+               + "X(i,j) ~ N(0, 1) iid, w(i) ~ U(0, 10) iid, n ~ N(0, sigma(w*S) * SQRT(" + noiseRatio / (1 - noiseRatio)  + "))" + Environment.NewLine
                + "The noise level is " + noiseRatio + " * sigma, thus an optimal model has R² = "
                + Math.Round(optimalRSquared, 2) + " (or equivalently: NMSE = " + noiseRatio + ")" + Environment.NewLine
@@ -131,5 +131,5 @@
       }
       var targetSigma = target.StandardDeviation();
-      var noisePrng = new NormalDistributedRandom(random, 0, targetSigma * Math.Sqrt(noiseRatio));
+      var noisePrng = new NormalDistributedRandom(random, 0, targetSigma * Math.Sqrt(noiseRatio / (1.0 - noiseRatio)));
 
       data.Add(target.Select(t => t + noisePrng.NextDouble()).ToList());
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs	(revision 10479)
@@ -23,6 +23,6 @@
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
-  public abstract class CordeauFormatInstanceProvider : VRPInstanceProvider<MDCVRPTWData> {
-    protected override MDCVRPTWData LoadData(Stream stream) {
+  public abstract class CordeauFormatInstanceProvider : VRPInstanceProvider {
+    protected override VRPData LoadData(Stream stream) {
       return LoadInstance(new CordeauParser(stream));
     }
@@ -31,5 +31,5 @@
       get { return true; }
     }
-    public override MDCVRPTWData ImportData(string path) {
+    public override VRPData ImportData(string path) {
       return LoadInstance(new CordeauParser(path));
     }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenFormatInstanceProvider.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenFormatInstanceProvider.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenFormatInstanceProvider.cs	(revision 10479)
@@ -24,6 +24,6 @@
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
-  public abstract class GoldenFormatInstanceProvider : VRPInstanceProvider<CVRPTWData> {
-    protected override CVRPTWData LoadData(Stream stream) {
+  public abstract class GoldenFormatInstanceProvider : VRPInstanceProvider {
+    protected override VRPData LoadData(Stream stream) {
       return LoadInstance(new GoldenParser(stream));
     }
@@ -32,5 +32,5 @@
       get { return true; }
     }
-    public override CVRPTWData ImportData(string path) {
+    public override VRPData ImportData(string path) {
       return LoadInstance(new GoldenParser(path));
     }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimFormatInstanceProvider.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimFormatInstanceProvider.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimFormatInstanceProvider.cs	(revision 10479)
@@ -23,6 +23,6 @@
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
-  public abstract class LiLimFormatInstanceProvider : VRPInstanceProvider<PDPTWData> {
-    protected override PDPTWData LoadData(Stream stream) {
+  public abstract class LiLimFormatInstanceProvider : VRPInstanceProvider {
+    protected override VRPData LoadData(Stream stream) {
       return LoadInstance(new LiLimParser(stream));
     }
@@ -31,5 +31,5 @@
       get { return true; }
     }
-    public override PDPTWData ImportData(string path) {
+    public override VRPData ImportData(string path) {
       return LoadInstance(new LiLimParser(path));
     }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonFormatInstanceProvider.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonFormatInstanceProvider.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonFormatInstanceProvider.cs	(revision 10479)
@@ -23,6 +23,6 @@
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
-  public abstract class SolomonFormatInstanceProvider : VRPInstanceProvider<CVRPTWData> {
-    protected override CVRPTWData LoadData(Stream stream) {
+  public abstract class SolomonFormatInstanceProvider : VRPInstanceProvider {
+    protected override VRPData LoadData(Stream stream) {
       return LoadInstance(new SolomonParser(stream));
     }
@@ -31,5 +31,5 @@
       get { return true; }
     }
-    public override CVRPTWData ImportData(string path) {
+    public override VRPData ImportData(string path) {
       return LoadInstance(new SolomonParser(path));
     }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/TSPLibFormatInstanceProvider.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/TSPLibFormatInstanceProvider.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/TSPLibFormatInstanceProvider.cs	(revision 10479)
@@ -25,6 +25,6 @@
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
-  public abstract class TSPLibFormatInstanceProvider : VRPInstanceProvider<CVRPData> {
-    protected override CVRPData LoadData(Stream stream) {
+  public abstract class TSPLibFormatInstanceProvider : VRPInstanceProvider {
+    protected override VRPData LoadData(Stream stream) {
       return LoadInstance(new TSPLIBParser(stream));
     }
@@ -33,5 +33,5 @@
       get { return true; }
     }
-    public override CVRPData ImportData(string path) {
+    public override VRPData ImportData(string path) {
       return LoadInstance(new TSPLIBParser(path));
     }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardFormatInstanceProvider.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardFormatInstanceProvider.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardFormatInstanceProvider.cs	(revision 10479)
@@ -23,6 +23,6 @@
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
-  public abstract class TaillardFormatInstanceProvider : VRPInstanceProvider<CVRPData> {
-    protected override CVRPData LoadData(Stream stream) {
+  public abstract class TaillardFormatInstanceProvider : VRPInstanceProvider {
+    protected override VRPData LoadData(Stream stream) {
       return LoadInstance(new TaillardParser(stream));
     }
@@ -31,5 +31,5 @@
       get { return true; }
     }
-    public override CVRPData ImportData(string path) {
+    public override VRPData ImportData(string path) {
       return LoadInstance(new TaillardParser(path));
     }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs	(revision 10479)
@@ -29,5 +29,5 @@
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
-  public abstract class VRPInstanceProvider<T> : ProblemInstanceProvider<T>, IVRPInstanceProvider where T : IVRPData {
+  public abstract class VRPInstanceProvider : ProblemInstanceProvider<VRPData>, IVRPInstanceProvider {
     protected abstract string FileName { get; }
 
@@ -52,5 +52,5 @@
     }
 
-    public override T LoadData(IDataDescriptor id) {
+    public override VRPData LoadData(IDataDescriptor id) {
       var descriptor = (VRPDataDescriptor)id;
       var instanceArchiveName = GetResourceName(FileName + @"\.zip");
@@ -76,5 +76,5 @@
     }
 
-    private static void LoadSolution(Stream stream, T instance) {
+    private static void LoadSolution(Stream stream, VRPData instance) {
       List<List<int>> routes = new List<List<int>>();
 
@@ -99,5 +99,5 @@
     }
 
-    public static void LoadSolution(string path, T instance) {
+    public static void LoadSolution(string path, VRPData instance) {
       using (FileStream stream = new FileStream(path, FileMode.Open)) {
         LoadSolution(stream, instance);
@@ -105,5 +105,5 @@
     }
 
-    protected abstract T LoadData(Stream stream);
+    protected abstract VRPData LoadData(Stream stream);
 
     public IVRPData Import(string vrpFile, string tourFile) {
@@ -116,5 +116,5 @@
 
     public void Export(IVRPData instance, string path) {
-      ExportData((T)instance, path);
+      ExportData((VRPData)instance, path);
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Knapsack/3.3/Evaluators/KnapsackEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Knapsack/3.3/Evaluators/KnapsackEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Knapsack/3.3/Evaluators/KnapsackEvaluator.cs	(revision 10479)
@@ -35,5 +35,5 @@
   [Item("KnapsackEvaluator", "Evaluates solutions for the Knapsack problem.")]
   [StorableClass]
-  public class KnapsackEvaluator : SingleSuccessorOperator, IKnapsackEvaluator {
+  public class KnapsackEvaluator : InstrumentedOperator, IKnapsackEvaluator {
     public ILookupParameter<DoubleValue> QualityParameter {
       get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
@@ -129,5 +129,5 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       BinaryVector v = BinaryVectorParameter.ActualValue;
 
@@ -143,5 +143,5 @@
       AppliedPenaltyParameter.ActualValue = evaluation.AppliedPenalty;
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.LawnMower/3.3/Evaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.LawnMower/3.3/Evaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.LawnMower/3.3/Evaluator.cs	(revision 10479)
@@ -32,5 +32,5 @@
   [StorableClass]
   [Item("Lawn Mower Evaluator", "Evaluator for the lawn mower demo GP problem.")]
-  public class Evaluator : SingleSuccessorOperator, ISingleObjectiveEvaluator {
+  public class Evaluator : InstrumentedOperator, ISingleObjectiveEvaluator {
 
     private const string QualityParameterName = "Quality";
@@ -72,5 +72,5 @@
       return new Evaluator(this, cloner);
     }
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       int length = LawnLengthParameter.ActualValue.Value;
       int width = LawnWidthParameter.ActualValue.Value;
@@ -88,5 +88,5 @@
 
       QualityParameter.ActualValue = new DoubleValue(numberOfMowedCells);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.LawnMower/3.3/Interpreter.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.LawnMower/3.3/Interpreter.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.LawnMower/3.3/Interpreter.cs	(revision 10479)
@@ -54,5 +54,4 @@
       lawn[mowerState.Position.Item1, mowerState.Position.Item2] = true;
       EvaluateLawnMowerProgram(tree.Root, mowerState, lawn, tree.Root.Subtrees.Skip(1).ToArray());
-
       return lawn;
     }
@@ -115,7 +114,10 @@
       } else if (node.Symbol is Frog) {
         var p = EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs);
-
-        uint newRow = (uint)((mowerState.Position.Item1 + lawn.GetLength(0) + p.Item1 % lawn.GetLength(0)) % lawn.GetLength(0));
-        uint newCol = (uint)((mowerState.Position.Item2 + lawn.GetLength(1) + p.Item2 % lawn.GetLength(1)) % lawn.GetLength(1));
+        int x = p.Item1;
+        int y = p.Item2;
+        while (x < 0) x += lawn.GetLength(0);
+        while (y < 0) y += lawn.GetLength(1);
+        var newRow = (uint)((mowerState.Position.Item1 + x) % lawn.GetLength(0));
+        var newCol = (uint)((mowerState.Position.Item2 + y) % lawn.GetLength(1));
         mowerState.Position = new Tuple<uint, uint>(newRow, newCol);
         mowerState.Energy = mowerState.Energy - 1;
@@ -130,5 +132,5 @@
                                   select adf).Single();
         // clone the function definition because we are replacing the argument nodes
-        functionDefinition = (DefunTreeNode) functionDefinition.Clone();
+        functionDefinition = (DefunTreeNode)functionDefinition.Clone();
         // find the argument tree nodes and their parents in the original function definition
         // toList is necessary to prevent that newly inserted branches are iterated
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.LinearAssignment/3.3/LAPEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.LinearAssignment/3.3/LAPEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.LinearAssignment/3.3/LAPEvaluator.cs	(revision 10479)
@@ -32,5 +32,5 @@
   [Item("LAPEvaluator", "Evaluates a solution to the linear assignment problem.")]
   [StorableClass]
-  public class LAPEvaluator : SingleSuccessorOperator, ILAPEvaluator {
+  public class LAPEvaluator : InstrumentedOperator, ILAPEvaluator {
 
     public ILookupParameter<DoubleMatrix> CostsParameter {
@@ -47,5 +47,6 @@
     protected LAPEvaluator(bool deserializing) : base(deserializing) { }
     protected LAPEvaluator(LAPEvaluator original, Cloner cloner) : base(original, cloner) { }
-    public LAPEvaluator() : base() {
+    public LAPEvaluator()
+      : base() {
       Parameters.Add(new LookupParameter<DoubleMatrix>("Costs", LinearAssignmentProblem.CostsDescription));
       Parameters.Add(new LookupParameter<Permutation>("Assignment", "The assignment solution to evaluate."));
@@ -57,5 +58,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var costs = CostsParameter.ActualValue;
       var assignment = AssignmentParameter.ActualValue;
@@ -69,5 +70,5 @@
 
       QualityParameter.ActualValue = new DoubleValue(quality);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.OneMax/3.3/Evaluators/OneMaxEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.OneMax/3.3/Evaluators/OneMaxEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.OneMax/3.3/Evaluators/OneMaxEvaluator.cs	(revision 10479)
@@ -34,5 +34,5 @@
   [Item("OneMaxEvaluator", "Evaluates solutions for the OneMax problem.")]
   [StorableClass]
-  public class OneMaxEvaluator : SingleSuccessorOperator, IOneMaxEvaluator {
+  public class OneMaxEvaluator : InstrumentedOperator, IOneMaxEvaluator {
     public ILookupParameter<DoubleValue> QualityParameter {
       get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
@@ -56,5 +56,5 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       BinaryVector v = BinaryVectorParameter.ActualValue;
 
@@ -67,5 +67,5 @@
       QualityParameter.ActualValue = new DoubleValue(quality);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.QuadraticAssignment/3.3/Evaluators/QAPEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.QuadraticAssignment/3.3/Evaluators/QAPEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.QuadraticAssignment/3.3/Evaluators/QAPEvaluator.cs	(revision 10479)
@@ -30,5 +30,5 @@
 namespace HeuristicLab.Problems.QuadraticAssignment {
   [StorableClass]
-  public class QAPEvaluator : SingleSuccessorOperator, IQAPEvaluator {
+  public class QAPEvaluator : InstrumentedOperator, IQAPEvaluator {
 
     public ILookupParameter<Permutation> PermutationParameter {
@@ -78,5 +78,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       Permutation assignment = PermutationParameter.ActualValue;
       DoubleMatrix weights = WeightsParameter.ActualValue;
@@ -86,5 +86,5 @@
       QualityParameter.ActualValue = new DoubleValue(quality);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Scheduling.Views/3.3/JobShopSchedulingProblemView.Designer.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Scheduling.Views/3.3/JobShopSchedulingProblemView.Designer.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Scheduling.Views/3.3/JobShopSchedulingProblemView.Designer.cs	(revision 10479)
@@ -60,19 +60,7 @@
       this.SuspendLayout();
       // 
-      // problemInstanceSplitContainer
-      // 
-      this.problemInstanceSplitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
-      this.problemInstanceSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
-      // 
       // problemInstanceSplitContainer.Panel2
       // 
       this.problemInstanceSplitContainer.Panel2.Controls.Add(this.problemTabControl);
-      // 
-      // ProblemInstanceConsumerViewHost
-      // 
-      this.problemInstanceProviderViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
-      this.problemInstanceProviderViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.problemInstanceProviderViewHost.Location = new System.Drawing.Point(0, 0);
-      this.problemInstanceProviderViewHost.Size = new System.Drawing.Size(511, 26);
       // 
       // parameterCollectionView
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Scheduling.Views/3.3/JobShopSchedulingProblemView.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Scheduling.Views/3.3/JobShopSchedulingProblemView.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Scheduling.Views/3.3/JobShopSchedulingProblemView.cs	(revision 10479)
@@ -20,5 +20,8 @@
 #endregion
 
+using System;
 using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Encodings.ScheduleEncoding;
 using HeuristicLab.MainForm;
 using HeuristicLab.Optimization.Views;
@@ -43,17 +46,60 @@
     protected override void OnContentChanged() {
       base.OnContentChanged();
-      if (Content == null) {
-        ganttChart.Reset();
-      } else {
-        FillGanttChart(Content);
+      FillGanttChart();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.JobDataParameter.ValueChanged -= JobDataParameterOnValueChanged;
+      Content.JobData.ItemsAdded -= JobsOnChanged;
+      Content.JobData.ItemsRemoved -= JobsOnChanged;
+      Content.JobData.ItemsReplaced -= JobsOnChanged;
+      Content.JobData.CollectionReset -= JobsOnChanged;
+      foreach (var job in Content.JobData) {
+        job.TasksChanged -= JobOnTasksChanged;
+      }
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.JobDataParameter.ValueChanged += JobDataParameterOnValueChanged;
+      Content.JobData.ItemsAdded += JobsOnChanged;
+      Content.JobData.ItemsRemoved += JobsOnChanged;
+      Content.JobData.ItemsReplaced += JobsOnChanged;
+      Content.JobData.CollectionReset += JobsOnChanged;
+      foreach (var job in Content.JobData) {
+        job.TasksChanged += JobOnTasksChanged;
       }
     }
 
-    private void FillGanttChart(JobShopSchedulingProblem content) {
+    private void JobsOnChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<Job>> e) {
+      foreach (var job in e.OldItems)
+        job.Value.TasksChanged -= JobOnTasksChanged;
+      foreach (var job in e.Items)
+        job.Value.TasksChanged += JobOnTasksChanged;
+      FillGanttChart();
+    }
+
+    private void JobDataParameterOnValueChanged(object sender, EventArgs e) {
+      Content.JobData.ItemsAdded += JobsOnChanged;
+      Content.JobData.ItemsRemoved += JobsOnChanged;
+      Content.JobData.ItemsReplaced += JobsOnChanged;
+      Content.JobData.CollectionReset += JobsOnChanged;
+      foreach (var job in Content.JobData) {
+        job.TasksChanged += JobOnTasksChanged;
+      }
+      FillGanttChart();
+    }
+
+    private void JobOnTasksChanged(object sender, EventArgs e) {
+      FillGanttChart();
+    }
+
+    private void FillGanttChart() {
       ganttChart.Reset();
+      if (Content == null) return;
       int jobCount = 0;
-      foreach (var j in content.JobData) {
+      foreach (var j in Content.JobData) {
         double lastEndTime = 0;
-        foreach (var t in content.JobData[jobCount].Tasks) {
+        foreach (var t in Content.JobData[jobCount].Tasks) {
           int categoryNr = t.JobNr;
           string categoryName = "Job" + categoryNr;
@@ -63,5 +109,5 @@
             lastEndTime + 1,
             lastEndTime + t.Duration,
-            "Job" + t.JobNr + " - " + "Task#" + t.TaskNr.ToString());
+            "Job" + t.JobNr + " - " + "Task#" + t.TaskNr);
           lastEndTime += t.Duration;
         }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Scheduling/3.3/Evaluators/ScheduleEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Scheduling/3.3/Evaluators/ScheduleEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Scheduling/3.3/Evaluators/ScheduleEvaluator.cs	(revision 10479)
@@ -31,5 +31,5 @@
   [Item("Schedule Evaluator", "Represents a base class for schedule evaluators.")]
   [StorableClass]
-  public abstract class ScheduleEvaluator : SingleSuccessorOperator, IScheduleEvaluator {
+  public abstract class ScheduleEvaluator : InstrumentedOperator, IScheduleEvaluator {
 
     public ILookupParameter<DoubleValue> QualityParameter {
@@ -51,7 +51,7 @@
     protected abstract double Evaluate(Schedule schedule);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       QualityParameter.ActualValue = new DoubleValue(Evaluate(ScheduleParameter.ActualValue));
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Scheduling/3.3/Evaluators/SchedulingEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Scheduling/3.3/Evaluators/SchedulingEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.Scheduling/3.3/Evaluators/SchedulingEvaluator.cs	(revision 10479)
@@ -32,8 +32,8 @@
   [Item("SchedulingEvaluator", "First applies the decoder operator to obtain a schedule from an encoding and then applies the evaluator to obtain a quality.")]
   [StorableClass]
-  public class SchedulingEvaluator : SingleSuccessorOperator, ISchedulingEvaluator {
+  public class SchedulingEvaluator : InstrumentedOperator, ISchedulingEvaluator {
 
     public IValueLookupParameter<IScheduleDecoder> ScheduleDecoderParameter {
-      get { return (IValueLookupParameter<IScheduleDecoder>) Parameters["ScheduleDecoder"]; }
+      get { return (IValueLookupParameter<IScheduleDecoder>)Parameters["ScheduleDecoder"]; }
     }
     ILookupParameter<IScheduleDecoder> ISchedulingEvaluator.ScheduleDecoderParameter {
@@ -41,5 +41,5 @@
     }
     public IValueLookupParameter<IScheduleEvaluator> ScheduleEvaluatorParameter {
-      get { return (IValueLookupParameter<IScheduleEvaluator>) Parameters["ScheduleEvaluator"]; }
+      get { return (IValueLookupParameter<IScheduleEvaluator>)Parameters["ScheduleEvaluator"]; }
     }
     ILookupParameter<IScheduleEvaluator> ISchedulingEvaluator.ScheduleEvaluatorParameter {
@@ -65,10 +65,10 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var decoder = ScheduleDecoderParameter.ActualValue;
       var evaluator = ScheduleEvaluatorParameter.ActualValue;
       if (evaluator == null) throw new InvalidOperationException("A ScheduleEvaluator could not be found.");
 
-      var operations = new OperationCollection(base.Apply());
+      var operations = new OperationCollection(base.InstrumentedApply());
       operations.Insert(0, ExecutionContext.CreateChildOperation(evaluator));
       if (decoder != null) // decode before evaluating
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.TestFunctions/3.3/Evaluators/SingleObjectiveTestFunctionProblemEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.TestFunctions/3.3/Evaluators/SingleObjectiveTestFunctionProblemEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.TestFunctions/3.3/Evaluators/SingleObjectiveTestFunctionProblemEvaluator.cs	(revision 10479)
@@ -34,5 +34,5 @@
   [Item("Evaluator", "Base calls for single objective test function evaluators.")]
   [StorableClass]
-  public abstract class SingleObjectiveTestFunctionProblemEvaluator : SingleSuccessorOperator, ISingleObjectiveTestFunctionProblemEvaluator {
+  public abstract class SingleObjectiveTestFunctionProblemEvaluator : InstrumentedOperator, ISingleObjectiveTestFunctionProblemEvaluator {
     /// <summary>
     /// The name of the function
@@ -86,9 +86,9 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       RealVector point = PointParameter.ActualValue;
       double quality = Evaluate(point);
       QualityParameter.ActualValue = new DoubleValue(quality);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPCoordinatesPathEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPCoordinatesPathEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPCoordinatesPathEvaluator.cs	(revision 10479)
@@ -84,5 +84,5 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       if (UseDistanceMatrixParameter.ActualValue.Value) {
         Permutation p = PermutationParameter.ActualValue;
@@ -120,5 +120,5 @@
         QualityParameter.ActualValue = new DoubleValue(length);
       }
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPDistanceMatrixEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPDistanceMatrixEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPDistanceMatrixEvaluator.cs	(revision 10479)
@@ -69,10 +69,10 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       Permutation p = PermutationParameter.ActualValue;
       DistanceMatrix dm = DistanceMatrixParameter.ActualValue;
 
       QualityParameter.ActualValue = new DoubleValue(Apply(dm, p));
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPEvaluator.cs	(revision 10479)
@@ -33,5 +33,5 @@
   [Item("TSPEvaluator", "A base class for operators which evaluate TSP solutions.")]
   [StorableClass]
-  public abstract class TSPEvaluator : SingleSuccessorOperator, ITSPEvaluator {
+  public abstract class TSPEvaluator : InstrumentedOperator, ITSPEvaluator {
     public override bool CanChangeName {
       get { return false; }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Creators/AlbaCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Creators/AlbaCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Creators/AlbaCreator.cs	(revision 10479)
@@ -45,8 +45,8 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       (VRPToursParameter.ActualValue as AlbaEncoding).Repair();
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Creators/RandomCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Creators/RandomCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Creators/RandomCreator.cs	(revision 10479)
@@ -86,9 +86,9 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       //choose default encoding here
       VRPToursParameter.ActualValue = AlbaEncoding.ConvertFrom(CreateSolution(), ProblemInstance);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Crossovers/AlbaCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Crossovers/AlbaCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Crossovers/AlbaCrossover.cs	(revision 10479)
@@ -52,5 +52,5 @@
     protected abstract AlbaEncoding Crossover(IRandom random, AlbaEncoding parent1, AlbaEncoding parent2);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       ItemArray<IVRPEncoding> parents = new ItemArray<IVRPEncoding>(ParentsParameter.ActualValue.Length);
       for (int i = 0; i < ParentsParameter.ActualValue.Length; i++) {
@@ -69,5 +69,5 @@
       (ChildParameter.ActualValue as AlbaEncoding).Repair();
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/LocalImprovement/AlbaLambdaInterchangeLocalImprovementOperator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/LocalImprovement/AlbaLambdaInterchangeLocalImprovementOperator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/LocalImprovement/AlbaLambdaInterchangeLocalImprovementOperator.cs	(revision 10479)
@@ -125,5 +125,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       int maxIterations = MaximumIterationsParameter.ActualValue.Value;
       AlbaEncoding solution = null;
@@ -146,5 +146,5 @@
       QualityParameter.ActualValue.Value = quality;
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaManipulator.cs	(revision 10479)
@@ -62,5 +62,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IVRPEncoding solution = VRPToursParameter.ActualValue;
       if (!(solution is AlbaEncoding)) {
@@ -71,5 +71,5 @@
       (VRPToursParameter.ActualValue as AlbaEncoding).Repair();
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/AlbaMoveGenerator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/AlbaMoveGenerator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/AlbaMoveGenerator.cs	(revision 10479)
@@ -41,5 +41,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IVRPEncoding solution = VRPToursParameter.ActualValue;
       if (!(solution is AlbaEncoding)) {
@@ -47,5 +47,5 @@
       }
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveGenerator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveGenerator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveGenerator.cs	(revision 10479)
@@ -58,6 +58,6 @@
     protected abstract AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance);
 
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
 
       AlbaEncoding individual = VRPToursParameter.ActualValue as AlbaEncoding;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveGenerator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveGenerator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveGenerator.cs	(revision 10479)
@@ -68,6 +68,6 @@
     protected abstract AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance, int lambda);
 
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
 
       AlbaEncoding individual = VRPToursParameter.ActualValue as AlbaEncoding;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaStochasticTranslocationSingleMoveGenerator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaStochasticTranslocationSingleMoveGenerator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaStochasticTranslocationSingleMoveGenerator.cs	(revision 10479)
@@ -69,6 +69,6 @@
     }
 
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
 
       IVRPEncoding solution = VRPToursParameter.ActualValue;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveGenerator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveGenerator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveGenerator.cs	(revision 10479)
@@ -93,6 +93,6 @@
     }
 
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
 
       IVRPEncoding solution = VRPToursParameter.ActualValue;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveHardTabuCriterion.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveHardTabuCriterion.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveHardTabuCriterion.cs	(revision 10479)
@@ -81,6 +81,6 @@
     }
 
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
 
       IVRPEncoding solution = VRPToursParameter.ActualValue;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveSoftTabuCriterion.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveSoftTabuCriterion.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveSoftTabuCriterion.cs	(revision 10479)
@@ -81,6 +81,6 @@
     }
 
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
 
       IVRPEncoding solution = VRPToursParameter.ActualValue;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveTabuMaker.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveTabuMaker.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveTabuMaker.cs	(revision 10479)
@@ -81,6 +81,6 @@
     }
 
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
 
       IVRPEncoding solution = VRPToursParameter.ActualValue;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Crossovers/GVRCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Crossovers/GVRCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Crossovers/GVRCrossover.cs	(revision 10479)
@@ -103,5 +103,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       ItemArray<IVRPEncoding> parents = new ItemArray<IVRPEncoding>(ParentsParameter.ActualValue.Length);
       for (int i = 0; i < ParentsParameter.ActualValue.Length; i++) {
@@ -117,5 +117,5 @@
       ChildParameter.ActualValue = Crossover(RandomParameter.ActualValue, parents[0] as GVREncoding, parents[1] as GVREncoding);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRManipulator.cs	(revision 10479)
@@ -49,5 +49,5 @@
     protected abstract void Manipulate(IRandom random, GVREncoding individual);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IVRPEncoding solution = VRPToursParameter.ActualValue;
       if (!(solution is GVREncoding)) {
@@ -57,5 +57,5 @@
       Manipulate(RandomParameter.ActualValue, VRPToursParameter.ActualValue as GVREncoding);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Creators/MultiVRPSolutionCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Creators/MultiVRPSolutionCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Creators/MultiVRPSolutionCreator.cs	(revision 10479)
@@ -97,7 +97,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one VRP creator to choose from.");
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/BiasedMultiVRPSolutionCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/BiasedMultiVRPSolutionCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/BiasedMultiVRPSolutionCrossover.cs	(revision 10479)
@@ -21,15 +21,14 @@
 
 using System;
-using System.Collections.Generic;
 using System.Linq;
-using System.Text;
+using HeuristicLab.Analysis;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Common;
-using HeuristicLab.Analysis;
-using HeuristicLab.Parameters;
-using HeuristicLab.Optimization;
-using HeuristicLab.Data;
-using HeuristicLab.Collections;
+using HeuristicLab.Random;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
@@ -69,4 +68,6 @@
       Parameters.Add(new ValueParameter<DoubleValue>("LowerBound", "The depth of the individuals in the scope tree.", new DoubleValue(0.01)));
       Parameters.Add(new ValueParameter<IntValue>("Depth", "The depth of the individuals in the scope tree.", new IntValue(1)));
+
+      SelectedOperatorParameter.ActualName = "SelectedCrossoverOperator";
     }
 
@@ -81,5 +82,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IOperator successor = null;
 
@@ -133,5 +134,5 @@
       }
 
-      ////////////////
+      //////////////// code has to be duplicated since ActualProbabilitiesParameter.ActualValue are updated and used for operator selection
       IRandom random = RandomParameter.ActualValue;
       DoubleArray probabilities = ActualProbabilitiesParameter.ActualValue;
@@ -142,15 +143,5 @@
       if (checkedOperators.Count() > 0) {
         // select a random operator from the checked operators
-        double sum = (from indexedItem in checkedOperators select probabilities[indexedItem.Index]).Sum();
-        if (sum == 0) throw new InvalidOperationException(Name + ": All selected operators have zero probability.");
-        double r = random.NextDouble() * sum;
-        sum = 0;
-        foreach (var indexedItem in checkedOperators) {
-          sum += probabilities[indexedItem.Index];
-          if (sum > r) {
-            successor = indexedItem.Value;
-            break;
-          }
-        }
+        successor = checkedOperators.SampleProportional(random, 1, probabilities, false, false).First().Value;
       }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs	(revision 10479)
@@ -67,4 +67,6 @@
       Parameters.Add(new LookupParameter<IVRPEncoding>("Child", "The child permutation resulting from the crossover."));
       ChildParameter.ActualName = "VRPTours";
+
+      SelectedOperatorParameter.ActualName = "SelectedCrossoverOperator";
     }
 
@@ -106,7 +108,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one permutation crossover to choose from.");
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/RandomParentCloneCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/RandomParentCloneCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/RandomParentCloneCrossover.cs	(revision 10479)
@@ -65,5 +65,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (RandomParameter.ActualValue.Next() < 0.5)
         ChildParameter.ActualValue = ParentsParameter.ActualValue[0].Clone() as IVRPEncoding;
@@ -71,5 +71,5 @@
         ChildParameter.ActualValue = ParentsParameter.ActualValue[1].Clone() as IVRPEncoding;
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/BiasedMultiVRPSolutionManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/BiasedMultiVRPSolutionManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/BiasedMultiVRPSolutionManipulator.cs	(revision 10479)
@@ -21,15 +21,14 @@
 
 using System;
-using System.Collections.Generic;
 using System.Linq;
-using System.Text;
+using HeuristicLab.Analysis;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Common;
-using HeuristicLab.Analysis;
-using HeuristicLab.Parameters;
-using HeuristicLab.Optimization;
-using HeuristicLab.Data;
-using HeuristicLab.Collections;
+using HeuristicLab.Random;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
@@ -40,5 +39,5 @@
       get { return (ValueLookupParameter<DoubleArray>)Parameters["ActualProbabilities"]; }
     }
-    
+
     public ValueLookupParameter<StringValue> SuccessProgressAnalyisis {
       get { return (ValueLookupParameter<StringValue>)Parameters["SuccessProgressAnalysis"]; }
@@ -63,5 +62,5 @@
       : base() {
       Parameters.Add(new ValueLookupParameter<DoubleArray>("ActualProbabilities", "The array of relative probabilities for each operator."));
-      Parameters.Add(new ValueLookupParameter<StringValue>("SuccessProgressAnalysis", "The success progress analyisis to be considered", 
+      Parameters.Add(new ValueLookupParameter<StringValue>("SuccessProgressAnalysis", "The success progress analyisis to be considered",
         new StringValue("ExecutedMutationOperator")));
 
@@ -69,4 +68,6 @@
       Parameters.Add(new ValueParameter<DoubleValue>("LowerBound", "The depth of the individuals in the scope tree.", new DoubleValue(0.01)));
       Parameters.Add(new ValueParameter<IntValue>("Depth", "The depth of the individuals in the scope tree.", new IntValue(1)));
+
+      SelectedOperatorParameter.ActualName = "SelectedManipulationOperator";
     }
 
@@ -81,5 +82,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IOperator successor = null;
 
@@ -133,5 +134,5 @@
       }
 
-      ////////////////
+      //////////////// code has to be duplicated since ActualProbabilitiesParameter.ActualValue are updated and used for operator selection
       IRandom random = RandomParameter.ActualValue;
       DoubleArray probabilities = ActualProbabilitiesParameter.ActualValue;
@@ -142,15 +143,6 @@
       if (checkedOperators.Count() > 0) {
         // select a random operator from the checked operators
-        double sum = (from indexedItem in checkedOperators select probabilities[indexedItem.Index]).Sum();
-        if (sum == 0) throw new InvalidOperationException(Name + ": All selected operators have zero probability.");
-        double r = random.NextDouble() * sum;
-        sum = 0;
-        foreach (var indexedItem in checkedOperators) {
-          sum += probabilities[indexedItem.Index];
-          if (sum > r) {
-            successor = indexedItem.Value;
-            break;
-          }
-        }
+        successor =
+          checkedOperators.SampleProportional(random, 1, probabilities, false, false).First().Value;
       }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs	(revision 10479)
@@ -59,4 +59,6 @@
       Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
       Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours to be manipulated."));
+
+      SelectedOperatorParameter.ActualName = "SelectedManipulationOperator";
     }
 
@@ -97,7 +99,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one permutation manipulator to choose from.");
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveEvaluator.cs	(revision 10479)
@@ -53,5 +53,5 @@
     protected override void EvaluateMove() { }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IVRPMove move = VRPMoveParameter.ActualValue as IVRPMove;
 
@@ -59,5 +59,5 @@
       moveEvaluator.VRPMoveParameter.ActualName = VRPMoveParameter.Name;
 
-      OperationCollection next = new OperationCollection(base.Apply());
+      OperationCollection next = new OperationCollection(base.InstrumentedApply());
       next.Insert(0, ExecutionContext.CreateOperation(moveEvaluator));
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs	(revision 10479)
@@ -153,7 +153,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one VRP move generator choose from.");
-      OperationCollection next = new OperationCollection(base.Apply());
+      OperationCollection next = new OperationCollection(base.InstrumentedApply());
 
       for (int i = 0; i < SelectedOperatorsParameter.ActualValue.Value; i++) {
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveEvaluator.cs	(revision 10479)
@@ -76,8 +76,8 @@
     protected abstract void EvaluateMove();
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       EvaluateMove();
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveMaker.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveMaker.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveMaker.cs	(revision 10479)
@@ -99,9 +99,9 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       PerformMove();
       UpdateMoveEvaluation();
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/IterativeInsertionCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/IterativeInsertionCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/IterativeInsertionCreator.cs	(revision 10479)
@@ -81,5 +81,5 @@
     }
 
-    private static PotvinEncoding CreateSolution(IVRPProblemInstance instance, IRandom random, bool adhereTimeWindows) {
+    public static PotvinEncoding CreateSolution(IVRPProblemInstance instance, IRandom random, bool adhereTimeWindows) {
       PotvinEncoding result = new PotvinEncoding(instance);
 
@@ -91,10 +91,10 @@
           customers.Add(i);
 
-      customers.Sort(delegate(int city1, int city2) {
-            double angle1 = CalculateAngleToDepot(instance, city1);
-            double angle2 = CalculateAngleToDepot(instance, city2);
+      customers.Sort((city1, city2) => {
+        double angle1 = CalculateAngleToDepot(instance, city1);
+        double angle2 = CalculateAngleToDepot(instance, city2);
 
-            return angle1.CompareTo(angle2);
-          });
+        return angle1.CompareTo(angle2);
+      });
 
       Tour currentTour = new Tour();
@@ -140,8 +140,8 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       VRPToursParameter.ActualValue = CreateSolution(ProblemInstance, RandomParameter.ActualValue, AdhereTimeWindowsParameter.Value.Value);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PushForwardInsertionCreator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PushForwardInsertionCreator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PushForwardInsertionCreator.cs	(revision 10479)
@@ -373,10 +373,10 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       VRPToursParameter.ActualValue = CreateSolution(ProblemInstance, RandomParameter.ActualValue,
         Alpha.Value.Value, Beta.Value.Value, Gamma.Value.Value,
         AlphaVariance.Value.Value, BetaVariance.Value.Value, GammaVariance.Value.Value);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinCrossover.cs	(revision 10479)
@@ -144,5 +144,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       ItemArray<IVRPEncoding> parents = new ItemArray<IVRPEncoding>(ParentsParameter.ActualValue.Length);
       for (int i = 0; i < ParentsParameter.ActualValue.Length; i++) {
@@ -160,5 +160,5 @@
       (ChildParameter.ActualValue as PotvinEncoding).Repair();
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinLocalSearchManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinLocalSearchManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinLocalSearchManipulator.cs	(revision 10479)
@@ -52,6 +52,6 @@
     }
 
-    private bool FindBetterInsertionPlace(
-      PotvinEncoding individual, int tour, int city, int length,
+    private static bool FindBetterInsertionPlace(
+      PotvinEncoding individual, IVRPProblemInstance instance, int tour, int city, int length,
       out int insertionTour, out int insertionPlace) {
       bool insertionFound = false;
@@ -70,5 +70,5 @@
           distance = individual.GetTourLength(individual.Tours[currentTour]);
           individual.Tours[currentTour].Stops.InsertRange(currentCity, toBeDeleted);
-          if (ProblemInstance.TourFeasible(individual.Tours[currentTour], individual)) {
+          if (instance.TourFeasible(individual.Tours[currentTour], individual)) {
             double lengthIncrease =
               individual.GetTourLength(individual.Tours[currentTour]) - distance;
@@ -92,7 +92,7 @@
     }
 
-    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+    public static void ApplyManipulation(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance, int maxIterations) {
       //only apply to feasible individuals
-      if (ProblemInstance.Feasible(individual)) {
+      if (instance.Feasible(individual)) {
         bool insertionFound;
         int iterations = 0;
@@ -107,5 +107,5 @@
               while (city <= individual.Tours[tour].Stops.Count - length && !insertionFound) {
                 int insertionTour, insertionPlace;
-                if (FindBetterInsertionPlace(individual, tour, city, length,
+                if (FindBetterInsertionPlace(individual, instance, tour, city, length,
                  out insertionTour, out insertionPlace)) {
                   insertionFound = true;
@@ -126,5 +126,5 @@
           iterations++;
         } while (insertionFound &&
-          iterations < Iterations.Value.Value);
+          iterations < maxIterations);
 
         IList<Tour> toBeRemoved = new List<Tour>();
@@ -139,4 +139,9 @@
       }
     }
+ 
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      ApplyManipulation(random, individual, ProblemInstance, Iterations.Value.Value);     
+    }
   }
 }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinManipulator.cs	(revision 10479)
@@ -55,5 +55,5 @@
     protected abstract void Manipulate(IRandom random, PotvinEncoding individual);
 
-    protected int SelectRandomTourBiasedByLength(IRandom random, PotvinEncoding individual) {
+    protected static int SelectRandomTourBiasedByLength(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance) {
       int tourIndex = -1;
 
@@ -61,5 +61,5 @@
       double[] probabilities = new double[individual.Tours.Count];
       for (int i = 0; i < individual.Tours.Count; i++) {
-        probabilities[i] = 1.0 / ((double)individual.Tours[i].Stops.Count / (double)ProblemInstance.Cities.Value);
+        probabilities[i] = 1.0 / ((double)individual.Tours[i].Stops.Count / (double)instance.Cities.Value);
         sum += probabilities[i];
       }
@@ -82,10 +82,10 @@
     }
 
-    protected bool FindInsertionPlace(PotvinEncoding individual, int city, int routeToAvoid, bool allowInfeasible, out int route, out int place) {
+    protected static bool FindInsertionPlace(PotvinEncoding individual, int city, int routeToAvoid, bool allowInfeasible, out int route, out int place) {
       return individual.FindInsertionPlace(
         city, routeToAvoid, allowInfeasible, out route, out place);
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IVRPEncoding solution = VRPToursParameter.ActualValue;
       if (!(solution is PotvinEncoding)) {
@@ -96,5 +96,5 @@
       (VRPToursParameter.ActualValue as PotvinEncoding).Repair();
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinOneLevelExchangeManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinOneLevelExchangeManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinOneLevelExchangeManipulator.cs	(revision 10479)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
@@ -41,8 +42,6 @@
     }
 
-    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
-      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
-
-      int selectedIndex = SelectRandomTourBiasedByLength(random, individual);
+    public static void ApplyManipulation(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance, bool allowInfeasible) {
+      int selectedIndex = SelectRandomTourBiasedByLength(random, individual, instance);
       if (selectedIndex >= 0) {
         Tour route1 =
@@ -68,4 +67,9 @@
       }
     }
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
+      ApplyManipulation(random, individual, ProblemInstance, allowInfeasible);      
+    }
   }
 }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinPairwiseOneLevelExchangeManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinPairwiseOneLevelExchangeManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinPairwiseOneLevelExchangeManipulator.cs	(revision 10479)
@@ -25,4 +25,5 @@
 using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
 using HeuristicLab.Problems.VehicleRouting.Variants;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
@@ -43,8 +44,8 @@
     }
 
-    public bool PairwiseMove(PotvinEncoding individual, int city, bool allowInfeasible) {
+    public static bool PairwiseMove(PotvinEncoding individual, IVRPProblemInstance instance, int city, bool allowInfeasible) {
       bool success;
 
-      IPickupAndDeliveryProblemInstance pdp = ProblemInstance as IPickupAndDeliveryProblemInstance;
+      IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
 
       if (pdp != null) {
@@ -64,5 +65,5 @@
 
         int source, target;
-        if (ProblemInstance.GetDemand(city) >= 0) {
+        if (instance.GetDemand(city) >= 0) {
           source = city;
           target = dest;
@@ -80,12 +81,12 @@
           if (tourIdx != routeToAvoid) {
             Tour tour = individual.Tours[tourIdx];
-            VRPEvaluation eval = ProblemInstance.EvaluateTour(tour, individual);
-            individual.InsertPair(tour, source, target, ProblemInstance);
-            VRPEvaluation evalNew = ProblemInstance.EvaluateTour(tour, individual);
+            VRPEvaluation eval = instance.EvaluateTour(tour, individual);
+            individual.InsertPair(tour, source, target, instance);
+            VRPEvaluation evalNew = instance.EvaluateTour(tour, individual);
 
             double delta = evalNew.Quality - eval.Quality;
 
             if (delta < bestQuality &&
-               (ProblemInstance.Feasible(evalNew) || allowInfeasible)) {
+               (instance.Feasible(evalNew) || allowInfeasible)) {
               bestQuality = delta;
               bestTour = tourIdx;
@@ -127,26 +128,32 @@
     }
 
+    public static void ApplyManipulation(IRandom random, PotvinEncoding individual, IPickupAndDeliveryProblemInstance pdp, bool allowInfeasible) {
+      int selectedIndex = SelectRandomTourBiasedByLength(random, individual, pdp);
+      if (selectedIndex >= 0) {
+        Tour route1 =
+          individual.Tours[selectedIndex];
+
+        int count = route1.Stops.Count;
+
+        if (count > 0) {
+          int i = random.Next(0, count);
+          int city = route1.Stops[i];
+
+          if (!PairwiseMove(individual, pdp, city, allowInfeasible))
+            i++;
+
+          count = route1.Stops.Count;
+        }
+      }
+    }
+
+
     protected override void Manipulate(IRandom random, PotvinEncoding individual) {
       bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
+
       IPickupAndDeliveryProblemInstance pdp = ProblemInstance as IPickupAndDeliveryProblemInstance;
 
       if (pdp != null) {
-        int selectedIndex = SelectRandomTourBiasedByLength(random, individual);
-        if (selectedIndex >= 0) {
-          Tour route1 =
-            individual.Tours[selectedIndex];
-
-          int count = route1.Stops.Count;
-
-          if (count > 0) {
-            int i = random.Next(0, count);
-            int city = route1.Stops[i];
-
-            if (!PairwiseMove(individual, city, allowInfeasible))
-              i++;
-
-            count = route1.Stops.Count;
-          }
-        }
+        ApplyManipulation(random, individual, pdp, allowInfeasible);
       }
     }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinPairwiseTwoLevelExchangeManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinPairwiseTwoLevelExchangeManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinPairwiseTwoLevelExchangeManipulator.cs	(revision 10479)
@@ -26,4 +26,5 @@
 using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
 using HeuristicLab.Problems.VehicleRouting.Variants;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
@@ -44,7 +45,7 @@
     }
 
-    private PotvinEncoding ReplacePair(PotvinEncoding individual, int replaced, int replacing, bool allowInfeasible) {
+    private static PotvinEncoding ReplacePair(PotvinEncoding individual, IVRPProblemInstance instance, int replaced, int replacing, bool allowInfeasible) {
       individual = individual.Clone() as PotvinEncoding;
-      IPickupAndDeliveryProblemInstance pdp = ProblemInstance as IPickupAndDeliveryProblemInstance;
+      IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
 
       int replacedDest = pdp.GetPickupDeliveryLocation(replaced);
@@ -76,9 +77,9 @@
 
       replacedSourceTour.Stops[replacedSourceTour.Stops.IndexOf(replacedSource)] = replacingSource;
-      if (!allowInfeasible && !ProblemInstance.TourFeasible(replacedSourceTour, individual))
+      if (!allowInfeasible && !instance.TourFeasible(replacedSourceTour, individual))
         return null;
 
       replacedTargetTour.Stops[replacedTargetTour.Stops.IndexOf(replacedTarget)] = replacingTarget;
-      if (!allowInfeasible && !ProblemInstance.TourFeasible(replacedTargetTour, individual))
+      if (!allowInfeasible && !instance.TourFeasible(replacedTargetTour, individual))
         return null;
 
@@ -93,12 +94,12 @@
         if (tourIdx != routeToAvoid) {
           Tour tour = individual.Tours[tourIdx];
-          VRPEvaluation eval = ProblemInstance.EvaluateTour(tour, individual);
-          individual.InsertPair(tour, replacedSource, replacedTarget, ProblemInstance);
-          VRPEvaluation evalNew = ProblemInstance.EvaluateTour(tour, individual);
+          VRPEvaluation eval = instance.EvaluateTour(tour, individual);
+          individual.InsertPair(tour, replacedSource, replacedTarget, instance);
+          VRPEvaluation evalNew = instance.EvaluateTour(tour, individual);
 
           double delta = evalNew.Quality - eval.Quality;
 
           if (delta < bestQuality &&
-              (ProblemInstance.Feasible(evalNew) || allowInfeasible)) {
+              (instance.Feasible(evalNew) || allowInfeasible)) {
             bestQuality = delta;
             bestTour = tourIdx;
@@ -127,4 +128,58 @@
     }
 
+    public static PotvinEncoding ApplyManipulation(IRandom random, PotvinEncoding individual, IPickupAndDeliveryProblemInstance pdp, bool allowInfeasible) {
+      PotvinEncoding result = null;
+      
+      int selectedIndex = SelectRandomTourBiasedByLength(random, individual, pdp);
+      if (selectedIndex >= 0) {
+        bool performed = false;
+        Tour route1 = individual.Tours[selectedIndex];
+
+        if (route1.Stops.Count > 0) {
+          //randomize customer selection
+          Permutation perm = new Permutation(PermutationTypes.Absolute, route1.Stops.Count, random);
+          int customer1Position = 0;
+
+          while (customer1Position < route1.Stops.Count) {
+            performed = false;
+
+            int customer1 = route1.Stops[perm[customer1Position]];
+            int customer2 = -1;
+
+            for (int i = 0; i < individual.Tours.Count; i++) {
+              if (i != selectedIndex) {
+                Tour tour = individual.Tours[i];
+                for (int customer2Position = 0; customer2Position < tour.Stops.Count; customer2Position++) {
+                  customer2 = tour.Stops[customer2Position];
+
+                  if (pdp.GetPickupDeliveryLocation(customer1) != customer2) {
+                    result = ReplacePair(individual, pdp, customer2, customer1, allowInfeasible);
+                    if (result != null) {
+                      individual = result;
+
+                      route1 = individual.Tours[selectedIndex];
+                      performed = true;
+                      break;
+                    }
+                  }
+                }
+              }
+
+              if (performed) {
+                break;
+              }
+            }
+
+            if (!performed)
+              customer1Position++;
+            else
+              break;
+          }
+        }
+      }
+
+      return result;
+    }
+
     protected override void Manipulate(IRandom random, PotvinEncoding individual) {
       bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
@@ -132,52 +187,8 @@
 
       if (pdp != null) {
-        int selectedIndex = SelectRandomTourBiasedByLength(random, individual);
-        if (selectedIndex >= 0) {
-          bool performed = false;
-          Tour route1 = individual.Tours[selectedIndex];
-
-          if (route1.Stops.Count > 0) {
-            //randomize customer selection
-            Permutation perm = new Permutation(PermutationTypes.Absolute, route1.Stops.Count, random);
-            int customer1Position = 0;
-
-            while (customer1Position < route1.Stops.Count) {
-              performed = false;
-
-              int customer1 = route1.Stops[perm[customer1Position]];
-              int customer2 = -1;
-
-              for (int i = 0; i < individual.Tours.Count; i++) {
-                if (i != selectedIndex) {
-                  Tour tour = individual.Tours[i];
-                  for (int customer2Position = 0; customer2Position < tour.Stops.Count; customer2Position++) {
-                    customer2 = tour.Stops[customer2Position];
-
-                    if (pdp.GetPickupDeliveryLocation(customer1) != customer2) {
-                      PotvinEncoding result = ReplacePair(individual, customer2, customer1, allowInfeasible);
-                      if (result != null) {
-                        VRPToursParameter.ActualValue = result;
-                        individual = result;
-
-                        route1 = individual.Tours[selectedIndex];
-                        performed = true;
-                        break;
-                      }
-                    }
-                  }
-                }
-
-                if (performed) {
-                  break;
-                }
-              }
-
-              if (!performed)
-                customer1Position++;
-              else
-                break;
-            }
-          }
-        }
+        PotvinEncoding result = ApplyManipulation(random, individual, pdp, allowInfeasible);
+        if (result != null) {
+          VRPToursParameter.ActualValue = result;
+        }        
       }
     }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinTwoLevelExchangeManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinTwoLevelExchangeManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinTwoLevelExchangeManipulator.cs	(revision 10479)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
@@ -41,8 +42,6 @@
     }
 
-    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
-      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
-
-      int selectedIndex = SelectRandomTourBiasedByLength(random, individual);
+    public static void ApplyManipulation(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance, bool allowInfeasible) {
+      int selectedIndex = SelectRandomTourBiasedByLength(random, individual, instance);
       if (selectedIndex >= 0) {
         Tour route1 = individual.Tours[selectedIndex];
@@ -63,5 +62,5 @@
                 route1.Stops.RemoveAt(customer1Position);
 
-                if (ProblemInstance.TourFeasible(tour, individual)) {
+                if (instance.TourFeasible(tour, individual)) {
                   int routeIdx, place;
                   if (FindInsertionPlace(individual,
@@ -92,4 +91,11 @@
       }
     }
+      
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
+
+      ApplyManipulation(random, individual, ProblemInstance, allowInfeasible);
+    }
   }
 }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinVehicleAssignmentManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinVehicleAssignmentManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinVehicleAssignmentManipulator.cs	(revision 10479)
@@ -60,5 +60,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IVRPEncoding solution = VRPToursParameter.ActualValue;
       if (!(solution is PotvinEncoding)) {
@@ -66,5 +66,5 @@
       }
 
-      OperationCollection next = new OperationCollection(base.Apply());
+      OperationCollection next = new OperationCollection(base.InstrumentedApply());
 
       VehicleAssignmentParameter.ActualValue = (VRPToursParameter.ActualValue as PotvinEncoding).VehicleAssignment;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveGenerator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveGenerator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveGenerator.cs	(revision 10479)
@@ -57,6 +57,6 @@
     protected abstract PotvinCustomerRelocationMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
 
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
 
       PotvinEncoding individual = VRPToursParameter.ActualValue as PotvinEncoding;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveGenerator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveGenerator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveGenerator.cs	(revision 10479)
@@ -57,6 +57,6 @@
     protected abstract PotvinPDExchangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
 
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
 
       PotvinEncoding individual = VRPToursParameter.ActualValue as PotvinEncoding;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveGenerator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveGenerator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveGenerator.cs	(revision 10479)
@@ -57,6 +57,6 @@
     protected abstract PotvinPDRearrangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
 
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
 
       PotvinEncoding individual = VRPToursParameter.ActualValue as PotvinEncoding;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveGenerator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveGenerator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveGenerator.cs	(revision 10479)
@@ -57,6 +57,6 @@
     protected abstract PotvinPDShiftMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
 
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
 
       PotvinEncoding individual = VRPToursParameter.ActualValue as PotvinEncoding;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PotvinMoveGenerator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PotvinMoveGenerator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PotvinMoveGenerator.cs	(revision 10479)
@@ -41,5 +41,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IVRPEncoding solution = VRPToursParameter.ActualValue;
       if (!(solution is PotvinEncoding)) {
@@ -47,5 +47,5 @@
       }
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveGenerator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveGenerator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveGenerator.cs	(revision 10479)
@@ -57,6 +57,6 @@
     protected abstract PotvinTwoOptStarMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
 
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
 
       PotvinEncoding individual = VRPToursParameter.ActualValue as PotvinEncoding;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveGenerator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveGenerator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveGenerator.cs	(revision 10479)
@@ -57,6 +57,6 @@
     protected abstract PotvinVehicleAssignmentMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
 
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
 
       PotvinEncoding individual = VRPToursParameter.ActualValue as PotvinEncoding;
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Crossovers/PrinsCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Crossovers/PrinsCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Crossovers/PrinsCrossover.cs	(revision 10479)
@@ -51,5 +51,5 @@
     protected abstract PrinsEncoding Crossover(IRandom random, PrinsEncoding parent1, PrinsEncoding parent2);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       ItemArray<IVRPEncoding> parents = new ItemArray<IVRPEncoding>(ParentsParameter.ActualValue.Length);
       for (int i = 0; i < ParentsParameter.ActualValue.Length; i++) {
@@ -67,5 +67,5 @@
         Crossover(RandomParameter.ActualValue, parents[0] as PrinsEncoding, parents[1] as PrinsEncoding);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsManipulator.cs	(revision 10479)
@@ -50,5 +50,5 @@
     protected abstract void Manipulate(IRandom random, PrinsEncoding individual);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IVRPEncoding solution = VRPToursParameter.ActualValue;
       if (!(solution is PrinsEncoding)) {
@@ -58,5 +58,5 @@
       Manipulate(RandomParameter.ActualValue, VRPToursParameter.ActualValue as PrinsEncoding);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/VRPOperator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/VRPOperator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/VRPOperator.cs	(revision 10479)
@@ -30,5 +30,5 @@
   [Item("VRPOperator", "Represents a VRP operator.")]
   [StorableClass]
-  public abstract class VRPOperator : SingleSuccessorOperator, IVRPOperator {
+  public abstract class VRPOperator : InstrumentedOperator, IVRPOperator {
     public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
       get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuCrossover.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuCrossover.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuCrossover.cs	(revision 10479)
@@ -50,5 +50,5 @@
     protected abstract ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       ItemArray<IVRPEncoding> parents = new ItemArray<IVRPEncoding>(ParentsParameter.ActualValue.Length);
       for (int i = 0; i < ParentsParameter.ActualValue.Length; i++) {
@@ -66,5 +66,5 @@
         Crossover(RandomParameter.ActualValue, parents[0] as ZhuEncoding, parents[1] as ZhuEncoding);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Manipulators/ZhuManipulator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Manipulators/ZhuManipulator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Manipulators/ZhuManipulator.cs	(revision 10479)
@@ -50,5 +50,5 @@
     protected abstract void Manipulate(IRandom random, ZhuEncoding individual);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       IVRPEncoding solution = VRPToursParameter.ActualValue;
       if (!(solution is ZhuEncoding)) {
@@ -58,5 +58,5 @@
       Manipulate(RandomParameter.ActualValue, VRPToursParameter.ActualValue as ZhuEncoding);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj	(revision 10479)
@@ -465,4 +465,8 @@
       <Private>False</Private>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Random\3.3\HeuristicLab.Random-3.3.csproj">
+      <Project>{F4539FB6-4708-40C9-BE64-0A1390AEA197}</Project>
+      <Name>HeuristicLab.Random-3.3</Name>
+    </ProjectReference>
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Improver/VRPImprovementOperator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Improver/VRPImprovementOperator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Improver/VRPImprovementOperator.cs	(revision 10479)
@@ -75,5 +75,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = SolutionParameter.ActualValue as IVRPEncoding;
       var potvinSolution = solution is PotvinEncoding ? solution as PotvinEncoding : PotvinEncoding.ConvertFrom(solution, ProblemInstance);
@@ -87,5 +87,5 @@
       LocalEvaluatedSolutions.ActualValue = new IntValue(evaluatedSolutions);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Plugin.cs.frame
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Plugin.cs.frame	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/Plugin.cs.frame	(revision 10479)
@@ -41,4 +41,5 @@
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
   [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
   public class HeuristicLabProblemsVehicleRoutingPlugin : PluginBase {
   }
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluator.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluator.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluator.cs	(revision 10479)
@@ -128,5 +128,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       InitResultParameters();
 
@@ -140,5 +140,5 @@
       QualityParameter.ActualValue = new DoubleValue(evaluation.Quality);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 10479)
@@ -39,14 +39,8 @@
 
 namespace HeuristicLab.Problems.VehicleRouting {
-  public interface IVRPInstanceConsumer :  
-    IProblemInstanceConsumer<CVRPData>, IProblemInstanceConsumer<CVRPTWData>, 
-    IProblemInstanceConsumer<MDCVRPData>, IProblemInstanceConsumer<MDCVRPTWData>,
-    IProblemInstanceConsumer<PDPTWData> {
-  }
-
   [Item("Vehicle Routing Problem", "Represents a Vehicle Routing Problem.")]
   [Creatable("Problems")]
   [StorableClass]
-  public sealed class VehicleRoutingProblem : Problem, ISingleObjectiveHeuristicOptimizationProblem, IStorableContent, IVRPInstanceConsumer {
+  public sealed class VehicleRoutingProblem : Problem, ISingleObjectiveHeuristicOptimizationProblem, IStorableContent, IProblemInstanceConsumer<VRPData> {
     public string Filename { get; set; }
 
@@ -143,4 +137,6 @@
       AttachEventHandlers();
       AttachProblemInstanceEventHandlers();
+
+      EvaluatorParameter.Value = ProblemInstance.SolutionEvaluator;
     }
 
@@ -153,4 +149,7 @@
       : base(original, cloner) {
       this.AttachEventHandlers();
+      this.AttachProblemInstanceEventHandlers();
+
+      ProblemInstance.SolutionEvaluator = EvaluatorParameter.Value;
     }
 
@@ -173,4 +172,6 @@
       AttachEventHandlers();
       AttachProblemInstanceEventHandlers();
+
+      ProblemInstance.SolutionEvaluator = EvaluatorParameter.Value;
     }
 
@@ -189,5 +190,4 @@
     private void AttachProblemInstanceEventHandlers() {
       if (ProblemInstance != null) {
-        EvaluatorParameter.Value = ProblemInstance.SolutionEvaluator;
         ProblemInstance.EvaluationChanged += new EventHandler(ProblemInstance_EvaluationChanged);
       }
@@ -209,5 +209,4 @@
 
     void ProblemInstance_EvaluationChanged(object sender, EventArgs e) {
-      EvaluatorParameter.Value = ProblemInstance.SolutionEvaluator;
       EvalBestKnownSolution();
     }
@@ -216,4 +215,6 @@
       InitializeOperators();
       AttachProblemInstanceEventHandlers();
+
+      EvaluatorParameter.Value = ProblemInstance.SolutionEvaluator;
 
       OnSolutionCreatorChanged();
@@ -383,23 +384,26 @@
       }
     }
-
-    public void Load(CVRPData data) {
-      Load(data, new CVRPInterpreter());
-    }
-
-    public void Load(CVRPTWData data) {
-      Load(data, new CVRPTWInterpreter());
-    }
-
-    public void Load(MDCVRPData data) {
-      Load(data, new MDCVRPInterpreter());
-    }
-
-    public void Load(MDCVRPTWData data) {
-      Load(data, new MDCVRPTWInterpreter());
-    }
-
-    public void Load(PDPTWData data) {
-      Load(data, new PDPTWInterpreter());
+    #endregion
+
+    #region IProblemInstanceConsumer<VRPData> Members
+
+    public void Load(VRPData data) {
+      Type interpreterType = typeof(IVRPDataInterpreter<>).MakeGenericType(data.GetType());
+      var interpreters = ApplicationManager.Manager.GetInstances(interpreterType);
+      IVRPDataInterpreter interpreter = null;
+      foreach (object i in interpreters) {
+        var parentInterfaces = i.GetType().BaseType.GetInterfaces();
+        var interfaces = i.GetType().GetInterfaces().Except(parentInterfaces);
+        var interpreterInterface = interfaces.First(j => typeof(IVRPDataInterpreter).IsAssignableFrom(j));
+        var interpreterDataType = interpreterInterface.GetGenericArguments()[0];
+        if (interpreterDataType == data.GetType()) {
+          interpreter = i as IVRPDataInterpreter;
+          break;
+        }
+      }
+
+      if (interpreter == null)
+        throw new ArgumentException("No interpreter found for the VRP type");
+      Load(data, interpreter);
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Random/3.3/RandomEnumerable.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Random/3.3/RandomEnumerable.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Random/3.3/RandomEnumerable.cs	(revision 10479)
@@ -36,5 +36,5 @@
 
     //algorithm taken from progamming pearls page 127
-    //IMPORTANT because IEnumerables with yield are used the seed must best be specified to return always 
+    //IMPORTANT because IEnumerables with yield are used the seed must be specified to return always 
     //the same sequence of numbers without caching the values.
     public static IEnumerable<int> SampleRandomNumbers(int seed, int start, int end, int count) {
@@ -166,4 +166,6 @@
     /// 
     /// The method internally holds two arrays: One that is the sequence itself and another one for the values.
+    /// 
+    /// The method does not check if the number of elements in source and weights are the same.
     /// </remarks>
     /// <typeparam name="T">The type of the items to be selected.</typeparam>
@@ -173,6 +175,6 @@
     /// <param name="weights">The weight values for the items.</param>
     /// <param name="windowing">Whether to scale the proportional values or not.</param>
-    /// <param name="maximization">Determines whether to choose proportionally (true) or inverse-proportionally (false).</param>
-    /// <returns>A sequence of selected items.</returns>
+    /// <param name="inverseProportional">Determines whether to choose proportionally (true) or inverse-proportionally (false).</param>
+    /// <returns>A sequence of selected items. Might actually be shorter than <paramref name="count"/> elements if source has less than <paramref name="count"/> elements.</returns>
     public static IEnumerable<T> SampleProportionalWithoutRepetition<T>(this IEnumerable<T> source, IRandom random, int count, IEnumerable<double> weights, bool windowing = true, bool inverseProportional = false) {
       return source.SampleProportionalWithoutRepetition(random, weights, windowing, inverseProportional).Take(count);
@@ -181,5 +183,5 @@
     private static IEnumerable<T> SampleProportional<T>(this IEnumerable<T> source, IRandom random, IEnumerable<double> weights, bool windowing, bool inverseProportional) {
       var sourceArray = source.ToArray();
-      var valueArray = PrepareProportional<T>(sourceArray, weights, windowing, inverseProportional);
+      var valueArray = PrepareProportional(sourceArray, weights, windowing, inverseProportional);
       double total = valueArray.Sum();
 
@@ -193,22 +195,21 @@
     }
     private static IEnumerable<T> SampleProportionalWithoutRepetition<T>(this IEnumerable<T> source, IRandom random, IEnumerable<double> weights, bool windowing, bool inverseProportional) {
-      var sourceArray = source.ToArray();
-      var valueArray = PrepareProportional<T>(sourceArray, weights, windowing, inverseProportional);
+      var valueArray = PrepareProportional(source.ToArray(), weights, windowing, inverseProportional);
+      var list = new LinkedList<Tuple<T, double>>(source.Zip(valueArray, Tuple.Create));
       double total = valueArray.Sum();
 
-      HashSet<int> chosenIndices = new HashSet<int>();
-      while (chosenIndices.Count < sourceArray.Length) {
-        int index = 0;
-        double ball = valueArray[index], sum = random.NextDouble() * total;
+      while (list.Count > 0) {        
+        var cur = list.First;        
+        double ball = cur.Value.Item2, sum = random.NextDouble() * total; // assert: sum < total. When there is only one item remaining: sum < ball
         while (ball < sum) {
-          index++;
-          if (!chosenIndices.Contains(index))
-            ball += valueArray[++index];
-        }
-        yield return sourceArray[index];
-        chosenIndices.Add(index);
-        total -= valueArray[index];
-      }
-    }
+          cur = cur.Next;
+          ball += cur.Value.Item2;
+        }
+        yield return cur.Value.Item1;
+        list.Remove(cur);
+        total -= cur.Value.Item2;
+      }
+    }
+
     private static double[] PrepareProportional<T>(IList<T> sourceArray, IEnumerable<double> weights, bool windowing, bool inverseProportional) {
       double maxValue = double.MinValue, minValue = double.MaxValue;
@@ -274,2 +275,3 @@
   }
 }
+
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Selection/3.3/Selector.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Selection/3.3/Selector.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Selection/3.3/Selector.cs	(revision 10479)
@@ -33,5 +33,5 @@
   [Item("Selector", "A base class for selection operators.")]
   [StorableClass]
-  public abstract class Selector : SingleSuccessorOperator {
+  public abstract class Selector : InstrumentedOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -54,5 +54,5 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       List<IScope> scopes = new List<IScope>(CurrentScope.SubScopes);
       IScope[] selected = Select(scopes);
@@ -66,5 +66,5 @@
       CurrentScope.SubScopes.Add(selectedScope);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Tests/HeuristicLab-3.3/SamplesTest.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Tests/HeuristicLab-3.3/SamplesTest.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Tests/HeuristicLab-3.3/SamplesTest.cs	(revision 10479)
@@ -832,7 +832,7 @@
       ts.SetSeedRandomly.Value = false;
       RunAlgorithm(ts);
-      Assert.AreEqual(6441, GetDoubleResult(ts, "BestQuality"));
-      Assert.AreEqual(7401.666666666667, GetDoubleResult(ts, "CurrentAverageQuality"));
-      Assert.AreEqual(8418, GetDoubleResult(ts, "CurrentWorstQuality"));
+      Assert.AreEqual(6294, GetDoubleResult(ts, "BestQuality"));
+      Assert.AreEqual(7380.0386666666664, GetDoubleResult(ts, "CurrentAverageQuality"));
+      Assert.AreEqual(8328, GetDoubleResult(ts, "CurrentWorstQuality"));
       Assert.AreEqual(750000, GetIntResult(ts, "EvaluatedMoves"));
     }
@@ -903,8 +903,8 @@
       vrp.SetSeedRandomly.Value = false;
       RunAlgorithm(vrp);
-      Assert.AreEqual(1436, GetDoubleResult(vrp, "BestQuality"));
-      Assert.AreEqual(2132.2478893442621, GetDoubleResult(vrp, "CurrentAverageQuality"));
-      Assert.AreEqual(4176.0, GetDoubleResult(vrp, "CurrentWorstQuality"));
-      Assert.AreEqual(119011, GetIntResult(vrp, "EvaluatedMoves"));
+      Assert.AreEqual(1473, GetDoubleResult(vrp, "BestQuality"));
+      Assert.AreEqual(2102.1192622950812, GetDoubleResult(vrp, "CurrentAverageQuality"));
+      Assert.AreEqual(4006, GetDoubleResult(vrp, "CurrentWorstQuality"));
+      Assert.AreEqual(119072, GetIntResult(vrp, "EvaluatedMoves"));
     }
 
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Tests/HeuristicLab.Random-3.3/RandomEnumerableSampleTest.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Tests/HeuristicLab.Random-3.3/RandomEnumerableSampleTest.cs	(revision 10479)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Tests/HeuristicLab.Random-3.3/RandomEnumerableSampleTest.cs	(revision 10479)
@@ -0,0 +1,161 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Linq;
+using System.Text;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+namespace HeuristicLab.Random.Tests {
+
+  [TestClass()]
+  public class RandomEnumerableSampleTest {
+    [TestMethod]
+    [TestCategory("Problems.Random")]
+    [TestProperty("Time", "short")]
+    public void SampleProportionalWithoutRepetitionTest() {
+      {
+        // select 1 of 100 uniformly (weights = 0)
+        var items = Enumerable.Range(0, 100);
+        var random = new MersenneTwister(31415);
+        var weights = Enumerable.Repeat(0.0, 100);
+        for (int i = 0; i < 1000; i++) {
+          var sample =
+            RandomEnumerable.SampleProportionalWithoutRepetition(items, random, 1, weights, false, false).ToArray();
+          Assert.AreEqual(sample.Count(), 1);
+          Assert.AreEqual(sample.Distinct().Count(), 1);
+        }
+      }
+      {
+        // select 1 of 1 uniformly (weights = 0)
+        var items = Enumerable.Range(0, 1);
+        var random = new MersenneTwister(31415);
+        var weights = Enumerable.Repeat(0.0, 1);
+        for (int i = 0; i < 1000; i++) {
+          var sample =
+            RandomEnumerable.SampleProportionalWithoutRepetition(items, random, 1, weights, false, false).ToArray();
+          Assert.AreEqual(sample.Count(), 1);
+          Assert.AreEqual(sample.Distinct().Count(), 1);
+        }
+      }
+      {
+        // select 1 of 2 non-uniformly (weights = 1, 2)
+        var items = Enumerable.Range(0, 2);
+        var random = new MersenneTwister(31415);
+        var weights = new double[] { 1.0, 2.0 };
+        for (int i = 0; i < 1000; i++) {
+          var sample =
+            RandomEnumerable.SampleProportionalWithoutRepetition(items, random, 1, weights, false, false).ToArray();
+          Assert.AreEqual(sample.Count(), 1);
+          Assert.AreEqual(sample.Distinct().Count(), 1);
+        }
+      }
+      {
+        // select 2 of 2 non-uniformly (weights = 1, 1000)
+        var items = Enumerable.Range(0, 2);
+        var random = new MersenneTwister(31415);
+        var weights = new double[] { 1.0, 1000.0 };
+        for (int i = 0; i < 1000; i++) {
+          var sample =
+            RandomEnumerable.SampleProportionalWithoutRepetition(items, random, 1, weights, false, false).ToArray();
+          Assert.AreEqual(sample.Count(), 1);
+          Assert.AreEqual(sample.Distinct().Count(), 1);
+        }
+      }
+      {
+        // select 2 from 1 uniformly (weights = 0), this does not throw an exception but instead returns a sample with 1 element!
+        var items = Enumerable.Range(0, 1);
+        var random = new MersenneTwister(31415);
+        var weights = Enumerable.Repeat(0.0, 1);
+        var sample =
+          RandomEnumerable.SampleProportionalWithoutRepetition(items, random, 2, weights, false, false).ToArray();
+        Assert.AreEqual(sample.Count(), 1);
+      }
+
+      {
+        // select 10 of 100 uniformly (weights = 0)
+        var items = Enumerable.Range(0, 100);
+        var random = new MersenneTwister(31415);
+        var weights = Enumerable.Repeat(0.0, 100);
+        for (int i = 0; i < 1000; i++) {
+          var sample =
+            RandomEnumerable.SampleProportionalWithoutRepetition(items, random, 10, weights, false, false).ToArray();
+          Assert.AreEqual(sample.Count(), 10);
+          Assert.AreEqual(sample.Distinct().Count(), 10);
+        }
+      }
+
+      {
+        // select 100 of 100 uniformly (weights = 0)
+        var items = Enumerable.Range(0, 100);
+        var random = new MersenneTwister(31415);
+        var weights = Enumerable.Repeat(0.0, 100);
+        for (int i = 0; i < 1000; i++) {
+          var sample =
+            RandomEnumerable.SampleProportionalWithoutRepetition(items, random, 100, weights, false, false).ToArray();
+          Assert.AreEqual(sample.Count(), 100);
+          Assert.AreEqual(sample.Distinct().Count(), 100);
+        }
+      }
+
+      {
+        // select 10 of 10 uniformly (weights = 1)
+        var items = Enumerable.Range(0, 10);
+        var random = new MersenneTwister(31415);
+        var weights = Enumerable.Repeat(1.0, 10);
+        for (int i = 0; i < 1000; i++) {
+
+          var sample =
+            RandomEnumerable.SampleProportionalWithoutRepetition(items, random, 10, weights, false, false).ToArray();
+          Assert.AreEqual(sample.Count(), 10);
+          Assert.AreEqual(sample.Distinct().Count(), 10);
+        }
+      }
+
+      {
+        // select 10 of 10 uniformly (weights = 1)
+        // repeat 1000000 times and calculate statistics
+        var items = Enumerable.Range(0, 100);
+        var random = new MersenneTwister(31415);
+        var weights = Enumerable.Repeat(1.0, 100);
+        var selectionCount = new int[100, 100]; // frequency of selecting item at pos
+        for (int i = 0; i < 1000000; i++) {
+          var sample = RandomEnumerable.SampleProportionalWithoutRepetition(items, random, 100, weights, false, false).ToArray();
+          Assert.AreEqual(sample.Count(), 100);
+          Assert.AreEqual(sample.Distinct().Count(), 100);
+
+          int pos = 0;
+          foreach (var item in sample) {
+            selectionCount[item, pos]++;
+            pos++;
+          }
+        }
+        var sb = new StringBuilder();
+        for (int item = 0; item < 100; item++) {
+          for (int pos = 0; pos < 100; pos++) {
+            sb.AppendFormat("{0} ", selectionCount[item, pos]);
+          }
+          sb.AppendLine();
+        }
+        Console.WriteLine(sb.ToString());
+      }
+    }
+  }
+}
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Tests/HeuristicLab.Tests.csproj
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 10479)
@@ -464,4 +464,5 @@
     <Compile Include="HeuristicLab.Problems.TravelingSalesman-3.3\TSPMoveEvaluatorTest.cs" />
     <Compile Include="HeuristicLab.Problems.LinearAssignment-3.3\LinearAssignmentProblemSolverTest.cs" />
+    <Compile Include="HeuristicLab.Random-3.3\RandomEnumerableSampleTest.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="TestRandom.cs" />
Index: branches/SpectralKernelForGaussianProcesses/HeuristicLab.Tests/TestRandom.cs
===================================================================
--- branches/SpectralKernelForGaussianProcesses/HeuristicLab.Tests/TestRandom.cs	(revision 10473)
+++ branches/SpectralKernelForGaussianProcesses/HeuristicLab.Tests/TestRandom.cs	(revision 10479)
@@ -61,7 +61,7 @@
 
     public TestRandom(int[] intNumbers, double[] doubleNumbers) {
-      if (intNumbers == null) intNumbers = new int[0];
+      if (intNumbers == null) this.intNumbers = new int[0];
       else this.intNumbers = intNumbers;
-      if (doubleNumbers == null) doubleNumbers = new double[0];
+      if (doubleNumbers == null) this.doubleNumbers = new double[0];
       else this.doubleNumbers = doubleNumbers;
       nextIntIndex = 0;
