Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.Designer.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.Designer.cs	(revision 15275)
+++ 	(revision )
@@ -1,212 +1,0 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem.BenchmarkSuite {
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Views;
-
-  partial class BenchmarkSuitePushSolutionView {
-    /// <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 && (this.components != null)) {
-        this.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() {
-      System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
-      this.tabControl = new System.Windows.Forms.TabControl();
-      this.tabPage1 = new System.Windows.Forms.TabPage();
-      this.exampleComboBox = new System.Windows.Forms.ComboBox();
-      this.label1 = new System.Windows.Forms.Label();
-      this.tabPage2 = new System.Windows.Forms.TabPage();
-      this.trainingResultsDataGrid = new System.Windows.Forms.DataGridView();
-      this.tabPage3 = new System.Windows.Forms.TabPage();
-      this.testResultsDataGrid = new System.Windows.Forms.DataGridView();
-      this.pushDebugger = new HeuristicLab.Problems.ProgramSynthesis.Push.Views.PushDebuggerView();
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
-      this.tabControl.SuspendLayout();
-      this.tabPage1.SuspendLayout();
-      this.tabPage2.SuspendLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.trainingResultsDataGrid)).BeginInit();
-      this.tabPage3.SuspendLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.testResultsDataGrid)).BeginInit();
-      this.SuspendLayout();
-      //
-      // nameTextBox
-      //
-      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
-      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
-      this.nameTextBox.Size = new System.Drawing.Size(755, 20);
-      //
-      // infoLabel
-      //
-      this.infoLabel.Location = new System.Drawing.Point(838, 3);
-      //
-      // 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.Controls.Add(this.tabPage1);
-      this.tabControl.Controls.Add(this.tabPage2);
-      this.tabControl.Controls.Add(this.tabPage3);
-      this.tabControl.Location = new System.Drawing.Point(6, 26);
-      this.tabControl.Name = "tabControl";
-      this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(848, 602);
-      this.tabControl.TabIndex = 12;
-      //
-      // tabPage1
-      //
-      this.tabPage1.AutoScroll = true;
-      this.tabPage1.Controls.Add(this.pushDebugger);
-      this.tabPage1.Controls.Add(this.exampleComboBox);
-      this.tabPage1.Controls.Add(this.label1);
-      this.tabPage1.Location = new System.Drawing.Point(4, 22);
-      this.tabPage1.Name = "tabPage1";
-      this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
-      this.tabPage1.Size = new System.Drawing.Size(840, 576);
-      this.tabPage1.TabIndex = 0;
-      this.tabPage1.Text = "Debug";
-      this.tabPage1.UseVisualStyleBackColor = true;
-      //
-      // exampleComboBox
-      //
-      this.exampleComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.exampleComboBox.FormattingEnabled = true;
-      this.exampleComboBox.Location = new System.Drawing.Point(58, 6);
-      this.exampleComboBox.Name = "exampleComboBox";
-      this.exampleComboBox.Size = new System.Drawing.Size(776, 21);
-      this.exampleComboBox.TabIndex = 11;
-      //
-      // label1
-      //
-      this.label1.AutoSize = true;
-      this.label1.Location = new System.Drawing.Point(3, 9);
-      this.label1.Name = "label1";
-      this.label1.Size = new System.Drawing.Size(50, 13);
-      this.label1.TabIndex = 10;
-      this.label1.Text = "Example:";
-      //
-      // tabPage2
-      //
-      this.tabPage2.Controls.Add(this.trainingResultsDataGrid);
-      this.tabPage2.Location = new System.Drawing.Point(4, 22);
-      this.tabPage2.Name = "tabPage2";
-      this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
-      this.tabPage2.Size = new System.Drawing.Size(840, 576);
-      this.tabPage2.TabIndex = 1;
-      this.tabPage2.Text = "Traning Results";
-      this.tabPage2.UseVisualStyleBackColor = true;
-      //
-      // trainingResultsDataGrid
-      //
-      this.trainingResultsDataGrid.AllowUserToAddRows = false;
-      this.trainingResultsDataGrid.AllowUserToDeleteRows = false;
-      this.trainingResultsDataGrid.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
-      this.trainingResultsDataGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
-      dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
-      dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window;
-      dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-      dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.ControlText;
-      dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
-      dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
-      dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
-      this.trainingResultsDataGrid.DefaultCellStyle = dataGridViewCellStyle1;
-      this.trainingResultsDataGrid.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.trainingResultsDataGrid.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
-      this.trainingResultsDataGrid.Location = new System.Drawing.Point(3, 3);
-      this.trainingResultsDataGrid.Name = "trainingResultsDataGrid";
-      this.trainingResultsDataGrid.ReadOnly = true;
-      this.trainingResultsDataGrid.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
-      this.trainingResultsDataGrid.Size = new System.Drawing.Size(834, 570);
-      this.trainingResultsDataGrid.TabIndex = 0;
-      //
-      // tabPage3
-      //
-      this.tabPage3.Controls.Add(this.testResultsDataGrid);
-      this.tabPage3.Location = new System.Drawing.Point(4, 22);
-      this.tabPage3.Name = "tabPage3";
-      this.tabPage3.Size = new System.Drawing.Size(840, 576);
-      this.tabPage3.TabIndex = 2;
-      this.tabPage3.Text = "Test Results";
-      this.tabPage3.UseVisualStyleBackColor = true;
-      //
-      // testResultsDataGrid
-      //
-      this.testResultsDataGrid.AllowUserToAddRows = false;
-      this.testResultsDataGrid.AllowUserToDeleteRows = false;
-      this.testResultsDataGrid.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllHeaders;
-      this.testResultsDataGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
-      this.testResultsDataGrid.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.testResultsDataGrid.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
-      this.testResultsDataGrid.Location = new System.Drawing.Point(0, 0);
-      this.testResultsDataGrid.Name = "testResultsDataGrid";
-      this.testResultsDataGrid.ReadOnly = true;
-      this.testResultsDataGrid.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
-      this.testResultsDataGrid.Size = new System.Drawing.Size(840, 576);
-      this.testResultsDataGrid.TabIndex = 1;
-      //
-      // pushDebugger
-      //
-      this.pushDebugger.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.pushDebugger.Caption = "View";
-      this.pushDebugger.Content = null;
-      this.pushDebugger.Location = new System.Drawing.Point(6, 33);
-      this.pushDebugger.Name = "pushDebugger";
-      this.pushDebugger.ReadOnly = false;
-      this.pushDebugger.Size = new System.Drawing.Size(831, 540);
-      this.pushDebugger.TabIndex = 12;
-      //
-      // BenchmarkSuitePushSolutionView
-      //
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.tabControl);
-      this.Name = "BenchmarkSuitePushSolutionView";
-      this.Size = new System.Drawing.Size(857, 631);
-      this.Controls.SetChildIndex(this.tabControl, 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.tabControl.ResumeLayout(false);
-      this.tabPage1.ResumeLayout(false);
-      this.tabPage1.PerformLayout();
-      this.tabPage2.ResumeLayout(false);
-      ((System.ComponentModel.ISupportInitialize)(this.trainingResultsDataGrid)).EndInit();
-      this.tabPage3.ResumeLayout(false);
-      ((System.ComponentModel.ISupportInitialize)(this.testResultsDataGrid)).EndInit();
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.TabControl tabControl;
-    private System.Windows.Forms.TabPage tabPage1;
-    private System.Windows.Forms.ComboBox exampleComboBox;
-    private System.Windows.Forms.Label label1;
-    private System.Windows.Forms.TabPage tabPage2;
-    private System.Windows.Forms.DataGridView trainingResultsDataGrid;
-    private PushDebuggerView pushDebugger;
-    private System.Windows.Forms.TabPage tabPage3;
-    private System.Windows.Forms.DataGridView testResultsDataGrid;
-  }
-}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.cs	(revision 15275)
+++ 	(revision )
@@ -1,283 +1,0 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem.BenchmarkSuite {
-  using System;
-  using System.Collections.Generic;
-  using System.Drawing;
-  using System.Globalization;
-  using System.Linq;
-  using System.Windows.Forms;
-  using Core.Views;
-  using HeuristicLab.BenchmarkSuite;
-  using HeuristicLab.BenchmarkSuite.Views;
-  using HeuristicLab.Common;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Constants;
-
-  using Interpreter;
-  using MainForm;
-  using Problem;
-  using Stack;
-
-  [View("Push Program Debugger")]
-  [Content(typeof(PushSolution), true)]
-  public partial class BenchmarkSuitePushSolutionView : NamedItemView {
-
-    private const string Separator = ", ";
-
-    private const string exampleSplitter = " => ";
-    private const string AbsoluteDiffHeaderText = "Absolute Diff.";
-    private const string RelativeDiffHeaderText = "Relative Diff.";
-    private const string InputHeaderStringFormat = "Input {0} : {1}";
-    private const string EstimatedOutputHeaderStringFormat = "Estimated Output {0} : {1}";
-    private const string OutputHeaderStringFormat = "Output {0} : {1}";
-    private static readonly Color correctExampleFontColor = Color.FromArgb(0x5cb85c);
-    private PooledPushInterpreter interpreter;
-    private PushInterpreterPool pool;
-
-    public BenchmarkSuitePushSolutionView() {
-      InitializeComponent();
-      Name = "Push Program Debugger";
-      InitEvents();
-    }
-
-    ~BenchmarkSuitePushSolutionView() {
-      interpreter.Dispose();
-    }
-
-    private void InitEvents() {
-      exampleComboBox.SelectedIndexChanged += SelectedExampleIndexChanged;
-      pushDebugger.OnReset += PushDebuggerReset;
-    }
-
-    private void PushDebuggerReset(object sender, IPushInterpreter interpreter) {
-      if (exampleComboBox.SelectedIndex < 0) return;
-
-      var example = Evaluator.Data.Examples[exampleComboBox.SelectedIndex];
-
-      interpreter.InitExample(example);
-    }
-
-    private void SelectedExampleIndexChanged(object sender, EventArgs e) {
-      pushDebugger.ResetDebugging();
-    }
-
-    public new PushBenchmarkSuiteSolution Content
-    {
-      get { return (PushBenchmarkSuiteSolution)base.Content; }
-      set
-      {
-        base.Content = value;
-      }
-    }
-
-    public PushBenchmarkSuiteEvaluator Evaluator
-    {
-      get { return (PushBenchmarkSuiteEvaluator)Content.Evaluator; }
-    }
-
-
-    protected override void OnContentChanged() {
-      if (Content == null) return;
-
-      Name = "Push Solution";
-      nameTextBox.Text = Name;
-
-      pool = new PushInterpreterPool(Content.Config);
-
-      if (interpreter != null) {
-        interpreter.Dispose();
-      }
-
-      var random = Content.GetRandom();
-      interpreter = pool.Create(random);
-      UpdateExamples(Evaluator.Data);
-
-      if (exampleComboBox.SelectedIndex < 0) {
-        exampleComboBox.SelectedIndex = 0; // Triggers ResetDebugging via event
-      }
-
-      InitResultGrid(trainingResultsDataGrid, Evaluator.DataBounds.TrainingRange.Start, Evaluator.DataBounds.TrainingRange.End);
-      InitResultGrid(testResultsDataGrid, Evaluator.DataBounds.TestRange.Start, Evaluator.DataBounds.TestRange.End);
-
-      pushDebugger.Content = Content;
-    }
-
-    private void InitResultGrid(DataGridView grid, int start, int end) {
-      grid.Columns.Clear();
-      grid.Rows.Clear();
-
-      var cellTemplate = new DataGridViewTextBoxCell { Style = { WrapMode = DataGridViewTriState.True } };
-      var data = Evaluator.Data;
-
-      for (var i = 0; i < data.InputArgumentTypes.Length; i++) {
-        var headerTypeName = ViewHelper.GetHeaderTypeName(data.InputArgumentTypes[i]);
-        var column = new DataGridViewColumn {
-          HeaderText = string.Format(InputHeaderStringFormat, i + 1, headerTypeName),
-          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
-          CellTemplate = cellTemplate,
-          DefaultCellStyle = { Alignment = DataGridViewContentAlignment.MiddleRight },
-          SortMode = DataGridViewColumnSortMode.Automatic
-        };
-
-        grid.Columns.Add(column);
-      }
-
-      for (var i = 0; i < data.OutputArgumentTypes.Length; i++) {
-        var headerTypeName = ViewHelper.GetHeaderTypeName(data.OutputArgumentTypes[i]);
-
-        var estimatedOutputColumn = new DataGridViewColumn {
-          HeaderText = string.Format(EstimatedOutputHeaderStringFormat, i + 1, headerTypeName),
-          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
-          CellTemplate = cellTemplate,
-          SortMode = DataGridViewColumnSortMode.Automatic
-        };
-
-        var outputColumn = new DataGridViewColumn {
-          HeaderText = string.Format(OutputHeaderStringFormat, i + 1, headerTypeName),
-          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
-          CellTemplate = cellTemplate,
-          SortMode = DataGridViewColumnSortMode.Automatic
-        };
-
-        estimatedOutputColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
-        outputColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
-
-        grid.Columns.Add(estimatedOutputColumn);
-        grid.Columns.Add(outputColumn);
-      }
-
-      var absoluteDiffColumn = new DataGridViewColumn {
-        HeaderText = AbsoluteDiffHeaderText,
-        AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader,
-        CellTemplate = cellTemplate,
-        SortMode = DataGridViewColumnSortMode.Automatic
-      };
-
-      var relativeDiffColumn = new DataGridViewColumn {
-        HeaderText = RelativeDiffHeaderText,
-        AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader,
-        CellTemplate = cellTemplate,
-        SortMode = DataGridViewColumnSortMode.Automatic
-      };
-
-      absoluteDiffColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
-      relativeDiffColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
-
-      grid.Columns.Add(absoluteDiffColumn);
-      grid.Columns.Add(relativeDiffColumn);
-
-      var random = Content.GetRandom();
-      using (var pushInterpreter = pool.Create(random)) {
-        var rowIndex = 1;
-        for (var i = start; i < end; i++, rowIndex++) {
-          var example = data.Examples[i];
-          var row = new DataGridViewRow {
-            HeaderCell = {
-              Value = rowIndex.ToString(),
-            }
-          };
-
-          row.CreateCells(grid);
-
-          var absoluteDiff = Evaluator.Evaluate(pushInterpreter, Content.Program, i);
-          var relativeDiff = absoluteDiff / Math.Abs(data.BestResult - data.WorstResult) * 100d;
-
-          var inputArgumentCountDict = ViewHelper.CreateArgumentCountDict();
-          for (var j = 0; j < data.InputArgumentTypes.Length; j++) {
-            var type = data.InputArgumentTypes[j];
-            var offset = inputArgumentCountDict[type];
-            row.Cells[j].Value = ViewHelper.StringifyInput(type, offset, Content.Config.FloatStringFormat, example, Separator);
-            inputArgumentCountDict[type]++;
-          }
-
-          var outputArgumentCountDict = ViewHelper.CreateArgumentCountDict();
-          for (var j = 0; j < data.OutputArgumentTypes.Length; j++) {
-            var type = data.OutputArgumentTypes[j];
-            var offset = outputArgumentCountDict[type];
-
-            // estimated
-            row.Cells[data.InputArgumentTypes.Length + j * 2].Value = ViewHelper.StringifyOutput(type, offset, Content.Config.FloatStringFormat, example, Separator);
-
-            // output
-            row.Cells[data.InputArgumentTypes.Length + j * 2 + 1].Value = StringifyResult(type, offset, pushInterpreter, example, Separator);
-
-            outputArgumentCountDict[type]++;
-          }
-
-          row.Cells[data.TotalArgumentCount + 1].Value = absoluteDiff.ToString("0.####");
-          row.Cells[data.TotalArgumentCount + 2].Value = relativeDiff.ToString("0.##") + "%";
-
-          if (absoluteDiff.IsAlmost(data.BestResult)) {
-            for (var j = 0; j < row.Cells.Count; j++) {
-              row.Cells[j].Style.ForeColor = correctExampleFontColor;
-            }
-          }
-
-          grid.Rows.Add(row);
-          pushInterpreter.Reset();
-        }
-      }
-    }
-
-    private string StringifyResult(ExampleArgumentType type, int offset, IPushInterpreter interpreter, Example example, string valueSeparator) {
-      var emptyString = string.Empty;
-
-      switch (type) {
-        case ExampleArgumentType.Integer:
-          return GetEntryAsString(offset, interpreter.IntegerStack);
-
-        case ExampleArgumentType.IntegerVector:
-          return GetVectorEntryAsString(offset, interpreter.IntegerVectorStack);
-
-        case ExampleArgumentType.Float:
-          return interpreter.FloatStack.Count > offset
-            ? interpreter.FloatStack[offset].ToString(CultureInfo.CurrentUICulture)
-            : emptyString;
-
-        case ExampleArgumentType.FloatVector:
-          return GetVectorEntryAsString(offset, interpreter.FloatVectorStack);
-
-        case ExampleArgumentType.Boolean:
-          return GetEntryAsString(offset, interpreter.BooleanStack);
-
-        case ExampleArgumentType.Char:
-          return GetEntryAsString(offset, interpreter.CharStack);
-
-        case ExampleArgumentType.Print:
-          return string.Join(valueSeparator, string.Join(PushEnvironment.NewLine, interpreter.PrintStack.AsStrings().Take(example.OutputPrintLineCount)));
-
-        case ExampleArgumentType.String:
-          return GetEntryAsString(offset, interpreter.StringStack);
-
-        case ExampleArgumentType.StringVector:
-          return GetVectorEntryAsString(offset, interpreter.StringVectorStack);
-
-        default: return string.Empty;
-      }
-    }
-
-    private static string GetEntryAsString<T>(int offset, IPushStack<T> stack) {
-      return stack.Count > offset
-       ? stack[offset].ToString()
-       : string.Empty;
-    }
-
-    private static string GetVectorEntryAsString<T>(int offset, IPushStack<IReadOnlyList<T>> vectorStack) {
-      return vectorStack.Count > offset
-       ? "[" + string.Join(",", vectorStack[offset]) + "]"
-       : string.Empty;
-    }
-
-    private void UpdateExamples(ProblemData data) {
-      exampleComboBox.Items.Clear();
-      if (data == null) return;
-
-      var stringRepresentations = data.Examples.Select(e =>
-        string.Join(Separator, e.InputArgs) +
-        exampleSplitter +
-        string.Join(Separator, e.OutputArgs));
-
-      foreach (var str in stringRepresentations) {
-        exampleComboBox.Items.Add(str);
-      }
-    }
-  }
-}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.resx
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.resx	(revision 15275)
+++ 	(revision )
@@ -1,126 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>140, 17</value>
-  </metadata>
-</root>
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/IntegerVectorPushBenchmarkSuiteProblem.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/IntegerVectorPushBenchmarkSuiteProblem.cs	(revision 15275)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/IntegerVectorPushBenchmarkSuiteProblem.cs	(revision 15289)
@@ -7,5 +7,8 @@
   using HeuristicLab.BenchmarkSuite;
   using HeuristicLab.BenchmarkSuite.Problems;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Evaluator;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Solution;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Solution.BenchmarkSuite;
 
   using Instances;
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PlushPushBenchmarkSuiteProblem.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PlushPushBenchmarkSuiteProblem.cs	(revision 15275)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PlushPushBenchmarkSuiteProblem.cs	(revision 15289)
@@ -7,5 +7,8 @@
   using HeuristicLab.Problems.Instances;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Evaluator;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Solution;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Solution.BenchmarkSuite;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Stack;
 
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PushBenchmarkSuiteEvaluator.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PushBenchmarkSuiteEvaluator.cs	(revision 15275)
+++ 	(revision )
@@ -1,339 +1,0 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem.BenchmarkSuite {
-  using System;
-  using System.Collections.Generic;
-  using System.Globalization;
-  using System.Linq;
-
-  using Common;
-  using Core;
-  using Expressions;
-
-  using HeuristicLab.BenchmarkSuite;
-  using HeuristicLab.Parameters;
-  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Constants;
-
-  using Interpreter;
-  using Problem;
-  using Stack;
-
-  [StorableClass]
-  public class PushBenchmarkSuiteEvaluator : ParameterizedNamedItem, IPushEvaluator {
-
-    private const string DataBoundsParameterName = "DataBounds";
-    private const string DataParameterName = "Data";
-    private const string DataParameterDescription = "Program Synthesis";
-
-    public PushBenchmarkSuiteEvaluator() {
-      Parameters.Add(new FixedValueParameter<DataBounds>(DataBoundsParameterName));
-
-      Parameters.Add(new ValueParameter<ProblemData>(
-        DataParameterName,
-        DataParameterDescription));
-    }
-
-    public PushBenchmarkSuiteEvaluator(ProblemData data) : this() {
-      LoadData(data);
-    }
-
-    [StorableConstructor]
-    public PushBenchmarkSuiteEvaluator(bool deserializing) : base(deserializing) { }
-
-    public PushBenchmarkSuiteEvaluator(PushBenchmarkSuiteEvaluator origin, Cloner cloner) : base(origin, cloner) {
-      Data = cloner.Clone(origin.Data);
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new PushBenchmarkSuiteEvaluator(this, cloner);
-    }
-
-    public IValueParameter<ProblemData> DataParameter
-    {
-      get { return (IValueParameter<ProblemData>)Parameters[DataParameterName]; }
-    }
-
-    public ProblemData Data
-    {
-      get { return DataParameter.Value; }
-      set { DataParameter.Value = value; }
-    }
-
-    public IValueParameter<DataBounds> DataBoundsParameter
-    {
-      get { return (IValueParameter<DataBounds>)Parameters[DataBoundsParameterName]; }
-    }
-
-    public DataBounds DataBounds
-    {
-      get { return DataBoundsParameter.Value; }
-      set { DataBoundsParameter.Value = value; }
-    }
-
-    public void LoadData(ProblemData data) {
-      Data = data;
-
-      DataBounds.TrainingRange.Start = 0;
-      DataBounds.TrainingRange.End = Data.TrainingCount;
-      DataBounds.TestRange.Start = Data.TrainingCount;
-      DataBounds.TestRange.End = Data.TrainingCount + Data.TestCount;
-    }
-
-    public EvaluationResult Evaluate(IPushInterpreter interpreter, PushProgram program, int start, int end) {
-      var length = end - start;
-      if (length <= 0) return null;
-
-      var evaluationResult = new EvaluationResult(length);
-
-      for (var i = start; i < end; i++) {
-        var result = Evaluate(interpreter, program, i);
-        evaluationResult.ExampleQualities[i - start] = result;
-        evaluationResult.AvgQuality += result;
-        interpreter.Reset();
-      }
-
-      evaluationResult.AvgQuality /= length;
-
-      return evaluationResult;
-    }
-
-    public EvaluationResult EvaluateTest(IPushInterpreter interpreter, PushProgram program) {
-      return Evaluate(interpreter, program, DataBounds.TestRange.Start, DataBounds.TestRange.End);
-    }
-
-    public EvaluationResult EvaluateTest(IReadOnlyPushConfiguration config, PushProgram program, IRandom random) {
-      var interpreter = new PushInterpreter(config, random);
-      return EvaluateTest(interpreter, program);
-    }
-
-    public EvaluationResult EvaluateTest(PushInterpreterPool pool, PushProgram program, IRandom random) {
-      using (var interpreter = pool.Create(random)) {
-        return EvaluateTest(interpreter, program);
-      }
-    }
-
-    public EvaluationResult EvaluateTraining(IPushInterpreter interpreter, PushProgram program) {
-      return Evaluate(interpreter, program, DataBounds.TrainingRange.Start, DataBounds.TrainingRange.End);
-    }
-
-    public EvaluationResult EvaluateTraining(IReadOnlyPushConfiguration config, PushProgram program, IRandom random) {
-      var interpreter = new PushInterpreter(config, random);
-      return EvaluateTraining(interpreter, program);
-    }
-
-    public EvaluationResult EvaluateTraining(PushInterpreterPool pool, PushProgram program, IRandom random) {
-      using (var interpreter = pool.Create(random)) {
-        return EvaluateTraining(interpreter, program);
-      }
-    }
-
-    public double Evaluate(IPushInterpreter interpreter, PushProgram program, int exampleIndex) {
-      var example = Data.Examples[exampleIndex];
-
-      interpreter.InitExample(example);
-      interpreter.Run(program);
-
-      switch (Data.ProblemType) {
-        case ProblemType.NumberIO: return NumberIo(interpreter, example);
-        case ProblemType.Median: return Median(interpreter, example);
-      }
-
-      return Default(interpreter, example);
-    }
-
-    private double Default(IPushInterpreter interpreter, Example example) {
-      var result = GetDiff(example.OutputInteger, interpreter.IntegerStack, Data.WorstResult, IntegerDiffer)
-             + GetDiff(example.OutputFloat, interpreter.FloatStack, Data.WorstResult, (a, b) => FloatDiffer(a, b, example.OutputFloatPrecision))
-             + GetDiff(example.OutputBoolean, interpreter.BooleanStack, Data.WorstResult, BooleanDiffer)
-             + GetDiff(example.OutputString, interpreter.StringStack, Data.WorstResult, StringDiffer)
-             + GetDiff(example.OutputChar, interpreter.CharStack, Data.WorstResult, CharDiffer)
-             + GetPrintDiffer(example.OutputPrint, interpreter.PrintStack, example.OutputPrintLineCount, Data.WorstResult)
-             + GetVectorDiff(example.OutputIntegerVector, interpreter.IntegerVectorStack, Data.WorstResult, (a, b) => VectorDiffer(a, b, IntegerDiffer))
-             + GetVectorDiff(example.OutputFloatVector, interpreter.FloatVectorStack, Data.WorstResult, (a, b) => VectorDiffer(a, b, (x, y) => FloatDiffer(x, y, example.OutputFloatVectorPrecision)))
-             + GetVectorDiff(example.OutputStringVector, interpreter.StringVectorStack, Data.WorstResult, (a, b) => VectorDiffer(a, b, StringDiffer));
-
-      return result;
-    }
-
-    private double Median(IPushInterpreter interpreter, Example example) {
-      return interpreter.PrintStack.IsEmpty || !interpreter.PrintStack.Top.Equals(example.OutputPrint) ? 1 : 0;
-    }
-
-    private double NumberIo(IPushInterpreter interpreter, Example example) {
-      if (interpreter.PrintStack.IsEmpty)
-        return Data.WorstResult;
-
-      double value;
-      if (double.TryParse(interpreter.PrintStack.Top, NumberStyles.Number | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out value)) {
-        var diff = Math.Abs(example.OutputFloat[0] - value);
-        var result = Math.Min(diff, Data.WorstResult);
-
-        return result;
-      }
-
-      var penaltyError = Data.WorstResult / 4.0d;
-      var levenshteinDistance = GetPrintDiffer(
-        example.OutputPrint,
-        interpreter.PrintStack.Top,
-        Data.WorstResult);
-
-      return levenshteinDistance + penaltyError;
-    }
-
-    private static double FloatDiffer(double a, double b, int digits) {
-      var result = Math.Round(a, digits) - Math.Round(b, digits);
-
-      // ReSharper disable once CompareOfFloatsByEqualityOperator
-      if (result == double.MinValue || double.IsPositiveInfinity(result) || double.IsNaN(result))
-        return double.MaxValue;
-
-      // ReSharper disable once CompareOfFloatsByEqualityOperator
-      if (result == double.MaxValue || double.IsNegativeInfinity(result))
-        return double.MinValue;
-
-      return Math.Abs(result);
-    }
-
-    private static double IntegerDiffer(long a, long b) {
-      var result = a - b;
-
-      return result == long.MinValue ? long.MaxValue : Math.Abs(result);
-    }
-
-    private static double BooleanDiffer(bool a, bool b) {
-      return a == b ? 0 : 1;
-    }
-
-    private static double StringDiffer(string a, string b) {
-      return LevenshteinDistance(a, b);
-    }
-
-    private static double CharDiffer(char a, char b) {
-      return IntegerDiffer(a, b);
-    }
-
-    private static double VectorDiffer<T>(IReadOnlyList<T> estimated, IReadOnlyList<T> outcome, Func<T, T, double> differ) {
-      var length = Math.Min(estimated.Count, outcome.Count);
-      var result = 0d;
-
-      for (var i = 0; i < length; i++) {
-        result += differ(estimated[i], outcome[i]);
-      }
-
-      if (estimated.Count > outcome.Count) {
-        var remainingLength = estimated.Count - length;
-        for (var i = 0; i < remainingLength; i++)
-          result += differ(estimated[i], default(T));
-      }
-
-      return result;
-    }
-
-    private static double GetPrintDiffer(string estimated, string printResult, double worstResult) {
-      var distance = LevenshteinDistance(estimated, printResult);
-
-      return Math.Min(distance, worstResult);
-    }
-
-    private static double GetPrintDiffer(string estimated, IPushStack<string> printStack, int estimatedCount, double worstResult) {
-      var printResult = string.Join(PushEnvironment.NewLine, printStack.AsStrings().Take(estimatedCount));
-      var distance = LevenshteinDistance(estimated, printResult);
-
-      return Math.Min(distance, worstResult);
-    }
-
-    private static double GetVectorDiff<T>(IReadOnlyList<IReadOnlyList<T>> estimated, IPushStack<IReadOnlyList<T>> resultStack, double worstResult, Func<IReadOnlyList<T>, IReadOnlyList<T>, double> differ)
-      where T : IComparable {
-      if (estimated.Count == 0) return 0d;
-
-      var diff = 0d;
-      var comparableLength = 0;
-
-      if (!resultStack.IsEmpty) {
-        var count = Math.Min(estimated.Count, resultStack.Count);
-        var result = resultStack.Peek(count);
-        comparableLength = Math.Min(estimated.Count, result.Count);
-
-        for (var i = 0; i < comparableLength; i++) {
-          diff += Math.Min(differ(estimated[i], result[i]), worstResult);
-        }
-      }
-
-      var emptyTArray = new T[0];
-      for (var i = comparableLength; i < estimated.Count - comparableLength; i++) {
-        diff += differ(estimated[i], emptyTArray);
-      }
-
-      return diff;
-    }
-
-    private static double GetDiff<T>(IReadOnlyList<T> estimated, IPushStack<T> resultStack, double worstResult, Func<T, T, double> differ)
-      where T : IComparable {
-      if (estimated.Count == 0) return 0d;
-
-      var diff = 0d;
-      var comparableLength = 0;
-
-      if (!resultStack.IsEmpty) {
-        var count = Math.Min(estimated.Count, resultStack.Count);
-        var result = resultStack.Peek(count);
-        comparableLength = Math.Min(estimated.Count, result.Count);
-
-        for (var i = 0; i < comparableLength; i++) {
-          diff += Math.Min(differ(estimated[i], result[i]), worstResult);
-        }
-      }
-
-      for (var i = comparableLength; i < estimated.Count - comparableLength; i++) {
-        diff += differ(estimated[i], default(T));
-      }
-
-      return diff;
-    }
-
-    /// <summary>
-    /// https://www.dotnetperls.com/levenshtein
-    /// </summary>
-    private static int LevenshteinDistance(string source, string target) {
-      if (source == null && target == null) return 0;
-      if (source == null) return target.Length;
-      if (target == null) return source.Length;
-
-      int n = source.Length;
-      int m = target.Length;
-      int[,] d = new int[n + 1, m + 1];
-
-      // Step 1
-      if (n == 0) {
-        return m;
-      }
-
-      if (m == 0) {
-        return n;
-      }
-
-      // Step 2
-      for (int i = 0; i <= n; d[i, 0] = i++) {
-      }
-
-      for (int j = 0; j <= m; d[0, j] = j++) {
-      }
-
-      // Step 3
-      for (int i = 1; i <= n; i++) {
-        //Step 4
-        for (int j = 1; j <= m; j++) {
-          // Step 5
-          int cost = (target[j - 1] == source[i - 1]) ? 0 : 1;
-
-          // Step 6
-          d[i, j] = Math.Min(
-              Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1),
-              d[i - 1, j - 1] + cost);
-        }
-      }
-      // Step 7
-      return d[n, m];
-    }
-  }
-}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PushBenchmarkSuiteSolution.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PushBenchmarkSuiteSolution.cs	(revision 15275)
+++ 	(revision )
@@ -1,34 +1,0 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem.BenchmarkSuite {
-  using Common;
-  using Configuration;
-  using Core;
-
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
-
-  using Persistence.Default.CompositeSerializers.Storable;
-
-  [StorableClass]
-  public class PushBenchmarkSuiteSolution : PushSolution {
-    public PushBenchmarkSuiteSolution(
-      PushProgram program,
-      double quality,
-      IRandom random,
-      IReadOnlyPushConfiguration config,
-      PushBenchmarkSuiteEvaluator evaluator,
-      bool simplify = false) : base(program, quality, random, config, evaluator, simplify) {
-    }
-
-    public PushBenchmarkSuiteSolution(PushBenchmarkSuiteSolution origin, Cloner cloner) : base(origin, cloner) { }
-
-    [StorableConstructor]
-    public PushBenchmarkSuiteSolution(bool deserializing) : base(deserializing) { }
-
-    public override PushSolution Simplify() {
-      return new PushBenchmarkSuiteSolution(Program, Quality, Random, Config, (PushBenchmarkSuiteEvaluator)Evaluator, true);
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new PushBenchmarkSuiteSolution(this, cloner);
-    }
-  }
-}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/EvaluationResult.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/EvaluationResult.cs	(revision 15275)
+++ 	(revision )
@@ -1,11 +1,0 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem {
-  public class EvaluationResult {
-    public EvaluationResult(int exampleCount) {
-      ExampleQualities = new double[exampleCount];
-    }
-
-
-    public double AvgQuality { get; set; }
-    public double[] ExampleQualities { get; set; }
-  }
-}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IPushEvaluator.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IPushEvaluator.cs	(revision 15275)
+++ 	(revision )
@@ -1,16 +1,0 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem {
-  using HeuristicLab.Common;
-  using HeuristicLab.Core;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
-
-  public interface IPushEvaluator : IDeepCloneable {
-    EvaluationResult EvaluateTest(IReadOnlyPushConfiguration config, PushProgram program, IRandom random);
-    EvaluationResult EvaluateTest(IPushInterpreter interpreter, PushProgram program);
-    EvaluationResult EvaluateTest(PushInterpreterPool pool, PushProgram program, IRandom random);
-    EvaluationResult EvaluateTraining(IReadOnlyPushConfiguration config, PushProgram program, IRandom random);
-    EvaluationResult EvaluateTraining(IPushInterpreter interpreter, PushProgram program);
-    EvaluationResult EvaluateTraining(PushInterpreterPool pool, PushProgram program, IRandom random);
-  }
-}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IntegerVectorPushProblem.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IntegerVectorPushProblem.cs	(revision 15275)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IntegerVectorPushProblem.cs	(revision 15289)
@@ -4,11 +4,11 @@
   using Common;
   using Configuration;
-  using Core;
-  using HeuristicLab.Data;
   using HeuristicLab.Encodings.IntegerVectorEncoding;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Analyzer;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Evaluator;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Individual;
   using HeuristicLab.Problems.ProgramSynthesis.Push.SolutionCreator;
+
   using Optimization;
   using Persistence.Default.CompositeSerializers.Storable;
@@ -54,5 +54,4 @@
     //  IndividualMapper.Clear();
     //  RandomPool.Clear();
-    //  Config.Seed = 0;
     //}
 
@@ -81,27 +80,23 @@
     }
 
-    protected override PushProgram MapIndividual(Individual individual, IRandom random) {
-      var program = individual.ToPushProgram(Config, random);
+    protected override PushProgram MapIndividual(Individual individual) {
+      var program = individual.ToPushProgram(Config);
 
       return program;
     }
 
-    public override double Evaluate(Individual individual, IRandom random) {
-      // init seed of random pool
-      //Interlocked.CompareExchange(ref RandomPool.Seed, random.Next(), 0);
-      //Config.Seed = RandomPool.Seed;
+    //public override double Evaluate(Individual individual, IRandom random) {
+    //  var seed = random.Next();
 
-      //var rand = RandomPool.ResetAndAllocate();
-      var program = MapIndividual(individual, random);
-      //RandomPool.Free(rand);
+    //  var program = individual.ToPushProgram(Config);
 
-      //rand = RandomPool.ResetAndAllocate();
-      var result = PushEvaluator.EvaluateTraining(Pool, program, random);
-      //RandomPool.Free(rand);
+    //  var rand = new FastRandom(seed);
+    //  var result = PushEvaluator.EvaluateTraining(Pool, program, rand);
 
-      individual[CaseQualitiesScopeParameterName] = new DoubleArray(result.ExampleQualities);
+    //  individual[CaseQualitiesScopeParameterName] = new DoubleArray(result.ExampleQualities);
+    //  individual[SeedScopeParameterName] = new IntValue(seed);
 
-      return result.AvgQuality;
-    }
+    //  return result.AvgQuality;
+    //}
   }
 }
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PlushPushProblem.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PlushPushProblem.cs	(revision 15275)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PlushPushProblem.cs	(revision 15289)
@@ -9,4 +9,5 @@
   using HeuristicLab.Problems.ProgramSynthesis.Push.Analyzer;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Encoding;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Evaluator;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
 
@@ -43,5 +44,5 @@
     }
 
-    protected override PushProgram MapIndividual(Individual individual, IRandom random) {
+    protected override PushProgram MapIndividual(Individual individual) {
       var plushVector = individual.PlushVector();
       var program = plushVector.PushProgram;
@@ -49,13 +50,4 @@
       return program;
     }
-
-    public override double Evaluate(Individual individual, IRandom random) {
-      var program = MapIndividual(individual, random);
-      var result = PushEvaluator.EvaluateTraining(Pool, program, random);
-
-      individual[CaseQualitiesScopeParameterName] = new DoubleArray(result.ExampleQualities);
-
-      return result.AvgQuality;
-    }
   }
 }
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblemBase.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblemBase.cs	(revision 15275)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblemBase.cs	(revision 15289)
@@ -10,7 +10,10 @@
   using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Evaluator;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
   using HeuristicLab.Problems.ProgramSynthesis.Push.ObjectPools.Random;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Solution;
+  using HeuristicLab.Random;
 
   [StorableClass]
@@ -31,4 +34,5 @@
     public const string CasesScopeParameterName = "CaseQualities";
     public const string CaseQualitiesScopeParameterName = "CaseQualities";
+    public const string SeedScopeParameterName = "Seed";
 
     protected PushProblemBase(IPushEvaluator evaluator) {
@@ -88,15 +92,19 @@
       var bestQuality = Maximization ? qualities.Max() : qualities.Min();
       var bestIdx = Array.IndexOf(qualities, bestQuality);
-      var program = MapIndividual(individuals[bestIdx], random);
+      var bestIndividual = individuals[bestIdx];
+      var seed = (IntValue)bestIndividual[SeedScopeParameterName];
+      var program = MapIndividual(bestIndividual);
 
-      var isIndividualBetter = AnalyzeBestTrainingSolution(program, bestQuality, results, random);
+      var rand = new FastRandom(seed.Value);
+      var isIndividualBetter = AnalyzeBestTrainingSolution(program, bestQuality, results, rand);
 
       if (isIndividualBetter) {
-        AnalyzeBestTestSolution(program, results, random);
+        rand.Reset(seed.Value);
+        AnalyzeBestTestSolution(program, results, rand);
       }
     }
 
     protected void AnalyzeBestTestSolution(PushProgram program, ResultCollection results, IRandom random) {
-      var testResult = PushEvaluator.EvaluateTraining(Pool, program, random);
+      var testResult = PushEvaluator.EvaluateTest(Pool, program, random);
 
       if (!results.ContainsKey(TEST_QUALITY_RESULT_NAME)) {
@@ -108,11 +116,11 @@
 
     protected bool AnalyzeBestTrainingSolution(PushProgram program, double bestQuality, ResultCollection results, IRandom random) {
-      if (!results.ContainsKey(BEST_TRAINING_SOLUTION_RESULT_NAME)) {
-        var solution = CreatePushSolution(
+      var solution = CreatePushSolution(
             program,
             bestQuality,
-            (IRandom)random.Clone(),
+            random, // is already cloned
             (IReadOnlyPushConfiguration)Config.Clone());
 
+      if (!results.ContainsKey(BEST_TRAINING_SOLUTION_RESULT_NAME)) {
         results.Add(new Result(BEST_TRAINING_SOLUTION_RESULT_NAME, solution));
         return true;
@@ -123,9 +131,5 @@
       if ((!Maximization && currentBestQuality > bestQuality) ||
            (Maximization && currentBestQuality < bestQuality)) {
-        results[BEST_TRAINING_SOLUTION_RESULT_NAME].Value = CreatePushSolution(
-            program,
-            bestQuality,
-            random,
-            Config);
+        results[BEST_TRAINING_SOLUTION_RESULT_NAME].Value = solution;
         return true;
       }
@@ -135,13 +139,16 @@
 
     public override double Evaluate(Individual individual, IRandom random) {
-      var program = MapIndividual(individual, random);
-      var result = PushEvaluator.EvaluateTraining(Pool, program, random);
+      var program = MapIndividual(individual);
+      var seed = random.Next();
+      var rand = new FastRandom(seed);
+      var result = PushEvaluator.EvaluateTraining(Pool, program, rand);
 
       individual[CaseQualitiesScopeParameterName] = new DoubleArray(result.ExampleQualities);
+      individual[SeedScopeParameterName] = new IntValue(seed);
 
       return result.AvgQuality;
     }
 
-    protected abstract PushProgram MapIndividual(Individual individual, IRandom random);
+    protected abstract PushProgram MapIndividual(Individual individual);
 
     protected abstract PushSolution CreatePushSolution(
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushSolution.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushSolution.cs	(revision 15275)
+++ 	(revision )
@@ -1,63 +1,0 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem {
-  using Common;
-  using Configuration;
-  using Core;
-  using Expressions;
-  using Persistence.Default.CompositeSerializers.Storable;
-
-  [StorableClass]
-  public class PushSolution : NamedItem {
-    [Storable]
-    public readonly double Quality;
-    [Storable]
-    protected readonly IRandom Random;
-    [Storable]
-    public readonly IReadOnlyPushConfiguration Config;
-    [Storable]
-    public readonly IPushEvaluator Evaluator;
-    [Storable]
-    protected readonly bool simplify;
-    [Storable]
-    public PushProgram Program;
-
-
-    public PushSolution(PushProgram program, double quality, IRandom random, IReadOnlyPushConfiguration config, IPushEvaluator evaluator, bool simplify = false)
-      : base("Solution", "A push solution.") {
-      Quality = quality;
-      Random = random;
-      Config = config;
-      Evaluator = evaluator;
-      this.simplify = simplify;
-
-      Program = simplify
-        ? Simplifier.Simplifier.Simplify(program, Config, p => Evaluator.EvaluateTraining(Config, p, Random).AvgQuality)
-        : program;
-
-    }
-
-    public PushSolution(PushSolution origin, Cloner cloner) : base(origin, cloner) {
-      Program = cloner.Clone(origin.Program);
-      Quality = origin.Quality;
-      Random = cloner.Clone(origin.Random);
-      Config = cloner.Clone(origin.Config);
-      Evaluator = cloner.Clone(origin.Evaluator);
-      Program = origin.Program; // push programs are immutable like all expressions
-      simplify = origin.simplify;
-    }
-
-    public IRandom GetRandom() {
-      return (IRandom)Random.Clone();
-    }
-
-    public virtual PushSolution Simplify() {
-      return new PushSolution(Program, Quality, Random, Config, Evaluator, true);
-    }
-
-    [StorableConstructor]
-    protected PushSolution(bool deserializing) : base(deserializing) { }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new PushSolution(this, cloner);
-    }
-  }
-}
