Index: /branches/2895_PushGP_GenealogyAnalysis/Build.cmd
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/Build.cmd	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/Build.cmd	(revision 15771)
@@ -0,0 +1,104 @@
+@ECHO OFF
+
+SET CLEANBEFOREBUILD=
+
+SET SELECTED=
+SET CONFIGURATION=
+SET PLATFORM=
+
+IF "%~1"=="" GOTO :prompt_solution
+
+SET SELECTED=%1
+IF NOT EXIST %SELECTED% (
+  ECHO Solution file %SELECTED% could not be found.
+  GOTO :end
+)
+ECHO Building solution %SELECTED% ...
+GOTO :config_selection
+
+:prompt_solution
+SET /A COUNT=0
+FOR /F "tokens=*" %%A IN ('dir /B *.sln') DO (
+  CALL :forloopbody "%%A"
+)
+
+IF "%COUNT%"=="1" (
+  SET SELECTED=%SOLUTIONS.1%
+  ECHO Building %SOLUTIONS.1% as it is the only solution that was found ...
+  GOTO :config_selection
+)
+
+ECHO Found the following solutions:
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO ECHO %%A = %%B
+ECHO.
+SET /P SOLUTIONINDEX=Which solution to build? Type the number: 
+
+SET SELECTED=""
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO (
+  IF "%%A"=="%SOLUTIONINDEX%" SET SELECTED=%%B
+)
+
+IF %SELECTED%=="" GOTO :eof
+
+:config_selection
+IF "%~2"==""  GOTO :prompt_config
+
+SET CONFIGURATION=%~2
+ECHO Building configuration %CONFIGURATION% ...
+GOTO :platform_selection
+
+:prompt_config
+SET /P CONFIGURATION=Which configuration to build [Release]: 
+IF "%CONFIGURATION%"=="" SET CONFIGURATION=Release
+
+:platform_selection
+IF "%~3"=="" GOTO :prompt_platform
+  
+SET PLATFORM=%~3
+ECHO Building platform %PLATFORM% ...
+GOTO :clean
+
+:prompt_platform
+SET /P PLATFORM=Which platform to build [Any CPU]: 
+IF "%PLATFORM%"=="" SET PLATFORM=Any CPU
+
+:clean
+IF "%~4"=="" GOTO :prompt_clean
+
+SET CLEANBEFOREBUILD=%~4
+GOTO :main
+
+:prompt_clean
+SET /P CLEANBEFOREBUILD=Would you like to clean before building [n]: 
+IF "%CLEANBEFOREBUILD%"=="" SET CLEANBEFOREBUILD=n
+
+:main
+REM First find the path to the msbuild.exe by performing a registry query
+FOR /F "tokens=1,3 delims=	 " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0"') DO (
+  IF "%%A"=="MSBuildToolsPath" SET MSBUILDPATH=%%B)
+
+REM Then execute msbuild to clean and build the solution
+REM Disable that msbuild creates a cache file of the solution
+SET MSBuildUseNoSolutionCache=1
+REM Run msbuild to clean and then build
+IF "%CLEANBEFOREBUILD%" NEQ "n" (
+  ECHO Cleaning ...
+  %MSBUILDPATH%msbuild.exe %SELECTED% /target:Clean /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+)
+ECHO Building ...
+%MSBUILDPATH%msbuild.exe %SELECTED% /target:Build /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+
+ECHO.
+ECHO DONE.
+
+:end
+
+PAUSE
+
+GOTO :eof
+
+REM This workaround is necessary so that COUNT gets reevaluated
+:forloopbody
+SET /A COUNT+=1
+SET SOLUTIONS.%COUNT%=%1
+GOTO :eof
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/ArtificialDataDescriptor.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/ArtificialDataDescriptor.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/ArtificialDataDescriptor.cs	(revision 15771)
@@ -0,0 +1,15 @@
+﻿namespace HeuristicLab.BenchmarkSuite
+{
+  using System.Collections.Generic;
+
+  using HeuristicLab.Problems.Instances;
+
+  public abstract class ArtificialDataDescriptor : IDataDescriptor
+  {
+    public abstract string Description { get; }
+
+    public abstract string Name { get; }
+
+    protected abstract IEnumerable<Example> GenerateExamples();
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj	(revision 15771)
@@ -0,0 +1,134 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{22B5C087-CFC7-4D40-86C6-32FCF2CA921E}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.BenchmarkSuite</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.ProgramSynthesis.BenchmarkSuite</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
+    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
+    <IsCodedUITest>False</IsCodedUITest>
+    <TestProjectType>UnitTest</TestProjectType>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <LangVersion>5</LangVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Data.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.VisualBasic" />
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.IO.Compression" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <Choose>
+    <When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
+      <ItemGroup>
+        <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
+      </ItemGroup>
+    </When>
+    <Otherwise>
+      <ItemGroup>
+        <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework" />
+      </ItemGroup>
+    </Otherwise>
+  </Choose>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Choose>
+    <When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
+      <ItemGroup>
+        <Reference Include="Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <Private>False</Private>
+        </Reference>
+        <Reference Include="Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <Private>False</Private>
+        </Reference>
+        <Reference Include="Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <Private>False</Private>
+        </Reference>
+        <Reference Include="Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <Private>False</Private>
+        </Reference>
+      </ItemGroup>
+    </When>
+  </Choose>
+  <Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- 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/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj.user
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj.user	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj.user	(revision 15771)
@@ -0,0 +1,6 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectView>ProjectFiles</ProjectView>
+  </PropertyGroup>
+</Project>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/IBenchmarkSuiteDataDescritpor.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/IBenchmarkSuiteDataDescritpor.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/IBenchmarkSuiteDataDescritpor.cs	(revision 15771)
@@ -0,0 +1,8 @@
+﻿namespace HeuristicLab.BenchmarkSuite {
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+  using HeuristicLab.Problems.Instances;
+
+  public interface IBenchmarkSuiteDataDescritpor : IDataDescriptor {
+    IPushData CreateData();
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Properties/AssemblyInfo.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Properties/AssemblyInfo.cs	(revision 15771)
@@ -0,0 +1,39 @@
+﻿using System.Reflection;
+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.BenchmarkSuite")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.BenchmarkSuite")]
+[assembly: AssemblyCopyright("Copyright ©  2016")]
+[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("22b5c087-cfc7-4d40-86c6-32fcf2ca921e")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/HeuristicLab.Problems.ProgramSynthesis.Base.csproj
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/HeuristicLab.Problems.ProgramSynthesis.Base.csproj	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/HeuristicLab.Problems.ProgramSynthesis.Base.csproj	(revision 15771)
@@ -0,0 +1,97 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.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>{0A60B6BA-8ACE-478E-98F3-57441B53B5F9}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.ProgramSynthesis.Base</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.ProgramSynthesis.Base</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <LangVersion>5</LangVersion>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data.Views-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Data.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
+    <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="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- 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/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/HeuristicLab.Problems.ProgramSynthesis.Base.csproj.DotSettings
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/HeuristicLab.Problems.ProgramSynthesis.Base.csproj.DotSettings	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/HeuristicLab.Problems.ProgramSynthesis.Base.csproj.DotSettings	(revision 15771)
@@ -0,0 +1,2 @@
+﻿<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=erc_005Cstring/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/HeuristicLab.Problems.ProgramSynthesis.Base.csproj.user
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/HeuristicLab.Problems.ProgramSynthesis.Base.csproj.user	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/HeuristicLab.Problems.ProgramSynthesis.Base.csproj.user	(revision 15771)
@@ -0,0 +1,6 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectView>ProjectFiles</ProjectView>
+  </PropertyGroup>
+</Project>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/Plugin.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/Plugin.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/Plugin.cs	(revision 15771)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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/>.
+ *
+ * Author: Patrik Kimmeswegner
+ */
+
+#endregion
+
+namespace HeuristicLab.Problems.ProgramSynthesis.Base {
+  using HeuristicLab.PluginInfrastructure;
+
+  [Plugin("HeuristicLab.Problems.ProgramSynthesis.Base", "1.0")]
+  [PluginFile("HeuristicLab.Problems.ProgramSynthesis.Base.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  public class Plugin : PluginBase {
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/Properties/AssemblyInfo.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/Properties/AssemblyInfo.cs	(revision 15771)
@@ -0,0 +1,36 @@
+﻿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.Problems.ProgramSynthesis.Base")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.Problems.ProgramSynthesis.Base")]
+[assembly: AssemblyCopyright("Copyright ©  2017")]
+[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("0a60b6ba-8ace-478e-98f3-57441b53b5f9")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/Settings.StyleCop
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/Settings.StyleCop	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Base/Settings.StyleCop	(revision 15771)
@@ -0,0 +1,1 @@
+<StyleCopSettings Version="105" />
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Analyzers/EvolutionTrackingAnalyzer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Analyzers/EvolutionTrackingAnalyzer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Analyzers/EvolutionTrackingAnalyzer.cs	(revision 15771)
@@ -0,0 +1,119 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [Item("EvolutionTrackingAnalyzer", "Base class for analyzers that use the genealogy graph")]
+  [StorableClass]
+  public abstract class EvolutionTrackingAnalyzer : SingleSuccessorOperator, IAnalyzer {
+    #region parameter names
+    private const string GenerationsParameterName = "Generations";
+    private const string ResultsParameterName = "Results";
+    private const string PopulationSizeParameterName = "PopulationSize";
+    protected const string PopulationGraphResultName = "PopulationGraph";
+    #endregion
+
+    #region parameters
+    public ILookupParameter<IntValue> GenerationsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[GenerationsParameterName]; }
+    }
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
+    }
+    public IValueParameter<IntValue> UpdateIntervalParameter {
+      get { return (IValueParameter<IntValue>)Parameters["UpdateInterval"]; }
+    }
+    public ILookupParameter<IntValue> UpdateCounterParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["UpdateCounter"]; }
+    }
+    public ILookupParameter<IntValue> PopulationSizeParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[PopulationSizeParameterName]; }
+    }
+    #endregion
+
+    #region properties
+    public IntValue Generations { get { return GenerationsParameter.ActualValue; } }
+    public ResultCollection Results { get { return ResultsParameter.ActualValue; } }
+    public IntValue UpdateCounter { get { return UpdateCounterParameter.ActualValue; } }
+    public IntValue UpdateInterval { get { return UpdateIntervalParameter.Value; } }
+    public IntValue Generation { get { return GenerationsParameter.ActualValue; } }
+    public IntValue PopulationSize { get { return PopulationSizeParameter.ActualValue; } }
+    public IGenealogyGraph PopulationGraph {
+      get {
+        if (Results.ContainsKey(PopulationGraphResultName))
+          return (IGenealogyGraph)Results[PopulationGraphResultName].Value;
+        return null;
+      }
+    }
+
+    #endregion
+
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    protected EvolutionTrackingAnalyzer() {
+      Parameters.Add(new LookupParameter<IGenealogyGraph>(PopulationGraphResultName, "The genealogy graph."));
+      Parameters.Add(new LookupParameter<IntValue>(GenerationsParameterName, "The number of generations."));
+      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The results collection."));
+      Parameters.Add(new ValueParameter<IntValue>("UpdateInterval", new IntValue(1)));
+      Parameters.Add(new LookupParameter<IntValue>("UpdateCounter"));
+      Parameters.Add(new LookupParameter<IntValue>(PopulationSizeParameterName, "The population size"));
+    }
+
+    protected EvolutionTrackingAnalyzer(EvolutionTrackingAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableConstructor]
+    protected EvolutionTrackingAnalyzer(bool deserializing) : base(deserializing) { }
+  }
+
+  [Item("EvolutionTrackingAnalyzer", "Base class for analyzers that use the genealogy graph")]
+  [StorableClass]
+  public class EvolutionTrackingAnalyzer<T> : EvolutionTrackingAnalyzer where T : class, IItem {
+    public EvolutionTrackingAnalyzer() { }
+
+    protected EvolutionTrackingAnalyzer(EvolutionTrackingAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvolutionTrackingAnalyzer<T>(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected EvolutionTrackingAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public new IGenealogyGraph<T> PopulationGraph {
+      get {
+        if (Results.ContainsKey(PopulationGraphResultName))
+          return (IGenealogyGraph<T>)Results[PopulationGraphResultName].Value;
+        return null;
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Analyzers/GenealogyAnalyzer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Analyzers/GenealogyAnalyzer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Analyzers/GenealogyAnalyzer.cs	(revision 15771)
@@ -0,0 +1,342 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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 License Information
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  [Item("GenealogyAnalyzer", "An analyzer which performs the necessary instrumentation to record the evolution of a genetic algorithm.")]
+  public abstract class GenealogyAnalyzer<T> : SingleSuccessorOperator, IAnalyzer
+  where T : class, IItem {
+    #region parameter names
+    private const string GenerationsParameterName = "Generations";
+    private const string ResultsParameterName = "Results";
+    private const string PopulationGraphParameterName = "PopulationGraph";
+    public const string QualityParameterName = "Quality";
+    public const string PopulationParameterName = "SymbolicExpressionTree";
+
+    private const string CrossoverParameterName = "Crossover";
+    private const string ManipulatorParameterName = "Mutator";
+    private const string SolutionCreatorParameterName = "SolutionCreator";
+
+    private const string BeforeCrossoverOperatorParameterName = "BeforeCrossoverOperator";
+    private const string AfterCrossoverOperatorParameterName = "AfterCrossoverOperator";
+
+    private const string BeforeManipulatorOperatorParameterName = "BeforeManipulatorOperator";
+    private const string AfterManipulatorOperatorParameterName = "AfterManipulatorOperator";
+
+    private const string EnableCrossoverTrackingParameterName = "EnableCrossoverTracking";
+    private const string EnableManipulatorTrackingParameterName = "EnableManipulatorTracking";
+    private const string EnableSolutionCreatorTrackingParameterName = "EnableSolutionCreatorTracking"; // should always be enabled. maybe superfluous
+    private const string TrimOlderGenerationsParameterName = "TrimOlderGenerations";
+    #endregion parameter names
+
+    #region parameter properties
+
+    public IFixedValueParameter<BoolValue> TrimOlderGenerationsParameter {
+      get { return (IFixedValueParameter<BoolValue>)Parameters[TrimOlderGenerationsParameterName]; }
+    }
+
+    public IScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
+    }
+
+    public IScopeTreeLookupParameter<T> PopulationParameter {
+      get { return (IScopeTreeLookupParameter<T>)Parameters[PopulationParameterName]; }
+    }
+
+    public IValueParameter<ICrossoverOperator<T>> BeforeCrossoverOperatorParameter {
+      get { return (IValueParameter<ICrossoverOperator<T>>)Parameters[BeforeCrossoverOperatorParameterName]; }
+    }
+
+    public IValueParameter<ICrossoverOperator<T>> AfterCrossoverOperatorParameter {
+      get { return (IValueParameter<ICrossoverOperator<T>>)Parameters[AfterCrossoverOperatorParameterName]; }
+    }
+
+    public IValueParameter<IManipulatorOperator<T>> BeforeManipulatorOperatorParameter {
+      get { return (IValueParameter<IManipulatorOperator<T>>)Parameters[BeforeManipulatorOperatorParameterName]; }
+    }
+
+    public IValueParameter<IManipulatorOperator<T>> AfterManipulatorOperatorParameter {
+      get { return (IValueParameter<IManipulatorOperator<T>>)Parameters[AfterManipulatorOperatorParameterName]; }
+    }
+
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
+    }
+
+    public ILookupParameter<IntValue> GenerationsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[GenerationsParameterName]; }
+    }
+
+    public IValueParameter<BoolValue> EnableCrossoverTrackingParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[EnableCrossoverTrackingParameterName]; }
+    }
+
+    public IValueParameter<BoolValue> EnableManipulatorTrackingParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[EnableManipulatorTrackingParameterName]; }
+    }
+
+    public IValueParameter<BoolValue> EnableSolutionCreatorTrackingParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[EnableSolutionCreatorTrackingParameterName]; }
+    }
+
+    public ILookupParameter<ICrossover> CrossoverParameter {
+      get { return (ILookupParameter<ICrossover>)Parameters[CrossoverParameterName]; }
+    }
+
+    public ILookupParameter<IManipulator> ManipulatorParameter {
+      get { return (ILookupParameter<IManipulator>)Parameters[ManipulatorParameterName]; }
+    }
+
+    public ILookupParameter<ISolutionCreator> SolutionCreatorParameter {
+      get { return (ILookupParameter<ISolutionCreator>)Parameters[SolutionCreatorParameterName]; }
+    }
+    #endregion parameter properties
+
+    #region properties
+    public ICrossoverOperator<T> BeforeCrossoverOperator {
+      get { return BeforeCrossoverOperatorParameter.Value; }
+    }
+
+    public ICrossoverOperator<T> AfterCrossoverOperator {
+      get { return AfterCrossoverOperatorParameter.Value; }
+    }
+
+    public IManipulatorOperator<T> BeforeManipulatorOperator {
+      get { return BeforeManipulatorOperatorParameter.Value; }
+    }
+
+    public IManipulatorOperator<T> AfterManipulatorOperator {
+      get { return AfterManipulatorOperatorParameter.Value; }
+    }
+
+    public BoolValue EnableCrossoverTracking {
+      get { return EnableCrossoverTrackingParameter.Value; }
+    }
+
+    public BoolValue EnableManipulatorTracking {
+      get { return EnableManipulatorTrackingParameter.Value; }
+    }
+
+    public BoolValue EnableSolutionCreatorTracking {
+      get { return EnableSolutionCreatorTrackingParameter.Value; }
+    }
+
+    public bool TrimOlderGenerations {
+      get { return TrimOlderGenerationsParameter.Value.Value; }
+    }
+    #endregion properties
+
+    protected GenealogyAnalyzer() {
+      #region add parameters
+      // the instrumented operators
+      Parameters.Add(new LookupParameter<ICrossover>(CrossoverParameterName, "The crossover operator."));
+      Parameters.Add(new LookupParameter<IManipulator>(ManipulatorParameterName, "The manipulator operator."));
+      Parameters.Add(new LookupParameter<ISolutionCreator>(SolutionCreatorParameterName, "The solution creator operator."));
+      // the analyzer parameters
+      Parameters.Add(new ValueParameter<BoolValue>(EnableCrossoverTrackingParameterName, new BoolValue(true)));
+      Parameters.Add(new ValueParameter<BoolValue>(EnableManipulatorTrackingParameterName, new BoolValue(true)));
+      Parameters.Add(new ValueParameter<BoolValue>(EnableSolutionCreatorTrackingParameterName, new BoolValue(true)));
+      // parameters required by the analyzer to do its work
+      Parameters.Add(new LookupParameter<IntValue>(GenerationsParameterName, "The number of generations so far."));
+      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName));
+      Parameters.Add(new ScopeTreeLookupParameter<T>(PopulationParameterName, "The population of individuals."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>(QualityParameterName, "The individual qualities."));
+      Parameters.Add(new ValueParameter<ICrossoverOperator<T>>(BeforeCrossoverOperatorParameterName));
+      Parameters.Add(new ValueParameter<ICrossoverOperator<T>>(AfterCrossoverOperatorParameterName));
+      Parameters.Add(new ValueParameter<IManipulatorOperator<T>>(BeforeManipulatorOperatorParameterName));
+      Parameters.Add(new ValueParameter<IManipulatorOperator<T>>(AfterManipulatorOperatorParameterName));
+      Parameters.Add(new FixedValueParameter<BoolValue>(TrimOlderGenerationsParameterName, "Remove all the generations older than the last generation from the genealoy graph to save memory."));
+      #endregion add parameters
+    }
+
+    protected GenealogyAnalyzer(GenealogyAnalyzer<T> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableConstructor]
+    protected GenealogyAnalyzer(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // the instrumented operators
+      if (!Parameters.ContainsKey(CrossoverParameterName))
+        Parameters.Add(new LookupParameter<ICrossover>(CrossoverParameterName, "The crossover operator."));
+      if (!Parameters.ContainsKey(ManipulatorParameterName))
+        Parameters.Add(new LookupParameter<IManipulator>(ManipulatorParameterName, "The manipulator operator."));
+      if (!Parameters.ContainsKey(SolutionCreatorParameterName))
+        Parameters.Add(new LookupParameter<ISolutionCreator>(SolutionCreatorParameterName, "The solution creator operator."));
+      // the analyzer parameters
+      if (!Parameters.ContainsKey(EnableCrossoverTrackingParameterName))
+        Parameters.Add(new ValueParameter<BoolValue>(EnableCrossoverTrackingParameterName, new BoolValue(true)));
+      if (!Parameters.ContainsKey(EnableManipulatorTrackingParameterName))
+        Parameters.Add(new ValueParameter<BoolValue>(EnableManipulatorTrackingParameterName, new BoolValue(true)));
+      if (!Parameters.ContainsKey(EnableSolutionCreatorTrackingParameterName))
+        Parameters.Add(new ValueParameter<BoolValue>(EnableSolutionCreatorTrackingParameterName, new BoolValue(true)));
+      // parameters required by the analyzer to do its work
+      if (!Parameters.ContainsKey(GenerationsParameterName))
+        Parameters.Add(new LookupParameter<IntValue>(GenerationsParameterName, "The number of generations so far."));
+      if (!Parameters.ContainsKey(ResultsParameterName))
+        Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName));
+      if (!Parameters.ContainsKey(PopulationParameterName)) {
+        Parameters.Add(new ScopeTreeLookupParameter<T>(PopulationParameterName, "The population of individuals."));
+      }
+      if (!Parameters.ContainsKey(QualityParameterName)) {
+        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>(QualityParameterName, "The individual qualities."));
+      }
+      if (!Parameters.ContainsKey(TrimOlderGenerationsParameterName))
+        Parameters.Add(new FixedValueParameter<BoolValue>(TrimOlderGenerationsParameterName, "Remove all the generations older than the last generation from the genealoy graph to save memory."));
+    }
+
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    private void ConfigureTrackingOperators() {
+      // at the beginning we add the before/after operators to the instrumented operators
+      var crossover = CrossoverParameter.ActualValue;
+      if (crossover != null) {
+        var instrumentedCrossover = (InstrumentedOperator)crossover;
+        instrumentedCrossover.AfterExecutionOperators.Clear();
+        instrumentedCrossover.BeforeExecutionOperators.Clear();
+
+        if (EnableCrossoverTracking.Value) {
+          if (BeforeCrossoverOperator != null) {
+            instrumentedCrossover.BeforeExecutionOperators.Add(BeforeCrossoverOperator);
+          }
+          if (AfterCrossoverOperator != null) {
+            instrumentedCrossover.AfterExecutionOperators.Add(AfterCrossoverOperator);
+          }
+        }
+      }
+      var manipulator = ManipulatorParameter.ActualValue;
+      if (manipulator != null) {
+        var instrumentedManipulator = (InstrumentedOperator)manipulator;
+        instrumentedManipulator.AfterExecutionOperators.Clear();
+        instrumentedManipulator.BeforeExecutionOperators.Clear();
+
+        if (EnableManipulatorTracking.Value) {
+          if (BeforeManipulatorOperator != null) {
+            instrumentedManipulator.BeforeExecutionOperators.Add(BeforeManipulatorOperator);
+          }
+          if (AfterManipulatorOperator != null) {
+            instrumentedManipulator.AfterExecutionOperators.Add(AfterManipulatorOperator);
+          }
+        }
+      }
+    }
+
+    protected abstract void EvaluateIntermediateChildren();
+
+    public override IOperation Apply() {
+      IGenealogyGraph<T> genealogyGraph;
+      var results = ResultsParameter.ActualValue;
+      if (!results.ContainsKey(PopulationGraphParameterName)) {
+        genealogyGraph = new GenealogyGraph<T>();
+        results.Add(new Result(PopulationGraphParameterName, genealogyGraph));
+      } else {
+        genealogyGraph = (IGenealogyGraph<T>)results[PopulationGraphParameterName].Value;
+      }
+
+      var population = PopulationParameter.ActualValue;
+      var qualities = QualityParameter.ActualValue;
+
+      int generation = GenerationsParameter.ActualValue.Value;
+      if (generation == 0) {
+        ConfigureTrackingOperators();
+
+        for (int i = 0; i < population.Length; ++i) {
+          var individual = population[i];
+          var vertex = new GenealogyGraphNode<T>(individual) { Rank = generation };
+          genealogyGraph.AddVertex(vertex);
+          // save the vertex id in the individual scope (so that we can identify graph indices)
+          ExecutionContext.Scope.SubScopes[i].Variables.Add(new Variable("Id", new StringValue(vertex.Id)));
+        }
+      } else {
+        int index = 0;
+        T elite = null;
+        // identify previous elite individual
+        for (int i = 0; i < population.Length; ++i) {
+          if (genealogyGraph.GetByContent(population[i]).Rank.Equals(generation - 1)) {
+            elite = population[i];
+            index = i;
+            break;
+          }
+        }
+        // add current elite and connect with previous
+        #region add elite in the graph and connect it with the previous elite
+        if (elite != null) {
+          var prevVertex = genealogyGraph.GetByContent(elite);
+          prevVertex.IsElite = true; // mark elites in the graph retroactively
+          var v = (IGenealogyGraphNode<T>)prevVertex.Clone();
+          v.Rank = generation;
+          v.IsElite = false;
+          population[index] = v.Data;
+          genealogyGraph.AddVertex(v);
+          genealogyGraph.AddArc(prevVertex, v);
+          // inject the graph node unique id to the scope
+          ExecutionContext.Scope.SubScopes[index].Variables[BeforeManipulatorOperator.ChildParameter.ActualName].Value = v.Data;
+          ExecutionContext.Scope.SubScopes[index].Variables["Id"].Value = new StringValue(v.Id);
+        }
+        #endregion add elite in the graph and connect it with the previous elite
+      }
+      // update qualities
+      for (int i = 0; i < population.Length; ++i) {
+        var vertex = genealogyGraph.GetByContent(population[i]);
+        vertex.Quality = qualities[i].Value;
+      }
+      // update qualities for intermediate vertices
+      EvaluateIntermediateChildren();
+
+      // remove extra graph nodes (added by the instrumented operators in the case of offspring selection)
+      var pop = new HashSet<T>(population);
+      var discarded = genealogyGraph.GetByRank(generation).Where(x => !pop.Contains(x.Data)).ToList();
+      for (int i = 0; i < discarded.Count; ++i) {
+        var v = discarded[i];
+        if (v.InDegree == 1) {
+          var p = v.Parents.First();
+          if (p.Rank.Equals(generation - 0.5))
+            // the individual was a product of mutation. since it wasn't selected, we must remove both it and its parent
+            // ("intermediate" vertex result of crossover)
+            discarded.Add(v.Parents.First());
+        }
+      }
+      genealogyGraph.RemoveVertices(discarded);
+
+      //trim
+      if (TrimOlderGenerations) {
+        var vertices = genealogyGraph.Vertices.Where(x => x.Rank < generation - 1).ToList(); // select all ranks older than the previous generation
+        genealogyGraph.RemoveVertices(vertices);
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Analyzers/SelectionSchemeAnalyzer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Analyzers/SelectionSchemeAnalyzer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Analyzers/SelectionSchemeAnalyzer.cs	(revision 15771)
@@ -0,0 +1,122 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [Item("SelectionSchemeAnalyzer", "An analyzer which gives information about the relative amount of individuals that get selected each generation")]
+  [StorableClass]
+  public class SelectionSchemeAnalyzer : EvolutionTrackingAnalyzer {
+    private const string StoreHistoryParameterName = "StoreHistory";
+
+    public IFixedValueParameter<BoolValue> StoreHistoryParameter {
+      get { return (IFixedValueParameter<BoolValue>)Parameters[StoreHistoryParameterName]; }
+    }
+
+    public SelectionSchemeAnalyzer() {
+      UpdateCounterParameter.ActualName = "SelectionSchemeAnalyzerUpdateCounter";
+      Parameters.Add(new FixedValueParameter<BoolValue>(StoreHistoryParameterName, new BoolValue(false)));
+    }
+
+    public bool StoreHistory { get { return StoreHistoryParameter.Value.Value; } }
+
+    [StorableConstructor]
+    protected SelectionSchemeAnalyzer(bool deserializing) : base(deserializing) { }
+
+    protected SelectionSchemeAnalyzer(SelectionSchemeAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SelectionSchemeAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      int updateInterval = UpdateIntervalParameter.Value.Value;
+      IntValue updateCounter = UpdateCounterParameter.ActualValue;
+      // if counter does not yet exist then initialize it with update interval
+      // to make sure the solutions are analyzed on the first application of this operator
+      if (updateCounter == null) {
+        updateCounter = new IntValue(0);
+        UpdateCounterParameter.ActualValue = updateCounter;
+      }
+      updateCounter.Value++;
+      //analyze solutions only every 'updateInterval' times
+      if (updateCounter.Value != updateInterval) return base.Apply();
+      updateCounter.Value = 0;
+
+      if (PopulationGraph == null)
+        return base.Apply();
+      double selectionRatio = 1;
+
+      if (Generations.Value > 0) {
+        var previousRank = PopulationGraph.GetByRank(Generation.Value - 1);
+        selectionRatio = (double)previousRank.Count(x => x.OutDegree > 0) / PopulationSize.Value;
+      }
+
+      // the selection ratio represents the percentage of the old population that survived to reproduce
+      DataTable table;
+      if (!Results.ContainsKey("SelectionRatio")) {
+        table = new DataTable("Selection ratio");
+        Results.Add(new Result("SelectionRatio", table));
+        var row = new DataRow("Selection ratio") { VisualProperties = { StartIndexZero = true } };
+        row.Values.Add(selectionRatio);
+        table.Rows.Add(row);
+      } else {
+        table = (DataTable)Results["SelectionRatio"].Value;
+        table.Rows["Selection ratio"].Values.Add(selectionRatio);
+      }
+      DataTable contributionCountTable;
+      var contributions = PopulationGraph.GetByRank(Generation.Value - 1).OrderByDescending(x => x.Quality).Select(x => (double)x.OutDegree);
+      if (Results.ContainsKey("ContributionCount")) {
+        contributionCountTable = (DataTable)Results["ContributionCount"].Value;
+
+        var row = contributionCountTable.Rows["Contribution count"];
+        row.Values.Replace(contributions);
+      } else {
+        contributionCountTable = new DataTable("Contribution count");
+        Results.Add(new Result("ContributionCount", contributionCountTable));
+        var row = new DataRow("Contribution count") {
+          VisualProperties = { StartIndexZero = true, ChartType = DataRowVisualProperties.DataRowChartType.Columns }
+        };
+        row.Values.AddRange(contributions);
+        contributionCountTable.Rows.Add(row);
+      }
+
+      if (StoreHistory) {
+        DataTableHistory history;
+        if (Results.ContainsKey("ContributionCountHistory")) {
+          history = (DataTableHistory)Results["ContributionCountHistory"].Value;
+        } else {
+          history = new DataTableHistory();
+          Results.Add(new Result("ContributionCountHistory", history));
+        }
+        history.Add((DataTable)contributionCountTable.Clone());
+      }
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Collections/CloneableCollection.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Collections/CloneableCollection.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Collections/CloneableCollection.cs	(revision 15771)
@@ -0,0 +1,45 @@
+﻿#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.Collections.Generic;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public class CloneableCollection<T> : List<T>, IDeepCloneable {
+    public CloneableCollection() { }
+
+    public CloneableCollection(IEnumerable<T> elements) : base(elements) { }
+
+    public CloneableCollection(CloneableCollection<T> original, Cloner cloner) : base(original) {
+      cloner.RegisterClonedObject(original, this);
+    }
+
+    public object Clone() { return Clone(new Cloner()); }
+
+    public IDeepCloneable Clone(Cloner cloner) { return new CloneableCollection<T>(this, cloner); }
+  }
+
+  public static class CloneableCollectionExtensions {
+    public static CloneableCollection<T> ToCloneableCollection<T>(this IEnumerable<T> elements) {
+      return new CloneableCollection<T>(elements);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Fragment.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Fragment.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Fragment.cs	(revision 15771)
@@ -0,0 +1,59 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  [Item("Fragment", "A fragment is an object that represents a piece of inherited genetic information.")]
+  public class Fragment : Item, IFragment {
+    [Storable]
+    public int Index1 { get; set; }
+
+    [Storable]
+    public int Index2 { get; set; }
+
+    [Storable]
+    private object root;
+    public object Root {
+      get { return root; }
+      set { root = value; }
+    }
+    [StorableConstructor]
+    protected Fragment(bool deserializable) : base(deserializable) { }
+
+    protected Fragment(Fragment original, Cloner cloner)
+      : base(original, cloner) {
+      Root = original.Root;
+      Index1 = original.Index1;
+      Index2 = original.Index2;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Fragment(this, cloner);
+    }
+
+    public Fragment() { }
+  }
+
+  [StorableClass]
+  [Item("Fragment", "A fragment is an object that represents a piece of inherited genetic information.")]
+  public class Fragment<T> : Fragment, IFragment<T> where T : class {
+    public new T Root {
+      get { return (T)base.Root; }
+      set { base.Root = value; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Fragment<T>(this, cloner);
+    }
+
+    protected Fragment(Fragment<T> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableConstructor]
+    protected Fragment(bool deserializable) : base(deserializable) { }
+
+    public Fragment() { }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/GenealogyGraph.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/GenealogyGraph.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/GenealogyGraph.cs	(revision 15771)
@@ -0,0 +1,218 @@
+﻿#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;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  [Item("GenealogyGraph", "A class representing a genealogy graph")]
+  public class GenealogyGraph : DirectedGraph, IGenealogyGraph {
+    private Dictionary<object, IGenealogyGraphNode> contentMap;
+    private Dictionary<string, IGenealogyGraphNode> idMap;
+
+    private readonly Comparison<IArc<IDeepCloneable>> compareArcs = (a, b) => {
+      var da = a.Data;
+      var db = b.Data;
+
+      if ((da == null && db == null) || (da != null && db != null))
+        return 0;
+
+      if (da == null)
+        return -1;
+
+      return 1;
+    };
+
+    protected Dictionary<double, List<IGenealogyGraphNode>> ranks;
+    public IEnumerable<KeyValuePair<double, IEnumerable<IGenealogyGraphNode>>> Ranks {
+      get { return ranks.Select(x => new KeyValuePair<double, IEnumerable<IGenealogyGraphNode>>(x.Key, x.Value)); }
+    }
+    public IEnumerable<IGenealogyGraphNode> GetByRank(double rank) {
+      return ranks.ContainsKey(rank) ? ranks[rank] : Enumerable.Empty<IGenealogyGraphNode>();
+    }
+    protected GenealogyGraph(GenealogyGraph original, Cloner cloner)
+      : base(original, cloner) {
+      RebuildDictionaries();
+      // sort arcs so that in the case of crossover (child vertex with two parents)
+      // the arc which holds the fragment information is always last
+      foreach (var arcList in base.Vertices.Select(v => (List<IArc>)v.InArcs)) {
+        arcList.Sort((a, b) => compareArcs((IGenealogyGraphArc)a, (IGenealogyGraphArc)b));
+      }
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GenealogyGraph(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected GenealogyGraph(bool deserializing)
+      : base(deserializing) {
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RebuildDictionaries();
+      foreach (var arcList in base.Vertices.Select(v => (List<IArc>)v.InArcs)) {
+        arcList.Sort((a, b) => compareArcs((IGenealogyGraphArc)a, (IGenealogyGraphArc)b));
+      }
+    }
+    public GenealogyGraph() {
+      ranks = new Dictionary<double, List<IGenealogyGraphNode>>();
+      contentMap = new Dictionary<object, IGenealogyGraphNode>();
+      idMap = new Dictionary<string, IGenealogyGraphNode>();
+    }
+    new public IEnumerable<IGenealogyGraphNode> Vertices {
+      get { return base.Vertices.Select(x => (IGenealogyGraphNode)x); }
+    }
+    new public IEnumerable<IGenealogyGraphArc> Arcs {
+      get { return base.Arcs.Select(x => (IGenealogyGraphArc)x); }
+    }
+    public override IArc AddArc(IVertex source, IVertex target) {
+      var arc = new GenealogyGraphArc((IGenealogyGraphNode)source, (IGenealogyGraphNode)target);
+      base.AddArc(arc);
+      return arc;
+    }
+    public override void AddVertex(IVertex vertex) {
+      base.AddVertex(vertex);
+      var genealogyGraphNode = (IGenealogyGraphNode)vertex;
+
+      if (contentMap.ContainsKey(genealogyGraphNode.Data))
+        throw new InvalidOperationException("Duplicate content is not allowed in the genealogy graph.");
+      contentMap[genealogyGraphNode.Data] = genealogyGraphNode;
+
+      if (idMap.ContainsKey(genealogyGraphNode.Id))
+        throw new InvalidOperationException("Duplicate ids are not allowed in the genealogy graph.");
+      idMap[genealogyGraphNode.Id] = genealogyGraphNode;
+
+      if (!ranks.ContainsKey(genealogyGraphNode.Rank))
+        ranks[genealogyGraphNode.Rank] = new List<IGenealogyGraphNode>();
+      ranks[genealogyGraphNode.Rank].Add(genealogyGraphNode);
+    }
+    public override void RemoveVertex(IVertex vertex) {
+      var node = (IGenealogyGraphNode)vertex;
+      contentMap.Remove(node.Data);
+      idMap.Remove(node.Id);
+      if (ranks.ContainsKey(node.Rank)) {
+        ranks[node.Rank].Remove(node); // this call will be slow, use with caution
+        if (!ranks[node.Rank].Any())
+          ranks.Remove(node.Rank);
+      }
+      base.RemoveVertex(vertex);
+    }
+
+    public override void RemoveVertices(IEnumerable<IVertex> vertices) {
+      foreach (var v in vertices)
+        this.RemoveVertex(v);
+    }
+
+    public IGenealogyGraphNode GetByContent(object content) {
+      IGenealogyGraphNode result;
+      contentMap.TryGetValue(content, out result);
+      return result;
+    }
+    public IGenealogyGraphNode GetById(string id) {
+      IGenealogyGraphNode result;
+      idMap.TryGetValue(id, out result);
+      return result;
+    }
+    public bool Contains(object content) {
+      return contentMap.ContainsKey(content);
+    }
+    public event EventHandler GraphUpdated;
+    private void OnGraphUpdated(object sender, EventArgs args) {
+      var updated = GraphUpdated;
+      if (updated != null) updated(sender, args);
+    }
+    public override void Clear() {
+      base.Clear();
+      ranks.Clear();
+      contentMap.Clear();
+      idMap.Clear();
+    }
+    private void RebuildDictionaries() {
+      contentMap = new Dictionary<object, IGenealogyGraphNode>();
+      idMap = new Dictionary<string, IGenealogyGraphNode>();
+      ranks = new Dictionary<double, List<IGenealogyGraphNode>>();
+
+      foreach (var v in Vertices) {
+        contentMap[v.Data] = v;
+        idMap[v.Id] = v;
+        if (ranks.ContainsKey(v.Rank)) {
+          ranks[v.Rank].Add(v);
+        } else {
+          ranks[v.Rank] = new List<IGenealogyGraphNode> { v };
+        }
+      }
+    }
+    public void ExportDot(string path) {
+      var sb = new StringBuilder();
+      sb.AppendLine("graph fragmentgraph {");
+      foreach (var v in Vertices) {
+        double width = Math.Max(0.5, v.Degree);
+        sb.AppendLine("\"" + v.Id + "\"[shape=circle, style = filled, width = " + width + ", label = " + v.Rank + "\n" + String.Format("{0:00}", v.Quality) + ", fillcolor = \"" + ColorTranslator.ToHtml(GetColor(v)) + "\"]");
+      }
+      foreach (var a in Arcs) {
+        sb.AppendLine("\"" + a.Source.Id + "\" -- \"" + a.Target.Id + "\"");
+      }
+
+      sb.AppendLine("}");
+      File.WriteAllText(path, sb.ToString());
+    }
+    private Color GetColor(IGenealogyGraphNode node) {
+      var colorIndex = (int)Math.Round(node.Quality * ColorGradient.Colors.Count);
+      if (colorIndex >= ColorGradient.Colors.Count) return ColorGradient.Colors.Last();
+      return ColorGradient.Colors[colorIndex];
+    }
+  }
+
+  [Item("GenealogyGraph", "A genealogy graph in which the vertex data is of type T")]
+  [StorableClass]
+  public class GenealogyGraph<T> : GenealogyGraph, IGenealogyGraph<T> where T : class, IItem {
+    public GenealogyGraph() { }
+    private GenealogyGraph(GenealogyGraph original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GenealogyGraph<T>(this, cloner);
+    }
+    new public IEnumerable<IGenealogyGraphNode<T>> Vertices {
+      get { return base.Vertices.Select(x => (IGenealogyGraphNode<T>)x); }
+    }
+    new public IGenealogyGraphNode<T> GetByContent(object content) {
+      return (IGenealogyGraphNode<T>)base.GetByContent(content);
+    }
+    new public IGenealogyGraphNode<T> GetById(string id) {
+      return (IGenealogyGraphNode<T>)base.GetById(id);
+    }
+    new public IEnumerable<IGenealogyGraphNode<T>> GetByRank(double rank) {
+      return base.GetByRank(rank).Select(x => (IGenealogyGraphNode<T>)x);
+    }
+    public new IEnumerable<KeyValuePair<double, IEnumerable<IGenealogyGraphNode<T>>>> Ranks {
+      get { return base.Ranks.Select(x => new KeyValuePair<double, IEnumerable<IGenealogyGraphNode<T>>>(x.Key, x.Value.Select(n => (IGenealogyGraphNode<T>)n))); }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/GenealogyGraphArc.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/GenealogyGraphArc.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/GenealogyGraphArc.cs	(revision 15771)
@@ -0,0 +1,71 @@
+﻿#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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  [Item("GenealogyGraphArc", "A graph arc connecting two GenealogyGraphNodes and holding some data.")]
+  public class GenealogyGraphArc : Arc<IDeepCloneable>, IGenealogyGraphArc {
+    [StorableConstructor]
+    protected GenealogyGraphArc(bool deserializing) : base(deserializing) { }
+    protected GenealogyGraphArc(GenealogyGraphArc original, Cloner cloner)
+      : base(original, cloner) { }
+
+    public GenealogyGraphArc(IGenealogyGraphNode source, IGenealogyGraphNode target)
+      : base(source, target) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GenealogyGraphArc(this, cloner);
+    }
+
+    public new IGenealogyGraphNode Source {
+      get { return (IGenealogyGraphNode)base.Source; }
+    }
+
+    public new IGenealogyGraphNode Target {
+      get { return (IGenealogyGraphNode)base.Target; }
+    }
+  }
+
+  [StorableClass]
+  [Item("GenealogyGraphArc", "")]
+  public class GenealogyGraphArc<T> : GenealogyGraphArc where T : class,IItem {
+    [StorableConstructor]
+    protected GenealogyGraphArc(bool deserializing) : base(deserializing) { }
+
+    protected GenealogyGraphArc(GenealogyGraphArc original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GenealogyGraphArc<T>(this, cloner);
+    }
+
+    public new T Data {
+      get { return (T)base.Data; }
+      set { base.Data = value; }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/GenealogyGraphNode.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/GenealogyGraphNode.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/GenealogyGraphNode.cs	(revision 15771)
@@ -0,0 +1,166 @@
+﻿#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;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  [Item("GenealogGraphNode", "A class representing a node in the GenealogyGraph")]
+  public class GenealogyGraphNode : Vertex<IDeepCloneable>, IGenealogyGraphNode {
+    [StorableConstructor]
+    protected GenealogyGraphNode(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GenealogyGraphNode(this, cloner);
+    }
+
+    protected GenealogyGraphNode(GenealogyGraphNode original, Cloner cloner)
+      : base(original, cloner) {
+      Quality = original.Quality;
+      Rank = original.Rank;
+      IsElite = original.IsElite;
+      Id = Guid.NewGuid().ToString();
+    }
+
+    public GenealogyGraphNode() {
+      Id = Guid.NewGuid().ToString();
+    }
+
+    public GenealogyGraphNode(IDeepCloneable data)
+      : this() {
+      Data = data;
+    }
+
+    public new IEnumerable<IGenealogyGraphArc> InArcs {
+      get { return base.InArcs.Select(x => (IGenealogyGraphArc)x); }
+    }
+
+    public new IEnumerable<IGenealogyGraphArc> OutArcs {
+      get { return base.OutArcs.Select(x => (IGenealogyGraphArc)x); }
+    }
+
+    public IEnumerable<IGenealogyGraphNode> Parents {
+      get { return base.InArcs.Select(x => (IGenealogyGraphNode)x.Source); }
+    }
+
+    public IEnumerable<IGenealogyGraphNode> Children {
+      get { return base.OutArcs.Select(x => (IGenealogyGraphNode)x.Target); }
+    }
+
+    public IEnumerable<IGenealogyGraphNode> Ancestors {
+      get {
+        if (!Parents.Any())
+          return Enumerable.Empty<IGenealogyGraphNode>();
+        // for performance, we use a hashset for lookup and a list for iteration
+        var nodes = new HashSet<IGenealogyGraphNode>(Parents);
+        var list = new List<IGenealogyGraphNode>(nodes);
+        int i = 0;
+        while (i != list.Count) {
+          foreach (var arc in list[i].InArcs) {
+            if (nodes.Add(arc.Source))
+              list.Add(arc.Source);
+          }
+          ++i;
+        }
+        return list;
+      }
+    }
+
+    public IEnumerable<IGenealogyGraphNode> Descendants {
+      get {
+        var nodes = new HashSet<IGenealogyGraphNode>(Children);
+        var list = new List<IGenealogyGraphNode>(nodes);
+        int i = 0;
+        while (i != list.Count) {
+          foreach (var e in list[i].OutArcs) {
+            if (nodes.Add(e.Target))
+              list.Add(e.Target);
+          }
+          ++i;
+        }
+        return list;
+      }
+    }
+
+    [Storable]
+    public string Id { get; private set; }
+
+    [Storable]
+    private double rank;
+    public double Rank {
+      get { return rank; }
+      set { rank = value; }
+    }
+    [Storable]
+    private double quality;
+    public double Quality {
+      get { return quality; }
+      set { quality = value; }
+    }
+    [Storable]
+    private bool isElite;
+    public bool IsElite {
+      get { return isElite; }
+      set { isElite = value; }
+    }
+    public int CompareTo(IGenealogyGraphNode other) {
+      return Quality.CompareTo(other.Quality);
+    }
+  }
+
+  [StorableClass]
+  [Item("GenealogyGraphNode", "A genealogy graph node which also has a Content")]
+  public class GenealogyGraphNode<T> : GenealogyGraphNode, IGenealogyGraphNode<T> where T : class, IItem {
+    public new T Data {
+      get { return (T)base.Data; }
+      set { base.Data = value; }
+    }
+
+    [StorableConstructor]
+    protected GenealogyGraphNode(bool deserializing) : base(deserializing) { }
+
+    public GenealogyGraphNode(IDeepCloneable content) : base(content) { }
+
+    protected GenealogyGraphNode(GenealogyGraphNode<T> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GenealogyGraphNode<T>(this, cloner);
+    }
+    public new IEnumerable<IGenealogyGraphNode<T>> Parents {
+      get { return base.Parents.Select(x => (IGenealogyGraphNode<T>)x); }
+    }
+    public new IEnumerable<IGenealogyGraphNode<T>> Children {
+      get { return base.Children.Select(x => (IGenealogyGraphNode<T>)x); }
+    }
+    public new IEnumerable<IGenealogyGraphNode<T>> Ancestors {
+      get { return base.Ancestors.Select(x => (IGenealogyGraphNode<T>)x); }
+    }
+    public new IEnumerable<IGenealogyGraphNode<T>> Descendants {
+      get { return base.Descendants.Select(x => (IGenealogyGraphNode<T>)x); }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/Interfaces/IGenealogyGraph.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/Interfaces/IGenealogyGraph.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/Interfaces/IGenealogyGraph.cs	(revision 15771)
@@ -0,0 +1,40 @@
+﻿#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.Collections.Generic;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public interface IGenealogyGraph : IDirectedGraph {
+    IEnumerable<IGenealogyGraphNode> GetByRank(double rank);
+    IEnumerable<KeyValuePair<double, IEnumerable<IGenealogyGraphNode>>> Ranks { get; }
+    IGenealogyGraphNode GetByContent(object content);
+    IGenealogyGraphNode GetById(string id);
+    bool Contains(object content);
+    new IEnumerable<IGenealogyGraphNode> Vertices { get; }
+  }
+
+  public interface IGenealogyGraph<T> : IGenealogyGraph where T : class, IItem {
+    new IEnumerable<IGenealogyGraphNode<T>> Vertices { get; }
+    new IGenealogyGraphNode<T> GetByContent(object content);
+    new IGenealogyGraphNode<T> GetById(string id);
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/Interfaces/IGenealogyGraphArc.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/Interfaces/IGenealogyGraphArc.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/Interfaces/IGenealogyGraphArc.cs	(revision 15771)
@@ -0,0 +1,30 @@
+﻿#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;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public interface IGenealogyGraphArc : IArc<IDeepCloneable> {
+    new IGenealogyGraphNode Source { get; }
+    new IGenealogyGraphNode Target { get; }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs	(revision 15771)
@@ -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 System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public interface IGenealogyGraphNode : IVertex<IDeepCloneable>, IComparable<IGenealogyGraphNode> {
+    double Rank { get; set; }
+    double Quality { get; set; }
+    bool IsElite { get; set; }
+    string Id { get; }
+
+    IEnumerable<IGenealogyGraphNode> Parents { get; }
+    IEnumerable<IGenealogyGraphNode> Children { get; }
+    IEnumerable<IGenealogyGraphNode> Ancestors { get; }
+    IEnumerable<IGenealogyGraphNode> Descendants { get; }
+    new IEnumerable<IGenealogyGraphArc> InArcs { get; }
+    new IEnumerable<IGenealogyGraphArc> OutArcs { get; }
+  }
+
+  public interface IGenealogyGraphNode<T> : IGenealogyGraphNode where T : class {
+    new IEnumerable<IGenealogyGraphNode<T>> Parents { get; }
+    new IEnumerable<IGenealogyGraphNode<T>> Children { get; }
+    new IEnumerable<IGenealogyGraphNode<T>> Ancestors { get; }
+    new IEnumerable<IGenealogyGraphNode<T>> Descendants { get; }
+
+    new T Data { get; set; }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis.csproj
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis.csproj	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis.csproj	(revision 15771)
@@ -0,0 +1,112 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" 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>{1C1FA0C1-A077-4C26-A5DA-9CB1F8842A8C}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis</AssemblyName>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Analysis-3.3">
+      <HintPath>..\..\..\..\..\Users\Bogdan\Projects\HeuristicLab\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\..\Users\Bogdan\Projects\HeuristicLab\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\..\Users\Bogdan\Projects\HeuristicLab\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\..\Users\Bogdan\Projects\HeuristicLab\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\Users\Bogdan\Projects\HeuristicLab\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\..\Users\Bogdan\Projects\HeuristicLab\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\..\Users\Bogdan\Projects\HeuristicLab\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\..\Users\Bogdan\Projects\HeuristicLab\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\..\..\Users\Bogdan\Projects\HeuristicLab\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\..\Users\Bogdan\Projects\HeuristicLab\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\..\Users\Bogdan\Projects\HeuristicLab\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Analyzers\EvolutionTrackingAnalyzer.cs" />
+    <Compile Include="Analyzers\GenealogyAnalyzer.cs" />
+    <Compile Include="Analyzers\SelectionSchemeAnalyzer.cs" />
+    <Compile Include="Collections\CloneableCollection.cs" />
+    <Compile Include="Fragment.cs" />
+    <Compile Include="GenealogyGraph\GenealogyGraph.cs" />
+    <Compile Include="GenealogyGraph\GenealogyGraphArc.cs" />
+    <Compile Include="GenealogyGraph\GenealogyGraphNode.cs" />
+    <Compile Include="GenealogyGraph\Interfaces\IGenealogyGraph.cs" />
+    <Compile Include="GenealogyGraph\Interfaces\IGenealogyGraphArc.cs" />
+    <Compile Include="GenealogyGraph\Interfaces\IGenealogyGraphNode.cs" />
+    <Compile Include="Interfaces\IFragment.cs" />
+    <Compile Include="Operators\AfterCrossoverOperator.cs" />
+    <Compile Include="Operators\AfterManipulatorOperator.cs" />
+    <Compile Include="Operators\AfterSolutionCreatorOperator.cs" />
+    <Compile Include="Operators\BeforeCrossoverOperator.cs" />
+    <Compile Include="Operators\BeforeManipulatorOperator.cs" />
+    <Compile Include="Operators\EvolutionTrackingOperator.cs" />
+    <Compile Include="Operators\Interfaces\ICrossoverOperator.cs" />
+    <Compile Include="Operators\Interfaces\IManipulatorOperator.cs" />
+    <Compile Include="Operators\RemovePopulationGraphFromResults.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Interfaces/IFragment.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Interfaces/IFragment.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Interfaces/IFragment.cs	(revision 15771)
@@ -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.Core;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  public interface IFragment : IItem {
+    object Root { get; set; }
+    int Index1 { get; set; }
+    int Index2 { get; set; }
+  }
+
+  public interface IFragment<T> : IFragment where T : class {
+    new T Root { get; set; }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/AfterCrossoverOperator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/AfterCrossoverOperator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/AfterCrossoverOperator.cs	(revision 15771)
@@ -0,0 +1,59 @@
+﻿#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.ProgramSynthesis {
+  [StorableClass]
+  [Item("AfterCrossoverOperator", "A generic operator that can record genealogical relationships between crossover parents and children.")]
+  public class AfterCrossoverOperator<T> : EvolutionTrackingOperator<T>, ICrossoverOperator<T> where T : class, IItem {
+    private const string ParentsParameterName = "Parents";
+    private const string ChildParameterName = "Child";
+
+    public IScopeTreeLookupParameter<T> ParentsParameter {
+      get { return (IScopeTreeLookupParameter<T>)Parameters[ParentsParameterName]; }
+    }
+    public ILookupParameter<T> ChildParameter {
+      get { return (ILookupParameter<T>)Parameters[ChildParameterName]; }
+    }
+
+    protected AfterCrossoverOperator(AfterCrossoverOperator<T> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AfterCrossoverOperator<T>(this, cloner);
+    }
+    [StorableConstructor]
+    protected AfterCrossoverOperator(bool deserializing) : base(deserializing) { }
+
+    public AfterCrossoverOperator() {
+      Parameters.Add(new ScopeTreeLookupParameter<T>(ParentsParameterName));
+      Parameters.Add(new LookupParameter<T>(ChildParameterName));
+    }
+
+    public override IOperation Apply() {
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/AfterManipulatorOperator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/AfterManipulatorOperator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/AfterManipulatorOperator.cs	(revision 15771)
@@ -0,0 +1,54 @@
+﻿#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.ProgramSynthesis {
+  [StorableClass]
+  [Item("AfterCrossoverOperator", "Performs an action after the crossover operator is applied.")]
+  public class AfterManipulatorOperator<T> : EvolutionTrackingOperator<T>, IManipulatorOperator<T> where T : class,IItem {
+    private const string ChildParameterName = "Child";
+
+    public ILookupParameter<T> ChildParameter {
+      get { return (ILookupParameter<T>)Parameters[ChildParameterName]; }
+    }
+
+    protected AfterManipulatorOperator(AfterManipulatorOperator<T> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AfterManipulatorOperator<T>(this, cloner);
+    }
+    [StorableConstructor]
+    protected AfterManipulatorOperator(bool deserializing) : base(deserializing) { }
+
+    public AfterManipulatorOperator() {
+      Parameters.Add(new LookupParameter<T>(ChildParameterName));
+    }
+
+    public override IOperation Apply() {
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/AfterSolutionCreatorOperator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/AfterSolutionCreatorOperator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/AfterSolutionCreatorOperator.cs	(revision 15771)
@@ -0,0 +1,43 @@
+﻿#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.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis.Operators {
+  [StorableClass]
+  [Item("AfterSolutionCreatorOperator", "An operator that runs after the solution creator and performs additional actions.")]
+  public class AfterSolutionCreatorOperator<T> : EvolutionTrackingOperator<T>
+    where T : class,IItem {
+
+    private const string CurrentScopeParameterName = "CurrentScope";
+
+    public ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters[CurrentScopeParameterName]; }
+    }
+    public IScope CurrentScope { get { return CurrentScopeParameter.ActualValue; } }
+
+    public override IOperation Apply() {
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/BeforeCrossoverOperator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/BeforeCrossoverOperator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/BeforeCrossoverOperator.cs	(revision 15771)
@@ -0,0 +1,87 @@
+﻿#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;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  [Item("BeforeCrossoverOperator", "A generic operator that can record genealogical relationships between crossover parents and children.")]
+  public class BeforeCrossoverOperator<T> : EvolutionTrackingOperator<T>, ICrossoverOperator<T> where T : class,IItem {
+    private const string ParentsParameterName = "Parents";
+    private const string ChildParameterName = "Child";
+
+    public IScopeTreeLookupParameter<T> ParentsParameter {
+      get { return (IScopeTreeLookupParameter<T>)Parameters[ParentsParameterName]; }
+    }
+    public ILookupParameter<T> ChildParameter {
+      get { return (ILookupParameter<T>)Parameters[ChildParameterName]; }
+    }
+
+    public IValueParameter<IntValue> ExecutionCountParameter {
+      get { return (IValueParameter<IntValue>)Parameters["ExecutionCount"]; }
+    }
+
+    protected BeforeCrossoverOperator(BeforeCrossoverOperator<T> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BeforeCrossoverOperator<T>(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected BeforeCrossoverOperator(bool deserializing) : base(deserializing) { }
+
+    public BeforeCrossoverOperator() {
+      Parameters.Add(new ScopeTreeLookupParameter<T>(ParentsParameterName));
+      Parameters.Add(new LookupParameter<T>(ChildParameterName));
+      Parameters.Add(new ValueParameter<IntValue>("ExecutionCount", new IntValue(0)));
+    }
+
+    private readonly Func<IScope, string> getScopeId = s => ((StringValue)s.Variables["Id"].Value).Value;
+    public override IOperation Apply() {
+      ExecutionCountParameter.Value.Value++;
+
+      var subScopes = ExecutionContext.Scope.SubScopes;
+      var parentVertices = subScopes.Select(x => (GenealogyGraphNode<T>)GenealogyGraph.GetById(getScopeId(x))).ToList();
+      if (!parentVertices.Any())
+        throw new InvalidOperationException("Could not retrieve parent vertices.");
+
+      var parents = ParentsParameter.ActualValue.ToList();
+
+      var childVertex = new GenealogyGraphNode<T>(parents[0]) { Rank = parentVertices[0].Rank + 1 };
+
+      GenealogyGraph.AddVertex(childVertex);
+
+      foreach (var parentVertex in parentVertices)
+        GenealogyGraph.AddArc(parentVertex, childVertex);
+
+      ExecutionContext.Scope.Variables.Add(new Variable("Id", new StringValue(childVertex.Id)));
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/BeforeManipulatorOperator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/BeforeManipulatorOperator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/BeforeManipulatorOperator.cs	(revision 15771)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  [Item("AfterCrossoverOperator", "Performs an action after the crossover operator is applied.")]
+  public class BeforeManipulatorOperator<T> : EvolutionTrackingOperator<T>, IManipulatorOperator<T> where T : class, IItem {
+    private const string ChildParameterName = "Child";
+
+    public ILookupParameter<T> ChildParameter {
+      get { return (ILookupParameter<T>)Parameters[ChildParameterName]; }
+    }
+
+    protected BeforeManipulatorOperator(BeforeManipulatorOperator<T> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BeforeManipulatorOperator<T>(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected BeforeManipulatorOperator(bool deserializing) : base(deserializing) { }
+
+    public BeforeManipulatorOperator() {
+      Parameters.Add(new LookupParameter<T>(ChildParameterName));
+    }
+
+    public override IOperation Apply() {
+      // since mutation always takes place after crossover, the vertex for the current child is already in the graph
+      var vChild = GenealogyGraph.GetByContent(ChildParameter.ActualValue);
+      var vClone = (IGenealogyGraphNode<T>)vChild.Clone();
+      vClone.Rank = vChild.Rank - 0.5;
+      GenealogyGraph.AddVertex(vClone);
+
+      var arcs = vChild.InArcs.ToList();
+      foreach (var arc in arcs) {
+        var p = arc.Source;
+        GenealogyGraph.RemoveArc(arc);
+        GenealogyGraph.AddArc(new GenealogyGraphArc(p, vClone));
+      }
+      // by convention, the arc connecting child with parent (non-root parent in case of crossover)
+      // holds fragment data when applicable. the following line of code preserves this data 
+      // the graph arcs are now connecting parent (rank n) --> clone (rank n+0.5) --> child (rank n+1)
+      vClone.InArcs.Last().Data = arcs.Last().Data;
+      GenealogyGraph.AddArc(new GenealogyGraphArc(vClone, vChild));
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/EvolutionTrackingOperator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/EvolutionTrackingOperator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/EvolutionTrackingOperator.cs	(revision 15771)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [Item("EvolutionTrackingOperator", "A base operator which facilitates access to the genealogy graph.")]
+  [StorableClass]
+  public class EvolutionTrackingOperator<T> : SingleSuccessorOperator where T : class, IItem {
+    // evolution tracking-related parameters
+    private const string ResultsParameterName = "Results";
+    private const string PopulationGraphParameterName = "PopulationGraph";
+    private const string GenerationsParameterName = "Generations";
+
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
+    }
+    public ILookupParameter<IntValue> GenerationsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[GenerationsParameterName]; }
+    }
+    public ResultCollection Results {
+      get { return ResultsParameter.ActualValue; }
+    }
+    public IntValue Generations {
+      get { return GenerationsParameter.ActualValue; }
+    }
+    public IGenealogyGraph<T> GenealogyGraph {
+      get {
+        IResult result;
+        if (!Results.ContainsKey(PopulationGraphParameterName)) {
+          result = new Result(PopulationGraphParameterName, new GenealogyGraph<T>());
+          Results.Add(result);
+        } else {
+          result = Results[PopulationGraphParameterName];
+        }
+        var graph = (GenealogyGraph<T>)result.Value;
+        return graph;
+      }
+    }
+    public EvolutionTrackingOperator() {
+      Parameters.Add(new LookupParameter<IntValue>(GenerationsParameterName));
+      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName));
+    }
+    protected EvolutionTrackingOperator(EvolutionTrackingOperator<T> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvolutionTrackingOperator<T>(this, cloner);
+    }
+    [StorableConstructor]
+    protected EvolutionTrackingOperator(bool deserializing) : base(deserializing) { }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/Interfaces/ICrossoverOperator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/Interfaces/ICrossoverOperator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/Interfaces/ICrossoverOperator.cs	(revision 15771)
@@ -0,0 +1,8 @@
+﻿using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public interface ICrossoverOperator<T> : IOperator where T : class,IItem {
+    IScopeTreeLookupParameter<T> ParentsParameter { get; }
+    ILookupParameter<T> ChildParameter { get; }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/Interfaces/IManipulatorOperator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/Interfaces/IManipulatorOperator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/Interfaces/IManipulatorOperator.cs	(revision 15771)
@@ -0,0 +1,7 @@
+﻿using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public interface IManipulatorOperator<T> : IOperator where T : class,IItem {
+    ILookupParameter<T> ChildParameter { get; }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/RemovePopulationGraphFromResults.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/RemovePopulationGraphFromResults.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Operators/RemovePopulationGraphFromResults.cs	(revision 15771)
@@ -0,0 +1,53 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Problems.ProgramSynthesis.Operators {
+  [StorableClass]
+  [Item("RemovePopulationGraphFromResultsOperator", "In some cases the genealogy graph is necessary during the run but to save memory it should be removed from the results at the end of the run.")]
+  public class RemovePopulationGraphFromResultsOperator : SingleSuccessorOperator {
+
+    public const string ResultCollectionParameterName = "Results";
+
+    public ILookupParameter<ResultCollection> ResultCollectionParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[ResultCollectionParameterName]; }
+    }
+
+    [StorableConstructor]
+    protected RemovePopulationGraphFromResultsOperator(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (!Parameters.ContainsKey(ResultCollectionParameterName))
+        Parameters.Add(new LookupParameter<ResultCollection>(ResultCollectionParameterName));
+    }
+
+    public RemovePopulationGraphFromResultsOperator() {
+      Parameters.Add(new LookupParameter<ResultCollection>(ResultCollectionParameterName));
+    }
+
+    public RemovePopulationGraphFromResultsOperator(RemovePopulationGraphFromResultsOperator original, Cloner cloner) : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RemovePopulationGraphFromResultsOperator(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var results = ResultCollectionParameter.ActualValue;
+
+      if (results.ContainsKey("PopulationGraph"))
+        results.Remove("PopulationGraph");
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Plugin.cs.frame
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Plugin.cs.frame	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Plugin.cs.frame	(revision 15771)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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.Problems.ProgramSynthesis.GenealogyAnalysis {
+  [Plugin("HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis", "Provides operators and related classes for genealogy analysis.", "3.4.5.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysisg-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Analysis", "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.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  [PluginDependency("HeuristicLab.Selection", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+
+  public class HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysisPlugin : PluginBase {
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Properties/AssemblyInfo.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis/Properties/AssemblyInfo.cs	(revision 15771)
@@ -0,0 +1,36 @@
+﻿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.Problems.ProgramSynthesis.GenealogyAnalysis")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis")]
+[assembly: AssemblyCopyright("Copyright ©  2018")]
+[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("1c1fa0c1-a077-4c26-a5da-9cb1f8842a8c")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuite/DataEditorView.Designer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuite/DataEditorView.Designer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuite/DataEditorView.Designer.cs	(revision 15771)
@@ -0,0 +1,76 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Views {
+  partial class DataEditorView {
+    /// <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.dataGridView = new System.Windows.Forms.DataGridView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).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(758, 20);
+      //
+      // infoLabel
+      //
+      this.infoLabel.Location = new System.Drawing.Point(822, 3);
+      //
+      // dataGridView
+      //
+      this.dataGridView.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.dataGridView.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
+      this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.dataGridView.Location = new System.Drawing.Point(6, 26);
+      this.dataGridView.Name = "dataGridView";
+      this.dataGridView.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;
+      this.dataGridView.Size = new System.Drawing.Size(832, 612);
+      this.dataGridView.TabIndex = 3;
+      //
+      // DataEditorView
+      //
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataGridView);
+      this.Name = "DataEditorView";
+      this.Size = new System.Drawing.Size(841, 641);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.dataGridView, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.DataGridView dataGridView;
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuite/DataEditorView.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuite/DataEditorView.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuite/DataEditorView.cs	(revision 15771)
@@ -0,0 +1,206 @@
+﻿using System.Windows.Forms;
+
+namespace HeuristicLab.BenchmarkSuite.Views {
+  using System.Collections.Generic;
+
+  using HeuristicLab.Core.Views;
+  using HeuristicLab.MainForm;
+
+  [View("Push Expression Selection Editor")]
+  [Content(typeof(ProblemData), true)]
+  public partial class DataEditorView : NamedItemView {
+    private const string ValueSeparator = ", ";
+
+    public DataEditorView() {
+      InitializeComponent();
+
+      dataGridView.CellEndEdit += DataGridViewCellEndEdit;
+    }
+
+    private void DataGridViewCellEndEdit(object sender, DataGridViewCellEventArgs e) {
+      if (Content == null)
+        return;
+
+      var row = dataGridView.Rows[e.RowIndex];
+
+      var inputArgs = new string[Content.InputArgumentTypes.Length];
+      for (var i = 0; i < Content.InputArgumentTypes.Length; i++) {
+        inputArgs[i] = row.Cells[i].Value.ToString();
+      }
+
+      var outputArgs = new string[Content.OutputArgumentTypes.Length];
+      for (var i = 0; i < Content.OutputArgumentTypes.Length; i++) {
+        outputArgs[i] = row.Cells[Content.InputArgumentTypes.Length + i].Value.ToString();
+      }
+
+      var example = Content.Examples[e.RowIndex];
+
+      try {
+        Content.Examples[e.RowIndex] = ParseExample(inputArgs, Content.InputArgumentTypes, outputArgs, Content.OutputArgumentTypes);
+      }
+      catch {
+        MessageBox.Show("Unable to parse example!");
+
+        // reset entry
+        row.Cells[e.ColumnIndex].Value = e.ColumnIndex < Content.InputArgumentTypes.Length
+          ? example.InputArgs[e.ColumnIndex]
+          : example.OutputArgs[e.ColumnIndex - Content.InputArgumentTypes.Length];
+      }
+    }
+
+    private Example ParseExample(string[] inputArgs, ExampleArgumentType[] inputArgTypes, string[] outputArgs, ExampleArgumentType[] outputArgTypes) {
+      var example = new Example();
+      var booleanValues = new List<bool>();
+      var integerValues = new List<long>();
+      var floatValues = new List<double>();
+      var charValues = new List<char>();
+      var stringValues = new List<string>();
+
+      example.InputArgs = inputArgs;
+      for (var i = 0; i < inputArgs.Length; i++) {
+        var arg = inputArgs[i];
+        var type = inputArgTypes[i];
+
+        switch (type) {
+          case ExampleArgumentType.Boolean:
+            booleanValues.Add(ExampleArgumentConverter.ConvertBoolean(arg));
+            break;
+          case ExampleArgumentType.Integer:
+            integerValues.Add(ExampleArgumentConverter.ConvertInteger(arg));
+            break;
+          case ExampleArgumentType.Float:
+            floatValues.Add(ExampleArgumentConverter.ConvertDouble(arg));
+            break;
+          case ExampleArgumentType.Char:
+            charValues.Add(arg.Length == 1 ? arg[0] : default(char));
+            break;
+          case ExampleArgumentType.String:
+            stringValues.Add(arg);
+            break;
+        }
+      }
+
+      example.InputBoolean = booleanValues.ToArray();
+      example.InputInteger = integerValues.ToArray();
+      example.InputFloat = floatValues.ToArray();
+      example.InputChar = charValues.ToArray();
+      example.InputString = stringValues.ToArray();
+
+      booleanValues.Clear();
+      integerValues.Clear();
+      floatValues.Clear();
+      charValues.Clear();
+      stringValues.Clear();
+
+      example.OutputArgs = outputArgs;
+      for (var i = 0; i < outputArgs.Length; i++) {
+        var arg = outputArgs[i];
+        var type = outputArgTypes[i];
+
+        switch (type) {
+          case ExampleArgumentType.Boolean:
+            booleanValues.Add(ExampleArgumentConverter.ConvertBoolean(arg));
+            break;
+          case ExampleArgumentType.Integer:
+            integerValues.Add(ExampleArgumentConverter.ConvertInteger(arg));
+            break;
+          case ExampleArgumentType.Float:
+            floatValues.Add(ExampleArgumentConverter.ConvertDouble(arg));
+            break;
+          case ExampleArgumentType.Char:
+            charValues.Add(arg.Length == 1 ? arg[0] : default(char));
+            break;
+          case ExampleArgumentType.String:
+            stringValues.Add(arg);
+            break;
+        }
+      }
+
+      example.OutputBoolean = booleanValues.ToArray();
+      example.OutputInteger = integerValues.ToArray();
+      example.OutputFloat = floatValues.ToArray();
+      example.OutputChar = charValues.ToArray();
+      example.OutputString = stringValues.ToArray();
+
+      return example;
+    }
+
+    public new ProblemData Content
+    {
+      get { return (ProblemData)base.Content; }
+      set
+      {
+        base.Content = value;
+      }
+    }
+
+    protected override void OnReadOnlyChanged() {
+      base.OnReadOnlyChanged();
+
+      dataGridView.Enabled = !ReadOnly;
+    }
+
+    protected override void OnContentChanged() {
+      dataGridView.Columns.Clear();
+      dataGridView.Rows.Clear();
+
+      if (Content == null) {
+        return;
+      }
+
+      nameTextBox.Text = Content.Name;
+
+      var cellTemplate = new DataGridViewTextBoxCell { Style = { WrapMode = DataGridViewTriState.True } };
+
+      for (var i = 0; i < Content.InputArgumentTypes.Length; i++) {
+        var headerTypeName = ViewHelper.GetHeaderTypeName(Content.InputArgumentTypes[i]);
+        var column = new DataGridViewColumn {
+          HeaderText = string.Format("Input {0} : {1}", i + 1, headerTypeName),
+          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
+          CellTemplate = cellTemplate
+        };
+
+        dataGridView.Columns.Add(column);
+      }
+
+      for (var i = 0; i < Content.OutputArgumentTypes.Length; i++) {
+        var headerTypeName = ViewHelper.GetHeaderTypeName(Content.OutputArgumentTypes[i]);
+        var column = new DataGridViewColumn {
+          HeaderText = string.Format("Output {0} : {1}", i + 1, headerTypeName),
+          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
+          CellTemplate = cellTemplate
+        };
+
+        dataGridView.Columns.Add(column);
+      }
+
+      for (var rowIdx = 0; rowIdx < Content.Examples.Length; rowIdx++) {
+        var example = Content.Examples[rowIdx];
+        var row = new DataGridViewRow {
+          HeaderCell = {
+            Value = (rowIdx + 1).ToString(),
+          }
+        };
+        row.CreateCells(dataGridView);
+
+        var inputArgumentCountDict = ViewHelper.CreateArgumentCountDict();
+        for (var i = 0; i < Content.InputArgumentTypes.Length; i++) {
+          var type = Content.InputArgumentTypes[i];
+          var offset = inputArgumentCountDict[type];
+          row.Cells[i].Value = ViewHelper.StringifyInput(type, offset, "R", example, ValueSeparator);
+          inputArgumentCountDict[type]++;
+        }
+
+        var outputArgumentCountDict = ViewHelper.CreateArgumentCountDict();
+        for (var i = 0; i < Content.OutputArgumentTypes.Length; i++) {
+          var type = Content.OutputArgumentTypes[i];
+          var offset = outputArgumentCountDict[type];
+          row.Cells[Content.InputArgumentTypes.Length + i].Value = ViewHelper.StringifyOutput(type, offset, "R", example, ValueSeparator);
+          outputArgumentCountDict[type]++;
+        }
+
+        dataGridView.Rows.Add(row);
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuite/DataEditorView.resx
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuite/DataEditorView.resx	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuite/DataEditorView.resx	(revision 15771)
@@ -0,0 +1,126 @@
+﻿<?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/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuite/ViewHelper.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuite/ViewHelper.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuite/ViewHelper.cs	(revision 15771)
@@ -0,0 +1,73 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Views {
+  using System;
+  using System.Collections.Generic;
+  using System.Globalization;
+  using System.Linq;
+
+  public static class ViewHelper {
+    public static string StringifyInput(ExampleArgumentType type, int offset, string floatFormat, Example example, string valueSeparator) {
+      switch (type) {
+        case ExampleArgumentType.Integer: return example.InputInteger[offset].ToString();
+        case ExampleArgumentType.IntegerVector: return "[" + string.Join(", ", example.InputIntegerVector[offset]) + "]";
+
+        case ExampleArgumentType.Float: return example.InputFloat[offset].ToString(floatFormat, CultureInfo.CurrentUICulture);
+        case ExampleArgumentType.FloatVector: return "[" + string.Join(", ", example.InputFloatVector[offset].Select(x => x.ToString(floatFormat, CultureInfo.InvariantCulture))) + "]";
+
+        case ExampleArgumentType.Boolean: return example.InputBoolean[offset].ToString();
+        case ExampleArgumentType.Char: return example.InputChar[offset].ToString();
+
+        case ExampleArgumentType.String: return example.InputString[offset];
+        case ExampleArgumentType.StringVector: return "[" + string.Join(", ", example.InputStringVector[offset]) + "]";
+
+        default: return string.Empty;
+      }
+    }
+
+    public static string StringifyOutput(ExampleArgumentType type, int offset, string floatFormat, Example example, string valueSeparator) {
+      switch (type) {
+        case ExampleArgumentType.Integer: return example.OutputInteger[offset].ToString();
+        case ExampleArgumentType.IntegerVector: return "[" + string.Join(", ", example.OutputIntegerVector[offset]) + "]";
+
+        case ExampleArgumentType.Float: return example.OutputFloat[offset].ToString(floatFormat, CultureInfo.InvariantCulture);
+        case ExampleArgumentType.FloatVector: return "[" + string.Join(", ", example.OutputFloatVector[offset].Select(x => x.ToString(floatFormat, CultureInfo.InvariantCulture))) + "]";
+
+        case ExampleArgumentType.Boolean: return example.OutputBoolean[offset].ToString();
+        case ExampleArgumentType.Char: return example.OutputChar[offset].ToString();
+
+        case ExampleArgumentType.String: return example.OutputString[offset];
+        case ExampleArgumentType.Print: return example.OutputPrint;
+        case ExampleArgumentType.StringVector: return "[" + string.Join(", ", example.OutputStringVector[offset]) + "]";
+
+        default: return string.Empty;
+      }
+    }
+
+    private const string IntegerColumnHeader = "int";
+    private const string IntegersColumnHeader = "int[]";
+    private const string DoubleColumnHeader = "float";
+    private const string DoublesColumnHeader = "float[]";
+    private const string BooleanColumnHeader = "bool";
+    private const string CharColumnHeader = "char";
+    private const string StringColumnHeader = "string";
+    private const string PrintColumnHeader = "print";
+    private const string StringsColumnHeader = "string[]";
+    public static string GetHeaderTypeName(ExampleArgumentType type) {
+      switch (type) {
+        case ExampleArgumentType.Integer: return IntegerColumnHeader;
+        case ExampleArgumentType.Float: return DoubleColumnHeader;
+        case ExampleArgumentType.Boolean: return BooleanColumnHeader;
+        case ExampleArgumentType.Char: return CharColumnHeader;
+        case ExampleArgumentType.String: return StringColumnHeader;
+        case ExampleArgumentType.Print: return PrintColumnHeader;
+        case ExampleArgumentType.IntegerVector: return IntegersColumnHeader;
+        case ExampleArgumentType.FloatVector: return DoublesColumnHeader;
+        case ExampleArgumentType.StringVector: return StringsColumnHeader;
+        default: return string.Empty;
+      }
+    }
+
+    public static Dictionary<ExampleArgumentType, int> CreateArgumentCountDict() {
+      return Enum.GetValues(typeof(ExampleArgumentType)).Cast<ExampleArgumentType>().ToDictionary(type => type, _ => 0);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuitePushSolutionView.Designer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuitePushSolutionView.Designer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuitePushSolutionView.Designer.cs	(revision 15771)
@@ -0,0 +1,212 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Solution.BenchmarkSuite {
+  using HeuristicLab.Problems.ProgramSynthesis.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.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/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuitePushSolutionView.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuitePushSolutionView.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuitePushSolutionView.cs	(revision 15771)
@@ -0,0 +1,226 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Solution.BenchmarkSuite {
+  using System;
+  using System.Drawing;
+  using System.Linq;
+  using System.Windows.Forms;
+
+  using HeuristicLab.BenchmarkSuite;
+  using HeuristicLab.BenchmarkSuite.Views;
+  using HeuristicLab.Common;
+  using HeuristicLab.Core.Views;
+  using HeuristicLab.MainForm;
+  using HeuristicLab.Problems.ProgramSynthesis;
+
+  [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 = "Expected 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];
+
+            // expected
+            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 = pushInterpreter.StringifyResult(type, offset);
+
+            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 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/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuitePushSolutionView.resx
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuitePushSolutionView.resx	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/BenchmarkSuitePushSolutionView.resx	(revision 15771)
@@ -0,0 +1,126 @@
+﻿<?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/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/CheckedErcItemCollectionView.Designer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/CheckedErcItemCollectionView.Designer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/CheckedErcItemCollectionView.Designer.cs	(revision 15771)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  partial class CheckedErcItemCollectionView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/CheckedErcItemCollectionView.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/CheckedErcItemCollectionView.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/CheckedErcItemCollectionView.cs	(revision 15771)
@@ -0,0 +1,9 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Core.Views;
+
+  public partial class CheckedErcItemCollectionView : CheckedItemCollectionView<IErcItem> {
+    public CheckedErcItemCollectionView() {
+      InitializeComponent();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/ErcOptionsView.Designer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/ErcOptionsView.Designer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/ErcOptionsView.Designer.cs	(revision 15771)
@@ -0,0 +1,102 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  partial class ErcOptionsView {
+    /// <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.PossibilityLabel = new System.Windows.Forms.Label();
+      this.possibilityTextBox = new System.Windows.Forms.TextBox();
+      this.ErcOptionListView = new CheckedErcItemCollectionView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      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(75, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(633, 20);
+      //
+      // infoLabel
+      //
+      this.infoLabel.Location = new System.Drawing.Point(714, 3);
+      //
+      // PossibilityLabel
+      //
+      this.PossibilityLabel.AutoSize = true;
+      this.PossibilityLabel.Location = new System.Drawing.Point(5, 28);
+      this.PossibilityLabel.Name = "PossibilityLabel";
+      this.PossibilityLabel.Size = new System.Drawing.Size(55, 13);
+      this.PossibilityLabel.TabIndex = 0;
+      this.PossibilityLabel.Text = "Possibility:";
+      //
+      // possibilityTextBox
+      //
+      this.possibilityTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.possibilityTextBox.Location = new System.Drawing.Point(75, 25);
+      this.possibilityTextBox.Name = "possibilityTextBox";
+      this.possibilityTextBox.Size = new System.Drawing.Size(658, 20);
+      this.possibilityTextBox.TabIndex = 2;
+      //
+      // ErcOptionListView
+      //
+      this.ErcOptionListView.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.ErcOptionListView.Caption = "View";
+      this.ErcOptionListView.Content = null;
+      this.ErcOptionListView.Location = new System.Drawing.Point(0, 51);
+      this.ErcOptionListView.Name = "ErcOptionListView";
+      this.ErcOptionListView.ReadOnly = false;
+      this.ErcOptionListView.ShowDetails = true;
+      this.ErcOptionListView.Size = new System.Drawing.Size(733, 434);
+      this.ErcOptionListView.TabIndex = 3;
+      //
+      // ErcOptionsView
+      //
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.ErcOptionListView);
+      this.Controls.Add(this.possibilityTextBox);
+      this.Controls.Add(this.PossibilityLabel);
+      this.Name = "ErcOptionsView";
+      this.Size = new System.Drawing.Size(733, 485);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.PossibilityLabel, 0);
+      this.Controls.SetChildIndex(this.possibilityTextBox, 0);
+      this.Controls.SetChildIndex(this.ErcOptionListView, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label PossibilityLabel;
+    private System.Windows.Forms.TextBox possibilityTextBox;
+    private CheckedErcItemCollectionView ErcOptionListView;
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/ErcOptionsView.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/ErcOptionsView.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/ErcOptionsView.cs	(revision 15771)
@@ -0,0 +1,104 @@
+﻿using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [View("ERC Options")]
+  [Content(typeof(ErcOptions), true)]
+  public partial class ErcOptionsView : NamedItemView {
+    private const string PERCENTAGE_FORMAT = "0%";
+    private CheckedItemCollection<IErcItem> ercItems;
+
+    public ErcOptionsView() {
+      InitializeComponent();
+
+      possibilityTextBox.Validating += PossibilityTextBoxValidating;
+      possibilityTextBox.KeyDown += PossibilityTextBoxKeyDown;
+    }
+
+    private void PossibilityTextBoxKeyDown(object sender, System.Windows.Forms.KeyEventArgs e) {
+      if (e.KeyCode == System.Windows.Forms.Keys.Enter) {
+        Validate();
+      }
+    }
+
+    private void PossibilityTextBoxValidating(object sender, System.ComponentModel.CancelEventArgs e) {
+      var text = possibilityTextBox.Text.Trim();
+      if (text.EndsWith("%")) {
+        text = text.Substring(0, text.Length - 1);
+      }
+
+      double value;
+      if (double.TryParse(text, out value)) {
+        if (value > 1) value /= 100.0;
+        possibilityTextBox.Text = value.ToString(PERCENTAGE_FORMAT);
+      } else {
+        possibilityTextBox.Text = "0%";
+        e.Cancel = true;
+      }
+
+      Content.ErcProbability = value;
+    }
+
+    public new ErcOptions Content {
+      get { return (ErcOptions)base.Content; }
+      set {
+        ClearOldContent();
+        base.Content = value;
+      }
+    }
+
+    protected override void OnReadOnlyChanged() {
+      base.OnReadOnlyChanged();
+
+      possibilityTextBox.ReadOnly = ReadOnly;
+    }
+
+    protected override void OnContentChanged() {
+      if (Content == null)
+        return;
+
+      nameTextBox.Text = Content.Name;
+      possibilityTextBox.Text = Content.ErcProbability.ToString(PERCENTAGE_FORMAT);
+
+      var ercOptions = typeof(ErcOptions)
+        .GetProperties()
+        .Where(p => typeof(IErcItem).IsAssignableFrom(p.PropertyType))
+        .Select(p => (IErcItem)p.GetValue(Content))
+        .ToArray();
+
+      ercItems = new CheckedItemCollection<IErcItem>(ercOptions);
+
+      ercItems.ForEach(item => {
+        item.EnabledChanged += OptionEnabledChanged;
+        ercItems.SetItemCheckedState(item, item.IsEnabled);
+      });
+
+      ercItems.CheckedItemsChanged += ErcItemsCheckedItemsChanged;
+      ErcOptionListView.Content = new ReadOnlyCheckedItemCollection<IErcItem>(ercItems);
+    }
+
+    private void ClearOldContent() {
+      if (ercItems != null) {
+        ercItems.ForEach(item => item.EnabledChanged -= OptionEnabledChanged);
+        ercItems.CheckedItemsChanged -= ErcItemsCheckedItemsChanged;
+        ercItems = null;
+      }
+    }
+
+    private void ErcItemsCheckedItemsChanged(object sender, Collections.CollectionItemsChangedEventArgs<IErcItem> e) {
+      foreach (var item in e.Items)
+        item.IsEnabled = ercItems.ItemChecked(item);
+    }
+
+    private void OptionEnabledChanged(object sender, bool state) {
+      var item = (IErcItem)sender;
+
+      // avoid unnecessary state change events
+      if (ercItems.ItemChecked(item) != state)
+        ercItems.SetItemCheckedState(item, state);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/ErcOptionsView.resx
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/ErcOptionsView.resx	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Erc/ErcOptionsView.resx	(revision 15771)
@@ -0,0 +1,126 @@
+﻿<?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/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/ExpressionSelectionView.Designer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/ExpressionSelectionView.Designer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/ExpressionSelectionView.Designer.cs	(revision 15771)
@@ -0,0 +1,69 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Views {
+  partial class ExpressionSelectionView {
+    /// <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.groupBox1 = new System.Windows.Forms.GroupBox();
+      this.expressionsTreeView = new System.Windows.Forms.TreeView();
+      this.groupBox1.SuspendLayout();
+      this.SuspendLayout();
+      //
+      // groupBox1
+      //
+      this.groupBox1.Controls.Add(this.expressionsTreeView);
+      this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.groupBox1.Location = new System.Drawing.Point(0, 0);
+      this.groupBox1.Name = "groupBox1";
+      this.groupBox1.Size = new System.Drawing.Size(327, 455);
+      this.groupBox1.TabIndex = 3;
+      this.groupBox1.TabStop = false;
+      this.groupBox1.Text = "Instructions";
+      //
+      // expressionsTreeView
+      //
+      this.expressionsTreeView.CheckBoxes = true;
+      this.expressionsTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.expressionsTreeView.Location = new System.Drawing.Point(3, 16);
+      this.expressionsTreeView.Name = "expressionsTreeView";
+      this.expressionsTreeView.ShowNodeToolTips = true;
+      this.expressionsTreeView.Size = new System.Drawing.Size(321, 436);
+      this.expressionsTreeView.TabIndex = 0;
+      //
+      // ExpressionSelectionView
+      //
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.groupBox1);
+      this.Name = "ExpressionSelectionView";
+      this.Size = new System.Drawing.Size(327, 455);
+      this.groupBox1.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox groupBox1;
+    private System.Windows.Forms.TreeView expressionsTreeView;
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/ExpressionSelectionView.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/ExpressionSelectionView.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/ExpressionSelectionView.cs	(revision 15771)
@@ -0,0 +1,144 @@
+﻿using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.Problems.ProgramSynthesis.Views {
+  [View("Push Expression Selection Editor")]
+  [Content(typeof(IExpressionsConfiguration), true)]
+  public partial class ExpressionSelectionView : ItemView {
+    public ExpressionSelectionView() {
+      InitializeComponent();
+
+      InitEvents();
+      Name = "Push Expression Selection Editor";
+    }
+
+    public new IExpressionsConfiguration Content {
+      get { return (IExpressionsConfiguration)base.Content; }
+      set {
+        if (Content != null) Content.EnabledExpressionsChanged -= EnabledExpressionsChanged;
+        base.Content = value;
+      }
+    }
+
+    protected override void OnReadOnlyChanged() {
+      base.OnReadOnlyChanged();
+
+      expressionsTreeView.Enabled = !ReadOnly;
+    }
+
+    private void InitEvents() {
+      expressionsTreeView.AfterCheck += ExpressionsTreeViewAfterCheck;
+    }
+
+    private void ExpressionsTreeViewAfterCheck(object sender, TreeViewEventArgs e) {
+      if (e.Action == TreeViewAction.Unknown)
+        return;
+
+      Content.EnabledExpressionsChanged -= EnabledExpressionsChanged;
+      var stackType = (StackTypes)e.Node.Tag;
+
+      if (e.Node.Parent == null) {
+        Content.SetStack(stackType, e.Node.Checked);
+        SetStackNodeText(e.Node);
+        foreach (var subNode in e.Node.Nodes.OfType<TreeNode>().Where(n => n.Checked != e.Node.Checked))
+          subNode.Checked = e.Node.Checked;
+      } else {
+        Content.SetExpression(e.Node.Text, e.Node.Checked);
+        SetStackNodeText(e.Node.Parent);
+
+        // enable/disable stack if no or at least one expression is enabled
+        if ((e.Node.Checked && !e.Node.Parent.Checked) ||
+            (!e.Node.Checked && e.Node.Parent.Nodes.OfType<TreeNode>().All(n => !n.Checked))) {
+          e.Node.Parent.Checked = e.Node.Checked;
+        }
+      }
+
+      Content.EnabledExpressionsChanged += EnabledExpressionsChanged;
+    }
+
+    protected override void OnContentChanged() {
+      expressionsTreeView.Nodes.Clear();
+
+      if (Content == null) {
+        return;
+      }
+
+      Content.EnabledExpressionsChanged += EnabledExpressionsChanged;
+      UpdateNodes();
+    }
+
+    private void EnabledExpressionsChanged(object sender, EnabledExpressionsChangedEventArgs e) {
+      if (InvokeRequired) Invoke(new MethodInvoker(UpdateNodes));
+      else UpdateNodes();
+    }
+
+    private void UpdateNodes() {
+      expressionsTreeView.Nodes.Clear();
+
+      var treeNodes = GetTreeNodes(Content.EnabledExpressions)
+        .OrderBy(x => x.Text)
+        .ToArray();
+
+      expressionsTreeView.Nodes.AddRange(treeNodes);
+    }
+
+    private IEnumerable<TreeNode> GetTreeNodes(IReadOnlyList<string> enabledExpressions) {
+      foreach (var stackType in ExpressionTable.StackTypeToNamesTable.Keys) {
+        if (stackType == StackTypes.None)
+          continue;
+
+        var stackTreeNode = new TreeNode {
+          Tag = stackType
+        };
+
+        var stackExpressions = ExpressionTable.StackTypeToNamesTable[stackType];
+        var enabledStackExpressions = enabledExpressions.Intersect(stackExpressions).ToList();
+
+        SetStackNodeText(stackTreeNode);
+        stackTreeNode.Checked = enabledStackExpressions.Any();
+
+        var expressionNodes = stackExpressions
+          .Where(name => {
+            var type = ExpressionTable.NameToTypeTable[name];
+            var attribute = ExpressionTable.TypeToAttributeTable[type];
+
+            return !attribute.IsHidden;
+          })
+          .OrderBy(name => name)
+          .Select(name => new TreeNode {
+            Text = name,
+            Tag = stackType,
+            Checked = enabledStackExpressions.Contains(name),
+          }).ToArray();
+
+        foreach (var node in expressionNodes) {
+          var type = ExpressionTable.NameToTypeTable[node.Text];
+          var attribute = ExpressionTable.TypeToAttributeTable[type];
+
+          node.ToolTipText = attribute.Description;
+        }
+
+        stackTreeNode.Nodes.AddRange(expressionNodes);
+
+        yield return stackTreeNode;
+      }
+    }
+
+    private void SetStackNodeText(TreeNode node) {
+      var stackTypes = (StackTypes)node.Tag;
+      var stackExpressions = ExpressionTable.StackTypeToNamesTable[stackTypes];
+      var enabledStackExpressions = Content.EnabledExpressions.Intersect(stackExpressions).ToList();
+      var stackNames = string.Join(", ", stackTypes.ToValues().Select(type => type.ToString()).OrderBy(x => x));
+
+      node.Text = string.Format(
+                "{0} ({1}/{2})",
+                stackNames,
+                enabledStackExpressions.Count,
+                stackExpressions.Count);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/ExpressionSelectionView.resx
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/ExpressionSelectionView.resx	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/ExpressionSelectionView.resx	(revision 15771)
@@ -0,0 +1,120 @@
+﻿<?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>
+</root>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/HeuristicLab.Problems.ProgramSynthesis.Views.csproj
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/HeuristicLab.Problems.ProgramSynthesis.Views.csproj	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/HeuristicLab.Problems.ProgramSynthesis.Views.csproj	(revision 15771)
@@ -0,0 +1,138 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" 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>{6F7C98F5-C420-4C35-9D57-F299492F533E}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.ProgramSynthesis.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.ProgramSynthesis.Views</AssemblyName>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\..\..\Users\Bogdan\Projects\HeuristicLab\trunk\sources\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\..\Users\Bogdan\Projects\HeuristicLab\trunk\sources\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec">
+      <Private>False</Private>
+    </Reference>
+    <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="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="BenchmarkSuitePushSolutionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BenchmarkSuitePushSolutionView.Designer.cs">
+      <DependentUpon>BenchmarkSuitePushSolutionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="BenchmarkSuite\DataEditorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BenchmarkSuite\DataEditorView.Designer.cs">
+      <DependentUpon>DataEditorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="BenchmarkSuite\ViewHelper.cs" />
+    <Compile Include="Erc\CheckedErcItemCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Erc\CheckedErcItemCollectionView.Designer.cs">
+      <DependentUpon>CheckedErcItemCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Erc\ErcOptionsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Erc\ErcOptionsView.Designer.cs">
+      <DependentUpon>ErcOptionsView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ExpressionSelectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ExpressionSelectionView.Designer.cs">
+      <DependentUpon>ExpressionSelectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="PushDebuggerView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="PushDebuggerView.Designer.cs">
+      <DependentUpon>PushDebuggerView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="PushProgramTreeView.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="PushProgramTreeView.Designer.cs">
+      <DependentUpon>PushProgramTreeView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="BenchmarkSuitePushSolutionView.resx">
+      <DependentUpon>BenchmarkSuitePushSolutionView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="BenchmarkSuite\DataEditorView.resx">
+      <DependentUpon>DataEditorView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Erc\ErcOptionsView.resx">
+      <DependentUpon>ErcOptionsView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ExpressionSelectionView.resx">
+      <DependentUpon>ExpressionSelectionView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="PushDebuggerView.resx">
+      <DependentUpon>PushDebuggerView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Problems.ProgramSynthesis\HeuristicLab.Problems.ProgramSynthesis.csproj">
+      <Project>{5C93448C-47E3-4C3F-B1D0-EE62A48C3204}</Project>
+      <Name>HeuristicLab.Problems.ProgramSynthesis</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Properties/AssemblyInfo.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/Properties/AssemblyInfo.cs	(revision 15771)
@@ -0,0 +1,36 @@
+﻿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.Problems.ProgramSynthesis.Views")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.Problems.ProgramSynthesis.Views")]
+[assembly: AssemblyCopyright("Copyright ©  2018")]
+[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("6f7c98f5-c420-4c35-9d57-f299492f533e")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushDebuggerView.Designer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushDebuggerView.Designer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushDebuggerView.Designer.cs	(revision 15771)
@@ -0,0 +1,205 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Views {
+  using System.ComponentModel;
+  using System.Drawing;
+  using System.Windows.Forms;
+
+  partial class PushDebuggerView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private 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.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PushDebuggerView));
+      this.debugTableLayout = new System.Windows.Forms.TableLayoutPanel();
+      this.exec2GroupBox = new System.Windows.Forms.GroupBox();
+      this.execTreeView = new HeuristicLab.Problems.ProgramSynthesis.Views.PushProgramTreeView();
+      this.stepButton = new System.Windows.Forms.Button();
+      this.resetButton = new System.Windows.Forms.Button();
+      this.stepWidthBox = new System.Windows.Forms.NumericUpDown();
+      this.runButton = new System.Windows.Forms.Button();
+      this.skipNoopsCheckBox = new System.Windows.Forms.CheckBox();
+      this.simplifyButton = new System.Windows.Forms.Button();
+      this.execCountLabel = new System.Windows.Forms.Label();
+      this.debugTableLayout.SuspendLayout();
+      this.exec2GroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.stepWidthBox)).BeginInit();
+      this.SuspendLayout();
+      //
+      // debugTableLayout
+      //
+      this.debugTableLayout.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.debugTableLayout.AutoScroll = true;
+      this.debugTableLayout.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.debugTableLayout.ColumnCount = 2;
+      this.debugTableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 350F));
+      this.debugTableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+      this.debugTableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+      this.debugTableLayout.Controls.Add(this.exec2GroupBox, 0, 0);
+      this.debugTableLayout.Location = new System.Drawing.Point(3, 3);
+      this.debugTableLayout.Name = "debugTableLayout";
+      this.debugTableLayout.RowCount = 1;
+      this.debugTableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.debugTableLayout.Size = new System.Drawing.Size(872, 466);
+      this.debugTableLayout.TabIndex = 18;
+      //
+      // exec2GroupBox
+      //
+      this.exec2GroupBox.Controls.Add(this.execTreeView);
+      this.exec2GroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.exec2GroupBox.Location = new System.Drawing.Point(3, 3);
+      this.exec2GroupBox.Name = "exec2GroupBox";
+      this.exec2GroupBox.Size = new System.Drawing.Size(344, 460);
+      this.exec2GroupBox.TabIndex = 4;
+      this.exec2GroupBox.TabStop = false;
+      this.exec2GroupBox.Text = "Exec";
+      //
+      // execTreeView
+      //
+      this.execTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.execTreeView.Location = new System.Drawing.Point(3, 16);
+      this.execTreeView.Name = "execTreeView";
+      this.execTreeView.Size = new System.Drawing.Size(338, 441);
+      this.execTreeView.TabIndex = 0;
+      //
+      // stepButton
+      //
+      this.stepButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stepButton.Image = ((System.Drawing.Image)(resources.GetObject("stepButton.Image")));
+      this.stepButton.Location = new System.Drawing.Point(109, 475);
+      this.stepButton.Name = "stepButton";
+      this.stepButton.Size = new System.Drawing.Size(28, 26);
+      this.stepButton.TabIndex = 22;
+      this.stepButton.UseVisualStyleBackColor = true;
+      //
+      // resetButton
+      //
+      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.resetButton.Image = ((System.Drawing.Image)(resources.GetObject("resetButton.Image")));
+      this.resetButton.Location = new System.Drawing.Point(3, 475);
+      this.resetButton.Name = "resetButton";
+      this.resetButton.Size = new System.Drawing.Size(28, 26);
+      this.resetButton.TabIndex = 23;
+      this.resetButton.UseVisualStyleBackColor = true;
+      //
+      // stepWidthBox
+      //
+      this.stepWidthBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stepWidthBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.stepWidthBox.Location = new System.Drawing.Point(70, 476);
+      this.stepWidthBox.Maximum = new decimal(new int[] {
+            99999,
+            0,
+            0,
+            0});
+      this.stepWidthBox.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.stepWidthBox.Name = "stepWidthBox";
+      this.stepWidthBox.Size = new System.Drawing.Size(40, 24);
+      this.stepWidthBox.TabIndex = 21;
+      this.stepWidthBox.Value = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      //
+      // runButton
+      //
+      this.runButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.runButton.Image = ((System.Drawing.Image)(resources.GetObject("runButton.Image")));
+      this.runButton.Location = new System.Drawing.Point(37, 475);
+      this.runButton.Name = "runButton";
+      this.runButton.Size = new System.Drawing.Size(28, 26);
+      this.runButton.TabIndex = 24;
+      this.runButton.UseVisualStyleBackColor = true;
+      //
+      // skipNoopsCheckBox
+      //
+      this.skipNoopsCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.skipNoopsCheckBox.AutoSize = true;
+      this.skipNoopsCheckBox.Checked = true;
+      this.skipNoopsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.skipNoopsCheckBox.Location = new System.Drawing.Point(147, 481);
+      this.skipNoopsCheckBox.Name = "skipNoopsCheckBox";
+      this.skipNoopsCheckBox.Size = new System.Drawing.Size(81, 17);
+      this.skipNoopsCheckBox.TabIndex = 25;
+      this.skipNoopsCheckBox.Text = "Skip NOOP";
+      this.skipNoopsCheckBox.UseVisualStyleBackColor = true;
+      //
+      // simplifyButton
+      //
+      this.simplifyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.simplifyButton.Location = new System.Drawing.Point(813, 475);
+      this.simplifyButton.Name = "simplifyButton";
+      this.simplifyButton.Size = new System.Drawing.Size(62, 26);
+      this.simplifyButton.TabIndex = 26;
+      this.simplifyButton.Text = "Simplify";
+      this.simplifyButton.UseVisualStyleBackColor = true;
+      //
+      // execCountLabel
+      //
+      this.execCountLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.execCountLabel.AutoSize = true;
+      this.execCountLabel.Location = new System.Drawing.Point(248, 482);
+      this.execCountLabel.Name = "execCountLabel";
+      this.execCountLabel.Size = new System.Drawing.Size(0, 13);
+      this.execCountLabel.TabIndex = 27;
+      //
+      // PushDebuggerView
+      //
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.execCountLabel);
+      this.Controls.Add(this.simplifyButton);
+      this.Controls.Add(this.skipNoopsCheckBox);
+      this.Controls.Add(this.runButton);
+      this.Controls.Add(this.stepWidthBox);
+      this.Controls.Add(this.resetButton);
+      this.Controls.Add(this.stepButton);
+      this.Controls.Add(this.debugTableLayout);
+      this.Name = "PushDebuggerView";
+      this.Size = new System.Drawing.Size(878, 504);
+      this.debugTableLayout.ResumeLayout(false);
+      this.exec2GroupBox.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.stepWidthBox)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+    private TableLayoutPanel debugTableLayout;
+    private Button stepButton;
+    private Button resetButton;
+    private NumericUpDown stepWidthBox;
+    private Button runButton;
+    private CheckBox skipNoopsCheckBox;
+    private Button simplifyButton;
+    private Label execCountLabel;
+    private GroupBox exec2GroupBox;
+    private PushProgramTreeView execTreeView;
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushDebuggerView.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushDebuggerView.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushDebuggerView.cs	(revision 15771)
@@ -0,0 +1,282 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.ProgramSynthesis.Views {
+
+  public partial class PushDebuggerView : ItemView {
+    private readonly IDictionary<StackTypes, ListBox> debugListDict = new Dictionary<StackTypes, ListBox>();
+    private readonly IDictionary<StackTypes, PushProgramTreeView> debugPushProgramDict = new Dictionary<StackTypes, PushProgramTreeView>();
+
+    private PooledPushInterpreter interpreter;
+    private PushInterpreterPool pool;
+
+    private const string GROUP_BOX_TEXT_STRING_FORMAT = "{0}[{1}]";
+    private const string EXEC_COUNT_LABEL_FORMAT = "{0}/{1} max. expressions evaluated";
+
+    public event EventHandler<IPushInterpreter> OnReset;
+
+    public PushDebuggerView() {
+      InitializeComponent();
+      InitEvents();
+    }
+
+    ~PushDebuggerView() {
+      interpreter.Dispose();
+    }
+
+    public new PushSolution Content {
+      get { return (PushSolution)base.Content; }
+      set {
+        base.Content = value;
+      }
+    }
+
+    protected override void OnContentChanged() {
+      if (Content == null) return;
+
+      Name = "Push Debugger";
+      pool = new PushInterpreterPool(Content.Config);
+
+      if (interpreter != null) {
+        interpreter.Dispose();
+      }
+
+      var random = Content.GetRandom();
+      interpreter = pool.Create(random);
+
+      InitDebugLists(Content.Config);
+      ClearDebugLists();
+      UpdateExecList();
+      UpdateDebugLists();
+      ResetDebugging();
+    }
+
+    private void UpdateExecCountLabel() {
+      execCountLabel.Text = string.Format(
+        EXEC_COUNT_LABEL_FORMAT,
+        interpreter.ExecCounter,
+        Content.Config.EvalPushLimit);
+    }
+
+    private void InitEvents() {
+      runButton.Click += RunButtonClick;
+      resetButton.Click += ResetButtonClick;
+      stepButton.Click += StepButtonClick;
+      simplifyButton.Click += SimplifyButtonClick;
+    }
+
+    private void RunButtonClick(object sender, EventArgs e) {
+      if (interpreter == null)
+        return;
+
+      interpreter.Resume();
+      UpdateStep();
+    }
+
+    private void StepButtonClick(object sender, EventArgs e) {
+      if (interpreter == null || stepWidthBox.Value <= 0)
+        return;
+
+      var count = Math.Min(stepWidthBox.Value, interpreter.ExecStack.Count);
+
+      for (var i = 0; i < count; i++) {
+        SkipNoops();
+
+        // run next none noop expression
+        interpreter.Step();
+      }
+
+      // skip trailing noops so next expression is a none noop in debugger
+      SkipNoops();
+
+      stepWidthBox.Maximum = Math.Max(1, interpreter.ExecStack.Count);
+      UpdateStep();
+    }
+
+    private void UpdateStep() {
+      UpdateExecList();
+      UpdateDebugLists();
+      UpdateExecCountLabel();
+      CheckIfButtonsCanBeEnabled();
+    }
+
+    private void SkipNoops() {
+      // skip noops
+      if (skipNoopsCheckBox.Checked) {
+        while (interpreter.CanStep && interpreter.ExecStack.Top.IsNoop(interpreter)) {
+          interpreter.Step();
+        }
+      }
+    }
+
+    private void CheckIfButtonsCanBeEnabled() {
+      runButton.Enabled = interpreter != null && interpreter.CanStep;
+      stepButton.Enabled = interpreter != null && interpreter.CanStep;
+      stepWidthBox.Enabled = interpreter != null && interpreter.CanStep;
+    }
+
+    private void ResetButtonClick(object sender, EventArgs e) {
+      ResetDebugging();
+    }
+
+    private void SimplifyButtonClick(object sender, EventArgs e) {
+      var newContent = Content.Simplify();
+
+      MainFormManager.MainForm.ShowContent(newContent, GetType());
+    }
+
+    public void ResetDebugging() {
+      if (Content == null ||
+          pool == null ||
+          Content.Program == null)
+        return;
+
+      if (interpreter != null) {
+        interpreter.Reset();
+      }
+
+      if (OnReset != null) {
+        OnReset(this, interpreter);
+      }
+
+      interpreter.Run(Content.Program, true);
+
+      stepWidthBox.Maximum = interpreter.ExecStack.Count;
+      UpdateStep();
+    }
+
+    private void ClearDebugLists() {
+      foreach (var list in debugListDict.Values) {
+        list.Items.Clear();
+      }
+
+      foreach (var treeView in debugPushProgramDict.Values) {
+        treeView.Nodes.Clear();
+      }
+    }
+
+    private void UpdateExecList() {
+      execTreeView.LoadExpressions(interpreter.ExecStack.Reverse());
+      exec2GroupBox.Text = string.Format(GROUP_BOX_TEXT_STRING_FORMAT, Enum.GetName(typeof(StackTypes), StackTypes.Exec), interpreter.ExecStack.Count);
+    }
+
+    private void InitDebugLists(IReadOnlyPushConfiguration config) {
+      debugListDict.Clear();
+      debugPushProgramDict.Clear();
+
+      // 2 = ExecList + EmptyColumn which is required to fill empty space
+      while (debugTableLayout.ColumnCount > 2) {
+        debugTableLayout.Controls.RemoveAt(1);
+        debugTableLayout.ColumnCount--;
+      }
+
+      foreach (StackTypes stackType in Enum.GetValues(typeof(StackTypes))) {
+        if (stackType == StackTypes.Exec || !config.IsStackEnabled(stackType))
+          continue;
+
+        switch (stackType) {
+          case StackTypes.Code:
+            var treeView = CreatePushProgramTreeView(stackType);
+            debugPushProgramDict.Add(stackType, treeView);
+            break;
+          default:
+            var list = CreateDebugList(stackType);
+            debugListDict.Add(stackType, list);
+            break;
+        }
+      }
+    }
+
+    private PushProgramTreeView CreatePushProgramTreeView(StackTypes type) {
+
+      var treeView = new PushProgramTreeView {
+        Dock = DockStyle.Fill
+      };
+
+      AddStackControlToTableLayout(type, treeView, 400);
+
+      return treeView;
+    }
+
+    private void AddStackControlToTableLayout(StackTypes type, Control control, int width) {
+      var groupBox = CreateStackGroupBox(type);
+      groupBox.Controls.Add(control);
+
+      debugTableLayout.ColumnCount++;
+      debugTableLayout.ColumnStyles.Insert(1, new ColumnStyle(SizeType.Absolute, width));
+      debugTableLayout.Controls.Add(groupBox);
+      debugTableLayout.Controls.SetChildIndex(groupBox, 1);
+    }
+
+    private ListBox CreateDebugList(StackTypes type) {
+      var list = new ListBox {
+        Dock = DockStyle.Fill
+      };
+
+      // align numbers right
+      if (type == StackTypes.Integer ||
+          type == StackTypes.Float) {
+        list.DrawMode = DrawMode.OwnerDrawFixed;
+        list.DrawItem += (sender, e) => {
+          if (e.Index <= -1) return;
+          var item = list.Items[e.Index];
+
+          e.DrawBackground();
+          e.DrawFocusRectangle();
+
+          var brush = new SolidBrush(e.ForeColor);
+          var size = e.Graphics.MeasureString(item.ToString(), e.Font);
+
+          e.Graphics.DrawString(
+            item.ToString(),
+            e.Font,
+            brush,
+            e.Bounds.Right - size.Width,
+            e.Bounds.Top + (e.Bounds.Height / 2 - size.Height / 2));
+        };
+      }
+
+      AddStackControlToTableLayout(type, list, 150);
+
+      return list;
+    }
+
+    private static GroupBox CreateStackGroupBox(StackTypes type) {
+      return new GroupBox {
+        Anchor = AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Top,
+        AutoSize = true,
+        AutoSizeMode = AutoSizeMode.GrowAndShrink,
+        Text = Enum.GetName(typeof(StackTypes), type)
+      };
+    }
+
+    private void UpdateDebugLists() {
+      ClearDebugLists();
+
+      if (Content == null || interpreter == null)
+        return;
+
+      foreach (var pair in debugPushProgramDict) {
+        var name = Enum.GetName(typeof(StackTypes), pair.Key);
+        var stack = (IPushStack<Expression>)interpreter.Stacks[pair.Key];
+
+        pair.Value.AddExpressions(stack);
+        ((GroupBox)pair.Value.Parent).Text = string.Format(GROUP_BOX_TEXT_STRING_FORMAT, name, pair.Value.Nodes.Count);
+      }
+
+      foreach (var pair in debugListDict) {
+        var name = Enum.GetName(typeof(StackTypes), pair.Key);
+        var items = interpreter.StringifyStack(pair.Key).ToArray();
+
+        pair.Value.Items.AddRange(items);
+        ((GroupBox)pair.Value.Parent).Text = string.Format(GROUP_BOX_TEXT_STRING_FORMAT, name, pair.Value.Items.Count);
+      }
+    }
+
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushDebuggerView.resx
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushDebuggerView.resx	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushDebuggerView.resx	(revision 15771)
@@ -0,0 +1,203 @@
+﻿<?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>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="stepButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
+        JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAABFklE
+        QVQ4T2P4//8/Bk7oecKMTRwbxioINEAGiJmwyaFjrIKFs57/j5/8VokYQ7AK5s589j+h+97/uAmvNQh5
+        B6tgxpSn/+ft//0/qOHma6ABtvgMwSoI1PB/9r5f/zu3/v3vVnr5P5Bvj8sQDAEQjux69H/Ktl//S5b+
+        /Z8w/e9/m9yzOA1B4cBwYPPD/61r34M1G5d8+S8dfe2/ceSy/w5FZ+PRDUHRCMMeVff/l8x9B9es6NLz
+        X9pndSA2tRgCIGxfevd/YMszJM0rvbCpA2GsghZ5d/7bFFyBabbBpgaGsQoaZt0Ga5byWu6KTR4ZYxXU
+        SbsBtHmNLzY5dIxVUMp7rZ+09wqciQcZYxUkBWMVJB7/ZwAA4djU9I5dK1UAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="resetButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH
+        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp
+        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE
+        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs
+        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4
+        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR
+        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd
+        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF
+        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX
+        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF
+        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55
+        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ
+        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB
+        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC
+        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE
+        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I
+        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9
+        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG
+        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp
+        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ
+        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC
+        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln
+        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v
+        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp
+        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L
+        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA
+        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z
+        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW
+        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s
+        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6
+        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw
+        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR
+        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm
+        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl
+        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2
+        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8
+        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za
+        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v
+        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb
+        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/
+        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h
+        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr
+        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS
+        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+
+        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/
+        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALEgAACxIB0t1+/AAAABl0RVh0U29mdHdhcmUA
+        UGFpbnQuTkVUIHYzLjUuNUmK/OAAAAJfSURBVDhPrZJfSFNRHMfdzAgVfBAtm/8Ic9pGiZlRhGZIlD5I
+        IAVl0EtQ9BIVUZHTXLhms7JtTS0tCEOClOyfUsTAZX9ksPngRY3W3Vqbztxm5p973b6dc5micHvrC9+H
+        wznfz/nd+z1RS+L8PdFcoE/KBc1J/PRALP/7cxJxAj/9MYUPmNdwU28k9Nyc575SCIiJnxlMt4x+QqNZ
+        j8qnx1HSWo6iOwdwtVsNO8sEuODAMZ3ZhMjx1VrwdiR2D71GxcsqqBwaaJx6XGN0qGEacOrLBRTfK4PN
+        MYzc2zvEAYx7zE/D1x23UN51BMk1m7BBvRknzGcEUC1zU4BkahXigEvPa1FlOY2dTfvQ2GvAkHMEox4W
+        qXVyYaolp6izxAGH2o6iqOUguqyvwC+GFdxiOG7cNwW7a2QVJLE6QxxQ2FKCi89UNJxHLOH4sKTT2oMM
+        jRJpmhzhZhpOuCwTB2wz7MbgNzu8E79i6Nrt8aW6fo7H/PBMrHN7fWvJWsq6vOtHvrLiAHIjIt5PHL3A
+        hfe43OOSuYWQdHY+JPlDPDMbilP1a8UB+W3F2GrahZy7Bf7MBmVQVi9H88BjzHOhRLpPIKXN/Q+Ra/hH
+        jdvbiqB1GoXKsnR5sLLD9HNAJkijU9jYUZQ9qcTG6mxxwBZj4TKAWt5UAOv3YfICx9Bq6RBeJW3h5KOz
+        4gAyNrJv5C/XRU1DS0FqmUqOB+87xQHp9Qq8sL2FjHS+MrQyrOnTwxfg90Yiq2V61w7yo/CBseJKZx3K
+        jYcRfz4Z8eeSUdpUAUNvOyaDfKx7kpNGIv9DUVF/Af0cpIdxksW3AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="runButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
+        JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAsElE
+        QVQ4T2P4//8/RRirYNn+bDds4tgwVsGEGRH/iTUEqyDIAMsyfaIMwSoYNSXo/4Zbi4kyBKtg8ARvkEai
+        DMEq6NPlDDYAhKMWBeA1BEMAhB2bLf5nbIgFa7Zt1v+vU6zwXyKNG0SroatF4cCweY0eimb+BBasmkEY
+        QwCE9UqVidIMwlgFVfKliNIMwlgFpTMEidIMwlgFRZI5idIMwlgFidUMwlgFScFYBYnH/xkAJP3E6UxO
+        vJ8AAAAASUVORK5CYII=
+</value>
+  </data>
+</root>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushProgramTreeView.Designer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushProgramTreeView.Designer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushProgramTreeView.Designer.cs	(revision 15771)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Views {
+  partial class PushProgramTreeView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      //this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushProgramTreeView.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushProgramTreeView.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis.Views/PushProgramTreeView.cs	(revision 15771)
@@ -0,0 +1,61 @@
+﻿using System.Windows.Forms;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.Problems.ProgramSynthesis.Views {
+  public partial class PushProgramTreeView : TreeView {
+    private const string PushProgramStringFormat = "List {0}@{1}";
+    private const string EmptyList = "Empty List";
+
+    public PushProgramTreeView() {
+      InitializeComponent();
+
+      ShowNodeToolTips = true;
+    }
+
+    public void LoadExpressions(IEnumerable<Expression> expressions) {
+      Nodes.Clear();
+      AddExpressions(expressions);
+    }
+
+    public void AddExpressions(IEnumerable<Expression> expressions) {
+      var nodes = expressions.Select(ToTreeNode).ToArray();
+      Nodes.AddRange(nodes);
+    }
+
+    private TreeNode ToTreeNode(Expression expression) {
+      var node = new TreeNode {
+        Text = GetNodeText(expression),
+        Tag = expression,
+      };
+
+      if (expression.IsProgram) {
+        var program = (PushProgram)expression;
+        var subNodes = program.Expressions.Reverse().Select(ToTreeNode).ToArray();
+
+        node.Nodes.AddRange(subNodes);
+      } else {
+        var type = expression.GetType();
+        var attribute = ExpressionTable.TypeToAttributeTable[type];
+
+        node.ToolTipText = attribute.Description;
+      }
+
+      return node;
+    }
+
+    private string GetNodeText(Expression expression) {
+      if (expression.IsProgram) {
+        var program = (PushProgram)expression;
+
+        if (program.IsEmpty)
+          return EmptyList;
+
+        return string.Format(PushProgramStringFormat, program.TotalInstructionCount, program.Depth);
+      }
+
+      return expression.StringRepresentation;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/ExpressionsClassDiagramm.cd
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/ExpressionsClassDiagramm.cd	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/ExpressionsClassDiagramm.cd	(revision 15771)
@@ -0,0 +1,54 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1">
+  <Class Name="HeuristicLab.Problems.ProgramSynthesis.Push.Expressions.Expression">
+    <Position X="2.75" Y="0.5" Width="2" />
+    <Members>
+      <Method Name="Expression" Hidden="true" />
+      <Method Name="IPooledObject.Reset" Hidden="true" />
+      <Property Name="IsProgram" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>EAAAAAgAJAAAAAAEAAAAAAAAAAAAACAAAQAAAAAAABA=</HashCode>
+      <FileName>Push\Expressions\Expression.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ProgramSynthesis.Push.Expressions.PushProgram">
+    <Position X="0.5" Y="3.5" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+      <Compartment Name="Methods" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AMtgMCECJAAABAAUgAYAAAQCQkABAeBgAQEIIgCAABo=</HashCode>
+      <FileName>Push\Expressions\PushProgram.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ProgramSynthesis.Push.Expressions.StatefulExpression&lt;T&gt;">
+    <Position X="2.75" Y="3.5" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+      <Compartment Name="Methods" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAggAAAAAACABAAAgAAAAAAAAAAAAKAAAAAABAAAAAA=</HashCode>
+      <FileName>Push\Expressions\StatefulExpression.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ProgramSynthesis.Push.Expressions.StatelessExpression">
+    <Position X="5" Y="3.5" Width="2" />
+    <Members>
+      <Field Name="hashCode" Hidden="true" />
+    </Members>
+    <Compartments>
+      <Compartment Name="Methods" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAgAAAAAAAAAAAAAgAAAAAAAAAAAAKAAAAAAAAAAAAA=</HashCode>
+      <FileName>Push\Expressions\StatelessExpression.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Font Name="Courier" Size="9" />
+</ClassDiagram>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/HeuristicLab.Problems.ProgramSynthesis.csproj
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/HeuristicLab.Problems.ProgramSynthesis.csproj	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/HeuristicLab.Problems.ProgramSynthesis.csproj	(revision 15771)
@@ -0,0 +1,367 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.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>{5C93448C-47E3-4C3F-B1D0-EE62A48C3204}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.ProgramSynthesis</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.ProgramSynthesis</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <LangVersion>5</LangVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Selection-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Selection-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.IO.RecyclableMemoryStream, Version=1.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.IO.RecyclableMemoryStream.1.2.2\lib\net45\Microsoft.IO.RecyclableMemoryStream.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.ComponentModel.DataAnnotations" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.IO.Compression" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Push.Base\Erc\Boolean\BooleanErcOptions.cs" />
+    <Compile Include="Push.Base\Erc\Boolean\BooleanRandomErc.cs" />
+    <Compile Include="Push.Base\Erc\Char\CharErcOptions.cs" />
+    <Compile Include="Push.Base\Erc\ConstantsErcValue.cs" />
+    <Compile Include="Push.Base\Erc\ErcOption.cs" />
+    <Compile Include="Push.Base\Erc\ErcOptionConvertible.cs" />
+    <Compile Include="Push.Base\Erc\ErcOptions.cs" />
+    <Compile Include="Push.Base\Erc\FloatVector\FloatVectorConstantsErc.cs" />
+    <Compile Include="Push.Base\Erc\FloatVector\FloatVectorErcOptions.cs" />
+    <Compile Include="Push.Base\Erc\Float\FloatConstantErc.cs" />
+    <Compile Include="Push.Base\Erc\Float\FloatErcOptions.cs" />
+    <Compile Include="Push.Base\Erc\Float\FloatRangeErc.cs" />
+    <Compile Include="Push.Base\Erc\IErcItem.cs" />
+    <Compile Include="Push.Base\Erc\IntegerVector\IntegerVectorConstantsErc.cs" />
+    <Compile Include="Push.Base\Erc\IntegerVector\IntegerVectorErcOptions.cs" />
+    <Compile Include="Push.Base\Erc\Integer\IntegerConstantErc.cs" />
+    <Compile Include="Push.Base\Erc\Integer\IntegerErcOptions.cs" />
+    <Compile Include="Push.Base\Erc\Integer\IntegerRangeErc.cs" />
+    <Compile Include="Push.Base\Erc\IReadOnlyErcOptions.cs" />
+    <Compile Include="Push.Base\Erc\Name\NameErcOptions.cs" />
+    <Compile Include="Push.Base\Erc\StringVector\StringVectorConstantsErc.cs" />
+    <Compile Include="Push.Base\Erc\StringVector\StringVectorErcOptions.cs" />
+    <Compile Include="Push.Base\Erc\String\StringConstantErc.cs" />
+    <Compile Include="Push.Base\Erc\String\StringErcOptions.cs" />
+    <Compile Include="Push.Base\Erc\String\StringRandomErc.cs" />
+    <Compile Include="Push.Base\Erc\VectorConstantsErc.cs" />
+    <Compile Include="Push.Base\Erc\WeightedErcItem.cs" />
+    <Compile Include="Push.Base\Extensions\EnumerableExtensions.cs" />
+    <Compile Include="Push.Base\Extensions\MathExtensions.cs" />
+    <Compile Include="Push.Base\Extensions\NormalDistributedRandomExtensions.cs" />
+    <Compile Include="Push.Base\Extensions\StringExtensions.cs" />
+    <Compile Include="Push.Base\Extensions\TypeExtensions.cs" />
+    <Compile Include="Push.Base\Generators\StringGenerator.cs" />
+    <Compile Include="Push.Base\Weighted\IWeighted.cs" />
+    <Compile Include="Push\Analyzer\IIndividualZeroErrorAnalyzer.cs" />
+    <Compile Include="Push\Analyzer\IIndividualZeroErrorDistributionAnalyzer.cs" />
+    <Compile Include="Push\Analyzer\IndividualZeroErrorAnalyzer.cs" />
+    <Compile Include="Push\Analyzer\IndividualZeroErrorDistributionAnalyzer.cs" />
+    <Compile Include="Push\Analyzer\IPushExpressionAnalyzer.cs" />
+    <Compile Include="Push\Analyzer\PushExpressionFrequencyAnalyzer.cs" />
+    <Compile Include="Push\Attributes\PushExpressionAttriubte.cs" />
+    <Compile Include="Push\Attributes\PushStackAttribute.cs" />
+    <Compile Include="Push\BenchmarkSuite\BenchmarkSuiteDataDescriptor.cs" />
+    <Compile Include="Push\BenchmarkSuite\BenchmarkSuiteInstanceProvider.cs" />
+    <Compile Include="Push\BenchmarkSuite\CsvParser.cs" />
+    <Compile Include="Push\BenchmarkSuite\DataTypes.cs" />
+    <Compile Include="Push\BenchmarkSuite\Example.cs" />
+    <Compile Include="Push\BenchmarkSuite\ExampleArgumentConverter.cs" />
+    <Compile Include="Push\BenchmarkSuite\ExampleArgumentType.cs" />
+    <Compile Include="Push\BenchmarkSuite\IBenchmarkSuiteDataDescriptor.cs" />
+    <Compile Include="Push\BenchmarkSuite\Plugin.cs" />
+    <Compile Include="Push\BenchmarkSuite\ProblemData.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\Checksum.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\CollatzNumbers.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\CompareStringLengths.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\CountOdds.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\Digits.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\DoubleLetters.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\EvenSquares.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\ForLoopIndex.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\Grades.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\LastIndexOfZero.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\Median.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\MedianIntegerError.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\MirrorImage.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\NegativeToZero.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\NumberIo.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\PigLatin.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\ReplaceSpaceWithNewline.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\ScrabbleScore.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\Smallest.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\SmallOrLarge.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\StringDifferences.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\StringLengthsBackwards.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\SumOfSquares.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\SuperAnagrams.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\Syllables.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\VectorAverage.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\VectorSummed.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\WallisPi.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\WordStats.cs" />
+    <Compile Include="Push\BenchmarkSuite\Problems\XWordLines.cs" />
+    <Compile Include="Push\BenchmarkSuite\ProblemType.cs" />
+    <Compile Include="Push\Configuration\IEnabledExpressionsConfiguration.cs" />
+    <Compile Include="Push\Configuration\PushConfigurationBase.cs" />
+    <Compile Include="Push\Configuration\PushConfiguration.cs" />
+    <Compile Include="Push\Crossover\AlternationCrossover.cs" />
+    <Compile Include="Push\Crossover\IPlushCrossover.cs" />
+    <Compile Include="Push\Data\List\SkipList.cs" />
+    <Compile Include="Push\Data\Pool\IPooledObject.cs" />
+    <Compile Include="Push\Data\Pool\ManagedPoolProvider.cs" />
+    <Compile Include="Push\Data\Pool\ObjectPool.cs" />
+    <Compile Include="Push\Data\Pool\PooledList.cs" />
+    <Compile Include="Push\Data\Tree\TreeExtensions.cs" />
+    <Compile Include="Push\Data\Tree\TreeNode.cs" />
+    <Compile Include="Push\Constants\PushEnvironment.cs" />
+    <Compile Include="Push\Encoding\IPlushOperator.cs" />
+    <Compile Include="Push\Encoding\PlushEncoding.cs" />
+    <Compile Include="Push\Encoding\PlushEntry.cs" />
+    <Compile Include="Push\Encoding\PlushVector.cs" />
+    <Compile Include="Push\Exporter\Exporter.cs" />
+    <Compile Include="Push\Expressions\BooleanExpressions.cs" />
+    <Compile Include="Push\Expressions\CharExpressions.cs" />
+    <Compile Include="Push\Expressions\CodeExpressions.cs" />
+    <Compile Include="Push\Expressions\DefineExpressions.cs" />
+    <Compile Include="Push\Expressions\DoCountExpressions.cs" />
+    <Compile Include="Push\Expressions\DoRangeExpressions.cs" />
+    <Compile Include="Push\Expressions\DoTimesExpressions.cs" />
+    <Compile Include="Push\Expressions\DuplicateExpressions.cs" />
+    <Compile Include="Push\Expressions\EmptyExpression.cs" />
+    <Compile Include="Push\Expressions\EqualsExpressions.cs" />
+    <Compile Include="Push\Expressions\ExecExpressions.cs" />
+    <Compile Include="Push\Expressions\Expression.cs" />
+    <Compile Include="Push\Expressions\ExpressionTable.cs" />
+    <Compile Include="Push\Expressions\FloatExpressions.cs" />
+    <Compile Include="Push\Expressions\FlushExpressions.cs" />
+    <Compile Include="Push\Expressions\InExpressions.cs" />
+    <Compile Include="Push\Expressions\IntegerExpressions.cs" />
+    <Compile Include="Push\Expressions\NameExpressions.cs" />
+    <Compile Include="Push\Expressions\PopExpressions.cs" />
+    <Compile Include="Push\Expressions\PrintExpressions.cs" />
+    <Compile Include="Push\Expressions\PushExpressions.cs" />
+    <Compile Include="Push\Expressions\PushProgram.cs" />
+    <Compile Include="Push\Expressions\RandExpressions.cs" />
+    <Compile Include="Push\Expressions\RotateExpressions.cs" />
+    <Compile Include="Push\Expressions\ShoveExpressions.cs" />
+    <Compile Include="Push\Expressions\StackdepthExpressions.cs" />
+    <Compile Include="Push\Expressions\StatefulExpression.cs" />
+    <Compile Include="Push\Expressions\StatelessExpression.cs" />
+    <Compile Include="Push\Expressions\StringExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorContainsExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorEmptyExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorIndexOfExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorIterateExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorLengthExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorNthExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorLastExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorFirstExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorButLastExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorRemoveExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorReplaceFirstExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorReplaceExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorSetExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorOccurrenceOfExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorPushAllExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorRestExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorReverseExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorSubExpressions.cs" />
+    <Compile Include="Push\Expressions\SwapExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorConcatExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorConjExpressions.cs" />
+    <Compile Include="Push\Expressions\VectorTakeExpressions.cs" />
+    <Compile Include="Push\Expressions\YankDuplicateExpressions.cs" />
+    <Compile Include="Push\Expressions\YankExpressions.cs" />
+    <Compile Include="Push\Extensions\CharExtentions.cs" />
+    <Compile Include="Push\Extensions\CollectionExtensions.cs" />
+    <Compile Include="Push\Extensions\ControlExntensions.cs" />
+    <Compile Include="Push\Extensions\EnumExtensions.cs" />
+    <Compile Include="Push\Extensions\LongExtensions.cs" />
+    <Compile Include="Push\Extensions\RandomExtensions.cs" />
+    <Compile Include="Push\Extensions\StringBuilderExtensions.cs" />
+    <Compile Include="Push\Generators\CodeGenerator\CodeGeneratorUtils.cs" />
+    <Compile Include="Push\Generators\CodeGenerator\LinearCodeGenerator.cs" />
+    <Compile Include="Push\Generators\CodeGenerator\RecursiveCodeGenerator.cs" />
+    <Compile Include="Push\Individual\InduvidualMapper.cs" />
+    <Compile Include="Push\Interpreter\Extensions.cs" />
+    <Compile Include="Push\Interpreter\IInternalPushInterpreter.cs" />
+    <Compile Include="Push\Interpreter\InterpreterPoolContainer.cs" />
+    <Compile Include="Push\Interpreter\IPushInterpreter.cs" />
+    <Compile Include="Push\Configuration\IReadonlyPushConfiguration.cs" />
+    <Compile Include="Push\Interpreter\PooledPushInterpreter.cs" />
+    <Compile Include="Push\Interpreter\PushInterpreter.cs" />
+    <Compile Include="Push\Interpreter\PushInterpreterPool.cs" />
+    <Compile Include="Push\Manipulator\IPlushManipulator.cs" />
+    <Compile Include="Push\Manipulator\UniformMutation.cs" />
+    <Compile Include="Push\ObjectPools\Random\SeededRandomPool.cs" />
+    <Compile Include="Push\ObjectPools\StringBuilderPool.cs" />
+    <Compile Include="Push\Parser\PushParser.cs" />
+    <Compile Include="Push\Problem\BenchmarkSuite\PlushPushBenchmarkSuiteProblem.cs" />
+    <Compile Include="Push\Problem\PlushPushProblem.cs" />
+    <Compile Include="Push\Solution\IPushSolution.cs" />
+    <Compile Include="Push\Solution\BenchmarkSuite\PushBenchmarkSuiteSolution.cs" />
+    <Compile Include="Push\Problem\DataBounds.cs" />
+    <Compile Include="Push\Evaluator\EvaluationResult.cs" />
+    <Compile Include="Push\Individual\IndividualExtensions.cs" />
+    <Compile Include="Push\Evaluator\PushBenchmarkSuiteEvaluator.cs" />
+    <Compile Include="Push\Problem\BenchmarkSuite\IntegerVectorPushBenchmarkSuiteProblem.cs" />
+    <Compile Include="Push\Evaluator\IPushEvaluator.cs" />
+    <Compile Include="Push\Problem\IntegerVectorPushProblem.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Push\Problem\PushProblemBase.cs" />
+    <Compile Include="Push\Solution\PushSolution.cs" />
+    <Compile Include="Push\Data\Pool\PooledObject.cs" />
+    <Compile Include="Push\Selector\ICaseSingleObjectiveSelector.cs" />
+    <Compile Include="Push\Selector\LexicaseSelector.cs" />
+    <Compile Include="Push\Simplifier\Simplifier.cs" />
+    <Compile Include="Push\SolutionCreator\IPlushCreator.cs" />
+    <Compile Include="Push\SolutionCreator\PushSolutionCreator.cs" />
+    <Compile Include="Push\SolutionCreator\PushSolutionEncoding.cs" />
+    <Compile Include="Push\SolutionCreator\PlushCreator.cs" />
+    <Compile Include="Push\Stack\IPrintStack.cs" />
+    <Compile Include="Push\Stack\IPushStack.cs" />
+    <Compile Include="Push\Stack\IPushStackBase.cs" />
+    <Compile Include="Push\Stack\PrintStack.cs" />
+    <Compile Include="Push\Stack\PushStack.cs" />
+    <Compile Include="Push\Stack\InterpreterStackStringifier.cs" />
+    <Compile Include="Push\Stack\StackTypes.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="ExpressionsClassDiagramm.cd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="packages.config" />
+    <EmbeddedResource Include="Push\BenchmarkSuite\Data\BenchmarkExamples.zip" />
+    <None Include="Push\BenchmarkSuite\BenchmarkSuiteOverview.cd">
+      <SubType>Designer</SubType>
+    </None>
+  </ItemGroup>
+  <ItemGroup />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </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/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/HeuristicLab.Problems.ProgramSynthesis.csproj.user
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/HeuristicLab.Problems.ProgramSynthesis.csproj.user	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/HeuristicLab.Problems.ProgramSynthesis.csproj.user	(revision 15771)
@@ -0,0 +1,16 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectView>ProjectFiles</ProjectView>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
+    <StartAction>Program</StartAction>
+    <StartProgram>T:\BTSync\projects\svn\hl\trunk\sources\bin\HeuristicLab 3.3.exe</StartProgram>
+    <StartArguments>/hideStarter /start:Optimizer</StartArguments>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
+    <StartAction>Program</StartAction>
+    <StartProgram>T:\BTSync\projects\svn\hl\trunk\sources\bin\HeuristicLab 3.3.exe</StartProgram>
+    <StartArguments>/hideStarter /start:Optimizer</StartArguments>
+  </PropertyGroup>
+</Project>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Plugin.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Plugin.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Plugin.cs	(revision 15771)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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/>.
+ *
+ * Author: Patrik Kimmeswegner
+ */
+
+#endregion
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [Plugin("HeuristicLab.Problems.ProgramSynthesis", "")]
+  [PluginFile("HeuristicLab.Problems.ProgramSynthesis-1.0.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  [PluginDependency("HeuristicLab.Selection", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
+
+  public class Plugin : PluginBase {
+
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Properties/AssemblyInfo.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Properties/AssemblyInfo.cs	(revision 15771)
@@ -0,0 +1,36 @@
+﻿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.Problems.ProgramSynthesis")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.Problems.ProgramSynthesis")]
+[assembly: AssemblyCopyright("Copyright ©  2016")]
+[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("5c93448c-47e3-4c3f-b1d0-ee62a48c3204")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Properties/Resources.Designer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Properties/Resources.Designer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Properties/Resources.Designer.cs	(revision 15771)
@@ -0,0 +1,68 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Problems.ProgramSynthesis.Properties {
+  using System;
+
+
+  /// <summary>
+  ///   A strongly-typed resource class, for looking up localized strings, etc.
+  /// </summary>
+  // This class was auto-generated by the StronglyTypedResourceBuilder
+  // class via a tool like ResGen or Visual Studio.
+  // To add or remove a member, edit your .ResX file then rerun ResGen
+  // with the /str option, or rebuild your VS project.
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  internal class Resources {
+
+    private static global::System.Resources.ResourceManager resourceMan;
+
+    private static global::System.Globalization.CultureInfo resourceCulture;
+
+    [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+    internal Resources() {
+    }
+
+    /// <summary>
+    ///   Returns the cached ResourceManager instance used by this class.
+    /// </summary>
+    [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+    internal static global::System.Resources.ResourceManager ResourceManager
+    {
+      get
+      {
+        if (object.ReferenceEquals(resourceMan, null)) {
+          global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.Problems.ProgramSynthesis.Properties.Resources", typeof(Resources).Assembly);
+          resourceMan = temp;
+        }
+        return resourceMan;
+      }
+    }
+
+    /// <summary>
+    ///   Overrides the current thread's CurrentUICulture property for all
+    ///   resource lookups using this strongly typed resource class.
+    /// </summary>
+    [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+    internal static global::System.Globalization.CultureInfo Culture
+    {
+      get
+      {
+        return resourceCulture;
+      }
+      set
+      {
+        resourceCulture = value;
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Properties/Resources.resx
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Properties/Resources.resx	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Properties/Resources.resx	(revision 15771)
@@ -0,0 +1,120 @@
+﻿<?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:items>
+                <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:items>
+              <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:items>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:items>
+              <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>
+</root>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Boolean/BooleanErcOptions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Boolean/BooleanErcOptions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Boolean/BooleanErcOptions.cs	(revision 15771)
@@ -0,0 +1,25 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class BooleanErcOptions : ErcOption<bool> {
+
+    public BooleanErcOptions() { }
+    public BooleanErcOptions(params WeightedErcItem<bool>[] values) : base(true, values) { }
+    public BooleanErcOptions(bool isEnabled, params WeightedErcItem<bool>[] values) : base(isEnabled, values) { }
+
+    [StorableConstructor]
+    public BooleanErcOptions(bool deserializing) : base(deserializing) { }
+
+    public BooleanErcOptions(BooleanErcOptions origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BooleanErcOptions(this, cloner);
+    }
+
+    public override string ToString() {
+      return "Boolean";
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Boolean/BooleanRandomErc.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Boolean/BooleanRandomErc.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Boolean/BooleanRandomErc.cs	(revision 15771)
@@ -0,0 +1,70 @@
+﻿using System;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class BooleanRandomErc : WeightedErcItem<bool> {
+
+    private const string AllowTrueParameterName = "Allow true";
+    private const string AllowFalseParameterName = "Allow false";
+
+    public BooleanRandomErc() : this(true, true, true) { }
+
+    public BooleanRandomErc(bool isEnabled, bool allowTrue, bool allowFalse, double weight = 1d) : base(isEnabled, weight) {
+      if (!allowTrue && allowFalse) {
+        throw new InvalidOperationException("true and false values are disabled");
+      }
+
+      Name = "Boolean random";
+      Parameters.Add(new FixedValueParameter<BoolValue>(AllowTrueParameterName, new BoolValue(allowTrue)));
+      Parameters.Add(new FixedValueParameter<BoolValue>(AllowFalseParameterName, new BoolValue(allowFalse)));
+    }
+
+    [StorableConstructor]
+    public BooleanRandomErc(bool deserializing) : base(deserializing) { }
+
+    public BooleanRandomErc(BooleanRandomErc origin, Cloner cloner) : base(origin, cloner) {
+      AllowFalse = origin.AllowFalse;
+      AllowTrue = origin.AllowTrue;
+    }
+
+    public IValueParameter<BoolValue> AllowFalseParameter
+    {
+      get { return (IValueParameter<BoolValue>)Parameters[AllowFalseParameterName]; }
+    }
+
+    public bool AllowFalse
+    {
+      get { return AllowFalseParameter.Value.Value; }
+      set { AllowFalseParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<BoolValue> AllowTrueParameter
+    {
+      get { return (IValueParameter<BoolValue>)Parameters[AllowTrueParameterName]; }
+    }
+
+    public bool AllowTrue
+    {
+      get { return AllowTrueParameter.Value.Value; }
+      set { AllowTrueParameter.Value.Value = value; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BooleanRandomErc(this, cloner);
+    }
+
+    public override bool GetErcValue(IRandom random) {
+      if (!AllowTrue && !AllowFalse) throw new InvalidOperationException();
+      if (!AllowFalse) return true;
+      if (!AllowTrue) return false;
+
+      return random.NextDouble() >= 0.5;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Char/CharErcOptions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Char/CharErcOptions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Char/CharErcOptions.cs	(revision 15771)
@@ -0,0 +1,33 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+
+  using Common;
+  using Core;
+  using Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class CharErcOptions : ErcOptionConvertible<char, int> {
+    public CharErcOptions() { }
+
+    public CharErcOptions(params WeightedErcItem<int>[] values) : this(true, values) { }
+
+    public CharErcOptions(bool isEnabled, params WeightedErcItem<int>[] values) : base(isEnabled, values) { }
+
+    [StorableConstructor]
+    protected CharErcOptions(bool deserializing) : base(deserializing) { }
+
+    public CharErcOptions(CharErcOptions origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CharErcOptions(this, cloner);
+    }
+
+    public override char GetErcValue(IRandom random) {
+      return GetErcValue(random, Convert.ToChar);
+    }
+
+    public override string ToString() {
+      return "Char";
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/ConstantsErcValue.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/ConstantsErcValue.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/ConstantsErcValue.cs	(revision 15771)
@@ -0,0 +1,48 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public abstract class ConstantsWeightedErc<T, TArray> : WeightedErcItem<T>
+    where T : struct
+    where TArray : ValueTypeArray<T>, new() {
+
+    private const string ConstantsParameterName = "Constants";
+
+    protected ConstantsWeightedErc(TArray array) : this(true, array) { }
+    protected ConstantsWeightedErc(bool isEnabled, TArray array, double weight = 1d) : base(isEnabled, weight) {
+      Parameters.Add(new FixedValueParameter<TArray>(ConstantsParameterName, array));
+      array.ToStringChanged += (sender, args) => UpdateName();
+      UpdateName();
+    }
+
+    private void UpdateName() {
+      Name = Constants.ToString();
+    }
+
+    [StorableConstructor]
+    protected ConstantsWeightedErc(bool deserializing) : base(deserializing) { }
+
+    protected ConstantsWeightedErc(ConstantsWeightedErc<T, TArray> origin, Cloner cloner) : base(origin, cloner) { }
+
+    public IValueParameter<TArray> ConstantsParameter
+    {
+      get { return (IValueParameter<TArray>)Parameters[ConstantsParameterName]; }
+    }
+
+    public TArray Constants
+    {
+      get { return ConstantsParameter.Value; }
+    }
+
+    public override T GetErcValue(IRandom random) {
+      if (Constants.Length == 0) return default(T);
+
+      var x = random.Next(Constants.Length);
+      return Constants[x];
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/ErcOption.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/ErcOption.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/ErcOption.cs	(revision 15771)
@@ -0,0 +1,26 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public abstract class ErcOption<T> : ErcOptionConvertible<T, T> {
+    protected ErcOption() : this(false, new WeightedErcItem<T>[0]) { }
+
+    protected ErcOption(bool isEnabled, params WeightedErcItem<T>[] values)
+        : base(isEnabled, values) { }
+
+    [StorableConstructor]
+    protected ErcOption(bool deserializing)
+        : base(deserializing) {
+    }
+
+    protected ErcOption(ErcOptionConvertible<T, T> origin, Cloner cloner)
+        : base(origin, cloner) {
+    }
+
+    public override T GetErcValue(IRandom random) {
+      return GetErcValue(random, x => x);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/ErcOptionConvertible.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/ErcOptionConvertible.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/ErcOptionConvertible.cs	(revision 15771)
@@ -0,0 +1,99 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  public abstract class ErcOptionConvertible<TValue, TValueItem> : CheckedItemCollection<WeightedErcItem<TValueItem>>, IErcItem<TValue> {
+    [Storable]
+    protected bool isEnabled;
+
+    public event EventHandler<bool> EnabledChanged;
+
+    protected ErcOptionConvertible() : this(false, new WeightedErcItem<TValueItem>[0]) { }
+
+    protected ErcOptionConvertible(bool isEnabled, params WeightedErcItem<TValueItem>[] values) : base(values) {
+      this.isEnabled = isEnabled;
+      SetEnabledChangedHandler(values);
+
+      foreach (var value in values)
+        SetItemCheckedState(value, value.IsEnabled);
+    }
+
+    [StorableConstructor]
+    protected ErcOptionConvertible(bool deserializing)
+      : base(deserializing) {
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    // ReSharper disable once UnusedMember.Local
+    private void AfterDeserialization() {
+      SetEnabledChangedHandler(list);
+    }
+
+    protected ErcOptionConvertible(ErcOptionConvertible<TValue, TValueItem> origin, Cloner cloner)
+      : base(origin, cloner) {
+      IsEnabled = origin.IsEnabled;
+    }
+
+    private void SetEnabledChangedHandler(IEnumerable<WeightedErcItem<TValueItem>> values) {
+      foreach (var item in values)
+        item.EnabledChanged += ErcValueItemEnabledChanged;
+    }
+
+    protected override void OnItemsAdded(IEnumerable<WeightedErcItem<TValueItem>> items) {
+      base.OnItemsAdded(items);
+      SetEnabledChangedHandler(items);
+    }
+
+    protected override void OnItemsRemoved(IEnumerable<WeightedErcItem<TValueItem>> items) {
+      base.OnItemsRemoved(items);
+
+      foreach (var item in items)
+        item.EnabledChanged -= ErcValueItemEnabledChanged;
+    }
+
+    private void ErcValueItemEnabledChanged(object sender, bool state) {
+      SetItemCheckedState((WeightedErcItem<TValueItem>)sender, state);
+    }
+
+    protected override void OnCheckedItemsChanged(IEnumerable<WeightedErcItem<TValueItem>> items) {
+      base.OnCheckedItemsChanged(items);
+
+      foreach (var item in items) {
+        item.IsEnabled = ItemChecked(item);
+      }
+    }
+
+    public bool IsEnabled {
+      get { return isEnabled; }
+      set {
+        if (value == isEnabled)
+          return;
+
+        isEnabled = value;
+
+        if (EnabledChanged != null)
+          EnabledChanged(this, value);
+      }
+    }
+
+    public abstract TValue GetErcValue(IRandom random);
+
+    protected TValue GetErcValue(IRandom random, Converter<TValueItem, TValue> converter) {
+      if (Count == 0 || !IsEnabled) return default(TValue);
+
+      var ercValueItem = list
+        .Where(item => item.IsEnabled)
+        .RandomWeightedOrDefault(random, x => x.Weight);
+
+      return ercValueItem == null
+        ? default(TValue)
+        : converter(ercValueItem.GetErcValue(random));
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/ErcOptions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/ErcOptions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/ErcOptions.cs	(revision 15771)
@@ -0,0 +1,149 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  public class ErcOptions : NamedItem, IReadOnlyErcOptions {
+
+    public ErcOptions() {
+      Name = "ERC Options";
+
+      ErcProbability = 0d;
+      IntegerErcOptions = new IntegerErcOptions();
+      FloatErcOptions = new FloatErcOptions();
+      BooleanErcOptions = new BooleanErcOptions();
+      CharErcOptions = new CharErcOptions();
+      StringErcOptions = new StringErcOptions();
+      NameErcOptions = new NameErcOptions();
+      IntegerVectorErcOptions = new IntegerVectorErcOptions();
+      StringVectorErcOptions = new StringVectorErcOptions();
+      FloatVectorErcOptions = new FloatVectorErcOptions();
+    }
+
+    [StorableConstructor]
+    protected ErcOptions(bool deserializing)
+      : base(deserializing) {
+    }
+
+    public ErcOptions(ErcOptions origin, Cloner cloner)
+      : base(origin, cloner) {
+      ErcProbability = origin.ErcProbability;
+      IntegerErcOptions = cloner.Clone(origin.IntegerErcOptions);
+      FloatErcOptions = cloner.Clone(origin.FloatErcOptions);
+      BooleanErcOptions = cloner.Clone(origin.BooleanErcOptions);
+      CharErcOptions = cloner.Clone(origin.CharErcOptions);
+      StringErcOptions = cloner.Clone(origin.StringErcOptions);
+      NameErcOptions = cloner.Clone(origin.NameErcOptions);
+      IntegerVectorErcOptions = cloner.Clone(origin.IntegerVectorErcOptions);
+      StringVectorErcOptions = cloner.Clone(origin.StringVectorErcOptions);
+      FloatVectorErcOptions = cloner.Clone(origin.FloatVectorErcOptions);
+    }
+
+    [Storable]
+    public double ErcProbability { get; set; }
+
+
+    [Storable]
+    public IntegerErcOptions IntegerErcOptions { get; set; }
+    [Storable]
+    public FloatErcOptions FloatErcOptions { get; set; }
+
+    /// <summary>
+    ///   Integer represents ASCII value
+    /// </summary>
+    [Storable]
+    public CharErcOptions CharErcOptions { get; set; }
+    [Storable]
+    public BooleanErcOptions BooleanErcOptions { get; set; }
+    [Storable]
+    public StringErcOptions StringErcOptions { get; set; }
+    [Storable]
+    public NameErcOptions NameErcOptions { get; set; }
+    [Storable]
+    public IntegerVectorErcOptions IntegerVectorErcOptions { get; set; }
+    [Storable]
+    public StringVectorErcOptions StringVectorErcOptions { get; set; }
+    [Storable]
+    public FloatVectorErcOptions FloatVectorErcOptions { get; set; }
+
+    IErcItem<int> IReadOnlyErcOptions.IntegerErcOptions {
+      get {
+        return IntegerErcOptions;
+      }
+    }
+
+    IErcItem<double> IReadOnlyErcOptions.FloatErcOptions {
+      get {
+        return FloatErcOptions;
+      }
+    }
+
+    IErcItem<bool> IReadOnlyErcOptions.BooleanErcOptions {
+      get {
+        return BooleanErcOptions;
+      }
+    }
+
+    IErcItem<char> IReadOnlyErcOptions.CharErcOptions {
+      get {
+        return CharErcOptions;
+      }
+    }
+
+    IErcItem<string> IReadOnlyErcOptions.StringErcOptions {
+      get {
+        return StringErcOptions;
+      }
+    }
+
+    IErcItem<string> IReadOnlyErcOptions.NameErcOptions {
+      get {
+        return NameErcOptions;
+      }
+    }
+
+    IErcItem<IReadOnlyList<int>> IReadOnlyErcOptions.IntegerVectorErcOptions {
+      get {
+        return IntegerVectorErcOptions;
+      }
+    }
+
+    IErcItem<IReadOnlyList<double>> IReadOnlyErcOptions.FloatVectorErcOptions {
+      get {
+        return FloatVectorErcOptions;
+      }
+    }
+
+    IErcItem<IReadOnlyList<string>> IReadOnlyErcOptions.StringVectorErcOptions {
+      get {
+        return StringVectorErcOptions;
+      }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ErcOptions(this, cloner);
+    }
+
+    public void DisableAllOptions() {
+      SetOptionsState(false);
+    }
+
+    public void EnableAllOptions() {
+      SetOptionsState(true);
+    }
+
+    public void SetOptionsState(bool state) {
+      IntegerErcOptions.IsEnabled = state;
+      FloatErcOptions.IsEnabled = state;
+      CharErcOptions.IsEnabled = state;
+      BooleanErcOptions.IsEnabled = state;
+      StringErcOptions.IsEnabled = state;
+      NameErcOptions.IsEnabled = state;
+      IntegerVectorErcOptions.IsEnabled = state;
+      FloatVectorErcOptions.IsEnabled = state;
+      StringVectorErcOptions.IsEnabled = state;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Float/FloatConstantErc.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Float/FloatConstantErc.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Float/FloatConstantErc.cs	(revision 15771)
@@ -0,0 +1,27 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using Common;
+  using Data;
+  using Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class FloatConstantErc : ConstantsWeightedErc<double, DoubleArray> {
+
+    public FloatConstantErc() : this(true, 1d) { }
+
+    public FloatConstantErc(params double[] constants) : this(true, 1d, constants) { }
+
+    public FloatConstantErc(bool isEnabled, double weight = 1d, params double[] constants)
+      : base(isEnabled, new DoubleArray(constants), weight) {
+    }
+
+    [StorableConstructor]
+    public FloatConstantErc(bool deserializing) : base(deserializing) { }
+
+    public FloatConstantErc(FloatConstantErc origin, Cloner cloner) : base(origin, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FloatConstantErc(this, cloner);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Float/FloatErcOptions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Float/FloatErcOptions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Float/FloatErcOptions.cs	(revision 15771)
@@ -0,0 +1,27 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class FloatErcOptions : ErcOption<double> {
+
+    public FloatErcOptions() { }
+
+    public FloatErcOptions(params WeightedErcItem<double>[] values) : base(true, values) { }
+
+    public FloatErcOptions(bool isEnabled, params WeightedErcItem<double>[] values) : base(isEnabled, values) { }
+
+    [StorableConstructor]
+    public FloatErcOptions(bool deserializing) : base(deserializing) { }
+
+    public FloatErcOptions(FloatErcOptions origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FloatErcOptions(this, cloner);
+    }
+
+    public override string ToString() {
+      return "Float";
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Float/FloatRangeErc.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Float/FloatRangeErc.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Float/FloatRangeErc.cs	(revision 15771)
@@ -0,0 +1,56 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class FloatRangeErc : WeightedErcItem<double> {
+    private const string RangeParameterName = "Range";
+
+    public FloatRangeErc() : this(true, 0d, 0d) { }
+
+    public FloatRangeErc(double start, double end) : this(true, start, end) { }
+
+    public FloatRangeErc(bool isEnabled, double start, double end, double weight = 1d) : base(isEnabled, weight) {
+      Parameters.Add(new FixedValueParameter<DoubleRange>(RangeParameterName, new DoubleRange(start, end)));
+      RangeParameter.Value.ToStringChanged += (sender, args) => UpdateName();
+      UpdateName();
+    }
+
+    private void UpdateName() {
+      Name = RangeParameter.Value.ToString();
+    }
+
+    [StorableConstructor]
+    public FloatRangeErc(bool deseralizing) : base(deseralizing) { }
+
+    public FloatRangeErc(FloatRangeErc origin, Cloner cloner) : base(origin, cloner) { }
+
+    public IValueParameter<DoubleRange> RangeParameter
+    {
+      get { return (IValueParameter<DoubleRange>)Parameters[RangeParameterName]; }
+    }
+
+    public double Start
+    {
+      get { return RangeParameter.Value.Start; }
+      set { RangeParameter.Value.Start = value; }
+    }
+
+    public double End
+    {
+      get { return RangeParameter.Value.End; }
+      set { RangeParameter.Value.End = value; }
+    }
+
+    public override double GetErcValue(IRandom random) {
+      return Start < End && IsEnabled ? random.NextDouble() * (End - Start) + Start : 0d;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FloatRangeErc(this, cloner);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/FloatVector/FloatVectorConstantsErc.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/FloatVector/FloatVectorConstantsErc.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/FloatVector/FloatVectorConstantsErc.cs	(revision 15771)
@@ -0,0 +1,34 @@
+﻿using System.Linq;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Data;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class FloatVectorConstantsErc : VectorConstantsErc<double, DoubleArray> {
+    public FloatVectorConstantsErc() : this(new double[0][]) { }
+
+    public FloatVectorConstantsErc(params double[][] values)
+      : this(true, 1d, values) {
+    }
+
+    public FloatVectorConstantsErc(bool isEnabled, double weight = 1d, params double[][] values)
+      : base(isEnabled, weight, values.Select(v => new DoubleArray(v)).ToArray()) {
+      Name = "Float vector constants";
+    }
+
+    [StorableConstructor]
+    protected FloatVectorConstantsErc(bool deserializing)
+      : base(deserializing) {
+    }
+
+    public FloatVectorConstantsErc(FloatVectorConstantsErc origin, Cloner cloner)
+      : base(origin, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FloatVectorConstantsErc(this, cloner);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/FloatVector/FloatVectorErcOptions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/FloatVector/FloatVectorErcOptions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/FloatVector/FloatVectorErcOptions.cs	(revision 15771)
@@ -0,0 +1,27 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Collections.Generic;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class FloatVectorErcOptions : ErcOption<IReadOnlyList<double>> {
+    public FloatVectorErcOptions() { }
+    public FloatVectorErcOptions(params WeightedErcItem<IReadOnlyList<double>>[] values) : base(true, values) { }
+
+    public FloatVectorErcOptions(bool isEnabled, params WeightedErcItem<IReadOnlyList<double>>[] values) : base(isEnabled, values) { }
+
+    [StorableConstructor]
+    protected FloatVectorErcOptions(bool deserializing) : base(deserializing) { }
+
+    public FloatVectorErcOptions(FloatVectorErcOptions origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FloatVectorErcOptions(this, cloner);
+    }
+
+    public override string ToString() {
+      return "FloatVector";
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/IErcItem.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/IErcItem.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/IErcItem.cs	(revision 15771)
@@ -0,0 +1,17 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+  using Core;
+
+  public interface IErcItem : IItem {
+    event EventHandler<bool> EnabledChanged;
+    bool IsEnabled { get; set; }
+  }
+
+  public interface IErcItem<out T> : IErcItem {
+    T GetErcValue(IRandom random);
+  }
+
+  public interface IWeightedErcItem : IErcItem, IWeighted { }
+
+  public interface IWeightedErcItem<out T> : IErcItem<T>, IWeightedErcItem { }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/IReadOnlyErcOptions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/IReadOnlyErcOptions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/IReadOnlyErcOptions.cs	(revision 15771)
@@ -0,0 +1,18 @@
+﻿using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Core;
+
+  public interface IReadOnlyErcOptions : IItem {
+    double ErcProbability { get; }
+    IErcItem<int> IntegerErcOptions { get; }
+    IErcItem<double> FloatErcOptions { get; }
+    IErcItem<bool> BooleanErcOptions { get; }
+    IErcItem<char> CharErcOptions { get; }
+    IErcItem<string> StringErcOptions { get; }
+    IErcItem<string> NameErcOptions { get; }
+    IErcItem<IReadOnlyList<int>> IntegerVectorErcOptions { get; }
+    IErcItem<IReadOnlyList<double>> FloatVectorErcOptions { get; }
+    IErcItem<IReadOnlyList<string>> StringVectorErcOptions { get; }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Integer/IntegerConstantErc.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Integer/IntegerConstantErc.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Integer/IntegerConstantErc.cs	(revision 15771)
@@ -0,0 +1,26 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using Common;
+  using Data;
+  using Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class IntegerConstantErc : ConstantsWeightedErc<int, IntArray> {
+
+    public IntegerConstantErc() : this(true, 1d) { }
+
+    public IntegerConstantErc(params int[] constants) : this(true, 1d, constants) { }
+
+    public IntegerConstantErc(bool isEnabled, double weight = 1d, params int[] constants)
+      : base(isEnabled, new IntArray(constants), weight) {
+    }
+
+    [StorableConstructor]
+    public IntegerConstantErc(bool deserializing) : base(deserializing) { }
+
+    public IntegerConstantErc(IntegerConstantErc origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntegerConstantErc(this, cloner);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Integer/IntegerErcOptions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Integer/IntegerErcOptions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Integer/IntegerErcOptions.cs	(revision 15771)
@@ -0,0 +1,23 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class IntegerErcOptions : ErcOption<int> {
+    public IntegerErcOptions() { }
+    public IntegerErcOptions(params WeightedErcItem<int>[] values) : base(true, values) { }
+    public IntegerErcOptions(bool isEnabled, params WeightedErcItem<int>[] values) : base(isEnabled, values) { }
+
+    [StorableConstructor]
+    protected IntegerErcOptions(bool deserializing) : base(deserializing) { }
+
+    public IntegerErcOptions(IntegerErcOptions origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntegerErcOptions(this, cloner);
+    }
+    public override string ToString() {
+      return "Integer";
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Integer/IntegerRangeErc.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Integer/IntegerRangeErc.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Integer/IntegerRangeErc.cs	(revision 15771)
@@ -0,0 +1,57 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class IntegerRangeErc : WeightedErcItem<int> {
+    private const string RangeParameterName = "Range";
+
+    public IntegerRangeErc() : this(true, 0, 0) { }
+
+    public IntegerRangeErc(int start, int end) : this(true, start, end) { }
+
+    public IntegerRangeErc(bool isEnabled, int start, int end, double weight = 1d) : base(isEnabled, weight) {
+      Parameters.Add(new FixedValueParameter<IntRange>(RangeParameterName, new IntRange(start, end)));
+      RangeParameter.Value.ToStringChanged += (sender, args) => UpdateName();
+      UpdateName();
+    }
+
+    private void UpdateName() {
+      Name = RangeParameter.Value.ToString();
+    }
+
+    [StorableConstructor]
+    protected IntegerRangeErc(bool deseralizing) : base(deseralizing) { }
+
+    public IntegerRangeErc(IntegerRangeErc origin, Cloner cloner) : base(origin, cloner) { }
+
+    public IValueParameter<IntRange> RangeParameter
+    {
+      get { return (IValueParameter<IntRange>)Parameters[RangeParameterName]; }
+    }
+
+    public int Start
+    {
+      get { return RangeParameter.Value.Start; }
+      set { RangeParameter.Value.Start = value; }
+    }
+
+    public int End
+    {
+      get { return RangeParameter.Value.End; }
+      set { RangeParameter.Value.End = value; }
+    }
+
+    public override int GetErcValue(IRandom random) {
+
+      return Start < End ? random.Next(Start, End) : 0;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntegerRangeErc(this, cloner);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/IntegerVector/IntegerVectorConstantsErc.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/IntegerVector/IntegerVectorConstantsErc.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/IntegerVector/IntegerVectorConstantsErc.cs	(revision 15771)
@@ -0,0 +1,32 @@
+﻿using System.Linq;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Data;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class IntegerVectorConstantsErc : VectorConstantsErc<int, IntArray> {
+    public IntegerVectorConstantsErc() : this(new int[0][]) { }
+
+    public IntegerVectorConstantsErc(params int[][] values) : this(true, 1d, values) { }
+
+    public IntegerVectorConstantsErc(bool isEnabled, double weight = 1d, params int[][] values)
+      : base(isEnabled, weight, values.Select(v => new IntArray(v)).ToArray()) {
+      Name = "Integer vector constants";
+    }
+
+    [StorableConstructor]
+    protected IntegerVectorConstantsErc(bool deserializing)
+      : base(deserializing) {
+    }
+
+    public IntegerVectorConstantsErc(IntegerVectorConstantsErc origin, Cloner cloner)
+      : base(origin, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntegerVectorConstantsErc(this, cloner);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/IntegerVector/IntegerVectorErcOptions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/IntegerVector/IntegerVectorErcOptions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/IntegerVector/IntegerVectorErcOptions.cs	(revision 15771)
@@ -0,0 +1,27 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Collections.Generic;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class IntegerVectorErcOptions : ErcOption<IReadOnlyList<int>> {
+    public IntegerVectorErcOptions() { }
+    public IntegerVectorErcOptions(params WeightedErcItem<IReadOnlyList<int>>[] values) : base(true, values) { }
+
+    public IntegerVectorErcOptions(bool isEnabled, params WeightedErcItem<IReadOnlyList<int>>[] values) : base(isEnabled, values) { }
+
+    [StorableConstructor]
+    protected IntegerVectorErcOptions(bool deserializing) : base(deserializing) { }
+
+    public IntegerVectorErcOptions(IntegerVectorErcOptions origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntegerVectorErcOptions(this, cloner);
+    }
+
+    public override string ToString() {
+      return "IntegerVector";
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Name/NameErcOptions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Name/NameErcOptions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/Name/NameErcOptions.cs	(revision 15771)
@@ -0,0 +1,24 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using Common;
+  using Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class NameErcOptions : ErcOption<string> {
+    public NameErcOptions() { }
+    public NameErcOptions(params WeightedErcItem<string>[] values) : base(true, values) { }
+    public NameErcOptions(bool isEnabled, params WeightedErcItem<string>[] values) : base(isEnabled, values) { }
+
+    [StorableConstructor]
+    public NameErcOptions(bool deserializing) : base(deserializing) { }
+
+    public NameErcOptions(NameErcOptions origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NameErcOptions(this, cloner);
+    }
+
+    public override string ToString() {
+      return "Name";
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/String/StringConstantErc.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/String/StringConstantErc.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/String/StringConstantErc.cs	(revision 15771)
@@ -0,0 +1,55 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class StringConstantErc : WeightedErcItem<string> {
+
+    private const string ConstantsParameterName = "Constants";
+
+    public StringConstantErc() : this(true, 1d) { }
+
+    public StringConstantErc(params string[] constants) : this(true, 1d, constants) { }
+
+    public StringConstantErc(bool isEnabled, double weight = 1d, params string[] constants) : base(isEnabled, weight) {
+      Parameters.Add(new FixedValueParameter<StringArray>(ConstantsParameterName, new StringArray(constants)));
+      Constants.ToStringChanged += (sender, args) => UpdateName();
+      UpdateName();
+    }
+    private void UpdateName() {
+      Name = Constants.ToString();
+    }
+
+    [StorableConstructor]
+    public StringConstantErc(bool deserializing) : base(deserializing) {
+    }
+
+    public StringConstantErc(StringConstantErc origin, Cloner cloner) : base(origin, cloner) {
+    }
+
+    public IValueParameter<StringArray> ConstantsParameter
+    {
+      get { return (IValueParameter<StringArray>)Parameters[ConstantsParameterName]; }
+    }
+
+    public StringArray Constants
+    {
+      get { return ConstantsParameter.Value; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StringConstantErc(this, cloner);
+    }
+
+    public override string GetErcValue(IRandom random) {
+      if (Constants.Length == 0) return string.Empty;
+
+      var x = random.Next(Constants.Length);
+      return Constants[x];
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/String/StringErcOptions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/String/StringErcOptions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/String/StringErcOptions.cs	(revision 15771)
@@ -0,0 +1,25 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class StringErcOptions : ErcOption<string> {
+    public StringErcOptions() { }
+    public StringErcOptions(params WeightedErcItem<string>[] values) : base(true, values) { }
+    public StringErcOptions(bool isEnabled, params WeightedErcItem<string>[] values) : base(isEnabled, values) { }
+
+    [StorableConstructor]
+    public StringErcOptions(bool deserializing) : base(deserializing) { }
+
+    public StringErcOptions(StringErcOptions origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StringErcOptions(this, cloner);
+    }
+
+    public override string ToString() {
+      return "String";
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/String/StringRandomErc.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/String/StringRandomErc.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/String/StringRandomErc.cs	(revision 15771)
@@ -0,0 +1,152 @@
+﻿using System.Collections.Generic;
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  public class StringRandomErc : WeightedErcItem<string> {
+    private readonly List<string> generatedValues = new List<string>();
+
+    public const int DefaultStringLength = 10;
+
+    private const string AllowLowercaseLettersParameterName = "Allow lowercase letters";
+    private const string AllowUppercaseLettersParameterName = "Allow uppercase letters";
+    private const string AllowSpaceParameterName = "Allow space";
+    private const string SpaceProbabilityParameterName = "Space probability";
+    private const string StringLengthParameterName = "String length";
+    private const string AllowDigitsParameterName = "Allow digits";
+    private const string AllowSymbolsParameterName = "Allow symbols";
+    private const string VowelProbabilityParameterName = "Vowel probability";
+
+    private const string NewStringProbabilityParameterName = "New string probability";
+    private const string NewStringProbabilityParameterDescription = "The probability that the selection of the ephemeral random string constant for inclusion in randomly generated code will produce a new string (rather than a string that was previously generated).";
+
+    public StringRandomErc() : this(true, 1d) { }
+
+    public StringRandomErc(bool isEnabled, double weight = 1d) : base(isEnabled, weight) {
+      Name = "String random";
+      Parameters.Add(new FixedValueParameter<BoolValue>(AllowLowercaseLettersParameterName, new BoolValue(true)));
+      Parameters.Add(new FixedValueParameter<BoolValue>(AllowUppercaseLettersParameterName, new BoolValue(true)));
+      Parameters.Add(new FixedValueParameter<BoolValue>(AllowDigitsParameterName, new BoolValue(true)));
+      Parameters.Add(new FixedValueParameter<BoolValue>(AllowSymbolsParameterName, new BoolValue(true)));
+      Parameters.Add(new FixedValueParameter<BoolValue>(AllowSpaceParameterName, new BoolValue(false)));
+      Parameters.Add(new FixedValueParameter<IntValue>(StringLengthParameterName, new IntValue(DefaultStringLength)));
+      Parameters.Add(new FixedValueParameter<PercentValue>(SpaceProbabilityParameterName));
+      Parameters.Add(new FixedValueParameter<PercentValue>(VowelProbabilityParameterName));
+      Parameters.Add(new FixedValueParameter<PercentValue>(NewStringProbabilityParameterName, NewStringProbabilityParameterDescription));
+    }
+
+    [StorableConstructor]
+    public StringRandomErc(bool deserializing) : base(deserializing) { }
+
+    public StringRandomErc(StringRandomErc origin, Cloner cloner) : base(origin, cloner) {
+    }
+
+    public override string GetErcValue(IRandom random) {
+      if (random.NextDouble() < NewStringProbability || generatedValues.Count == 0) {
+        var value = StringGenerator.RandomString(
+          AllowLowercaseLetters,
+          AllowUppercaseLetters,
+          AllowSpace,
+          SpaceProbability,
+          StringLength,
+          random);
+
+        generatedValues.Add(value);
+        return value;
+      }
+
+      var idx = random.Next(generatedValues.Count);
+      return generatedValues[idx];
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StringRandomErc(this, cloner);
+    }
+
+    public IValueParameter<BoolValue> AllowLowercaseLettersParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[AllowLowercaseLettersParameterName]; }
+    }
+
+    public bool AllowLowercaseLetters {
+      get { return AllowLowercaseLettersParameter.Value.Value; }
+      set { AllowLowercaseLettersParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<BoolValue> AllowUppercaseLettersParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[AllowUppercaseLettersParameterName]; }
+    }
+
+    public bool AllowUppercaseLetters {
+      get { return AllowUppercaseLettersParameter.Value.Value; }
+      set { AllowUppercaseLettersParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<BoolValue> AllowDigitsParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[AllowDigitsParameterName]; }
+    }
+
+    public bool AllowDigits {
+      get { return AllowDigitsParameter.Value.Value; }
+      set { AllowDigitsParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<BoolValue> AllowSymbolsParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[AllowSymbolsParameterName]; }
+    }
+
+    public bool AllowSymbols {
+      get { return AllowSymbolsParameter.Value.Value; }
+      set { AllowSymbolsParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<BoolValue> AllowSpaceParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[AllowSpaceParameterName]; }
+    }
+
+    public bool AllowSpace {
+      get { return AllowSpaceParameter.Value.Value; }
+      set { AllowSpaceParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<PercentValue> SpaceProbabilityParameter {
+      get { return (IValueParameter<PercentValue>)Parameters[SpaceProbabilityParameterName]; }
+    }
+
+    public double SpaceProbability {
+      get { return SpaceProbabilityParameter.Value.Value; }
+      set { SpaceProbabilityParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<PercentValue> VowelProbabilityParameter {
+      get { return (IValueParameter<PercentValue>)Parameters[VowelProbabilityParameterName]; }
+    }
+
+    public double VowelProbability {
+      get { return VowelProbabilityParameter.Value.Value; }
+      set { VowelProbabilityParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<IntValue> StringLengthParameter {
+      get { return (IValueParameter<IntValue>)Parameters[StringLengthParameterName]; }
+    }
+
+    public IValueParameter<PercentValue> NewStringProbabilityParameter {
+      get { return (IValueParameter<PercentValue>)Parameters[NewStringProbabilityParameterName]; }
+    }
+
+    public double NewStringProbability {
+      get { return NewStringProbabilityParameter.Value.Value; }
+      set { NewStringProbabilityParameter.Value.Value = value; }
+    }
+
+    public int StringLength {
+      get { return StringLengthParameter.Value.Value; }
+      set { StringLengthParameter.Value.Value = value; }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/StringVector/StringVectorConstantsErc.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/StringVector/StringVectorConstantsErc.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/StringVector/StringVectorConstantsErc.cs	(revision 15771)
@@ -0,0 +1,51 @@
+﻿using System.Linq;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Collections.Generic;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+  using HeuristicLab.Random;
+
+  [StorableClass]
+  public class StringVectorConstantsErc : WeightedErcItem<IReadOnlyList<string>> {
+    private const string ConstantsParameterName = "Constants";
+
+    public StringVectorConstantsErc() : this(true, 1d) { }
+    public StringVectorConstantsErc(params string[][] arrays) : this(true, 1d, arrays.Select(x => new StringArray(x)).ToArray()) { }
+    public StringVectorConstantsErc(params StringArray[] arrays) : this(true, 1d, arrays) { }
+
+    public StringVectorConstantsErc(bool isEnabled, double weight = 1d, params StringArray[] arrays) : base(isEnabled, weight) {
+      Name = "String vector constants";
+      IsEnabled = isEnabled;
+      Parameters.Add(new ValueParameter<ItemCollection<StringArray>>(ConstantsParameterName, new ItemCollection<StringArray>(arrays)));
+    }
+
+    [StorableConstructor]
+    protected StringVectorConstantsErc(bool deserializing) : base(deserializing) { }
+
+    public StringVectorConstantsErc(StringVectorConstantsErc origin, Cloner cloner) : base(origin, cloner) { }
+
+    public IValueParameter<ItemCollection<StringArray>> ConstantsParameter
+    {
+      get { return (IValueParameter<ItemCollection<StringArray>>)Parameters[ConstantsParameterName]; }
+    }
+
+    public IEnumerable<StringArray> Constants
+    {
+      get { return ConstantsParameter.Value; }
+    }
+
+    public override IReadOnlyList<string> GetErcValue(IRandom random) {
+      // TODO: remove ToArray when ValueTypeArray implements IReadOnlyList
+      return Constants.SampleRandom(random).ToArray();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StringVectorConstantsErc(this, cloner);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/StringVector/StringVectorErcOptions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/StringVector/StringVectorErcOptions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/StringVector/StringVectorErcOptions.cs	(revision 15771)
@@ -0,0 +1,27 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Collections.Generic;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class StringVectorErcOptions : ErcOption<IReadOnlyList<string>> {
+    public StringVectorErcOptions() { }
+    public StringVectorErcOptions(params WeightedErcItem<IReadOnlyList<string>>[] values) : base(true, values) { }
+
+    public StringVectorErcOptions(bool isEnabled, params WeightedErcItem<IReadOnlyList<string>>[] values) : base(isEnabled, values) { }
+
+    [StorableConstructor]
+    protected StringVectorErcOptions(bool deserializing) : base(deserializing) { }
+
+    public StringVectorErcOptions(StringVectorErcOptions origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StringVectorErcOptions(this, cloner);
+    }
+
+    public override string ToString() {
+      return "StringVector";
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/VectorConstantsErc.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/VectorConstantsErc.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/VectorConstantsErc.cs	(revision 15771)
@@ -0,0 +1,44 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Collections.Generic;
+  using System.Linq;
+  using Common;
+  using Core;
+  using Data;
+  using Parameters;
+  using Persistence.Default.CompositeSerializers.Storable;
+  using Random;
+
+  [StorableClass]
+  public abstract class VectorConstantsErc<T, TValue> : WeightedErcItem<IReadOnlyList<T>>
+    where T : struct
+    where TValue : ValueTypeArray<T> {
+    private const string ConstantsParameterName = "Constants";
+
+    protected VectorConstantsErc(params TValue[] arrays) : this(true, 1d, arrays) { }
+
+    protected VectorConstantsErc(bool isEnabled, double weight = 1d, params TValue[] arrays) : base(isEnabled, weight) {
+      IsEnabled = isEnabled;
+      Parameters.Add(new ValueParameter<ItemCollection<TValue>>(ConstantsParameterName, new ItemCollection<TValue>(arrays)));
+    }
+
+    [StorableConstructor]
+    private VectorConstantsErc(bool deserializing) : base(deserializing) { }
+
+    protected VectorConstantsErc(VectorConstantsErc<T, TValue> origin, Cloner cloner) : base(origin, cloner) { }
+
+    public IValueParameter<ItemCollection<TValue>> ConstantsParameter
+    {
+      get { return (IValueParameter<ItemCollection<TValue>>)Parameters[ConstantsParameterName]; }
+    }
+
+    public IEnumerable<TValue> Constants
+    {
+      get { return ConstantsParameter.Value; }
+    }
+
+    public override IReadOnlyList<T> GetErcValue(IRandom random) {
+      // TODO: remove ToList when ValueTypeArray implements IReadOnlyList
+      return Constants.SampleRandom(random).ToArray();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/WeightedErcItem.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/WeightedErcItem.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Erc/WeightedErcItem.cs	(revision 15771)
@@ -0,0 +1,62 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public abstract class WeightedErcItem<T> : ParameterizedNamedItem, IWeightedErcItem<T> {
+    private const string WeightParameterName = "Weight";
+
+    [Storable]
+    protected bool isEnabled;
+
+    public event EventHandler<bool> EnabledChanged;
+
+    protected WeightedErcItem() : this(false, 1d) { }
+
+    protected WeightedErcItem(bool isEnabled, double weigth) {
+      this.isEnabled = isEnabled;
+      Parameters.Add(new FixedValueParameter<DoubleValue>(WeightParameterName, new DoubleValue(weigth)));
+    }
+
+    [StorableConstructor]
+    protected WeightedErcItem(bool deserializing) : base(deserializing) { }
+
+    protected WeightedErcItem(WeightedErcItem<T> origin, Cloner cloner)
+      : base(origin, cloner) {
+      isEnabled = origin.IsEnabled;
+    }
+
+    public IValueParameter<DoubleValue> WeightParameter
+    {
+      get { return (IValueParameter<DoubleValue>)Parameters[WeightParameterName]; }
+    }
+
+    public double Weight
+    {
+      get { return WeightParameter.Value.Value; }
+      set { WeightParameter.Value.Value = value; }
+    }
+
+    public bool IsEnabled
+    {
+      get { return isEnabled; }
+      set
+      {
+        if (value == isEnabled)
+          return;
+
+        isEnabled = value;
+
+        if (EnabledChanged != null)
+          EnabledChanged(this, value);
+      }
+    }
+
+    public abstract T GetErcValue(IRandom random);
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/EnumerableExtensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/EnumerableExtensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/EnumerableExtensions.cs	(revision 15771)
@@ -0,0 +1,29 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+  using System.Collections.Generic;
+  using System.Linq;
+
+  using HeuristicLab.Core;
+  using HeuristicLab.Random;
+
+  public static class EnumerableExtensions {
+    public static T RandomWeightedOrDefault<T>(this IEnumerable<T> items, IRandom random, Func<T, double> weightResolver) {
+      random = random ?? new MersenneTwister();
+      var totalWeight = items.Sum(weightResolver);
+
+      // The weight we are after...
+      var itemWeightIndex = random.NextDouble() * totalWeight;
+      var currentWeightIndex = 0d;
+
+      foreach (var item in items) {
+        currentWeightIndex += weightResolver(item);
+
+        // If we've hit or passed the weight we are after for this item then it's the one we want....
+        if (currentWeightIndex >= itemWeightIndex)
+          return item;
+      }
+
+      return default(T);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/MathExtensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/MathExtensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/MathExtensions.cs	(revision 15771)
@@ -0,0 +1,43 @@
+﻿using System;
+// ReSharper disable CompareOfFloatsByEqualityOperator
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public static class MathExtensions {
+
+    public static long AbsoluteDiff(this long a, long b) {
+      var diff = a - b;
+
+      return diff == long.MinValue
+        ? long.MaxValue
+        : Math.Abs(diff);
+    }
+
+    public static long AbsoluteDiff(this int a, long b) {
+      return AbsoluteDiff((long)a, b);
+    }
+
+    public static int AbsoluteDiff(this int a, int b) {
+      var diff = a - b;
+
+      return diff == int.MinValue
+        ? int.MaxValue
+        : Math.Abs(diff);
+    }
+
+    public static double AbsoluteDiff(this double a, double b) {
+      var diff = a - b;
+
+      return diff == double.MinValue || double.IsNaN(diff) || double.IsInfinity(diff)
+        ? double.MaxValue
+        : Math.Abs(diff);
+    }
+
+    public static int AbsoluteDiff(this char a, char b) {
+      var diff = a - b;
+
+      return diff == int.MinValue
+        ? int.MaxValue
+        : Math.Abs(diff);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/NormalDistributedRandomExtensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/NormalDistributedRandomExtensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/NormalDistributedRandomExtensions.cs	(revision 15771)
@@ -0,0 +1,11 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+
+  using HeuristicLab.Random;
+
+  public static class NormalDistributedRandomExtensions {
+    public static int NextRounded(this NormalDistributedRandom random) {
+      return (int)Math.Round(random.NextDouble(), 0);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/StringExtensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/StringExtensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/StringExtensions.cs	(revision 15771)
@@ -0,0 +1,105 @@
+﻿using System;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public static class StringExtensions {
+    public static bool IsNumeric(this string str) {
+      int n;
+      return int.TryParse(str, out n);
+    }
+
+    /// <summary>
+    /// https://github.com/DanHarltey/Fastenshtein
+    /// </summary>
+    public static int LevenshteinDistance(this string source, string target) {
+      if (target.Length == 0) {
+        return source.Length;
+      }
+
+      int[] costs = new int[target.Length];
+
+      // Add indexing for insertion to first row
+      for (int i = 0; i < costs.Length;) {
+        costs[i] = ++i;
+      }
+
+      for (int i = 0; i < source.Length; i++) {
+        // cost of the first index
+        int cost = i;
+        int addationCost = i;
+
+        // cache value for inner loop to avoid index lookup and bonds checking, profiled this is quicker
+        char value1Char = source[i];
+
+        for (int j = 0; j < target.Length; j++) {
+          int insertionCost = cost;
+
+          cost = addationCost;
+
+          // assigning this here reduces the array reads we do, improvement of the old version
+          addationCost = costs[j];
+
+          if (value1Char != target[j]) {
+            if (insertionCost < cost) {
+              cost = insertionCost;
+            }
+
+            if (addationCost < cost) {
+              cost = addationCost;
+            }
+
+            ++cost;
+          }
+
+          costs[j] = cost;
+        }
+      }
+
+      return costs[costs.Length - 1];
+    }
+
+    /// <summary>
+    /// https://www.dotnetperls.com/levenshtein
+    /// </summary>
+    public static int LevenshteinDistance2(this 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/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/TypeExtensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/TypeExtensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Extensions/TypeExtensions.cs	(revision 15771)
@@ -0,0 +1,29 @@
+﻿using System;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public static class TypeExtensions {
+    public static bool IsSubclass(this Type type, Type baseType) {
+      if (type == null || baseType == null || type == baseType)
+        return false;
+
+      if (baseType.IsGenericType == false) {
+        if (type.IsGenericType == false)
+          return type.IsSubclassOf(baseType);
+      } else {
+        baseType = baseType.GetGenericTypeDefinition();
+      }
+
+      type = type.BaseType;
+      var objectType = typeof(object);
+      while (type != objectType && type != null) {
+        var curentType = type.IsGenericType ? type.GetGenericTypeDefinition() : type;
+        if (curentType == baseType)
+          return true;
+
+        type = type.BaseType;
+      }
+
+      return false;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Generators/StringGenerator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Generators/StringGenerator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Generators/StringGenerator.cs	(revision 15771)
@@ -0,0 +1,80 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+  using System.Linq;
+
+  using HeuristicLab.Core;
+  using HeuristicLab.Random;
+
+  public class StringGenerator {
+    public const int DefaultRandomNameLength = 10;
+
+    private static readonly char[] chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
+    private static readonly char[] lowercaseChars = "abcdefghijklmnopqrstuvwxyz".ToCharArray();
+    private static readonly char[] uppercaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
+    private static readonly char[] digitChars = "1234567890".ToCharArray();
+    private const char space = ' ';
+
+    private int index;
+
+    public string GetNext() {
+      var length = index < chars.Length ? 1 : (int)Math.Log(index, chars.Length) + 1;
+      var result = new char[length];
+      var tmp = index;
+      index++;
+
+      for (var i = length; i > 0; i--) {
+        var a = (int)Math.Pow(chars.Length, i - 1);
+        var b = tmp / a;
+
+        result[length - i] = chars[b];
+
+        tmp -= a * b;
+      }
+
+      return new string(result);
+    }
+
+    public static string RandomName(IRandom random) {
+      return RandomName(DefaultRandomNameLength, random);
+    }
+
+    public static string RandomName(int length = DefaultRandomNameLength, IRandom random = null) {
+      random = random ?? new FastRandom();
+      var name = new char[length];
+
+      for (var i = 0; i < length; i++)
+        name[i] = chars[random.Next(chars.Length)];
+
+      return new string(name);
+    }
+
+    public static string RandomString(bool allowLowercase, bool allowUppercase, bool allowSpace, double spaceProbability, int length, IRandom random = null) {
+      if (!allowLowercase && !allowUppercase) return string.Empty;
+
+      random = random ?? new FastRandom();
+      var name = new char[length];
+
+      var sourceChars = Enumerable.Empty<char>();
+      if (allowLowercase) sourceChars = sourceChars.Concat(lowercaseChars);
+      if (allowUppercase) sourceChars = sourceChars.Concat(uppercaseChars);
+
+      var chars = sourceChars.ToList();
+
+      for (var i = 0; i < name.Length; i++) {
+        name[i] = allowSpace && spaceProbability >= random.NextDouble()
+          ? space
+          : chars[random.Next(0, chars.Count)];
+      }
+
+      return new string(name);
+    }
+
+    public static char RandomChar(int from, int to, IRandom random = null) {
+      if (from > to) throw new InvalidOperationException();
+
+      random = random ?? new FastRandom();
+
+      return Convert.ToChar(from == to ? from : random.Next(from, to));
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Weighted/IWeighted.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Weighted/IWeighted.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push.Base/Weighted/IWeighted.cs	(revision 15771)
@@ -0,0 +1,5 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  public interface IWeighted {
+    double Weight { get; }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IIndividualZeroErrorAnalyzer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IIndividualZeroErrorAnalyzer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IIndividualZeroErrorAnalyzer.cs	(revision 15771)
@@ -0,0 +1,7 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Optimization;
+
+  public interface IIndividualZeroErrorAnalyzer : IAnalyzer {
+
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IIndividualZeroErrorDistributionAnalyzer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IIndividualZeroErrorDistributionAnalyzer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IIndividualZeroErrorDistributionAnalyzer.cs	(revision 15771)
@@ -0,0 +1,13 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Optimization;
+
+  public interface IIndividualZeroErrorDistributionAnalyzer : IAnalyzer {
+
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IPushExpressionAnalyzer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IPushExpressionAnalyzer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IPushExpressionAnalyzer.cs	(revision 15771)
@@ -0,0 +1,6 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Optimization;
+
+  internal interface IPushExpressionAnalyzer : IAnalyzer {
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IndividualZeroErrorAnalyzer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IndividualZeroErrorAnalyzer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IndividualZeroErrorAnalyzer.cs	(revision 15771)
@@ -0,0 +1,195 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  using HeuristicLab.Analysis;
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Operators;
+  using HeuristicLab.Optimization;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  /// <summary>
+  /// An operater that tracks the count of individuals with zero error on the cases
+  /// </summary>
+  [Item("IndividualZeroErrorAnalyzer", "An operater that tracks the count of individuals with zero error on the cases")]
+  [StorableClass]
+  public class IndividualZeroErrorAnalyzer : SingleSuccessorOperator, IIndividualZeroErrorAnalyzer {
+    private const string RESULTS_PARAMETER_NAME = "Results";
+    private const string INDIVIDUAL_ZERO_ERROR_PARAMETER_NAME = "ZeroErrorIndividualsPerCase";
+    private const string INDIVIDUAL_ZERO_ERROR_HISTORY_PARAMETER_NAME = INDIVIDUAL_ZERO_ERROR_PARAMETER_NAME + "History";
+
+    private const string RESULT_PARAMETER_NAME = "Zero Error Individuals Per Case";
+    private const string RESULT_PARAMETER_DESCRIPTION = "Relative frequency of instructions aggregated over the whole population.";
+    private const string Y_AXIS_TITLE = "Relative count of zero error individuals";
+    private const string X_AXIS_TITLE = "Case Nr";
+    private const string ROW_NAME = "Cases";
+    private const string HISTORY_TABLE_NAME = "Individual Zero Error history";
+
+    public IndividualZeroErrorAnalyzer() {
+      Parameters.Add(new LookupParameter<DataTable>(
+        INDIVIDUAL_ZERO_ERROR_PARAMETER_NAME,
+        "The data table to store the count of individuals with zero error."));
+
+      Parameters.Add(new ValueLookupParameter<DataTableHistory>(
+        INDIVIDUAL_ZERO_ERROR_HISTORY_PARAMETER_NAME,
+        "The data table to store the history."));
+
+      Parameters.Add(new LookupParameter<ResultCollection>(
+        RESULTS_PARAMETER_NAME,
+        "The result collection where the symbol frequencies should be stored."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleArray>(
+       IntegerVectorPushProblem.CaseQualitiesScopeParameterName,
+       "The quality of every single training case for each individual."));
+
+      Parameters.Add(new ValueParameter<BoolValue>(
+        "StoreHistory",
+        "True if the history of the analysis should be stored.",
+        new BoolValue(false)));
+
+      Parameters.Add(new ValueParameter<IntValue>(
+        "UpdateInterval",
+        "The interval in which the analysis should be applied.",
+        new IntValue(1)));
+
+      Parameters.Add(new ValueParameter<IntValue>(
+        "UpdateCounter",
+        "The value which counts how many times the operator was called since the last update.",
+        new IntValue(0)));
+
+      IndividualZeroErrorParameter.Hidden = true;
+      IndividualZeroErrorHistoryParameter.Hidden = true;
+      ResultsParameter.Hidden = true;
+      UpdateCounterParameter.Hidden = true;
+    }
+
+    [StorableConstructor]
+    public IndividualZeroErrorAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public IndividualZeroErrorAnalyzer(IndividualZeroErrorAnalyzer origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IndividualZeroErrorAnalyzer(this, cloner);
+    }
+
+    public bool EnabledByDefault { get { return true; } }
+
+    public ValueParameter<BoolValue> StoreHistoryParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["StoreHistory"]; }
+    }
+    public ValueParameter<IntValue> UpdateIntervalParameter {
+      get { return (ValueParameter<IntValue>)Parameters["UpdateInterval"]; }
+    }
+    public ValueParameter<IntValue> UpdateCounterParameter {
+      get { return (ValueParameter<IntValue>)Parameters["UpdateCounter"]; }
+    }
+
+    public ILookupParameter<DataTable> IndividualZeroErrorParameter {
+      get { return (ILookupParameter<DataTable>)Parameters[INDIVIDUAL_ZERO_ERROR_PARAMETER_NAME]; }
+    }
+
+    public ValueLookupParameter<DataTableHistory> IndividualZeroErrorHistoryParameter {
+      get { return (ValueLookupParameter<DataTableHistory>)Parameters[INDIVIDUAL_ZERO_ERROR_HISTORY_PARAMETER_NAME]; }
+    }
+
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[RESULTS_PARAMETER_NAME]; }
+    }
+
+    public ILookupParameter<ItemArray<DoubleArray>> CaseQualitiesParameter {
+      get { return (ILookupParameter<ItemArray<DoubleArray>>)Parameters[IntegerVectorPushProblem.CaseQualitiesScopeParameterName]; }
+    }
+
+    public override IOperation Apply() {
+      UpdateCounterParameter.Value.Value++;
+      // the analyzer runs periodically, every 'updateInterval' times
+      if (UpdateCounterParameter.Value.Value != UpdateIntervalParameter.Value.Value)
+        return base.Apply();
+
+      UpdateCounterParameter.Value.Value = 0; // reset counter
+
+      var caseQualitiesPerIndividual = CaseQualitiesParameter.ActualValue;
+      var caseCount = caseQualitiesPerIndividual[0].Length;
+
+      var results = ResultsParameter.ActualValue;
+      var individualZeroErrorCounts = IndividualZeroErrorParameter.ActualValue;
+
+      if (individualZeroErrorCounts == null) {
+        individualZeroErrorCounts = new DataTable(
+         RESULT_PARAMETER_NAME,
+         RESULT_PARAMETER_DESCRIPTION) {
+          VisualProperties = {
+            YAxisTitle = Y_AXIS_TITLE,
+            XAxisTitle = X_AXIS_TITLE,
+            YAxisMinimumFixedValue = 0,
+            YAxisMaximumFixedValue = 1,
+            YAxisMinimumAuto = false,
+            YAxisMaximumAuto = false,
+            XAxisMinimumFixedValue = 1,
+            XAxisMaximumFixedValue = caseCount,
+            XAxisMaximumAuto = false,
+            XAxisMinimumAuto = false,
+          }
+        };
+
+        IndividualZeroErrorParameter.ActualValue = individualZeroErrorCounts;
+      }
+
+      if (!results.ContainsKey(RESULT_PARAMETER_NAME)) {
+        results.Add(new Result(RESULT_PARAMETER_NAME, individualZeroErrorCounts));
+      }
+
+      DataRow row;
+      if (!individualZeroErrorCounts.Rows.TryGetValue(ROW_NAME, out row)) {
+        row = new DataRow(ROW_NAME) {
+          VisualProperties = {
+              StartIndexZero = true,
+              IsVisibleInLegend = false,
+              ChartType = DataRowVisualProperties.DataRowChartType.Columns,
+            }
+        };
+
+        individualZeroErrorCounts.Rows.Add(row);
+      }
+
+      row.Values.Clear();
+
+      for (var i = 0; i < caseCount; i++) {
+        var count = 0;
+
+        for (var j = 0; j < caseQualitiesPerIndividual.Length; j++) {
+          var caseQuality = caseQualitiesPerIndividual[j][i];
+
+          if (caseQuality == 0.0)
+            count++;
+        }
+
+        var relativeCount = count / (double)caseQualitiesPerIndividual.Length;
+
+        row.Values.Add(relativeCount);
+      }
+
+      var storeHistory = StoreHistoryParameter.Value.Value;
+
+      if (storeHistory) {
+        var history = IndividualZeroErrorHistoryParameter.ActualValue;
+
+        if (history == null) {
+          history = new DataTableHistory();
+          IndividualZeroErrorHistoryParameter.ActualValue = history;
+        }
+
+        history.Add((DataTable)individualZeroErrorCounts.Clone());
+
+        if (!results.ContainsKey(HISTORY_TABLE_NAME)) {
+          results.Add(new Result(HISTORY_TABLE_NAME, history));
+        } else {
+          results[HISTORY_TABLE_NAME].Value = history;
+        }
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IndividualZeroErrorDistributionAnalyzer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IndividualZeroErrorDistributionAnalyzer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IndividualZeroErrorDistributionAnalyzer.cs	(revision 15771)
@@ -0,0 +1,189 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Linq;
+
+  using HeuristicLab.Analysis;
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Operators;
+  using HeuristicLab.Optimization;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  /// <summary>
+  /// An operater that tracks the count of individuals with zero error on the cases
+  /// </summary>
+  [Item("IndividualZeroErrorDistributionAnalyzer", "An operater that tracks the distribution of individuals with zero error on the cases")]
+  [StorableClass]
+  public class IndividualZeroErrorDistributionAnalyzer : SingleSuccessorOperator, IIndividualZeroErrorDistributionAnalyzer {
+    private const string RESULTS_PARAMETER_NAME = "Results";
+    private const string INDIVIDUAL_ZERO_ERROR_PARAMETER_NAME = "ZeroErrorIndividualsPerCaseDistribution";
+    private const string INDIVIDUAL_ZERO_ERROR_HISTORY_PARAMETER_NAME = "ZeroErrorIndividualsPerCaseDistributionHistory";
+
+    private const string HISTORY_TABLE_NAME = "Individual Zero Error Distribution History";
+    private const string RESULT_PARAMETER_NAME = "Zero Error Individual Per Case Distribution";
+    private const string RESULT_PARAMETER_DESCRIPTION = "Relative frequency of instructions aggregated over the whole population.";
+    private const string Y_AXIS_TITLE = "Number of zero error cases";
+    private const string X_AXIS_TITLE = "Individuals Nr";
+    private const string ROW_NAME = "Cases";
+
+    public IndividualZeroErrorDistributionAnalyzer() {
+      Parameters.Add(new LookupParameter<DataTable>(
+        INDIVIDUAL_ZERO_ERROR_PARAMETER_NAME,
+        "The data table to store the count of individuals with zero error."));
+
+      Parameters.Add(new ValueLookupParameter<DataTableHistory>(
+        INDIVIDUAL_ZERO_ERROR_HISTORY_PARAMETER_NAME,
+        "The data table to store the history."));
+
+      Parameters.Add(new LookupParameter<ResultCollection>(
+        RESULTS_PARAMETER_NAME,
+        "The result collection where the symbol frequencies should be stored."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleArray>(
+       IntegerVectorPushProblem.CaseQualitiesScopeParameterName,
+       "The quality of every single training case for each individual."));
+
+      Parameters.Add(new ValueParameter<BoolValue>(
+        "StoreHistory",
+        "True if the history of the analysis should be stored.",
+        new BoolValue(false)));
+
+      Parameters.Add(new ValueParameter<IntValue>(
+        "UpdateInterval",
+        "The interval in which the analysis should be applied.",
+        new IntValue(1)));
+
+      Parameters.Add(new ValueParameter<IntValue>(
+        "UpdateCounter",
+        "The value which counts how many times the operator was called since the last update.",
+        new IntValue(0)));
+
+      IndividualZeroErrorDistributionParameter.Hidden = true;
+      IndividualZeroErrorDistributionHistoryParameter.Hidden = true;
+      ResultsParameter.Hidden = true;
+      UpdateCounterParameter.Hidden = true;
+    }
+
+    [StorableConstructor]
+    public IndividualZeroErrorDistributionAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public IndividualZeroErrorDistributionAnalyzer(IndividualZeroErrorDistributionAnalyzer origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IndividualZeroErrorDistributionAnalyzer(this, cloner);
+    }
+
+    public bool EnabledByDefault { get { return true; } }
+
+    public ValueParameter<BoolValue> StoreHistoryParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["StoreHistory"]; }
+    }
+    public ValueParameter<IntValue> UpdateIntervalParameter {
+      get { return (ValueParameter<IntValue>)Parameters["UpdateInterval"]; }
+    }
+    public ValueParameter<IntValue> UpdateCounterParameter {
+      get { return (ValueParameter<IntValue>)Parameters["UpdateCounter"]; }
+    }
+
+    public ILookupParameter<DataTable> IndividualZeroErrorDistributionParameter {
+      get { return (ILookupParameter<DataTable>)Parameters[INDIVIDUAL_ZERO_ERROR_PARAMETER_NAME]; }
+    }
+
+    public ValueLookupParameter<DataTableHistory> IndividualZeroErrorDistributionHistoryParameter {
+      get { return (ValueLookupParameter<DataTableHistory>)Parameters[INDIVIDUAL_ZERO_ERROR_HISTORY_PARAMETER_NAME]; }
+    }
+
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[RESULTS_PARAMETER_NAME]; }
+    }
+
+    public ILookupParameter<ItemArray<DoubleArray>> CaseQualitiesParameter {
+      get { return (ILookupParameter<ItemArray<DoubleArray>>)Parameters[IntegerVectorPushProblem.CaseQualitiesScopeParameterName]; }
+    }
+
+    public override IOperation Apply() {
+      UpdateCounterParameter.Value.Value++;
+      // the analyzer runs periodically, every 'updateInterval' times
+      if (UpdateCounterParameter.Value.Value != UpdateIntervalParameter.Value.Value)
+        return base.Apply();
+
+      UpdateCounterParameter.Value.Value = 0; // reset counter
+
+      var caseQualitiesPerIndividual = CaseQualitiesParameter.ActualValue;
+      var individualCount = caseQualitiesPerIndividual.Length;
+      var caseCount = caseQualitiesPerIndividual[0].Length;
+
+      var results = ResultsParameter.ActualValue;
+      var individualZeroErrorDistribution = IndividualZeroErrorDistributionParameter.ActualValue;
+
+      if (individualZeroErrorDistribution == null) {
+        individualZeroErrorDistribution = new DataTable(
+         RESULT_PARAMETER_NAME,
+         RESULT_PARAMETER_DESCRIPTION) {
+          VisualProperties = {
+            YAxisTitle = Y_AXIS_TITLE,
+            XAxisTitle = X_AXIS_TITLE,
+            YAxisMaximumFixedValue = 1,
+            YAxisMinimumFixedValue = 0,
+            YAxisMaximumAuto = false,
+            YAxisMinimumAuto = false,
+            XAxisMinimumFixedValue = 1,
+            XAxisMaximumFixedValue = individualCount,
+            XAxisMaximumAuto = false,
+            XAxisMinimumAuto = false,
+          }
+        };
+
+        IndividualZeroErrorDistributionParameter.ActualValue = individualZeroErrorDistribution;
+      }
+
+      if (!results.ContainsKey(RESULT_PARAMETER_NAME)) {
+        results.Add(new Result(RESULT_PARAMETER_NAME, individualZeroErrorDistribution));
+      }
+
+      DataRow row;
+      if (!individualZeroErrorDistribution.Rows.TryGetValue(ROW_NAME, out row)) {
+        row = new DataRow(ROW_NAME) {
+          VisualProperties = {
+              StartIndexZero = true,
+              IsVisibleInLegend = false,
+              ChartType = DataRowVisualProperties.DataRowChartType.Columns,
+            }
+        };
+
+        individualZeroErrorDistribution.Rows.Add(row);
+      }
+
+      row.Values.Clear();
+
+      for (var i = 0; i < caseQualitiesPerIndividual.Length; i++) {
+        var count = caseQualitiesPerIndividual[i].Count(q => q == 0.0);
+        var ratio = count / (double)caseCount;
+
+        row.Values.Add(ratio);
+      }
+
+      var storeHistory = StoreHistoryParameter.Value.Value;
+
+      if (storeHistory) {
+        var history = IndividualZeroErrorDistributionHistoryParameter.ActualValue;
+
+        if (history == null) {
+          history = new DataTableHistory();
+          IndividualZeroErrorDistributionHistoryParameter.ActualValue = history;
+        }
+
+        history.Add((DataTable)individualZeroErrorDistribution.Clone());
+
+        if (!results.ContainsKey(HISTORY_TABLE_NAME)) {
+          results.Add(new Result(HISTORY_TABLE_NAME, history));
+        } else {
+          results[HISTORY_TABLE_NAME].Value = history;
+        }
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/PushExpressionFrequencyAnalyzer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/PushExpressionFrequencyAnalyzer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/PushExpressionFrequencyAnalyzer.cs	(revision 15771)
@@ -0,0 +1,167 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+  using System.Collections.Generic;
+  using System.Linq;
+
+  using HeuristicLab.Analysis;
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Encodings.IntegerVectorEncoding;
+  using HeuristicLab.Operators;
+  using HeuristicLab.Optimization;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  /// <summary>
+  /// An operater that tracks the frequencies of distinct push expressions in a push solution
+  /// </summary>
+  [Item("PushExpressionFrequencyAnalyzer", "An operater that tracks the frequencies of distinct push expressions in a push solution")]
+  [StorableClass]
+  public class PushExpressionFrequencyAnalyzer : SingleSuccessorOperator, IPushExpressionAnalyzer {
+
+    private const string PUSH_CONFIGURATION_PARAMETER_NAME = "PushConfiguration";
+    private const string INTEGER_VECTOR_PARAMETER_NAME = "IntegerVector";
+    private const string RESULTS_PARAMETER_NAME = "Results";
+    private const string EXPRESSION_FREQUENCIES_PARAMETER_NAME = "InstructionFrequencies";
+    private const string AGGREGATE_STACK_TYPES_PARAMETER_NAME = "Aggregate stack types";
+    private const string IN_EXPRESSION_GROUP_NAME = "IN";
+    private const string RANDOM_PARAMETER_NAME = "Random";
+    private const string RESULT_PARAMETER_NAME = "Instruction frequencies";
+    private const string RESULT_PARAMETER_DESCRIPTION = "Relative frequency of instructions aggregated over the whole population.";
+    private const string Y_AXIS_TITLE = "Relative Instruction Frequency";
+
+    public PushExpressionFrequencyAnalyzer() {
+      Parameters.Add(new LookupParameter<IReadOnlyPushConfiguration>(PUSH_CONFIGURATION_PARAMETER_NAME, "The current specified push configuration."));
+      Parameters.Add(new ScopeTreeLookupParameter<IntegerVector>(INTEGER_VECTOR_PARAMETER_NAME, "The integer vectors to analyze."));
+      Parameters.Add(new ScopeTreeLookupParameter<PlushVector>("Plush", "The plush vectors to analyze."));
+      Parameters.Add(new LookupParameter<DataTable>(EXPRESSION_FREQUENCIES_PARAMETER_NAME, "The data table to store the instruction frequencies."));
+      Parameters.Add(new LookupParameter<ResultCollection>(RESULTS_PARAMETER_NAME, "The result collection where the symbol frequencies should be stored."));
+
+      Parameters.Add(new FixedValueParameter<BoolValue>(AGGREGATE_STACK_TYPES_PARAMETER_NAME, "Determines if expressions should be aggregated by their primary stack type.", new BoolValue(true)));
+    }
+
+    [StorableConstructor]
+    public PushExpressionFrequencyAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public PushExpressionFrequencyAnalyzer(PushExpressionFrequencyAnalyzer origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PushExpressionFrequencyAnalyzer(this, cloner);
+    }
+
+    public bool EnabledByDefault { get { return true; } }
+
+    public ILookupParameter<IReadOnlyPushConfiguration> PushConfigurationParameter {
+      get { return (ILookupParameter<IReadOnlyPushConfiguration>)Parameters[PUSH_CONFIGURATION_PARAMETER_NAME]; }
+    }
+
+    public IScopeTreeLookupParameter<PlushVector> PlushVectorParameter {
+      get { return (IScopeTreeLookupParameter<PlushVector>)Parameters["Plush"]; }
+    }
+
+    public IScopeTreeLookupParameter<IntegerVector> IntegerVectorParameter {
+      get { return (IScopeTreeLookupParameter<IntegerVector>)Parameters[INTEGER_VECTOR_PARAMETER_NAME]; }
+    }
+
+    public ILookupParameter<DataTable> ExpressionFrequenciesParameter {
+      get { return (ILookupParameter<DataTable>)Parameters[EXPRESSION_FREQUENCIES_PARAMETER_NAME]; }
+    }
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters[RANDOM_PARAMETER_NAME]; }
+    }
+
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[RESULTS_PARAMETER_NAME]; }
+    }
+
+    public IValueParameter<BoolValue> AggregateStackTypesParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[AGGREGATE_STACK_TYPES_PARAMETER_NAME]; }
+    }
+
+    public bool AggregateStackTypes {
+      get { return AggregateStackTypesParameter.Value.Value; }
+      set { AggregateStackTypesParameter.Value.Value = value; }
+    }
+
+    public override IOperation Apply() {
+      var config = PushConfigurationParameter.ActualValue;
+
+      IReadOnlyList<PushProgram> pushPrograms = null;
+
+      if (IntegerVectorParameter.ActualValue.Length > 0) {
+        pushPrograms = IntegerVectorParameter.ActualValue.Select(iv => iv.ToPushProgram(config)).ToList();
+      } else if (PlushVectorParameter.ActualValue.Length > 0) {
+        pushPrograms = PlushVectorParameter.ActualValue.Select(pv => pv.PushProgram).ToList();
+      } else {
+        // nothing to do
+        return base.Apply();
+      }
+
+      var results = ResultsParameter.ActualValue;
+      var frequencies = ExpressionFrequenciesParameter.ActualValue;
+
+      if (frequencies == null) {
+        frequencies = new DataTable(
+          RESULT_PARAMETER_NAME,
+          RESULT_PARAMETER_DESCRIPTION) {
+          VisualProperties = {
+            YAxisTitle = Y_AXIS_TITLE
+          }
+        };
+
+        ExpressionFrequenciesParameter.ActualValue = frequencies;
+        results.Add(new Result(RESULT_PARAMETER_NAME, frequencies));
+      }
+
+      var allExpressions = pushPrograms
+        .SelectMany(p => p.DepthLast())
+        .Select(e => new {
+          Expression = e,
+          Attribute = ExpressionTable.TypeToAttributeTable[e.GetType()]
+        });
+
+      var expressionFrequencies = allExpressions
+        .GroupBy(x => GetGroupName(x.Attribute, AggregateStackTypes))
+        .ToDictionary(
+          group => group.Key,
+          group => group.Count());
+
+      var totalNumberOfExpressions = Math.Max(1.0, expressionFrequencies.Values.Sum());
+
+      // all rows must have the same number of values so we can just take the first
+      var numberOfValues = frequencies.Rows.Select(r => r.Values.Count).FirstOrDefault();
+
+      foreach (var pair in expressionFrequencies) {
+        if (!frequencies.Rows.ContainsKey(pair.Key)) {
+          var row = new DataRow(pair.Key, string.Empty, Enumerable.Repeat(0.0, numberOfValues)) {
+            VisualProperties = {
+              StartIndexZero = true,
+            }
+          };
+
+          frequencies.Rows.Add(row);
+        }
+
+        frequencies.Rows[pair.Key].Values.Add(Math.Round(pair.Value / totalNumberOfExpressions, 3));
+      }
+
+      // add a zero for each data row that was not modified in the previous loop
+      foreach (var row in frequencies.Rows.Where(r => r.Values.Count != numberOfValues + 1))
+        row.Values.Add(0.0);
+
+      return base.Apply();
+    }
+
+    private string GetGroupName(PushExpressionAttribute attribute, bool aggregateStackTypes) {
+      if (aggregateStackTypes) {
+        return attribute.IsInExpression
+         ? IN_EXPRESSION_GROUP_NAME
+         : attribute.StackType.ToString();
+      }
+
+      return attribute.Name;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Attributes/PushExpressionAttriubte.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Attributes/PushExpressionAttriubte.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Attributes/PushExpressionAttriubte.cs	(revision 15771)
@@ -0,0 +1,49 @@
+﻿using System;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  [AttributeUsage(AttributeTargets.Class)]
+  public class PushExpressionAttribute : Attribute {
+    public readonly StackTypes StackType;
+    public readonly StackTypes AdditionalStackDependencies;
+    public readonly string Name;
+    public readonly string Description;
+    public readonly int? InExpressionNr;
+
+    /// <summary>
+    /// Determines if this expression manipulates the exec stack.
+    /// </summary>
+    public readonly bool ManipulatesExec;
+
+    /// <summary>
+    /// Determines the amount of items fetched form the EXEC stack required for this expression. Used for mapping individuals.
+    /// </summary>
+    public readonly uint RequiredBlockCount;
+
+    /// <summary>
+    /// Determines if the expression is visible to the user for configuration purposes.
+    /// </summary>
+    public readonly bool IsHidden;
+
+    public PushExpressionAttribute(
+      StackTypes stackType,
+      string name,
+      string description,
+      StackTypes additionalStackDependencies = default(StackTypes),
+      uint requiredBlockCount = 0,
+      bool isHidden = false,
+      int inExpressionNr = -1) {
+
+      StackType = stackType;
+      AdditionalStackDependencies = additionalStackDependencies;
+      Name = name;
+      Description = description;
+      RequiredBlockCount = requiredBlockCount;
+      IsHidden = isHidden;
+      InExpressionNr = inExpressionNr > 0 ? inExpressionNr : default(int?);
+      ManipulatesExec = stackType == StackTypes.Exec || AdditionalStackDependencies.HasFlag(StackTypes.Exec);
+    }
+
+    public bool IsInExpression { get { return this.InExpressionNr.HasValue; } }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Attributes/PushStackAttribute.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Attributes/PushStackAttribute.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Attributes/PushStackAttribute.cs	(revision 15771)
@@ -0,0 +1,13 @@
+﻿using System;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
+  public class PushStackAttribute : Attribute {
+    public readonly StackTypes StackType;
+
+    public PushStackAttribute(StackTypes stackType) {
+      StackType = stackType;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/BenchmarkSuiteDataDescriptor.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/BenchmarkSuiteDataDescriptor.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/BenchmarkSuiteDataDescriptor.cs	(revision 15771)
@@ -0,0 +1,59 @@
+﻿namespace HeuristicLab.BenchmarkSuite {
+  using System.Collections.Generic;
+  using System.IO;
+  using System.IO.Compression;
+  using System.Linq;
+  using System.Reflection;
+  using System.Text.RegularExpressions;
+
+
+  public abstract class BenchmarkSuiteDataDescriptor : IBenchmarkSuiteDataDescriptor {
+    private const string InstanceArchiveName = "HeuristicLab.BenchmarkSuite.Data.BenchmarkExamples.zip";
+    private const string ResourcePath = @".*\.Data\.";
+    private const char ExampleFieldDelimiter = ',';
+    private const char ExampleFieldQualifier = '"';
+    private Example[] examples;
+
+    protected Example[] CloneExamples() {
+      if (examples == null) examples = ParseData().ToArray();
+      return examples.Select(e => (Example)e.Clone()).ToArray();
+    }
+
+    public abstract ProblemData CreateProblemData();
+
+    protected abstract string FileName { get; }
+    public abstract string Name { get; }
+    public abstract string Description { get; }
+    protected abstract int InputArgumentCount { get; }
+    protected abstract int OutputArgumentCount { get; }
+
+    protected abstract Example ParseExample(string[] input, string[] output);
+
+    private IEnumerable<Example> ParseData() {
+      using (var file = GetType().Assembly.GetManifestResourceStream(InstanceArchiveName))
+      using (var archive = new ZipArchive(file, ZipArchiveMode.Read)) {
+        var entry = archive.Entries.SingleOrDefault(x => x.Name == FileName);
+
+        using (var reader = new StreamReader(entry.Open())) {
+          var lines = CsvParser.Parse(reader, ExampleFieldDelimiter, ExampleFieldQualifier);
+
+          foreach (var line in lines) {
+            var input = line.Take(InputArgumentCount).ToArray();
+            var output = line.Skip(InputArgumentCount).ToArray();
+
+            var example = ParseExample(input, output);
+
+            yield return example;
+          }
+        }
+      }
+    }
+
+    protected static string GetResourceName(string fileName) {
+      return Assembly
+          .GetExecutingAssembly()
+          .GetManifestResourceNames()
+          .SingleOrDefault(x => Regex.Match(x, ResourcePath + fileName).Success);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/BenchmarkSuiteInstanceProvider.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/BenchmarkSuiteInstanceProvider.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/BenchmarkSuiteInstanceProvider.cs	(revision 15771)
@@ -0,0 +1,74 @@
+﻿using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.BenchmarkSuite {
+
+  using HeuristicLab.BenchmarkSuite.Problems;
+  using HeuristicLab.Problems.Instances;
+
+  public class BenchmarkSuiteInstanceProvider : ProblemInstanceProvider<ProblemData> {
+    private const string name = "General Program Synthesis Benchmark Suite";
+    private const string referencePublication =
+      "T. Helmuth and L. Spector, \"Detailed Problem Descriptions for General Program Synthesis Benchmark Suite\", Technical Report UM-CS-2015-006, School of Computer Science, University of Massachusetts Amherst, 2015.";
+    private static readonly Uri webLink = new Uri("https://web.cs.umass.edu/publication/docs/2015/UM-CS-2015-006.pdf");
+
+    public override string Name
+    {
+      get { return name; }
+    }
+
+    public override string Description
+    {
+      get { return ""; }
+    }
+
+    public override Uri WebLink
+    {
+      get { return webLink; }
+    }
+
+    public override string ReferencePublication
+    {
+      get { return referencePublication; }
+    }
+
+    public override IEnumerable<IDataDescriptor> GetDataDescriptors() {
+      yield return new Checksum();
+      yield return new CollatzNumbers();
+      yield return new CompareStringLengths();
+      yield return new CountOdds();
+      yield return new Digits();
+      yield return new DoubleLetters();
+      yield return new EvenSquares();
+      yield return new ForLoopIndex();
+      yield return new Grades();
+      yield return new LastIndexOfZero();
+      yield return new Median();
+      //yield return new MedianIntegerError();
+      yield return new MirrorImage();
+      yield return new NegativeToZero();
+      yield return new NumberIO();
+      yield return new PigLatin();
+      yield return new ReplaceSpaceWithNewline();
+      yield return new ScrabbleScore();
+      yield return new Smallest();
+      yield return new SmallOrLarge();
+      yield return new StringDifferences();
+      yield return new StringLengthsBackwards();
+      yield return new SumOfSquares();
+      yield return new SuperAnagrams();
+      yield return new Syllables();
+      yield return new VectorAverage();
+      yield return new VectorSummed();
+      yield return new WallisPi();
+      yield return new WordStats();
+      yield return new XWordLines();
+    }
+
+    public override ProblemData LoadData(IDataDescriptor descriptor) {
+      var benchmarkSuiteDataDescriptor = (IBenchmarkSuiteDataDescriptor)descriptor;
+
+      return benchmarkSuiteDataDescriptor.CreateProblemData();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/BenchmarkSuiteOverview.cd
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/BenchmarkSuiteOverview.cd	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/BenchmarkSuiteOverview.cd	(revision 15771)
@@ -0,0 +1,106 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="NameAndType">
+  <Class Name="HeuristicLab.BenchmarkSuite.BenchmarkSuiteInstanceProvider">
+    <Position X="4.25" Y="3.25" Width="3.75" />
+    <Members>
+      <Property Name="Description" Hidden="true" />
+      <Method Name="LoadData" Hidden="true" />
+      <Field Name="name" Hidden="true" />
+      <Property Name="Name" Hidden="true" />
+      <Field Name="referencePublication" Hidden="true" />
+      <Property Name="ReferencePublication" Hidden="true" />
+      <Field Name="webLink" Hidden="true" />
+      <Property Name="WebLink" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>QAAAAAAAAIAwAAAAAAAAAAQAAIAEAAAAAAAAQAAAAEA=</HashCode>
+      <FileName>BenchmarkSuiteInstanceProvider.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.BenchmarkSuite.BenchmarkSuiteDataDescriptor">
+    <Position X="3.25" Y="0.75" Width="2.5" />
+    <Members>
+      <Method Name="CloneExamples" Hidden="true" />
+      <Property Name="Description" Hidden="true" />
+      <Field Name="ExampleFieldDelimiter" Hidden="true" />
+      <Field Name="ExampleFieldQualifier" Hidden="true" />
+      <Field Name="examples" Hidden="true" />
+      <Property Name="FileName" Hidden="true" />
+      <Method Name="GetResourceName" Hidden="true" />
+      <Property Name="InputArgumentCount" Hidden="true" />
+      <Field Name="InstanceArchiveName" Hidden="true" />
+      <Property Name="Name" Hidden="true" />
+      <Property Name="OutputArgumentCount" Hidden="true" />
+      <Method Name="ParseData" Hidden="true" />
+      <Field Name="ResourcePath" Hidden="true" />
+    </Members>
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+      <Compartment Name="Properties" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAEAAADAgAAgAAFAQAAgAAQAAAAQAABAAAAAAABEAAA=</HashCode>
+      <FileName>BenchmarkSuiteDataDescriptor.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.BenchmarkSuite.Example">
+    <Position X="0.75" Y="2.75" Width="2.5" />
+    <Members>
+      <Method Name="Clone" Hidden="true" />
+      <Field Name="emptyBooleans" Hidden="true" />
+      <Field Name="emptyBooleanVectors" Hidden="true" />
+      <Field Name="emptyChars" Hidden="true" />
+      <Field Name="emptyFloats" Hidden="true" />
+      <Field Name="emptyFloatVectors" Hidden="true" />
+      <Field Name="emptyIntegers" Hidden="true" />
+      <Field Name="emptyIntegerVectors" Hidden="true" />
+      <Field Name="emptyStrings" Hidden="true" />
+      <Field Name="emptyStringVectors" Hidden="true" />
+      <Method Name="Example" Hidden="true" />
+      <Field Name="NewLineSeparator" Hidden="true" />
+      <Field Name="outputPrint" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>KAgkhQAACAAEEUgAICAIAIFAQAIkEBwIAAEAAQCAAVA=</HashCode>
+      <FileName>Example.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.BenchmarkSuite.ProblemData">
+    <Position X="4.5" Y="4.75" Width="3.5" />
+    <Members>
+      <Method Name="Clone" Hidden="true" />
+      <Method Name="ProblemData" Hidden="true" />
+      <Field Name="ProblemType" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>IAICASAAAAAIAAIAAEAAAAEAAAAQAABIAgAAQBAAABA=</HashCode>
+      <FileName>ProblemData.cs</FileName>
+    </TypeIdentifier>
+    <ShowAsAssociation>
+      <Property Name="Examples" />
+    </ShowAsAssociation>
+  </Class>
+  <Class Name="HeuristicLab.BenchmarkSuite.Problems.Median" Collapsed="true">
+    <Position X="0.75" Y="0.5" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAgAAgAABAIAAAAAQAAAAUAAAAAEAAAABEAAA=</HashCode>
+      <FileName>Problems\Median.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.BenchmarkSuite.Problems.NumberIO" Collapsed="true">
+    <Position X="0.75" Y="1.5" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAgAAgAABAIAAAAAQAAAAUAAAAAEAAAABEAAA=</HashCode>
+      <FileName>Problems\NumberIo.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Enum Name="HeuristicLab.BenchmarkSuite.ExampleArgumentType">
+    <Position X="6" Y="0.5" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAAABAAAQAAAAAAQAAAAAAAAAQAAiEAAAAAAAAkAAA=</HashCode>
+      <FileName>ExampleArgumentType.cs</FileName>
+    </TypeIdentifier>
+  </Enum>
+  <Font Name="Courier" Size="9" />
+</ClassDiagram>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/CsvParser.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/CsvParser.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/CsvParser.cs	(revision 15771)
@@ -0,0 +1,100 @@
+﻿/*
+ * License: CPOL
+ * Source: https://www.codeproject.com/Tips/823670/Csharp-Light-and-Fast-CSV-Parser
+ * Author: Yuriy Magurdumov
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.BenchmarkSuite {
+  using System.IO;
+
+  public static class CsvParser {
+    private static Tuple<T, IEnumerable<T>> HeadAndTail<T>(this IEnumerable<T> source) {
+      if (source == null)
+        throw new ArgumentNullException("source");
+      var en = source.GetEnumerator();
+      en.MoveNext();
+      return Tuple.Create(en.Current, EnumerateTail(en));
+    }
+
+    private static IEnumerable<T> EnumerateTail<T>(IEnumerator<T> en) {
+      while (en.MoveNext()) yield return en.Current;
+    }
+
+    public static IEnumerable<IList<string>> Parse(string content, char delimiter, char qualifier) {
+      using (var reader = new StringReader(content))
+        return Parse(reader, delimiter, qualifier);
+    }
+
+    public static Tuple<IList<string>, IEnumerable<IList<string>>> ParseHeadAndTail(TextReader reader, char delimiter, char qualifier) {
+      return HeadAndTail(Parse(reader, delimiter, qualifier));
+    }
+
+    public static IEnumerable<IList<string>> Parse(TextReader reader, char delimiter, char qualifier) {
+      var inQuote = false;
+      var record = new List<string>();
+      var sb = new StringBuilder();
+
+      while (reader.Peek() != -1) {
+        var readChar = (char)reader.Read();
+
+        if (readChar == '\n' || (readChar == '\r' && (char)reader.Peek() == '\n')) {
+          // If it's a \r\n combo consume the \n part and throw it away.
+          if (readChar == '\r')
+            reader.Read();
+
+          if (inQuote) {
+            if (readChar == '\r')
+              sb.Append('\r');
+            sb.Append('\n');
+          } else {
+            if (record.Count > 0 || sb.Length > 0) {
+              record.Add(sb.ToString());
+              sb.Clear();
+            }
+
+            if (record.Count > 0)
+              yield return record;
+
+            record = new List<string>(record.Count);
+          }
+        } else if (sb.Length == 0 && !inQuote) {
+          if (readChar == qualifier)
+            inQuote = true;
+          else if (readChar == delimiter) {
+            record.Add(sb.ToString());
+            sb.Clear();
+          //} else if (char.IsWhiteSpace(readChar)) { // Ignore leading whitespace
+          } else
+            sb.Append(readChar);
+        } else if (readChar == delimiter) {
+          if (inQuote)
+            sb.Append(delimiter);
+          else {
+            record.Add(sb.ToString());
+            sb.Clear();
+          }
+        } else if (readChar == qualifier) {
+          if (inQuote) {
+            if ((char)reader.Peek() == qualifier) {
+              reader.Read();
+              sb.Append(qualifier);
+            } else
+              inQuote = false;
+          } else
+            sb.Append(readChar);
+        } else
+          sb.Append(readChar);
+      }
+
+      if (record.Count > 0 || sb.Length > 0)
+        record.Add(sb.ToString());
+
+      if (record.Count > 0)
+        yield return record;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/DataTypes.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/DataTypes.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/DataTypes.cs	(revision 15771)
@@ -0,0 +1,21 @@
+﻿namespace HeuristicLab.BenchmarkSuite {
+  using System;
+
+  [Flags]
+  public enum DataTypes {
+    None = 0x01, // Required to specify expression dependencies
+    Integer = 0x02,
+    Float = 0x04,
+    Char = 0x08,
+    String = 0x10,
+    Boolean = 0x20,
+    Name = 0x40,
+    Code = 0x80,
+    Exec = 0x100,
+    Print = 0x200,
+    IntegerVector = 0x400,
+    FloatVector = 0x800,
+    StringVector = 0x1000,
+    BooleanVector = 0x2000,
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Example.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Example.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Example.cs	(revision 15771)
@@ -0,0 +1,146 @@
+﻿namespace HeuristicLab.BenchmarkSuite {
+  using System;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class Example : DeepCloneable {
+    private static readonly long[] emptyIntegers = new long[0];
+    private static readonly double[] emptyFloats = new double[0];
+    private static readonly bool[] emptyBooleans = new bool[0];
+    private static readonly char[] emptyChars = new char[0];
+    private static readonly string[] emptyStrings = new string[0];
+    private static readonly long[][] emptyIntegerVectors = new long[0][];
+    private static readonly double[][] emptyFloatVectors = new double[0][];
+    private static readonly bool[][] emptyBooleanVectors = new bool[0][];
+    private static readonly string[][] emptyStringVectors = new string[0][];
+
+    public Example() {
+      InputArgs = emptyStrings;
+      OutputArgs = emptyStrings;
+
+      InputInteger = emptyIntegers;
+      InputFloat = emptyFloats;
+      InputBoolean = emptyBooleans;
+      InputChar = emptyChars;
+      InputString = emptyStrings;
+      InputIntegerVector = emptyIntegerVectors;
+      InputFloatVector = emptyFloatVectors;
+      InputBooleanVector = emptyBooleanVectors;
+      InputStringVector = emptyStringVectors;
+
+      OutputInteger = emptyIntegers;
+      OutputFloat = emptyFloats;
+      OutputBoolean = emptyBooleans;
+      OutputChar = emptyChars;
+      OutputString = emptyStrings;
+      OutputIntegerVector = emptyIntegerVectors;
+      OutputFloatVector = emptyFloatVectors;
+      OutputBooleanVector = emptyBooleanVectors;
+      OutputStringVector = emptyStringVectors;
+      OutputPrint = string.Empty;
+      OutputFloatPrecision = 15;
+      OutputFloatVectorPrecision = 15;
+    }
+
+    public Example(Example origin, Cloner cloner) : base(origin, cloner) {
+      InputArgs = (string[])origin.InputArgs.Clone();
+      OutputArgs = (string[])origin.OutputArgs.Clone();
+
+      InputBoolean = (bool[])origin.InputBoolean.Clone();
+      InputInteger = (long[])origin.InputInteger.Clone();
+      InputFloat = (double[])origin.InputFloat.Clone();
+      InputChar = (char[])origin.InputChar.Clone();
+      InputString = (string[])origin.InputString.Clone();
+      InputIntegerVector = (long[][])origin.InputIntegerVector.Clone();
+      InputFloatVector = (double[][])origin.InputFloatVector.Clone();
+      InputBooleanVector = (bool[][])origin.InputBooleanVector.Clone();
+      InputStringVector = (string[][])origin.InputStringVector.Clone();
+
+      OutputBoolean = (bool[])origin.OutputBoolean.Clone();
+      OutputInteger = (long[])origin.OutputInteger.Clone();
+      OutputFloat = (double[])origin.OutputFloat.Clone();
+      OutputChar = (char[])origin.OutputChar.Clone();
+      OutputString = (string[])origin.OutputString.Clone();
+      OutputIntegerVector = (long[][])origin.OutputIntegerVector.Clone();
+      OutputFloatVector = (double[][])origin.OutputFloatVector.Clone();
+      OutputBooleanVector = (bool[][])origin.OutputBooleanVector.Clone();
+      OutputStringVector = (string[][])origin.OutputStringVector.Clone();
+      OutputPrint = origin.OutputPrint;
+      OutputPrintLineCount = origin.OutputPrintLineCount;
+      OutputFloatPrecision = origin.OutputFloatPrecision;
+      OutputFloatVectorPrecision = origin.OutputFloatVectorPrecision;
+    }
+
+    [StorableConstructor]
+    public Example(bool deserializing) { }
+
+    [Storable]
+    public string[] InputArgs { get; set; }
+    [Storable]
+    public string[] OutputArgs { get; set; }
+
+    [Storable]
+    public long[] InputInteger { get; set; }
+    [Storable]
+    public double[] InputFloat { get; set; }
+    [Storable]
+    public bool[] InputBoolean { get; set; }
+    [Storable]
+    public char[] InputChar { get; set; }
+    [Storable]
+    public string[] InputString { get; set; }
+    [Storable]
+    public long[][] InputIntegerVector { get; set; }
+    [Storable]
+    public double[][] InputFloatVector { get; set; }
+    [Storable]
+    public bool[][] InputBooleanVector { get; set; }
+    [Storable]
+    public string[][] InputStringVector { get; set; }
+
+    [Storable]
+    public long[] OutputInteger { get; set; }
+    [Storable]
+    public double[] OutputFloat { get; set; }
+    [Storable]
+    public bool[] OutputBoolean { get; set; }
+    [Storable]
+    public char[] OutputChar { get; set; }
+    [Storable]
+    public string[] OutputString { get; set; }
+    [Storable]
+    public long[][] OutputIntegerVector { get; set; }
+    [Storable]
+    public double[][] OutputFloatVector { get; set; }
+    [Storable]
+    public bool[][] OutputBooleanVector { get; set; }
+    [Storable]
+    public string[][] OutputStringVector { get; set; }
+    [Storable]
+    private string outputPrint;
+    private static readonly string[] NewLineSeparator = { "\r\n", "\n" };
+    public string OutputPrint
+    {
+      get { return outputPrint; }
+      set
+      {
+        outputPrint = value;
+        OutputPrintLineCount = value != null ? value.Split(NewLineSeparator, StringSplitOptions.None).Length : 0;
+      }
+    }
+
+    [Storable]
+    public int OutputPrintLineCount { get; private set; }
+
+    [Storable]
+    public int OutputFloatPrecision { get; set; }
+    [Storable]
+    public int OutputFloatVectorPrecision { get; set; }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Example(this, cloner);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/ExampleArgumentConverter.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/ExampleArgumentConverter.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/ExampleArgumentConverter.cs	(revision 15771)
@@ -0,0 +1,97 @@
+﻿namespace HeuristicLab.BenchmarkSuite {
+  using System;
+  using System.Collections.Generic;
+  using System.Globalization;
+  using System.IO;
+  using System.Linq;
+
+  public static class ExampleArgumentConverter {
+    private static readonly char[] ArrayValueSeparator = { ' ', ';' };
+    private static readonly char[] ArraySymbolTrim = { '[', ']', '(', ')' };
+
+    public static double[] ConvertDoubles(string[] input) {
+      return input.Select(ConvertDouble).ToArray();
+    }
+
+    public static double[] ConvertDoubles(string input) {
+      return ConvertMultiple(input, str => double.Parse(str, NumberStyles.Float, CultureInfo.InvariantCulture));
+    }
+
+    public static double ConvertDouble(string input) {
+      return double.Parse(input, CultureInfo.InvariantCulture);
+    }
+
+    public static long[] ConvertIntegers(string[] input) {
+      return input.Select(ConvertInteger).ToArray();
+    }
+
+    public static long[] ConvertIntegers(string input) {
+      return ConvertMultiple(input, long.Parse);
+    }
+
+    public static long ConvertInteger(string input) {
+
+      return string.IsNullOrEmpty(input) ? default(long) : long.Parse(input);
+    }
+
+    public static string[] ConvertStringVector(string input) {
+      var length = input.Length - 1;
+      var strs = new List<string>();
+
+      for (var i = 1; i < length; i++) {
+        // collect string
+        var c = input[i];
+
+        if (c == ' ') continue;
+        if (c != '\"') throw new InvalidDataException("Unable to parse string vector");
+
+        var start = i + 1;
+        do {
+          i++;
+          c = input[i];
+        } while (i < length - 1  &&
+               !(c == '\"' && input[i + 1] == ' ') &&
+               !(i == length - 2 && c == '\"' && input[i + 1] == ']'));
+
+
+        var str = input.Substring(start, i - start);
+        strs.Add(str);
+      }
+
+      return strs.ToArray();
+    }
+
+    public static T[] ConvertMultiple<T>(string input, Func<string, T> converter) {
+      return input
+       .Trim(ArraySymbolTrim)
+       .Split(ArrayValueSeparator)
+       .Where(s => !string.IsNullOrWhiteSpace(s))
+       .Select(converter)
+       .ToArray();
+    }
+
+    public static IEnumerable<string> SplitByNewLine(string input) {
+      return input.Split(new[] { Environment.NewLine, "\n", "\r\n" }, StringSplitOptions.None);
+    }
+
+    private static string[] trueFormats = { "true", "t", "1" };
+    private static string[] falseFormats = { "false", "f", "0" };
+
+    public static bool ConvertBoolean(string input) {
+      var str = input.ToLower();
+
+      if (trueFormats.Contains(str)) return true;
+      if (falseFormats.Contains(str)) return false;
+      throw new InvalidDataException(string.Format("Unable to parse {0} as boolean", str));
+    }
+
+    public static bool[] ConvertBooleans(string input) {
+      return input
+        .Trim(ArraySymbolTrim)
+        .Split(ArrayValueSeparator)
+        .Where(s => !string.IsNullOrWhiteSpace(s))
+        .Select(ConvertBoolean)
+        .ToArray();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/ExampleArgumentType.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/ExampleArgumentType.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/ExampleArgumentType.cs	(revision 15771)
@@ -0,0 +1,13 @@
+﻿namespace HeuristicLab.BenchmarkSuite {
+  public enum ExampleArgumentType {
+    Integer,
+    IntegerVector,
+    Float,
+    FloatVector,
+    Boolean,
+    String,
+    StringVector,
+    Char,
+    Print,
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/IBenchmarkSuiteDataDescriptor.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/IBenchmarkSuiteDataDescriptor.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/IBenchmarkSuiteDataDescriptor.cs	(revision 15771)
@@ -0,0 +1,8 @@
+﻿namespace HeuristicLab.BenchmarkSuite {
+  using HeuristicLab.BenchmarkSuite.Problems;
+  using HeuristicLab.Problems.Instances;
+
+  public interface IBenchmarkSuiteDataDescriptor : IDataDescriptor {
+    ProblemData CreateProblemData();
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Plugin.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Plugin.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Plugin.cs	(revision 15771)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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/>.
+ *
+ * Author: Patrik Kimmeswegner
+ */
+
+#endregion
+
+namespace HeuristicLab.BenchmarkSuite {
+  using HeuristicLab.PluginInfrastructure;
+
+  [Plugin("HeuristicLab.Problems.ProgramSynthesis.BenchmarkSuite", "1.0")]
+  [PluginFile("HeuristicLab.Problems.ProgramSynthesis.BenchmarkSuite.dll", PluginFileType.Assembly)]
+  [PluginFile("Microsoft.IO.RecyclableMemoryStream.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Problems.ProgramSynthesis.Base", "1.0")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  public class Plugin : PluginBase {
+
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/ProblemData.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/ProblemData.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/ProblemData.cs	(revision 15771)
@@ -0,0 +1,99 @@
+﻿namespace HeuristicLab.BenchmarkSuite {
+  using System.Linq;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+  using HeuristicLab.Problems.ProgramSynthesis;
+
+  [StorableClass]
+  public class ProblemData : NamedItem {
+
+    public ProblemData(ProblemType problemType) {
+      Name = "BenchmarkSuite Problem Data";
+      ErcOptions = new ErcOptions(); // default does nothing
+      FloatStringFormat = "R";
+      ProblemType = problemType;
+    }
+
+    [StorableConstructor]
+    protected ProblemData(bool deserializing) : base(deserializing) { }
+
+    public ProblemData(ProblemData origin, Cloner cloner) : base(origin, cloner) {
+      TrainingCount = origin.TrainingCount;
+      TestCount = origin.TestCount;
+      BestResult = origin.BestResult;
+      WorstResult = origin.WorstResult;
+
+      InputArgumentTypes = (ExampleArgumentType[])origin.InputArgumentTypes.Clone();
+      OutputArgumentTypes = (ExampleArgumentType[])origin.OutputArgumentTypes.Clone();
+
+      if (origin.Examples != null)
+        Examples = origin.Examples.Select(cloner.Clone).ToArray();
+
+      EnabledDataTypes = origin.EnabledDataTypes;
+      ErcOptions = cloner.Clone(origin.ErcOptions);
+      FloatStringFormat = origin.FloatStringFormat;
+      ProblemType = origin.ProblemType;
+      ProgramExecutionBudget = origin.ProgramExecutionBudget;
+    }
+
+    [Storable]
+    public readonly ProblemType ProblemType;
+
+    [Storable]
+    public int TrainingCount { get; set; }
+    [Storable]
+    public int TestCount { get; set; }
+    [Storable]
+    public double BestResult { get; set; }
+    [Storable]
+    public double WorstResult { get; set; }
+    [Storable]
+    public ExampleArgumentType[] InputArgumentTypes { get; set; }
+    [Storable]
+    public ExampleArgumentType[] OutputArgumentTypes { get; set; }
+
+    public int TotalInputArgumentCount { get { return InputArgumentTypes.Length; } }
+    public int TotalOutputArgumentCount { get { return OutputArgumentTypes.Length; } }
+    public int TotalArgumentCount { get { return InputArgumentTypes.Length + OutputArgumentTypes.Length; } }
+
+    [Storable]
+    public Example[] Examples { get; set; }
+    [Storable]
+    public DataTypes EnabledDataTypes { get; set; }
+
+    /// <summary>
+    /// Max Size” gives the maximum number of instructions that can appear in an individual’s genome
+    /// </summary>
+    [Storable]
+    public int MaxSize { get; set; }
+
+    /// <summary>
+    /// “Eval Limit” is the number of steps of the Push interpreter that are executed before stopping a
+    /// program’s execution; programs halted in this way may still achieve good results if they print or
+    /// return results before they are stopped
+    /// </summary>
+    [Storable]
+    public int EvalLimit { get; set; }
+
+    /// <summary>
+    /// Specifies constant values and value ranges required to solve a certain problem
+    /// </summary>
+    [Storable]
+    public ErcOptions ErcOptions { get; set; }
+
+    /// <summary>
+    /// Represents the maximum number of programs that will be executed before a run is terminated, which is the product of the maximum generations, the population size, and the size of the training set.
+    /// </summary>
+    [Storable]
+    public int ProgramExecutionBudget { get; set; }
+
+    [Storable]
+    public string FloatStringFormat { get; set; }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ProblemData(this, cloner);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/ProblemType.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/ProblemType.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/ProblemType.cs	(revision 15771)
@@ -0,0 +1,34 @@
+﻿namespace HeuristicLab.BenchmarkSuite {
+  public enum ProblemType : uint {
+    Checksum,
+    CollatzNumbers,
+    CompareStringLengths,
+    CountOdds,
+    Digits,
+    DoubleLetters,
+    EvenSquares,
+    ForLoopIndex,
+    Grades,
+    LastIndexOfZero,
+    Median,
+    MedianIntegerError,
+    MirrorImage,
+    NegativeToZero,
+    NumberIO,
+    PigLatin,
+    ReplaceSpaceWithNewline,
+    ScrabbleScore,
+    Smallest,
+    SmallOrLarge,
+    StringDifferences,
+    StringLengthsBackwards,
+    SumOfSquares,
+    SuperAnagrams,
+    Syllables,
+    VectorAverage,
+    VectorSummed,
+    WallisPi,
+    WordStats,
+    XWordLines,
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Checksum.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Checksum.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Checksum.cs	(revision 15771)
@@ -0,0 +1,53 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class Checksum : BenchmarkSuiteDataDescriptor {
+    private const string name = "Checksum - Hard";
+    private const string fileName = "Checksum.csv";
+    private const string description = "Given a string, convert each character in the string into its integer ASCII value, sum them, take the sum modulo 64, add the integer value of the space character, and then convert that integer back into its corresponding character(the checksum character). The program must print Check sum is X, where X is replaced by the correct checksum character.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.Checksum) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 30000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 1000,
+        InputArgumentTypes = new[] { ExampleArgumentType.String },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Char | DataTypes.String | DataTypes.Print,
+        MaxSize = 800,
+        EvalLimit = 1500,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerConstantErc(64),
+            new IntegerRangeErc(-128, 128)),
+          CharErcOptions = new CharErcOptions(
+            new IntegerConstantErc(' '),
+            new IntegerRangeErc(0x20, 0x7e)),
+          StringErcOptions = new StringErcOptions(
+            new StringConstantErc("Check sum is "))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputString = input,
+        OutputPrint = output[0],
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/CollatzNumbers.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/CollatzNumbers.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/CollatzNumbers.cs	(revision 15771)
@@ -0,0 +1,48 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class CollatzNumbers : BenchmarkSuiteDataDescriptor {
+    private const string name = "Collatz Numbers - Hard";
+    private const string fileName = "CollatzNumbers.csv";
+    private const string description = "Given an integer, find the number of terms in the Collatz(hailstone) sequence starting from that integer.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.CollatzNumbers) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 60000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 1000000,
+        InputArgumentTypes = new[] { ExampleArgumentType.Integer },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Integer },
+        TrainingCount = 200,
+        TestCount = 2000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Float | DataTypes.Boolean,
+        MaxSize = 600,
+        EvalLimit = 15000,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerConstantErc(0, 1),
+            new IntegerRangeErc(-100, 100))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputInteger = ExampleArgumentConverter.ConvertIntegers(input[0]),
+        OutputInteger = ExampleArgumentConverter.ConvertIntegers(output[0]),
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/CompareStringLengths.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/CompareStringLengths.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/CompareStringLengths.cs	(revision 15771)
@@ -0,0 +1,50 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class CompareStringLengths : BenchmarkSuiteDataDescriptor {
+    private const string name = "Compare String Lengths - Hard";
+    private const string fileName = "CompareStringLengths.csv";
+    private const string description = " Given three strings n1, n2, and n3, return true if length(n1) < length(n2) < length(n3), and false otherwise";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 3; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.CompareStringLengths) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 30000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 1,
+        InputArgumentTypes = new[] { ExampleArgumentType.String, ExampleArgumentType.String, ExampleArgumentType.String },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Boolean },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.String,
+        MaxSize = 400,
+        EvalLimit = 600,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          BooleanErcOptions = new BooleanErcOptions(
+            new BooleanRandomErc {
+              AllowTrue = true,
+              AllowFalse = true
+            })
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputString = input,
+        OutputBoolean = ExampleArgumentConverter.ConvertBooleans(output[0])
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/CountOdds.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/CountOdds.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/CountOdds.cs	(revision 15771)
@@ -0,0 +1,48 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class CountOdds : BenchmarkSuiteDataDescriptor {
+    private const string name = "Count Odds - Hard";
+    private const string fileName = "CountOdds.csv";
+    private const string description = "Given a vector of integers, return the number of integers that are odd, without use of a specific even or odd instruction(but allowing instructions such as mod and quotient)";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.CountOdds) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 60000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 1000,
+        InputArgumentTypes = new[] { ExampleArgumentType.IntegerVector },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Integer },
+        TestCount = 2000,
+        TrainingCount = 200,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.IntegerVector,
+        MaxSize = 500,
+        EvalLimit = 1500,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerConstantErc(0, 1, 2),
+            new IntegerRangeErc(-1000, 1000)),
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputIntegerVector = new[] { ExampleArgumentConverter.ConvertIntegers(input[0]) },
+        OutputInteger = ExampleArgumentConverter.ConvertIntegers(output[0])
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Digits.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Digits.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Digits.cs	(revision 15771)
@@ -0,0 +1,49 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class Digits : BenchmarkSuiteDataDescriptor {
+    private const string name = "Digits - Hard";
+    private const string fileName = "Digits.csv";
+    private const string description = "Given an integer, print that integer’s digits each on their own line starting with the least significant digit.A negative integer should have the negative sign printed before the most significant digit.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.Digits) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 30000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.Integer },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Char | DataTypes.String | DataTypes.Print,
+        MaxSize = 300,
+        EvalLimit = 600,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(-10, 10)),
+          CharErcOptions = new CharErcOptions(
+            new IntegerConstantErc('\n'))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputInteger = ExampleArgumentConverter.ConvertIntegers(input[0]),
+        OutputPrint = output[0],
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/DoubleLetters.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/DoubleLetters.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/DoubleLetters.cs	(revision 15771)
@@ -0,0 +1,47 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class DoubleLetters : BenchmarkSuiteDataDescriptor {
+    private const string name = "Double Letters - Hard";
+    private const string fileName = "DoubleLetters.csv";
+    private const string description = "Given a string, print the string, doubling every letter character, and tripling every exclamation point.All other non-alphabetic and non-exclamation characters should be printed a single time each";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.DoubleLetters) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 30000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.String },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.String | DataTypes.Char | DataTypes.Print,
+        MaxSize = 800,
+        EvalLimit = 1600,
+        ErcOptions = {
+          ErcProbability = 0.02,
+          CharErcOptions = new CharErcOptions(
+            new IntegerConstantErc('!'))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputString = input,
+        OutputPrint = output[0],
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/EvenSquares.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/EvenSquares.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/EvenSquares.cs	(revision 15771)
@@ -0,0 +1,45 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System.Linq;
+
+  public class EvenSquares : BenchmarkSuiteDataDescriptor {
+    private const string name = "Even Sqaures - Hard";
+    private const string fileName = "EvenSquares.csv";
+    private const string description = " Given an integer n, print all of the positive even perfect squares less than n on separate lines.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.EvenSquares) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 30000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.Integer },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Print,
+        MaxSize = 400,
+        EvalLimit = 2000,
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputInteger = ExampleArgumentConverter.ConvertIntegers(input),
+        OutputPrint = output[0],
+
+        // helper
+        OutputIntegerVector = new [] { output[0].Split('\n').Select(ExampleArgumentConverter.ConvertInteger).ToArray() }
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Example.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Example.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Example.cs	(revision 15771)
@@ -0,0 +1,59 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class Example : DeepCloneable {
+    public Example() {
+      InputInt = new long[0];
+      InputFloat = new double[0];
+      InputBoolean = new bool[0];
+      OutputInt = InputInt;
+      OutputFloat = InputFloat;
+      OutputBoolean = InputBoolean;
+    }
+
+    public Example(Example origin, Cloner cloner) : base(origin, cloner) {
+      origin.CopyTo(this);
+    }
+
+    [StorableConstructor]
+    public Example(bool deserializing) { }
+
+    public void CopyTo(Example example) {
+      Array.Copy(InputArgs, example.InputArgs, InputArgs.Length);
+      Array.Copy(OutputArgs, example.OutputArgs, OutputArgs.Length);
+
+      Array.Copy(InputBoolean, example.InputBoolean, InputBoolean.Length);
+      Array.Copy(InputInt, example.InputInt, InputInt.Length);
+      Array.Copy(InputFloat, example.InputFloat, InputFloat.Length);
+
+      Array.Copy(OutputBoolean, example.OutputBoolean, OutputBoolean.Length);
+      Array.Copy(OutputInt, example.OutputInt, OutputInt.Length);
+      Array.Copy(OutputFloat, example.OutputFloat, OutputFloat.Length);
+    }
+
+    [Storable]
+    public string[] InputArgs { get; set; }
+    [Storable]
+    public string[] OutputArgs { get; set; }
+    [Storable]
+    public long[] InputInt { get; set; }
+    [Storable]
+    public double[] InputFloat { get; set; }
+    [Storable]
+    public bool[] InputBoolean { get; set; }
+    [Storable]
+    public long[] OutputInt { get; set; }
+    [Storable]
+    public double[] OutputFloat { get; set; }
+    [Storable]
+    public bool[] OutputBoolean { get; set; }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Example(this, cloner);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/ForLoopIndex.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/ForLoopIndex.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/ForLoopIndex.cs	(revision 15771)
@@ -0,0 +1,44 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class ForLoopIndex : BenchmarkSuiteDataDescriptor {
+    private const string name = "For Loop Index - Hard";
+    private const string fileName = "ForLoopIndex.csv";
+    private const string description = "Given 3 integer inputs start,end, and step, print the integers in the sequence n|0 = start, n|i = n|i−1 + step for each n|i < end, each on their own line.";
+
+    protected override string FileName { get { return fileName; } }
+
+    public override string Name { get { return name; } }
+
+    public override string Description { get { return description; } }
+
+    protected override int InputArgumentCount { get { return 3; } }
+
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.ForLoopIndex) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 30000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.String | DataTypes.Print,
+        MaxSize = 300,
+        EvalLimit = 600,
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputInteger = ExampleArgumentConverter.ConvertIntegers(input),
+        OutputPrint = output[0]
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Grades.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Grades.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Grades.cs	(revision 15771)
@@ -0,0 +1,69 @@
+﻿using System;
+using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class Grades : BenchmarkSuiteDataDescriptor {
+    private const string name = "Grades - Hard";
+    private const string fileName = "Grades.csv";
+    private const string description = "Given 5 integers, the first four represent the lower numeric thresholds for achieving an A, B, C, and D, and will be distinct and in descending order. The fifth represents the student’s numeric grade. The program must print Student has a X grade., where X is A, B, C, D, or F depending on the thresholds and the numeric grade.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 5; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.Grades) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 60000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 200,
+        TestCount = 2000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.String | DataTypes.Print,
+        MaxSize = 400,
+        EvalLimit = 800,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(0, 100)),
+          StringErcOptions = new StringErcOptions(
+            new StringConstantErc("Student has a ", " grade", "A", "B", "C", "D", "F"))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      char grade;
+      if (!GetGrade(output[0], out grade))
+        throw new InvalidOperationException("Unable to parse grade.");
+
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputInteger = ExampleArgumentConverter.ConvertIntegers(input),
+        OutputPrint = output[0],
+
+        // help
+        OutputChar = new[] { grade }
+      };
+    }
+
+    public static bool GetGrade(string str, out char grade) {
+      const string start = "Student has a ";
+
+      if (str.StartsWith(start) && str.Length > start.Length) {
+        grade = str[start.Length];
+        return true;
+      }
+
+      grade = default(char);
+      return false;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/LastIndexOfZero.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/LastIndexOfZero.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/LastIndexOfZero.cs	(revision 15771)
@@ -0,0 +1,48 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class LastIndexOfZero : BenchmarkSuiteDataDescriptor {
+    private const string name = "Last Index of Zero - Hard";
+    private const string fileName = "LastIndexOfZero.csv";
+    private const string description = "Given a vector of integers, at least one of which is 0, return the index of the last occurrence of 0 in the vector.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.LastIndexOfZero) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 45000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 1000000,
+        InputArgumentTypes = new[] { ExampleArgumentType.IntegerVector },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Integer },
+        TrainingCount = 150,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.IntegerVector,
+        MaxSize = 300,
+        EvalLimit = 600,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerConstantErc(0),
+            new IntegerRangeErc(-50, 50))
+          }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputIntegerVector = new[] { ExampleArgumentConverter.ConvertIntegers(input[0]) },
+        OutputInteger = ExampleArgumentConverter.ConvertIntegers(output[0]),
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Median.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Median.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Median.cs	(revision 15771)
@@ -0,0 +1,47 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class Median : BenchmarkSuiteDataDescriptor {
+    private const string name = "Median - Medium";
+    private const string fileName = "Median.csv";
+    private const string description = "Given 3 integers, print their median.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 3; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.Median) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 20000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 1,
+        InputArgumentTypes = new[] { ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Print,
+        MaxSize = 200,
+        EvalLimit = 200,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(-100, 100))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputInteger = ExampleArgumentConverter.ConvertIntegers(input),
+        OutputPrint = output[0]
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/MedianIntegerError.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/MedianIntegerError.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/MedianIntegerError.cs	(revision 15771)
@@ -0,0 +1,48 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class MedianIntegerError : BenchmarkSuiteDataDescriptor {
+    private const string name = "Median Integer Error - Medium";
+    private const string fileName = "Median.csv";
+    private const string description = "Given 3 integers, print their median.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 3; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.MedianIntegerError) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 20000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Print,
+        MaxSize = 200,
+        EvalLimit = 200,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(-100, 100))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputInteger = ExampleArgumentConverter.ConvertIntegers(input),
+        OutputPrint = output[0],
+        OutputInteger = new[] { long.Parse(output[0]) }
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/MirrorImage.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/MirrorImage.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/MirrorImage.cs	(revision 15771)
@@ -0,0 +1,53 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class MirrorImage : BenchmarkSuiteDataDescriptor {
+    private const string name = "Mirror Image - Medium";
+    private const string fileName = "MirrorImage.csv";
+    private const string description = "Given two vectors of integers, return true if one vector is the reverse of the other, and false otherwise.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 2; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.MirrorImage) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 30000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 1,
+        InputArgumentTypes = new[] { ExampleArgumentType.IntegerVector, ExampleArgumentType.IntegerVector },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Boolean },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.IntegerVector,
+        MaxSize = 300,
+        EvalLimit = 600,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          BooleanErcOptions = new BooleanErcOptions(
+            new BooleanRandomErc {
+              AllowFalse = true,
+              AllowTrue = true
+            })
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputIntegerVector = new[] {
+          ExampleArgumentConverter.ConvertIntegers(input[0]),
+          ExampleArgumentConverter.ConvertIntegers(input[1])
+        },
+        OutputBoolean = ExampleArgumentConverter.ConvertBooleans(output[0]),
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/NegativeToZero.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/NegativeToZero.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/NegativeToZero.cs	(revision 15771)
@@ -0,0 +1,49 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class NegativeToZero : BenchmarkSuiteDataDescriptor {
+    private const string name = "Negative to Zero - Medium";
+    private const string fileName = "NegativeToZero.csv";
+    private const string description = "Given a vector of integers, return the vector where all negative integers have been replaced by 0.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.NegativeToZero) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 60000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.IntegerVector },
+        OutputArgumentTypes = new[] { ExampleArgumentType.IntegerVector },
+        TrainingCount = 200,
+        TestCount = 2000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.IntegerVector,
+        MaxSize = 500,
+        EvalLimit = 1500,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerConstantErc(0)),
+          IntegerVectorErcOptions = new IntegerVectorErcOptions(
+            new IntegerVectorConstantsErc(new int[0]))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputIntegerVector = new[] { ExampleArgumentConverter.ConvertIntegers(input[0]) },
+        OutputIntegerVector = new[] { ExampleArgumentConverter.ConvertIntegers(output[0]) },
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/NumberIo.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/NumberIo.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/NumberIo.cs	(revision 15771)
@@ -0,0 +1,58 @@
+﻿using System;
+using System.Globalization;
+using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class NumberIO : BenchmarkSuiteDataDescriptor {
+    private const string name = "NumberIO - Easy";
+    private const string fileName = "NumberIO.csv";
+    private const string description = "Given an integer and a float, calc their sum.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 2; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.NumberIO) {
+        Name = Name,
+        FloatStringFormat = "N6",
+        Description = Description,
+        ProgramExecutionBudget = 5000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.Float, ExampleArgumentType.Integer },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 25,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Integer | DataTypes.Float | DataTypes.Print,
+        EvalLimit = 200,
+        MaxSize = 200,
+        ErcOptions = {
+          ErcProbability = 0.01,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(-100, 100)),
+          FloatErcOptions = new FloatErcOptions(
+            new FloatRangeErc(-100, 100))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      var estimedFloatValue = double.Parse(output[0], CultureInfo.InvariantCulture);
+      estimedFloatValue = Math.Round(estimedFloatValue, 6);
+
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputFloat = ExampleArgumentConverter.ConvertDoubles(input[0]),
+        InputInteger = ExampleArgumentConverter.ConvertIntegers(input[1]),
+        OutputFloat = new[] { estimedFloatValue },
+        OutputPrint = estimedFloatValue.ToString("N6", CultureInfo.InvariantCulture),
+      };
+    }
+  }
+}
+
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/PigLatin.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/PigLatin.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/PigLatin.cs	(revision 15771)
@@ -0,0 +1,57 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class PigLatin : BenchmarkSuiteDataDescriptor {
+    private const string name = "Pig Latin - Hard";
+    private const string fileName = "PigLatin.csv";
+    private const string description = "Given a string containing lowercase words separated by single spaces, print the string with each word translated to pig Latin.Specifically, if a word starts with a vowel, it should have“ay”added to its end; otherwise, the first letter is moved to the end of the word, followed by “ay”.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.PigLatin) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 60000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.String },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 200,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Char | DataTypes.String | DataTypes.Print,
+        MaxSize = 1000,
+        EvalLimit = 2000,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          CharErcOptions = new CharErcOptions(
+            new IntegerConstantErc(' ', 'a', 'e', 'i', 'o', 'u'),
+            new IntegerRangeErc(0x20, 0x7e)),
+          StringErcOptions = new StringErcOptions(
+            new StringConstantErc("ay", "aeiou"),
+            new StringRandomErc {
+              IsEnabled = true,
+              AllowLowercaseLetters = true,
+              AllowUppercaseLetters = false,
+              AllowSpace = true,
+              SpaceProbability = 0.2,
+          })
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputString = input,
+        OutputPrint = output[0],
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/ReplaceSpaceWithNewline.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/ReplaceSpaceWithNewline.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/ReplaceSpaceWithNewline.cs	(revision 15771)
@@ -0,0 +1,57 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class ReplaceSpaceWithNewline : BenchmarkSuiteDataDescriptor {
+    private const string name = "Replace Space with Newline - Medium";
+    private const string fileName = "ReplaceSpaceWithNewline.csv";
+    private const string description = " Given a string input, print the string, replacing spaces with newlines.Also, return the integer count of the non- whitespace characters. The input string will not have tabs or newlines.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 2; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.ReplaceSpaceWithNewline) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 30000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.String },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print, ExampleArgumentType.Integer },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Char | DataTypes.String | DataTypes.Print,
+        MaxSize = 800,
+        EvalLimit = 1600,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          CharErcOptions = new CharErcOptions(
+            new IntegerConstantErc(' ', '\n'),
+            new IntegerRangeErc(0x20, 0x7e)),
+          StringErcOptions = new StringErcOptions(
+            new StringRandomErc {
+              IsEnabled = true,
+              AllowLowercaseLetters = true,
+              AllowUppercaseLetters = false,
+              AllowSpace = true,
+              SpaceProbability = 0.2
+            })
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputString = input,
+        OutputPrint = output[0],
+        OutputInteger = ExampleArgumentConverter.ConvertIntegers(output[1]),
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/ScrabbleScore.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/ScrabbleScore.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/ScrabbleScore.cs	(revision 15771)
@@ -0,0 +1,79 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class ScrabbleScore : BenchmarkSuiteDataDescriptor {
+    private const string name = "Scrabble Score - Hard";
+    private const string fileName = "ScrabbleScore.csv";
+    private const string description = "Given a string of visible ASCII characters, return the Scrabble score for that string. Each letter has a corresponding value according to normal Scrabble rules, and non-letter characters are worth zero.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    //vector containing Scrabble values (indexed by ASCII values)
+    private static readonly int[] ScrabbleValues = {
+      1, // A
+      3, // B
+      3, // C
+      2, // D
+      1, // E
+      4, // F
+      2, // G
+      4, // H
+      1, // I
+      8, // J
+      5, // K
+      1, // L
+      3, // M
+      1, // N
+      1, // O
+      3, // P
+     10, // Q
+      1, // R
+      1, // S
+      1, // T
+      1, // U
+      4, // V
+      4, // W
+      8, // X
+      4, // Y
+     10, // Z
+    };
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.ScrabbleScore) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 60000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 1000,
+        InputArgumentTypes = new[] { ExampleArgumentType.String },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Integer },
+        TrainingCount = 200,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Char | DataTypes.String | DataTypes.IntegerVector,
+        MaxSize = 1000,
+        EvalLimit = 2000,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerConstantErc(ScrabbleValues)),
+          IntegerVectorErcOptions = new IntegerVectorErcOptions(
+            new IntegerVectorConstantsErc(ScrabbleValues))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputString = input,
+        OutputInteger = ExampleArgumentConverter.ConvertIntegers(output[0])
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/SmallOrLarge.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/SmallOrLarge.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/SmallOrLarge.cs	(revision 15771)
@@ -0,0 +1,50 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class SmallOrLarge : BenchmarkSuiteDataDescriptor {
+    private const string name = "Small or Large - Hard";
+    private const string fileName = "SmallOrLarge.csv";
+    private const string description =
+      "Given an integer n, print “small” if n < 1000 and “large” if n ≥ 2000 (and nothing if 1000 ≤ n < 2000).";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.SmallOrLarge) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 30000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.Integer },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.String | DataTypes.Print,
+        MaxSize = 200,
+        EvalLimit = 300,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(-10000, 10000)),
+          StringErcOptions = new StringErcOptions(
+            new StringConstantErc("small", "large"))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputInteger = ExampleArgumentConverter.ConvertIntegers(input[0]),
+        OutputPrint = output[0]
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Smallest.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Smallest.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Smallest.cs	(revision 15771)
@@ -0,0 +1,49 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class Smallest : BenchmarkSuiteDataDescriptor {
+    private const string name = "Smallest - Easy";
+    private const string fileName = "Smallest.csv";
+    private const string description = "Given 4 integers, print the smallest of them.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 4; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.Smallest) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 20000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 1,
+        InputArgumentTypes = new[] { ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Print,
+        MaxSize = 200,
+        EvalLimit = 200,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(-100, 100)),
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputInteger = ExampleArgumentConverter.ConvertIntegers(input),
+        OutputPrint = output[0],
+        // Helper
+        OutputInteger = ExampleArgumentConverter.ConvertIntegers(output[0]),
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/StringDifferences.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/StringDifferences.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/StringDifferences.cs	(revision 15771)
@@ -0,0 +1,49 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class StringDifferences : BenchmarkSuiteDataDescriptor {
+    private const string name = "String Differences - Hard";
+    private const string fileName = "StringDifferences.csv";
+    private const string description = "Given 2 strings (without whitespace) as input, find the indices at which the strings have different characters, stopping at the end of the shorter one. For each such index, print a line containing the index as well as the character in each string. For example, if the strings are “dealer” and “dollars”, the program should print: 1 e o, 2 a l, 4 e a";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 2; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.StringDifferences) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 60000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.String, ExampleArgumentType.String },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 200,
+        TestCount = 2000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Char | DataTypes.String | DataTypes.Print,
+        MaxSize = 1000,
+        EvalLimit = 2000,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          CharErcOptions = new CharErcOptions(
+            new IntegerConstantErc(' ', '\n')),
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(-10, 10))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputString = input,
+        OutputPrint = output[0],
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/StringLengthsBackwards.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/StringLengthsBackwards.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/StringLengthsBackwards.cs	(revision 15771)
@@ -0,0 +1,47 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class StringLengthsBackwards : BenchmarkSuiteDataDescriptor {
+    private const string name = "String Length Backwards - Medium";
+    private const string fileName = "StringLengthsBackwards.csv";
+    private const string description = "Given a vector of strings, print the length of each string in the vector starting with the last and ending with the first.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.StringLengthsBackwards) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 30000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.StringVector },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.String | DataTypes.StringVector | DataTypes.Print,
+        MaxSize = 300,
+        EvalLimit = 600,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(-100, 100))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputStringVector = new[] { ExampleArgumentConverter.ConvertStringVector(input[0]) },
+        OutputPrint = output[0],
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/SumOfSquares.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/SumOfSquares.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/SumOfSquares.cs	(revision 15771)
@@ -0,0 +1,47 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class SumOfSquares : BenchmarkSuiteDataDescriptor {
+    private const string name = "Sum of Squares - Hard";
+    private const string fileName = "SumOfSquares.csv";
+    private const string description = "Given integer n, return the sum of squaring each integer in the range[1, n].";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.SumOfSquares) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 15000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 1000000000, // 338350,
+        InputArgumentTypes = new[] { ExampleArgumentType.Integer },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Integer },
+        TrainingCount = 50,
+        TestCount = 100,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean,
+        MaxSize = 400,
+        EvalLimit = 4000,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(-100, 100))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputInteger = ExampleArgumentConverter.ConvertIntegers(input[0]),
+        OutputInteger = ExampleArgumentConverter.ConvertIntegers(output[0]),
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/SuperAnagrams.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/SuperAnagrams.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/SuperAnagrams.cs	(revision 15771)
@@ -0,0 +1,55 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class SuperAnagrams : BenchmarkSuiteDataDescriptor {
+    private const string name = "Super Anagrams - Hard";
+    private const string fileName = "SuperAnagrams.csv";
+    private const string description = "Given strings x and y of lowercase letters, return true if y is a super anagram of x, which is the case if every character in x is in y.To be true, y may contain extra characters, but must have at least as many copies of each character as x does.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 2; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.SuperAnagrams) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 60000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 1,
+        InputArgumentTypes = new[] { ExampleArgumentType.String, ExampleArgumentType.String },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Boolean },
+        TrainingCount = 200,
+        TestCount = 2000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Char | DataTypes.String,
+        MaxSize = 800,
+        EvalLimit = 1600,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          BooleanErcOptions = new BooleanErcOptions(
+            new BooleanRandomErc {
+              IsEnabled = true,
+              AllowFalse = true,
+              AllowTrue = true
+            }),
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(-1000, 1000)),
+          CharErcOptions = new CharErcOptions(
+            new IntegerRangeErc(0x20, 0x7e))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputString = input,
+        OutputBoolean = ExampleArgumentConverter.ConvertBooleans(output[0]),
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Syllables.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Syllables.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/Syllables.cs	(revision 15771)
@@ -0,0 +1,79 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+using System;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class Syllables : BenchmarkSuiteDataDescriptor {
+    private const string name = "Syllables - Hard";
+    private const string fileName = "Syllables.csv";
+    private const string description = "Given a string containing symbols, spaces, digits, and lowercase letters, count the number of occurrences of vowels(a, e, i, o, u, y) in the string and print that number as X in The number of syllables is X.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.Syllables) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 30000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.String },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Char | DataTypes.String | DataTypes.Print,
+        MaxSize = 800,
+        EvalLimit = 1600,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          StringErcOptions = new StringErcOptions(
+            new StringConstantErc("The number of syllables is ", "aeiouy" ),
+            new StringRandomErc {
+              AllowLowercaseLetters = true,
+              AllowUppercaseLetters = false,
+              AllowDigits = true,
+              AllowSymbols = true,
+              AllowSpace = true,
+              SpaceProbability = 0.2,
+              VowelProbability = 0.2
+            }),
+          CharErcOptions = new CharErcOptions (
+            new IntegerConstantErc('a', 'e', 'i', 'o', 'u'),
+            new IntegerRangeErc(0x20, 0x7e))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      long numberOfSyllables;
+      if (!GetNumberOfSyllables(output[0], out numberOfSyllables))
+        throw new InvalidOperationException("Unable to parse number of syllables.");
+
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputString = input,
+        OutputPrint = output[0],
+
+        // help
+        OutputInteger = new[] { numberOfSyllables }
+      };
+    }
+
+    public static bool GetNumberOfSyllables(string str, out long numberOfSyllables) {
+      if (str.Length == 0) {
+        numberOfSyllables = 0;
+        return false;
+      }
+
+      var lastIndex = str.Length - 1;
+      var lastCharStr = str[lastIndex].ToString();
+
+      return long.TryParse(lastCharStr, out numberOfSyllables);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/VectorAverage.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/VectorAverage.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/VectorAverage.cs	(revision 15771)
@@ -0,0 +1,45 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System;
+  using System.Linq;
+
+  public class VectorAverage : BenchmarkSuiteDataDescriptor {
+    private const string name = "Vector Average - Hard";
+    private const string fileName = "VectorAverage.csv";
+    private const string description = "Given a vector of floats, return the average of those floats. Results are rounded to 4 decimal places.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.VectorAverage) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 30000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 10000,
+        InputArgumentTypes = new[] { ExampleArgumentType.FloatVector },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Float },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Float | DataTypes.FloatVector,
+        MaxSize = 400,
+        EvalLimit = 800,
+        FloatStringFormat = "N4"
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputFloatVector = new[] { ExampleArgumentConverter.ConvertDoubles(input[0]) },
+        OutputFloat = ExampleArgumentConverter.ConvertDoubles(output[0]).Select(x => Math.Round(x, 4)).ToArray(),
+        OutputFloatPrecision = 4
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/VectorSummed.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/VectorSummed.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/VectorSummed.cs	(revision 15771)
@@ -0,0 +1,52 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class VectorSummed : BenchmarkSuiteDataDescriptor {
+    private const string name = "Vector Summed - Hard";
+    private const string fileName = "VectorSummed.csv";
+    private const string description = "Given two equal-sized vectors of integers, return a vector of integers that contains the sum of the input vectors at each index.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 2; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.VectorSummed) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 45000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 1000000000,
+        InputArgumentTypes = new[] { ExampleArgumentType.IntegerVector, ExampleArgumentType.IntegerVector },
+        OutputArgumentTypes = new[] { ExampleArgumentType.IntegerVector },
+        TrainingCount = 150,
+        TestCount = 1500,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.IntegerVector,
+        MaxSize = 400,
+        EvalLimit = 4000,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          IntegerVectorErcOptions = new IntegerVectorErcOptions(
+            new IntegerVectorConstantsErc(new int[0])),
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(-1000, 1000))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputIntegerVector = new[] {
+          ExampleArgumentConverter.ConvertIntegers(input[0]),
+          ExampleArgumentConverter.ConvertIntegers(input[1]),
+        },
+        OutputIntegerVector = new[] { ExampleArgumentConverter.ConvertIntegers(output[0]) },
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/WallisPi.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/WallisPi.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/WallisPi.cs	(revision 15771)
@@ -0,0 +1,51 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class WallisPi : BenchmarkSuiteDataDescriptor {
+    private const string name = "Wallis Pi - Hard";
+    private const string fileName = "WallisPi.csv";
+    private const string description = " John Wallis gave a infinite product that converges to π/4. Given an integer input n, compute an approximation of this product out to n terms. Results are rounded to 5 decimal places.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.WallisPi) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 45000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 1000000,
+        InputArgumentTypes = new[] { ExampleArgumentType.Integer },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Float },
+        TrainingCount = 150,
+        TestCount = 50,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Float | DataTypes.Boolean,
+        MaxSize = 600,
+        EvalLimit = 8000,
+        FloatStringFormat = "N5",
+        ErcOptions = {
+          ErcProbability = 0.05,
+          FloatErcOptions = new FloatErcOptions(
+            new FloatRangeErc(-500, 500)),
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(-500, 500))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputInteger = ExampleArgumentConverter.ConvertIntegers(input),
+        OutputFloat = ExampleArgumentConverter.ConvertDoubles(output),
+        OutputFloatPrecision = 5
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/WordStats.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/WordStats.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/WordStats.cs	(revision 15771)
@@ -0,0 +1,103 @@
+﻿using System;
+using System.Linq;
+using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+  public class WordStats : BenchmarkSuiteDataDescriptor {
+    private const string name = "Word Stats - Hard";
+    private const string fileName = "WordStats.csv";
+    private const string description = "Given a string, print the number of words containing n characters for n from 1 to the length of the longest word. At the end of the output, print a line that gives the number of sentences and line that gives the average sentence length. A word is any string of consecutive non-whitespace characters(including sentence terminators). Every string will contain at least one sentence terminator(period, exclamation point, or question mark). The average sentence length is the number of words in the file divided by the number of sentence terminator characters.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 1; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.WordStats) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 30000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 10000,
+        InputArgumentTypes = new[] { ExampleArgumentType.String },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 100,
+        TestCount = 1000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Float | DataTypes.Boolean | DataTypes.Char | DataTypes.String | DataTypes.IntegerVector | DataTypes.FloatVector | DataTypes.StringVector | DataTypes.Print,
+        MaxSize = 1000,
+        EvalLimit = 6000,
+        FloatStringFormat = "0.0#########",
+        ErcOptions = {
+        ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerRangeErc(-100, 100)),
+          IntegerVectorErcOptions = new IntegerVectorErcOptions(
+            new IntegerVectorConstantsErc(new int[0])),
+          CharErcOptions = new CharErcOptions(
+            new IntegerConstantErc('.', '?', '!', ' ', '\t', '\n', ':')),
+          StringErcOptions = new StringErcOptions(
+            new StringConstantErc("words of length ", ": ", "number of sentences: ", "average sentence length: "))
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      long numberOfSentences;
+      if (!GetNumberOfSentences(output[0], out numberOfSentences))
+        throw new InvalidOperationException("Unable to find or parse line with number of sentences.");
+
+      double averageSentenceLength;
+      if (!GetAverageSentenceLength(output[0], out averageSentenceLength))
+        throw new InvalidOperationException("Unable to find line or parse with average sentence length.");
+
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputString = input,
+        OutputPrint = output[0],
+
+        // help
+        OutputInteger = new[] { numberOfSentences },
+        OutputFloat = new[] { averageSentenceLength }
+      };
+    }
+
+    public static bool GetNumberOfSentences(string str, out long numberOfSentences) {
+      var lines = str.Split('\n');
+      var requiredLineIndex = lines.Length - 2;
+      numberOfSentences = 0;
+
+      if (requiredLineIndex < 0)
+        return false;
+
+      var line = lines[requiredLineIndex];
+      var numberOfSentencesStr = line.Split(' ').Last();
+
+
+      if (!long.TryParse(numberOfSentencesStr, out numberOfSentences))
+        return false;
+
+      return true;
+    }
+
+    public static bool GetAverageSentenceLength(string str, out double averageSentenceLength) {
+      var lines = str.Split('\n');
+      var requiredLineIndex = lines.Length - 1;
+      averageSentenceLength = 0;
+
+      if (requiredLineIndex < 0)
+        return false;
+
+      var line = lines[requiredLineIndex];
+      var averageSentenceLengthStr = line.Split(' ').Last();
+
+      if (!double.TryParse(averageSentenceLengthStr, out averageSentenceLength))
+        return false;
+
+      return true;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/XWordLines.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/XWordLines.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/BenchmarkSuite/Problems/XWordLines.cs	(revision 15771)
@@ -0,0 +1,52 @@
+﻿using System.Linq;
+using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.BenchmarkSuite.Problems {
+
+  public class XWordLines : BenchmarkSuiteDataDescriptor {
+    private const string name = "X-Word Lines - Hard";
+    private const string fileName = "XWordLines.csv";
+    private const string description = "Given an integer X and a string that can contains spaces and newlines, print the string with exactly X words per line. The last line may have fewer than X words.";
+
+    protected override string FileName { get { return fileName; } }
+    public override string Name { get { return name; } }
+    public override string Description { get { return description; } }
+    protected override int InputArgumentCount { get { return 2; } }
+    protected override int OutputArgumentCount { get { return 1; } }
+
+    public override ProblemData CreateProblemData() {
+      return new ProblemData(ProblemType.XWordLines) {
+        Name = Name,
+        Description = Description,
+        ProgramExecutionBudget = 45000000,
+        Examples = CloneExamples(),
+        BestResult = 0,
+        WorstResult = 5000,
+        InputArgumentTypes = new[] { ExampleArgumentType.Integer, ExampleArgumentType.String },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
+        TrainingCount = 150,
+        TestCount = 2000,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Char | DataTypes.String | DataTypes.Print,
+        MaxSize = 800,
+        EvalLimit = 1600,
+        ErcOptions = {
+          ErcProbability = 0.05,
+          CharErcOptions = new CharErcOptions(
+            new IntegerConstantErc(' ', '\n')),
+        }
+      };
+    }
+
+    protected override Example ParseExample(string[] input, string[] output) {
+      return new Example {
+        InputArgs = input,
+        OutputArgs = output,
+        InputInteger = ExampleArgumentConverter.ConvertIntegers(input[1]),
+        InputString = new[] { input[0] },
+        OutputPrint = output[0],
+        // Helper
+        OutputInteger = new[] { input[0].Split(' ', '\n').LongCount(x => !string.IsNullOrWhiteSpace(x)) }
+      };
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/IEnabledExpressionsConfiguration.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/IEnabledExpressionsConfiguration.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/IEnabledExpressionsConfiguration.cs	(revision 15771)
@@ -0,0 +1,40 @@
+﻿using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Core;
+
+  public class EnabledExpressionsChangedEventArgs : EventArgs {
+    public IEnumerable<string> AddedExpressions { get; private set; }
+    public IEnumerable<string> RemovedExpressions { get; private set; }
+
+    public EnabledExpressionsChangedEventArgs(IEnumerable<string> addedExpressions, IEnumerable<string> removedExpressions) {
+      AddedExpressions = addedExpressions;
+      RemovedExpressions = removedExpressions;
+    }
+  }
+
+  public interface IReadOnlyExpressionsConfiguration : INamedItem {
+    int InExpressionCount { get; }
+
+
+    IReadOnlyList<string> EnabledExpressions { get; }
+    IReadOnlyDictionary<StackTypes, int> ExpressionsPerStackCount { get; }
+  }
+
+  public interface IExpressionsConfiguration : IReadOnlyExpressionsConfiguration {
+    event EventHandler<EnabledExpressionsChangedEventArgs> EnabledExpressionsChanged;
+
+    void EnableStack(StackTypes types, bool enableDependencies = false);
+    void DisableStack(StackTypes type, bool enableDependencies = false);
+    void SetStack(StackTypes type, bool state, bool setDependencies = false);
+    void EnableExpressionOfStack(StackTypes types);
+    void DisableExpressionsOfStack(StackTypes types);
+    void EnableExpression(string name);
+    void DisableExpression(string name);
+    void SetExpression(string name, bool state);
+    void SetExpression<T>(bool state) where T : Expression;
+    void EnableExpression<T>() where T : Expression;
+    void DisableExpression<T>() where T : Expression;
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/IReadonlyPushConfiguration.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/IReadonlyPushConfiguration.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/IReadonlyPushConfiguration.cs	(revision 15771)
@@ -0,0 +1,19 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  public interface IReadOnlyPushConfiguration : IReadOnlyExpressionsConfiguration {
+    int EvalPushLimit { get; }
+    int MaxDepth { get; }
+    int MaxStringLength { get; }
+    int MaxVectorLength { get; }
+    int MaxProgramLength { get; }
+    int MaxPointsInRandomExpression { get; }
+    bool TopLevelPushCode { get; }
+    bool TopLevelPopCode { get; }
+    int MaxClose { get; }
+    double CloseBiasLevel { get; }
+    IReadOnlyErcOptions ErcOptions { get; }
+    string FloatStringFormat { get; }
+    bool TopLevelPushInputArguments { get; }
+
+    bool IsStackEnabled(StackTypes stackType);
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfiguration.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfiguration.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfiguration.cs	(revision 15771)
@@ -0,0 +1,337 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Collections.Generic;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class PushConfiguration : PushConfigurationBase, IReadOnlyPushConfiguration {
+    private const string INSTRUCTIONS_PARAMETER_NAME = "Instructions";
+    private const string INSTRUCTIONS_PARAMETER_DESCRIPTION = "Enables/Disables Instructions";
+    private const string EVAL_PUSH_LIMIT_PARAMETER_NAME = "EvalPushLimit";
+    private const string EVAL_PUSH_LIMIT_PARAMETER_DESCRIPTION = "This is the maximum allowed number of \"executions\" in a single top-level call to the interpreter. The execution of a single Push instruction counts as one execution, as does the processing of a single literal, as does the descent into one layer of parentheses (that is, the processing of the \"(\" counts as one execution).";
+    private const string MIN_PROGRAM_LENGTH = "MinProgramLength";
+    private const string MIN_PROGRAM_LENGTH_PARAMETER_DESCRIPTION = "This is the minium size of an item on the CODE/EXEC stack, expressed as a number of points. A point is an instruction, a literal, or a pair of parentheses.";
+    private const string MAX_PROGRAM_LENGTH = "MaxProgramLength";
+    private const string MAX_PROGRAM_LENGTH_PARAMETER_DESCRIPTION = "This is the maximum size of an item on the CODE/EXEC stack, expressed as a number of points. A point is an instruction, a literal, or a pair of parentheses.";
+    private const string TOP_LEVEL_PUSH_CODE_PARAMETER_NAME = "TopLevelPushCode";
+    private const string TOP_LEVEL_PUSH_CODE_PARAMETER_DESCRIPTION = "When TRUE (which is the default), code passed to the top level of the interpreter will be pushed onto the CODE stack prior to execution.";
+    private const string TOP_LEVEL_POP_CODE_PARAMETER_NAME = "TopLevelPopCode";
+    private const string TOP_LEVEL_POP_CODE_PARAMETER_DESCRIPTION = "When TRUE, the CODE stack will be popped at the end of top level calls to the interpreter. The default is FALSE.";
+    private const string MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_NAME = "MaxPointsInRandomInstruction";
+    private const string MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_DESCRIPTION = "MaxPointsInRandomInstruction";
+    private const string ERC_OPTIONS_PARAMETER_NAME = "ERC options";
+    private const string MAX_STRING_LENGTH_PARAMETER_NAME = "Max. string length of string literals";
+    private const string MAX_DEPTH_PARAMETER_NAME = "Max. depth of a Push program";
+    private const string MAX_CLOSE_PARAMETER_NAME = "Max. close";
+    private const string MAX_PARENTHESES_CLOSE_PARAMETER_DESCRIPTION = "Specifies how many sub programs are max. closed if open during the recursive translation of an individual to a push program. Value is exclusive.";
+    private const string CLOSE_BIAS_LEVEL_PARAMETER_NAME = "Close bias level";
+    private const string PARENTHESES_CLOSE_BIAS_LEVEL_PARAMETER_DESCRIPTION = "Specifies how strong a random value between 0 .. 'Max. parentheses close' is biased towards 0. In other words, this parameter controls the length of sub programs.";
+    private const string MAX_VECTOR_LENGTH_PARAMETER_NAME = "Max. vector length";
+    private const string TOP_LEVEL_PUSH_INPUT_ARGUMENTS = "TopLevelPushInputArguments";
+
+    public PushConfiguration() {
+      Parameters = new ParameterCollection();
+      InitParameters();
+
+      FloatStringFormat = "R";
+    }
+
+    public PushConfiguration(PushConfiguration origin, Cloner cloner) : base(origin, cloner) {
+      Parameters = cloner.Clone(origin.Parameters);
+      FloatStringFormat = origin.FloatStringFormat;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PushConfiguration(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected PushConfiguration(bool deserialize) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    // ReSharper disable once UnusedMember.Local
+    private void AfterDeserialization() {
+      InitParameters();
+    }
+
+    [Storable]
+    public ParameterCollection Parameters { get; private set; }
+
+    [Storable]
+    public string FloatStringFormat { get; set; }
+
+    private void InitParameters() {
+      if (!Parameters.ContainsKey(INSTRUCTIONS_PARAMETER_NAME))
+        Parameters.Add(new ValueParameter<IExpressionsConfiguration>(
+          INSTRUCTIONS_PARAMETER_NAME,
+          INSTRUCTIONS_PARAMETER_DESCRIPTION,
+          this));
+
+      if (!Parameters.ContainsKey(ERC_OPTIONS_PARAMETER_NAME))
+        Parameters.Add(new ValueParameter<ErcOptions>(ERC_OPTIONS_PARAMETER_NAME));
+
+      if (!Parameters.ContainsKey(MAX_VECTOR_LENGTH_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MAX_VECTOR_LENGTH_PARAMETER_NAME,
+          new IntValue(500)) { Hidden = true });
+
+      if (!Parameters.ContainsKey(EVAL_PUSH_LIMIT_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          EVAL_PUSH_LIMIT_PARAMETER_NAME,
+          EVAL_PUSH_LIMIT_PARAMETER_DESCRIPTION,
+          new IntValue(1000)));
+
+      if (!Parameters.ContainsKey(MAX_PROGRAM_LENGTH))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MAX_PROGRAM_LENGTH,
+          MAX_PROGRAM_LENGTH_PARAMETER_DESCRIPTION,
+          new IntValue(200)));
+
+      if (!Parameters.ContainsKey(MIN_PROGRAM_LENGTH))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MIN_PROGRAM_LENGTH,
+          MIN_PROGRAM_LENGTH_PARAMETER_DESCRIPTION,
+          new IntValue(0)) { Hidden = false });
+
+      if (!Parameters.ContainsKey(MAX_CLOSE_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MAX_CLOSE_PARAMETER_NAME,
+          MAX_PARENTHESES_CLOSE_PARAMETER_DESCRIPTION,
+          new IntValue(4)) { Hidden = false });
+
+      if (!Parameters.ContainsKey(CLOSE_BIAS_LEVEL_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<DoubleValue>(
+          CLOSE_BIAS_LEVEL_PARAMETER_NAME,
+          PARENTHESES_CLOSE_BIAS_LEVEL_PARAMETER_DESCRIPTION,
+          new DoubleValue(3)) { Hidden = false });
+
+      if (!Parameters.ContainsKey(TOP_LEVEL_PUSH_CODE_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<BoolValue>(
+          TOP_LEVEL_PUSH_CODE_PARAMETER_NAME,
+          TOP_LEVEL_PUSH_CODE_PARAMETER_DESCRIPTION,
+          new BoolValue(true)) { Hidden = true });
+
+      if (!Parameters.ContainsKey(TOP_LEVEL_POP_CODE_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<BoolValue>(
+          TOP_LEVEL_POP_CODE_PARAMETER_NAME,
+          TOP_LEVEL_POP_CODE_PARAMETER_DESCRIPTION,
+          new BoolValue(false)) { Hidden = true });
+
+      if (!Parameters.ContainsKey(MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_NAME,
+          MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_DESCRIPTION,
+          new IntValue(50)) { Hidden = true });
+
+      if (!Parameters.ContainsKey(MAX_STRING_LENGTH_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MAX_STRING_LENGTH_PARAMETER_NAME,
+          new IntValue(1000)) { Hidden = true });
+
+      if (!Parameters.ContainsKey(MAX_DEPTH_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MAX_DEPTH_PARAMETER_NAME,
+          new IntValue(1000)) { Hidden = true });
+
+      if (!Parameters.ContainsKey(TOP_LEVEL_PUSH_INPUT_ARGUMENTS))
+        Parameters.Add(new FixedValueParameter<BoolValue>(
+          TOP_LEVEL_PUSH_INPUT_ARGUMENTS,
+          new BoolValue(true)) { Hidden = false });
+    }
+
+    public IValueParameter<IExpressionsConfiguration> InstructionsParameter {
+      get { return (IValueParameter<IExpressionsConfiguration>)Parameters[INSTRUCTIONS_PARAMETER_NAME]; }
+    }
+
+    public IExpressionsConfiguration Instructions {
+      get { return InstructionsParameter.Value; }
+      set { InstructionsParameter.Value = value; }
+    }
+
+    public IValueParameter<ErcOptions> ErcOptionsParameter {
+      get { return (IValueParameter<ErcOptions>)Parameters[ERC_OPTIONS_PARAMETER_NAME]; }
+    }
+
+    public ErcOptions ErcOptions {
+      get { return ErcOptionsParameter.Value; }
+      set {
+        ErcOptionsParameter.Value = value;
+      }
+    }
+
+    IReadOnlyList<string> IReadOnlyExpressionsConfiguration.EnabledExpressions {
+      get {
+        return enabledExpressions;
+      }
+    }
+
+    IReadOnlyErcOptions IReadOnlyPushConfiguration.ErcOptions {
+      get {
+        return ErcOptions;
+      }
+    }
+
+    /// <summary>
+    ///     This is the maximum allowed number of "executions" in a single top-level call to the interpreter.
+    ///     The execution of a single Push instruction counts as one execution, as does the processing of a single literal,
+    ///     as does the descent into one layer of parentheses (that is, the processing of the "(" counts as one execution).
+    ///     When this limit is exceeded the interpreter aborts immediately, leaving its stacks in the states they were in prior
+    ///     to the abort (so they may still be examined by a calling program). Whether or not this counts as an "abnormal"
+    ///     termination
+    ///     is up to the calling program.
+    /// </summary>
+    public IValueParameter<IntValue> EvalPushLimitParameter {
+      get { return (IValueParameter<IntValue>)Parameters[EVAL_PUSH_LIMIT_PARAMETER_NAME]; }
+    }
+
+    public int EvalPushLimit {
+      get { return EvalPushLimitParameter.Value.Value; }
+      set { EvalPushLimitParameter.Value.Value = value; }
+    }
+
+
+    /// <summary>
+    /// Determines the likelihood of smaller or bigger values.
+    /// x greater than 1 means that result is biased towards min.
+    /// x smaller than 1 means that result is biased towards max.
+    /// </summary>
+    public IValueParameter<DoubleValue> CloseBiasLevelParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[CLOSE_BIAS_LEVEL_PARAMETER_NAME]; }
+    }
+
+    public double CloseBiasLevel {
+      get { return CloseBiasLevelParameter.Value.Value; }
+      set { CloseBiasLevelParameter.Value.Value = value; }
+    }
+
+    /// <summary>
+    /// Determines the maximum of blocks which will be closed.
+    /// </summary>
+    public IValueParameter<IntValue> MaxCloseParameter {
+      get { return (IValueParameter<IntValue>)Parameters[MAX_CLOSE_PARAMETER_NAME]; }
+    }
+
+    public int MaxClose {
+      get { return MaxCloseParameter.Value.Value; }
+      set {
+        MaxCloseParameter.Value.Value = value;
+      }
+    }
+
+    /// <summary>
+    /// This is the maximum of depth a push program can have. Expressions, which lead to exceed this limit are interpreted as NOOP.
+    /// </summary>
+    public IValueParameter<IntValue> MaxDepthParameter {
+      get { return (IValueParameter<IntValue>)Parameters[MAX_DEPTH_PARAMETER_NAME]; }
+    }
+
+    public int MaxDepth {
+      get { return MaxDepthParameter.Value.Value; }
+      set {
+        MaxDepthParameter.Value.Value = value;
+      }
+    }
+
+    public IValueParameter<IntValue> MinProgramLengthParameter {
+      get { return (IValueParameter<IntValue>)Parameters[MIN_PROGRAM_LENGTH]; }
+    }
+
+    public int MinProgramLength {
+      get { return MinProgramLengthParameter.Value.Value; }
+      set {
+        MinProgramLengthParameter.Value.Value = value;
+      }
+    }
+
+    /// <summary>
+    ///     This is the maximum size of an item on the CODE stack, expressed as a number of points.
+    ///     A point is an instruction, a literal, or a pair of parentheses. Any instruction that would cause this limit to be
+    ///     exceeded should instead act as a NOOP, leaving all stacks in the states that they were in before the execution of the
+    ///     instruction.
+    /// </summary>
+    public IValueParameter<IntValue> MaxProgramLengthParameter {
+      get { return (IValueParameter<IntValue>)Parameters[MAX_PROGRAM_LENGTH]; }
+    }
+
+    public int MaxProgramLength {
+      get { return MaxProgramLengthParameter.Value.Value; }
+      set {
+        MaxProgramLengthParameter.Value.Value = value;
+      }
+    }
+
+    public IValueParameter<IntValue> MaxVectorLengthParameter {
+      get { return (IValueParameter<IntValue>)Parameters[MAX_VECTOR_LENGTH_PARAMETER_NAME]; }
+    }
+
+    public int MaxVectorLength {
+      get { return MaxVectorLengthParameter.Value.Value; }
+      set { MaxVectorLengthParameter.Value.Value = value; }
+    }
+
+    /// <summary>
+    ///     The maximum number of points in an expression produced by the CODE.RAND instruction.
+    /// </summary>
+    public IValueParameter<IntValue> MaxPointsInRandomExpressionParameter {
+      get { return (IValueParameter<IntValue>)Parameters[MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_NAME]; }
+    }
+
+    public int MaxPointsInRandomExpression {
+      get { return MaxPointsInRandomExpressionParameter.Value.Value; }
+      set {
+        MaxPointsInRandomExpressionParameter.Value.Value = value;
+      }
+    }
+
+    /// <summary>
+    ///     When TRUE (which is the default), code passed to the top level of the interpreter
+    ///     will be pushed onto the CODE stack prior to execution.
+    /// </summary>
+    public IValueParameter<BoolValue> TopLevelPushCodeParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[TOP_LEVEL_PUSH_CODE_PARAMETER_NAME]; }
+    }
+
+    public bool TopLevelPushCode {
+      get { return TopLevelPushCodeParameter.Value.Value; }
+      set {
+        TopLevelPushCodeParameter.Value.Value = value;
+      }
+    }
+
+    /// <summary>
+    ///     When TRUE, the CODE stack will be popped at the end of top level calls to the interpreter. The default is FALSE.
+    /// </summary>
+    public IValueParameter<BoolValue> TopLevelPopCodeParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[TOP_LEVEL_POP_CODE_PARAMETER_NAME]; }
+    }
+
+    public bool TopLevelPopCode {
+      get { return TopLevelPopCodeParameter.Value.Value; }
+      set {
+        TopLevelPopCodeParameter.Value.Value = value;
+      }
+    }
+
+    public IValueParameter<IntValue> MaxStringLengthParameter {
+      get { return (IValueParameter<IntValue>)Parameters[MAX_STRING_LENGTH_PARAMETER_NAME]; }
+    }
+
+    public int MaxStringLength {
+      get { return MaxStringLengthParameter.Value.Value; }
+      set { MaxStringLengthParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<BoolValue> TopLevelPushInputArgumentsParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[TOP_LEVEL_PUSH_INPUT_ARGUMENTS]; }
+    }
+
+    public bool TopLevelPushInputArguments {
+      get { return TopLevelPushInputArgumentsParameter.Value.Value; }
+      set { TopLevelPushInputArgumentsParameter.Value.Value = value; }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfigurationBase.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfigurationBase.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfigurationBase.cs	(revision 15771)
@@ -0,0 +1,262 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public abstract class PushConfigurationBase : NamedItem, IExpressionsConfiguration {
+
+    protected PushConfigurationBase() {
+      Name = "Push Configuration";
+
+      enabledExpressions = ExpressionTable.ExpressionNames.ToList();
+      expressionsPerStackCount = new Dictionary<StackTypes, int>();
+      InitExpressionsPerStackCount();
+    }
+
+    [StorableConstructor]
+    protected PushConfigurationBase(bool deserializing) : base(deserializing) { }
+
+    protected PushConfigurationBase(PushConfigurationBase origin, Cloner cloner) : base(origin, cloner) {
+      enabledExpressions = origin.EnabledExpressions.ToList();
+      expressionsPerStackCount = origin.expressionsPerStackCount.ToDictionary(x => x.Key, x => x.Value);
+      InExpressionCount = origin.InExpressionCount;
+      Seed = origin.Seed;
+    }
+
+    [Storable]
+    public int Seed { get; set; }
+
+    [Storable]
+    public int InExpressionCount { get; private set; }
+
+    [Storable]
+    private readonly Dictionary<StackTypes, int> expressionsPerStackCount;
+
+    public IReadOnlyDictionary<StackTypes, int> ExpressionsPerStackCount { get { return expressionsPerStackCount; } }
+
+    public event EventHandler<EnabledExpressionsChangedEventArgs> EnabledExpressionsChanged;
+
+    [Storable]
+    protected readonly List<string> enabledExpressions;
+
+    public bool IsStackEnabled(StackTypes type) {
+      int count;
+      return expressionsPerStackCount.TryGetValue(type, out count) && count > 0;
+    }
+
+    public IReadOnlyList<string> EnabledExpressions {
+      get { return enabledExpressions; }
+      set {
+        var removedExpressions = enabledExpressions.ToList();
+        enabledExpressions.Clear();
+        enabledExpressions.AddRange(value);
+
+        if (EnabledExpressionsChanged != null) {
+          EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(value, removedExpressions));
+        }
+      }
+    }
+
+    private void InitExpressionsPerStackCount() {
+      foreach (StackTypes type in Enum.GetValues(typeof(StackTypes))) {
+        if (type == StackTypes.None) continue;
+        expressionsPerStackCount.Add(type, 0);
+      }
+
+      foreach (var expressionName in ExpressionTable.ExpressionNames) {
+        var type = ExpressionTable.TypeToNameTable.Single(x => x.Value == expressionName).Key;
+        var attribute = ExpressionTable.TypeToAttributeTable[type];
+
+        if (expressionsPerStackCount.ContainsKey(attribute.StackType)) {
+          expressionsPerStackCount[attribute.StackType]++;
+        }
+
+        foreach (var additionalStackType in attribute.AdditionalStackDependencies.ToValues())
+          expressionsPerStackCount[additionalStackType]++;
+      }
+    }
+
+    public void SetEnabledStacks(StackTypes types) {
+      // Disable all
+      enabledExpressions.Clear();
+
+      foreach (StackTypes type in Enum.GetValues(typeof(StackTypes))) {
+        if (type == StackTypes.None) continue;
+        expressionsPerStackCount[type] = 0;
+      }
+
+      var expressionNames = ExpressionTable.StackDependencyToNamesTable
+        .Where(pair => types.HasFlag(pair.Key))
+        .SelectMany(pair => pair.Value);
+
+      EnableExpressions(expressionNames);
+    }
+
+    public void EnableExpressionOfStack(StackTypes types) {
+      EnableExpressions(ExpressionTable.StackTypeToNamesTable[types]);
+    }
+
+    public void EnableExpressionDependentOnStack(StackTypes types) {
+      var names = ExpressionTable.StackDependencyToNamesTable[types].Where(
+        name => {
+          var type = ExpressionTable.NameToTypeTable[name];
+          var attribute = ExpressionTable.TypeToAttributeTable[type];
+
+          return (attribute.StackType | attribute.AdditionalStackDependencies)
+            .ToEnumerable()
+            .All(IsStackEnabled);
+        });
+
+      EnableExpressions(names);
+    }
+
+    private void EnableExpressions(IEnumerable<string> expressionNames) {
+      var addedExpressions = expressionNames as IList<string> ?? expressionNames.ToList();
+
+      foreach (var expressionName in addedExpressions.Except(EnabledExpressions))
+        EnableExpression(expressionName, false);
+
+      if (EnabledExpressionsChanged != null) {
+        EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(addedExpressions, new string[0]));
+      }
+    }
+
+    public void DisableExpressionsOfStack(StackTypes types) {
+      DisableExpressions(ExpressionTable.StackTypeToNamesTable[types]);
+    }
+
+    public void DisableExpressionsDependentOnStack(StackTypes types) {
+      var names = ExpressionTable.StackDependencyToNamesTable
+          .Where(pair => pair.Key.HasFlag(types))
+          .SelectMany(pair => pair.Value);
+
+      DisableExpressions(names);
+    }
+
+    private void DisableExpressions(IEnumerable<string> expressionNames) {
+      var removedExpressions = expressionNames as IList<string> ?? expressionNames.ToList();
+
+      foreach (var expressionName in removedExpressions.Intersect(EnabledExpressions))
+        DisableExpression(expressionName, false);
+
+      if (EnabledExpressionsChanged != null) {
+        EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(new string[0], removedExpressions));
+      }
+    }
+
+    public void EnableExpression(string expressionName) {
+      EnableExpression(expressionName, true);
+    }
+
+    private void EnableExpression(string expressionName, bool triggerExpressionChanged) {
+      if (enabledExpressions.Contains(expressionName)) return;
+
+      var type = ExpressionTable.TypeToNameTable.Single(x => x.Value == expressionName).Key;
+      var attribute = ExpressionTable.TypeToAttributeTable[type];
+
+      enabledExpressions.Add(expressionName);
+
+      if (expressionsPerStackCount.ContainsKey(attribute.StackType))
+        expressionsPerStackCount[attribute.StackType]++;
+
+      foreach (var additionalStackType in attribute.AdditionalStackDependencies.ToValues().Where(expressionsPerStackCount.ContainsKey))
+        expressionsPerStackCount[additionalStackType]++;
+
+      if (EnabledExpressionsChanged != null && triggerExpressionChanged) {
+        EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(
+          new[] { expressionName },
+          new string[0]));
+      }
+    }
+
+    public void DisableExpression(string expressionName) {
+      DisableExpression(expressionName, true);
+    }
+
+    public void DisableExpression(string expressionName, bool triggerExpressionChanged) {
+      if (!EnabledExpressions.Contains(expressionName)) return;
+
+      var type = ExpressionTable.TypeToNameTable.Single(x => x.Value == expressionName).Key;
+      var attribute = ExpressionTable.TypeToAttributeTable[type];
+
+      enabledExpressions.Remove(expressionName);
+
+      if (expressionsPerStackCount.ContainsKey(attribute.StackType))
+        expressionsPerStackCount[attribute.StackType]--;
+
+      foreach (var additionalStackType in attribute.AdditionalStackDependencies.ToValues().Where(expressionsPerStackCount.ContainsKey))
+        expressionsPerStackCount[additionalStackType]--;
+
+      if (EnabledExpressionsChanged != null && triggerExpressionChanged) {
+        EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(
+          new string[0],
+          new[] { expressionName }));
+      }
+    }
+
+    public void EnableExpression<T>() where T : Expression {
+      var attribute = ExpressionTable.TypeToAttributeTable[typeof(T)];
+      EnableExpression(attribute.Name);
+    }
+
+    public void DisableExpression<T>() where T : Expression {
+      var attribute = ExpressionTable.TypeToAttributeTable[typeof(T)];
+      DisableExpression(attribute.Name);
+    }
+
+    public void SetExpression(string name, bool state) {
+      if (state) EnableExpression(name);
+      else DisableExpression(name);
+    }
+
+    public void SetExpression<T>(bool state) where T : Expression {
+      if (state) EnableExpression<T>();
+      else DisableExpression<T>();
+    }
+
+    public void EnableStack(StackTypes type, bool enableDependencies = false) {
+      EnableExpressionOfStack(type);
+
+      if (enableDependencies)
+        EnableExpressionDependentOnStack(type);
+    }
+
+    public void DisableStack(StackTypes type, bool disableDependencies = false) {
+      DisableExpressionsOfStack(type);
+
+      if (disableDependencies)
+        DisableExpressionsDependentOnStack(type);
+    }
+
+    public void SetStack(StackTypes type, bool state, bool setDependencies = false) {
+      if (state) EnableStack(type, setDependencies);
+      else DisableStack(type, setDependencies);
+    }
+
+    public void InitInExpressions(int totalInputArgumentCount) {
+      InExpressionCount = totalInputArgumentCount;
+
+      for (var i = 0; i < ExpressionTable.InExpressionTable.Count; i++) {
+        var expression = ExpressionTable.InExpressionTable[i];
+        var expressionName = ExpressionTable.TypeToNameTable[expression.GetType()];
+
+        DisableExpression(expressionName);
+      }
+
+      if (totalInputArgumentCount > ExpressionTable.InExpressionTable.Count)
+        throw new InvalidOperationException("More input arguments defined as InExpression types");
+
+      for (var i = 0; i < totalInputArgumentCount; i++) {
+        var expression = ExpressionTable.InExpressionTable[i];
+        var expressionName = ExpressionTable.TypeToNameTable[expression.GetType()];
+
+        EnableExpression(expressionName);
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Constants/PushEnvironment.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Constants/PushEnvironment.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Constants/PushEnvironment.cs	(revision 15771)
@@ -0,0 +1,22 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  public static class PushEnvironment {
+    public const char VectorStartSymbol = '[';
+    public const string VectorStartSymbolStr = "[";
+    public const char VectorEndSymbol = ']';
+    public const string VectorEndSymbolStr = "]";
+    public const char VectorSeparatorSymbol = ' ';
+    public const string VectorSeparatorSymbolStr = " ";
+
+    public const char ProgramStartSymbol = '(';
+    public const string ProgramStartSymbolStr = "(";
+    public const char ProgramEndSymbol = ')';
+    public const string ProgramEndSymbolStr = ")";
+
+    public const char CharSymbol = '\'';
+    public const char StringSymbol = '\"';
+    public const string CharSymbolStr = "'";
+    public const string StringSymbolStr = "\"";
+    public const char NewLine = '\n';
+    public const string NewLineStr = "\n";
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Crossover/AlternationCrossover.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Crossover/AlternationCrossover.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Crossover/AlternationCrossover.cs	(revision 15771)
@@ -0,0 +1,126 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+  using System.Linq;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Operators;
+  using HeuristicLab.Optimization;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+  using HeuristicLab.Random;
+
+  /// <summary>
+  /// Alternation crossover for plush vectors.
+  /// </summary>
+  [Item("AlternationCrossover", "Alternation crossover for plush vectors.")]
+  [StorableClass]
+  public class AlternationCrossover : InstrumentedOperator, IPlushCrossover, IStochasticOperator {
+    private const double Mean = 0.0;
+
+    public AlternationCrossover() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic crossover operators."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<PlushVector>("Parents", "The parent vectors which should be crossed."));
+      ParentsParameter.ActualName = "PlushVector";
+
+      Parameters.Add(new LookupParameter<PlushVector>("Child", "The child vector resulting from the crossover."));
+      ChildParameter.ActualName = "PlushVector";
+
+      Parameters.Add(new LookupParameter<IntValue>("MaxProgramLength", "The max length of children"));
+
+      Parameters.Add(new FixedValueParameter<PercentValue>("AlternationRate", "Specifies the probability of switching to another parent.", new PercentValue(0.5)));
+      Parameters.Add(new FixedValueParameter<DoubleValue>("AlignmentDeviation", "When alternating between parents, the index at which to continue copying may be offset backward or forward some amount based on a random sample from a normal distribution with mean 0 and standard deviation set by the alignment deviation parameter", new DoubleValue(1.0)));
+
+    }
+
+    [StorableConstructor]
+    public AlternationCrossover(bool deserializing) : base(deserializing) {
+    }
+
+    public AlternationCrossover(AlternationCrossover origin, Cloner cloner) : base(origin, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlternationCrossover(this, cloner);
+    }
+
+    public ILookupParameter<IntValue> MaxProgramLengthParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["MaxProgramLength"]; }
+    }
+
+    public int MaxProgramLength {
+      get { return MaxProgramLengthParameter.ActualValue.Value; }
+      set { MaxProgramLengthParameter.ActualValue.Value = value; }
+    }
+
+    public IValueParameter<PercentValue> AlternationRateParameter {
+      get { return (IValueParameter<PercentValue>)Parameters["AlternationRate"]; }
+    }
+
+    public double AlternationRate {
+      get { return AlternationRateParameter.Value.Value; }
+      set { AlternationRateParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<DoubleValue> AlignmentDeviationParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["AlignmentDeviation"]; }
+    }
+
+    public double AlignmentDeviation {
+      get { return AlignmentDeviationParameter.Value.Value; }
+      set { AlignmentDeviationParameter.Value.Value = value; }
+    }
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<ItemArray<PlushVector>> ParentsParameter {
+      get { return (ScopeTreeLookupParameter<PlushVector>)Parameters["Parents"]; }
+    }
+    public ILookupParameter<PlushVector> ChildParameter {
+      get { return (ILookupParameter<PlushVector>)Parameters["Child"]; }
+    }
+
+    public sealed override IOperation InstrumentedApply() {
+      ChildParameter.ActualValue = Cross(
+        RandomParameter.ActualValue,
+        ParentsParameter.ActualValue,
+        AlternationRate,
+        MaxProgramLength,
+        AlignmentDeviation);
+      return base.InstrumentedApply();
+    }
+
+    private static PlushVector Cross(
+      IRandom random,
+      ItemArray<PlushVector> parents,
+      double alternationRate,
+      int maxChildLength,
+      double alignmentDeviation) {
+      var normalDistributedRandom = new NormalDistributedRandom(random, Mean, alignmentDeviation);
+      var maxLength = parents.Max(p => p.Entries.Count);
+      var parentIndex = random.Next(0, 2);
+      var parent = parents[parentIndex];
+      var child = new PlushVector(maxLength);
+
+      for (var i = 0; i < maxLength && child.Entries.Count <= maxChildLength; i++) {
+
+        // if parent is shorter than the other, then ignore those entries
+        if (i < parent.Entries.Count)
+          child.Add(parent[i]);
+
+        // switch parent?
+        if (random.NextDouble() < alternationRate) {
+          parentIndex = parentIndex == 0 ? 1 : 0;
+          parent = parents[parentIndex];
+          i += normalDistributedRandom.NextRounded();
+          i = Math.Max(i, 0);
+        }
+      }
+
+      return child;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Crossover/IPlushCrossover.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Crossover/IPlushCrossover.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Crossover/IPlushCrossover.cs	(revision 15771)
@@ -0,0 +1,9 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Core;
+  using HeuristicLab.Optimization;
+
+  public interface IPlushCrossover : IPlushOperator, ICrossover {
+    ILookupParameter<ItemArray<PlushVector>> ParentsParameter { get; }
+    ILookupParameter<PlushVector> ChildParameter { get; }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/List/SkipList.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/List/SkipList.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/List/SkipList.cs	(revision 15771)
@@ -0,0 +1,506 @@
+﻿using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Collections;
+
+  using HeuristicLab.Core;
+  using HeuristicLab.Random;
+
+  /// <summary>
+  /// The basic data block of a Skip List
+  /// </summary>
+  class SkipListNode<T> : IDisposable
+      where T : IComparable {
+    private T value;
+    private SkipListNode<T> next;
+    private SkipListNode<T> previous;
+    private SkipListNode<T> above;
+    private SkipListNode<T> below;
+
+    public virtual T Value
+    {
+      get { return value; }
+      set { this.value = value; }
+    }
+
+    public virtual SkipListNode<T> Next
+    {
+      get { return next; }
+      set { next = value; }
+    }
+
+    public virtual SkipListNode<T> Previous
+    {
+      get { return previous; }
+      set { previous = value; }
+    }
+
+    public virtual SkipListNode<T> Above
+    {
+      get { return above; }
+      set { above = value; }
+    }
+
+    public virtual SkipListNode<T> Below
+    {
+      get { return below; }
+      set { below = value; }
+    }
+
+    public SkipListNode(T value) {
+      Value = value;
+    }
+
+    public void Dispose() {
+      value = default(T);
+      next = null;
+      previous = null;
+      above = null;
+      previous = null;
+    }
+
+    public virtual bool IsHeader() {
+      return GetType() == typeof(SkipListNodeHeader<T>);
+    }
+
+    public virtual bool IsFooter() {
+      return GetType() == typeof(SkipListNodeFooter<T>);
+    }
+  }
+
+  /// <summary>
+  /// Represents a Skip List node that is the header of a level
+  /// </summary>
+  class SkipListNodeHeader<T> : SkipListNode<T>
+      where T : IComparable {
+    public SkipListNodeHeader()
+        : base(default(T)) {
+    }
+  }
+
+  /// <summary>
+  /// Represents a Skip List node that is the footer of a level
+  /// </summary>
+  class SkipListNodeFooter<T> : SkipListNode<T>
+      where T : IComparable {
+    public SkipListNodeFooter()
+        : base(default(T)) {
+    }
+  }
+
+  class SkipList<T> : ICollection<T>
+      where T : IComparable {
+    internal SkipListNode<T> topLeft;
+    internal SkipListNode<T> bottomLeft;
+    internal IRandom random;
+    private int levels;
+    private int size;
+    private int maxLevels = int.MaxValue;
+
+    public virtual int Levels
+    {
+      get { return levels; }
+    }
+
+    public virtual int MaxLevels
+    {
+      get { return maxLevels; }
+      set { maxLevels = value; }
+    }
+
+    public virtual int Count
+    {
+      get { return size; }
+    }
+
+    public virtual bool IsReadOnly
+    {
+      get { return false; }
+    }
+
+    public virtual SkipListNode<T> Head
+    {
+      get { return bottomLeft; }
+    }
+
+    public SkipList(IRandom random = null) {
+      topLeft = getEmptyLevel(); //create an empty level
+      bottomLeft = topLeft;
+      levels = 1; //update the level count
+      size = 0; //no elements added
+      this.random = random ?? new FastRandom(); //used for adding new values
+    }
+
+    /// <summary>
+    /// Creates an empty level with a header and footer node
+    /// </summary>
+    protected SkipListNode<T> getEmptyLevel() {
+      SkipListNode<T> negativeInfinity = new SkipListNodeHeader<T>();
+      SkipListNode<T> positiveInfinity = new SkipListNodeFooter<T>();
+
+      negativeInfinity.Next = positiveInfinity;
+      positiveInfinity.Previous = negativeInfinity;
+
+      return negativeInfinity;
+    }
+
+    /// <summary>
+    /// Randomly determines how many levels to add
+    /// </summary>
+    protected int getRandomLevels() {
+      int newLevels = 0;
+      while (random.Next(0, 2) == 1 && newLevels < maxLevels) //1 is heads, 0 is tails
+      {
+        newLevels++;
+      }
+      return newLevels;
+    }
+
+    /// <summary>
+    /// Removes all the empty levels leftover in the Skip List
+    /// </summary>
+    protected void clearEmptyLevels() {
+      if (levels > 1) //more than one level, don't want to remove bottom level
+      {
+        SkipListNode<T> currentNode = topLeft;
+
+        while (currentNode != bottomLeft) //do not remove the bottom level
+        {
+          if (currentNode.IsHeader() && currentNode.Next.IsFooter()) {
+            SkipListNode<T> belowNode = currentNode.Below;
+
+            //Remove the empty level
+
+            //Update pointers
+            topLeft = currentNode.Below;
+
+            //Remove links
+            currentNode.Next.Dispose();
+            currentNode.Dispose();
+
+            //Update counters
+            levels--;
+
+            currentNode = belowNode; //scan down
+          } else
+            break; //a single non-emtpy level means the rest of the levels are not empty
+        }
+      }
+    }
+
+    /// <summary>
+    /// Add a value to the Skip List
+    /// </summary>
+    public virtual void Add(T value) {
+      int valueLevels = getRandomLevels(); //determine height of value's tower
+
+      //Add levels to entire list if necessary
+      int newLevelCount = valueLevels - levels; //number of levels missing
+      while (newLevelCount > 0) {
+        //Create new level
+        SkipListNode<T> newLevel = getEmptyLevel();
+
+        //Link down
+        newLevel.Below = topLeft;
+        topLeft.Above = newLevel;
+        topLeft = newLevel; //update reference to most top-left node
+
+        //Update counters
+        newLevelCount--;
+        levels++;
+      }
+
+      //Insert the value in the proper position, creating as many levels as was randomly determined
+      SkipListNode<T> currentNode = topLeft;
+      SkipListNode<T> lastNodeAbove = null; //keeps track of the upper-level nodes in a tower
+      int currentLevel = levels - 1;
+
+      while (currentLevel >= 0 && currentNode != null) {
+        if (currentLevel > valueLevels) //too high on the list, nothing would be added to this level
+        {
+          currentNode = currentNode.Below; //scan down
+          currentLevel--; //going one level lower
+          continue; //skip adding to this level
+        }
+
+        //Add the value to the current level
+
+        //Find the biggest value on the current level that is less than the value to be added
+        while (currentNode.Next != null) {
+          if (!currentNode.Next.IsFooter() && currentNode.Next.Value.CompareTo(value) < 0) //smaller
+            currentNode = currentNode.Next; //keep scanning across
+          else
+            break; //the next node would be bigger than the value
+
+        }
+
+        //Insert the value right after the node found
+        SkipListNode<T> newNode = new SkipListNode<T>(value);
+        newNode.Next = currentNode.Next;
+        newNode.Previous = currentNode;
+        newNode.Next.Previous = newNode;
+        currentNode.Next = newNode;
+
+        //Link down/up the tower
+        if (lastNodeAbove != null) //is this node part of a tower?
+        {
+          lastNodeAbove.Below = newNode;
+          newNode.Above = lastNodeAbove;
+        }
+        lastNodeAbove = newNode; //start/continue tower
+
+        //Scan down
+        currentNode = currentNode.Below;
+        currentLevel--;
+      }
+
+      size++; //update count
+    }
+
+    /// <summary>
+    /// Returns the first node whose value matches the input value
+    /// </summary>
+    public virtual SkipListNode<T> Find(T value) {
+      SkipListNode<T> foundNode = topLeft;
+
+      //Look for the highest-level node with an element value matching the parameter value
+      while (foundNode != null && foundNode.Next != null) {
+        if (!foundNode.Next.IsFooter() && foundNode.Next.Value.CompareTo(value) < 0) //next node's value is still smaller
+          foundNode = foundNode.Next; //keep scanning across
+        else {
+          if (!foundNode.Next.IsFooter() && foundNode.Next.Value.Equals(value)) //value found
+          {
+            foundNode = foundNode.Next;
+            break;
+          } else
+            foundNode = foundNode.Below; //element not in this level, scan down
+        }
+      }
+
+      return foundNode;
+    }
+
+    /// <summary>
+    /// Returns the lowest node on the first tower to match the input value
+    /// </summary>
+    public virtual SkipListNode<T> FindLowest(T value) {
+      SkipListNode<T> valueNode = Find(value);
+      return FindLowest(valueNode);
+    }
+
+    /// <summary>
+    /// Returns the lowest node on the first tower to match the input value
+    /// </summary>
+    public virtual SkipListNode<T> FindLowest(SkipListNode<T> valueNode) {
+      if (valueNode == null)
+        return null;
+      else {
+        //Scan down to the lowest level
+        while (valueNode.Below != null) {
+          valueNode = valueNode.Below;
+        }
+        return valueNode;
+      }
+    }
+
+    /// <summary>
+    /// Returns the highest node on the first tower to match the input value
+    /// </summary>
+    public virtual SkipListNode<T> FindHighest(T value) {
+      SkipListNode<T> valueNode = Find(value);
+      return FindHighest(valueNode);
+    }
+
+    /// <summary>
+    /// Returns the highest node on the first tower to match the input value
+    /// </summary>
+    public virtual SkipListNode<T> FindHighest(SkipListNode<T> valueNode) {
+      if (valueNode == null)
+        return null;
+      else {
+        //Scan up to the highest level
+        while (valueNode.Above != null) {
+          valueNode = valueNode.Above;
+        }
+        return valueNode;
+      }
+    }
+
+    /// <summary>
+    /// Returns whether a value exists in the Skip List
+    /// </summary>
+    public virtual bool Contains(T value) {
+      return (Find(value) != null);
+    }
+
+    /// <summary>
+    /// Removes a value or node from the Skip List
+    /// </summary>
+    public virtual bool Remove(T value) {
+      SkipListNode<T> valueNode = FindHighest(value);
+      return Remove(valueNode);
+    }
+
+    /// <summary>
+    /// Removes a value or node from the Skip List
+    /// </summary>
+    public virtual bool Remove(SkipListNode<T> valueNode) {
+      if (valueNode == null)
+        return false;
+      else {
+        //Make sure node is top-level node in it's tower
+        if (valueNode.Above != null)
+          valueNode = FindHighest(valueNode);
+
+        //---Delete nodes going down the tower
+        SkipListNode<T> currentNodeDown = valueNode;
+        while (currentNodeDown != null) {
+          //Remove right-left links
+          SkipListNode<T> previousNode = currentNodeDown.Previous;
+          SkipListNode<T> nextNode = currentNodeDown.Next;
+
+          //Link the previous and next nodes to each other
+          previousNode.Next = nextNode;
+          nextNode.Previous = previousNode;
+
+          SkipListNode<T> belowNode = currentNodeDown.Below; //scan down
+          currentNodeDown.Dispose(); //unlink previous
+
+          currentNodeDown = belowNode;
+        }
+
+        //update counter
+        size--;
+
+        //Clean up the Skip List by removing levels that are now empty
+        clearEmptyLevels();
+
+        return true;
+      }
+    }
+
+    /// <summary>
+    /// Removes all values in the Skip List
+    /// </summary>
+    public virtual void Clear() {
+      SkipListNode<T> currentNode = Head;
+
+      while (currentNode != null) {
+        SkipListNode<T> nextNode = currentNode.Next; //save reference to next node
+
+        if (!currentNode.IsHeader() && !currentNode.IsFooter()) {
+          Remove(currentNode);
+        }
+
+        currentNode = nextNode;
+      }
+    }
+
+    /// <summary>
+    /// Copies the values of the Skip List to an array
+    /// </summary>
+    public virtual void CopyTo(T[] array) {
+      CopyTo(array, 0);
+    }
+
+    /// <summary>
+    /// Copies the values of the Skip List to an array
+    /// </summary>
+    public virtual void CopyTo(T[] array, int startIndex) {
+      IEnumerator<T> enumerator = GetEnumerator();
+
+      for (int i = startIndex; i < array.Length; i++) {
+        if (enumerator.MoveNext())
+          array[i] = enumerator.Current;
+        else
+          break;
+      }
+    }
+
+    /// <summary>
+    /// Gets the number of levels of a value in the Skip List
+    /// </summary>
+    public virtual int GetHeight(T value) {
+      SkipListNode<T> valueNode = FindLowest(value);
+      return GetHeight(valueNode);
+    }
+
+    /// <summary>
+    /// Gets the number of levels of a value in the Skip List
+    /// </summary>
+    public virtual int GetHeight(SkipListNode<T> valueNode) {
+      int height = 0;
+      SkipListNode<T> currentNode = valueNode;
+
+      //Move all the way down to the bottom first
+      while (currentNode.Below != null) {
+        currentNode = currentNode.Below;
+      }
+
+      //ExpressionCount going back up to the top
+      while (currentNode != null) {
+        height++;
+        currentNode = currentNode.Above;
+      }
+
+      return height;
+    }
+
+    /// <summary>
+    /// Gets the enumerator for the Skip List
+    /// </summary>
+    public IEnumerator<T> GetEnumerator() {
+      return new SkipListEnumerator(this);
+    }
+
+    /// <summary>
+    /// Gets the enumerator for the Skip List
+    /// </summary>
+    IEnumerator IEnumerable.GetEnumerator() {
+      return GetEnumerator();
+    }
+
+    /// <summary>
+    /// Enumerator for a Skip List. Scans across the lowest level of a Skip List.
+    /// </summary>
+    internal class SkipListEnumerator : IEnumerator<T> {
+      private SkipListNode<T> current;
+      private SkipList<T> skipList;
+
+      public SkipListEnumerator(SkipList<T> skipList) {
+        this.skipList = skipList;
+      }
+
+      public T Current
+      {
+        get { return current.Value; }
+      }
+
+      object IEnumerator.Current
+      {
+        get { return Current; }
+      }
+
+      public void Dispose() {
+        current = null;
+      }
+
+      public void Reset() {
+        current = null;
+      }
+
+      public bool MoveNext() {
+        if (current == null)
+          current = skipList.Head.Next; //Head is header node, start after
+        else
+          current = current.Next;
+
+        if (current != null && current.IsFooter())
+          current = null; //end of list
+
+        return (current != null);
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/IPooledObject.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/IPooledObject.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/IPooledObject.cs	(revision 15771)
@@ -0,0 +1,5 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  public interface IPooledObject {
+    void Reset();
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/IRecyclable.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/IRecyclable.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/IRecyclable.cs	(revision 15771)
@@ -0,0 +1,5 @@
+﻿namespace HeuristicLab.Algorithms.PushGP.Data.Pool {
+  public interface IRecyclable {
+    void Recycle();
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/ManagedPoolProvider.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/ManagedPoolProvider.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/ManagedPoolProvider.cs	(revision 15771)
@@ -0,0 +1,129 @@
+﻿using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+  using System.Collections.Concurrent;
+  using System.IO;
+  using System.Reflection;
+  using System.Runtime.Serialization.Formatters.Binary;
+
+  using Microsoft.IO;
+
+  public interface IManagedPool<T> : IDisposable where T : class, IPooledObject {
+    T Get(bool reset = true);
+    void Release();
+  }
+
+  public class ManagedPoolProvider<T> where T : class, IPooledObject {
+    private readonly ConcurrentStack<T[]> partitions = new ConcurrentStack<T[]>();
+    private readonly ObjectPool<IManagedPool<T>> managedPools;
+    private readonly BinaryFormatter binaryFormatter = new BinaryFormatter();
+    private readonly RecyclableMemoryStreamManager recyclableMemoryStreamManager = new RecyclableMemoryStreamManager();
+    private byte[] dummyPartition;
+    private volatile object dummyCreationLockObject = new object();
+
+    private static readonly FieldInfo InternalListArrayProperty = typeof(List<T[]>).GetField(
+      "_items",
+      BindingFlags.NonPublic | BindingFlags.Instance);
+
+    private readonly Func<T> factory;
+
+    public readonly int PartitionSize;
+    public readonly int MaxPartitionCount;
+    public const int DefaultMaxInstanceCount = 65536;
+
+    public ManagedPoolProvider(int partitionSize, Func<T> factory, int? maxPartitionCount = null) {
+      PartitionSize = partitionSize;
+      MaxPartitionCount = maxPartitionCount ?? DefaultMaxInstanceCount / PartitionSize;
+      this.factory = factory;
+
+      managedPools = new ObjectPool<IManagedPool<T>>(() => new ManagedPool(this));
+    }
+    public int InstanceCount { get { return partitions.Count * PartitionSize; } }
+
+    public void Clear() {
+      dummyPartition = null;
+      managedPools.Clear();
+      partitions.Clear();
+    }
+
+    public void ReleasePartitions(List<T[]> releasedPartitions) {
+      if (partitions.Count < MaxPartitionCount)
+        partitions.PushRange((T[][])InternalListArrayProperty.GetValue(releasedPartitions), 0, releasedPartitions.Count);
+    }
+
+    private T[] GetPartition() {
+      T[] partition;
+      return partitions.TryPop(out partition) ? partition : CloneDummyPartition();
+    }
+
+    private T[] CloneDummyPartition() {
+      // init dummy partition
+      if (dummyPartition == null) {
+        lock (dummyCreationLockObject) {
+          if (dummyPartition == null) {
+            var temp = new T[PartitionSize];
+
+            for (var i = 0u; i < PartitionSize; i++) {
+              temp[i] = factory();
+            }
+
+            using (var ms = recyclableMemoryStreamManager.GetStream("dummyPartition")) {
+              binaryFormatter.Serialize(ms, temp);
+              dummyPartition = ms.ToArray();
+            }
+          }
+        }
+      }
+
+      using (var ms = recyclableMemoryStreamManager.GetStream("dummyPartition", dummyPartition, 0, dummyPartition.Length)) {
+        ms.Seek(0, SeekOrigin.Begin);
+        var result = (T[])binaryFormatter.Deserialize(ms);
+        return result;
+      }
+    }
+
+    public IManagedPool<T> CreatePool() {
+      return managedPools.Allocate();
+    }
+
+    private class ManagedPool : IManagedPool<T> {
+      private readonly ManagedPoolProvider<T> provider;
+      private readonly List<T[]> partitions = new List<T[]>();
+      private T[] currentPartition;
+      private int entryIndex;
+
+      public ManagedPool(ManagedPoolProvider<T> provider) {
+        this.provider = provider;
+        entryIndex = provider.PartitionSize;
+      }
+
+      public T Get(bool resetEntry = true) {
+        if (entryIndex == provider.PartitionSize) {
+          currentPartition = provider.GetPartition();
+          partitions.Add(currentPartition);
+          entryIndex = 0;
+        }
+
+        var entry = currentPartition[entryIndex++];
+        if (resetEntry) entry.Reset();
+        return entry;
+      }
+
+      public void Release() {
+        if (partitions.Count > 0) {
+          provider.ReleasePartitions(partitions);
+          partitions.Clear();
+          currentPartition = null;
+          entryIndex = provider.PartitionSize;
+        }
+      }
+
+      public void Dispose() {
+        Release();
+
+        provider.managedPools.Free(this);
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/ObjectPool.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/ObjectPool.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/ObjectPool.cs	(revision 15771)
@@ -0,0 +1,125 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Collections.Generic;
+  using System.Threading;
+
+  /// <summary>
+  /// Generic implementation of object pooling pattern with predefined pool size limit. The main
+  /// purpose is that limited number of frequently used objects can be kept in the pool for
+  /// further recycling.
+  ///
+  /// Notes:
+  /// 1) it is not the goal to keep all returned objects. Pool is not meant for storage. If there
+  ///    is no space in the pool, extra returned objects will be dropped.
+  ///
+  /// 2) it is implied that if object was obtained from a pool, the caller will return it back in
+  ///    a relatively short time. Keeping checked out objects for long durations is ok, but
+  ///    reduces usefulness of pooling. Just new up your own.
+  ///
+  /// Not returning objects to the pool in not detrimental to the pool's work, but is a bad practice.
+  /// Rationale:
+  ///    If there is no intent for reusing the object, do not use pool - just use "new".
+  /// </summary>
+  public sealed class ObjectPool<T> where T : class {
+    private struct Element {
+      internal T Value;
+    }
+
+    // storage for the pool objects.
+    private readonly Element[] _items;
+
+    // factory is stored for the lifetime of the pool. We will call this only when pool needs to
+    // expand. compared to "new T()", Func gives more flexibility to implementers and faster
+    // than "new T()".
+    private readonly Func<T> _factory;
+
+
+    public ObjectPool(Func<T> factory)
+        : this(factory, Environment.ProcessorCount * 2) { }
+
+    public ObjectPool(Func<T> factory, int size) {
+      _factory = factory;
+      _items = new Element[size];
+    }
+
+    private T CreateInstance() {
+      var inst = _factory();
+      return inst;
+    }
+
+    /// <summary>
+    /// Produces an instance.
+    /// </summary>
+    /// <remarks>
+    /// Search strategy is a simple linear probing which is chosen for it cache-friendliness.
+    /// Note that Free will try to store recycled objects close to the start thus statistically
+    /// reducing how far we will typically search.
+    /// </remarks>
+    public T Allocate() {
+      var items = _items;
+      T inst;
+
+      for (int i = 0; i < items.Length; i++) {
+        // Note that the read is optimistically not synchronized. That is intentional.
+        // We will interlock only when we have a candidate. in a worst case we may miss some
+        // recently returned objects. Not a big deal.
+        inst = items[i].Value;
+        if (inst != null) {
+          if (inst == Interlocked.CompareExchange(ref items[i].Value, null, inst)) {
+            goto gotInstance;
+          }
+        }
+      }
+
+      inst = CreateInstance();
+      gotInstance:
+
+      return inst;
+    }
+
+    /// <summary>
+    /// Returns objects to the pool.
+    /// </summary>
+    /// <remarks>
+    /// Search strategy is a simple linear probing which is chosen for it cache-friendliness.
+    /// Note that Free will try to store recycled objects close to the start thus statistically
+    /// reducing how far we will typically search in Allocate.
+    /// </remarks>
+    public void Free(T obj) {
+      var items = _items;
+      for (int i = 0; i < items.Length; i++) {
+        if (items[i].Value == null) {
+          // Intentionally not using interlocked here.
+          // In a worst case scenario two objects may be stored into same slot.
+          // It is very unlikely to happen and will only mean that one of the objects will get collected.
+          items[i].Value = obj;
+          break;
+        }
+      }
+    }
+
+    public void Clear() {
+      for (int i = 0; i < _items.Length; i++) {
+        _items[i] = default(Element);
+      }
+    }
+
+    public IEnumerable<T> Items
+    {
+      get
+      {
+        var items = _items;
+        for (var i = 0; i < items.Length; i++) {
+          if (items[i].Value != null) {
+            yield return items[i].Value;
+          }
+        }
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/PooledList.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/PooledList.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/PooledList.cs	(revision 15771)
@@ -0,0 +1,13 @@
+﻿using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+
+  [Serializable]
+  public class PooledList<T> : List<T>, IPooledObject {
+
+    void IPooledObject.Reset() {
+      Clear();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/PooledObject.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/PooledObject.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/PooledObject.cs	(revision 15771)
@@ -0,0 +1,26 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+
+  public class PooledObject<T> : IDisposable, IPooledObject
+    where T : class {
+
+    private readonly ObjectPool<PooledObject<T>> pool;
+    private readonly T item;
+    private readonly Action<T> resetor;
+
+    public PooledObject(ObjectPool<PooledObject<T>> pool, T item, Action<T> resetor) {
+      this.pool = pool;
+      this.item = item;
+      this.resetor = resetor;
+    }
+
+    public virtual void Dispose() {
+      resetor(item);
+      pool.Free(this);
+    }
+
+    public void Reset() {
+      resetor(item);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Tree/TreeExtensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Tree/TreeExtensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Tree/TreeExtensions.cs	(revision 15771)
@@ -0,0 +1,85 @@
+﻿using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Linq;
+
+  public static class TreeExtensions {
+    private static readonly Expression ExecNoop = ExpressionTable.GetStatelessExpression<ExecNoopExpression>();
+    private static readonly Expression CodeNoop = ExpressionTable.GetStatelessExpression<CodeNoopExpression>();
+
+    public static TreeNode<T> ToTree<T>(
+      this IEnumerable<T> items,
+      Predicate<T> isChild,
+      Func<T, IReadOnlyList<T>> childrenResolver) {
+      var tree = new TreeNode<T>();
+
+      foreach (var item in items) {
+        if (isChild(item)) {
+          var subNode = childrenResolver(item).ToTree(isChild, childrenResolver);
+          subNode.Value = item;
+          tree.AddNode(subNode);
+        } else {
+          tree.Add(item);
+        }
+      }
+
+      return tree;
+    }
+
+    public static IEnumerable<TreeNode<T>> DepthLast<T>(this TreeNode<T> node) {
+      foreach (var child in node.Children) {
+        if (child.Children.Count > 0) {
+          foreach (var subChild in child.DepthLast()) {
+            yield return subChild;
+          }
+        } else yield return child;
+      }
+
+      yield return node;
+    }
+
+    public static IEnumerable<T> DepthLast<T>(this TreeNode<T> node, Func<IEnumerable<T>, T> resolveParent) {
+      foreach (var child in node.Children) {
+        if (child.Children.Count > 0) {
+          var subExpressions = child.DepthLast(resolveParent);
+          yield return resolveParent(subExpressions);
+        } else yield return child.Value;
+      }
+    }
+
+    public static PushProgram ToPushProgramWithoutNoopExpressions(this TreeNode<Expression> tree) {
+      return ToPushProgram(tree, e => !ReferenceEquals(e, ExecNoop) && !ReferenceEquals(e, CodeNoop));
+    }
+
+    public static PushProgram ToPushProgram(this TreeNode<Expression> tree, Func<Expression, bool> condition = null) {
+      // wrap into program as depthlast expects that tree represents program and not a single expression
+      if (tree.Count == 1) {
+        var tmp = tree;
+        tree = new TreeNode<Expression>();
+        tree.AddNode(tmp);
+      }
+
+      var expressions = tree.DepthLast(e => ResolveProgram(e, condition));
+
+      return ResolveProgram(expressions, condition);
+    }
+
+    public static TreeNode<Expression> ToTree(this PushProgram program) {
+      var tree = program.Expressions.ToTree(e => e.IsProgram, e => ((PushProgram)e).Expressions);
+      tree.Value = program;
+
+      return tree;
+    }
+
+    private static PushProgram ResolveProgram(IEnumerable<Expression> expressions, Func<Expression, bool> condition = null) {
+
+      if (condition != null) {
+        expressions = expressions.Where(condition);
+      }
+
+      return new PushProgram(expressions.ToList());
+    }
+  }
+
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Tree/TreeNode.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Tree/TreeNode.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Tree/TreeNode.cs	(revision 15771)
@@ -0,0 +1,34 @@
+﻿using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public class TreeNode<T> {
+    public T Value { get; set; }
+    public IList<TreeNode<T>> Children { get; private set; }
+    public int Count { get; private set; }
+
+    public TreeNode() {
+      Children = new List<TreeNode<T>>();
+      Count = 1;
+    }
+
+    public TreeNode(T value) : this() {
+      Value = value;
+    }
+
+    public void Add(T value) {
+      Children.Add(new TreeNode<T>(value));
+      Count++;
+    }
+
+    public void AddNode(TreeNode<T> node) {
+      Children.Add(node);
+      Count += node.Count;
+    }
+
+    public void ReplaceNode(int index, TreeNode<T> node) {
+      Count -= Children[index].Count;
+      Children[index] = node;
+      Count += node.Count;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/IPlushOperator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/IPlushOperator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/IPlushOperator.cs	(revision 15771)
@@ -0,0 +1,7 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Core;
+
+  public interface IPlushOperator : IOperator {
+
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushEncoding.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushEncoding.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushEncoding.cs	(revision 15771)
@@ -0,0 +1,384 @@
+﻿using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+  using System.Linq;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Optimization;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+  using HeuristicLab.PluginInfrastructure;
+
+  [Item("PlushEncoding", "Describes an linear push (Plush) encoding.")]
+  [StorableClass]
+  public class PlushEncoding : Encoding<IPlushCreator> {
+
+    public PlushEncoding() : this("Plush") { }
+
+    public PlushEncoding(string name) : base(name) {
+      InitParameters();
+
+      SolutionCreator = new PlushCreator();
+      RegisterParameterEvents();
+      DiscoverOperators();
+    }
+
+    [StorableConstructor]
+    public PlushEncoding(bool deserializing)
+      : base(deserializing) {
+    }
+
+    public PlushEncoding(PlushEncoding original, Cloner cloner)
+      : base(original, cloner) {
+      minLengthParameter = cloner.Clone(original.minLengthParameter);
+      maxLengthParameter = cloner.Clone(original.maxLengthParameter);
+      maxCloseParameter = cloner.Clone(original.maxCloseParameter);
+      closeBiasLevelParameter = cloner.Clone(original.closeBiasLevelParameter);
+      instructionsParameter = cloner.Clone(original.instructionsParameter);
+      ercOptionsParameter = cloner.Clone(original.ercOptionsParameter);
+      inInstructionProbabilityParameter = cloner.Clone(original.inInstructionProbabilityParameter);
+
+      RegisterParameterEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      InitParameters();
+      RegisterParameterEvents();
+      DiscoverOperators();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PlushEncoding(this, cloner);
+    }
+
+    private void InitParameters() {
+      if (!Parameters.ContainsKey(Name + ".MinLength")) {
+        minLengthParameter = new FixedValueParameter<IntValue>(Name + ".MinLength", new IntValue(0));
+        Parameters.Add(minLengthParameter);
+      }
+
+      if (!Parameters.ContainsKey(Name + ".MaxLength")) {
+        maxLengthParameter = new FixedValueParameter<IntValue>(Name + ".MaxLength", new IntValue(100));
+        Parameters.Add(maxLengthParameter);
+      }
+
+      if (!Parameters.ContainsKey(Name + ".MaxClose")) {
+        maxCloseParameter = new FixedValueParameter<IntValue>(Name + ".MaxClose", new IntValue(3));
+        Parameters.Add(maxCloseParameter);
+      }
+
+      if (!Parameters.ContainsKey(Name + ".CloseBiasLevel")) {
+        closeBiasLevelParameter = new FixedValueParameter<DoubleValue>(Name + ".CloseBiasLevel", new DoubleValue(3d));
+        Parameters.Add(closeBiasLevelParameter);
+      }
+
+      if (!Parameters.ContainsKey(Name + ".Instructions")) {
+        instructionsParameter = new ValueParameter<IExpressionsConfiguration>(Name + ".Instructions");
+        Parameters.Add(instructionsParameter);
+      }
+
+      if (!Parameters.ContainsKey(Name + ".ErcOptions")) {
+        ercOptionsParameter = new ValueParameter<ErcOptions>(Name + ".ErcOptions");
+        Parameters.Add(ercOptionsParameter);
+      }
+
+      if (!Parameters.ContainsKey(Name + ".InInstructionProbability")) {
+        inInstructionProbabilityParameter = new FixedValueParameter<PercentValue>(Name + ".InInstructionProbability", new PercentValue(0.1));
+        Parameters.Add(inInstructionProbabilityParameter);
+      }
+    }
+
+    #region events
+
+    private void OnMinLengthParameterChanged() {
+      RegisterMinLengthParameterEvents();
+      ConfigureOperators(Operators);
+    }
+    private void OnMaxLengthParameterChanged() {
+      RegisterMaxLengthParameterEvents();
+      ConfigureOperators(Operators);
+    }
+    private void OnMaxCloseParameterChanged() {
+      RegisterMaxCloseParameterEvents();
+      ConfigureOperators(Operators);
+    }
+    private void OnCloseBiasLevelParameterChanged() {
+      RegisterCloseBiasLevelParameterEvents();
+      ConfigureOperators(Operators);
+    }
+    private void OnErcOptionsParameterChanged() {
+      RegisterErcOptionsParameterEvents();
+      ConfigureOperators(Operators);
+    }
+    private void OnInstructionsParameterChanged() {
+      RegisterInstructionsParameterEvents();
+      ConfigureOperators(Operators);
+    }
+    private void OnInInstructionProbabilityParameterChanged() {
+      RegisterInInstructionProbabilityParameterEvents();
+      ConfigureOperators(Operators);
+    }
+
+    private void RegisterParameterEvents() {
+      RegisterMinLengthParameterEvents();
+      RegisterMaxLengthParameterEvents();
+      RegisterMaxCloseParameterEvents();
+      RegisterCloseBiasLevelParameterEvents();
+      RegisterErcOptionsParameterEvents();
+      RegisterInstructionsParameterEvents();
+      RegisterInInstructionProbabilityParameterEvents();
+    }
+
+    private void RegisterMinLengthParameterEvents() {
+      MinLengthParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+      MinLengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
+    }
+
+    private void RegisterMaxLengthParameterEvents() {
+      MaxLengthParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+      MaxLengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
+    }
+
+    private void RegisterMaxCloseParameterEvents() {
+      MaxCloseParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+      MaxCloseParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
+    }
+
+    private void RegisterCloseBiasLevelParameterEvents() {
+      CloseBiasLevelParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+      CloseBiasLevelParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
+    }
+
+    private void RegisterInInstructionProbabilityParameterEvents() {
+      InInstructionProbabilityParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+      InInstructionProbabilityParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
+    }
+
+    private void RegisterErcOptionsParameterEvents() {
+      ErcOptionsParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+    }
+
+    private void RegisterInstructionsParameterEvents() {
+      InstructionsParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+    }
+
+    #endregion
+
+    #region Encoding Parameters
+    [Storable]
+    private IValueParameter<IntValue> minLengthParameter;
+    public IValueParameter<IntValue> MinLengthParameter {
+      get { return minLengthParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("Min length parameter must not be null.");
+        if (value.Value == null) throw new ArgumentNullException("Min length parameter value must not be null.");
+        if (minLengthParameter == value) return;
+
+        if (minLengthParameter != null) Parameters.Remove(minLengthParameter);
+        minLengthParameter = value;
+        Parameters.Add(minLengthParameter);
+        OnMinLengthParameterChanged();
+      }
+    }
+
+    [Storable]
+    private IValueParameter<IntValue> maxLengthParameter;
+    public IValueParameter<IntValue> MaxLengthParameter {
+      get { return maxLengthParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("Max length parameter must not be null.");
+        if (value.Value == null) throw new ArgumentNullException("Max length parameter value must not be null.");
+        if (maxLengthParameter == value) return;
+
+        if (maxLengthParameter != null) Parameters.Remove(maxLengthParameter);
+        maxLengthParameter = value;
+        Parameters.Add(maxLengthParameter);
+        OnMaxLengthParameterChanged();
+      }
+    }
+
+    [Storable]
+    private IValueParameter<IntValue> maxCloseParameter;
+    public IValueParameter<IntValue> MaxCloseParameter {
+      get { return maxCloseParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("Max close parameter must not be null.");
+        if (value.Value == null) throw new ArgumentNullException("Max close parameter value must not be null.");
+        if (maxCloseParameter == value) return;
+
+        if (maxCloseParameter != null) Parameters.Remove(maxCloseParameter);
+        maxCloseParameter = value;
+        Parameters.Add(maxCloseParameter);
+        OnMaxCloseParameterChanged();
+      }
+    }
+
+    [Storable]
+    private IValueParameter<DoubleValue> closeBiasLevelParameter;
+    public IValueParameter<DoubleValue> CloseBiasLevelParameter {
+      get { return closeBiasLevelParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("Close bias level parameter must not be null.");
+        if (value.Value == null) throw new ArgumentNullException("Close bias level parameter value must not be null.");
+        if (closeBiasLevelParameter == value) return;
+
+        if (closeBiasLevelParameter != null) Parameters.Remove(closeBiasLevelParameter);
+        closeBiasLevelParameter = value;
+        Parameters.Add(closeBiasLevelParameter);
+        OnCloseBiasLevelParameterChanged();
+      }
+    }
+
+    [Storable]
+    private IValueParameter<PercentValue> inInstructionProbabilityParameter;
+    public IValueParameter<PercentValue> InInstructionProbabilityParameter {
+      get { return inInstructionProbabilityParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("In instruciton probability parameter must not be null.");
+        if (value.Value == null) throw new ArgumentNullException("In instruciton probability parameter value must not be null.");
+        if (inInstructionProbabilityParameter == value) return;
+
+        if (inInstructionProbabilityParameter != null) Parameters.Remove(inInstructionProbabilityParameter);
+        inInstructionProbabilityParameter = value;
+        Parameters.Add(inInstructionProbabilityParameter);
+        OnInInstructionProbabilityParameterChanged();
+      }
+    }
+
+    [Storable]
+    private IValueParameter<IExpressionsConfiguration> instructionsParameter;
+    public IValueParameter<IExpressionsConfiguration> InstructionsParameter {
+      get { return instructionsParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("Instructions paramter must not be null");
+        if (instructionsParameter == value) return;
+
+        if (instructionsParameter != null) Parameters.Remove(instructionsParameter);
+        instructionsParameter = value;
+        Parameters.Add(instructionsParameter);
+        OnInstructionsParameterChanged();
+      }
+    }
+
+    [Storable]
+    private IValueParameter<ErcOptions> ercOptionsParameter;
+    public IValueParameter<ErcOptions> ErcOptionsParameter {
+      get { return ercOptionsParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("ErcOptions paramter must not be null");
+        if (ercOptionsParameter == value) return;
+
+        if (ercOptionsParameter != null) Parameters.Remove(ercOptionsParameter);
+        ercOptionsParameter = value;
+        Parameters.Add(ercOptionsParameter);
+        OnErcOptionsParameterChanged();
+      }
+    }
+
+    public IExpressionsConfiguration Instructions {
+      get { return InstructionsParameter.Value; }
+      set { InstructionsParameter.Value = value; }
+    }
+
+    public ErcOptions ErcOptions {
+      get { return ErcOptionsParameter.Value; }
+      set { ErcOptionsParameter.Value = value; }
+    }
+
+    public int MinLength {
+      get { return MinLengthParameter.Value.Value; }
+      set { MinLengthParameter.Value.Value = value; }
+    }
+
+    public int MaxLength {
+      get { return MaxLengthParameter.Value.Value; }
+      set { MaxLengthParameter.Value.Value = value; }
+    }
+
+    public int MaxClose {
+      get { return MaxCloseParameter.Value.Value; }
+      set { MaxCloseParameter.Value.Value = value; }
+    }
+
+    public double InInstructionProbability {
+      get { return InInstructionProbabilityParameter.Value.Value; }
+      set { InInstructionProbabilityParameter.Value.Value = value; }
+    }
+    #endregion
+
+    #region Operator Discovery
+    private static readonly IEnumerable<Type> EncodingSpecificOperatorTypes;
+    static PlushEncoding() {
+      EncodingSpecificOperatorTypes = new List<Type>() {
+        typeof (IPlushOperator),
+        typeof (IPlushCreator),
+        typeof (IPlushCrossover),
+        typeof (IPlushManipulator),
+      };
+    }
+
+    private void DiscoverOperators() {
+      var assembly = typeof(IPlushOperator).Assembly;
+      var discoveredTypes = ApplicationManager.Manager.GetTypes(EncodingSpecificOperatorTypes, assembly, true, false, false);
+      var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
+      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
+
+      ConfigureOperators(newOperators);
+      foreach (var @operator in newOperators)
+        AddOperator(@operator);
+    }
+    #endregion
+
+    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
+      ConfigureCreators(operators.OfType<IPlushCreator>());
+      ConfigureCrossovers(operators.OfType<IPlushCrossover>());
+      ConfigureManipulators(operators.OfType<IPlushManipulator>());
+    }
+
+    private void ConfigureCreators(IEnumerable<IPlushCreator> creators) {
+      foreach (var creator in creators) {
+        creator.PlushVectorParameter.ActualName = Name;
+        creator.MinLengthParameter.ActualName = MinLengthParameter.Name;
+        creator.MaxLengthParameter.ActualName = MaxLengthParameter.Name;
+        creator.MaxCloseParameter.ActualName = MaxCloseParameter.Name;
+        creator.CloseBiasLevelParameter.ActualName = CloseBiasLevelParameter.Name;
+        creator.ErcOptionsParameter.ActualName = ErcOptionsParameter.Name;
+        creator.InstructionsParameter.ActualName = InstructionsParameter.Name;
+        creator.InInstructionProbabilityParameter.ActualName = InInstructionProbabilityParameter.Name;
+      }
+    }
+
+    private void ConfigureCrossovers(IEnumerable<IPlushCrossover> crossovers) {
+      foreach (var crossover in crossovers) {
+        crossover.ChildParameter.ActualName = Name;
+        crossover.ParentsParameter.ActualName = Name;
+      }
+    }
+
+    private void ConfigureManipulators(IEnumerable<IPlushManipulator> manipulators) {
+      foreach (var manipulator in manipulators) {
+        manipulator.PlushVectorParameter.ActualName = Name;
+        manipulator.PlushVectorParameter.Hidden = true;
+
+        manipulator.ErcOptionsParameter.ActualName = ErcOptionsParameter.Name;
+        manipulator.InstructionsParameter.ActualName = InstructionsParameter.Name;
+        manipulator.InInstructionProbabilityParameter.ActualName = InInstructionProbabilityParameter.Name;
+      }
+    }
+  }
+
+  public static class IndividualExtensionMethods {
+    public static PlushVector PlushVector(this Individual individual) {
+      var encoding = individual.GetEncoding<PlushEncoding>();
+      return individual.PlushVector(encoding.Name);
+    }
+
+    public static PlushVector PlushVector(this Individual individual, string name) {
+      return (PlushVector)individual[name];
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushEntry.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushEntry.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushEntry.cs	(revision 15771)
@@ -0,0 +1,36 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class PlushEntry : Item {
+    public PlushEntry() { }
+
+    public PlushEntry(Expression instruction = null, int close = 0, bool silent = false) {
+      Instruction = instruction;
+      Close = close;
+      Silent = silent;
+    }
+
+    [StorableConstructor]
+    public PlushEntry(bool deserializing) : base(deserializing) { }
+
+    public PlushEntry(PlushEntry origin, Cloner cloner) : base(origin, cloner) {
+      Instruction = cloner.Clone(origin.Instruction);
+      Close = origin.Close;
+      Silent = origin.Silent;
+    }
+
+    [Storable]
+    public Expression Instruction { get; set; }
+    [Storable]
+    public int Close { get; set; }
+    [Storable]
+    public bool Silent { get; set; }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PlushEntry(this, cloner);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushVector.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushVector.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushVector.cs	(revision 15771)
@@ -0,0 +1,116 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Collections.Generic;
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public sealed class PlushVector : Item {
+
+    [Storable]
+    private readonly List<PlushEntry> entries;
+    public IReadOnlyList<PlushEntry> Entries { get { return entries; } }
+
+    public PlushVector() : this(0) { }
+
+    public PlushVector(int length) {
+      entries = new List<PlushEntry>(length);
+    }
+
+    [StorableConstructor]
+    private PlushVector(bool deserializing) : base(deserializing) {
+    }
+
+    public PlushVector(PlushVector origin, Cloner cloner) : base(origin, cloner) {
+      entries = new List<PlushEntry>(origin.entries.Count);
+      for (var i = 0; i < origin.entries.Count; i++) {
+        entries.Add(cloner.Clone(origin.entries[i]));
+      }
+
+      pushProgram = origin.pushProgram;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PlushVector(this, cloner);
+    }
+
+    private PushProgram pushProgram;
+
+    public PushProgram PushProgram {
+      get {
+        if (pushProgram == null) CreatePushProgram();
+        return pushProgram;
+      }
+    }
+
+    private void CreatePushProgram() {
+      var close = 0;
+      var currentIndex = 0;
+
+      pushProgram = FromPlush(ref currentIndex, ref close, 0);
+    }
+
+    private PushProgram FromPlush(
+     ref int currentIndex,
+     ref int close,
+     int depth) {
+
+      if (currentIndex >= entries.Count)
+        return PushProgram.Empty;
+
+      var instructions = new List<Expression>();
+
+      for (; currentIndex < entries.Count; currentIndex++) {
+        var entry = entries[currentIndex];
+
+        if (entry.Silent)
+          continue;
+
+        close += entry.Close;
+        instructions.Add(entry.Instruction);
+
+        PushExpressionAttribute attribute;
+        var instructionType = entry.Instruction.GetType();
+
+        if (ExpressionTable.TypeToAttributeTable.TryGetValue(instructionType, out attribute)) {
+          for (var blockIdx = 0u; blockIdx < attribute.RequiredBlockCount; blockIdx++) {
+            if (close == 0 && currentIndex < entries.Count) {
+              currentIndex++;
+              var subProgram = FromPlush(ref currentIndex, ref close, depth + 1);
+              instructions.Add(subProgram);
+            } else {
+              close--;
+              instructions.Add(PushProgram.Empty);
+            }
+          }
+        }
+
+        if (close > 0 && depth > 0) {
+          close--;
+          break;
+        }
+
+        if (depth == 0) {
+          close = 0;
+        }
+      }
+
+      instructions.Reverse();
+      return new PushProgram(instructions);
+    }
+
+    public void UpdatePushProgram() {
+      pushProgram = null;
+    }
+
+    public void Add(PlushEntry entry) {
+      entries.Add(entry);
+    }
+
+    public PlushEntry this[int key] {
+      get {
+        return entries[key];
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Evaluator/EvaluationResult.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Evaluator/EvaluationResult.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Evaluator/EvaluationResult.cs	(revision 15771)
@@ -0,0 +1,11 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  public class EvaluationResult {
+    public EvaluationResult(int exampleCount) {
+      ExampleQualities = new double[exampleCount];
+    }
+
+
+    public double AvgQuality { get; set; }
+    public double[] ExampleQualities { get; set; }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Evaluator/IPushEvaluator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Evaluator/IPushEvaluator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Evaluator/IPushEvaluator.cs	(revision 15771)
@@ -0,0 +1,13 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+
+  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/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Evaluator/PushBenchmarkSuiteEvaluator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Evaluator/PushBenchmarkSuiteEvaluator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Evaluator/PushBenchmarkSuiteEvaluator.cs	(revision 15771)
@@ -0,0 +1,615 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+  using System.Collections.Generic;
+  using System.Globalization;
+  using System.Linq;
+
+  using HeuristicLab.BenchmarkSuite;
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class PushBenchmarkSuiteEvaluator : ParameterizedNamedItem, IPushEvaluator {
+
+    private const string DATA_BOUNDS_PARAMETER_NAME = "DataBounds";
+    private const string DATA_PARAMETER_NAME = "Data";
+    private const string DATA_PARAMETER_DESCRIPTION = "Program Synthesis";
+
+    public PushBenchmarkSuiteEvaluator() {
+      Parameters.Add(new FixedValueParameter<DataBounds>(DATA_BOUNDS_PARAMETER_NAME));
+
+      Parameters.Add(new ValueParameter<ProblemData>(
+        DATA_PARAMETER_NAME,
+        DATA_PARAMETER_DESCRIPTION));
+    }
+
+    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[DATA_PARAMETER_NAME]; }
+    }
+
+    public ProblemData Data {
+      get { return DataParameter.Value; }
+      set { DataParameter.Value = value; }
+    }
+
+    public IValueParameter<DataBounds> DataBoundsParameter {
+      get { return (IValueParameter<DataBounds>)Parameters[DATA_BOUNDS_PARAMETER_NAME]; }
+    }
+
+    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) {
+        // special
+        case ProblemType.NumberIO: return NumberIo(interpreter, example);
+        case ProblemType.StringDifferences: return StringDifferences(interpreter, example);
+        case ProblemType.EvenSquares: return EvenSquares(interpreter, example);
+        case ProblemType.WallisPi: return WallisPi(interpreter, example);
+        case ProblemType.VectorSummed: return VectorsSummed(interpreter, example);
+        case ProblemType.XWordLines: return XWordLines(interpreter, example);
+        case ProblemType.NegativeToZero: return NegativeToZero(interpreter, example);
+        case ProblemType.WordStats: return WordStats(interpreter, example);
+        case ProblemType.Checksum: return Checksum(interpreter, example);
+        case ProblemType.Grades: return Grade(interpreter, example);
+        case ProblemType.Syllables: return Syllables(interpreter, example);
+
+        // printed string right/wrong
+        case ProblemType.Smallest:
+        case ProblemType.Median: return PrintedStringRight(interpreter, example);
+        case ProblemType.MedianIntegerError: return MedianIntegerError(interpreter, example);
+
+        // boolean error
+        case ProblemType.MirrorImage:
+        case ProblemType.SuperAnagrams:
+        case ProblemType.CompareStringLengths: return GetDiff(example.OutputBoolean, interpreter.BooleanStack, Data.WorstResult, BooleanDiffer);
+
+        // float error
+        case ProblemType.VectorAverage: return GetDiff(example.OutputFloat, interpreter.FloatStack, Data.WorstResult, (a, b) => FloatDiffer(a, b, example.OutputFloatPrecision, Data.WorstResult));
+
+        // integer error
+        case ProblemType.LastIndexOfZero:
+        case ProblemType.CountOdds:
+        case ProblemType.SumOfSquares:
+        case ProblemType.ScrabbleScore:
+        case ProblemType.CollatzNumbers: return GetDiff(example.OutputInteger, interpreter.IntegerStack, Data.WorstResult, IntegerDiffer);
+
+        // levenshtein distance + integer error
+        case ProblemType.ReplaceSpaceWithNewline:
+          return GetPrintDiffer(example.OutputPrint, interpreter.PrintStack, Data.WorstResult)
+               + GetDiff(example.OutputInteger, interpreter.IntegerStack, Data.WorstResult, IntegerDiffer);
+
+        // printed levenshtein distance
+        case ProblemType.ForLoopIndex:
+        case ProblemType.DoubleLetters:
+        case ProblemType.StringLengthsBackwards:
+        case ProblemType.PigLatin:
+        case ProblemType.Digits:
+        case ProblemType.SmallOrLarge: return GetPrintDiffer(example.OutputPrint, interpreter.PrintStack, Data.WorstResult);
+      }
+
+      return Default(interpreter, example);
+    }
+
+    private double Default(IPushInterpreter interpreter, Example example) {
+      var integerDiff = GetDiff(example.OutputInteger, interpreter.IntegerStack, Data.WorstResult, IntegerDiffer);
+      var floatDiff = GetDiff(example.OutputFloat, interpreter.FloatStack, Data.WorstResult, (a, b) => FloatDiffer(a, b, example.OutputFloatPrecision, Data.WorstResult));
+      var booleanDiff = GetDiff(example.OutputBoolean, interpreter.BooleanStack, Data.WorstResult, BooleanDiffer);
+      var stringDiff = GetDiff(example.OutputString, interpreter.StringStack, Data.WorstResult, StringDiffer);
+      var charDiff = GetDiff(example.OutputChar, interpreter.CharStack, Data.WorstResult, CharDiffer);
+      var printDiff = GetPrintDiffer(example.OutputPrint, interpreter.PrintStack, Data.WorstResult);
+      var integerVectorDiff = GetVectorDiff(example.OutputIntegerVector, interpreter.IntegerVectorStack, Data.WorstResult, (a, b) => VectorDiffer(a, b, IntegerDiffer));
+      var floatVectorDiff = GetVectorDiff(example.OutputFloatVector, interpreter.FloatVectorStack, Data.WorstResult, (a, b) => VectorDiffer(a, b, (x, y) => FloatDiffer(x, y, example.OutputFloatVectorPrecision, Data.WorstResult)));
+      var stringVectorDiff = GetVectorDiff(example.OutputStringVector, interpreter.StringVectorStack, Data.WorstResult, (a, b) => VectorDiffer(a, b, StringDiffer));
+
+      var result =
+          integerDiff
+        + floatDiff
+        + booleanDiff
+        + stringDiff
+        + charDiff
+        + printDiff
+        + integerVectorDiff
+        + floatVectorDiff
+        + stringVectorDiff;
+
+      return result;
+    }
+
+    private double PrintedStringRight(IPushInterpreter interpreter, Example example) {
+      return interpreter.PrintStack.IsEmpty ||
+             !interpreter.PrintStack.ToString().Equals(example.OutputPrint)
+             ? 1
+             : 0;
+    }
+
+    private double MedianIntegerError(IPushInterpreter interpreter, Example example) {
+      var printResult = interpreter.PrintStack.ToString();
+
+      long result;
+      if (long.TryParse(printResult, out result)) {
+        var diff = result.AbsoluteDiff(example.OutputInteger[0]);
+
+        return Math.Min(Data.WorstResult, diff);
+      }
+
+      return Data.WorstResult;
+    }
+
+    private double NumberIo(IPushInterpreter interpreter, Example example) {
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty)
+        return Data.WorstResult;
+
+      var printResult = interpreter.PrintStack.ToString();
+
+      double value;
+      if (double.TryParse(printResult, NumberStyles.Number | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out value)) {
+        var diff = example.OutputFloat[0].AbsoluteDiff(value);
+        diff = Math.Min(diff, Data.WorstResult);
+
+        return diff;
+      }
+
+      var penaltyError = Data.WorstResult / 4.0d;
+      var levenshteinDistance = GetPrintDiffer(
+        example.OutputPrint,
+        printResult,
+        Data.WorstResult);
+
+      var result = levenshteinDistance + penaltyError;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double StringDifferences(IPushInterpreter interpreter, Example example) {
+      if (string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty) {
+        return 0.0;
+      }
+
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty) {
+        return Data.WorstResult;
+      }
+
+      var printResult = interpreter.PrintStack.ToString();
+      var distance = example.OutputPrint.LevenshteinDistance(printResult);
+
+      var lineCountWithCorrectFormat = interpreter.PrintStack
+        .AsStrings()
+        .Count(line => {
+          var parts = line.Split(' ');
+
+          if (parts.Length != 3)
+            return false;
+
+          var part0 = parts[0].Trim();
+          if (part0.Length == 0 || !part0.IsNumeric())
+            return false;
+
+          var part1 = parts[1].Trim();
+          if (part1.Length != 1)
+            return false;
+
+          var part2 = parts[2].Trim();
+          if (part2.Length != 1)
+            return false;
+
+          return true;
+        });
+
+      var lineCountWithInvalidFormat = example.OutputPrintLineCount - lineCountWithCorrectFormat;
+      lineCountWithInvalidFormat = Math.Min(lineCountWithInvalidFormat, example.OutputPrintLineCount);
+
+      var result = distance + lineCountWithInvalidFormat;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double EvenSquares(IPushInterpreter interpreter, Example example) {
+      if (string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty) {
+        return 0.0;
+      }
+
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty) {
+        return Data.WorstResult;
+      }
+
+      var printResult = interpreter.PrintStack.ToString();
+      var distance = example.OutputPrint.LevenshteinDistance(printResult);
+
+      var printLines = interpreter.PrintStack.AsStrings().ToArray();
+
+      var lineCountWithInvalidFormat = printLines
+        .Take(example.OutputPrintLineCount)
+        .Count(line => !line.IsNumeric());
+
+      var compareLength = Math.Min(printLines.Length, example.OutputPrintLineCount);
+      var integerError = 0L;
+
+      for (var i = 0; i < compareLength; i++) {
+        long value;
+        if (long.TryParse(printLines[i], out value)) {
+          integerError += value.AbsoluteDiff(example.OutputIntegerVector[0][i]);
+        }
+      }
+
+      var result = distance + lineCountWithInvalidFormat + integerError / compareLength;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double WallisPi(IPushInterpreter interpreter, Example example) {
+      if (interpreter.FloatStack.IsEmpty)
+        return Data.WorstResult;
+
+      var floatDiff = GetDiff(example.OutputFloat, interpreter.FloatStack, Data.WorstResult, (a, b) => FloatDiffer(a, b, example.OutputFloatPrecision, Data.WorstResult));
+      var expectedStr = example.OutputFloat[0].ToString(Data.FloatStringFormat, CultureInfo.CurrentCulture);
+      var resultStr = interpreter.FloatStack.TopOrDefault.ToString(Data.FloatStringFormat, CultureInfo.CurrentCulture);
+      var distance = expectedStr.LevenshteinDistance(resultStr);
+
+      var result = floatDiff + distance;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double VectorsSummed(IPushInterpreter interpreter, Example example) {
+      if (interpreter.IntegerVectorStack.IsEmpty && example.OutputIntegerVector.Length > 0)
+        return Data.WorstResult;
+
+      var resultVector = interpreter.IntegerVectorStack[0];
+      var expectedVector = example.OutputIntegerVector[0];
+      var comparableLength = Math.Min(resultVector.Count, expectedVector.Length);
+
+      // add penalty if length does not match
+      //var result = expectedVector.Length > 0
+      //  ? (expectedVector.Length - comparableLength) * (Data.WorstResult / expectedVector.Length)
+      //  : 0;
+
+      if (comparableLength == 0) {
+        return Data.WorstResult;
+      }
+
+      var result = 0d;
+
+      for (var i = 0; i < comparableLength; i++) {
+        result += resultVector[i].AbsoluteDiff(expectedVector[i]);
+      }
+
+      for (var i = comparableLength; i < expectedVector.Length; i++) {
+        result += expectedVector[i];
+      }
+
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double XWordLines(IPushInterpreter interpreter, Example example) {
+      if (string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty) {
+        return 0.0;
+      }
+
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty)
+        return Data.WorstResult;
+
+      var estimatedWordsPerLineCount = example.InputInteger[0];
+      var estimatedWordCount = example.OutputInteger[0];
+      var estimatedLastWordCount = estimatedWordCount - estimatedWordsPerLineCount * Math.Max(0, example.OutputPrintLineCount - 1);
+      var printResult = interpreter.PrintStack.ToString();
+      var distance = example.OutputPrint.LevenshteinDistance(printResult);
+      var lineCount = interpreter.PrintStack.Count;
+      var lineCountError = example.OutputPrintLineCount.AbsoluteDiff(lineCount);
+      var totalWordsPerLineError = 0L;
+
+      for (var i = 0; i < interpreter.PrintStack.Lines.Count - 1; i++) {
+        totalWordsPerLineError += interpreter.PrintStack.Lines[i].Split(' ').Length.AbsoluteDiff(estimatedWordsPerLineCount);
+      }
+
+      // last line
+      var lastLine = interpreter.PrintStack.Lines[interpreter.PrintStack.Lines.Count - 1];
+      totalWordsPerLineError += lastLine.Split(' ').Length.AbsoluteDiff(estimatedLastWordCount);
+
+      var result = distance + lineCountError + totalWordsPerLineError;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double NegativeToZero(IPushInterpreter interpreter, Example example) {
+      if (interpreter.IntegerVectorStack.IsEmpty && example.OutputIntegerVector.Length > 0)
+        return Data.WorstResult;
+
+      var resultVector = interpreter.IntegerVectorStack.Top;
+      var expectedVector = example.OutputIntegerVector[0];
+      var comparableLength = Math.Min(resultVector.Count, expectedVector.Length);
+
+      // add penalty if length does not match
+      //var result = expectedVector.Length > 0
+      //  ? (expectedVector.Length - comparableLength) * (Data.WorstResult / expectedVector.Length)
+      //  : 0;
+
+      if (comparableLength == 0) {
+        return Data.WorstResult;
+      }
+
+      var result = 0d;
+
+      for (var i = 0; i < comparableLength; i++) {
+        var expectedStr = expectedVector[i].ToString();
+        var resultStr = resultVector[i].ToString();
+
+        result += expectedStr.LevenshteinDistance(resultStr);
+      }
+
+      for (var i = comparableLength; i < expectedVector.Length; i++) {
+        result += expectedVector[i].ToString().Length;
+      }
+
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double WordStats(IPushInterpreter interpreter, Example example) {
+      if (string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty) {
+        return 0.0;
+      }
+
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty)
+        return Data.WorstResult;
+
+      var printStr = interpreter.PrintStack.ToString();
+      var distance = example.OutputPrint.LevenshteinDistance(printStr);
+
+      var statsError = 0.0;
+      long numberOfSentences;
+      var expectedNumberOfSentences = example.OutputInteger[0];
+      statsError += BenchmarkSuite.Problems.WordStats.GetNumberOfSentences(printStr, out numberOfSentences)
+        ? expectedNumberOfSentences.AbsoluteDiff(numberOfSentences)
+        : Data.WorstResult / 3.0;
+
+      double averageSentenceLength;
+      var expectedAverageSentenceLength = example.OutputFloat[0];
+      statsError += BenchmarkSuite.Problems.WordStats.GetAverageSentenceLength(printStr, out averageSentenceLength)
+        ? expectedAverageSentenceLength.AbsoluteDiff(averageSentenceLength)
+        : Data.WorstResult / 3.0;
+
+      var result = distance + statsError;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double Checksum(IPushInterpreter interpreter, Example example) {
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty)
+        return Data.WorstResult;
+
+      var printStr = interpreter.PrintStack.ToString();
+      var distance = example.OutputPrint.LevenshteinDistance(printStr);
+
+      var expectedLastCharIndex = example.OutputPrint.Length - 1;
+      var resultLastCharIndex = printStr.Length - 1;
+      var result = distance;
+
+      if (expectedLastCharIndex >= 0 && resultLastCharIndex >= 0) {
+        var expectedLastChar = example.OutputPrint[expectedLastCharIndex];
+        var resultLastChar = printStr[resultLastCharIndex];
+
+        result += expectedLastChar.AbsoluteDiff(resultLastChar);
+      }
+
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double Syllables(IPushInterpreter interpreter, Example example) {
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty)
+        return Data.WorstResult;
+
+      var printStr = interpreter.PrintStack.ToString();
+      var distance = example.OutputPrint.LevenshteinDistance(printStr);
+
+      long numberOfSyllables;
+      var expectedNumberOfSyllables = example.OutputInteger[0];
+      var numberOfSyllablesError = BenchmarkSuite.Problems.Syllables.GetNumberOfSyllables(printStr, out numberOfSyllables)
+        ? expectedNumberOfSyllables.AbsoluteDiff(numberOfSyllables)
+        : Data.WorstResult / 2.0;
+
+      var result = distance + numberOfSyllablesError;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double Grade(IPushInterpreter interpreter, Example example) {
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty)
+        return Data.WorstResult;
+
+      var printStr = interpreter.PrintStack.ToString();
+      var distance = example.OutputPrint.LevenshteinDistance(printStr);
+
+      char grade;
+      var expectedGrade = example.OutputChar[0];
+      var gradeError = BenchmarkSuite.Problems.Grades.GetGrade(printStr, out grade)
+        ? expectedGrade.AbsoluteDiff(grade)
+        : char.MaxValue;
+
+      var result = distance + gradeError;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private static double FloatDiffer(double a, double b, int digits, double worst) {
+      var result = Math.Round(a, digits) - Math.Round(b, digits);
+
+      // ReSharper disable once CompareOfFloatsByEqualityOperator
+      if (result == double.MinValue || double.IsPositiveInfinity(result) ||
+          double.IsNaN(result) ||
+          // ReSharper disable once CompareOfFloatsByEqualityOperator
+          result == double.MaxValue || double.IsNegativeInfinity(result))
+        return worst;
+
+      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 a.LevenshteinDistance(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 = estimated.LevenshteinDistance(printResult);
+
+      return Math.Min(distance, worstResult);
+    }
+
+    private static double GetPrintDiffer(string estimated, IPrintStack printStack, double worstResult) {
+      var printResult = printStack.ToString();
+      var distance = estimated.LevenshteinDistance(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;
+      if (resultStack.IsEmpty && estimated.Count > 0) return worstResult;
+
+      var diff = 0d;
+      var comparableLength = Math.Min(estimated.Count, resultStack.Count);
+
+      if (!resultStack.IsEmpty) {
+
+        for (var i = 0; i < comparableLength && diff < worstResult; i++) {
+          diff += differ(estimated[i], resultStack[i]);
+        }
+      }
+
+      var emptyTArray = new T[0];
+      for (var i = comparableLength; i < estimated.Count - comparableLength && diff < worstResult; i++) {
+        diff += differ(estimated[i], emptyTArray);
+      }
+
+      return double.IsNaN(diff) || double.IsInfinity(diff)
+         ? worstResult
+         : Math.Min(diff, worstResult);
+    }
+
+    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;
+      if (resultStack.IsEmpty && estimated.Count > 0) return worstResult;
+
+      var diff = 0d;
+      var comparableLength = Math.Min(estimated.Count, resultStack.Count);
+
+      if (!resultStack.IsEmpty) {
+        for (var i = 0; i < comparableLength && diff < worstResult; i++) {
+          diff += differ(estimated[i], resultStack[i]);
+        }
+      }
+
+      for (var i = comparableLength; i < estimated.Count - comparableLength && diff < worstResult; i++) {
+        diff += differ(estimated[i], default(T));
+      }
+
+      return double.IsNaN(diff) || double.IsInfinity(diff)
+        ? worstResult
+        : Math.Min(diff, worstResult);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Exporter/Exporter.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Exporter/Exporter.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Exporter/Exporter.cs	(revision 15771)
@@ -0,0 +1,8 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  public static class Exporter {
+    public static string ToString(Expression expression) {
+      return expression.ToString();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/BooleanExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/BooleanExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/BooleanExpressions.cs	(revision 15771)
@@ -0,0 +1,181 @@
+﻿using System;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  /// <summary>
+  ///     Pushes the logical AND of the top two BOOLEANs.
+  /// </summary>
+  [PushExpression(StackTypes.Boolean, "BOOLEAN.AND", "Pushes the logical AND of the top two BOOLEANs.")]
+  [StorableClass]
+  public class BooleanAndExpression : StatelessExpression {
+    public BooleanAndExpression() { }
+    [StorableConstructor]
+    public BooleanAndExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.BooleanStack.Pop();
+      var second = interpreter.BooleanStack.Top;
+      var result = second && first;
+
+      interpreter.BooleanStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  ///     Pushes the logical OR of the top two BOOLEANs.
+  /// </summary>
+  [PushExpression(StackTypes.Boolean, "BOOLEAN.OR", "Pushes the logical OR of the top two BOOLEANs.")]
+  [StorableClass]
+  public class BooleanOrExpression : StatelessExpression {
+    public BooleanOrExpression() { }
+    [StorableConstructor]
+    public BooleanOrExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.BooleanStack.Pop();
+      var second = interpreter.BooleanStack.Top;
+      var result = second || first;
+
+      interpreter.BooleanStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  ///     Pushes the logical NOT of the top BOOLEAN.
+  /// </summary>
+  [PushExpression(StackTypes.Boolean, "BOOLEAN.NOT", "Pushes the logical NOT of the top BOOLEAN.")]
+  [StorableClass]
+  public class BooleanNotExpression : StatelessExpression {
+    public BooleanNotExpression() { }
+    [StorableConstructor]
+    public BooleanNotExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      interpreter.BooleanStack.Top = !interpreter.BooleanStack.Top;
+    }
+  }
+
+  /// <summary>
+  ///     Pushes FALSE if the top FLOAT is 0.0, or TRUE otherwise.
+  /// </summary>
+  [PushExpression(StackTypes.Boolean, "BOOLEAN.FROMFLOAT", "Pushes FALSE if the top FLOAT is 0.0, or TRUE otherwise.", StackTypes.Float)]
+  [StorableClass]
+  public class BooleanFromFloatExpression : StatelessExpression {
+    public BooleanFromFloatExpression() { }
+    [StorableConstructor]
+    public BooleanFromFloatExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count == 0;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = !Math.Abs(interpreter.FloatStack.Pop()).IsAlmost(0);
+      interpreter.BooleanStack.Push(value);
+    }
+  }
+
+  /// <summary>
+  ///     Pushes FALSE if the top INTEGER is 0, or TRUE otherwise.
+  /// </summary>
+  [PushExpression(StackTypes.Boolean, "BOOLEAN.FROMINTEGER", "Pushes FALSE if the top INTEGER is 0, or TRUE otherwise.", StackTypes.Integer)]
+  [StorableClass]
+  public class BooleanFromIntegerExpression : StatelessExpression {
+    public BooleanFromIntegerExpression() { }
+    [StorableConstructor]
+    public BooleanFromIntegerExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count == 0;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.IntegerStack.Pop() != 0;
+      interpreter.BooleanStack.Push(value);
+    }
+  }
+
+  /// <summary>
+  ///     Pushes the logical AND of the top two BOOLEANs, whereby the first value is inverted first.
+  /// </summary>
+  [PushExpression(StackTypes.Boolean, "BOOLEAN.INVERT_FIRST_THEN_AND", "Pushes the logical AND of the top two BOOLEANs, whereby the first value is inverted first.")]
+  [StorableClass]
+  public class BooleanInvertFirstThenAnd : StatelessExpression {
+    public BooleanInvertFirstThenAnd() { }
+    [StorableConstructor]
+    public BooleanInvertFirstThenAnd(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.BooleanStack.Pop();
+      var second = interpreter.BooleanStack.Top;
+      var result = second && !first;
+
+      interpreter.BooleanStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  ///     Pushes the logical AND of the top two BOOLEANs, whereby the second value is inverted first.
+  /// </summary>
+  [PushExpression(StackTypes.Boolean, "BOOLEAN.INVERT_SECOND_THEN_AND", "Pushes the logical AND of the top two BOOLEANs, whereby the second value is inverted first.")]
+  [StorableClass]
+  public class BooleanInvertSecondThenAnd : StatelessExpression {
+    public BooleanInvertSecondThenAnd() { }
+    [StorableConstructor]
+    public BooleanInvertSecondThenAnd(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.BooleanStack.Pop();
+      var second = interpreter.BooleanStack.Top;
+      var result = !second && first;
+
+      interpreter.BooleanStack.Top = result;
+    }
+  }
+
+
+  /// <summary>
+  ///     Pushes the xor of the top tow BOOLEANs
+  /// </summary>
+  [PushExpression(StackTypes.Boolean, "BOOLEAN.XOR", "Pushes the xor of the top tow BOOLEANs.")]
+  [StorableClass]
+  public class BooleanXorExpression : StatelessExpression {
+    public BooleanXorExpression() { }
+    [StorableConstructor]
+    public BooleanXorExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.BooleanStack.Pop();
+      var second = interpreter.BooleanStack.Top;
+      var result = second ^ first;
+
+      interpreter.BooleanStack.Top = result;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/CharExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/CharExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/CharExpressions.cs	(revision 15771)
@@ -0,0 +1,155 @@
+﻿using System;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  /// <summary>
+  /// Pushes TRUE onto the BOOLEAN stack if the top char represents a whitespace char, otherwise FALSE.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.ISWHITESPACE",
+    "Pushes TRUE onto the BOOLEAN stack if the top char represents a whitespace char, otherwise FALSE.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class CharIsWhitespaceExpression : StatelessExpression {
+    public CharIsWhitespaceExpression() { }
+    [StorableConstructor]
+    public CharIsWhitespaceExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var c = interpreter.CharStack.Pop();
+      interpreter.BooleanStack.Push(char.IsWhiteSpace(c));
+    }
+  }
+
+  /// <summary>
+  /// Pushes TRUE onto the CHAR stack if the top char represents a letter, otherwise FALSE.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.ISLETTER",
+    "Pushes TRUE onto the CHAR stack if the top char represents a letter, otherwise FALSE.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class CharIsLetterExpression : StatelessExpression {
+    public CharIsLetterExpression() { }
+    [StorableConstructor]
+    public CharIsLetterExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var c = interpreter.CharStack.Pop();
+      interpreter.BooleanStack.Push(char.IsLetter(c));
+    }
+  }
+
+  /// <summary>
+  /// Pushes TRUE onto the CHAR stack if the top char represents a digit, otherwise FALSE.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.ISDIGIT",
+    "Pushes TRUE onto the CHAR stack if the top char represents a digit, otherwise FALSE.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class CharIsDigitExpression : StatelessExpression {
+    public CharIsDigitExpression() { }
+    [StorableConstructor]
+    public CharIsDigitExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var c = interpreter.CharStack.Pop();
+      interpreter.BooleanStack.Push(char.IsDigit(c));
+    }
+  }
+
+  /// <summary>
+  /// Takes the top integer, converts it to an char using ASCII encoding and pushes this char onto the CHAR stack.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.FROMINTEGER",
+    "Takes the top integer, converts it to an char using ASCII encoding and pushes this char onto the CHAR stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class CharFromIntegerExpression : StatelessExpression {
+    public CharFromIntegerExpression() { }
+    [StorableConstructor]
+    public CharFromIntegerExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = (int)Math.Abs(interpreter.IntegerStack.Pop() % 128);
+      var c = Convert.ToChar(value);
+
+      interpreter.CharStack.Push(c);
+    }
+  }
+
+  /// <summary>
+  /// Takes the top float, casts it to an integer, converts it to an char using ASCII encoding and pushes this char onto the CHAR stack.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.FROMFLOAT",
+    "Takes the top float, casts it to an integer, converts it to an char using ASCII encoding and pushes this char onto the CHAR stack.",
+    StackTypes.Float)]
+  [StorableClass]
+  public class CharFromFloatExpression : StatelessExpression {
+    public CharFromFloatExpression() { }
+    [StorableConstructor]
+    public CharFromFloatExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = (int)Math.Abs(interpreter.FloatStack.Pop() % 128);
+      var c = Convert.ToChar(value);
+
+      interpreter.CharStack.Push(c);
+    }
+  }
+
+  /// <summary>
+  /// Takes the top string and pushes the chars of this string onto the CHAR stack in reversed order.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.ALLFROMSTRING",
+    "Takes the top string and pushes the chars of this string onto the CHAR stack in reversed order.",
+    StackTypes.String)]
+  [StorableClass]
+  public class CharAllFromStringExpression : StatelessExpression {
+    public CharAllFromStringExpression() { }
+    [StorableConstructor]
+    public CharAllFromStringExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var chars = interpreter.StringStack.Pop().Reverse().ToList();
+      interpreter.CharStack.Push(chars);
+    }
+  }
+
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/CodeExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/CodeExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/CodeExpressions.cs	(revision 15771)
@@ -0,0 +1,1029 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  // For explicit code manipulation and execution. May also be used as a general list data types.
+  // This types must always be present, as the top level interpreter will push any code to be executed on the
+  // CODE stack prior to execution. However, one may turn off all CODE instructions if code manipulation is not needed.
+
+  /// <summary>
+  /// Recursively invokes the interpreter on the program on top of the CODE stack. After evaluation the
+  /// CODE stack is popped; normally this pops the program that was just executed, but if the expression itself
+  /// manipulates the stack then this final pop may end up popping something else.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.DO",
+    "Recursively invokes the interpreter on the program on top of the CODE stack. After evaluation the CODE stack is popped; normally this pops the program that was just executed, but if the expression itself manipulates the stack then this final pop may end up popping something else.",
+    StackTypes.Exec)]
+  [StorableClass]
+  public class CodeDoExpression : StatelessExpression {
+    public CodeDoExpression() { }
+    [StorableConstructor]
+    public CodeDoExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var codePopExpression = ExpressionTable.GetStatelessExpression<CodePopExpression>();
+      interpreter.ExecStack.Push(codePopExpression, interpreter.CodeStack.Top);
+    }
+  }
+
+  /// <summary>
+  /// Like CODE.DO but pops the stack before, rather than after, the recursive execution.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.DO*",
+    "Like CODE.DO but pops the stack before, rather than after, the recursive execution.",
+    StackTypes.Exec)]
+  [StorableClass]
+  public class CodeDoXExpression : StatelessExpression {
+    public CodeDoXExpression() { }
+    [StorableConstructor]
+    public CodeDoXExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var expression = interpreter.CodeStack.Pop();
+      interpreter.ExecStack.Push(expression);
+    }
+  }
+
+  /// <summary>
+  ///     Does nothing.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.NOOP",
+    "Does nothing.")]
+  [StorableClass]
+  public class CodeNoopExpression : StatelessExpression {
+    public CodeNoopExpression() { }
+    [StorableConstructor]
+    public CodeNoopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return true;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      // do nothing
+    }
+  }
+
+  /// <summary>
+  /// Specifies that the next expression submitted for execution will instead be pushed literally onto the CODE stack.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.QUOTE",
+    "Specifies that the next expression submitted for execution will instead be pushed literally onto the CODE stack.",
+    StackTypes.Exec,
+    requiredBlockCount: 1)]
+  [StorableClass]
+  public class CodeQuoteExpression : StatelessExpression {
+    public CodeQuoteExpression() { }
+    [StorableConstructor]
+    public CodeQuoteExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var expression = interpreter.ExecStack.Pop();
+      interpreter.CodeStack.Push(expression);
+    }
+  }
+
+  /// <summary>
+  /// If the top item of the BOOLEAN stack is TRUE this recursively executes the second item of the CODE stack;
+  /// otherwise it recursively executes the first item of the CODE stack. Either way both elements of the CODE stack
+  /// (and the BOOLEAN value upon which the decision was made) are popped.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.IF",
+    "If the top item of the BOOLEAN stack is TRUE this recursively executes the second item of the CODE stack, otherwise it recursively executes the first item of the CODE stack",
+    StackTypes.Exec | StackTypes.Boolean)]
+  [StorableClass]
+  public class CodeIfExpression : StatelessExpression {
+    public CodeIfExpression() { }
+    [StorableConstructor]
+    public CodeIfExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.IsEmpty || interpreter.CodeStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var condition = interpreter.BooleanStack.Pop();
+      var first = interpreter.CodeStack[1];
+      var second = interpreter.CodeStack.Top;
+
+      interpreter.CodeStack.Remove(2);
+      interpreter.ExecStack.Push(condition ? first : second);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the result of appending the top two pieces of code. If one of the pieces of code is a single instruction or
+  /// literal (that is, something not surrounded by parentheses) then it is surrounded by parentheses first.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.APPEND",
+    "Pushes the result of appending the top two pieces of code.")]
+  [StorableClass]
+  public class CodeAppendExpression : StatelessExpression {
+    public CodeAppendExpression() { }
+    [StorableConstructor]
+    public CodeAppendExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.CodeStack.Top;
+      var second = interpreter.CodeStack[1];
+
+      PushProgram firstProgram = null;
+      PushProgram secondProgram = null;
+
+      if (first.IsProgram) {
+        firstProgram = (PushProgram)first;
+
+        if (firstProgram.Depth > interpreter.Configuration.MaxDepth) return;
+
+        if (second.IsProgram) {
+          secondProgram = (PushProgram)second;
+
+          if (secondProgram.Depth > interpreter.Configuration.MaxDepth ||
+              firstProgram.Count + secondProgram.Count > interpreter.Configuration.MaxProgramLength)
+            return;
+        } else if (firstProgram.Count + 1 > interpreter.Configuration.MaxProgramLength) return;
+      } else if (second.IsProgram) {
+        secondProgram = (PushProgram)second;
+
+        if (secondProgram.Depth > interpreter.Configuration.MaxDepth
+            || secondProgram.Count + 1 > interpreter.Configuration.MaxProgramLength) return;
+      } else if (interpreter.Configuration.MaxProgramLength <= 2) {
+        return;
+      }
+
+      interpreter.CodeStack.Pop();
+
+      PushProgram result;
+
+      if (firstProgram != null) {
+        result = secondProgram != null
+          ? PushProgram.Merge(interpreter.PoolContainer.PushProgramPool, interpreter.PoolContainer.ExpressionListPool, secondProgram, firstProgram)
+          : PushProgram.Merge(interpreter.PoolContainer.PushProgramPool, interpreter.PoolContainer.ExpressionListPool, second, firstProgram);
+      } else if (secondProgram != null) {
+        result = PushProgram.Merge(interpreter.PoolContainer.PushProgramPool, interpreter.PoolContainer.ExpressionListPool, first, secondProgram);
+      } else {
+        var expressions = interpreter.PoolContainer.ExpressionListPool.Get();
+        expressions.Add(second);
+        expressions.Add(first);
+
+        result = PushProgram.Create(interpreter.PoolContainer.PushProgramPool, expressions);
+      }
+
+      interpreter.CodeStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes TRUE onto the BOOLEAN stack if the top piece of code is a single instruction or a literal,
+  /// and FALSE otherwise (that is, if it is something surrounded by parentheses).
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.ATOM",
+    "Pushes TRUE onto the BOOLEAN stack if the top piece of code is a single instruction or a literal, and FALSE otherwise",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class CodeAtomExpression : StatelessExpression {
+    public CodeAtomExpression() { }
+    [StorableConstructor]
+    public CodeAtomExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var expression = interpreter.CodeStack.Pop();
+      var isExpandExpression = expression.IsProgram;
+
+      interpreter.BooleanStack.Push(!isExpandExpression);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the first item of the list on top of the CODE stack. For example, if the top piece of code is "( A B )"
+  /// then this pushes "A" (after popping the argument). If the code on top of the stack is not a list then this has no
+  /// effect. The name derives from the similar Lisp function; a more generic name would be "FIRST".
+  /// </summary>
+  [PushExpression(StackTypes.Code, "CODE.CAR", "Pushes the first item of the list on top of the CODE stack.")]
+  [StorableClass]
+  public class CodeCarExpression : StatelessExpression {
+    public CodeCarExpression() { }
+    [StorableConstructor]
+    public CodeCarExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.IsEmpty ||
+            !interpreter.CodeStack.Top.IsProgram ||
+            ((PushProgram)interpreter.CodeStack.Top).IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var expand = (PushProgram)interpreter.CodeStack.Top;
+      var first = expand.Expressions[expand.Expressions.Count - 1];
+
+      interpreter.CodeStack.Top = first;
+    }
+  }
+
+  /// <summary>
+  /// Pushes a version of the list from the top of the CODE stack without its first element.
+  /// For example, if the top piece of code is "( A B )" then this pushes "( B )" (after popping the argument).
+  /// If the code on top of the stack is not a list then this pushes the empty list ("( )"). The name derives from
+  /// the similar Lisp function; a more generic name would be "REST".
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.CDR",
+    "Pushes a version of the list from the top of the CODE stack without its first element.")]
+  [StorableClass]
+  public class CodeCdrExpression : StatelessExpression {
+    public CodeCdrExpression() { }
+    [StorableConstructor]
+    public CodeCdrExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.IsEmpty ||
+             (interpreter.CodeStack.Top.IsProgram && ((PushProgram)interpreter.CodeStack.Top).IsEmpty);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      PushProgram result;
+      var top = interpreter.CodeStack.Top;
+
+      if (top.IsProgram) {
+        var program = (PushProgram)top;
+        var expressions = program.CopyExpressions(interpreter.PoolContainer.ExpressionListPool);
+        expressions.RemoveAt(expressions.Count - 1);
+
+        result = PushProgram.Create(interpreter.PoolContainer.PushProgramPool, expressions as IReadOnlyList<Expression>);
+      } else result = PushProgram.Empty;
+
+
+      interpreter.CodeStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the result of "consing" (in the Lisp sense) the second stack item onto the first stack item
+  /// (which is coerced to a list if necessary). For example, if the top piece of code is "( A B )" and the
+  /// second piece of code is "X" then this pushes "( X A B )" (after popping the argument).
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.CONS",
+    "Pushes the result of \"consing\" (in the Lisp sense) the second stack item onto the first stack item.")]
+  [StorableClass]
+  public class CodeConsExpression : StatelessExpression {
+    public CodeConsExpression() { }
+    [StorableConstructor]
+    public CodeConsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.Count < 2 ||
+            (interpreter.CodeStack.Top.IsProgram &&
+            ((PushProgram)interpreter.CodeStack.Top).Expressions.Count + 1 > interpreter.Configuration.MaxProgramLength);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var expressions = interpreter.PoolContainer.ExpressionListPool.Get();
+      var first = interpreter.CodeStack.Pop();
+
+      if (first.IsProgram) {
+        expressions.AddRange(((PushProgram)first).Expressions);
+      } else {
+        expressions.Add(first);
+      }
+
+      expressions.Add(interpreter.CodeStack.Top);
+      var result = PushProgram.Create(interpreter.PoolContainer.PushProgramPool, expressions);
+      interpreter.CodeStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the "container" of the second CODE stack item within the first CODE stack item onto the CODE stack.
+  /// If second item contains the first anywhere (i.e. in any nested list) then the container is the smallest sub-list
+  /// that contains but is not equal to the first instance. For example, if the top piece of code is "( B ( C ( A ) ) ( D
+  /// ( A ) ) )" and the second piece of code is "( A )" then this pushes ( C ( A ) ). Pushes an empty list if there is no such
+  /// container.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.CONTAINER",
+    "Pushes the \"container\" of the second CODE stack item within the first CODE stack item onto the CODE stack")]
+  [StorableClass]
+  public class CodeContainerExpression : StatelessExpression {
+    public CodeContainerExpression() { }
+    [StorableConstructor]
+    public CodeContainerExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return (interpreter.CodeStack.Count < 2) ||
+             (interpreter.CodeStack[1].GetType() != typeof(PushProgram));
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var target = interpreter.CodeStack.Pop();
+      var source = interpreter.CodeStack.Top;
+
+      var container = GetContainer(source as PushProgram, target);
+      var result = container ?? PushProgram.Empty;
+
+      interpreter.CodeStack.Top = result;
+    }
+
+    private static PushProgram GetContainer(PushProgram current, Expression target) {
+      if (Equals(current, target))
+        return null;
+
+      var subContainer =
+          current.Expressions.Where(e => e.IsProgram)
+              .Select(e => GetContainer(e as PushProgram, target))
+              .Where(e => e != null);
+
+      var execExpandExpressions = subContainer as IList<PushProgram> ?? subContainer.ToList();
+      return execExpandExpressions.Any()
+          ? execExpandExpressions.OrderBy(c => c.Expressions.Count).LastOrDefault()
+          : current.Expressions.Contains(target)
+              ? current
+              : null;
+    }
+  }
+
+  /// <summary>
+  /// Pushes TRUE on the BOOLEAN stack if the second CODE stack item contains the first CODE stack
+  /// item anywhere (e.g. in a sub-list).
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.CONTAINS",
+    "Pushes TRUE on the BOOLEAN stack if the second CODE stack item contains the first CODE stack item anywhere.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class CodeContainsExpression : StatelessExpression {
+    public CodeContainsExpression() { }
+    [StorableConstructor]
+    public CodeContainsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.Count < 2 || !interpreter.CodeStack[1].IsProgram;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var second = (PushProgram)interpreter.CodeStack[1];
+      var first = interpreter.CodeStack.Top;
+      interpreter.CodeStack.Remove(2);
+
+      var contains = second.Expressions.Contains(first);
+      interpreter.BooleanStack.Push(contains);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the definition associated with the top NAME on the NAME stack (if any) onto the CODE stack.
+  /// This extracts the definition for inspection/manipulation, rather than for immediate execution (although it
+  /// may then be executed with a call to CODE.DO or a similar instruction).
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.DEFINITION",
+    "Pushes the definition associated with the top NAME on the NAME stack (if any) onto the CODE stack.",
+    StackTypes.Name)]
+  [StorableClass]
+  public class CodeDefinitionExpression : StatelessExpression {
+    public CodeDefinitionExpression() { }
+    [StorableConstructor]
+    public CodeDefinitionExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.NameStack.IsEmpty ||
+            !interpreter.CustomExpressions.ContainsKey(interpreter.NameStack.Top);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var name = interpreter.NameStack.Pop();
+      var definition = interpreter.CustomExpressions[name];
+
+      interpreter.CodeStack.Push(definition);
+    }
+  }
+
+  /// <summary>
+  ///     Pushes a measure of the discrepancy between the top two CODE stack items onto the INTEGER stack. This will be zero
+  ///     if the top two items are equivalent, and will be higher the 'more different' the items are from one another. The calculation
+  ///     is as follows:
+  ///     <list types="bullet">
+  ///         <item>
+  ///             <description>
+  ///                 Construct a list of all of the unique items in both of the lists(where uniqueness is determined by equalp).
+  ///                 Sub-lists and atoms all count as items.
+  ///             </description>
+  ///         </item>
+  ///         <item>
+  ///             <description>Initialize the result to zero.</description>
+  ///         </item>
+  ///         <item>
+  ///             <description>
+  ///                 For each unique item increment the result by the difference between the number of occurrences of the
+  ///                 item in the two pieces of code.
+  ///             </description>
+  ///         </item>
+  ///         <item>
+  ///             <description>Push the result.</description>
+  ///         </item>
+  ///     </list>
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.DISCREPANCY",
+    "Pushes a measure of the discrepancy between the top two CODE stack items onto the INTEGER stack",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class CodeDiscrepancyExpression : StatelessExpression {
+    public CodeDiscrepancyExpression() { }
+    [StorableConstructor]
+    public CodeDiscrepancyExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var second = interpreter.CodeStack[1];
+      var first = interpreter.CodeStack.Top;
+      interpreter.CodeStack.Remove(2);
+
+      var firstItems = new Dictionary<int, int>();
+      var secondItems = new Dictionary<int, int>();
+
+      DetermineUniqueItems(second, secondItems);
+      DetermineUniqueItems(first, firstItems);
+
+      var discrepancy = GetDiscrepancy(firstItems, secondItems);
+      interpreter.IntegerStack.Push(discrepancy);
+    }
+
+    private int GetDiscrepancy(IDictionary<int, int> first, IDictionary<int, int> second) {
+      var discrepancy = 0;
+      var keys = first.Keys.Concat(second.Keys).Distinct();
+
+      foreach (var key in keys)
+        if (first.ContainsKey(key) && second.ContainsKey(key))
+          discrepancy += Math.Abs(first[key] - second[key]);
+        else if (first.ContainsKey(key)) discrepancy += first[key];
+        else discrepancy += second[key];
+
+      return discrepancy;
+    }
+
+    private void DetermineUniqueItems(Expression source, IDictionary<int, int> items) {
+      if (source.IsProgram) {
+        var program = source as PushProgram;
+        var expressions = program.Expressions;
+
+        for (var i = 0; i < expressions.Count; i++) {
+          var id = expressions[i].GetHashCode();
+          if (!items.ContainsKey(id)) items.Add(id, 1);
+          else items[id]++;
+        }
+      } else {
+        items.Add(source.GetHashCode(), 1);
+      }
+    }
+  }
+
+  /// <summary>
+  /// Pushes the sub-expression of the top item of the CODE stack that is indexed by the top item of the INTEGER stack.
+  /// The indexing here counts "points," where each parenthesized expression and each literal/instruction is considered a
+  /// point, and it proceeds in depth first order. The entire piece of code is at index 0; if it is a list then the first item
+  /// in the list is at index 1, etc. The integer used as the index is taken modulo the number of points in the overall expression
+  /// (and its absolute value is taken in case it is negative) to ensure that it is within the meaningful range.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.EXTRACT",
+    "Pushes the sub-expression of the top item of the CODE stack that is indexed by the top item of the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class CodeExtractExpression : StatelessExpression {
+    public CodeExtractExpression() { }
+    [StorableConstructor]
+    public CodeExtractExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty ||
+             interpreter.CodeStack.IsEmpty ||
+            !interpreter.CodeStack.Top.IsProgram;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var expression = (PushProgram)interpreter.CodeStack.Top;
+      var index = interpreter.IntegerStack.Pop().AsInt(expression.TotalCount);
+      var result = expression.GetFromTree(index);
+
+      interpreter.CodeStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pops the BOOLEAN stack and pushes the popped item (TRUE or FALSE) onto the CODE stack.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.FROMBOOLEAN",
+    "Pops the BOOLEAN stack and pushes the popped item(TRUE or FALSE) onto the CODE stack.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class CodeFromBooleanExpression : StatelessExpression {
+    public CodeFromBooleanExpression() { }
+    [StorableConstructor]
+    public CodeFromBooleanExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.BooleanStack.Pop();
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<BooleanPushExpression>();
+      var expression = BooleanPushExpression.Create(pool, value);
+
+      interpreter.CodeStack.Push(expression);
+    }
+  }
+
+  /// <summary>
+  /// Pops the FLOAT stack and pushes the popped item onto the CODE stack.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.FROMFLOAT",
+    "Pops the FLOAT stack and pushes the popped item onto the CODE stack.",
+    StackTypes.Float)]
+  [StorableClass]
+  public class CodeFromFloatExpression : StatelessExpression {
+    public CodeFromFloatExpression() { }
+    [StorableConstructor]
+    public CodeFromFloatExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.FloatStack.Pop();
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<FloatPushExpression>();
+      var expression = FloatPushExpression.Create(pool, value);
+
+      interpreter.CodeStack.Push(expression);
+    }
+  }
+
+  /// <summary>
+  /// Pops the INTEGER stack and pushes the popped integer onto the CODE stack.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.FROMINTEGER",
+    "Pops the INTEGER stack and pushes the popped integer onto the CODE stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class CodeFromIntegerExpression : StatelessExpression {
+    public CodeFromIntegerExpression() { }
+    [StorableConstructor]
+    public CodeFromIntegerExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.IntegerStack.Pop();
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<IntegerPushExpression>();
+      var expression = IntegerPushExpression.Create(pool, value);
+
+      interpreter.CodeStack.Push(expression);
+    }
+  }
+
+  /// <summary>
+  /// Pops the NAME stack and pushes the popped item onto the CODE stack.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.FROMNAME",
+    "Pops the NAME stack and pushes the popped item onto the CODE stack.",
+    StackTypes.Name)]
+  [StorableClass]
+  public class CodeFromNameExpression : StatelessExpression {
+    public CodeFromNameExpression() { }
+    [StorableConstructor]
+    public CodeFromNameExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.NameStack.Pop();
+      var expression = new NameDefineXExecExpression(value);
+
+      interpreter.CodeStack.Push(expression);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the result of inserting the second item of the CODE stack into the first item, at the position indexed
+  /// by the top item of the INTEGER stack (and replacing whatever was there formerly).
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.CODEINSERT",
+    "Pushes the result of inserting the second item of the CODE stack into the first item, at the position indexed by the top item of the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class CodeInsertExpression : StatelessExpression {
+    public CodeInsertExpression() { }
+    [StorableConstructor]
+    public CodeInsertExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty ||
+             interpreter.CodeStack.Count < 2 ||
+            !interpreter.CodeStack.Top.IsProgram;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var source = interpreter.CodeStack[1];
+      var target = (PushProgram)interpreter.CodeStack.Pop();
+
+      IList<Expression> newExpressions;
+      if (!target.IsEmpty) {
+        var index = interpreter.IntegerStack.Pop().AsInt(target.Expressions.Count);
+        index = target.Expressions.Count - 1 - index;
+        newExpressions = target.CopyExpressions(interpreter.PoolContainer.ExpressionListPool);
+
+        newExpressions[index] = source.IsProgram
+            ? ((PushProgram)source).Copy(interpreter.PoolContainer.PushProgramPool)
+            : source;
+      } else {
+        newExpressions = interpreter.PoolContainer.ExpressionListPool.Get();
+        newExpressions.Add(source);
+      }
+
+      var result = PushProgram.Create(interpreter.PoolContainer.PushProgramPool, newExpressions as IReadOnlyList<Expression>);
+      interpreter.CodeStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the length of the top item on the CODE stack onto the INTEGER stack.
+  /// If the top item is not a list then this pushes a 1. If the top item is a list then this pushes the
+  /// number of items in the top level of the list; that is, nested lists contribute only 1 to this count, no
+  /// matter what they contain.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.LENGTH",
+    "Pushes the length of the top item on the CODE stack onto the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class CodeLengthExpression : StatelessExpression {
+    public CodeLengthExpression() { }
+    [StorableConstructor]
+    public CodeLengthExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var expression = interpreter.CodeStack.Pop();
+      var count = 1;
+
+      if (expression.IsProgram)
+        count = ((PushProgram)expression).Expressions.Count;
+
+      interpreter.IntegerStack.Push(count);
+    }
+  }
+
+  /// <summary>
+  /// Pushes a list of the top two items of the CODE stack onto the CODE stack.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.LIST",
+    "Pushes a list of the top two items of the CODE stack onto the CODE stack.")]
+  [StorableClass]
+  public class CodeListExpression : StatelessExpression {
+    public CodeListExpression() { }
+    [StorableConstructor]
+    public CodeListExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.Count < 2 ||
+            (interpreter.CodeStack.Top.IsProgram && ((PushProgram)interpreter.CodeStack.Top).Depth == interpreter.Configuration.MaxDepth) ||
+            (interpreter.CodeStack[1].IsProgram && ((PushProgram)interpreter.CodeStack[1]).Depth == interpreter.Configuration.MaxDepth);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.CodeStack.Pop();
+      var second = interpreter.CodeStack.Top;
+
+      var expressions = interpreter.PoolContainer.ExpressionListPool.Get();
+      expressions.Add(second);
+      expressions.Add(first);
+
+      var expandExpression = PushProgram.Create(interpreter.PoolContainer.PushProgramPool, expressions);
+      interpreter.CodeStack.Top = expandExpression;
+    }
+  }
+
+  /// <summary>
+  /// Pushes TRUE onto the BOOLEAN stack if the second item of the CODE stack is a member of the first item
+  /// (which is coerced to a list if necessary). Pushes FALSE onto the BOOLEAN stack otherwise.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.MEMBER",
+    "Pushes TRUE onto the BOOLEAN stack if the second item of the CODE stack is a member of the first item, FALSE otherwise.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class CodeMemberExpression : StatelessExpression {
+    public CodeMemberExpression() { }
+    [StorableConstructor]
+    public CodeMemberExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.CodeStack[1];
+      var second = interpreter.CodeStack.Top;
+      interpreter.CodeStack.Remove(2);
+
+      var contains = second.IsProgram
+          ? ((PushProgram)second).Expressions.Contains(first)
+          : second.Equals(first);
+
+      interpreter.BooleanStack.Push(contains);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the nth element of the expression on top of the CODE stack (which is coerced to a list first if necessary).
+  /// If the expression is an empty list then the result is an empty list. N is taken from the INTEGER stack and is taken
+  /// modulo the length of the expression into which it is indexing.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.NTH",
+    "Pushes the nth element, whereby n is taken from the INTEGER stack, of the expression on top of the CODE stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class CodeNthExpression : StatelessExpression {
+    public CodeNthExpression() { }
+    [StorableConstructor]
+    public CodeNthExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.IsEmpty || interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var n = interpreter.IntegerStack.Pop();
+      var expression = interpreter.CodeStack.Top;
+
+      Expression nthExpression;
+
+      if (expression.IsProgram) {
+        var subExpression = (PushProgram)expression;
+
+        if (subExpression.IsEmpty) {
+          nthExpression = PushProgram.Empty;
+        } else {
+          var index = (subExpression.Expressions.Count - 1 - n.AsInt(subExpression.Expressions.Count));
+
+          nthExpression = subExpression.Expressions[index];
+        }
+      } else {
+        nthExpression = expression;
+      }
+
+      interpreter.CodeStack.Top = nthExpression;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the nth "CDR" (in the Lisp sense) of the expression on top of the CODE stack (which is coerced to a list
+  /// first if necessary). If the expression is an empty list then the result is an empty list. N is taken from the
+  /// INTEGER stack and is taken modulo the length of the expression into which it is indexing. A "CDR" of a list is the list
+  /// without its first element.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.NTHCDR",
+    "Pushes the nth \"CDR\" (in the Lisp sense) of the expression on top of the CODE stack, whereby n is taken from the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class CodeNthCdrExpression : StatelessExpression {
+    public CodeNthCdrExpression() { }
+    [StorableConstructor]
+    public CodeNthCdrExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.IsEmpty || interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var n = interpreter.IntegerStack.Pop();
+      var expression = interpreter.CodeStack.Top;
+
+      Expression nthExpression;
+
+      if (expression.IsProgram) {
+        var subExpressions = ((PushProgram)expression).Expressions;
+
+        if (subExpressions.Count < 2) {
+          nthExpression = PushProgram.Empty;
+        } else {
+          var index = subExpressions.Count - 2 - n.AsInt(subExpressions.Count - 1);
+
+          nthExpression = subExpressions[index];
+        }
+      } else {
+        nthExpression = expression;
+      }
+
+      interpreter.CodeStack.Top = nthExpression;
+    }
+  }
+
+  /// <summary>
+  /// Pushes TRUE onto the BOOLEAN stack if the top item of the CODE stack is an empty list, or FALSE otherwise.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.NULL",
+    "Pushes TRUE onto the BOOLEAN stack if the top item of the CODE stack is an empty list, or FALSE otherwise",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class CodeNullExpression : StatelessExpression {
+    public CodeNullExpression() { }
+    [StorableConstructor]
+    public CodeNullExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var top = interpreter.CodeStack.Pop();
+      var result = top.IsProgram && ((PushProgram)top).IsEmpty;
+      interpreter.BooleanStack.Push(result);
+    }
+  }
+
+  /// <summary>
+  /// Pushes onto the INTEGER stack the position of the second item on the CODE stack within the first item
+  /// (which is coerced to a list if necessary). Pushes -1 if no match is found.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.POSITION",
+    "Pushes onto the INTEGER stack the position of the second item on the CODE stack within the first item. Pushes -1 if no match is found",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class CodePositionExpression : StatelessExpression {
+    public CodePositionExpression() { }
+    [StorableConstructor]
+    public CodePositionExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var second = interpreter.CodeStack[1];
+      var first = interpreter.CodeStack.Top;
+      interpreter.CodeStack.Remove(2);
+
+      var position = -1;
+      if (first.IsProgram) {
+        var program = (PushProgram)first;
+        position = program.IndexOf(second);
+      } else if (first.Equals(second)) {
+        position = 0;
+      }
+
+      interpreter.IntegerStack.Push(position);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the number of "points" in the top piece of CODE onto the INTEGER stack. Each instruction, literal,
+  /// and pair of parentheses counts as a point.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.SIZE",
+    "Pushes the number of \"points\" in the top piece of CODE onto the INTEGER stack. Each instruction, literal, and pair of parentheses counts as a point.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class CodeSizeExpression : StatelessExpression {
+    public CodeSizeExpression() { }
+    [StorableConstructor]
+    public CodeSizeExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var expression = interpreter.CodeStack.Pop();
+      var points = expression.IsProgram
+          ? ((PushProgram)expression).Expressions.Count
+          : 1;
+
+      interpreter.IntegerStack.Push(points);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the result of substituting the third item on the code stack for the second item in the first item.
+  /// As of this writing this is implemented only in the Lisp implementation, within which it relies on the Lisp "subst"
+  /// function. As such, there are several problematic possibilities; for example "dotted-lists" can result in certain
+  /// cases with empty-list arguments. If any of these problematic possibilities occurs the stack is left unchanged.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.SUBST",
+    "Pushes the result of substituting the third item on the code stack for the second item in the first item.")]
+  [StorableClass]
+  public class CodeSubstitutionExpression : StatelessExpression {
+    public CodeSubstitutionExpression() { }
+    [StorableConstructor]
+    public CodeSubstitutionExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return (interpreter.CodeStack.Count < 3) ||
+             (interpreter.CodeStack.Top.GetType() != typeof(PushProgram));
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var third = interpreter.CodeStack[2];
+      var second = interpreter.CodeStack[1];
+      var first = interpreter.CodeStack.Top as PushProgram;
+      interpreter.CodeStack.Remove(2);
+
+      var firstExpressions = first.Expressions;
+      var newExpressions = interpreter.PoolContainer.ExpressionListPool.Get();
+
+      for (var i = 0; i < firstExpressions.Count; i++) {
+        var expression = firstExpressions[i].Equals(third)
+                           ? second
+                           /* no cloning needed here because first is removed and therefore newExpression is the only container of sub expressions */
+                           : firstExpressions[i];
+
+        newExpressions.Add(expression);
+      }
+
+      var result = PushProgram.Create(interpreter.PoolContainer.PushProgramPool, newExpressions);
+      interpreter.CodeStack.Top = result;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DefineExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DefineExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DefineExpressions.cs	(revision 15771)
@@ -0,0 +1,332 @@
+﻿using System;
+using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  /// <summary>
+  /// Defines the name on top of the NAME stack as an instruction that will push the top item of the T stack onto the EXEC stack.
+  /// </summary>
+  /// <typeparam name="T">Stack item type</typeparam>
+  [StorableClass]
+  public abstract class DefineExpression<T> : StatelessExpression {
+    protected DefineExpression() { }
+    [StorableConstructor]
+    protected DefineExpression(bool deserializing) : base(deserializing) { }
+
+    protected void Eval(
+      IPushStack<T> stack,
+      IPushStack<string> nameStack,
+      IDictionary<string, Expression> customExpressions,
+      Func<T, Expression> creator) {
+      var name = nameStack.Pop();
+      var expression = creator(stack.Top);
+
+      if (customExpressions.ContainsKey(name)) customExpressions[name] = expression;
+      else customExpressions.Add(name, expression);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.DEFINE",
+    "Defines the name on top of the NAME stack as an instruction that will push the top item of the CODE stack onto the EXEC stack.",
+    StackTypes.Name)]
+  [StorableClass]
+  public class CodeDefineExpression : DefineExpression<Expression> {
+    public CodeDefineExpression() { }
+    [StorableConstructor]
+    protected CodeDefineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return (interpreter.Configuration.TopLevelPushCode && interpreter.CodeStack.Count < 2) ||
+             interpreter.CodeStack.IsEmpty ||
+             interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<ExecPushExpression>();
+
+      Eval(
+        interpreter.CodeStack,
+        interpreter.NameStack,
+        interpreter.CustomExpressions,
+        v => ExecPushExpression.Create(pool, v));
+
+      interpreter.CodeStack.Pop();
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.DEFINE",
+    "Defines the name on top of the NAME stack as an instruction that will push the top item of the EXEC stack onto the EXEC stack.",
+    StackTypes.Name,
+    requiredBlockCount: 1)]
+  [StorableClass]
+  public class ExecDefineExpression : DefineExpression<Expression> {
+    public ExecDefineExpression() { }
+    [StorableConstructor]
+    protected ExecDefineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.Count < 2 ||
+             interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<ExecPushExpression>();
+
+      Eval(
+        interpreter.ExecStack,
+        interpreter.NameStack,
+        interpreter.CustomExpressions,
+        v => ExecPushExpression.Create(pool, v));
+
+      interpreter.ExecStack.Pop();
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.DEFINE",
+    "Defines the name on top of the NAME stack as an instruction that will push the top item of the FLOAT stack onto the EXEC stack.",
+    StackTypes.Name)]
+  [StorableClass]
+  public class FloatDefineExpression : DefineExpression<double> {
+    public FloatDefineExpression() { }
+    [StorableConstructor]
+    protected FloatDefineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.IsEmpty ||
+             interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<FloatPushExpression>();
+
+      Eval(
+        interpreter.FloatStack,
+        interpreter.NameStack,
+        interpreter.CustomExpressions,
+        v => FloatPushExpression.Create(pool, v));
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.DEFINE",
+    "Defines the name on top of the NAME stack as an instruction that will push the top item of the INTEGER stack onto the EXEC stack.",
+    StackTypes.Name)]
+  [StorableClass]
+  public class IntegerDefineExpression : DefineExpression<long> {
+    public IntegerDefineExpression() { }
+    [StorableConstructor]
+    protected IntegerDefineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty ||
+             interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<IntegerPushExpression>();
+
+      Eval(
+        interpreter.IntegerStack,
+        interpreter.NameStack,
+        interpreter.CustomExpressions,
+        v => IntegerPushExpression.Create(pool, v));
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Boolean,
+    "BOOLEAN.DEFINE",
+    "Defines the name on top of the NAME stack as an instruction that will push the top item of the BOOLEAN stack onto the EXEC stack.",
+    StackTypes.Name)]
+  [StorableClass]
+  public class BooleanDefineExpression : DefineExpression<bool> {
+    public BooleanDefineExpression() { }
+    [StorableConstructor]
+    protected BooleanDefineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.IsEmpty ||
+             interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<BooleanPushExpression>();
+
+      Eval(
+        interpreter.BooleanStack,
+        interpreter.NameStack,
+        interpreter.CustomExpressions,
+        v => BooleanPushExpression.Create(pool, v));
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.DEFINE",
+    "Defines the name on top of the NAME stack as an instruction that will push the top item of the CHAR stack onto the EXEC stack.",
+    StackTypes.Name)]
+  [StorableClass]
+  public class CharDefineExpression : DefineExpression<char> {
+    public CharDefineExpression() { }
+    [StorableConstructor]
+    protected CharDefineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.IsEmpty ||
+             interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<CharPushExpression>();
+
+      Eval(
+        interpreter.CharStack,
+        interpreter.NameStack,
+        interpreter.CustomExpressions,
+        v => CharPushExpression.Create(pool, v));
+    }
+  }
+
+  [PushExpression(
+    StackTypes.String,
+    "STRING.DEFINE",
+    "Defines the name on top of the NAME stack as an instruction that will push the top item of the STRING stack onto the EXEC stack.",
+    StackTypes.Name)]
+  [StorableClass]
+  public class StringDefineExpression : DefineExpression<string> {
+    public StringDefineExpression() { }
+    [StorableConstructor]
+    protected StringDefineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<StringPushExpression>();
+
+      Eval(
+        interpreter.StringStack,
+        interpreter.NameStack,
+        interpreter.CustomExpressions,
+        v => StringPushExpression.Create(pool, v));
+    }
+  }
+
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].DEFINE",
+    "Defines the name on top of the NAME stack as an instruction that will push the top item of the INTEGER[] stack onto the EXEC stack.",
+    StackTypes.Name)]
+  [StorableClass]
+  public class IntegerVectorDefineExpression : DefineExpression<IReadOnlyList<long>> {
+    public IntegerVectorDefineExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorDefineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerVectorStack.IsEmpty ||
+             interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<IntegerVectorPushExpression>();
+
+      Eval(
+        interpreter.IntegerVectorStack,
+        interpreter.NameStack,
+        interpreter.CustomExpressions,
+        v => IntegerVectorPushExpression.Create(pool, v));
+    }
+  }
+
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].DEFINE",
+    "Defines the name on top of the NAME stack as an instruction that will push the top item of the FLOAT[] stack onto the EXEC stack.",
+    StackTypes.Name)]
+  [StorableClass]
+  public class FloatVectorDefineExpression : DefineExpression<IReadOnlyList<double>> {
+    public FloatVectorDefineExpression() { }
+    [StorableConstructor]
+    protected FloatVectorDefineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatVectorStack.IsEmpty ||
+             interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<FloatVectorPushExpression>();
+
+      Eval(
+        interpreter.FloatVectorStack,
+        interpreter.NameStack,
+        interpreter.CustomExpressions,
+        v => FloatVectorPushExpression.Create(pool, v));
+    }
+  }
+
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].DEFINE",
+    "Defines the name on top of the NAME stack as an instruction that will push the top item of the BOOLEAN[] stack onto the EXEC stack.",
+    StackTypes.Name)]
+  [StorableClass]
+  public class BooleanVectorDefineExpression : DefineExpression<IReadOnlyList<bool>> {
+    public BooleanVectorDefineExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorDefineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanVectorStack.IsEmpty ||
+             interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<BooleanVectorPushExpression>();
+
+      Eval(
+        interpreter.BooleanVectorStack,
+        interpreter.NameStack,
+        interpreter.CustomExpressions,
+        v => BooleanVectorPushExpression.Create(pool, v));
+    }
+  }
+
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].DEFINE",
+    "Defines the name on top of the NAME stack as an instruction that will push the top item of the STRING[] stack onto the EXEC stack.",
+    StackTypes.Name)]
+  [StorableClass]
+  public class StringVectorDefineExpression : DefineExpression<IReadOnlyList<string>> {
+    public StringVectorDefineExpression() { }
+    [StorableConstructor]
+    protected StringVectorDefineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringVectorStack.IsEmpty ||
+             interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<BooleanVectorPushExpression>();
+
+      Eval(
+        interpreter.StringVectorStack,
+        interpreter.NameStack,
+        interpreter.CustomExpressions,
+        v => StringVectorPushExpression.Create(pool, v));
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoCountExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoCountExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoCountExpressions.cs	(revision 15771)
@@ -0,0 +1,76 @@
+﻿using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// An iteration instruction that performs a loop (the body of which is taken from the CODE stack) the number of times
+  /// indicated by the INTEGER argument, pushing an index (which runs from zero to one less than the number of iterations) onto the
+  /// INTEGER stack prior to each execution of the loop body. This should be implemented as a macro that expands into a call to
+  /// CODE.DO*RANGE. CODE.DO*COUNT takes a single INTEGER argument (the number of times that the loop will be executed) and a single
+  /// CODE argument (the body of the loop). If the provided INTEGER argument is negative or zero then this becomes a NOOP. Otherwise it
+  /// expands into: ( 0 '1 - IntegerArg>' CODE.QUOTE 'CodeArg' CODE.DO*RANGE )
+  /// </summary>
+  [Serializable]
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.DO*COUNT",
+    "An iteration instruction that performs a loop (the body of which is taken from the CODE stack) the number of times indicated by the INTEGER argument, pushing an index (which runs from zero to one less than the number of iterations) onto the INTEGER stack prior to each execution of the loop body.",
+    StackTypes.Integer)]
+  public class CodeDoCountExpression : StatelessExpression {
+
+    public CodeDoCountExpression() { }
+    [StorableConstructor]
+    protected CodeDoCountExpression(bool deserializing) : base(deserializing) { }
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var destinationIndex = interpreter.IntegerStack.Top;
+      interpreter.IntegerStack.Top = 0;
+      interpreter.IntegerStack.Push(destinationIndex);
+
+      interpreter.ExecStack.Push(ExpressionTable.GetStatelessExpression<CodeDoRangeExpression>());
+    }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty ||
+             interpreter.IntegerStack.Top < 1 ||
+             interpreter.CodeStack.IsEmpty;
+    }
+  }
+
+  /// <summary>
+  /// An iteration instruction that performs a loop (the body of which is taken from the EXEC stack) the number of times
+  /// indicated by the INTEGER argument, pushing an index (which runs from zero to one less than the number of iterations) onto the
+  /// INTEGER stack prior to each execution of the loop body. This is similar to CODE.DO*COUNT except that it takes its code
+  /// argument from the EXEC stack. This should be implemented as a macro that expands into a call to EXEC.DO*RANGE. EXEC.DO*COUNT
+  /// takes a single INTEGER argument (the number of times that the loop will be executed) and a single EXEC argument (the body of the
+  /// loop). If the provided INTEGER argument is negative or zero then this becomes a NOOP. Otherwise it expands into:
+  /// ( 0 '1 - IntegerArg' EXEC.DO* RANGE'ExecArg' )
+  /// </summary>
+  [Serializable]
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.DO*COUNT",
+    "An iteration instruction that performs a loop (the body of which is taken from the EXEC stack) the number of times indicated by the INTEGER argument, pushing an index (which runs from zero to one less than the number of iterations) onto the INTEGER stack prior to each execution of the loop body.",
+    StackTypes.Integer,
+    requiredBlockCount: 1)]
+  public class ExecDoCountExpression : StatelessExpression {
+    public ExecDoCountExpression() { }
+    [StorableConstructor]
+    protected ExecDoCountExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var destinationIndex = interpreter.IntegerStack.Top;
+      interpreter.IntegerStack.Top = 0;
+      interpreter.IntegerStack.Push(destinationIndex);
+
+      interpreter.ExecStack.Push(ExpressionTable.GetStatelessExpression<ExecDoRangeExpression>());
+    }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty ||
+             interpreter.IntegerStack.Top < 1 ||
+             interpreter.ExecStack.IsEmpty;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoRangeExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoRangeExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoRangeExpressions.cs	(revision 15771)
@@ -0,0 +1,117 @@
+﻿using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  /// <summary>
+  /// An iteration instruction that executes the top item on the CODE stack a number of times that depends on the
+  /// top two integers, while also pushing the loop counter onto the INTEGER stack for possible access during the
+  /// execution of the body of the loop. The top integer is the "destination index" and the second integer is the "current index."
+  /// Last the code and the integer arguments are saved locally and popped. Then the integers are compared. If the integers are equal
+  /// then the current index is pushed onto the INTEGER stack and the code (which is the "body" of the loop) is pushed onto the EXEC stack
+  /// for subsequent execution. If the integers are not equal then the current index will still be pushed onto the INTEGER stack but two
+  /// items will be pushed onto the EXEC stack -- first a recursive call to CODE.DO*RANGE (with the same code and destination index,
+  /// but with a current index that has been either incremented or decremented by 1 to be closer to the destination index) and then the body
+  /// code. Note that the range is inclusive of both endpoints; a call with integer arguments 3 and 5 will cause its body to be executed
+  /// 3 times, with the loop counter having the values 3, 4, and 5. Note also that one can specify a loop that "counts down" by providing a
+  /// destination index that is less than the specified current index.
+  /// </summary>
+  [Serializable]
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.DO*RANGE",
+    "An iteration instruction that executes the top item on the CODE stack a number of times that depends on the top two integers, while also pushing the loop counter onto the INTEGER stack for possible access during the execution of the body of the loop.",
+    StackTypes.Integer)]
+  public class CodeDoRangeExpression : StatelessExpression {
+    public CodeDoRangeExpression() { }
+    [StorableConstructor]
+    protected CodeDoRangeExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2 || interpreter.CodeStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var toDo = interpreter.CodeStack.Pop();
+      var currentIndex = interpreter.IntegerStack[1];
+      var destinationIndex = interpreter.IntegerStack[0];
+
+      interpreter.IntegerStack.Pop();
+
+      if (currentIndex != destinationIndex) {
+
+        var incrementor = currentIndex < destinationIndex ? 1 : -1;
+        var continuation = interpreter.PoolContainer.ExpressionListPool.Get();
+        var pool = interpreter.PoolContainer.GetStatefulExpressionPool<IntegerPushExpression>();
+
+        continuation.Add(this);
+        continuation.Add(toDo);
+        continuation.Add(ExpressionTable.GetStatelessExpression<CodeQuoteExpression>());
+        continuation.Add(IntegerPushExpression.Create(pool, destinationIndex));
+        continuation.Add(IntegerPushExpression.Create(pool, currentIndex + incrementor));
+
+        var program = PushProgram.Create(interpreter.PoolContainer.PushProgramPool, continuation);
+        interpreter.ExecStack.Push(program);
+      }
+
+      interpreter.ExecStack.Push(toDo);
+    }
+  }
+
+  /// <summary>
+  ///     An iteration instruction that executes the top item on the EXEC stack a number of times that depends on the top two
+  ///     integers, while also pushing the loop counter onto the INTEGER stack for possible access during the execution of the body of
+  ///     the loop. This is similar to CODE.DO*COUNT except that it takes its code argument from the EXEC stack. The top integer is the
+  ///     "destination index" and the second integer is the "current index." Last the code and the integer arguments are
+  ///     saved locally and popped. Then the integers are compared. If the integers are equal then the current index is pushed onto the
+  ///     INTEGER stack and the code (which is the "body" of the loop) is pushed onto the EXEC stack for subsequent execution. If the
+  ///     integers are not equal then the current index will still be pushed onto the INTEGER stack but two items will be pushed onto the EXEC
+  ///     stack -- first a recursive call to EXEC.DO*RANGE (with the same code and destination index, but with a current index that
+  ///     has been either incremented or decremented by 1 to be closer to the destination index) and then the body code. Note that the
+  ///     range is inclusive of both endpoints; a call with integer arguments 3 and 5 will cause its body to be executed 3 times, with
+  ///     the loop counter having the values 3, 4, and 5. Note also that one can specify a loop that "counts down" by providing a
+  ///     destination index that is less than the specified current index.
+  /// </summary>
+  [Serializable]
+  [StorableClass]
+  [PushExpression(
+    stackType: StackTypes.Exec,
+    name: "EXEC.DO*RANGE",
+    description: "An iteration instruction that executes the top item on the EXEC stack a number of times that depends on the top two integers, while also pushing the loop counter onto the INTEGER stack for possible access during the execution of the body of the loop.",
+    additionalStackDependencies: StackTypes.Integer,
+    requiredBlockCount: 1)]
+  public class ExecDoRangeExpression : StatelessExpression {
+    public ExecDoRangeExpression() { }
+
+    [StorableConstructor]
+    protected ExecDoRangeExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2 || interpreter.ExecStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var currentIndex = interpreter.IntegerStack[1];
+      var destinationIndex = interpreter.IntegerStack[0];
+
+      interpreter.IntegerStack.Pop();
+
+      if (currentIndex == destinationIndex)
+        return;
+
+      var toDo = interpreter.ExecStack.Top;
+      var incrementor = currentIndex < destinationIndex ? 1 : -1;
+      var continuation = interpreter.PoolContainer.ExpressionListPool.Get();
+      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<IntegerPushExpression>();
+
+      continuation.Add(toDo);
+      continuation.Add(this);
+      continuation.Add(IntegerPushExpression.Create(pool, destinationIndex));
+      continuation.Add(IntegerPushExpression.Create(pool, currentIndex + incrementor));
+
+      interpreter.ExecStack.Top = PushProgram.Create(interpreter.PoolContainer.PushProgramPool, continuation);
+      interpreter.ExecStack.Push(toDo);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoTimesExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoTimesExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoTimesExpressions.cs	(revision 15771)
@@ -0,0 +1,112 @@
+﻿using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  /// <summary>
+  ///     Like CODE.DO*COUNT but does not push the loop counter.
+  ///     This should be implemented as a macro that expands into CODE.DO*RANGE, similarly to the implementation
+  ///     of CODE.DO*COUNT, except that a call to INTEGER.POP should be tacked on to the front of the loop body code
+  ///     in the call to CODE.DO*RANGE.
+  /// </summary>
+  [Serializable]
+  [StorableClass]
+  [PushExpression(StackTypes.Code, "CODE.DO*TIMES", "Like CODE.DO*COUNT but does not push the loop counter", StackTypes.Integer)]
+  public class CodeDoTimesExpression : StatelessExpression {
+    public CodeDoTimesExpression() { }
+    [StorableConstructor]
+    protected CodeDoTimesExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var destinationIndex = Math.Max(0, interpreter.IntegerStack.Top - 1);
+
+      if (destinationIndex == 0) {
+        interpreter.IntegerStack.Pop();
+        interpreter.ExecStack.Push((PushProgram)interpreter.CodeStack.Pop());
+        return;
+      }
+
+      interpreter.IntegerStack.Top = 0;
+      interpreter.IntegerStack.Push(destinationIndex);
+
+      var popExpressions = ExpressionTable.GetStatelessExpression<IntegerPopExpression>();
+      PushProgram program;
+
+      if (!interpreter.CodeStack.Top.IsProgram) {
+        var expressions = interpreter.PoolContainer.ExpressionListPool.Get();
+        expressions.Add(interpreter.ExecStack.Top);
+        expressions.Add(popExpressions);
+
+        program = PushProgram.Create(interpreter.PoolContainer.PushProgramPool, expressions);
+      } else {
+        program = PushProgram.Merge(
+          interpreter.PoolContainer.PushProgramPool,
+          interpreter.PoolContainer.ExpressionListPool,
+          (PushProgram)interpreter.CodeStack.Top,
+          popExpressions);
+      }
+
+      interpreter.CodeStack.Top = program;
+      interpreter.ExecStack.Push(ExpressionTable.GetStatelessExpression<CodeDoRangeExpression>());
+    }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty ||
+             interpreter.IntegerStack.Top < 0 ||
+             interpreter.CodeStack.IsEmpty;
+    }
+  }
+
+  /// <summary>
+  /// Like EXEC.DO*COUNT but does not push the loop counter. This should be implemented as a macro that expands into
+  /// EXEC.DO*RANGE, similarly to the implementation of EXEC.DO*COUNT, except that a call to INTEGER.POP should be tacked on to the
+  /// front of the loop body code in the call to EXEC.DO*RANGE. This call to INTEGER.POP will remove the loop counter, which will have
+  /// been pushed by EXEC.DO*RANGE, prior to the execution of the loop body.
+  /// </summary>
+  [Serializable]
+  [StorableClass]
+  [PushExpression(StackTypes.Exec, "EXEC.DO*TIMES", "Like EXEC.DO*COUNT but does not push the loop counter", StackTypes.Integer, requiredBlockCount: 1)]
+  public class ExecDoTimesExpression : StatelessExpression {
+    public ExecDoTimesExpression() { }
+    [StorableConstructor]
+    protected ExecDoTimesExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var destinationIndex = Math.Max(0, interpreter.IntegerStack.Top - 1);
+
+      if (destinationIndex == 0) {
+        interpreter.IntegerStack.Pop();
+        return;
+      }
+
+      interpreter.IntegerStack.Top = 0;
+      interpreter.IntegerStack.Push(destinationIndex);
+
+      var popExpressions = ExpressionTable.GetStatelessExpression<IntegerPopExpression>();
+      PushProgram program;
+
+      if (!interpreter.ExecStack.Top.IsProgram) {
+        var expressions = interpreter.PoolContainer.ExpressionListPool.Get();
+        expressions.Add(interpreter.ExecStack.Top);
+        expressions.Add(popExpressions);
+
+        program = PushProgram.Create(interpreter.PoolContainer.PushProgramPool, expressions);
+      } else {
+        program = PushProgram.Merge(
+          interpreter.PoolContainer.PushProgramPool,
+          interpreter.PoolContainer.ExpressionListPool,
+          (PushProgram)interpreter.ExecStack.Top,
+          popExpressions);
+      }
+
+      interpreter.ExecStack.Top = program;
+      interpreter.ExecStack.Push(ExpressionTable.GetStatelessExpression<ExecDoRangeExpression>());
+    }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty ||
+             interpreter.IntegerStack.Top < 0 ||
+             interpreter.ExecStack.IsEmpty;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DuplicateExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DuplicateExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DuplicateExpressions.cs	(revision 15771)
@@ -0,0 +1,213 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  /// <summary>
+  /// Duplicates the top item on the T stack. Does not pop its argument
+  /// (which, if it did, would negate the effect of the duplication!).
+  /// </summary>
+  /// <typeparam name="T">Stacktype</typeparam>
+  [StorableClass]
+  public abstract class DuplicateExpression<T> : StatelessExpression {
+    protected DuplicateExpression() { }
+    [StorableConstructor]
+    protected DuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    protected void Eval(IPushStack<T> stack) {
+      stack.Push(stack.Top);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Integer, "INTEGER.DUP", "Duplicates the top item on the INTEGER stack.")]
+  public class IntegerDuplicateExpression : DuplicateExpression<long> {
+    public IntegerDuplicateExpression() { }
+    [StorableConstructor]
+    protected IntegerDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Float, "FLOAT.DUP", "Duplicates the top item on the FLOAT stack.")]
+  public class FloatDuplicateExpression : DuplicateExpression<double> {
+    public FloatDuplicateExpression() { }
+    [StorableConstructor]
+    protected FloatDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Boolean, "BOOLEAN.DUP", "Duplicates the top item on the BOOLEAN stack.")]
+  public class BooleanDuplicateExpression : DuplicateExpression<bool> {
+    public BooleanDuplicateExpression() { }
+    [StorableConstructor]
+    protected BooleanDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Name, "NAME.DUP", "Duplicates the top item on the NAME stack.")]
+  public class NameDuplicateExpression : DuplicateExpression<string> {
+    public NameDuplicateExpression() { }
+    [StorableConstructor]
+    protected NameDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.NameStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Exec, "EXEC.DUP", "Duplicates the top item on the EXEC stack.", requiredBlockCount: 1)]
+  public class ExecDuplicateExpression : DuplicateExpression<Expression> {
+    public ExecDuplicateExpression() { }
+    [StorableConstructor]
+    protected ExecDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.ExecStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Code, "CODE.DUP", "Duplicates the top item on the CODE stack.")]
+  public class CodeDuplicateExpression : DuplicateExpression<Expression> {
+    public CodeDuplicateExpression() { }
+    [StorableConstructor]
+    protected CodeDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CodeStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Char, "CHAR.DUP", "Duplicates the top item on the CHAR stack.")]
+  public class CharDuplicateExpression : DuplicateExpression<char> {
+    public CharDuplicateExpression() { }
+    [StorableConstructor]
+    protected CharDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CharStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.String, "STRING.DUP", "Duplicates the top item on the STRING stack.")]
+  public class StringDuplicateExpression : DuplicateExpression<string> {
+    public StringDuplicateExpression() { }
+    [StorableConstructor]
+    protected StringDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.IntegerVector, "INTEGER[].DUP", "Duplicates the top item on the INTEGER[] stack.")]
+  public class IntegerVectorDuplicateExpression : DuplicateExpression<IReadOnlyList<long>> {
+    public IntegerVectorDuplicateExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.FloatVector, "FLOAT[].DUP", "Duplicates the top item on the FLOAT[] stack.")]
+  public class FloatVectorDuplicateExpression : DuplicateExpression<IReadOnlyList<double>> {
+    public FloatVectorDuplicateExpression() { }
+    [StorableConstructor]
+    protected FloatVectorDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.BooleanVector, "BOOLEAN[].DUP", "Duplicates the top item on the BOOLEAN[] stack.")]
+  public class BooleanVectorDuplicateExpression : DuplicateExpression<IReadOnlyList<bool>> {
+    public BooleanVectorDuplicateExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.StringVector, "STRING[].DUP", "Duplicates the top item on the STRING[] stack.")]
+  public class StringVectorDuplicateExpression : DuplicateExpression<IReadOnlyList<string>> {
+    public StringVectorDuplicateExpression() { }
+    [StorableConstructor]
+    protected StringVectorDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EmptyExpression.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EmptyExpression.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EmptyExpression.cs	(revision 15771)
@@ -0,0 +1,200 @@
+﻿using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Tells whether that stack is empty.
+  /// </summary>
+  [StorableClass]
+  public abstract class EmptyExpression : StatelessExpression {
+    protected EmptyExpression() { }
+    [StorableConstructor]
+    protected EmptyExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return false;
+    }
+
+    public void Eval(IPushStack stack, IPushStack<bool> booleanStack) {
+      booleanStack.Push(stack.IsEmpty);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.EMPTY",
+    "Pushes TRUE onto the BOOLEAN stack if the EXEC stack is empty, otherwise FALSE.",
+    StackTypes.Boolean)]
+  public class ExecEmptyExpression : EmptyExpression {
+    public ExecEmptyExpression() { }
+    [StorableConstructor]
+    protected ExecEmptyExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.ExecStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.EMPTY",
+    "Pushes TRUE onto the BOOLEAN stack if the CODE stack is empty, otherwise FALSE.",
+    StackTypes.Boolean)]
+  public class CodeEmptyExpression : EmptyExpression {
+    public CodeEmptyExpression() { }
+    [StorableConstructor]
+    protected CodeEmptyExpression(bool deserializing) : base(deserializing) { }
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CodeStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.EMPTY",
+    "Pushes TRUE onto the BOOLEAN stack if the INTEGER stack is empty, otherwise FALSE.",
+    StackTypes.Boolean)]
+  public class IntegerEmptyExpression : EmptyExpression {
+    public IntegerEmptyExpression() { }
+    [StorableConstructor]
+    protected IntegerEmptyExpression(bool deserializing) : base(deserializing) { }
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.EMPTY", "Pushes TRUE onto the BOOLEAN stack if the FLOAT stack is empty, otherwise FALSE.",
+    StackTypes.Boolean)]
+  public class FloatEmptyExpression : EmptyExpression {
+    public FloatEmptyExpression() { }
+    [StorableConstructor]
+    protected FloatEmptyExpression(bool deserializing) : base(deserializing) { }
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Boolean,
+    "BOOLEAN.EMPTY",
+    "Pushes TRUE onto the BOOLEAN stack if the BOOLEAN stack is empty, otherwise FALSE.")]
+  public class BooleanEmptyExpression : EmptyExpression {
+    public BooleanEmptyExpression() { }
+    [StorableConstructor]
+    protected BooleanEmptyExpression(bool deserializing) : base(deserializing) { }
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.EMPTY",
+    "Pushes TRUE onto the BOOLEAN stack if the CHAR stack is empty, otherwise FALSE.",
+    StackTypes.Boolean)]
+  public class CharEmptyExpression : EmptyExpression {
+    public CharEmptyExpression() { }
+    [StorableConstructor]
+    protected CharEmptyExpression(bool deserializing) : base(deserializing) { }
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CharStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.EMPTY",
+    "Pushes TRUE onto the BOOLEAN stack if the STRING stack is empty, otherwise FALSE.",
+    StackTypes.Boolean)]
+  public class StringEmptyExpression : EmptyExpression {
+    public StringEmptyExpression() { }
+    [StorableConstructor]
+    protected StringEmptyExpression(bool deserializing) : base(deserializing) { }
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].EMPTY",
+    "Pushes TRUE onto the BOOLEAN stack if the INTEGER[] stack is empty, otherwise FALSE.",
+    StackTypes.Boolean)]
+  public class IntegerVectorEmptyExpression : EmptyExpression {
+    public IntegerVectorEmptyExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorEmptyExpression(bool deserializing) : base(deserializing) { }
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].EMPTY",
+    "Pushes TRUE onto the BOOLEAN stack if the FLOAT[] stack is empty, otherwise FALSE.",
+    StackTypes.Boolean)]
+  public class FloatVectorEmptyExpression : EmptyExpression {
+    public FloatVectorEmptyExpression() { }
+    [StorableConstructor]
+    protected FloatVectorEmptyExpression(bool deserializing) : base(deserializing) { }
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].EMPTY",
+    "Pushes TRUE onto the BOOLEAN stack if the BOOLEAN[] stack is empty, otherwise FALSE.",
+    StackTypes.Boolean)]
+  public class BooleanVectorEmptyExpression : EmptyExpression {
+    public BooleanVectorEmptyExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorEmptyExpression(bool deserializing) : base(deserializing) { }
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].EMPTY",
+    "Pushes TRUE onto the BOOLEAN stack if the STRING[] stack is empty, otherwise FALSE.",
+    StackTypes.Boolean)]
+  public class StringVectorEmptyExpression : EmptyExpression {
+    public StringVectorEmptyExpression() { }
+    [StorableConstructor]
+    protected StringVectorEmptyExpression(bool deserializing) : base(deserializing) { }
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+  StackTypes.Print,
+  "PRINT.EMPTY",
+  "Pushes TRUE onto the BOOLEAN stack if the PRINT stack is empty, otherwise FALSE.",
+  StackTypes.Boolean)]
+  public class PrintEmptyExpression : EmptyExpression {
+    public PrintEmptyExpression() { }
+    [StorableConstructor]
+    protected PrintEmptyExpression(bool deserializing) : base(deserializing) { }
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.PrintStack, interpreter.BooleanStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EqualsExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EqualsExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EqualsExpressions.cs	(revision 15771)
@@ -0,0 +1,275 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  /// <summary>
+  /// Pushes TRUE onto the T stack if the top two items are equal, or FALSE otherwise
+  /// </summary>
+  /// <typeparam name="T">Stacktype</typeparam>
+  [StorableClass]
+  public abstract class EqualsExpression<T> : StatelessExpression {
+    protected EqualsExpression() { }
+    [StorableConstructor]
+    protected EqualsExpression(bool deserializing) : base(deserializing) { }
+
+    protected void Eval(IPushStack<T> stack, IPushStack<bool> booleanStack) {
+      var first = stack[1];
+      var second = stack.Top;
+      stack.Remove(2);
+
+      var equal = first.Equals(second);
+      booleanStack.Push(equal);
+    }
+
+    protected void Eval(IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<bool> booleanStack) {
+      var first = vectorStack[1];
+      var second = vectorStack[0];
+      vectorStack.Remove(2);
+
+      var equal = first.SequenceEqual(second);
+      booleanStack.Push(equal);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.=",
+    "Pushes TRUE onto the BOOLEAN stack if the top two INTEGER items are equal, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  public class IntegerEqualsExpression : EqualsExpression<long> {
+    public IntegerEqualsExpression() { }
+    [StorableConstructor]
+    protected IntegerEqualsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.=",
+    "Pushes TRUE onto the BOOLEAN stack if the top two FLOAT items are equal, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  public class FloatEqualsExpression : EqualsExpression<double> {
+    public FloatEqualsExpression() { }
+    [StorableConstructor]
+    protected FloatEqualsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Boolean,
+    "BOOLEAN.=",
+    "Pushes TRUE onto the BOOLEAN stack if the top two BOOLEAN items are equal, or FALSE otherwise.")]
+  public class BooleanEqualsExpression : EqualsExpression<bool> {
+    public BooleanEqualsExpression() { }
+    [StorableConstructor]
+    protected BooleanEqualsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Name,
+    "NAME.=",
+    "Pushes TRUE onto the BOOLEAN stack if the top two NAME items are equal, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  public class NameEqualsExpression : EqualsExpression<string> {
+    public NameEqualsExpression() { }
+    [StorableConstructor]
+    protected NameEqualsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.NameStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.NameStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.=",
+    "Pushes TRUE onto the BOOLEAN stack if the top two EXEC items are equal, or FALSE otherwise.",
+    StackTypes.Boolean,
+    requiredBlockCount: 0)]
+  public class ExecEqualsExpression : EqualsExpression<Expression> {
+    public ExecEqualsExpression() { }
+    [StorableConstructor]
+    protected ExecEqualsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.ExecStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.=",
+    "Pushes TRUE onto the BOOLEAN stack if the top two CODE items are equal, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  public class CodeEqualsExpression : EqualsExpression<Expression> {
+    public CodeEqualsExpression() { }
+    [StorableConstructor]
+    protected CodeEqualsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CodeStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.=",
+    "Pushes TRUE onto the BOOLEAN stack if the top two CHAR items are equal, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  public class CharEqualsExpression : EqualsExpression<char> {
+    public CharEqualsExpression() { }
+    [StorableConstructor]
+    protected CharEqualsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CharStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.=",
+    "Pushes TRUE onto the BOOLEAN stack if the top two STRING items are equal, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  public class StringEqualsExpression : EqualsExpression<string> {
+    public StringEqualsExpression() { }
+    [StorableConstructor]
+    protected StringEqualsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].=",
+    "Pushes TRUE onto the BOOLEAN stack if the top two INTEGER[] items are equal, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  public class IntegerVectorEqualsExpression : EqualsExpression<long> {
+    public IntegerVectorEqualsExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorEqualsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerVectorStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].=",
+    "Pushes TRUE onto the BOOLEAN stack if the top two FLOAT[] items are equal, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  public class FloatVectorEqualsExpression : EqualsExpression<double> {
+    public FloatVectorEqualsExpression() { }
+    [StorableConstructor]
+    protected FloatVectorEqualsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatVectorStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].=",
+    "Pushes TRUE onto the BOOLEAN stack if the top two BOOLEAN[] items are equal, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  public class BooleanVectorEqualsExpression : EqualsExpression<bool> {
+    public BooleanVectorEqualsExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorEqualsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanVectorStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].=",
+    "Pushes TRUE onto the BOOLEAN stack if the top two STRING[] items are equal, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  public class StringVectorEqualsExpression : EqualsExpression<string> {
+    public StringVectorEqualsExpression() { }
+    [StorableConstructor]
+    protected StringVectorEqualsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringVectorStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack, interpreter.BooleanStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ExecExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ExecExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ExecExpressions.cs	(revision 15771)
@@ -0,0 +1,238 @@
+﻿using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  /// <summary>
+  /// If the top item of the BOOLEAN stack is TRUE then this removes the second item on the EXEC stack, leaving the first
+  /// item to be executed. If it is false then it removes the first item, leaving the second to be executed. This is similar to
+  /// CODE.IF except that it operates on the EXEC stack. This acts as a NOOP unless there are at least two items on the EXEC stack and
+  /// one item on the BOOLEAN stack.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.IF",
+    "If the top item of the BOOLEAN stack is TRUE then this removes the second item on the EXEC stack, leaving the first item to be executed. If it is false then it removes the first item, leaving the second to be executed.",
+    StackTypes.Boolean,
+    requiredBlockCount: 2)]
+  public class ExecIfExpression : StatelessExpression {
+    public ExecIfExpression() { }
+    [StorableConstructor]
+    protected ExecIfExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return (interpreter.BooleanStack.Count == 0) || (interpreter.ExecStack.Count < 2);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var condition = interpreter.BooleanStack.Pop();
+
+      if (condition) interpreter.ExecStack.RemoveAt(interpreter.ExecStack.Count - 2);
+      else interpreter.ExecStack.RemoveTop();
+    }
+  }
+
+  /// <summary>
+  /// Inserts beneath the top item of the EXEC stack a new item of the form "( EXEC.Y <TopItem> )".
+  /// </summary>
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.Y",
+    "Inserts beneath the top item of the EXEC stack a new item of the form \"( EXEC.Y <TopItem> )\"",
+    requiredBlockCount: 1)]
+  [StorableClass]
+  public class ExecYExpression : StatelessExpression {
+    public ExecYExpression() { }
+    [StorableConstructor]
+    protected ExecYExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.Count == 0 ||
+             interpreter.Configuration.MaxProgramLength < 2 ||
+             (interpreter.ExecStack.Top.IsProgram && ((PushProgram)interpreter.ExecStack.Top).Depth == interpreter.Configuration.MaxDepth);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var top = interpreter.ExecStack.Top;
+      var execYExpression = ExpressionTable.GetStatelessExpression<ExecYExpression>();
+      var expressions = interpreter.PoolContainer.ExpressionListPool.Get();
+
+      expressions.Add(top);
+      expressions.Add(execYExpression);
+
+      var result = PushProgram.Create(interpreter.PoolContainer.PushProgramPool, expressions);
+
+      interpreter.ExecStack.Top = result;
+      interpreter.ExecStack.Add(top);
+    }
+  }
+
+  /// <summary>
+  /// Removes the second item on the EXEC stack.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.K",
+    "Removes the second item on the EXEC stack.",
+    requiredBlockCount: 2)]
+  [StorableClass]
+  public class ExecKExpression : StatelessExpression {
+    public ExecKExpression() { }
+    [StorableConstructor]
+    protected ExecKExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var top = interpreter.ExecStack.Pop();
+      interpreter.ExecStack.Top = top;
+    }
+  }
+
+  /// <summary>
+  /// Pops 3 items from the EXEC stack, which we will call A, B, and C
+  /// (with A being the first one popped). Then pushes a list containing B and C back onto the EXEC stack, followed by
+  /// another instance of C, followed by another instance of A.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.S",
+    "Pops 3 items from the EXEC stack called A, B, and C. Then pushes a list containing B and C back onto the EXEC stack, followed by another instance of C, followed by another instance of A.",
+    requiredBlockCount: 3)]
+  [StorableClass]
+  public class ExecSExpression : StatelessExpression {
+    public ExecSExpression() { }
+    [StorableConstructor]
+    protected ExecSExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.Count < 3 ||
+            (interpreter.ExecStack.Top is PushProgram && ((PushProgram)interpreter.ExecStack.Top).Depth == interpreter.Configuration.MaxDepth) ||
+            (interpreter.ExecStack[1] is PushProgram && ((PushProgram)interpreter.ExecStack[1]).Depth == interpreter.Configuration.MaxDepth);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var a = interpreter.ExecStack.Top;
+      var b = interpreter.ExecStack[1];
+      var c = interpreter.ExecStack[2];
+      interpreter.ExecStack.Remove(2);
+
+      var expressions = interpreter.PoolContainer.ExpressionListPool.Get();
+      expressions.Add(c);
+      expressions.Add(b);
+
+      var newTop = PushProgram.Create(interpreter.PoolContainer.PushProgramPool, expressions);
+
+      interpreter.ExecStack.Top = newTop;
+      interpreter.ExecStack.Push(c, a);
+    }
+  }
+
+  /// <summary>
+  /// Does nothing.
+  /// </summary>
+  ///
+  [StorableClass]
+  [Serializable]
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.NOOP",
+    "Does nothing.")]
+  public class ExecNoopExpression : StatelessExpression {
+    public ExecNoopExpression() { }
+    [StorableConstructor]
+    protected ExecNoopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return true;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      // do nothing
+    }
+  }
+
+  /// <summary>
+  /// Executes top EXEC item recursively as long top BOOLEAN is TRUE.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.WHILE",
+    "Executes top EXEC item recursively as long top BOOLEAN is TRUE.",
+    StackTypes.Boolean, requiredBlockCount: 1)]
+  [StorableClass]
+  public class ExecWhileExpression : StatelessExpression {
+    public ExecWhileExpression() { }
+    [StorableConstructor]
+    protected ExecWhileExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      if (interpreter.BooleanStack.IsEmpty ||
+          !interpreter.BooleanStack.Pop()) {
+        interpreter.ExecStack.Pop();
+        return;
+      }
+
+      interpreter.ExecStack.Push(this, interpreter.ExecStack.Top);
+    }
+  }
+
+  /// <summary>
+  /// Executes top EXEC item recursively until max. amount of eval. expressions is reached or top EXEC item removes the the recursive call.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.DO*WHILE",
+    "Executes top EXEC item recursively until max. amount of eval. expressions is reached or top EXEC item removes the the recursive call.",
+    requiredBlockCount: 1)]
+  [StorableClass]
+  public class ExecDoWhileExpression : StatelessExpression {
+    public ExecDoWhileExpression() { }
+    [StorableConstructor]
+    protected ExecDoWhileExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      interpreter.ExecStack.Push(this, interpreter.ExecStack.Top);
+    }
+  }
+
+  /// <summary>
+  /// Top EXEC item is only executed, if top BOOLEAN is TRUE.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.WHEN",
+    "Top EXEC item is only executed, if top BOOLEAN is TRUE.",
+    StackTypes.Boolean,
+    requiredBlockCount: 1)]
+  [StorableClass]
+  public class ExecWhenExpression : StatelessExpression {
+    public ExecWhenExpression() { }
+    [StorableConstructor]
+    protected ExecWhenExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.IsEmpty ||
+             interpreter.BooleanStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var when = interpreter.BooleanStack.Pop();
+
+      if (!when) {
+        interpreter.ExecStack.Pop();
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/Expression.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/Expression.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/Expression.cs	(revision 15771)
@@ -0,0 +1,47 @@
+﻿using System;
+
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  [Serializable]
+  [StorableClass]
+  public abstract class Expression : IDeepCloneable, IPooledObject {
+
+    protected Expression() { }
+
+    [StorableConstructor]
+    protected Expression(bool deserializing) { }
+    protected Expression(Expression origin, Cloner cloner) { }
+
+    public bool IsProgram { get { return GetType() == typeof(PushProgram); } }
+
+    public abstract string StringRepresentation { get; }
+
+    public abstract bool IsNoop(IInternalPushInterpreter interpreter);
+    public abstract void Eval(IInternalPushInterpreter interpreter);
+
+    public bool TryEval(IInternalPushInterpreter interpreter) {
+      if (IsNoop(interpreter))
+        return false;
+
+      Eval(interpreter);
+      return true;
+    }
+
+    public override string ToString() {
+      return StringRepresentation;
+    }
+
+    public object Clone() {
+      return this;
+    }
+
+    public virtual IDeepCloneable Clone(Cloner cloner) {
+      return this;
+    }
+
+    void IPooledObject.Reset() { }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ExpressionTable.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ExpressionTable.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ExpressionTable.cs	(revision 15771)
@@ -0,0 +1,225 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  public static class ExpressionTable {
+    public static readonly IReadOnlyDictionary<Type, Expression> StatelessExpressionTable;
+    public static readonly IReadOnlyDictionary<Type, Func<Expression>> StatefulExpressionFactory;
+    public static readonly IReadOnlyList<string> ExpressionNames;
+    public static readonly int ExpressionCount;
+
+    private static readonly Dictionary<int, string> indexToNameTable = new Dictionary<int, string>();
+    private static readonly Dictionary<Type, string> typeToNameTable = new Dictionary<Type, string>();
+    private static readonly Dictionary<string, Type> nameToTypeTable = new Dictionary<string, Type>();
+    private static readonly Dictionary<StackTypes, IList<string>> stackTypeToNamesTable = new Dictionary<StackTypes, IList<string>>();
+    private static readonly Dictionary<StackTypes, IList<string>> stackDependencyToNamesTable = new Dictionary<StackTypes, IList<string>>();
+    private static readonly Dictionary<Type, PushExpressionAttribute> typeToAttributeTable = new Dictionary<Type, PushExpressionAttribute>();
+    private static readonly List<Expression> inExpressionTable = new List<Expression>();
+
+    public static readonly IReadOnlyList<Type> StatelessExpressionTypes;
+    public static readonly IReadOnlyList<Type> StatefulExpressionTypes;
+
+    static ExpressionTable() {
+      StatelessExpressionTypes = GetExpressionTypes(typeof(StatelessExpression)).ToList();
+      StatefulExpressionTypes = GetExpressionTypes(typeof(StatefulExpression<>)).ToList();
+
+      StatelessExpressionTable = GetStatelessExpressionTable();
+      StatefulExpressionFactory = GetStatefulExpressionFactory();
+
+      ExpressionNames = StatelessExpressionTable.Keys
+        .Concat(StatefulExpressionFactory.Keys)
+        .Where(t => typeToNameTable.ContainsKey(t))
+        .Select(type => typeToNameTable[type])
+        .ToList();
+
+      ExpressionCount = StatelessExpressionTable.Count + StatefulExpressionFactory.Count;
+    }
+
+    public static IReadOnlyDictionary<int, string> IndexToNameTable { get { return indexToNameTable; } }
+    public static IReadOnlyDictionary<Type, string> TypeToNameTable { get { return typeToNameTable; } }
+    public static IReadOnlyDictionary<string, Type> NameToTypeTable { get { return nameToTypeTable; } }
+    public static IReadOnlyList<Expression> InExpressionTable { get { return inExpressionTable; } }
+    public static IReadOnlyDictionary<StackTypes, IList<string>> StackTypeToNamesTable { get { return stackTypeToNamesTable; } }
+    public static IReadOnlyDictionary<StackTypes, IList<string>> StackDependencyToNamesTable { get { return stackDependencyToNamesTable; } }
+    public static IReadOnlyDictionary<Type, PushExpressionAttribute> TypeToAttributeTable { get { return typeToAttributeTable; } }
+
+    private static Dictionary<Type, Expression> GetStatelessExpressionTable() {
+      var dictionary = new Dictionary<Type, Expression>();
+
+      foreach (var type in StatelessExpressionTypes) {
+        var expression = Activator.CreateInstance(type) as Expression;
+        var attribute = (PushExpressionAttribute)Attribute.GetCustomAttribute(type, typeof(PushExpressionAttribute));
+
+        typeToAttributeTable.Add(type, attribute);
+        dictionary.Add(type, expression);
+
+        indexToNameTable.Add(indexToNameTable.Keys.Count, attribute.Name);
+        typeToNameTable.Add(type, attribute.Name);
+        nameToTypeTable.Add(attribute.Name, type);
+
+        if (attribute.IsInExpression) {
+          // ReSharper disable once AssignNullToNotNullAttribute
+          // ReSharper disable once PossibleInvalidOperationException
+          inExpressionTable.Insert(attribute.InExpressionNr.Value - 1, expression);
+        }
+
+        if (!stackTypeToNamesTable.ContainsKey(attribute.StackType)) {
+          stackTypeToNamesTable.Add(attribute.StackType, new List<string>());
+        }
+
+        stackTypeToNamesTable[attribute.StackType].Add(attribute.Name);
+
+        var dependencies = attribute.StackType | attribute.AdditionalStackDependencies;
+        if (!stackDependencyToNamesTable.ContainsKey(dependencies)) {
+          stackDependencyToNamesTable.Add(dependencies, new List<string>());
+        }
+
+        stackDependencyToNamesTable[dependencies].Add(attribute.Name);
+      }
+
+      return dictionary;
+    }
+
+    private static Dictionary<Type, Func<Expression>> GetStatefulExpressionFactory() {
+      var dictionary = new Dictionary<Type, Func<Expression>>();
+
+      foreach (var type in StatefulExpressionTypes) {
+        // Make a NewExpression that calls the ctor
+        var newExp = System.Linq.Expressions.Expression.New(type);
+
+        // Create a lambda with the New expression as body
+        var creator = System.Linq.Expressions.Expression.Lambda<Func<Expression>>(newExp).Compile();
+        var attribute = (PushExpressionAttribute)Attribute.GetCustomAttribute(type, typeof(PushExpressionAttribute));
+
+        typeToAttributeTable.Add(type, attribute);
+        dictionary.Add(type, creator);
+
+        // do not index hidden expressions like push expression in tables
+        if (attribute.IsHidden) continue;
+
+        indexToNameTable.Add(indexToNameTable.Keys.Count, attribute.Name);
+        typeToNameTable.Add(type, attribute.Name);
+        nameToTypeTable.Add(attribute.Name, type);
+
+        if (!stackTypeToNamesTable.ContainsKey(attribute.StackType)) {
+          stackTypeToNamesTable.Add(attribute.StackType, new List<string>());
+        }
+
+        stackTypeToNamesTable[attribute.StackType].Add(attribute.Name);
+
+        var dependencies = attribute.StackType | attribute.AdditionalStackDependencies;
+        if (!stackDependencyToNamesTable.ContainsKey(dependencies)) {
+          stackDependencyToNamesTable.Add(dependencies, new List<string>());
+        }
+
+        stackDependencyToNamesTable[dependencies].Add(attribute.Name);
+      }
+
+      return dictionary;
+    }
+
+
+
+    private static IEnumerable<Type> GetExpressionTypes(Type baseType) {
+      return from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
+             from assemblyType in domainAssembly.GetTypes()
+             where !assemblyType.IsAbstract &&
+                   assemblyType.IsSubclass(baseType) &&
+                   assemblyType.GetConstructor(Type.EmptyTypes) != null
+             select assemblyType;
+    }
+
+    public static IReadOnlyList<string> GetExpressionsByStackTypes(StackTypes allowedTypes) {
+      return stackDependencyToNamesTable
+          .Where(entry => (entry.Key & ~allowedTypes) == 0x0)
+          .SelectMany(entry => entry.Value)
+          .ToList();
+    }
+
+    public static PushProgram GetProgram(IManagedPool<PushProgram> pool, int[] index) {
+      var expressions = new Expression[index.Length];
+
+      for (var i = 0; i < index.Length; i++) {
+        expressions[i] = GetExpression(index[i]);
+      }
+
+      return PushProgram.Create(pool, expressions);
+    }
+
+    public static Expression GetExpression(int index) {
+      return GetExpression(indexToNameTable[index]);
+    }
+
+    public static Expression GetExpression(Type type) {
+      var name = TypeToNameTable[type];
+      return GetExpression(name);
+    }
+
+    public static Expression GetExpression(string name) {
+      Expression expression;
+
+      if (!TryGetStatelessExpression(name, out expression) &&
+          !TryGetStatefulExpression(name, out expression))
+        throw new InvalidOperationException(string.Format("Expression with name {0} not found", name));
+
+      return expression;
+    }
+
+    public static Expression GetStatelessExpression<T>() where T : StatelessExpression {
+      Expression expression;
+      var type = typeof(T);
+
+      if (StatelessExpressionTable.TryGetValue(type, out expression))
+        return expression;
+
+      throw new NotSupportedException("Expression not supported: " + type.Name);
+    }
+
+    public static Expression GetStatelessExpression(string name) {
+      Type type;
+      Expression expression;
+
+      if (NameToTypeTable.TryGetValue(name, out type) && StatelessExpressionTable.TryGetValue(type, out expression))
+        return expression;
+
+      throw new NotSupportedException("Expression not supported: " + name);
+    }
+
+    public static bool TryGetStatelessExpression(string name, out Expression expression) {
+      Type type;
+      if (!NameToTypeTable.TryGetValue(name, out type) || !StatelessExpressionTable.TryGetValue(type, out expression)) {
+        expression = null;
+        return false;
+      }
+
+      return true;
+    }
+
+    public static Expression GetStatefulExpression<T>() {
+      return GetStatefulExpression(typeToNameTable[typeof(T)]);
+    }
+
+    public static Expression GetStatefulExpression(string name) {
+      Type type;
+      Func<Expression> creator;
+
+      if (NameToTypeTable.TryGetValue(name, out type) && StatefulExpressionFactory.TryGetValue(type, out creator)) {
+        return creator();
+      }
+
+      throw new NotSupportedException("Expression not supported: " + name);
+    }
+
+    public static bool TryGetStatefulExpression(string name, out Expression expression) {
+      if (NameToTypeTable.ContainsKey(name)) {
+        expression = StatefulExpressionFactory[NameToTypeTable[name]]();
+        return true;
+      }
+
+      expression = default(Expression);
+      return false;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/FloatExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/FloatExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/FloatExpressions.cs	(revision 15771)
@@ -0,0 +1,505 @@
+﻿using System;
+using System.Globalization;
+
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Pushes the sum of the top two items.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.+",
+    "Pushes the sum of the top two items.")]
+  [StorableClass]
+  public class FloatAddExpression : StatelessExpression {
+    public FloatAddExpression() { }
+    [StorableConstructor]
+    protected FloatAddExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.FloatStack.Pop();
+      var second = interpreter.FloatStack.Top;
+      var result = second + first;
+
+      if (double.IsPositiveInfinity(result)) result = double.MaxValue;
+      if (double.IsNegativeInfinity(result)) result = double.MinValue;
+
+      interpreter.FloatStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the difference of the top two items; that is, the second item minus the top item.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.-",
+    "Pushes the difference of the top two items; that is, the second item minus the top item.")]
+  [StorableClass]
+  public class FloatSubtractExpression : StatelessExpression {
+    public FloatSubtractExpression() { }
+    [StorableConstructor]
+    protected FloatSubtractExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.FloatStack.Pop();
+      var second = interpreter.FloatStack.Top;
+      var result = second - first;
+
+      if (double.IsPositiveInfinity(result)) result = double.MaxValue;
+      if (double.IsNegativeInfinity(result)) result = double.MinValue;
+
+      interpreter.FloatStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the product of the top two items.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.*",
+    "Pushes the product of the top two items.")]
+  [StorableClass]
+  public class FloatMultiplyExpression : StatelessExpression {
+    public FloatMultiplyExpression() { }
+    [StorableConstructor]
+    protected FloatMultiplyExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.FloatStack.Pop();
+      var second = interpreter.FloatStack.Top;
+      var result = second * first;
+
+      if (double.IsPositiveInfinity(result)) result = double.MaxValue;
+      if (double.IsNegativeInfinity(result)) result = double.MinValue;
+
+      interpreter.FloatStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the quotient of the top two items; that is, the second item divided by the top item.
+  /// If the top item is zero this acts as a NOOP.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT./",
+    "Pushes the quotient of the top two items; that is, the second item divided by the top item. If the top item is zero this acts as a NOOP.")]
+  [StorableClass]
+  public class FloatDivideExpression : StatelessExpression {
+    public FloatDivideExpression() { }
+    [StorableConstructor]
+    protected FloatDivideExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 2 || interpreter.FloatStack.Top.IsAlmost(0);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.FloatStack.Pop();
+      var second = interpreter.FloatStack.Top;
+      var result = second / first;
+
+      if (double.IsPositiveInfinity(result)) result = double.MaxValue;
+      if (double.IsNegativeInfinity(result)) result = double.MinValue;
+
+      interpreter.FloatStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the second stack item modulo the top stack item. If the top item is zero this acts as a NOOP.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.%",
+    "Pushes the second stack item modulo the top stack item. If the top item is zero this acts as a NOOP.")]
+  [StorableClass]
+  public class FloatModuloExpression : StatelessExpression {
+    public FloatModuloExpression() { }
+    [StorableConstructor]
+    protected FloatModuloExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 2 || interpreter.FloatStack.Top.IsAlmost(0);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.FloatStack.Pop();
+      var second = interpreter.FloatStack.Top;
+      var result = second % first;
+
+      interpreter.FloatStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the minimum of the top two items.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.MIN",
+    "Pushes the minimum of the top two items.")]
+  [StorableClass]
+  public class FloatMinExpression : StatelessExpression {
+    public FloatMinExpression() { }
+    [StorableConstructor]
+    protected FloatMinExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.FloatStack.Pop();
+      var second = interpreter.FloatStack.Top;
+      var result = Math.Min(second, first);
+
+      interpreter.FloatStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the maximum of the top two items.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.MAX",
+    "Pushes the maximum of the top two items.")]
+  [StorableClass]
+  public class FloatMaxExpression : StatelessExpression {
+    public FloatMaxExpression() { }
+    [StorableConstructor]
+    protected FloatMaxExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.FloatStack.Pop();
+      var second = interpreter.FloatStack.Top;
+      var result = Math.Max(second, first);
+
+      interpreter.FloatStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes TRUE onto the BOOLEAN stack if the second item is less than the top item, or FALSE otherwise.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.<",
+    "Pushes TRUE onto the BOOLEAN stack if the second item is less than the top item, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class FloatSmallerThanExpression : StatelessExpression {
+    public FloatSmallerThanExpression() { }
+    [StorableConstructor]
+    protected FloatSmallerThanExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.FloatStack.Top;
+      var second = interpreter.FloatStack[1];
+      interpreter.FloatStack.Remove(2);
+
+      var result = second < first;
+      interpreter.BooleanStack.Push(result);
+    }
+  }
+
+  /// <summary>
+  /// Pushes TRUE onto the BOOLEAN stack if the second item is less than the top item, or FALSE otherwise.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.<=",
+    "Pushes TRUE onto the BOOLEAN stack if the second item is less than the top item, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class FloatSmallerThanOrEqualExpression : StatelessExpression {
+    public FloatSmallerThanOrEqualExpression() { }
+    [StorableConstructor]
+    protected FloatSmallerThanOrEqualExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.FloatStack.Top;
+      var second = interpreter.FloatStack[1];
+      interpreter.FloatStack.Remove(2);
+
+      var result = second < first || second.IsAlmost(first);
+      interpreter.BooleanStack.Push(result);
+    }
+  }
+
+  /// <summary>
+  /// Pushes TRUE onto the BOOLEAN stack if the second item is greater than the top item, or FALSE otherwise.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.>",
+    "Pushes TRUE onto the BOOLEAN stack if the second item is greater than the top item, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class FloatGreaterThanExpression : StatelessExpression {
+    public FloatGreaterThanExpression() { }
+    [StorableConstructor]
+    protected FloatGreaterThanExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.FloatStack.Top;
+      var second = interpreter.FloatStack[1];
+      interpreter.FloatStack.Remove(2);
+
+      var result = second > first;
+      interpreter.BooleanStack.Push(result);
+    }
+  }
+
+  /// <summary>
+  /// Pushes TRUE onto the BOOLEAN stack if the second item is greater than or equal to the top item, or FALSE otherwise.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.>=",
+    "Pushes TRUE onto the BOOLEAN stack if the second item is greater than or equal to the top item, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class FloatGreaterThanOrEqualExpression : StatelessExpression {
+    public FloatGreaterThanOrEqualExpression() { }
+    [StorableConstructor]
+    protected FloatGreaterThanOrEqualExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.FloatStack.Top;
+      var second = interpreter.FloatStack[1];
+      interpreter.FloatStack.Remove(2);
+
+      var result = second > first || second.IsAlmost(first);
+      interpreter.BooleanStack.Push(result);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the sine of the top item.
+  /// </summary>
+  [PushExpression(StackTypes.Float, "FLOAT.SIN", "Pushes the sine of the top item.")]
+  [StorableClass]
+  public class FloatSineExpression : StatelessExpression {
+    public FloatSineExpression() { }
+    [StorableConstructor]
+    protected FloatSineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var result = Math.Sin(interpreter.FloatStack.Top);
+      interpreter.FloatStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the cosine of the top item.
+  /// </summary>
+  [PushExpression(StackTypes.Float, "FLOAT.COS", "Pushes the cosine of the top item.")]
+  [StorableClass]
+  public class FloatCosineExpression : StatelessExpression {
+    public FloatCosineExpression() { }
+    [StorableConstructor]
+    protected FloatCosineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var result = Math.Cos(interpreter.FloatStack.Top);
+      interpreter.FloatStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes 1 if the top BOOLEAN is TRUE, or 0 if the top BOOLEAN is FALSE.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.FROMBOOLEAN",
+    "Pushes 1 if the top BOOLEAN is TRUE, or 0 if the top BOOLEAN is FALSE.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class FloatFromBooleanExpression : StatelessExpression {
+    public FloatFromBooleanExpression() { }
+    [StorableConstructor]
+    protected FloatFromBooleanExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var condition = interpreter.BooleanStack.Pop();
+      var value = condition ? 1 : 0;
+
+      interpreter.FloatStack.Push(value);
+    }
+  }
+
+  /// <summary>
+  /// Pushes a floating point version of the top INTEGER.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.FROMINTEGER",
+    "Pushes a floating point version of the top INTEGER.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class FloatFromIntegerExpression : StatelessExpression {
+    public FloatFromIntegerExpression() { }
+    [StorableConstructor]
+    protected FloatFromIntegerExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = (double)interpreter.IntegerStack.Pop();
+      interpreter.FloatStack.Push(value);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the result of truncating the top CHAR.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.FROMCHAR",
+    "Pushes the result of truncating the top CHAR.",
+    StackTypes.Char)]
+  [StorableClass]
+  public class FloatFromCharExpression : StatelessExpression {
+    public FloatFromCharExpression() { }
+    [StorableConstructor]
+    protected FloatFromCharExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.CharStack.Pop();
+      interpreter.FloatStack.Push(value);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the result of parsing the top STRING.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.FROMSTRING",
+    "Pushes the result of parsing the top STRING.",
+    StackTypes.String)]
+  [StorableClass]
+  public class FloatFromStringExpression : StatelessExpression {
+    public FloatFromStringExpression() { }
+    [StorableConstructor]
+    protected FloatFromStringExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      double tmp;
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.StringStack.Top.Length == 0 ||
+             !double.TryParse(
+               interpreter.StringStack.Top,
+               NumberStyles.AllowDecimalPoint | NumberStyles.Float,
+               CultureInfo.InvariantCulture,
+               out tmp);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Pop();
+      var value = double.Parse(str, NumberStyles.AllowDecimalPoint | NumberStyles.Float, CultureInfo.InvariantCulture);
+
+      interpreter.FloatStack.Push(value);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the result of increasing the top INTEGER by 1.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.INC",
+    "Pushes the result of increasing the top INTEGER by 1.")]
+  [StorableClass]
+  public class FloatIncExpression : StatelessExpression {
+    public FloatIncExpression() { }
+    [StorableConstructor]
+    protected FloatIncExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      interpreter.FloatStack.Top += 1;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the result of decreasing the top INTEGER by 1.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.DEC",
+    "Pushes the result of decreasing the top INTEGER by 1.")]
+  [StorableClass]
+  public class FloatDecExpression : StatelessExpression {
+    public FloatDecExpression() { }
+    [StorableConstructor]
+    protected FloatDecExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      interpreter.FloatStack.Top -= 1;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/FlushExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/FlushExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/FlushExpressions.cs	(revision 15771)
@@ -0,0 +1,247 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Empties the given stack.
+  /// </summary>
+  /// <typeparam name="T">Stacktype</typeparam>
+  [StorableClass]
+  public abstract class FlushExpression<T> : StatelessExpression {
+    protected FlushExpression() { }
+    [StorableConstructor]
+    protected FlushExpression(bool deserializing) : base(deserializing) { }
+
+    protected void Eval(IPushStack<T> stack) {
+      stack.Clear();
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.FLUSH",
+    "Empties the INTEGER stack.")]
+  [StorableClass]
+  public class IntegerFlushExpression : FlushExpression<long> {
+    public IntegerFlushExpression() { }
+    [StorableConstructor]
+    protected IntegerFlushExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.FLUSH",
+    "Empties the FLOAT stack.")]
+  [StorableClass]
+  public class FloatFlushExpression : FlushExpression<double> {
+    public FloatFlushExpression() { }
+    [StorableConstructor]
+    protected FloatFlushExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Boolean,
+    "BOOLEAN.FLUSH",
+    "Empties the BOOLEAN stack.")]
+  [StorableClass]
+  public class BooleanFlushExpression : FlushExpression<bool> {
+    public BooleanFlushExpression() { }
+    [StorableConstructor]
+    protected BooleanFlushExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Name,
+    "NAME.FLUSH",
+    "Empties the NAME stack.")]
+  [StorableClass]
+  public class NameFlushExpression : FlushExpression<string> {
+    public NameFlushExpression() { }
+    [StorableConstructor]
+    protected NameFlushExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.NameStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.FLUSH",
+    "Empties the EXEC stack.")]
+  [StorableClass]
+  public class ExecFlushExpression : FlushExpression<Expression> {
+    public ExecFlushExpression() { }
+    [StorableConstructor]
+    protected ExecFlushExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.ExecStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.FLUSH",
+    "Empties the CODE stack.")]
+  [StorableClass]
+  public class CodeFlushExpression : FlushExpression<Expression> {
+    public CodeFlushExpression() { }
+    [StorableConstructor]
+    protected CodeFlushExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CodeStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.FLUSH",
+    "Empties the CHAR stack.")]
+  [StorableClass]
+  public class CharFlushExpression : FlushExpression<char> {
+    public CharFlushExpression() { }
+    [StorableConstructor]
+    protected CharFlushExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CharStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.String,
+    "STRING.FLUSH",
+    "Empties the STRING stack.")]
+  [StorableClass]
+  public class StringFlushExpression : FlushExpression<string> {
+    public StringFlushExpression() { }
+    [StorableConstructor]
+    protected StringFlushExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].FLUSH",
+    "Empties the INTEGER[] stack.")]
+  [StorableClass]
+  public class IntegerVectorFlushExpression : FlushExpression<IReadOnlyList<long>> {
+    public IntegerVectorFlushExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorFlushExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].FLUSH",
+    "Empties the FLOAT[] stack.")]
+  [StorableClass]
+  public class FloatVectorFlushExpression : FlushExpression<IReadOnlyList<double>> {
+    public FloatVectorFlushExpression() { }
+    [StorableConstructor]
+    protected FloatVectorFlushExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].FLUSH",
+    "Empties the BOOLEAN[] stack.")]
+  [StorableClass]
+  public class BooleanVectorFlushExpression : FlushExpression<IReadOnlyList<bool>> {
+    public BooleanVectorFlushExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorFlushExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].FLUSH",
+    "Empties the STRING[] stack.")]
+  [StorableClass]
+  public class StringVectorFlushExpression : FlushExpression<IReadOnlyList<string>> {
+    public StringVectorFlushExpression() { }
+    [StorableConstructor]
+    protected StringVectorFlushExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/InExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/InExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/InExpressions.cs	(revision 15771)
@@ -0,0 +1,170 @@
+﻿using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// InExpression has a state, but this state is static at compile time and therefore InExpression can be seen as stateless at runtime
+  /// </summary>
+  [StorableClass]
+  public abstract class InExpression : StatelessExpression {
+    private readonly int index;
+
+    protected InExpression(int nr) {
+      index = nr - 1;
+    }
+
+    [StorableConstructor]
+    protected InExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      var expression = interpreter.InputExpressions[index];
+
+      return expression.IsNoop(interpreter);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var expression = interpreter.InputExpressions[index];
+
+      expression.Eval(interpreter);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.None,
+    "IN1",
+    "Pushes first input parameter.",
+    isHidden: true,
+    inExpressionNr: 1)]
+  [StorableClass]
+  public class In1Expression : InExpression {
+    public In1Expression() : base(1) { }
+
+    [StorableConstructor]
+    protected In1Expression(bool deserializing) : base(deserializing) { }
+  }
+
+  [PushExpression(
+    StackTypes.None,
+    "IN2",
+    "Pushes second input parameter.",
+    isHidden: true,
+    inExpressionNr: 2)]
+  [StorableClass]
+  public class In2Expression : InExpression {
+    public In2Expression() : base(2) { }
+
+    [StorableConstructor]
+    protected In2Expression(bool deserializing) : base(deserializing) { }
+  }
+
+  [PushExpression(
+   StackTypes.None,
+   "IN3",
+   "Pushes third input parameter.",
+    isHidden: true,
+    inExpressionNr: 3)]
+  [StorableClass]
+  public class In3Expression : InExpression {
+    public In3Expression() : base(3) { }
+
+    [StorableConstructor]
+    protected In3Expression(bool deserializing) : base(deserializing) { }
+  }
+
+  [PushExpression(
+    StackTypes.None,
+    "IN4",
+    "Pushes fourth input parameter.",
+    isHidden: true,
+    inExpressionNr: 4)]
+  [StorableClass]
+  public class In4Expression : InExpression {
+    public In4Expression() : base(4) { }
+
+    [StorableConstructor]
+    protected In4Expression(bool deserializing) : base(deserializing) { }
+  }
+
+  [PushExpression(
+    StackTypes.None,
+    "IN5",
+    "Pushes fifth input parameter.",
+    isHidden: true,
+    inExpressionNr: 5)]
+  [StorableClass]
+  public class In5Expression : InExpression {
+    public In5Expression() : base(5) { }
+
+    [StorableConstructor]
+    protected In5Expression(bool deserializing) : base(deserializing) { }
+  }
+
+  [PushExpression(
+    StackTypes.None,
+    "IN6",
+    "Pushes sixth input parameter.",
+    isHidden: true,
+    inExpressionNr: 6)]
+  [StorableClass]
+  public class In6Expression : InExpression {
+    public In6Expression() : base(6) { }
+
+    [StorableConstructor]
+    protected In6Expression(bool deserializing) : base(deserializing) { }
+  }
+
+  [PushExpression(
+    StackTypes.None,
+    "IN7",
+    "Pushes seventh input parameter.",
+    isHidden: true,
+    inExpressionNr: 7)]
+  [StorableClass]
+  public class In7Expression : InExpression {
+    public In7Expression() : base(7) { }
+
+    [StorableConstructor]
+    protected In7Expression(bool deserializing) : base(deserializing) { }
+  }
+
+  [PushExpression(
+    StackTypes.None,
+    "IN8",
+    "Pushes eighth input parameter.",
+    isHidden: true,
+    inExpressionNr: 8)]
+  [StorableClass]
+  public class In8Expression : InExpression {
+    public In8Expression() : base(8) { }
+
+    [StorableConstructor]
+    protected In8Expression(bool deserializing) : base(deserializing) { }
+  }
+
+  [PushExpression(
+    StackTypes.None,
+    "IN9",
+    "Pushes nineth input parameter.",
+    isHidden: true,
+    inExpressionNr: 9)]
+  [StorableClass]
+  public class In9Expression : InExpression {
+    public In9Expression() : base(9) { }
+
+    [StorableConstructor]
+    protected In9Expression(bool deserializing) : base(deserializing) { }
+  }
+
+  [PushExpression(
+    StackTypes.None,
+    "IN10",
+    "Pushes tenth input parameter.",
+    isHidden: true,
+    inExpressionNr: 10)]
+  [StorableClass]
+  public class In10Expression : InExpression {
+    public In10Expression() : base(10) { }
+
+    [StorableConstructor]
+    protected In10Expression(bool deserializing) : base(deserializing) { }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/IntegerExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/IntegerExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/IntegerExpressions.cs	(revision 15771)
@@ -0,0 +1,452 @@
+﻿using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Pushes the sum of the top two items.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.+",
+    "Pushes the sum of the top two items.")]
+  [StorableClass]
+  public class IntegerAddExpression : StatelessExpression {
+    public IntegerAddExpression() { }
+    [StorableConstructor]
+    protected IntegerAddExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.IntegerStack.Pop();
+      var second = interpreter.IntegerStack.Top;
+      var result = unchecked(second + first);
+
+      interpreter.IntegerStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the difference of the top two items; that is, the second item minus the top item.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.-",
+    "Pushes the difference of the top two items; that is, the second item minus the top item.")]
+  [StorableClass]
+  public class IntegerSubtractExpression : StatelessExpression {
+    public IntegerSubtractExpression() { }
+    [StorableConstructor]
+    protected IntegerSubtractExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.IntegerStack.Pop();
+      var second = interpreter.IntegerStack.Top;
+      var result = unchecked(second - first);
+
+      interpreter.IntegerStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the product of the top two items.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.*",
+    "Pushes the product of the top two items.")]
+  [StorableClass]
+  public class IntegerMultiplyExpression : StatelessExpression {
+    public IntegerMultiplyExpression() { }
+    [StorableConstructor]
+    protected IntegerMultiplyExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.IntegerStack.Pop();
+      var second = interpreter.IntegerStack.Top;
+      var result = unchecked(second * first);
+
+      interpreter.IntegerStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the quotient of the top two items; that is, the second item divided by the top item.
+  /// If the top item is zero this acts as a NOOP.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER./",
+    "Pushes the quotient of the top two items; that is, the second item divided by the top item. If the top item is zero this acts as a NOOP.")]
+  [StorableClass]
+  public class IntegerDivideExpression : StatelessExpression {
+    public IntegerDivideExpression() { }
+    [StorableConstructor]
+    protected IntegerDivideExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2 ||
+             interpreter.IntegerStack.Top == 0 ||
+             (interpreter.IntegerStack.Top == -1 && interpreter.IntegerStack[1] == long.MinValue);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.IntegerStack.Pop();
+      var second = interpreter.IntegerStack.Top;
+      var result = second / first;
+
+      interpreter.IntegerStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the second stack item modulo the top stack item. If the top item is zero this acts as a NOOP.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.%",
+    "Pushes the second stack item modulo the top stack item. If the top item is zero this acts as a NOOP.")]
+  [StorableClass]
+  public class IntegerModuloExpression : StatelessExpression {
+    public IntegerModuloExpression() { }
+    [StorableConstructor]
+    protected IntegerModuloExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2 ||
+             interpreter.IntegerStack.Top == 0 ||
+             (interpreter.IntegerStack.Top == -1 && interpreter.IntegerStack[1] == long.MinValue);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.IntegerStack.Pop();
+      var second = interpreter.IntegerStack.Top;
+      var result = second % first;
+
+      interpreter.IntegerStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the minimum of the top two items.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.MIN",
+    "Pushes the minimum of the top two items.")]
+  [StorableClass]
+  public class IntegerMinExpression : StatelessExpression {
+    public IntegerMinExpression() { }
+    [StorableConstructor]
+    protected IntegerMinExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.IntegerStack.Pop();
+      var second = interpreter.IntegerStack.Top;
+      var result = Math.Min(second, first);
+
+      interpreter.IntegerStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the maximum of the top two items.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.MAX",
+    "Pushes the maximum of the top two items.")]
+  [StorableClass]
+  public class IntegerMaxExpression : StatelessExpression {
+    public IntegerMaxExpression() { }
+    [StorableConstructor]
+    protected IntegerMaxExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.IntegerStack.Pop();
+      var second = interpreter.IntegerStack.Top;
+      var result = Math.Max(second, first);
+
+      interpreter.IntegerStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes TRUE onto the BOOLEAN stack if the second item is less than the top item, or FALSE otherwise.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.<",
+    "Pushes TRUE onto the BOOLEAN stack if the second item is less than the top item, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class IntegerSmallerThanExpression : StatelessExpression {
+    public IntegerSmallerThanExpression() { }
+    [StorableConstructor]
+    protected IntegerSmallerThanExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.IntegerStack.Top;
+      var second = interpreter.IntegerStack[1];
+      interpreter.IntegerStack.Remove(2);
+
+      var result = second < first;
+      interpreter.BooleanStack.Push(result);
+    }
+  }
+
+  /// <summary>
+  /// Pushes TRUE onto the BOOLEAN stack if the second item is less than or equal to the top item, or FALSE otherwise.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.<=",
+    "Pushes TRUE onto the BOOLEAN stack if the second item is less than or equal to the top item, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class IntegerSmallerOrEqualToExpression : StatelessExpression {
+    public IntegerSmallerOrEqualToExpression() { }
+    [StorableConstructor]
+    protected IntegerSmallerOrEqualToExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.IntegerStack.Top;
+      var second = interpreter.IntegerStack[1];
+      interpreter.IntegerStack.Remove(2);
+
+      var result = second <= first;
+      interpreter.BooleanStack.Push(result);
+    }
+  }
+
+  /// <summary>
+  /// Pushes TRUE onto the BOOLEAN stack if the second item is greater than the top item, or FALSE otherwise.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.>",
+    "Pushes TRUE onto the BOOLEAN stack if the second item is greater than the top item, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class IntegerGreaterThanExpression : StatelessExpression {
+    public IntegerGreaterThanExpression() { }
+    [StorableConstructor]
+    protected IntegerGreaterThanExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.IntegerStack.Top;
+      var second = interpreter.IntegerStack[1];
+      interpreter.IntegerStack.Remove(2);
+
+      var result = second > first;
+      interpreter.BooleanStack.Push(result);
+    }
+  }
+
+
+  /// <summary>
+  /// Pushes TRUE onto the BOOLEAN stack if the second item is greater than or equal to the top item, or FALSE otherwise.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.>=",
+    "Pushes TRUE onto the BOOLEAN stack if the second item is greater than or equal to the top item, or FALSE otherwise.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class IntegerGreaterOrEqualToExpression : StatelessExpression {
+    public IntegerGreaterOrEqualToExpression() { }
+    [StorableConstructor]
+    protected IntegerGreaterOrEqualToExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.IntegerStack.Top;
+      var second = interpreter.IntegerStack[1];
+      interpreter.IntegerStack.Remove(2);
+
+      var result = second >= first;
+      interpreter.BooleanStack.Push(result);
+    }
+  }
+
+  /// <summary>
+  /// Pushes 1 if the top BOOLEAN is TRUE, or 0 if the top BOOLEAN is FALSE.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.FROMBOOLEAN",
+    "Pushes 1 if the top BOOLEAN is TRUE, or 0 if the top BOOLEAN is FALSE.",
+    StackTypes.Boolean)]
+  [StorableClass]
+  public class IntegerFromBooleanExpression : StatelessExpression {
+    public IntegerFromBooleanExpression() { }
+    [StorableConstructor]
+    protected IntegerFromBooleanExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var condition = interpreter.BooleanStack.Pop();
+      var value = condition ? 1 : 0;
+      interpreter.IntegerStack.Push(value);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the result of truncating the top FLOAT.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.FROMFLOAT",
+    "Pushes the result of truncating the top FLOAT.",
+    StackTypes.Float)]
+  [StorableClass]
+  public class IntegerFromFloatExpression : StatelessExpression {
+    public IntegerFromFloatExpression() { }
+    [StorableConstructor]
+    protected IntegerFromFloatExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = unchecked((long)interpreter.FloatStack.Pop());
+      interpreter.IntegerStack.Push(value);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the result of truncating the top CHAR.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.FROMCHAR",
+    "Pushes the result of truncating the top CHAR.",
+    StackTypes.Char)]
+  [StorableClass]
+  public class IntegerFromCharExpression : StatelessExpression {
+    public IntegerFromCharExpression() { }
+    [StorableConstructor]
+    protected IntegerFromCharExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.CharStack.Pop();
+      interpreter.IntegerStack.Push(value);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the result of parsing the top STRING.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.FROMSTRING",
+    "Pushes the result of parsing the top STRING.",
+    StackTypes.String)]
+  [StorableClass]
+  public class IntegerFromStringExpression : StatelessExpression {
+    public IntegerFromStringExpression() { }
+    [StorableConstructor]
+    protected IntegerFromStringExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      long tmp;
+
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.StringStack.Top.Length == 0 ||
+             !long.TryParse(interpreter.StringStack.Top, out tmp);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Pop();
+      var value = long.Parse(str);
+      interpreter.IntegerStack.Push(value);
+    }
+  }
+
+  /// <summary>
+  /// Pushes the result of increasing the top INTEGER by 1.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.INC",
+    "Pushes the result of increasing the top INTEGER by 1.")]
+  [StorableClass]
+  public class IntegerIncExpression : StatelessExpression {
+    public IntegerIncExpression() { }
+    [StorableConstructor]
+    protected IntegerIncExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var result = unchecked(interpreter.IntegerStack.Top + 1);
+      interpreter.IntegerStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Pushes the result of decreasing the top INTEGER by 1.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.DEC",
+    "Pushes the result of decreasing the top INTEGER by 1.")]
+  [StorableClass]
+  public class IntegerDecExpression : StatelessExpression {
+    public IntegerDecExpression() { }
+    [StorableConstructor]
+    protected IntegerDecExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var result = unchecked(interpreter.IntegerStack.Top - 1);
+      interpreter.IntegerStack.Top = result;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/NameExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/NameExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/NameExpressions.cs	(revision 15771)
@@ -0,0 +1,77 @@
+﻿using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  public class NameDefineXExecExpression : StatefulExpression<string> {
+    public NameDefineXExecExpression(string state) : base(state) { }
+    [StorableConstructor]
+    protected NameDefineXExecExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return false;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Expression expression;
+      if (!interpreter.IsNameQuoteFlagSet &&
+          interpreter.CustomExpressions.TryGetValue(State, out expression)) {
+        interpreter.ExecStack.Push(expression);
+      } else {
+        interpreter.NameStack.Push(State);
+        interpreter.IsNameQuoteFlagSet = false;
+      }
+    }
+  }
+
+  /// <summary>
+  /// Sets a flag indicating that the next State encountered will be pushed onto the NAME stack (and not have its
+  /// associated value pushed onto the EXEC stack), regardless of whether or not it has a definition. Upon encountering such a State and
+  /// pushing it onto the NAME stack the flag will be cleared (whether or not the pushed State had a definition).
+  /// </summary>
+  [PushExpression(
+    StackTypes.Name,
+    "NAME.QUOTE",
+    "Sets a flag indicating that the next State encountered will be pushed onto the NAME stack")]
+  [StorableClass]
+  public class NameQuoteExpression : StatelessExpression {
+    public NameQuoteExpression() { }
+    [StorableConstructor]
+    protected NameQuoteExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IsNameQuoteFlagSet;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      interpreter.IsNameQuoteFlagSet = true;
+    }
+  }
+
+  /// <summary>
+  /// Pushes a randomly selected NAME that already has a definition.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Name,
+    "NAME.RANDBOUNDNAME",
+    "Pushes a randomly selected NAME that already has a definition.")]
+  [StorableClass]
+  public class NameRandBoundNameExpression : StatelessExpression {
+    public NameRandBoundNameExpression() { }
+    [StorableConstructor]
+    protected NameRandBoundNameExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CustomExpressions.Count == 0;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var index = interpreter.CustomExpressions.Keys.Count == 1
+        ? 0
+        : interpreter.Random.Next(0, interpreter.CustomExpressions.Keys.Count);
+
+      var state = interpreter.CustomExpressions.Keys.ElementAt(index);
+      interpreter.NameStack.Push(state);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PopExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PopExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PopExpressions.cs	(revision 15771)
@@ -0,0 +1,207 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  public abstract class PopExpression<T> : StatelessExpression {
+    protected PopExpression() { }
+    [StorableConstructor]
+    protected PopExpression(bool deserializing) : base(deserializing) { }
+
+    protected void Eval(IPushStack<T> stack) {
+      stack.Pop();
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Integer, "INTEGER.POP", "Pops the top INTEGER item.")]
+  public class IntegerPopExpression : PopExpression<long> {
+    public IntegerPopExpression() { }
+    [StorableConstructor]
+    protected IntegerPopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Float, "FLOAT.POP", "Pops the top FLOAT item.")]
+  public class FloatPopExpression : PopExpression<double> {
+    public FloatPopExpression() { }
+    [StorableConstructor]
+    protected FloatPopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Boolean, "BOOLEAN.POP", "Pops the top BOOLEAN item.")]
+  public class BooleanPopExpression : PopExpression<bool> {
+    public BooleanPopExpression() { }
+    [StorableConstructor]
+    protected BooleanPopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Name, "NAME.POP", "Pops the top NAME item.")]
+  public class NamePopExpression : PopExpression<string> {
+    public NamePopExpression() { }
+    [StorableConstructor]
+    protected NamePopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.NameStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.NameStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Exec, "EXEC.POP", "Pops the top EXEC item.", requiredBlockCount: 1)]
+  public class ExecPopExpression : PopExpression<Expression> {
+    public ExecPopExpression() { }
+    [StorableConstructor]
+    protected ExecPopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.ExecStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Code, "CODE.POP", "Pops the top CODE item.")]
+  public class CodePopExpression : PopExpression<Expression> {
+    public CodePopExpression() { }
+    [StorableConstructor]
+    protected CodePopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CodeStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Char, "CHAR.POP", "Pops the top CHAR item.")]
+  public class CharPopExpression : PopExpression<char> {
+    public CharPopExpression() { }
+    [StorableConstructor]
+    protected CharPopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CharStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.String, "STRING.POP", "Pops the top STRING item.")]
+  public class StringPopExpression : PopExpression<string> {
+    public StringPopExpression() { }
+    [StorableConstructor]
+    protected StringPopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.IntegerVector, "INTEGER[].POP", "Pops the top INTEGER[] item.")]
+  public class IntegerVectorPopExpression : PopExpression<IReadOnlyList<long>> {
+    public IntegerVectorPopExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorPopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.FloatVector, "FLOAT[].POP", "Pops the top FLOAT[] item.")]
+  public class FloatVectorPopExpression : PopExpression<IReadOnlyList<double>> {
+    public FloatVectorPopExpression() { }
+    [StorableConstructor]
+    protected FloatVectorPopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.BooleanVector, "BOOLEAN[].POP", "Pops the top BOOLEAN[] item.")]
+  public class BooleanVectorPopExpression : PopExpression<IReadOnlyList<bool>> {
+    public BooleanVectorPopExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorPopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.StringVector, "STRING[].POP", "Pops the top STRING[] item.")]
+  public class StringVectorPopExpression : PopExpression<IReadOnlyList<string>> {
+    public StringVectorPopExpression() { }
+    [StorableConstructor]
+    protected StringVectorPopExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PrintExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PrintExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PrintExpressions.cs	(revision 15771)
@@ -0,0 +1,277 @@
+﻿using System.Collections.Generic;
+using System.Globalization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  [PushExpression(StackTypes.Print, "PRINT.NEWLINE", "Pushes an empty string onto the PRINT STACK.")]
+  public class PrintNewLineExpression : StatelessExpression {
+    public PrintNewLineExpression() { }
+    [StorableConstructor]
+    protected PrintNewLineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return false;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      interpreter.PrintStack.NewLine();
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(StackTypes.Print, "PRINT.ENSURE_NEWLINE", "Pushes an empty string onto the PRINT STACK if current line isn't empty already.")]
+  public class PrintEnsureNewLineExpression : StatelessExpression {
+    public PrintEnsureNewLineExpression() { }
+    [StorableConstructor]
+    protected PrintEnsureNewLineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.PrintStack.IsCurrentLineEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      interpreter.PrintStack.NewLine();
+    }
+  }
+
+  [StorableClass]
+  public abstract class PrintExpression<T> : StatelessExpression {
+    protected PrintExpression() { }
+
+    [StorableConstructor]
+    protected PrintExpression(bool deserializing) : base(deserializing) { }
+
+    protected void Eval(IInternalPushInterpreter interpreter, IPushStack<T> stack) {
+      var value = stack.Pop();
+
+      interpreter.PrintStack.Push(value);
+    }
+
+    protected void EvalVector(IInternalPushInterpreter interpreter, IPushStack<IReadOnlyList<T>> vectorStack) {
+      var vector = vectorStack.Pop();
+
+      interpreter.PrintStack.Push(PushEnvironment.VectorStartSymbol);
+
+      if (vector.Count > 0) {
+        interpreter.PrintStack.Push(vector[0]);
+
+        for (var i = 1; i < vector.Count; i++) {
+          interpreter.PrintStack.Push(PushEnvironment.VectorSeparatorSymbol);
+          interpreter.PrintStack.Push(vector[i]);
+        }
+      }
+
+      interpreter.PrintStack.Push(PushEnvironment.VectorEndSymbol);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Print,
+    "PRINT.PRINTBOOLEAN",
+    "Pushes the top BOOLEAN onto the PRINT stack.",
+    StackTypes.Boolean)]
+  public class BooleanPrintExpression : PrintExpression<bool> {
+    public BooleanPrintExpression() { }
+    [StorableConstructor]
+    protected BooleanPrintExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.BooleanStack.Pop();
+      interpreter.PrintStack.Push(value);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Print,
+    "PRINT.PRINTCHAR",
+    "Pushes the top CHAR onto the PRINT stack.",
+    StackTypes.Char)]
+  public class CharPrintExpression : PrintExpression<char> {
+    public CharPrintExpression() { }
+    [StorableConstructor]
+    protected CharPrintExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.CharStack.Pop();
+      interpreter.PrintStack.Push(value);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Print,
+    "PRINT.PRINTEXEC",
+    "Pushes the top BOOLEAN onto the EXEC stack.",
+    StackTypes.Exec,
+    requiredBlockCount: 1)]
+  public class ExecPrintExpression : PrintExpression<Expression> {
+    public ExecPrintExpression() { }
+    [StorableConstructor]
+    protected ExecPrintExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.ExecStack.Pop();
+      interpreter.PrintStack.Push(value);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Print,
+    "PRINT.PRINTFLOAT",
+    "Pushes the top FLOAT onto the PRINT stack.",
+    StackTypes.Float)]
+  public class FloatPrintExpression : PrintExpression<double> {
+    public FloatPrintExpression() { }
+    [StorableConstructor]
+    protected FloatPrintExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.FloatStack.Pop();
+      var str = value.ToString(interpreter.Configuration.FloatStringFormat, CultureInfo.InvariantCulture);
+
+      interpreter.PrintStack.Push(str);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Print,
+    "PRINT.PRINTINTEGER",
+    "Pushes the top INTEGER onto the PRINT stack.",
+    StackTypes.Integer)]
+  public class IntegerPrintExpression : PrintExpression<long> {
+    public IntegerPrintExpression() { }
+    [StorableConstructor]
+    protected IntegerPrintExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.IntegerStack.Pop();
+      interpreter.PrintStack.Push(value);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Print,
+    "PRINT.PRINTSTRING",
+    "Pushes the top STRING onto the PRINT stack.",
+    StackTypes.String)]
+  public class StringPrintExpression : PrintExpression<string> {
+    public StringPrintExpression() { }
+    [StorableConstructor]
+    protected StringPrintExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.StringStack.Pop();
+      interpreter.PrintStack.Push(value);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Print,
+    "PRINT.PRINTINTEGERVECTOR",
+    "Pushes the top INTEGER[] onto the PRINT stack.",
+    StackTypes.IntegerVector)]
+  public class IntegerVectorPrintExpression : PrintExpression<long> {
+    public IntegerVectorPrintExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorPrintExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      EvalVector(interpreter, interpreter.IntegerVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Print,
+    "PRINT.PRINTFLOATVECTOR",
+    "Pushes the top FLOAT[] onto the PRINT stack.",
+    StackTypes.FloatVector)]
+  public class FloatVectorPrintExpression : PrintExpression<double> {
+    public FloatVectorPrintExpression() { }
+    [StorableConstructor]
+    protected FloatVectorPrintExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      EvalVector(interpreter, interpreter.FloatVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Print,
+    "PRINT.PRINTSTRINGVECTOR",
+    "Pushes the top STRING[] onto the PRINT stack.",
+    StackTypes.StringVector)]
+  public class StringVectorPrintExpression : PrintExpression<string> {
+    public StringVectorPrintExpression() { }
+    [StorableConstructor]
+    protected StringVectorPrintExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      EvalVector(interpreter, interpreter.StringVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Print,
+    "PRINT.PRINTBOOLEANVECTOR",
+    "Pushes the top BOOLEAN[] onto the PRINT stack.",
+    StackTypes.BooleanVector)]
+  public class BooleanVectorPrintExpression : PrintExpression<bool> {
+    public BooleanVectorPrintExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorPrintExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanVectorStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      EvalVector(interpreter, interpreter.BooleanVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PushExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PushExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PushExpressions.cs	(revision 15771)
@@ -0,0 +1,378 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [Serializable]
+  [StorableClass]
+  public abstract class PushExpression<T> : StatefulExpression<T> {
+    [StorableConstructor]
+    protected PushExpression(bool deserializing) : base(deserializing) { }
+
+    protected PushExpression(T state, object other) : base(state) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return false;
+    }
+
+    protected void Eval(IPushStack<T> stack) {
+      stack.Push(State);
+    }
+  }
+
+  [StorableClass]
+  [Serializable]
+  public abstract class VectorPushExpression<T> : PushExpression<IReadOnlyList<T>> {
+    [StorableConstructor]
+    protected VectorPushExpression(bool deserializing) : base(deserializing) { }
+
+    protected VectorPushExpression(IReadOnlyList<T> state) : base(state, null) { }
+
+    protected override string GetStringRepresentation() {
+      return PushEnvironment.VectorStartSymbolStr +
+             string.Join(PushEnvironment.VectorSeparatorSymbolStr, State) +
+             PushEnvironment.VectorEndSymbolStr;
+    }
+
+    protected override int CalcHashCode() {
+      return State.HashCode();
+    }
+  }
+
+  [StorableClass]
+  [Serializable]
+  [PushExpression(StackTypes.Integer, "INTEGER.PUSH", "Pushes a specific integer onto the INTEGER stack", isHidden: true)]
+  public class IntegerPushExpression : PushExpression<long> {
+    [StorableConstructor]
+    protected IntegerPushExpression(bool deserializing) : base(deserializing) { }
+
+    public static IntegerPushExpression Create(IManagedPool<Expression> statefulExpressionPool, long state) {
+      var expression = (IntegerPushExpression)statefulExpressionPool.Get();
+      expression.State = state;
+
+      return expression;
+    }
+
+    /// <summary>
+    /// Pushes default(long)
+    /// </summary>
+    public IntegerPushExpression() : base(default(long), null) {
+    }
+
+    public IntegerPushExpression(long state)
+      : base(state, null) {
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [Serializable]
+  [PushExpression(StackTypes.Float, "FLOAT.PUSH", "Pushes a specific float onto the FLOAT stack", isHidden: true)]
+  public class FloatPushExpression : PushExpression<double> {
+    [StorableConstructor]
+    protected FloatPushExpression(bool deserializing) : base(deserializing) { }
+
+    public static FloatPushExpression Create(IManagedPool<Expression> statefulExpressionPool, double state) {
+      var expression = (FloatPushExpression)statefulExpressionPool.Get();
+      expression.State = state;
+
+      return expression;
+    }
+
+    /// <summary>
+    /// Pushes default(double)
+    /// </summary>
+    public FloatPushExpression() : base(default(double), null) {
+    }
+
+    public FloatPushExpression(double state)
+      : base(state, null) {
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [Serializable]
+  [PushExpression(StackTypes.Boolean, "BOOLEAN.PUSH", "Pushes a specific boolean onto the BOOLEAN stack", isHidden: true)]
+  public class BooleanPushExpression : PushExpression<bool> {
+    [StorableConstructor]
+    protected BooleanPushExpression(bool deserializing, object other) : base(deserializing) { }
+
+    public static BooleanPushExpression Create(IManagedPool<Expression> statefulExpressionPool, bool state) {
+      var expression = (BooleanPushExpression)statefulExpressionPool.Get();
+      expression.State = state;
+
+      return expression;
+    }
+
+    /// <summary>
+    /// Pushes default(bool)
+    /// </summary>
+    public BooleanPushExpression() : base(default(bool), null) {
+    }
+
+    public BooleanPushExpression(bool state)
+      : base(state, null) {
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [Serializable]
+  [PushExpression(StackTypes.Name, "NAME.PUSH", "Pushes a specific name onto the NAME stack", isHidden: true)]
+  public class NamePushExpression : PushExpression<string> {
+    [StorableConstructor]
+    protected NamePushExpression(bool deserializing) : base(deserializing) { }
+    public static NamePushExpression Create(IManagedPool<Expression> statefulExpressionPool, string state) {
+      var expression = (NamePushExpression)statefulExpressionPool.Get();
+      expression.State = state;
+
+      return expression;
+    }
+
+    public NamePushExpression() : base(string.Empty, null) {
+    }
+
+    public NamePushExpression(string state)
+      : base(state, null) {
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.NameStack);
+    }
+  }
+
+  [StorableClass]
+  [Serializable]
+  [PushExpression(StackTypes.Exec, "EXEC.PUSH", "Pushes a specific expression onto the EXEC stack", isHidden: true)]
+  public class ExecPushExpression : PushExpression<Expression> {
+    [StorableConstructor]
+    protected ExecPushExpression(bool deserializing) : base(deserializing) { }
+    public static ExecPushExpression Create(IManagedPool<Expression> statefulExpressionPool, Expression state) {
+      var expression = (ExecPushExpression)statefulExpressionPool.Get();
+      expression.State = state;
+
+      return expression;
+    }
+
+    private static readonly Expression Noop = ExpressionTable.GetStatelessExpression<ExecNoopExpression>();
+
+    /// <summary>
+    /// Pushes ExecNoop
+    /// </summary>
+    public ExecPushExpression() : base(Noop, null) {
+    }
+
+    public ExecPushExpression(Expression state)
+      : base(state, null) {
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.ExecStack);
+    }
+  }
+
+  [StorableClass]
+  [Serializable]
+  [PushExpression(StackTypes.Char, "CHAR.PUSH", "Pushes a specific char onto the CHAR stack", isHidden: true)]
+  public class CharPushExpression : PushExpression<char> {
+    [StorableConstructor]
+    protected CharPushExpression(bool deserializing) : base(deserializing) { }
+
+    // not supported so far
+    public static CharPushExpression Create(IManagedPool<Expression> statefulExpressionPool, char state) {
+      var expression = (CharPushExpression)statefulExpressionPool.Get();
+      expression.State = state;
+
+      return expression;
+    }
+
+    /// <summary>
+    /// Pushes default(char)
+    /// </summary>
+    public CharPushExpression() : base(default(char), null) {
+    }
+
+    public CharPushExpression(char state)
+      : base(state, null) {
+    }
+
+    protected override string GetStringRepresentation() {
+      return PushEnvironment.CharSymbol + State.Printify() + PushEnvironment.CharSymbol;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CharStack);
+    }
+  }
+
+  [StorableClass]
+  [Serializable]
+  [PushExpression(StackTypes.String, "STRING.PUSH", "Pushes a specific string onto the STRING stack", isHidden: true)]
+  public class StringPushExpression : PushExpression<string> {
+    [StorableConstructor]
+    protected StringPushExpression(bool deserializing) : base(deserializing) { }
+
+    public static StringPushExpression Create(IManagedPool<Expression> statefulExpressionPool, string state) {
+      var expression = (StringPushExpression)statefulExpressionPool.Get();
+      expression.State = state;
+
+      return expression;
+    }
+
+    /// <summary>
+    /// Pushes String.Empty
+    /// </summary>
+    public StringPushExpression() : base(string.Empty, null) {
+    }
+
+    protected override string GetStringRepresentation() {
+      return PushEnvironment.StringSymbol + State + PushEnvironment.StringSymbol;
+    }
+
+    public StringPushExpression(string state)
+      : base(state, null) {
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringStack);
+    }
+  }
+
+  [StorableClass]
+  [Serializable]
+  [PushExpression(StackTypes.IntegerVector, "INTEGER[].PUSH", "Pushes a specific integer vector onto the INTEGER[] stack", isHidden: true)]
+  public class IntegerVectorPushExpression : VectorPushExpression<long> {
+    [StorableConstructor]
+    protected IntegerVectorPushExpression(bool deserializing) : base(deserializing) { }
+
+    public static IntegerVectorPushExpression Create(IManagedPool<Expression> statefulExpressionPool, IReadOnlyList<long> state) {
+      var expression = (IntegerVectorPushExpression)statefulExpressionPool.Get();
+      expression.State = state;
+
+      return expression;
+    }
+
+    [NonSerialized]
+    private static readonly long[] EmptyState = new long[0];
+
+    /// <summary>
+    /// Pushes long[0]
+    /// </summary>
+    public IntegerVectorPushExpression() : base(EmptyState) {
+    }
+
+    public IntegerVectorPushExpression(IReadOnlyList<long> state) : base(state) {
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [Serializable]
+  [PushExpression(StackTypes.FloatVector, "FLOAT[].PUSH", "Pushes a specific float vector onto the FLOAT[] stack", isHidden: true)]
+  public class FloatVectorPushExpression : VectorPushExpression<double> {
+    [StorableConstructor]
+    protected FloatVectorPushExpression(bool deserializing) : base(deserializing) { }
+
+    public static FloatVectorPushExpression Create(IManagedPool<Expression> statefulExpressionPool, IReadOnlyList<double> state) {
+      var expression = (FloatVectorPushExpression)statefulExpressionPool.Get();
+      expression.State = state;
+
+      return expression;
+    }
+
+    [NonSerialized]
+    private static readonly double[] EmptyState = new double[0];
+
+    /// <summary>
+    /// Pushes double[0]
+    /// </summary>
+    public FloatVectorPushExpression() : base(EmptyState) {
+    }
+
+    public FloatVectorPushExpression(IReadOnlyList<double> state) : base(state) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [Serializable]
+  [PushExpression(StackTypes.BooleanVector, "BOOLEAN[].PUSH", "Pushes a specific boolean vector onto the BOOLEAN[] stack", isHidden: true)]
+  public class BooleanVectorPushExpression : VectorPushExpression<bool> {
+    [StorableConstructor]
+    protected BooleanVectorPushExpression(bool deserializing) : base(deserializing) { }
+
+    public static BooleanVectorPushExpression Create(IManagedPool<Expression> statefulExpressionPool, IReadOnlyList<bool> state) {
+      var expression = (BooleanVectorPushExpression)statefulExpressionPool.Get();
+      expression.State = state;
+
+      return expression;
+    }
+
+    [NonSerialized]
+    private static readonly bool[] EmptyState = new bool[0];
+
+    /// <summary>
+    /// Pushes bool[0]
+    /// </summary>
+    public BooleanVectorPushExpression() : base(EmptyState) {
+    }
+
+    public BooleanVectorPushExpression(IReadOnlyList<bool> state) : base(state) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [Serializable]
+  [PushExpression(StackTypes.StringVector, "STRING[].PUSH", "Pushes a specific string vector onto the STRING[] stack", isHidden: true)]
+  public class StringVectorPushExpression : VectorPushExpression<string> {
+    [StorableConstructor]
+    protected StringVectorPushExpression(bool deserializing) : base(deserializing) { }
+
+    public static StringVectorPushExpression Create(IManagedPool<Expression> statefulExpressionPool, IReadOnlyList<string> state) {
+      var expression = (StringVectorPushExpression)statefulExpressionPool.Get();
+      expression.State = state;
+
+      return expression;
+    }
+
+    [NonSerialized]
+    private static readonly string[] EmptyState = new string[0];
+
+    /// <summary>
+    /// Pushes string[0]
+    /// </summary>
+    public StringVectorPushExpression() : base(EmptyState) {
+    }
+
+    protected override string GetStringRepresentation() {
+      return PushEnvironment.VectorStartSymbolStr +
+             string.Join(PushEnvironment.VectorSeparatorSymbolStr, State.Select(str => PushEnvironment.StringSymbol + str + PushEnvironment.StringSymbol)) +
+             PushEnvironment.VectorEndSymbolStr;
+    }
+
+    public StringVectorPushExpression(IReadOnlyList<string> state) : base(state) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PushProgram.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PushProgram.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PushProgram.cs	(revision 15771)
@@ -0,0 +1,435 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  [Serializable]
+  [StorableClass]
+  public sealed class PushProgram : Expression, IPooledObject {
+#if DEBUG
+    private const int STRING_REPRESENTATION_COUNT_BEFORE_AGGREGATE = 10;
+#else
+    private const int STRING_REPRESENTATION_COUNT_BEFORE_AGGREGATE = 1;
+#endif
+
+    private static readonly Expression[] EmptyExpressions = new Expression[0];
+    public static readonly PushProgram Empty = new PushProgram();
+
+    private const string Prefix = PushEnvironment.ProgramStartSymbolStr + " ";
+    private const string Postfix = " " + PushEnvironment.ProgramEndSymbolStr;
+    private const string PrefixReduced = "|";
+    private const string PostfixReduced = "|";
+    private const string Delimiter = " ";
+
+    [Storable]
+    private IReadOnlyList<Expression> expressions;
+
+    public PushProgram() : this(EmptyExpressions) { }
+
+    [StorableConstructor]
+    private PushProgram(bool deserializing) : this(EmptyExpressions) { }
+
+    public PushProgram(IReadOnlyList<Expression> expressions) {
+      this.expressions = expressions;
+    }
+
+    public PushProgram(PushProgram origin, Cloner cloner) {
+      stringRepresentation = origin.stringRepresentation;
+      hashCode = origin.hashCode;
+      depth = origin.depth;
+      treeIndex = origin.treeIndex;
+
+      var expressionsCopy = new List<Expression>(origin.expressions.Count);
+      for (var i = 0; i < origin.expressions.Count; i++) {
+        expressionsCopy.Add(cloner.Clone(origin.expressions[i]));
+      }
+
+      expressions = expressionsCopy;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PushProgram(this, cloner);
+    }
+
+    public bool IsEmpty { get { return Count == 0; } }
+    public int Count { get { return expressions.Count; } }
+
+    public IReadOnlyList<Expression> Expressions { get { return expressions; } }
+
+    public static PushProgram Create(IManagedPool<PushProgram> pool, IReadOnlyList<Expression> expressions) {
+      var program = pool.Get();
+      program.expressions = expressions;
+      return program;
+    }
+
+    void IPooledObject.Reset() {
+      expressions = null;
+      stringRepresentation = null;
+      depth = null;
+      treeIndex = null;
+      hashCode = null;
+    }
+
+    public static PushProgram Merge(IManagedPool<PushProgram> pool, IManagedPool<PooledList<Expression>> expressionListPool,
+      PushProgram first, Expression second) {
+      var program = pool.Get();
+      var list = expressionListPool.Get();
+
+      list.AddRange(first.Expressions);
+      list.Add(second);
+
+      program.expressions = list;
+
+      return program;
+    }
+
+    public static PushProgram Merge(IManagedPool<PushProgram> pool, IManagedPool<PooledList<Expression>> expressionListPool,
+      Expression first, PushProgram second) {
+      var program = pool.Get();
+      var list = expressionListPool.Get();
+
+      list.Add(first);
+      list.AddRange(second.Expressions);
+
+      program.expressions = list;
+
+      return program;
+    }
+
+    public static PushProgram Merge(IManagedPool<PushProgram> pool, IManagedPool<PooledList<Expression>> expressionListPool,
+      PushProgram first, PushProgram second) {
+      var program = pool.Get();
+      var list = expressionListPool.Get();
+
+      list.AddRange(first.Expressions);
+      list.AddRange(second.Expressions);
+
+      program.expressions = list;
+
+      return program;
+    }
+
+    public int IndexOf(Expression expression) {
+      var max = expressions.Count - 1;
+      for (var i = max; i >= 0; i--) {
+        if (expression.Equals(expressions[i])) return max - i;
+      }
+
+      return -1;
+    }
+
+    [NonSerialized]
+    private string stringRepresentation;
+    public override string StringRepresentation {
+      get {
+        return stringRepresentation ?? (stringRepresentation = BuildStringRepresentation());
+      }
+    }
+
+
+    [NonSerialized]
+    private int? depth;
+    public int Depth {
+      get {
+        if (depth == null) depth = CalcDepth();
+        return depth.Value;
+      }
+    }
+
+    [NonSerialized]
+    private int[] treeIndex;
+    private int[] TreeIndex {
+      get {
+        return treeIndex ?? (treeIndex = BuildTreeIndex());
+      }
+    }
+
+    [NonSerialized]
+    private int? hashCode;
+    [SuppressMessage("ReSharper", "NonReadonlyMemberInGetHashCode")]
+    public override int GetHashCode() {
+      if (hashCode == null) hashCode = expressions.HashCode();
+      return hashCode.Value;
+    }
+
+    public override bool Equals(object obj) {
+      if (obj == null)
+        return false;
+
+      if (ReferenceEquals(this, obj))
+        return true;
+
+      if (GetType() != obj.GetType())
+        return false;
+
+      var other = (PushProgram)obj;
+
+      return ReferenceEquals(expressions, other.expressions) ||
+             GetHashCode() == other.GetHashCode();
+    }
+
+    public bool Equals(PushProgram other) {
+      return ReferenceEquals(this, other) ||
+             ReferenceEquals(expressions, other.expressions) ||
+             GetHashCode() == other.GetHashCode();
+    }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      interpreter.ExecStack.Push(expressions);
+    }
+
+    public override string ToString() {
+      return StringRepresentation;
+    }
+
+    [NonSerialized]
+    private int? totalCount;
+
+    /// <summary>
+    /// Returns the amount of elements in the whole tree
+    /// </summary>
+    /// <returns></returns>
+    public int TotalCount {
+      get {
+        if (totalCount == null) {
+          totalCount = IsEmpty
+            ? 1
+            // + 1 because "this" is also counted
+            : TreeIndex[0] + 1;
+        }
+
+        return totalCount.Value;
+      }
+    }
+
+    [NonSerialized]
+    private int? totalInstructionCount;
+    /// <summary>
+    /// Returns the amount of none program expressions
+    /// </summary>
+    /// <returns></returns>
+    public int TotalInstructionCount {
+      get {
+        if (totalInstructionCount == null) {
+          totalInstructionCount = 0;
+
+          for (var i = 0; i < Count; i++) {
+            var expression = expressions[i];
+
+            totalInstructionCount += expression.IsProgram
+              ? ((PushProgram)expression).TotalInstructionCount
+              : 1;
+          }
+        }
+
+        return totalInstructionCount.Value;
+      }
+    }
+
+    [NonSerialized]
+    private int? branches;
+    /// <summary>
+    /// Returns the amount of branches in the whole tree. Even an empty program represents at least one branch
+    /// </summary>
+    /// <returns></returns>
+    public int Branches {
+      get {
+        if (branches == null) CountBranches();
+        return branches.Value;
+      }
+    }
+
+    private void CountBranches() {
+      branches = 1;
+
+      for (var i = 0; i < Count; i++) {
+        var expression = expressions[i];
+
+        if (!expression.IsProgram)
+          continue;
+
+        var program = (PushProgram)expression;
+        branches += program.Branches;
+      }
+    }
+
+    public IEnumerable<Expression> DepthLast() {
+      foreach (var expr in expressions) {
+        if (expr.IsProgram)
+          foreach (var sub in ((PushProgram)expr).DepthLast())
+            yield return sub;
+        else yield return expr;
+      }
+    }
+
+    public IReadOnlyList<Expression> Flatten() {
+      var result = new List<Expression>();
+      Flatten(result);
+      return result;
+    }
+
+    private void Flatten(List<Expression> result) {
+      result.AddRange(expressions);
+
+      for (var i = 0; i < expressions.Count; i++) {
+        var expr = expressions[i];
+        if (expr.IsProgram) {
+          ((PushProgram)expr).Flatten(result);
+        }
+      }
+    }
+
+    public PushProgram Copy() {
+      if (IsEmpty) return this;
+
+      return new PushProgram(expressions) {
+        stringRepresentation = stringRepresentation,
+        hashCode = hashCode,
+        depth = depth,
+        treeIndex = treeIndex
+      };
+    }
+
+    public PushProgram Copy(IManagedPool<PushProgram> pool) {
+      if (IsEmpty) return this;
+
+      var program = pool.Get(reset: false);
+
+      program.expressions = expressions;
+      program.stringRepresentation = stringRepresentation;
+      program.hashCode = hashCode;
+      program.depth = depth;
+      program.treeIndex = treeIndex;
+
+      return program;
+    }
+
+    public IList<Expression> CopyExpressions() {
+      return new List<Expression>(expressions);
+    }
+
+    public IList<Expression> CopyExpressions(IManagedPool<PooledList<Expression>> expressionListPool) {
+      if (IsEmpty) return EmptyExpressions;
+
+      var copy = expressionListPool.Get();
+      copy.AddRange(expressions);
+
+      return copy;
+    }
+
+    private int CalcDepth() {
+      var maxDepth = 0;
+      for (var i = 0; i < Count; i++) {
+        var expression = expressions[i];
+        if (!expression.IsProgram) continue;
+
+        var expandExpression = (PushProgram)expression;
+        if (expandExpression.Depth > maxDepth)
+          maxDepth = expandExpression.Depth;
+      }
+
+      return maxDepth + 1;
+    }
+
+    private string BuildStringRepresentation() {
+      // prevent too big string
+      return Count > STRING_REPRESENTATION_COUNT_BEFORE_AGGREGATE
+        ? PrefixReduced + Count + PostfixReduced
+        : Prefix + string.Join(Delimiter, expressions.Reverse()) + Postfix;
+    }
+
+    private int[] BuildTreeIndex() {
+      var localTreeIndex = new int[Count];
+      var next = 1;
+
+      for (var i = Count - 1; i >= 0; i--) {
+        var subExpression = expressions[i];
+
+        localTreeIndex[i] = next;
+
+        if (subExpression.IsProgram) {
+          next += ((PushProgram)subExpression).TotalCount;
+        } else {
+          next++;
+        }
+      }
+
+      return localTreeIndex;
+    }
+
+    private static void CheckIfNested(int level, PushProgram target, PushProgram current,
+        IList<PushProgram> visited) {
+      if (visited.Any(x => ReferenceEquals(x, current)))
+        Debugger.Break();
+
+      visited.Add(current);
+      if (level <= 0) {
+        // hierarchy depth > level
+        Debugger.Break();
+        return;
+      }
+
+      for (var i = 0; i < current.Count; i++) {
+        if (current.expressions[i].IsProgram)
+          continue;
+
+        var subExpression = current.expressions[i] as PushProgram;
+
+        if (ReferenceEquals(target, subExpression)) {
+          // Endless recursion dedected
+          Debugger.Break();
+        }
+
+        CheckIfNested(level - 1, target, subExpression, visited);
+      }
+
+      visited.RemoveAt(visited.Count - 1);
+    }
+
+    /// <summary>
+    ///     Returns the element with the given index whereby the tree is indexed in depth first manner
+    /// </summary>
+    /// <param name="index">The index of the required element</param>
+    /// <returns>The required element</returns>
+    public Expression GetFromTree(int index) {
+      return GetFromTree(index, (root, parent, child, childIndex, parentIndex) => child);
+    }
+
+    /// <returns>The required element</returns>
+    public T GetFromTree<T>(int index,
+        Func<PushProgram, PushProgram, Expression, int, int, T> resolver) {
+      return GetFromTree(index, 0, null, resolver);
+    }
+
+    private T GetFromTree<T>(int index, int parentIndex, PushProgram parent,
+        Func<PushProgram, PushProgram, Expression, int, int, T> resolver) {
+      if (index == 0) return resolver(parent, parent, this, 0, parentIndex);
+
+      var min = Count - 1;
+      var max = 0;
+      var mid = (min + max) / 2;
+
+      while ((max <= min) && (TreeIndex[mid] != index)) {
+        if (TreeIndex[mid] > index) max = mid + 1;
+        else min = mid - 1;
+
+        mid = (min + max) / 2;
+      }
+
+      return TreeIndex[mid] == index
+          ? resolver(parent, this, expressions[mid], mid, parentIndex)
+          : (expressions[mid + 1] as PushProgram).GetFromTree(index - TreeIndex[mid + 1], mid + 1,
+              this, resolver);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/RandExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/RandExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/RandExpressions.cs	(revision 15771)
@@ -0,0 +1,244 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  /// <summary>
+  /// Pushes a random already defined name or a new one onto the NAME stack.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Name,
+    "NAME.RAND",
+    "Pushes a random already defined name or a new one based on the Name-ERC-Options onto the NAME stack.")]
+  [StorableClass]
+  public class NameRandExpression : StatelessExpression {
+    public NameRandExpression() { }
+    [StorableConstructor]
+    protected NameRandExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return !interpreter.Configuration.ErcOptions.NameErcOptions.IsEnabled;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var name = interpreter.Configuration.ErcOptions.NameErcOptions.GetErcValue(interpreter.Random);
+      interpreter.NameStack.Push(name);
+    }
+  }
+
+  /// <summary>
+  /// Pushes a random integer.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.RAND",
+    "Pushes a random integer based on the Integer-ERC-Options  onto the INTEGER stack.")]
+  [StorableClass]
+  public class IntegerRandExpression : StatelessExpression {
+    public IntegerRandExpression() { }
+    [StorableConstructor]
+    protected IntegerRandExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return !interpreter.Configuration.ErcOptions.IntegerErcOptions.IsEnabled;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.Configuration.ErcOptions.IntegerErcOptions.GetErcValue(interpreter.Random);
+      interpreter.IntegerStack.Push(value);
+    }
+  }
+
+  /// <summary>
+  ///  Pushes a random float.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.RAND",
+    "Pushes a random float based on the Float-ERC-Options onto the FLOAT stack.")]
+  [StorableClass]
+  public class FloatRandExpression : StatelessExpression {
+    public FloatRandExpression() { }
+    [StorableConstructor]
+    protected FloatRandExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return !interpreter.Configuration.ErcOptions.FloatErcOptions.IsEnabled;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.Configuration.ErcOptions.FloatErcOptions.GetErcValue(interpreter.Random);
+      interpreter.FloatStack.Push(value);
+    }
+  }
+
+  /// <summary>
+  ///     Pushes a random boolean.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Boolean,
+    "BOOLEAN.RAND",
+    "Pushes a random boolean based on the Boolean-ERC-Options onto the BOOLEAN stack.")]
+  [StorableClass]
+  public class BooleanRandExpression : StatelessExpression {
+    public BooleanRandExpression() { }
+    [StorableConstructor]
+    protected BooleanRandExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return !interpreter.Configuration.ErcOptions.BooleanErcOptions.IsEnabled;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.Configuration.ErcOptions.BooleanErcOptions.GetErcValue(interpreter.Random);
+      interpreter.BooleanStack.Push(value);
+    }
+  }
+
+  /// <summary>
+  ///     Pushes random expressions onto the code stack.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.RAND",
+    "Pushes a random code onto the CODE stack.")]
+  [StorableClass]
+  public class CodeRandExpression : StatelessExpression {
+    public CodeRandExpression() { }
+    [StorableConstructor]
+    protected CodeRandExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count == 0 || interpreter.IntegerStack.Top < 1;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var size = interpreter.IntegerStack.Pop().AsInt(interpreter.Configuration.MaxPointsInRandomExpression);
+      var program = LinearCodeGenerator.RandomProgram(
+        interpreter.PoolContainer.PushProgramPool,
+        interpreter.PoolContainer.ExpressionListPool,
+        size,
+        interpreter.Random,
+        interpreter.Configuration,
+        interpreter.CustomExpressions);
+
+      interpreter.CodeStack.Push(program);
+    }
+  }
+
+  /// <summary>
+  ///     Pushes a random char.
+  /// </summary>
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.RAND",
+    "Pushes a random char based on the Char-ERC-Options onto the CHAR stack.")]
+  [StorableClass]
+  public class CharRandExpression : StatelessExpression {
+    public CharRandExpression() { }
+    [StorableConstructor]
+    protected CharRandExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return !interpreter.Configuration.ErcOptions.CharErcOptions.IsEnabled;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.Configuration.ErcOptions.CharErcOptions.GetErcValue(interpreter.Random);
+      interpreter.CharStack.Push(value);
+    }
+
+    /// <summary>
+    ///     Pushes a random string.
+    /// </summary>
+    [PushExpression(
+      StackTypes.String,
+      "STRING.RAND",
+      "Pushes a random string based on the String-ERC-Options onto the STRING stack.")]
+    [StorableClass]
+    public class StringRandExpression : StatelessExpression {
+      public StringRandExpression() { }
+      [StorableConstructor]
+      protected StringRandExpression(bool deserializing) : base(deserializing) { }
+
+      public override bool IsNoop(IInternalPushInterpreter interpreter) {
+        return !interpreter.Configuration.ErcOptions.StringErcOptions.IsEnabled;
+      }
+
+      public override void Eval(IInternalPushInterpreter interpreter) {
+        var value = interpreter.Configuration.ErcOptions.StringErcOptions.GetErcValue(interpreter.Random);
+        interpreter.StringStack.Push(value);
+      }
+
+      /// <summary>
+      ///     Pushes a random interger vector.
+      /// </summary>
+      [PushExpression(
+        StackTypes.IntegerVector,
+        "INTEGER[].RAND",
+        "Pushes a random integer vector based on the Integer-Vector-ERC-Options onto the INTEGER[] stack.")]
+      [StorableClass]
+      public class IntegerVectorRandExpression : StatelessExpression {
+        public IntegerVectorRandExpression() { }
+        [StorableConstructor]
+        protected IntegerVectorRandExpression(bool deserializing) : base(deserializing) { }
+
+        public override bool IsNoop(IInternalPushInterpreter interpreter) {
+          return !interpreter.Configuration.ErcOptions.IntegerVectorErcOptions.IsEnabled;
+        }
+
+        public override void Eval(IInternalPushInterpreter interpreter) {
+          var value = interpreter.Configuration.ErcOptions.IntegerVectorErcOptions.GetErcValue(interpreter.Random);
+          interpreter.IntegerVectorStack.Push(new List<long>(value.Select(i => (long)i)));
+        }
+      }
+
+      /// <summary>
+      ///     Pushes a random float vector.
+      /// </summary>
+      [PushExpression(
+        StackTypes.FloatVector,
+        "FLOAT[].RAND",
+        "Pushes a random float vector based on the Float-Vector-ERC-Options onto the FLOAT[] stack.")]
+      [StorableClass]
+      public class FloatVectorRandExpression : StatelessExpression {
+        public FloatVectorRandExpression() { }
+        [StorableConstructor]
+        protected FloatVectorRandExpression(bool deserializing) : base(deserializing) { }
+
+        public override bool IsNoop(IInternalPushInterpreter interpreter) {
+          return !interpreter.Configuration.ErcOptions.FloatVectorErcOptions.IsEnabled;
+        }
+
+        public override void Eval(IInternalPushInterpreter interpreter) {
+          var value = interpreter.Configuration.ErcOptions.FloatVectorErcOptions.GetErcValue(interpreter.Random);
+          interpreter.FloatVectorStack.Push(value);
+        }
+      }
+
+      /// <summary>
+      ///     Pushes a random boolean vector.
+      /// </summary>
+      [PushExpression(
+        StackTypes.StringVector,
+        "STRING[].RAND",
+        "Pushes a random string vector based on the String-Vector-ERC-Options onto the STRING[] stack.")]
+      [StorableClass]
+      public class StringVectorRandExpression : StatelessExpression {
+        public StringVectorRandExpression() { }
+        [StorableConstructor]
+        protected StringVectorRandExpression(bool deserializing) : base(deserializing) { }
+
+        public override bool IsNoop(IInternalPushInterpreter interpreter) {
+          return !interpreter.Configuration.ErcOptions.StringVectorErcOptions.IsEnabled;
+        }
+
+        public override void Eval(IInternalPushInterpreter interpreter) {
+          var value = interpreter.Configuration.ErcOptions.StringVectorErcOptions.GetErcValue(interpreter.Random);
+          interpreter.StringVectorStack.Push(value);
+        }
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/RotateExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/RotateExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/RotateExpressions.cs	(revision 15771)
@@ -0,0 +1,245 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  public abstract class RotateExpression<T> : StatelessExpression {
+    protected RotateExpression() { }
+    [StorableConstructor]
+    protected RotateExpression(bool deserializing) : base(deserializing) { }
+
+    protected void Eval(IPushStack<T> stack) {
+      stack.Swap(3);
+    }
+  }
+
+
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.ROT",
+    "Rotates the top 3 items of the INTEGER stack clockwise.")]
+  [StorableClass]
+  public class IntegerRotateExpression : RotateExpression<long> {
+    public IntegerRotateExpression() { }
+    [StorableConstructor]
+    protected IntegerRotateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.ROT",
+    "Rotates the top 3 items of the FLOAT stack clockwise.")]
+  [StorableClass]
+  public class FloatRotateExpression : RotateExpression<double> {
+    public FloatRotateExpression() { }
+    [StorableConstructor]
+    protected FloatRotateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Boolean,
+    "BOOLEAN.ROT",
+    "Rotates the top 3 items of the BOOLEAN stack clockwise.")]
+  [StorableClass]
+  public class BooleanRotateExpression : RotateExpression<bool> {
+    public BooleanRotateExpression() { }
+    [StorableConstructor]
+    protected BooleanRotateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Name,
+    "NAME.ROT",
+    "Rotates the top 3 items of the NAME stack clockwise.")]
+  [StorableClass]
+  public class NameRotateExpression : RotateExpression<string> {
+    public NameRotateExpression() { }
+    [StorableConstructor]
+    protected NameRotateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.NameStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.NameStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.ROT",
+    "Rotates the top 3 items of the EXEC stack clockwise.",
+    requiredBlockCount: 3)]
+  [StorableClass]
+  public class ExecRotateExpression : RotateExpression<Expression> {
+    public ExecRotateExpression() { }
+    [StorableConstructor]
+    protected ExecRotateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.ExecStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.ROT",
+    "Rotates the top 3 items of the CODE stack clockwise.")]
+  [StorableClass]
+  public class CodeRotateExpression : RotateExpression<Expression> {
+    public CodeRotateExpression() { }
+    [StorableConstructor]
+    protected CodeRotateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CodeStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.ROT",
+    "Rotates the top 3 items of the CHAR stack clockwise.")]
+  [StorableClass]
+  public class CharRotateExpression : RotateExpression<char> {
+    public CharRotateExpression() { }
+    [StorableConstructor]
+    protected CharRotateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CharStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.String,
+    "STRING.ROT",
+    "Rotates the top 3 items of the STRING stack clockwise.")]
+  [StorableClass]
+  public class StringRotateExpression : RotateExpression<string> {
+    public StringRotateExpression() { }
+    [StorableConstructor]
+    protected StringRotateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].ROT",
+    "Rotates the top 3 items of the INTEGER[] stack clockwise.")]
+  [StorableClass]
+  public class IntegerVectorRotateExpression : RotateExpression<IReadOnlyList<long>> {
+    public IntegerVectorRotateExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorRotateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerVectorStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].ROT",
+    "Rotates the top 3 items of the FLOAT[] stack clockwise.")]
+  [StorableClass]
+  public class FloatVectorRotateExpression : RotateExpression<IReadOnlyList<double>> {
+    public FloatVectorRotateExpression() { }
+    [StorableConstructor]
+    protected FloatVectorRotateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatVectorStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].ROT",
+    "Rotates the top 3 items of the BOOLEAN[] stack clockwise.")]
+  [StorableClass]
+  public class BooleanVectorRotateExpression : RotateExpression<IReadOnlyList<bool>> {
+    public BooleanVectorRotateExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorRotateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanVectorStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].ROT",
+    "Rotates the top 3 items of the STRING[] stack clockwise.")]
+  [StorableClass]
+  public class StringVectorRotateExpression : RotateExpression<IReadOnlyList<string>> {
+    public StringVectorRotateExpression() { }
+    [StorableConstructor]
+    protected StringVectorRotateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringVectorStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ShoveExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ShoveExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ShoveExpressions.cs	(revision 15771)
@@ -0,0 +1,257 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  public abstract class ShoveExpression<T> : StatelessExpression {
+    protected ShoveExpression() { }
+    [StorableConstructor]
+    protected ShoveExpression(bool deserializing) : base(deserializing) { }
+
+    protected void Eval(IPushStack<T> stack, IPushStack<long> integerStack) {
+      var index = integerStack.Pop().AsInt(stack.Count);
+      var item = stack.Pop();
+      stack.Insert(index, item);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.SHOVE",
+    "Moves the top INTEGER item to a specific stack index, whereby the index is taken from the INTEGER stack.")]
+  [StorableClass]
+  public class IntegerShoveExpression : ShoveExpression<long> {
+    public IntegerShoveExpression() { }
+    [StorableConstructor]
+    protected IntegerShoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerStack, interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.SHOVE",
+    "Moves the top FLOAT item to a specific stack index, whereby the index is taken from the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class FloatShoveExpression : ShoveExpression<double> {
+    public FloatShoveExpression() { }
+    [StorableConstructor]
+    protected FloatShoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty || interpreter.FloatStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatStack, interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Boolean,
+    "BOOLEAN.SHOVE",
+    "Moves the top BOOLEAN item to a specific stack index, whereby the index is taken from the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class BooleanShoveExpression : ShoveExpression<bool> {
+    public BooleanShoveExpression() { }
+    [StorableConstructor]
+    protected BooleanShoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty || interpreter.BooleanStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanStack, interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Name,
+    "NAME.SHOVE",
+    "Moves the top NAME item to a specific stack index, whereby the index is taken from the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class NameShoveExpression : ShoveExpression<string> {
+    public NameShoveExpression() { }
+    [StorableConstructor]
+    protected NameShoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty || interpreter.NameStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.NameStack, interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.SHOVE",
+    "Moves the top EXEC item to a specific stack index, whereby the index is taken from the INTEGER stack.",
+    StackTypes.Integer,
+    requiredBlockCount: 1)]
+  [StorableClass]
+  public class ExecShoveExpression : ShoveExpression<Expression> {
+    public ExecShoveExpression() { }
+    [StorableConstructor]
+    protected ExecShoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty || interpreter.ExecStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.ExecStack, interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.SHOVE",
+    "Moves the top CODE item to a specific stack index, whereby the index is taken from the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class CodeShoveExpression : ShoveExpression<Expression> {
+    public CodeShoveExpression() { }
+    [StorableConstructor]
+    protected CodeShoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty || interpreter.CodeStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CodeStack, interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.SHOVE",
+    "Moves the top CHAR item to a specific stack index, whereby the index is taken from the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class CharShoveExpression : ShoveExpression<char> {
+    public CharShoveExpression() { }
+    [StorableConstructor]
+    protected CharShoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty || interpreter.CharStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CharStack, interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.String,
+    "STRING.SHOVE",
+    "Moves the top STRING item to a specific stack index, whereby the index is taken from the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class StringShoveExpression : ShoveExpression<string> {
+    public StringShoveExpression() { }
+    [StorableConstructor]
+    protected StringShoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty || interpreter.StringStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringStack, interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].SHOVE",
+    "Moves the top INTEGER[] item to a specific stack index, whereby the index is taken from the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class IntegerVectorShoveExpression : ShoveExpression<IReadOnlyList<long>> {
+    public IntegerVectorShoveExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorShoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty || interpreter.IntegerVectorStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].SHOVE",
+    "Moves the top FLOAT[] item to a specific stack index, whereby the index is taken from the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class FloatVectorShoveExpression : ShoveExpression<IReadOnlyList<double>> {
+    public FloatVectorShoveExpression() { }
+    [StorableConstructor]
+    protected FloatVectorShoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty || interpreter.FloatVectorStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].SHOVE",
+    "Moves the top BOOLEAN[] item to a specific stack index, whereby the index is taken from the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class BooleanVectorShoveExpression : ShoveExpression<IReadOnlyList<bool>> {
+    public BooleanVectorShoveExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorShoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty || interpreter.BooleanVectorStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].SHOVE",
+    "Moves the top STRING[] item to a specific stack index, whereby the index is taken from the INTEGER stack.",
+    StackTypes.Integer)]
+  [StorableClass]
+  public class StringVectorShoveExpression : ShoveExpression<IReadOnlyList<string>> {
+    public StringVectorShoveExpression() { }
+    [StorableConstructor]
+    protected StringVectorShoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty || interpreter.StringVectorStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack, interpreter.IntegerStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StackdepthExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StackdepthExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StackdepthExpressions.cs	(revision 15771)
@@ -0,0 +1,215 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  ///     Pushes the stack depth onto the INTEGER stack (thereby increasing it!).
+  /// </summary>
+  /// <typeparam name="T">Stacktype</typeparam>
+  [StorableClass]
+  public abstract class StackdepthExpression<T> : StatelessExpression {
+    protected StackdepthExpression() { }
+    [StorableConstructor]
+    protected StackdepthExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return false;
+    }
+
+    protected void Eval(IPushStack<T> stack, IPushStack<long> integerStack, bool incremental = false) {
+      var count = stack.Count;
+      if (incremental) count += 1;
+      integerStack.Push(count);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.STACKDEPTH",
+    "Pushes the stack depth onto the INTEGER stack.")]
+  public class IntegerStackdepthExpression : StackdepthExpression<long> {
+    public IntegerStackdepthExpression() { }
+    [StorableConstructor]
+    protected IntegerStackdepthExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerStack, interpreter.IntegerStack, true);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.STACKDEPTH",
+    "Pushes the stack depth onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class FloatStackdepthExpression : StackdepthExpression<double> {
+    public FloatStackdepthExpression() { }
+    [StorableConstructor]
+    protected FloatStackdepthExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Boolean,
+    "BOOLEAN.STACKDEPTH",
+    "Pushes the stack depth onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class BooleanStackdepthExpression : StackdepthExpression<bool> {
+    public BooleanStackdepthExpression() { }
+    [StorableConstructor]
+    protected BooleanStackdepthExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Name,
+    "NAME.STACKDEPTH",
+    "Pushes the stack depth onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class NameStackdepthExpression : StackdepthExpression<string> {
+    public NameStackdepthExpression() { }
+    [StorableConstructor]
+    protected NameStackdepthExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.NameStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.STACKDEPTH",
+    "Pushes the stack depth onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class ExecStackdepthExpression : StackdepthExpression<Expression> {
+    public ExecStackdepthExpression() { }
+    [StorableConstructor]
+    protected ExecStackdepthExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.ExecStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.STACKDEPTH",
+    "Pushes the stack depth onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class CodeStackdepthExpression : StackdepthExpression<Expression> {
+    public CodeStackdepthExpression() { }
+    [StorableConstructor]
+    protected CodeStackdepthExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CodeStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.STACKDEPTH",
+    "Pushes the stack depth onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class CharStackdepthExpression : StackdepthExpression<char> {
+    public CharStackdepthExpression() { }
+    [StorableConstructor]
+    protected CharStackdepthExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CharStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.STACKDEPTH",
+    "Pushes the stack depth onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class StringStackdepthExpression : StackdepthExpression<string> {
+    public StringStackdepthExpression() { }
+    [StorableConstructor]
+    protected StringStackdepthExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].STACKDEPTH",
+    "Pushes the stack depth onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class IntegerVectorStackdepthExpression : StackdepthExpression<IReadOnlyList<long>> {
+    public IntegerVectorStackdepthExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorStackdepthExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].STACKDEPTH",
+    "Pushes the stack depth onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class FloatVectorStackdepthExpression : StackdepthExpression<IReadOnlyList<double>> {
+    public FloatVectorStackdepthExpression() { }
+    [StorableConstructor]
+    protected FloatVectorStackdepthExpression(bool deserializing) : base(deserializing) { }
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].STACKDEPTH",
+    "Pushes the stack depth onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class BooleanVectorStackdepthExpression : StackdepthExpression<IReadOnlyList<bool>> {
+    public BooleanVectorStackdepthExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorStackdepthExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].STACKDEPTH",
+    "Pushes the stack depth onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class StringVectorStackdepthExpression : StackdepthExpression<IReadOnlyList<string>> {
+    public StringVectorStackdepthExpression() { }
+    [StorableConstructor]
+    protected StringVectorStackdepthExpression(bool deserializing) : base(deserializing) { }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack, interpreter.IntegerStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StatefulExpression.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StatefulExpression.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StatefulExpression.cs	(revision 15771)
@@ -0,0 +1,72 @@
+﻿using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [Serializable]
+  [StorableClass]
+  public abstract class StatefulExpression<T> : Expression, IPooledObject {
+    [Storable]
+    public T State { get; protected set; }
+    [NonSerialized]
+    private int? hashCode;
+    [NonSerialized]
+    private string stringRepresentation;
+
+    protected StatefulExpression(T state) {
+      State = state;
+    }
+
+    [StorableConstructor]
+    protected StatefulExpression(bool deserializing) : base(deserializing) { }
+
+    protected virtual int CalcHashCode() {
+      var hash = 19 * 31 + GetType().FullName.GetHashCode();
+      hash = hash * 31 + State.GetHashCode();
+
+      return hash;
+    }
+
+    protected virtual string GetStringRepresentation() {
+      return State.ToString();
+    }
+
+    public override string StringRepresentation {
+      get {
+        return stringRepresentation ?? (stringRepresentation = GetStringRepresentation());
+      }
+    }
+
+    public override bool Equals(object obj) {
+      if (ReferenceEquals(this, obj))
+        return true;
+
+      if (GetType() != obj.GetType())
+        return false;
+
+      var other = (StatefulExpression<T>)obj;
+
+      return ReferenceEquals(State, other.State) ||
+             GetHashCode() == other.GetHashCode();
+    }
+
+    public bool Equals(StatefulExpression<T> obj) {
+      if (ReferenceEquals(this, obj))
+        return true;
+
+      if (GetType() != obj.GetType())
+        return false;
+
+      return ReferenceEquals(State, obj.State) ||
+             GetHashCode() == obj.GetHashCode();
+    }
+
+    public override int GetHashCode() {
+      if (hashCode == null) hashCode = CalcHashCode();
+      return hashCode.Value;
+    }
+
+    public void Reset() {
+      State = default(T);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StatelessExpression.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StatelessExpression.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StatelessExpression.cs	(revision 15771)
@@ -0,0 +1,39 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  [Serializable]
+  public abstract class StatelessExpression : Expression {
+    [NonSerialized]
+    private readonly int hashCode;
+
+    protected StatelessExpression() {
+      hashCode = GetType().FullName.GetHashCode();
+    }
+
+    [StorableConstructor]
+    protected StatelessExpression(bool deserializing) : base(deserializing) { }
+
+    protected StatelessExpression(StatelessExpression origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override int GetHashCode() {
+      return hashCode;
+    }
+
+    public override string StringRepresentation
+    {
+      get
+      {
+        return ExpressionTable.TypeToAttributeTable[GetType()].Name;
+      }
+    }
+
+    public override bool Equals(object obj) {
+      return ReferenceEquals(this, obj) ||
+             hashCode == obj.GetHashCode();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StringExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StringExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StringExpressions.cs	(revision 15771)
@@ -0,0 +1,851 @@
+﻿using System;
+using System.Globalization;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Stringifies and pushes the top INTEGER.,
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.FROMINTEGER",
+    "Stringifies and pushes the top INTEGER.",
+    StackTypes.Integer)]
+  public class StringFromIntegerExpression : StatelessExpression {
+    public StringFromIntegerExpression() { }
+    [StorableConstructor]
+    protected StringFromIntegerExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.IntegerStack.Pop();
+      interpreter.StringStack.Push(value.ToString());
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.FROMFLOAT",
+    "Stringifies and pushes the top FLOAT.",
+    StackTypes.Float)]
+  public class StringFromFloatExpression : StatelessExpression {
+    public StringFromFloatExpression() { }
+    [StorableConstructor]
+    protected StringFromFloatExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.FloatStack.Pop();
+      var str = value.ToString(interpreter.Configuration.FloatStringFormat, CultureInfo.InvariantCulture);
+
+      interpreter.StringStack.Push(str);
+    }
+  }
+
+  /// <summary>
+  /// Stringifies and pushes the top BOOLEAN.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.FROMBOOLEAN",
+    "Stringifies and pushes the top BOOLEAN.",
+    StackTypes.Boolean)]
+  public class StringFromBooleanExpression : StatelessExpression {
+    public StringFromBooleanExpression() { }
+    [StorableConstructor]
+    protected StringFromBooleanExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.BooleanStack.Pop();
+      interpreter.StringStack.Push(value.ToString());
+    }
+  }
+
+  /// <summary>
+  /// Stringifies and pushes the top CHAR.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.FROMCHAR",
+    "Stringifies and pushes the top CHAR.",
+    StackTypes.Char)]
+  public class StringFromCharExpression : StatelessExpression {
+    public StringFromCharExpression() { }
+    [StorableConstructor]
+    protected StringFromCharExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var value = interpreter.CharStack.Pop();
+      interpreter.StringStack.Push(value.ToString());
+    }
+  }
+
+  /// <summary>
+  /// Concats the top 2 strings.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.CONCAT",
+    "Concats the top 2 strings.")]
+  public class StringConcatExpression : StatelessExpression {
+    public StringConcatExpression() { }
+    [StorableConstructor]
+    protected StringConcatExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.Count < 2 ||
+             interpreter.StringStack.Top.Length + interpreter.StringStack[1].Length > interpreter.Configuration.MaxStringLength;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Pop();
+      interpreter.StringStack.Top += str;
+    }
+  }
+
+  /// <summary>
+  /// Conj char onto string
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.CONJCHAR",
+    "Conj top CHAR onto top STRING",
+    StackTypes.Char)]
+  public class StringConjCharExpression : StatelessExpression {
+    public StringConjCharExpression() { }
+    [StorableConstructor]
+    protected StringConjCharExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.CharStack.IsEmpty ||
+             interpreter.StringStack.Top.Length + 1 > interpreter.Configuration.MaxStringLength;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var c = interpreter.CharStack.Pop();
+      interpreter.StringStack.Top += c;
+    }
+  }
+
+  /// <summary>
+  /// Same as substring 0-n, whereby n is taken from the INTEGER stack.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.TAKE",
+    "Same as substring 0-n, whereby n is taken from the INTEGER stack.",
+    StackTypes.Integer)]
+  public class StringTakeExpression : StatelessExpression {
+    public StringTakeExpression() { }
+    [StorableConstructor]
+    protected StringTakeExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Top;
+
+      if (str.Length == 0)
+        return;
+
+      var endIndex = interpreter.IntegerStack.Pop().AsInt(str.Length);
+      interpreter.StringStack.Top = str.Substring(0, endIndex);
+    }
+  }
+
+  /// <summary>
+  /// Replaces top STRING with a substring from index A to B, whereby A and B are taken from the INTEGER STACK.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.SUBSTRING",
+    "Replaces top STRING with a substring from index A to B, whereby A and B are taken from the INTEGER STACK.",
+    StackTypes.Integer)]
+  public class StringSubstringExpression : StatelessExpression {
+    public StringSubstringExpression() { }
+    [StorableConstructor]
+    protected StringSubstringExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.IntegerStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Top;
+      var firstValue = interpreter.IntegerStack[1];
+      var secondValue = interpreter.IntegerStack.Top;
+      interpreter.IntegerStack.Remove(2);
+
+      var first = Math.Min(str.Length - 1, Math.Max(firstValue, 0));
+      var second = Math.Min(str.Length - 1, Math.Max(secondValue, first));
+      var length = second - first;
+
+      if (length > 0)
+        interpreter.StringStack.Top = str.Substring((int)first, (int)length);
+    }
+  }
+
+  /// <summary>
+  /// Pushes first char of top STRING.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.FIRST",
+    "Pushes first char of top STRING.")]
+  public class StringFirstExpression : StatelessExpression {
+    public StringFirstExpression() { }
+    [StorableConstructor]
+    protected StringFirstExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.StringStack.Top.Length == 0;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      interpreter.StringStack.Top = interpreter.StringStack.Top[0].ToString();
+    }
+  }
+
+  /// <summary>
+  /// Pushes last char of top STRING.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.LAST",
+    "Pushes last char of top STRING.")]
+  public class StringLastExpression : StatelessExpression {
+    public StringLastExpression() { }
+    [StorableConstructor]
+    protected StringLastExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.StringStack.Top.Length == 0;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Top;
+      var c = str[str.Length - 1].ToString();
+      interpreter.StringStack.Top = c;
+    }
+  }
+
+  /// <summary>
+  /// Pushes nth char of top STRING, whereby n is take from the INTEGER stack.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.NTH",
+    "Pushes nth char of top STRING, whereby n is take from the INTEGER stack.",
+    StackTypes.Integer)]
+  public class StringNthExpression : StatelessExpression {
+    public StringNthExpression() { }
+    [StorableConstructor]
+    protected StringNthExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.IntegerStack.IsEmpty ||
+             interpreter.StringStack.Top.Length == 0;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Top;
+      var index = str.Length == 1 ? 0 : interpreter.IntegerStack.Pop().AsInt(str.Length);
+      var c = str[index].ToString();
+      interpreter.StringStack.Top = c;
+    }
+  }
+
+  /// <summary>
+  /// Removes first char of top STRING.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.REST",
+    "Removes first char of top STRING.")]
+  public class StringRestExpression : StatelessExpression {
+    public StringRestExpression() { }
+    [StorableConstructor]
+    protected StringRestExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.StringStack.Top.Length == 0;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Top;
+      interpreter.StringStack.Top = str.Length == 1 ? string.Empty : str.Substring(1, str.Length - 1);
+    }
+  }
+
+  /// <summary>
+  /// Removes last char of top STRING.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.BUTLAST",
+    "Removes last char of top STRING.")]
+  public class StringButLastExpression : StatelessExpression {
+    public StringButLastExpression() { }
+    [StorableConstructor]
+    protected StringButLastExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.StringStack.Top.Length == 0;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Top;
+      interpreter.StringStack.Top = str.Length == 1 ? string.Empty : str.Substring(0, str.Length - 1);
+    }
+  }
+
+  /// <summary>
+  /// Pushes length of top STRING onto the INTEGER stack.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.LENGTH",
+    "Pushes length of top STRING onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class StringLengthExpression : StatelessExpression {
+    public StringLengthExpression() { }
+    [StorableConstructor]
+    protected StringLengthExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Pop();
+      interpreter.IntegerStack.Push(str.Length);
+    }
+  }
+
+  /// <summary>
+  /// Reverses the top STRING.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.REVERSE",
+    "Reverses the top STRING.")]
+  public class StringReverseExpression : StatelessExpression {
+    public StringReverseExpression() { }
+    [StorableConstructor]
+    protected StringReverseExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty || interpreter.StringStack.Top.Length <= 1;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var chars = interpreter.StringStack.Top.ToArray();
+      Array.Reverse(chars);
+      interpreter.StringStack.Top = new string(chars);
+    }
+  }
+
+  /// <summary>
+  /// Maps every char of top STRING as separate string.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.PARSETOCHARS",
+    "Maps every char of top STRING as separate string.")]
+  public class StringParseToCharsExpression : StatelessExpression {
+    public StringParseToCharsExpression() { }
+    [StorableConstructor]
+    protected StringParseToCharsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      if (interpreter.StringStack.Top.Length == 0) {
+        interpreter.StringStack.Pop();
+        return;
+      }
+
+      var str = interpreter.StringStack.Top;
+      interpreter.StringStack.Top = str[0].ToString();
+
+      if (str.Length > 1) {
+        var chars = new string[str.Length - 1];
+        for (var i = 0; i < str.Length - 1; i++) {
+          chars[i] = str[i + 1].ToString();
+        }
+
+        interpreter.StringStack.Push(chars);
+      }
+    }
+  }
+
+  /// <summary>
+  /// Splits top STRING by whitespace chars.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.SPLIT",
+    "Splits top STRING by whitespace chars.")]
+  public class StringSplitExpression : StatelessExpression {
+    public StringSplitExpression() { }
+    [StorableConstructor]
+    protected StringSplitExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var words = interpreter.StringStack.Top
+        .Trim()
+        .Split()
+        .Where(x => !string.IsNullOrWhiteSpace(x))
+        .Reverse()
+        .ToList();
+
+      if (words.Count == 0) {
+        interpreter.StringStack.Pop();
+      } else {
+        interpreter.StringStack.Top = words[0];
+        interpreter.StringStack.Push(words, 1);
+      }
+    }
+  }
+
+  /// <summary>
+  /// True if top string is empty.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.EMPTYSTRING",
+    "True if top STRING is empty.",
+    StackTypes.Boolean)]
+  public class StringEmptyStringExpression : StatelessExpression {
+    public StringEmptyStringExpression() { }
+    [StorableConstructor]
+    protected StringEmptyStringExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Pop();
+      interpreter.BooleanStack.Push(str.Length == 0);
+    }
+  }
+
+  /// <summary>
+  /// True if top string is a substring of second string; false otherwise
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.CONTAINS",
+    "True if top STRING is a substring of second STRING, false otherwise.",
+    StackTypes.Boolean)]
+  public class StringContainsExpression : StatelessExpression {
+    public StringContainsExpression() { }
+    [StorableConstructor]
+    protected StringContainsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.StringStack[1];
+      var second = interpreter.StringStack.Top;
+      interpreter.StringStack.Remove(2);
+
+      interpreter.BooleanStack.Push(first.IndexOf(second, StringComparison.Ordinal) >= 0);
+    }
+  }
+
+  /// <summary>
+  /// True if the top char is in the top string
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.CONTAINSCHAR",
+    "True if the top CHAR is in the top STRING.",
+    StackTypes.Boolean | StackTypes.Char)]
+  public class StringContainsCharExpression : StatelessExpression {
+    public StringContainsCharExpression() { }
+    [StorableConstructor]
+    protected StringContainsCharExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Pop();
+      var c = interpreter.CharStack.Pop();
+
+      interpreter.BooleanStack.Push(str.IndexOf(c) >= 0);
+    }
+  }
+
+  /// <summary>
+  /// Puts on the integer stack the index of the top char in the top string
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.INDEXOFCHAR",
+    "Puts on the INTEGER stack the index of the top CHAR in the top STRING.",
+    StackTypes.Integer | StackTypes.Char)]
+  public class StringIndexOfCharExpression : StatelessExpression {
+    public StringIndexOfCharExpression() { }
+    [StorableConstructor]
+    protected StringIndexOfCharExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Pop();
+      var c = interpreter.CharStack.Pop();
+
+      interpreter.IntegerStack.Push(str.IndexOf(c));
+    }
+  }
+
+  /// <summary>
+  /// The number of times the top char is in the top string
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.OCCURRENCESOFCHAR",
+    "The number of times the top CHAR is in the top STRING.",
+    StackTypes.Integer | StackTypes.Char)]
+  public class StringOccurrencesOfCharExpression : StatelessExpression {
+    public StringOccurrencesOfCharExpression() { }
+    [StorableConstructor]
+    protected StringOccurrencesOfCharExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Pop();
+      var c = interpreter.CharStack.Pop();
+
+      var count = 0;
+      for (var i = 0; i < str.Length; i++)
+        if (str[i] == c) count++;
+
+      interpreter.IntegerStack.Push(count);
+    }
+  }
+
+  /// <summary>
+  /// In third STRING, replaces second string with first string
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.REPLACE",
+    "In third STRING, replaces second STRING with first STRING.")]
+  public class StringReplaceExpression : StatelessExpression {
+    public StringReplaceExpression() { }
+    [StorableConstructor]
+    protected StringReplaceExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var result = GetResultString(interpreter);
+
+      // Should be checked in isNoop but would require to calculate result twice which is an expensive operation
+      if (result.Length > interpreter.Configuration.MaxStringLength)
+        return;
+
+      interpreter.StringStack.Remove(2);
+      interpreter.StringStack.Top = result;
+    }
+
+    private static string GetResultString(IInternalPushInterpreter interpreter) {
+      var third = interpreter.StringStack[2];
+      var second = interpreter.StringStack[1];
+      var first = interpreter.StringStack[0];
+
+      var result = third.Length == 0 || second.Length == 0
+        ? third
+        : third.Replace(second, first);
+
+      return result;
+    }
+  }
+
+  /// <summary>
+  /// In third STRING, replaces first occurrence of second string with first string
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.REPLACEFIRST",
+    "In third STRING, replaces first occurrence of second STRING with first STRING")]
+  public class StringReplaceFirstExpression : StatelessExpression {
+    public StringReplaceFirstExpression() { }
+    [StorableConstructor]
+    protected StringReplaceFirstExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.Count < 3;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var result = GetResultString(interpreter);
+
+      // Should be checked in isNoop but would require to calculate result twice which is an expensive operation
+      if (result.Length > interpreter.Configuration.MaxStringLength)
+        return;
+
+      interpreter.StringStack.Remove(2);
+      interpreter.StringStack.Top = result;
+    }
+
+    private static string GetResultString(IInternalPushInterpreter interpreter) {
+      var third = interpreter.StringStack[2];
+      var second = interpreter.StringStack[1];
+      var first = interpreter.StringStack[0];
+
+      var result = third.Length == 0 || second.Length == 0
+        ? third
+        : ReplaceFirst(third, second, first);
+      return result;
+    }
+
+    private static string ReplaceFirst(string text, string search, string replace) {
+      var pos = text.IndexOf(search, StringComparison.Ordinal);
+      return pos < 0 ? text : text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
+    }
+  }
+
+  /// <summary>
+  /// In top STRING, replaces all occurrences of second char with first char
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.REPLACECHAR",
+    "In top STRING, replaces all occurrences of second CHAR with first CHAR.",
+    StackTypes.Char)]
+  public class StringReplaceCharExpression : StatelessExpression {
+    public StringReplaceCharExpression() { }
+    [StorableConstructor]
+    protected StringReplaceCharExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.CharStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var first = interpreter.CharStack[1];
+      var second = interpreter.CharStack.Top;
+      interpreter.CharStack.Remove(2);
+
+      var result = interpreter.StringStack.Top.Replace(first, second);
+      interpreter.StringStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// In top STRING, replaces first occurrence of second char with first char
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.REPLACEFIRSTCHAR",
+    "In top STRING, replaces first occurrence of second CHAR with first CHAR.",
+    StackTypes.Char)]
+  public class StringReplaceFirstCharExpression : StatelessExpression {
+    public StringReplaceFirstCharExpression() { }
+    [StorableConstructor]
+    protected StringReplaceFirstCharExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.CharStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Top;
+      var first = interpreter.CharStack[1];
+      var second = interpreter.CharStack.Top;
+      interpreter.CharStack.Remove(2);
+
+      var pos = str.IndexOf(first);
+
+      if (pos < 0)
+        return;
+
+      var result = str.Substring(0, pos) +
+                   second +
+                   str.Substring(Math.Min(pos + 1, str.Length - 1));
+
+      interpreter.StringStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// In top STRING, remove all occurrences of char
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.REMOVECHAR",
+    "In top STRING, remove all occurrences of top CHAR.",
+    StackTypes.Char)]
+  public class StringRemoveCharExpression : StatelessExpression {
+    public StringRemoveCharExpression() { }
+    [StorableConstructor]
+    protected StringRemoveCharExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.CharStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var c = interpreter.CharStack.Pop();
+      var result = interpreter.StringStack.Top.Trim(c);
+      interpreter.StringStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Sets char at index in string
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.SETCHAR",
+    "Sets top CHAR at index in top STRING, whereby the index is taken from the INTEGER stack.",
+    StackTypes.Char | StackTypes.Integer)]
+  public class StringSetCharExpression : StatelessExpression {
+    public StringSetCharExpression() { }
+    [StorableConstructor]
+    protected StringSetCharExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.CharStack.IsEmpty ||
+             interpreter.IntegerStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Top;
+      var c = interpreter.CharStack.Pop();
+      var x = interpreter.IntegerStack.Pop();
+
+      if (str.Length == 0) return;
+      if (str.Length == 1) {
+        interpreter.StringStack.Top = c.ToString();
+        return;
+      }
+
+      var pos = x.AsInt(str.Length);
+      var result = str.Substring(0, pos) + c + str.Substring(Math.Min(pos + 1, str.Length - 1));
+
+      interpreter.StringStack.Top = result;
+    }
+  }
+
+  /// <summary>
+  /// Iterates over a string using the code on the exec stack.
+  /// </summary>
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.ITERATE",
+    "Iterates over the top STRING using the CODE on the EXEC stack.",
+    StackTypes.Exec | StackTypes.Char, requiredBlockCount: 1)]
+  public class StringIterateExpression : StatelessExpression {
+    public StringIterateExpression() { }
+    [StorableConstructor]
+    protected StringIterateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.IsEmpty ||
+             interpreter.ExecStack.IsEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      var str = interpreter.StringStack.Pop();
+
+      if (str.Length == 0) {
+        interpreter.ExecStack.Pop();
+      }
+      // If the rest of the string is empty, we're done iterating.
+      else if (str.Length == 1) {
+        interpreter.CharStack.Push(str[0]);
+      } else {
+        var pool = interpreter.PoolContainer.GetStatefulExpressionPool<StringPushExpression>();
+
+        interpreter.CharStack.Push(str[0]);
+        interpreter.ExecStack.Push(
+          this,
+          StringPushExpression.Create(pool, str.Substring(1)),
+          interpreter.ExecStack.Top);
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/SwapExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/SwapExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/SwapExpressions.cs	(revision 15771)
@@ -0,0 +1,248 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  ///     Swaps the top two values.
+  /// </summary>
+  /// <typeparam name="T">Stacktype</typeparam>
+  [StorableClass]
+  public abstract class SwapExpression<T> : StatelessExpression {
+    protected SwapExpression() { }
+    [StorableConstructor]
+    protected SwapExpression(bool deserializing) : base(deserializing) { }
+
+    protected void Eval(IPushStack<T> stack) {
+      stack.Swap(2);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.SWAP",
+    "Swaps the top two items on the stack.")]
+  public class IntegerSwapExpression : SwapExpression<long> {
+    public IntegerSwapExpression() { }
+    [StorableConstructor]
+    protected IntegerSwapExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.SWAP",
+    "Swaps the top two items on the stack.")]
+  public class FloatSwapExpression : SwapExpression<double> {
+    public FloatSwapExpression() { }
+    [StorableConstructor]
+    protected FloatSwapExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Boolean,
+    "BOOLEAN.SWAP",
+    "Swaps the top two items on the stack.")]
+  public class BooleanSwapExpression : SwapExpression<bool> {
+    public BooleanSwapExpression() { }
+    [StorableConstructor]
+    protected BooleanSwapExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Name,
+    "NAME.SWAP",
+    "Swaps the top two items on the stack.")]
+  public class NameSwapExpression : SwapExpression<string> {
+    public NameSwapExpression() { }
+    [StorableConstructor]
+    protected NameSwapExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.NameStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.NameStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.SWAP",
+    "Swaps the top two items on the stack.",
+    requiredBlockCount: 2)]
+  public class ExecSwapExpression : SwapExpression<Expression> {
+    public ExecSwapExpression() { }
+    [StorableConstructor]
+    protected ExecSwapExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.ExecStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.ExecStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.SWAP",
+    "Swaps the top two items on the stack.")]
+  public class CodeSwapExpression : SwapExpression<Expression> {
+    public CodeSwapExpression() { }
+    [StorableConstructor]
+    protected CodeSwapExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CodeStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CodeStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.SWAP",
+    "Swaps the top two items on the stack.")]
+  public class CharSwapExpression : SwapExpression<char> {
+    public CharSwapExpression() { }
+    [StorableConstructor]
+    protected CharSwapExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.CharStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CharStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.SWAP",
+    "Swaps the top two items on the stack.")]
+  public class StringSwapExpression : SwapExpression<string> {
+    public StringSwapExpression() { }
+    [StorableConstructor]
+    protected StringSwapExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].SWAP",
+    "Swaps the top two items on the stack.")]
+  public class IntegerVectorSwapExpression : SwapExpression<IReadOnlyList<long>> {
+    public IntegerVectorSwapExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorSwapExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.IntegerVectorStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].SWAP",
+    "Swaps the top two items on the stack.")]
+  public class FloatVectorSwapExpression : SwapExpression<IReadOnlyList<double>> {
+    public FloatVectorSwapExpression() { }
+    [StorableConstructor]
+    protected FloatVectorSwapExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.FloatVectorStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].SWAP",
+    "Swaps the top two items on the stack.")]
+  public class BooleanVectorSwapExpression : SwapExpression<IReadOnlyList<bool>> {
+    public BooleanVectorSwapExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorSwapExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.BooleanVectorStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].SWAP",
+    "Swaps the top two items on the stack.")]
+  public class StringVectorSwapExpression : SwapExpression<IReadOnlyList<string>> {
+    public StringVectorSwapExpression() { }
+    [StorableConstructor]
+    protected StringVectorSwapExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.StringVectorStack.Count < 2;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorButLastExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorButLastExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorButLastExpressions.cs	(revision 15771)
@@ -0,0 +1,102 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Takes the rest of the top item on the type stack.
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorButLastExpression<T> : StatelessExpression {
+    protected VectorButLastExpression() { }
+    [StorableConstructor]
+    protected VectorButLastExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack) {
+      return vectorStack.IsEmpty || vectorStack.Top.Count < 2;
+    }
+
+    protected void Eval(IPushStack<IReadOnlyList<T>> vectorStack) {
+      vectorStack.Top = vectorStack.Top
+        .Take(vectorStack.Top.Count - 1)
+        .ToList();
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].BUTLAST",
+    "Takes the rest of the top item on the INTEGER[] stack.")]
+  public class IntegerVectorButLastExpression : VectorButLastExpression<long> {
+    public IntegerVectorButLastExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorButLastExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].BUTLAST",
+    "Takes the rest of the top item on the FLOAT[] stack.")]
+  public class FloatVectorButLastExpression : VectorButLastExpression<double> {
+    public FloatVectorButLastExpression() { }
+    [StorableConstructor]
+    protected FloatVectorButLastExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].BUTLAST",
+    "Takes the rest of the top item on the BOOLEAN[] stack.")]
+  public class BooleanVectorButLastExpression : VectorButLastExpression<bool> {
+    public BooleanVectorButLastExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorButLastExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].BUTLAST",
+    "Takes the rest of the top item on the STRING[] stack.")]
+  public class StringVectorButLastExpression : VectorButLastExpression<string> {
+    public StringVectorButLastExpression() { }
+    [StorableConstructor]
+    protected StringVectorButLastExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorConcatExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorConcatExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorConcatExpressions.cs	(revision 15771)
@@ -0,0 +1,105 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Concatinates two vectors on the type stack.
+  /// </summary>
+  [StorableClass]
+  public abstract class VectorConcatExpression<T> : StatelessExpression {
+    protected VectorConcatExpression() { }
+    [StorableConstructor]
+    protected VectorConcatExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IInternalPushInterpreter interpreter, IPushStack<IReadOnlyList<T>> vectorStack) {
+      return vectorStack.Count < 2 ||
+             vectorStack.Top.Count + vectorStack[1].Count > interpreter.Configuration.MaxVectorLength;
+    }
+
+    protected void Eval(IInternalPushInterpreter interpter, IPushStack<IReadOnlyList<T>> vectorStack) {
+      var first = vectorStack.Pop();
+      var second = vectorStack.Top;
+      var result = new List<T>(second.Count + first.Count);
+      result.AddRange(second);
+      result.AddRange(first);
+
+      vectorStack.Top = result;
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].CONCAT",
+    "Concatenates the top two vectors on the INTEGER[] stack.")]
+  public class IntegerVectorConcatExpression : VectorConcatExpression<long> {
+    public IntegerVectorConcatExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorConcatExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.IntegerVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.IntegerVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].CONCAT",
+    "Concatenates the top two vectors on the FLOAT[] stack.")]
+  public class FloatVectorConcatExpression : VectorConcatExpression<double> {
+    public FloatVectorConcatExpression() { }
+    [StorableConstructor]
+    protected FloatVectorConcatExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.FloatVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.FloatVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].CONCAT",
+    "Concatenates the top two vectors on the BOOLEAN[] stack.")]
+  public class BooleanVectorConcatExpression : VectorConcatExpression<bool> {
+    public BooleanVectorConcatExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorConcatExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.BooleanVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.BooleanVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].CONCAT",
+    "Concatenates the top two vectors on the STRING[] stack.")]
+  public class StringVectorConcatExpression : VectorConcatExpression<string> {
+    public StringVectorConcatExpression() { }
+    [StorableConstructor]
+    protected StringVectorConcatExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.StringVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorConjExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorConjExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorConjExpressions.cs	(revision 15771)
@@ -0,0 +1,105 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Conj's an item onto the type stack.
+  /// </summary>
+  [StorableClass]
+  public abstract class VectorConjExpression<T> : StatelessExpression {
+    protected VectorConjExpression() { }
+    [StorableConstructor]
+    protected VectorConjExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IInternalPushInterpreter interpreter, IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      return vectorStack.IsEmpty ||
+             literalStack.IsEmpty ||
+             vectorStack.Top.Count + 1 > interpreter.Configuration.MaxVectorLength;
+    }
+
+    protected void Eval(IInternalPushInterpreter interpreter, IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      var literal = literalStack.Pop();
+      vectorStack.Top = new List<T>(vectorStack.Top) { literal };
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].CONJ",
+    "Conj's the top INTEGER onto the top item of the INTEGER[] stack.",
+    StackTypes.Integer)]
+  public class IntegerVectorConjExpression : VectorConjExpression<long> {
+    public IntegerVectorConjExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorConjExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].CONJ",
+    "Conj's the top FLOAT onto the top item of the FLOAT[] stack.",
+    StackTypes.Float)]
+  public class FloatVectorConjExpression : VectorConjExpression<double> {
+    public FloatVectorConjExpression() { }
+    [StorableConstructor]
+    protected FloatVectorConjExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].CONJ",
+    "Conj's the top STRING onto the top item of the STRING[] stack.",
+    StackTypes.String)]
+  public class StringVectorConjExpression : VectorConjExpression<string> {
+    public StringVectorConjExpression() { }
+    [StorableConstructor]
+    protected StringVectorConjExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.StringVectorStack, interpreter.StringStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.StringVectorStack, interpreter.StringStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].CONJ",
+    "Conj's the top BOOLEAN onto the top item of the BOOLEAN[] stack.",
+    StackTypes.Boolean)]
+  public class BooleanVectorConjExpression : VectorConjExpression<bool> {
+    public BooleanVectorConjExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorConjExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorContainsExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorContainsExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorContainsExpressions.cs	(revision 15771)
@@ -0,0 +1,110 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Tells whether the top lit-type item is in the top type vector.
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorContainsExpression<T> : StatelessExpression {
+    protected VectorContainsExpression() { }
+    [StorableConstructor]
+    protected VectorContainsExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      return vectorStack.IsEmpty || literalStack.IsEmpty;
+    }
+
+    protected void Eval(IInternalPushInterpreter interpreter, IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack, bool canOverride = false) {
+      var vector = vectorStack.Pop();
+      var literal = canOverride ? literalStack.Top : literalStack.Pop();
+      var contains = vector.Contains(literal);
+
+      if (canOverride) interpreter.BooleanStack.Top = contains;
+      else interpreter.BooleanStack.Push(contains);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].CONTAINS",
+    "Tells whether the top INTEGER is in the top INTEGER[].",
+    StackTypes.Integer | StackTypes.Boolean)]
+  public class IntegerVectorContainsExpression : VectorContainsExpression<long> {
+    public IntegerVectorContainsExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorContainsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].CONTAINS",
+    "Tells whether the top FLOAT is in the top FLOAT[].",
+    StackTypes.Float | StackTypes.Boolean)]
+  public class FloatVectorContainsExpression : VectorContainsExpression<double> {
+    public FloatVectorContainsExpression() { }
+    [StorableConstructor]
+    protected FloatVectorContainsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].CONTAINS",
+    "Tells whether the top BOOLEAN is in the top BOOLEAN[].",
+    StackTypes.Boolean)]
+  public class BooleanVectorContainsExpression : VectorContainsExpression<bool> {
+    public BooleanVectorContainsExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorContainsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.BooleanVectorStack, interpreter.BooleanStack, true);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].CONTAINS",
+    "Tells whether the top STRING is in the top STRING[].",
+    StackTypes.String | StackTypes.Boolean)]
+  public class StringVectorContainsExpression : VectorContainsExpression<string> {
+    public StringVectorContainsExpression() { }
+    [StorableConstructor]
+    protected StringVectorContainsExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack, interpreter.StringStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.StringVectorStack, interpreter.StringStack);
+    }
+  }
+
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorEmptyExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorEmptyExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorEmptyExpressions.cs	(revision 15771)
@@ -0,0 +1,104 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Pushes a boolean of whether the top vector is empty.
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorEmptyVectorExpression<T> : StatelessExpression {
+    protected VectorEmptyVectorExpression() { }
+    [StorableConstructor]
+    protected VectorEmptyVectorExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack) {
+      return vectorStack.IsEmpty;
+    }
+
+    protected void Eval(IInternalPushInterpreter interpreter, IPushStack<IReadOnlyList<T>> vectorStack) {
+      var vector = vectorStack.Pop();
+      interpreter.BooleanStack.Push(vector.Count == 0);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].EMPTYVECTOR",
+    "Pushes a BOOLEAN of whether the top INTEGER[] is empty.",
+    StackTypes.Boolean)]
+  public class IntegerVectorEmptyVectorExpression : VectorEmptyVectorExpression<long> {
+    public IntegerVectorEmptyVectorExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorEmptyVectorExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.IntegerVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].EMPTYVECTOR",
+    "Pushes a BOOLEAN of whether the top FLOAT[] is empty.",
+    StackTypes.Boolean)]
+  public class FloatVectorEmptyVectorExpression : VectorEmptyVectorExpression<double> {
+    public FloatVectorEmptyVectorExpression() { }
+    [StorableConstructor]
+    protected FloatVectorEmptyVectorExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.FloatVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].EMPTYVECTOR",
+    "Pushes a BOOLEAN of whether the top BOOLEAN[] is empty.",
+    StackTypes.Boolean)]
+  public class BooleanVectorEmptyVectorExpression : VectorEmptyVectorExpression<bool> {
+    public BooleanVectorEmptyVectorExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorEmptyVectorExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.BooleanVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].EMPTYVECTOR",
+    "Pushes a BOOLEAN of whether the top STRING[] is empty.",
+    StackTypes.Boolean)]
+  public class StringVectorEmptyVectorExpression : VectorEmptyVectorExpression<string> {
+    public StringVectorEmptyVectorExpression() { }
+    [StorableConstructor]
+    protected StringVectorEmptyVectorExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorFirstExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorFirstExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorFirstExpressions.cs	(revision 15771)
@@ -0,0 +1,105 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Gets the first item from the type stack
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorFirstExpression<T> : StatelessExpression {
+    protected VectorFirstExpression() { }
+    [StorableConstructor]
+    protected VectorFirstExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack) {
+      return vectorStack.IsEmpty || vectorStack.Top.Count == 0;
+    }
+
+    protected void Eval(IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      var vector = vectorStack.Pop();
+      literalStack.Push(vector[0]);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].FIRST",
+    "Pushes the first INTEGER of the top INTEGER[].",
+    StackTypes.Integer)]
+  public class IntegerVectorFirstExpression : VectorFirstExpression<long> {
+    public IntegerVectorFirstExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorFirstExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].FIRST",
+    "Pushes the first FLOAT of the top FLOAT[].",
+    StackTypes.Float)]
+  public class FloatVectorFirstExpression : VectorFirstExpression<double> {
+    public FloatVectorFirstExpression() { }
+    [StorableConstructor]
+    protected FloatVectorFirstExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].FIRST",
+    "Pushes the first BOOLEAN of the top BOOLEAN[].",
+    StackTypes.Boolean)]
+  public class BooleanVectorFirstExpression : VectorFirstExpression<bool> {
+    public BooleanVectorFirstExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorFirstExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].FIRST",
+    "Pushes the first BOOLEAN of the top BOOLEAN[].",
+    StackTypes.String)]
+  public class StringVectorFirstExpression : VectorFirstExpression<string> {
+    public StringVectorFirstExpression() { }
+    [StorableConstructor]
+    protected StringVectorFirstExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack, interpreter.StringStack);
+    }
+  }
+}
+
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorIndexOfExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorIndexOfExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorIndexOfExpressions.cs	(revision 15771)
@@ -0,0 +1,119 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Finds the index of the top lit-type item in the top type vector.
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorIndexOfExpression<T> : StatelessExpression {
+    protected VectorIndexOfExpression() { }
+    [StorableConstructor]
+    protected VectorIndexOfExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      return vectorStack.IsEmpty || literalStack.IsEmpty;
+    }
+
+    protected void Eval(
+      IInternalPushInterpreter interpreter,
+      IPushStack<IReadOnlyList<T>> vectorStack,
+      IPushStack<T> literalStack,
+      bool canOverride = false) {
+      var vector = vectorStack.Pop();
+      var literal = canOverride ? literalStack.Top : literalStack.Pop();
+
+      var index = -1;
+      for (var i = 0; i < vector.Count && index < 0; i++) {
+        if (vector[i].Equals(literal)) {
+          index = i;
+          break;
+        }
+      }
+
+      if (canOverride) interpreter.IntegerStack.Top = index;
+      else interpreter.IntegerStack.Push(index);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].INDEXOF",
+    "Pushes the index of the top INTEGER in the top INTEGER[] onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class IntegerVectorIndexOfExpression : VectorIndexOfExpression<long> {
+    public IntegerVectorIndexOfExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorIndexOfExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.IntegerVectorStack, interpreter.IntegerStack, true);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].INDEXOF",
+    "Pushes the index of the top FLOAT in the top FLOAT[] onto the INTEGER stack.",
+    StackTypes.Float | StackTypes.Integer)]
+  public class FloatVectorIndexOfExpression : VectorIndexOfExpression<double> {
+    public FloatVectorIndexOfExpression() { }
+    [StorableConstructor]
+    protected FloatVectorIndexOfExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].INDEXOF",
+    "Pushes the index of the top BOOLEAN in the top BOOLEAN[] onto the INTEGER stack.",
+    StackTypes.Boolean | StackTypes.Integer)]
+  public class BooleanVectorIndexOfExpression : VectorIndexOfExpression<bool> {
+    public BooleanVectorIndexOfExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorIndexOfExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].INDEXOF",
+    "Pushes the index of the top STRING in the top STRING[] onto the INTEGER stack.",
+    StackTypes.String | StackTypes.Integer)]
+  public class StringVectorIndexOfExpression : VectorIndexOfExpression<string> {
+    public StringVectorIndexOfExpression() { }
+    [StorableConstructor]
+    protected StringVectorIndexOfExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack, interpreter.StringStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.StringVectorStack, interpreter.StringStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorIterateExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorIterateExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorIterateExpressions.cs	(revision 15771)
@@ -0,0 +1,138 @@
+﻿using System.Collections.Generic;
+using System;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Iterates in reverse order (due to performance reasons) over the type vector using the code on the exec stack.If the vector isn't empty, expands to:
+  /// ((first vector) (top-item :exec state) (rest vector) exec_do*vector_type (top-item :exec state) rest_of_program)
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorIterateExpression<T> : StatelessExpression {
+    protected VectorIterateExpression() { }
+    [StorableConstructor]
+    protected VectorIterateExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IInternalPushInterpreter interpter, IPushStack<IReadOnlyList<T>> vectorStack) {
+      return vectorStack.IsEmpty || interpter.ExecStack.IsEmpty;
+    }
+
+    protected void Eval(IInternalPushInterpreter interpter, IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      var vector = vectorStack.Top;
+
+      if (vector.Count == 0) {
+        interpter.ExecStack.Pop();
+        vectorStack.Pop();
+      } else if (vector.Count == 1) {
+        literalStack.Push(vector[0]);
+        vectorStack.Pop();
+      } else {
+        interpter.ExecStack.Push(this, interpter.ExecStack.Top);
+
+        var last = vector.Count - 1;
+        literalStack.Push(vector[last]);
+
+        var list = vector as List<T>;
+        if (list != null) {
+          var newTop = new T[last];
+          list.CopyTo(0, newTop, 0, last);
+          vectorStack.Top = newTop;
+          return;
+        }
+
+        var array = vector as T[];
+        if (array != null) {
+          var newTop = new T[last];
+          Array.Copy(array, 0, newTop, 0, last);
+          vectorStack.Top = newTop;
+          return;
+        }
+
+        vectorStack.Top = vector.Take(last).ToList();
+      }
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].ITERATE",
+    "Iterates in reverse order (due to performance reasons) over the top INTEGER[] using the top item of the EXEC stack.",
+    StackTypes.Integer | StackTypes.Exec,
+    requiredBlockCount: 1)]
+  public class IntegerVectorIterateExpression : VectorIterateExpression<long> {
+    public IntegerVectorIterateExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorIterateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.IntegerVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].ITERATE",
+    "Iterates in reverse order (due to performance reasons) over the top FLOAT[] using the top item of the EXEC stack.",
+    StackTypes.Float | StackTypes.Exec, requiredBlockCount: 1)]
+  public class FloatVectorIterateExpression : VectorIterateExpression<double> {
+    public FloatVectorIterateExpression() { }
+    [StorableConstructor]
+    protected FloatVectorIterateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.FloatVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].ITERATE",
+    "Iterates in reverse order (due to performance reasons) over the top BOOLEAN[] using the top item of the EXEC stack.",
+    StackTypes.Boolean | StackTypes.Exec, requiredBlockCount: 1)]
+  public class BooleanVectorIterateExpression : VectorIterateExpression<bool> {
+    public BooleanVectorIterateExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorIterateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.BooleanVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].ITERATE",
+    "Iterates in reverse order (due to performance reasons) over the top STRING[] using the top item of the EXEC stack.",
+    StackTypes.String | StackTypes.Exec, requiredBlockCount: 1)]
+  public class StringVectorIterateExpression : VectorIterateExpression<string> {
+    public StringVectorIterateExpression() { }
+    [StorableConstructor]
+    protected StringVectorIterateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.StringVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.StringVectorStack, interpreter.StringStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorLastExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorLastExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorLastExpressions.cs	(revision 15771)
@@ -0,0 +1,105 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Gets the last item from the type stack
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorLastExpression<T> : StatelessExpression {
+    protected VectorLastExpression() { }
+    [StorableConstructor]
+    protected VectorLastExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack) {
+      return vectorStack.IsEmpty || vectorStack.Top.Count == 0;
+    }
+
+    protected void Eval(IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      var vector = vectorStack.Pop();
+      literalStack.Push(vector[vector.Count - 1]);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].LAST",
+    "Gets the last item from the top INTEGER[].",
+    StackTypes.Integer)]
+  public class IntegerVectorLastExpression : VectorLastExpression<long> {
+    public IntegerVectorLastExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorLastExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].LAST",
+    "Gets the last item from the top FLOAT[].",
+    StackTypes.Float)]
+  public class FloatVectorLastExpression : VectorLastExpression<double> {
+    public FloatVectorLastExpression() { }
+    [StorableConstructor]
+    protected FloatVectorLastExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].LAST",
+    "Gets the last item from the top BOOLEAN[].",
+    StackTypes.Boolean)]
+  public class BooleanVectorLastExpression : VectorLastExpression<bool> {
+    public BooleanVectorLastExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorLastExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].LAST",
+    "Gets the last item from the top STRING[].",
+    StackTypes.String)]
+  public class StringVectorLastExpression : VectorLastExpression<string> {
+    public StringVectorLastExpression() { }
+    [StorableConstructor]
+    protected StringVectorLastExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack, interpreter.StringStack);
+    }
+  }
+}
+
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorLengthExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorLengthExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorLengthExpressions.cs	(revision 15771)
@@ -0,0 +1,104 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Takes the length of the top item on the type stack
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorLengthExpression<T> : StatelessExpression {
+    protected VectorLengthExpression() { }
+    [StorableConstructor]
+    protected VectorLengthExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack) {
+      return vectorStack.IsEmpty;
+    }
+
+    protected void Eval(IInternalPushInterpreter interpreter, IPushStack<IReadOnlyList<T>> vectorStack) {
+      var length = vectorStack.Pop().Count;
+      interpreter.IntegerStack.Push(length);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].LENGTH",
+    "Pushes the length of the top INTEGER[] on the INTEGER stack",
+    StackTypes.Integer)]
+  public class IntegerVectorLengthExpression : VectorLengthExpression<long> {
+    public IntegerVectorLengthExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorLengthExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.IntegerVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].LENGTH",
+    "Pushes the length of the top FLOAT[] on the INTEGER stack",
+    StackTypes.Integer)]
+  public class FloatVectorLengthExpression : VectorLengthExpression<double> {
+    public FloatVectorLengthExpression() { }
+    [StorableConstructor]
+    protected FloatVectorLengthExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.FloatVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].LENGTH",
+    "Pushes the length of the top BOOLEAN[] on the INTEGER stack",
+    StackTypes.Integer)]
+  public class BooleanVectorLengthExpression : VectorLengthExpression<bool> {
+    public BooleanVectorLengthExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorLengthExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.BooleanVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].LENGTH",
+    "Pushes the length of the top STRING[] on the INTEGER stack",
+    StackTypes.Integer)]
+  public class StringVectorLengthExpression : VectorLengthExpression<string> {
+    public StringVectorLengthExpression() { }
+    [StorableConstructor]
+    protected StringVectorLengthExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorNthExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorNthExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorNthExpressions.cs	(revision 15771)
@@ -0,0 +1,116 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Gets the nth item from the type stack
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorNthExpression<T> : StatelessExpression {
+    protected VectorNthExpression() { }
+    [StorableConstructor]
+    protected VectorNthExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IInternalPushInterpreter interpreter, IPushStack<IReadOnlyList<T>> vectorStack) {
+      return vectorStack.IsEmpty ||
+             vectorStack.Top.Count == 0 ||
+             interpreter.IntegerStack.IsEmpty;
+    }
+
+    protected void Eval(
+      IInternalPushInterpreter interpreter,
+      IPushStack<IReadOnlyList<T>> vectorStack,
+      IPushStack<T> literalStack) {
+      var vector = vectorStack.Pop();
+
+      if (literalStack == interpreter.IntegerStack) {
+        var n = interpreter.IntegerStack.Top.AsInt(vector.Count);
+        literalStack.Top = vector[n];
+      } else {
+        var n = interpreter.IntegerStack.Pop().AsInt(vector.Count);
+        literalStack.Push(vector[n]);
+      }
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].NTH",
+    "Pushes the nth item from the top INTEGER[] onto the INTEGER stack, whereby n is taken from the INTEGER stack.",
+    StackTypes.Integer)]
+  public class IntegerVectorNthExpression : VectorNthExpression<long> {
+    public IntegerVectorNthExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorNthExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.IntegerVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].NTH",
+    "Pushes the nth item from the top FLOAT[] onto the FLOAT stack, whereby n is taken from the INTEGER stack.",
+    StackTypes.Float | StackTypes.Integer)]
+  public class FloatVectorNthExpression : VectorNthExpression<double> {
+    public FloatVectorNthExpression() { }
+    [StorableConstructor]
+    protected FloatVectorNthExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.FloatVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].NTH",
+    "Pushes the nth item from the top BOOLEAN[] onto the BOOLEAN stack, whereby n is taken from the INTEGER stack.",
+    StackTypes.Boolean | StackTypes.Integer)]
+  public class BooleanVectorNthExpression : VectorNthExpression<bool> {
+    public BooleanVectorNthExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorNthExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.BooleanVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].NTH",
+    "Pushes the nth item from the top STRING[] onto the BOOLEAN stack, whereby n is taken from the INTEGER stack.",
+    StackTypes.String | StackTypes.Integer)]
+  public class StringVectorNthExpression : VectorNthExpression<string> {
+    public StringVectorNthExpression() { }
+    [StorableConstructor]
+    protected StringVectorNthExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.StringVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.StringVectorStack, interpreter.StringStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorOccurrenceOfExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorOccurrenceOfExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorOccurrenceOfExpressions.cs	(revision 15771)
@@ -0,0 +1,116 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Counts the occurrences of the top lit-type item in the top type vector.
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorOccurrenceOfExpression<T> : StatelessExpression {
+    protected VectorOccurrenceOfExpression() { }
+    [StorableConstructor]
+    protected VectorOccurrenceOfExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      return vectorStack.IsEmpty || literalStack.IsEmpty;
+    }
+
+    protected void Eval(
+      IInternalPushInterpreter interpreter,
+      IPushStack<IReadOnlyList<T>> vectorStack,
+      IPushStack<T> literalStack,
+      bool canOverride = false) {
+      var vector = vectorStack.Pop();
+      var literal = canOverride ? literalStack.Top : literalStack.Pop();
+
+      var occurrence = 0;
+      for (var i = 0; i < vector.Count; i++) {
+        if (vector[i].Equals(literal)) occurrence++;
+      }
+
+      if (canOverride) interpreter.IntegerStack.Top = occurrence;
+      else interpreter.IntegerStack.Push(occurrence);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].OCCURRENCEOF",
+    "Pushes the amount of occurrences of the top INTEGER in the top INTEGER[] onto the INTEGER stack.",
+    StackTypes.Integer)]
+  public class IntegerVectorOccurrenceOfExpression : VectorOccurrenceOfExpression<long> {
+    public IntegerVectorOccurrenceOfExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorOccurrenceOfExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.IntegerVectorStack, interpreter.IntegerStack, true);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].OCCURRENCEOF",
+    "Pushes the amount of occurrences of the top FLOAT in the top FLOAT[] onto the INTEGER stack.",
+    StackTypes.Float | StackTypes.Integer)]
+  public class FloatVectorOccurrenceOfExpression : VectorOccurrenceOfExpression<double> {
+    public FloatVectorOccurrenceOfExpression() { }
+    [StorableConstructor]
+    protected FloatVectorOccurrenceOfExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].OCCURRENCEOF",
+    "Pushes the amount of occurrences of the top BOOLEAN in the top BOOLEAN[] onto the INTEGER stack.",
+    StackTypes.Boolean | StackTypes.Integer)]
+  public class BooleanVectorOccurrenceOfExpression : VectorOccurrenceOfExpression<bool> {
+    public BooleanVectorOccurrenceOfExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorOccurrenceOfExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].OCCURRENCEOF",
+    "Pushes the amount of occurrences of the top STRING in the top STRING[] onto the INTEGER stack.",
+    StackTypes.String | StackTypes.Integer)]
+  public class StringVectorOccurrenceOfExpression : VectorOccurrenceOfExpression<string> {
+    public StringVectorOccurrenceOfExpression() { }
+    [StorableConstructor]
+    protected StringVectorOccurrenceOfExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack, interpreter.StringStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.StringVectorStack, interpreter.StringStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorPushAllExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorPushAllExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorPushAllExpressions.cs	(revision 15771)
@@ -0,0 +1,105 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Pushes every item from the first vector onto the appropriate stack in reversed order.
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorPushAllExpression<T> : StatelessExpression {
+    protected VectorPushAllExpression() { }
+    [StorableConstructor]
+    protected VectorPushAllExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack) {
+      return vectorStack.IsEmpty;
+    }
+
+    protected void Eval(IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      var vector = vectorStack.Pop().Reverse().ToList();
+      literalStack.Push(vector);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].PUSHALL",
+    "Pushes every item from the top INTEGER[] onto the INTEGER stack in reversed order.",
+    StackTypes.Integer)]
+  public class IntegerVectorPushAllExpression : VectorPushAllExpression<long> {
+    public IntegerVectorPushAllExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorPushAllExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].PUSHALL",
+    "Pushes every item from the top FLOAT[] onto the FLOAT stack in reversed order.",
+    StackTypes.Float)]
+  public class FloatVectorPushAllExpression : VectorPushAllExpression<double> {
+    public FloatVectorPushAllExpression() { }
+    [StorableConstructor]
+    protected FloatVectorPushAllExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].PUSHALL",
+    "Pushes every item from the top BOOLEAN[] onto the BOOLEAN stack in reversed order.",
+    StackTypes.Boolean)]
+  public class BooleanVectorPushAllExpression : VectorPushAllExpression<bool> {
+    public BooleanVectorPushAllExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorPushAllExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].PUSHALL",
+    "Pushes every item from the top STRING[] onto the STRING stack in reversed order.",
+    StackTypes.String)]
+  public class StringVectorPushAllExpression : VectorPushAllExpression<string> {
+    public StringVectorPushAllExpression() { }
+    [StorableConstructor]
+    protected StringVectorPushAllExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack, interpreter.StringStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorRemoveExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorRemoveExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorRemoveExpressions.cs	(revision 15771)
@@ -0,0 +1,105 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Removes all occurrences of the first lit-type item in the top type vector.
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorRemoveExpression<T> : StatelessExpression {
+    protected VectorRemoveExpression() { }
+    [StorableConstructor]
+    protected VectorRemoveExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      return vectorStack.IsEmpty || literalStack.IsEmpty;
+    }
+
+    protected void Eval(IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      var literal = literalStack.Pop();
+      vectorStack.Top = vectorStack.Top.Where(x => !x.Equals(literal)).ToList();
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].REMOVE",
+    "Removes all occurrences of the top INTEGER in the top INTEGER[].",
+    StackTypes.Integer)]
+  public class IntegerVectorRemoveExpression : VectorRemoveExpression<long> {
+    public IntegerVectorRemoveExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorRemoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].REMOVE",
+    "Removes all occurrences of the top FLOAT in the top FLOAT[].",
+    StackTypes.Float)]
+  public class FloatVectorRemoveExpression : VectorRemoveExpression<double> {
+    public FloatVectorRemoveExpression() { }
+    [StorableConstructor]
+    protected FloatVectorRemoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].REMOVE",
+    "Removes all occurrences of the top BOOLEAN in the top BOOLEAN[].",
+    StackTypes.Boolean)]
+  public class BooleanVectorRemoveExpression : VectorRemoveExpression<bool> {
+    public BooleanVectorRemoveExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorRemoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].REMOVE",
+    "Removes all occurrences of the top STRING in the top STRING[].",
+    StackTypes.String)]
+  public class StringVectorRemoveExpression : VectorRemoveExpression<string> {
+    public StringVectorRemoveExpression() { }
+    [StorableConstructor]
+    protected StringVectorRemoveExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack, interpreter.StringStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack, interpreter.StringStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorReplaceExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorReplaceExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorReplaceExpressions.cs	(revision 15771)
@@ -0,0 +1,114 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Replaces all occurrences of the second lit-type item with the first lit-type item in the top type vector.
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorReplaceExpression<T> : StatelessExpression {
+    protected VectorReplaceExpression() { }
+    [StorableConstructor]
+    protected VectorReplaceExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      return vectorStack.IsEmpty || literalStack.Count < 2;
+    }
+
+    protected void Eval(IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      var vector = vectorStack.Top;
+      var first = literalStack.Top;
+      var second = literalStack[1];
+      literalStack.Remove(2);
+
+      var result = new List<T>(vector);
+      for (var i = 0; i < vector.Count; i++) {
+        if (vector[i].Equals(second))
+          result[i] = first;
+      }
+
+      vectorStack.Top = result;
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].REPLACE",
+    "Replaces all occurrences of the second INTEGER with the INTEGER in the top INTEGER[].",
+    StackTypes.Integer)]
+  public class IntegerVectorReplaceExpression : VectorReplaceExpression<long> {
+    public IntegerVectorReplaceExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorReplaceExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].REPLACE",
+    "Replaces all occurrences of the second FLOAT with the FLOAT in the top FLOAT[].",
+    StackTypes.Float)]
+  public class FloatVectorReplaceExpression : VectorReplaceExpression<double> {
+    public FloatVectorReplaceExpression() { }
+    [StorableConstructor]
+    protected FloatVectorReplaceExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].REPLACE",
+    "Replaces all occurrences of the second BOOLEAN with the BOOLEAN in the top BOOLEAN[].",
+    StackTypes.Boolean)]
+  public class BooleanVectorReplaceExpression : VectorReplaceExpression<bool> {
+    public BooleanVectorReplaceExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorReplaceExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].REPLACE",
+    "Replaces all occurrences of the second STRING with the STRING in the top STRING[].",
+    StackTypes.String)]
+  public class StringVectorReplaceExpression : VectorReplaceExpression<string> {
+    public StringVectorReplaceExpression() { }
+    [StorableConstructor]
+    protected StringVectorReplaceExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack, interpreter.StringStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack, interpreter.StringStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorReplaceFirstExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorReplaceFirstExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorReplaceFirstExpressions.cs	(revision 15771)
@@ -0,0 +1,120 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Replace first occurrence of the second lit-type item with the first lit-type item in the top type vector.
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorReplaceFirstExpression<T> : StatelessExpression {
+    protected VectorReplaceFirstExpression() { }
+    [StorableConstructor]
+    protected VectorReplaceFirstExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      return vectorStack.IsEmpty || literalStack.Count < 2;
+    }
+
+    protected void Eval(IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack) {
+      var vector = vectorStack.Top;
+      var first = literalStack.Top;
+      var second = literalStack[1];
+      literalStack.Remove(2);
+
+      var index = -1;
+      for (var i = 0; i < vector.Count && index < 0; i++) {
+        if (vector[i].Equals(second)) {
+          index = i;
+          break;
+        }
+      }
+
+      if (index >= 0) {
+        var result = new List<T>(vector);
+        result[index] = first;
+        vectorStack.Top = result;
+      }
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].REPLACEFIRST",
+    "Replace first occurrence of the second INTEGER with the INTEGER in the top INTEGER[].",
+    StackTypes.Integer)]
+  public class IntegerVectorReplaceFirstExpression : VectorReplaceFirstExpression<long> {
+    public IntegerVectorReplaceFirstExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorReplaceFirstExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].REPLACEFIRST",
+    "Replace first occurrence of the second FLOAT with the FLOAT in the top FLOAT[].",
+    StackTypes.Float)]
+  public class FloatVectorReplaceFirstExpression : VectorReplaceFirstExpression<double> {
+    public FloatVectorReplaceFirstExpression() { }
+    [StorableConstructor]
+    protected FloatVectorReplaceFirstExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].REPLACEFIRST",
+    "Replace first occurrence of the second BOOLEAN with the BOOLEAN in the top BOOLEAN[].",
+    StackTypes.Boolean)]
+  public class BooleanVectorReplaceFirstExpression : VectorReplaceFirstExpression<bool> {
+    public BooleanVectorReplaceFirstExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorReplaceFirstExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].REPLACEFIRST",
+    "Replace first occurrence of the second STRING with the STRING in the top STRING[].",
+    StackTypes.String)]
+  public class StringVectorReplaceFirstExpression : VectorReplaceFirstExpression<string> {
+    public StringVectorReplaceFirstExpression() { }
+    [StorableConstructor]
+    protected StringVectorReplaceFirstExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack, interpreter.StringStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack, interpreter.StringStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorRestExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorRestExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorRestExpressions.cs	(revision 15771)
@@ -0,0 +1,119 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Takes the rest of the top item on the type stack.
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorRestExpression<T> : StatelessExpression {
+    protected VectorRestExpression() { }
+    [StorableConstructor]
+    protected VectorRestExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack) {
+      return vectorStack.IsEmpty || vectorStack.Top.Count < 2;
+    }
+
+    protected void Eval(IPushStack<IReadOnlyList<T>> vectorStack) {
+      var vector = vectorStack.Top;
+      var list = vector as List<T>;
+      var newLength = vector.Count - 1;
+      if (list != null) {
+        var newTop = new T[newLength];
+        list.CopyTo(1, newTop, 0, newLength);
+        vectorStack.Top = newTop;
+        return;
+      }
+
+      var array = vector as T[];
+      if (array != null) {
+        var newTop = new T[newLength];
+        Array.Copy(array, 1, newTop, 0, newLength);
+        vectorStack.Top = newTop;
+        return;
+      }
+
+      vectorStack.Top = vector.Skip(1).ToList();
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].REST",
+    "Removes the first item of the top INTEGER[].")]
+  public class IntegerVectorRestExpression : VectorRestExpression<long> {
+    public IntegerVectorRestExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorRestExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].REST",
+    "Removes the first item of the top FLOAT[].")]
+  public class FloatVectorRestExpression : VectorRestExpression<double> {
+    public FloatVectorRestExpression() { }
+    [StorableConstructor]
+    protected FloatVectorRestExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].REST",
+    "Removes the first item of the top BOOLEAN[].")]
+  public class BooleanVectorRestExpression : VectorRestExpression<bool> {
+    public BooleanVectorRestExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorRestExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].REST",
+    "Removes the first item of the top STRING[].")]
+  public class StringVectorRestExpression : VectorRestExpression<string> {
+    public StringVectorRestExpression() { }
+    [StorableConstructor]
+    protected StringVectorRestExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorReverseExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorReverseExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorReverseExpressions.cs	(revision 15771)
@@ -0,0 +1,101 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Takes the reverse of the top item on the type stack.
+  /// </summary>
+  /// <param name="vectorStack"></param>
+  /// <returns></returns>
+  [StorableClass]
+  public abstract class VectorReverseExpression<T> : StatelessExpression {
+    protected VectorReverseExpression() { }
+    [StorableConstructor]
+    protected VectorReverseExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<IReadOnlyList<T>> vectorStack) {
+      return vectorStack.IsEmpty || vectorStack.Top.Count < 2;
+    }
+
+    protected void Eval(IPushStack<IReadOnlyList<T>> vectorStack) {
+      vectorStack.Top = vectorStack.Top.Reverse().ToList();
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].REVERSE",
+    "Reverses the top INTEGER[].")]
+  public class IntegerVectorReverseExpression : VectorReverseExpression<long> {
+    public IntegerVectorReverseExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorReverseExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].REVERSE",
+    "Reverses the top FLOAT[].")]
+  public class FloatVectorReverseExpression : VectorReverseExpression<double> {
+    public FloatVectorReverseExpression() { }
+    [StorableConstructor]
+    protected FloatVectorReverseExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].REVERSE",
+    "Reverses the top BOOLEAN[].")]
+  public class BooleanVectorReverseExpression : VectorReverseExpression<bool> {
+    public BooleanVectorReverseExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorReverseExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].REVERSE",
+    "Reverses the top STRING[].")]
+  public class StringVectorReverseExpression : VectorReverseExpression<string> {
+    public StringVectorReverseExpression() { }
+    [StorableConstructor]
+    protected StringVectorReverseExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorSetExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorSetExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorSetExpressions.cs	(revision 15771)
@@ -0,0 +1,131 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Replaces, in the top type vector, item at index(from integer stack) with the first lit-type item.
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorSetExpression<T> : StatelessExpression {
+    protected VectorSetExpression() { }
+    [StorableConstructor]
+    protected VectorSetExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IInternalPushInterpreter interpreter, IPushStack<IReadOnlyList<T>> vectorStack, IPushStack<T> literalStack, bool isLiteralTypeInteger = false) {
+      return vectorStack.IsEmpty ||
+             vectorStack.Top.Count == 0 ||
+             literalStack.IsEmpty ||
+             (isLiteralTypeInteger && interpreter.IntegerStack.Count < 2) ||
+             (!isLiteralTypeInteger && interpreter.IntegerStack.IsEmpty);
+    }
+
+    protected void Eval(
+      IInternalPushInterpreter interpreter,
+      IPushStack<IReadOnlyList<T>> vectorStack,
+      IPushStack<T> literalStack,
+      bool isLiteralTypeInteger = false) {
+      T literal;
+      long x;
+
+      if (isLiteralTypeInteger) {
+        literal = literalStack.Top;
+        x = interpreter.IntegerStack[1];
+        interpreter.IntegerStack.Remove(2);
+      } else {
+        literal = literalStack.Pop();
+        x = interpreter.IntegerStack.Pop();
+      }
+
+      var vector = vectorStack.Top;
+      var newTop = new List<T>(vector);
+      var index = x.AsInt(vector.Count);
+
+      if (index < 0)
+        index *= -1;
+
+      newTop[index] = literal;
+      vectorStack.Top = newTop;
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].SET",
+    "Replaces in the top INTEGER[] item at index (from INTEGER stack) with the first INTEGER item.",
+    StackTypes.Integer)]
+  public class IntegerVectorSetExpression : VectorSetExpression<long> {
+    public IntegerVectorSetExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorSetExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.IntegerVectorStack, interpreter.IntegerStack, true);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.IntegerVectorStack, interpreter.IntegerStack, true);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].SET",
+    "Replaces in the top FLOAT[] item at index (from INTEGER stack) with the first FLOAT item.",
+    StackTypes.Float | StackTypes.Integer)]
+  public class FloatVectorSetExpression : VectorSetExpression<double> {
+    public FloatVectorSetExpression() { }
+    [StorableConstructor]
+    protected FloatVectorSetExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.FloatVectorStack, interpreter.FloatStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].SET",
+    "Replaces in the top BOOLEAN[] item at index (from INTEGER stack) with the first BOOLEAN item.",
+    StackTypes.Boolean | StackTypes.Integer)]
+  public class BooleanVectorSetExpression : VectorSetExpression<bool> {
+    public BooleanVectorSetExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorSetExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.BooleanVectorStack, interpreter.BooleanStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].SET",
+    "Replaces in the top STRING[] item at index (from INTEGER stack) with the first STRING item.",
+    StackTypes.String | StackTypes.Integer)]
+  public class StringVectorSetExpression : VectorSetExpression<string> {
+    public StringVectorSetExpression() { }
+    [StorableConstructor]
+    protected StringVectorSetExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.StringVectorStack, interpreter.StringStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.StringVectorStack, interpreter.StringStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorSubExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorSubExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorSubExpressions.cs	(revision 15771)
@@ -0,0 +1,131 @@
+﻿using System.Collections.Generic;
+using System;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Takes the subvec of the top item on the type stack.
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorSubExpression<T> : StatelessExpression {
+    protected VectorSubExpression() { }
+    [StorableConstructor]
+    protected VectorSubExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IInternalPushInterpreter interpreter, IPushStack<IReadOnlyList<T>> vectorStack) {
+      return vectorStack.IsEmpty || interpreter.IntegerStack.Count < 2;
+    }
+
+    protected void Eval(IInternalPushInterpreter interpreter, IPushStack<IReadOnlyList<T>> vectorStack) {
+      var first = (int)Math.Min(vectorStack.Top.Count, Math.Max(0, interpreter.IntegerStack[1]));
+      var second = (int)Math.Min(vectorStack.Top.Count, Math.Max(first, interpreter.IntegerStack.Top));
+      interpreter.IntegerStack.Remove(2);
+
+      if (vectorStack.Top.Count == 0)
+        return;
+
+      var vector = vectorStack.Top;
+      var list = vector as List<T>;
+      var lenght = second - first;
+
+      if (list != null) {
+        var newTop = new T[lenght];
+        list.CopyTo(first, newTop, 0, lenght);
+        vectorStack.Top = newTop;
+        return;
+      }
+
+      var array = vector as T[];
+      if (array != null) {
+        var newTop = new T[lenght];
+        Array.Copy(array, first, newTop, 0, lenght);
+        vectorStack.Top = newTop;
+        return;
+      }
+
+      vectorStack.Top = vector.Skip(first).Take(lenght).ToList();
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].SUB",
+    "Pushes the sub vector of the top INTEGER[].",
+    StackTypes.Integer)]
+  public class IntegerVectorSubExpression : VectorSubExpression<long> {
+    public IntegerVectorSubExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorSubExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.IntegerVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.IntegerVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].SUB",
+    "Pushes the sub vector of the top FLOAT[].",
+    StackTypes.Integer)]
+  public class FloatVectorSubExpression : VectorSubExpression<double> {
+    public FloatVectorSubExpression() { }
+    [StorableConstructor]
+    protected FloatVectorSubExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.FloatVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.FloatVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].SUB",
+    "Pushes the sub vector of the top BOOLEAN[].",
+    StackTypes.Integer)]
+  public class BooleanVectorSubExpression : VectorSubExpression<bool> {
+    public BooleanVectorSubExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorSubExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.BooleanVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.BooleanVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].SUB",
+    "Pushes the sub vector of the top STRING[].",
+    StackTypes.Integer)]
+  public class StringVectorSubExpression : VectorSubExpression<string> {
+    public StringVectorSubExpression() { }
+    [StorableConstructor]
+    protected StringVectorSubExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.StringVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorTakeExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorTakeExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorTakeExpressions.cs	(revision 15771)
@@ -0,0 +1,132 @@
+﻿using System.Collections.Generic;
+using System;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Takes the first N items from the type stack, where N is from the integer stack
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  [StorableClass]
+  public abstract class VectorTakeExpression<T> : StatelessExpression {
+    protected VectorTakeExpression() { }
+    [StorableConstructor]
+    protected VectorTakeExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IInternalPushInterpreter interpreter, IPushStack<IReadOnlyList<T>> vectorStack) {
+      return vectorStack.IsEmpty || interpreter.IntegerStack.IsEmpty;
+    }
+
+    protected void Eval(IInternalPushInterpreter interpreter, IPushStack<IReadOnlyList<T>> vectorStack) {
+
+      if (vectorStack.Top.Count == 0)
+        return;
+
+      var count = interpreter.IntegerStack.Pop().AsInt(vectorStack.Top.Count);
+
+      if (count < 0)
+        count *= -1;
+
+      var vector = vectorStack.Top;
+      var list = vector as List<T>;
+
+      if (list != null) {
+        var newTop = new T[count];
+        list.CopyTo(0, newTop, 0, count);
+        vectorStack.Top = newTop;
+        return;
+      }
+
+      var array = vector as T[];
+      if (array != null) {
+        var newTop = new T[count];
+        Array.Copy(array, 0, newTop, 0, count);
+        vectorStack.Top = newTop;
+        return;
+      }
+
+      vectorStack.Top = vector.Take(count).ToList();
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].TAKE",
+    "Takes the first n items of the top INTEGER[], where n is from the INTEGER stack.",
+    StackTypes.Integer)]
+  public class IntegerVectorTakeExpression : VectorTakeExpression<long> {
+    public IntegerVectorTakeExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorTakeExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.IntegerVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.IntegerVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].TAKE",
+    "Takes the first n items of the top FLOAT[], where n is from the INTEGER stack.",
+    StackTypes.Integer)]
+  public class FloatVectorTakeExpression : VectorTakeExpression<double> {
+    public FloatVectorTakeExpression() { }
+    [StorableConstructor]
+    protected FloatVectorTakeExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.FloatVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.FloatVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].TAKE",
+    "Takes the first n items of the top BOOLEAN[], where n is from the INTEGER stack.",
+    StackTypes.Integer)]
+  public class BooleanVectorTakeExpression : VectorTakeExpression<bool> {
+    public BooleanVectorTakeExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorTakeExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.BooleanVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.BooleanVectorStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].TAKE",
+    "Takes the first n items of the top STRING[], where n is from the INTEGER stack.",
+    StackTypes.Integer)]
+  public class StringVectorTakeExpression : VectorTakeExpression<string> {
+    public StringVectorTakeExpression() { }
+    [StorableConstructor]
+    protected StringVectorTakeExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter, interpreter.StringVectorStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter, interpreter.StringVectorStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankDuplicateExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankDuplicateExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankDuplicateExpressions.cs	(revision 15771)
@@ -0,0 +1,265 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Pushes a copy of an indexed item "deep" in the stack onto the top of the stack, without removing the deep item.
+  /// The index is taken from the INTEGER stack, and the indexing is done after the index is removed.
+  /// </summary>
+  /// <typeparam name="T">Stacktype</typeparam>
+  [StorableClass]
+  public abstract class YankDuplicateExpression<T> : StatelessExpression {
+    protected YankDuplicateExpression() { }
+    [StorableConstructor]
+    protected YankDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<T> stack, IPushStack<long> integerStack) {
+      return (stack == integerStack && integerStack.Count < 3) ||
+             (stack != integerStack && (integerStack.IsEmpty || stack.Count < 2));
+    }
+
+    protected void Eval(IPushStack<T> stack, IPushStack<long> integerStack) {
+      var index = integerStack.Pop().AsInt(stack.Count);
+      stack.Push(stack[index]);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.YANKDUP",
+    "Pushes a copy of an indexed item \"deep\" in the stack onto the top of the stack, without removing the deep item.")]
+  public class IntegerYankDuplicateExpression : YankDuplicateExpression<long> {
+    public IntegerYankDuplicateExpression() { }
+    [StorableConstructor]
+    protected IntegerYankDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.YANKDUP",
+    "Pushes a copy of an indexed item \"deep\" in the stack onto the top of the stack, without removing the deep item.",
+    StackTypes.Integer)]
+  public class FloatYankDuplicateExpression : YankDuplicateExpression<double> {
+    public FloatYankDuplicateExpression() { }
+    [StorableConstructor]
+    protected FloatYankDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Boolean,
+    "BOOLEAN.YANKDUP",
+    "Pushes a copy of an indexed item \"deep\" in the stack onto the top of the stack, without removing the deep item.",
+    StackTypes.Integer)]
+  public class BooleanYankDuplicateExpression : YankDuplicateExpression<bool> {
+    public BooleanYankDuplicateExpression() { }
+    [StorableConstructor]
+    protected BooleanYankDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Name,
+    "NAME.YANKDUP",
+    "Pushes a copy of an indexed item \"deep\" in the stack onto the top of the stack, without removing the deep item.",
+    StackTypes.Integer)]
+  public class NameYankDuplicateExpression : YankDuplicateExpression<string> {
+    public NameYankDuplicateExpression() { }
+    [StorableConstructor]
+    protected NameYankDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.NameStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.NameStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.YANKDUP",
+    "Pushes a copy of an indexed item \"deep\" in the stack onto the top of the stack, without removing the deep item.",
+    StackTypes.Integer, requiredBlockCount: 0)]
+  public class ExecYankDuplicateExpression : YankDuplicateExpression<Expression> {
+    public ExecYankDuplicateExpression() { }
+    [StorableConstructor]
+    protected ExecYankDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.ExecStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.ExecStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.YANKDUP",
+    "Pushes a copy of an indexed item \"deep\" in the stack onto the top of the stack, without removing the deep item.",
+    StackTypes.Integer)]
+  public class CodeYankDuplicateExpression : YankDuplicateExpression<Expression> {
+    public CodeYankDuplicateExpression() { }
+    [StorableConstructor]
+    protected CodeYankDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.CodeStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CodeStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.YANKDUP",
+    "Pushes a copy of an indexed item \"deep\" in the stack onto the top of the stack, without removing the deep item.",
+    StackTypes.Integer)]
+  public class CharYankDuplicateExpression : YankDuplicateExpression<char> {
+    public CharYankDuplicateExpression() { }
+    [StorableConstructor]
+    protected CharYankDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.CharStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CharStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.YANKDUP",
+    "Pushes a copy of an indexed item \"deep\" in the stack onto the top of the stack, without removing the deep item.",
+    StackTypes.Integer)]
+  public class StringYankDuplicateExpression : YankDuplicateExpression<string> {
+    public StringYankDuplicateExpression() { }
+    [StorableConstructor]
+    protected StringYankDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].YANKDUP",
+    "Pushes a copy of an indexed item \"deep\" in the stack onto the top of the stack, without removing the deep item.",
+    StackTypes.Integer)]
+  public class IntegerVectorYankDuplicateExpression : YankDuplicateExpression<IReadOnlyList<long>> {
+    public IntegerVectorYankDuplicateExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorYankDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].YANKDUP",
+    "Pushes a copy of an indexed item \"deep\" in the stack onto the top of the stack, without removing the deep item.",
+    StackTypes.Integer)]
+  public class FloatVectorYankDuplicateExpression : YankDuplicateExpression<IReadOnlyList<double>> {
+    public FloatVectorYankDuplicateExpression() { }
+    [StorableConstructor]
+    protected FloatVectorYankDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].YANKDUP",
+    "Pushes a copy of an indexed item \"deep\" in the stack onto the top of the stack, without removing the deep item.",
+    StackTypes.Integer)]
+  public class BooleanVectorYankDuplicateExpression : YankDuplicateExpression<IReadOnlyList<bool>> {
+    public BooleanVectorYankDuplicateExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorYankDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].YANKDUP",
+    "Pushes a copy of an indexed item \"deep\" in the stack onto the top of the stack, without removing the deep item.",
+    StackTypes.Integer)]
+  public class StringVectorYankDuplicateExpression : YankDuplicateExpression<IReadOnlyList<string>> {
+    public StringVectorYankDuplicateExpression() { }
+    [StorableConstructor]
+    protected StringVectorYankDuplicateExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack, interpreter.IntegerStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankExpressions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankExpressions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankExpressions.cs	(revision 15771)
@@ -0,0 +1,266 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Removes an indexed item from "deep" in the stack and pushes it on top of the stack.
+  /// The index is taken from the INTEGER stack, and the indexing is done after the index is removed.
+  /// </summary>
+  /// <typeparam name="T">Stacktype</typeparam>
+  [StorableClass]
+  public abstract class YankExpression<T> : StatelessExpression {
+    protected YankExpression() { }
+    [StorableConstructor]
+    protected YankExpression(bool deserializing) : base(deserializing) { }
+
+    protected bool IsNoop(IPushStack<T> stack, IPushStack<long> integerStack) {
+      return (stack == integerStack && integerStack.Count < 3) ||
+             (stack != integerStack && (integerStack.IsEmpty || stack.Count < 2));
+    }
+
+    protected void Eval(IPushStack<T> stack, IPushStack<long> integerStack) {
+      var index = integerStack.Pop().AsInt(stack.Count);
+      stack.Yank(index);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Integer,
+    "INTEGER.YANK",
+    "Removes an indexed item from \"deep\" in the stack and pushes it on top of the stack.")]
+  public class IntegerYankExpression : YankExpression<long> {
+    public IntegerYankExpression() { }
+    [StorableConstructor]
+    protected IntegerYankExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Float,
+    "FLOAT.YANK",
+    "Removes an indexed item from \"deep\" in the stack and pushes it on top of the stack.",
+    StackTypes.Integer)]
+  public class FloatYankExpression : YankExpression<double> {
+    public FloatYankExpression() { }
+    [StorableConstructor]
+    protected FloatYankExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Boolean,
+    "BOOLEAN.YANK",
+    "Removes an indexed item from \"deep\" in the stack and pushes it on top of the stack.",
+    StackTypes.Integer)]
+  public class BooleanYankExpression : YankExpression<bool> {
+    public BooleanYankExpression() { }
+    [StorableConstructor]
+    protected BooleanYankExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Name,
+    "NAME.YANK",
+    "Removes an indexed item from \"deep\" in the stack and pushes it on top of the stack.",
+    StackTypes.Integer)]
+  public class NameYankExpression : YankExpression<string> {
+    public NameYankExpression() { }
+    [StorableConstructor]
+    protected NameYankExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.NameStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.NameStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Exec,
+    "EXEC.YANK",
+    "Removes an indexed item from \"deep\" in the stack and pushes it on top of the stack.",
+    StackTypes.Integer,
+    requiredBlockCount: 0)]
+  public class ExecYankExpression : YankExpression<Expression> {
+    public ExecYankExpression() { }
+    [StorableConstructor]
+    protected ExecYankExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.ExecStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.ExecStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Code,
+    "CODE.YANK",
+    "Removes an indexed item from \"deep\" in the stack and pushes it on top of the stack.",
+    StackTypes.Integer)]
+  public class CodeYankExpression : YankExpression<Expression> {
+    public CodeYankExpression() { }
+    [StorableConstructor]
+    protected CodeYankExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.CodeStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CodeStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.Char,
+    "CHAR.YANK",
+    "Removes an indexed item from \"deep\" in the stack and pushes it on top of the stack.",
+    StackTypes.Integer)]
+  public class CharYankExpression : YankExpression<char> {
+    public CharYankExpression() { }
+    [StorableConstructor]
+    protected CharYankExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.CharStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.CharStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.String,
+    "STRING.YANK",
+    "Removes an indexed item from \"deep\" in the stack and pushes it on top of the stack.",
+    StackTypes.Integer)]
+  public class StringYankExpression : YankExpression<string> {
+    public StringYankExpression() { }
+    [StorableConstructor]
+    protected StringYankExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.IntegerVector,
+    "INTEGER[].YANK",
+    "Removes an indexed item from \"deep\" in the stack and pushes it on top of the stack.",
+    StackTypes.Integer)]
+  public class IntegerVectorYankExpression : YankExpression<IReadOnlyList<long>> {
+    public IntegerVectorYankExpression() { }
+    [StorableConstructor]
+    protected IntegerVectorYankExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.IntegerVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.FloatVector,
+    "FLOAT[].YANK",
+    "Removes an indexed item from \"deep\" in the stack and pushes it on top of the stack.",
+    StackTypes.Integer)]
+  public class FloatVectorYankExpression : YankExpression<IReadOnlyList<double>> {
+    public FloatVectorYankExpression() { }
+    [StorableConstructor]
+    protected FloatVectorYankExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.FloatVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.FloatVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.BooleanVector,
+    "BOOLEAN[].YANK",
+    "Removes an indexed item from \"deep\" in the stack and pushes it on top of the stack.",
+    StackTypes.Integer)]
+  public class BooleanVectorYankExpression : YankExpression<IReadOnlyList<bool>> {
+    public BooleanVectorYankExpression() { }
+    [StorableConstructor]
+    protected BooleanVectorYankExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.BooleanVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.BooleanVectorStack, interpreter.IntegerStack);
+    }
+  }
+
+  [StorableClass]
+  [PushExpression(
+    StackTypes.StringVector,
+    "STRING[].YANK",
+    "Removes an indexed item from \"deep\" in the stack and pushes it on top of the stack.",
+    StackTypes.Integer)]
+  public class StringVectorYankExpression : YankExpression<IReadOnlyList<string>> {
+    public StringVectorYankExpression() { }
+    [StorableConstructor]
+    protected StringVectorYankExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return IsNoop(interpreter.StringVectorStack, interpreter.IntegerStack);
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      Eval(interpreter.StringVectorStack, interpreter.IntegerStack);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/CharExtentions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/CharExtentions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/CharExtentions.cs	(revision 15771)
@@ -0,0 +1,17 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  public static class CharExtentions {
+    public static string Printify(this char c) {
+      switch (c) {
+        case '\0': return "\\0";
+        case '\a': return "\\a";
+        case '\b': return "\\b";
+        case '\f': return "\\f";
+        case '\n': return "\\n";
+        case '\r': return "\\r";
+        case '\t': return "\\t";
+        case '\v': return "\\v";
+        default: return c.ToString();
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/CollectionExtensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/CollectionExtensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/CollectionExtensions.cs	(revision 15771)
@@ -0,0 +1,33 @@
+﻿using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Core;
+  using HeuristicLab.Random;
+
+  public static class CollectionExtensions {
+    public static T Random<T>(this IReadOnlyList<T> source, IRandom random = null) {
+      random = random ?? new MersenneTwister();
+      var x = random.Next(source.Count);
+
+      return source[x];
+    }
+
+    public static int HashCode<T>(this IReadOnlyList<T> source) {
+      var hash = 19 * 31 + typeof(T).FullName.GetHashCode();
+
+      for (var i = 0; i < source.Count; i++)
+        hash = hash * 31 + source[i].GetHashCode();
+
+      return hash;
+    }
+
+    public static int HashCode<T>(this IEnumerable<T> source) {
+      var hash = 19 * 31 + typeof(T).FullName.GetHashCode();
+
+      foreach (var item in source)
+        hash = hash * 31 + item.GetHashCode();
+
+      return hash;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/ControlExntensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/ControlExntensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/ControlExntensions.cs	(revision 15771)
@@ -0,0 +1,40 @@
+﻿using System;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Linq.Expressions;
+  using System.Reflection;
+  using System.Windows.Forms;
+
+  public static class ControlExntensions {
+    private delegate void SetPropertyThreadSafeDelegate<TResult>(Control control, Expression<Func<TResult>> property, TResult value);
+
+    public static void SetPropertyThreadSafe<TResult>(
+        this Control control,
+        Expression<Func<TResult>> property,
+        TResult value) {
+      var propertyInfo = (property.Body as MemberExpression).Member
+          as PropertyInfo;
+
+      if (propertyInfo == null ||
+          // ReSharper disable once AssignNullToNotNullAttribute
+          !control.GetType().IsSubclassOf(propertyInfo.ReflectedType) ||
+          control.GetType().GetProperty(
+              propertyInfo.Name,
+              propertyInfo.PropertyType) == null) {
+        throw new ArgumentException("The lambda expression 'property' must reference a valid property on this Control.");
+      }
+
+      if (control.InvokeRequired) {
+        control.Invoke(new SetPropertyThreadSafeDelegate<TResult>
+        (SetPropertyThreadSafe), control, property, value);
+      } else {
+        control.GetType().InvokeMember(
+            propertyInfo.Name,
+            BindingFlags.SetProperty,
+            null,
+            control,
+            new object[] { value });
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/EnumExtensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/EnumExtensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/EnumExtensions.cs	(revision 15771)
@@ -0,0 +1,33 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public static class EnumExtensions {
+    public static T ToMask<T>(this IEnumerable<T> values) where T : struct, IConvertible {
+      if (!typeof(T).IsEnum)
+        throw new ArgumentException("T must be an enumerated type.");
+
+      var builtValue = Enum
+        .GetValues(typeof(T))
+        .Cast<T>()
+        .Where(values.Contains)
+        .Aggregate(0, (current, value) => current | Convert.ToInt32(value));
+
+      return (T)Enum.Parse(typeof(T), builtValue.ToString());
+    }
+
+    public static IEnumerable<T> ToValues<T>(this T flags) where T : struct, IConvertible {
+      if (!typeof(T).IsEnum)
+        throw new ArgumentException("T must be an enumerated type.");
+
+      var inputInt = (int)(object)flags;
+      foreach (T value in Enum.GetValues(typeof(T))) {
+        var valueInt = (int)(object)value;
+        if (0 != (valueInt & inputInt)) {
+          yield return value;
+        }
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/LongExtensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/LongExtensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/LongExtensions.cs	(revision 15771)
@@ -0,0 +1,9 @@
+﻿using System;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public static class LongExtensions {
+    public static int AsInt(this long value, int length) {
+      return (int)Math.Abs(value % length);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/RandomExtensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/RandomExtensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/RandomExtensions.cs	(revision 15771)
@@ -0,0 +1,20 @@
+﻿using System;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Core;
+
+  public static class RandomExtensions {
+    /// <summary>
+    /// Generates a random biased towards min
+    /// <see href="https://gamedev.stackexchange.com/questions/116832/random-number-in-a-range-biased-toward-the-low-end-of-the-range">Source</see>
+    /// </summary>
+    /// <param name="min">Minimum random int</param>
+    /// <param name="max">Maximum random int</param>
+    /// <param name="biasLevel">The bigger this values is, the bigger is the probability that min will be generated</param>
+    /// <param name="random">Random number generater</param>
+    /// <returns></returns>
+    public static int NextBiased(this IRandom random, int min, int max, double biasLevel) {
+      return (int)(min + (max - min) * Math.Pow(random.NextDouble(), biasLevel));
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/StringBuilderExtensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/StringBuilderExtensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/StringBuilderExtensions.cs	(revision 15771)
@@ -0,0 +1,236 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+  using System.Diagnostics;
+  using System.Globalization;
+  using System.Text;
+
+  public static class StringBuilderExtension {
+    // These digits are here in a static array to support hex with simple, easily-understandable code.
+    // Since A-Z don't sit next to 0-9 in the ascii table.
+    private static readonly char[] MsDigits =
+      {
+        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
+        'E', 'F'
+      };
+
+    //private static readonly ulong MsDefaultDecimalPlaces = 5; //< Matches standard .NET formatting dp's
+
+    private const char MsDefaultPadChar = '0';
+
+    //! Convert a given unsigned integer value to a string and concatenate onto the stringbuilder. Any base value allowed.
+    public static StringBuilder Concat(
+      this StringBuilder stringBuilder,
+      ulong ulongVal,
+      ulong padAmount,
+      char padChar,
+      ulong baseVal) {
+      Debug.Assert((baseVal > 0) && (baseVal <= 16));
+
+      // Calculate length of integer when written out
+      ulong length = 0;
+      var lengthCalc = ulongVal;
+
+      do {
+        lengthCalc /= baseVal;
+        length++;
+      }
+      while (lengthCalc > 0);
+
+      // Pad out space for writing.
+      stringBuilder.Append(padChar, (int)Math.Max(padAmount, length));
+
+      var strpos = stringBuilder.Length;
+
+      // We're writing backwards, one character at a time.
+      while (length > 0) {
+        strpos--;
+
+        // Lookup from static char array, to cover hex values too
+        stringBuilder[strpos] = MsDigits[ulongVal % baseVal];
+
+        ulongVal /= baseVal;
+        length--;
+      }
+
+      return stringBuilder;
+    }
+
+    //! Convert a given unsigned integer value to a string and concatenate onto the stringbuilder. Assume no padding and base ten.
+    public static StringBuilder Concat(this StringBuilder stringBuilder, ulong ulongVal) {
+      stringBuilder.Concat(ulongVal, 0, MsDefaultPadChar, 10);
+      return stringBuilder;
+    }
+
+    //! Convert a given unsigned integer value to a string and concatenate onto the stringbuilder. Assume base ten.
+    public static StringBuilder Concat(this StringBuilder stringBuilder, ulong ulongVal, ulong padAmount) {
+      stringBuilder.Concat(ulongVal, padAmount, MsDefaultPadChar, 10);
+      return stringBuilder;
+    }
+
+    //! Convert a given unsigned integer value to a string and concatenate onto the stringbuilder. Assume base ten.
+    public static StringBuilder Concat(
+      this StringBuilder stringBuilder,
+      ulong ulongVal,
+      ulong padAmount,
+      char padChar) {
+      stringBuilder.Concat(ulongVal, padAmount, padChar, 10);
+      return stringBuilder;
+    }
+
+    //! Convert a given signed integer value to a string and concatenate onto the stringbuilder. Any base value allowed.
+    public static StringBuilder Concat(
+      this StringBuilder stringBuilder,
+      long longVal,
+      ulong padAmount,
+      char padChar,
+      ulong baseVal) {
+      Debug.Assert((baseVal > 0) && (baseVal <= 16));
+
+      // Deal with negative numbers
+      if (longVal < 0) {
+        stringBuilder.Append('-');
+        var ulongVal = ulong.MaxValue - (ulong)longVal + 1; //< This is to deal with Int64.MinValue
+        stringBuilder.Concat(ulongVal, padAmount, padChar, baseVal);
+      } else {
+        stringBuilder.Concat((ulong)longVal, padAmount, padChar, baseVal);
+      }
+
+      return stringBuilder;
+    }
+
+    //! Convert a given signed integer value to a string and concatenate onto the stringbuilder. Assume no padding and base ten.
+    public static StringBuilder Concat(this StringBuilder stringBuilder, long longVal) {
+      stringBuilder.Concat(longVal, 0, MsDefaultPadChar, 10);
+      return stringBuilder;
+    }
+
+    //! Convert a given signed integer value to a string and concatenate onto the stringbuilder. Assume base ten.
+    public static StringBuilder Concat(this StringBuilder stringBuilder, long longVal, ulong padAmount) {
+      stringBuilder.Concat(longVal, padAmount, MsDefaultPadChar, 10);
+      return stringBuilder;
+    }
+
+    //! Convert a given signed integer value to a string and concatenate onto the stringbuilder. Assume base ten.
+    public static StringBuilder Concat(
+      this StringBuilder stringBuilder,
+      long longVal,
+      ulong padAmount,
+      char padChar) {
+      stringBuilder.Concat(longVal, padAmount, padChar, 10);
+      return stringBuilder;
+    }
+
+    //! Convert a given signed integer value to a string and concatenate onto the stringbuilder. Any base value allowed.
+    public static StringBuilder Concat(
+      this StringBuilder stringBuilder,
+      int intVal,
+      ulong padAmount,
+      char padChar,
+      ulong baseVal) {
+      Debug.Assert((baseVal > 0) && (baseVal <= 16));
+
+      // Deal with negative numbers
+      if (intVal < 0) {
+        stringBuilder.Append('-');
+        var ulongVal = ulong.MaxValue - (ulong)intVal + 1; //< This is to deal with Int32.MinValue
+        stringBuilder.Concat(ulongVal, padAmount, padChar, baseVal);
+      } else {
+        stringBuilder.Concat((ulong)intVal, padAmount, padChar, baseVal);
+      }
+
+      return stringBuilder;
+    }
+
+    //! Convert a given signed integer value to a string and concatenate onto the stringbuilder. Assume no padding and base ten.
+    public static StringBuilder Concat(this StringBuilder stringBuilder, int intVal) {
+      stringBuilder.Concat(intVal, 0, MsDefaultPadChar, 10);
+      return stringBuilder;
+    }
+
+    //! Convert a given signed integer value to a string and concatenate onto the stringbuilder. Assume base ten.
+    public static StringBuilder Concat(this StringBuilder stringBuilder, int intVal, ulong padAmount) {
+      stringBuilder.Concat(intVal, padAmount, MsDefaultPadChar, 10);
+      return stringBuilder;
+    }
+
+    //! Convert a given signed integer value to a string and concatenate onto the stringbuilder. Assume base ten.
+    public static StringBuilder Concat(this StringBuilder stringBuilder, int intVal, ulong padAmount, char padChar) {
+      stringBuilder.Concat(intVal, padAmount, padChar, 10);
+      return stringBuilder;
+    }
+
+    //! Convert a given double value to a string and concatenate onto the stringbuilder
+    public static StringBuilder Concat(
+      this StringBuilder stringBuilder,
+      double doubleVal,
+      uint decimalPlaces,
+      uint padAmount,
+      char padChar,
+      CultureInfo culturInfo = null) {
+      culturInfo = culturInfo ?? CultureInfo.CurrentCulture;
+
+      if (decimalPlaces == 0) {
+        // No decimal places, just round up and print it as an int
+
+        // Agh, Math.Floor() just works on doubles/decimals. Don't want to cast! Let's do this the old-fashioned way.
+        int intVal;
+        if (doubleVal >= 0.0d) intVal = (int)(doubleVal + 0.5d);
+        else intVal = (int)(doubleVal - 0.5d);
+
+        stringBuilder.Concat(intVal, padAmount, padChar, 10);
+      } else {
+        var intPart = (int)doubleVal;
+
+        // First part is easy, just cast to an integer
+        stringBuilder.Concat(intPart, padAmount, padChar, 10);
+
+        // Decimal point
+        var numberDecimalSeparator = Convert.ToChar(culturInfo.NumberFormat.NumberDecimalSeparator);
+        stringBuilder.Append(numberDecimalSeparator);
+
+        // Work out remainder we need to print after the d.p.
+        var remainder = Math.Abs(doubleVal - intPart);
+
+        // Multiply up to become an int that we can print
+        do {
+          remainder *= 10;
+          decimalPlaces--;
+        }
+        while (remainder > (int)remainder && decimalPlaces > 0);
+
+        // Round up. It's guaranteed to be a positive number, so no extra work required here.
+        remainder += 0.5d;
+
+        // All done, print that as an int!
+        stringBuilder.Concat((ulong)remainder, 0, '0', 10);
+      }
+      return stringBuilder;
+    }
+
+    //! Convert a given double value to a string and concatenate onto the stringbuilder. Assumes five decimal places, and no padding.
+    public static StringBuilder Concat(this StringBuilder stringBuilder, double doubleVal, CultureInfo culturInfo = null) {
+      culturInfo = culturInfo ?? CultureInfo.CurrentCulture;
+
+      stringBuilder.Concat(doubleVal, (uint)culturInfo.NumberFormat.NumberDecimalDigits, 0, MsDefaultPadChar, culturInfo);
+      return stringBuilder;
+    }
+
+    //! Convert a given double value to a string and concatenate onto the stringbuilder. Assumes no padding.
+    public static StringBuilder Concat(this StringBuilder stringBuilder, double doubleVal, uint decimalPlaces, CultureInfo culturInfo = null) {
+      stringBuilder.Concat(doubleVal, decimalPlaces, 0, MsDefaultPadChar, culturInfo);
+      return stringBuilder;
+    }
+
+    //! Convert a given double value to a string and concatenate onto the stringbuilder.
+    public static StringBuilder Concat(
+      this StringBuilder stringBuilder,
+      double doubleVal,
+      uint decimalPlaces,
+      uint padAmount,
+      CultureInfo culturInfo = null) {
+
+      stringBuilder.Concat(doubleVal, decimalPlaces, padAmount, MsDefaultPadChar, culturInfo);
+      return stringBuilder;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/CodeGeneratorUtils.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/CodeGeneratorUtils.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/CodeGeneratorUtils.cs	(revision 15771)
@@ -0,0 +1,183 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  internal static class CodeGeneratorUtils {
+    private static readonly Expression Noop = ExpressionTable.GetStatelessExpression<ExecNoopExpression>();
+
+    internal static Expression MapToExpression(
+      IRandom random,
+      IReadOnlyErcOptions ercOptions,
+      IReadOnlyExpressionsConfiguration config,
+      IDictionary<string, Expression> customExpressions = null) {
+      var customCount = customExpressions == null ? 0 : customExpressions.Count;
+      var enabledExpressionCount = config.EnabledExpressions.Count;
+      var index = random.Next(enabledExpressionCount + customCount);
+
+      return index >= config.EnabledExpressions.Count
+        ? customExpressions.Values.ElementAt(index - enabledExpressionCount)
+        : MapToExpression(index, random, ercOptions, config);
+    }
+
+    internal static Expression MapToExpression(
+      int index,
+      IReadOnlyExpressionsConfiguration config) {
+
+      switch (index) {
+        case PushSolutionEncoding.Noop:
+          return Noop;
+      }
+
+      var name = config.EnabledExpressions[index];
+      return ExpressionTable.GetExpression(name);
+    }
+
+    internal static Expression MapToExpression(
+      int index,
+      IRandom random,
+      IReadOnlyErcOptions ercOptions,
+      IReadOnlyExpressionsConfiguration config) {
+
+      switch (index) {
+        case PushSolutionEncoding.Noop:
+          return Noop;
+
+        case PushSolutionEncoding.Erc:
+          var stackType = config.ExpressionsPerStackCount.RandomWeightedOrDefault(random, pair => pair.Value).Key;
+
+          if (stackType == default(StackTypes))
+            break;
+
+          return CreateRandomErcExpression(stackType, random, ercOptions);
+
+        case PushSolutionEncoding.In:
+          if (config.InExpressionCount == 0) break;
+
+          var nr = random.Next(0, config.InExpressionCount) + 1;
+          return ExpressionTable.InExpressionTable[nr];
+      }
+
+      var name = config.EnabledExpressions[index];
+      return ExpressionTable.GetExpression(name);
+    }
+
+    public static Expression GetRandomExpression(IRandom random, IReadOnlyErcOptions ercOptions, IReadOnlyExpressionsConfiguration instructions, double inInstructionProbability) {
+      var x = random.NextDouble();
+      var inInstructionRelativeProbability = ercOptions.ErcProbability + inInstructionProbability;
+
+      Expression expression;
+
+      if (ercOptions.ErcProbability > 0 && x <= ercOptions.ErcProbability) {
+        var stackType = instructions.ExpressionsPerStackCount.RandomWeightedOrDefault(random, pair => pair.Value).Key;
+
+        expression = stackType == default(StackTypes)
+          ? GetRandomExpression(random, instructions)
+          : CreateRandomErcExpression(stackType, random, ercOptions);
+      } else if (
+        inInstructionProbability > 0 &&
+        x <= inInstructionRelativeProbability &&
+        instructions.InExpressionCount > 0) {
+
+        var index = random.Next(0, instructions.InExpressionCount);
+        expression = ExpressionTable.InExpressionTable[index];
+      } else {
+        expression = GetRandomExpression(random, instructions);
+      }
+
+      return expression;
+    }
+
+    private static Expression GetRandomExpression(
+      IRandom random,
+      IReadOnlyExpressionsConfiguration instructionsConfig) {
+      var index = random.Next(0, instructionsConfig.EnabledExpressions.Count);
+      var expressionName = instructionsConfig.EnabledExpressions[index];
+      var expression = ExpressionTable.GetExpression(expressionName);
+
+      return expression;
+    }
+
+    //private static Expression CreateExpressionOrErc(
+    //  string expressionName,
+    //  IRandom random,
+    //  IReadOnlyErcOptions ercOptions) {
+    //  var x = random.NextDouble();
+    //  Expression expression = null;
+
+    //  if (x < ercOptions.ErcProbability) {
+    //    var expressionType = ExpressionTable.NameToTypeTable[expressionName];
+    //    expression = CreateRandomErcExpression(
+    //        ExpressionTable.TypeToAttributeTable[expressionType].StackType,
+    //        random,
+    //        ercOptions);
+    //  }
+
+    //  if (expression == null || expression is ExecNoopExpression) {
+    //    expression = ExpressionTable.GetExpression(expressionName);
+    //  }
+
+    //  return expression;
+    //}
+
+    /// <summary>
+    /// Create a ErcExpression whereby the type of the expression conforms to the passed stack type.
+    /// </summary>
+    /// <param name="type"></param>
+    /// <param name="random"></param>
+    /// <param name="pushConfiguration"></param>
+    /// <returns>ErcExpression or Noop if the required ErcOptionConstants is not configured or enabled in the passed config.</returns>
+    internal static Expression CreateRandomErcExpression(StackTypes type, IRandom random, IReadOnlyErcOptions ercOptions) {
+      switch (type) {
+        case StackTypes.Integer:
+          return ercOptions.IntegerErcOptions == null || !ercOptions.IntegerErcOptions.IsEnabled
+             ? Noop
+             : new IntegerPushExpression(ercOptions.IntegerErcOptions.GetErcValue(random));
+
+        case StackTypes.Float:
+          return ercOptions.FloatErcOptions == null || !ercOptions.FloatErcOptions.IsEnabled
+            ? Noop
+            : new FloatPushExpression(ercOptions.FloatErcOptions.GetErcValue(random));
+
+        case StackTypes.Boolean:
+          return ercOptions.BooleanErcOptions == null || !ercOptions.BooleanErcOptions.IsEnabled
+            ? Noop
+            : new BooleanPushExpression(ercOptions.BooleanErcOptions.GetErcValue(random));
+
+        case StackTypes.Name:
+          return ercOptions.NameErcOptions == null || !ercOptions.NameErcOptions.IsEnabled
+            ? Noop
+            : new NamePushExpression(ercOptions.NameErcOptions.GetErcValue(random));
+
+        case StackTypes.String:
+          return ercOptions.StringErcOptions == null || !ercOptions.StringErcOptions.IsEnabled
+            ? Noop
+            : new StringPushExpression(ercOptions.StringErcOptions.GetErcValue(random));
+
+        case StackTypes.Char:
+          return ercOptions.CharErcOptions == null || !ercOptions.CharErcOptions.IsEnabled
+            ? Noop
+            : new CharPushExpression(ercOptions.CharErcOptions.GetErcValue(random));
+
+        case StackTypes.IntegerVector:
+          return ercOptions.IntegerVectorErcOptions == null || !ercOptions.IntegerVectorErcOptions.IsEnabled
+            ? Noop
+            : new IntegerVectorPushExpression(ercOptions.IntegerVectorErcOptions.GetErcValue(random).Select(i => (long)i).ToList());
+
+        case StackTypes.FloatVector:
+          return ercOptions.FloatVectorErcOptions == null || !ercOptions.FloatVectorErcOptions.IsEnabled
+            ? Noop
+            : new FloatVectorPushExpression(ercOptions.FloatVectorErcOptions.GetErcValue(random));
+
+        case StackTypes.StringVector:
+          return ercOptions.StringVectorErcOptions == null || !ercOptions.StringVectorErcOptions.IsEnabled
+            ? Noop
+            : new StringVectorPushExpression(ercOptions.StringVectorErcOptions.GetErcValue(random));
+
+        default:
+          return Noop;
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/LinearCodeGenerator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/LinearCodeGenerator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/LinearCodeGenerator.cs	(revision 15771)
@@ -0,0 +1,55 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public class LinearCodeGenerator {
+    public static PushProgram RandomProgram(IManagedPool<PushProgram> pool, IManagedPool<PooledList<Expression>> expressionListPool, int maxPoints, IRandom random = null, IReadOnlyPushConfiguration pushGpConfiguration = null, IDictionary<string, Expression> customExpressions = null) {
+      var code = RandomCode(maxPoints, expressionListPool, random, pushGpConfiguration, customExpressions);
+
+      return PushProgram.Create(pool, code);
+    }
+
+    public static PushProgram RandomProgram(IManagedPool<PooledList<Expression>> expressionListPool, int maxPoints, IRandom random = null, IReadOnlyPushConfiguration pushGpConfiguration = null, IDictionary<string, Expression> customExpressions = null) {
+      var code = RandomCode(maxPoints, expressionListPool, random, pushGpConfiguration, customExpressions);
+
+      return new PushProgram(code);
+    }
+
+    public static PushProgram RandomProgram(int maxPoints, IRandom random = null, IReadOnlyPushConfiguration pushGpConfiguration = null, IDictionary<string, Expression> customExpressions = null) {
+      var code = RandomCode(maxPoints, null, random, pushGpConfiguration, customExpressions);
+
+      return new PushProgram(code);
+    }
+
+    public static IReadOnlyList<Expression> RandomCode(
+      int maxPoints,
+      IManagedPool<PooledList<Expression>> expressionListPool = null,
+      IRandom random = null,
+      IReadOnlyPushConfiguration config = null,
+      IDictionary<string, Expression> customExpressions = null) {
+      if (maxPoints == 0)
+        return new Expression[0];
+
+      random = random ?? new MersenneTwister();
+      config = config ?? new PushConfiguration();
+
+      var size = maxPoints <= 1 ? 1 : random.Next(1, maxPoints);
+      var expressions = expressionListPool == null ? new List<Expression>(size) : expressionListPool.Get();
+
+      for (var i = 0; i < size; i++) {
+        var expression = CodeGeneratorUtils.MapToExpression(
+          random,
+          config.ErcOptions,
+          config,
+          customExpressions);
+
+        expressions.Add(expression);
+      }
+
+      return expressions;
+    }
+
+
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/RecursiveCodeGenerator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/RecursiveCodeGenerator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/RecursiveCodeGenerator.cs	(revision 15771)
@@ -0,0 +1,70 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  ///     The following is the standard Push random code generation algorithm, which is used for the CODE.RAND instruction.
+  ///     It may also be useful for the initialization of programs in evolutionary computation systems, and it is used for
+  ///     this purpose in PushGP.
+  ///     It produces a uniform distribution of sizes and what seems to be a reasonable distribution of shapes, in a
+  ///     reasonable amount of time.
+  /// </summary>
+  /// <see cref="http://faculty.hampshire.edu/lspector/push3-description.html#RandomCode" />
+  public class RecursiveCodeGenerator {
+
+    public static PushProgram RandomProgram(IManagedPool<PushProgram> pool, int maxPoints, IRandom random = null, IReadOnlyPushConfiguration pushGpConfiguration = null, IDictionary<string, Expression> customExpressions = null) {
+      var code = RandomCode(maxPoints, random, pushGpConfiguration, customExpressions);
+
+      return PushProgram.Create(pool, code.ToList());
+    }
+
+    public static PushProgram RandomProgram(int maxPoints, IRandom random = null, IReadOnlyPushConfiguration pushGpConfiguration = null, IDictionary<string, Expression> customExpressions = null) {
+      var code = RandomCode(maxPoints, random, pushGpConfiguration, customExpressions);
+
+      return new PushProgram(code.ToList());
+    }
+
+    public static IEnumerable<Expression> RandomCode(int maxPoints, IRandom random = null, IReadOnlyPushConfiguration pushGpConfiguration = null, IDictionary<string, Expression> customExpressions = null) {
+      if (maxPoints == 0)
+        return new Expression[0];
+
+      random = random ?? new FastRandom();
+      pushGpConfiguration = pushGpConfiguration ?? new PushConfiguration();
+
+      if (pushGpConfiguration.EnabledExpressions.Count == 0)
+        return new Expression[0];
+
+      var actualPoints = maxPoints == 1 ? 1 : random.Next(1, Math.Max(1, maxPoints));
+
+      return RandomCodeWithSize(actualPoints, random, pushGpConfiguration, customExpressions);
+    }
+
+    private static IEnumerable<Expression> RandomCodeWithSize(int points, IRandom random, IReadOnlyPushConfiguration pushConfiguration, IDictionary<string, Expression> customExpressions = null) {
+      if (points == 1) {
+        return new[] { CodeGeneratorUtils.MapToExpression(
+          random,
+          pushConfiguration.ErcOptions,
+          pushConfiguration,
+          customExpressions)
+        };
+      }
+
+      var maxParts = points - 1;
+
+      return Decompose(maxParts, maxParts, random)
+        .SelectMany(size => RandomCodeWithSize(size, random, pushConfiguration, customExpressions));
+    }
+
+    private static IEnumerable<int> Decompose(int number, int maxParts, IRandom random) {
+      if ((number == 1) || (maxParts == 1))
+        return new[] { number };
+
+      var thisPart = number == 2 ? 1 : random.Next(1, number - 1);
+
+      return new[] { thisPart }.Concat(Decompose(number - thisPart, maxParts - 1, random));
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Individual/IndividualExtensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Individual/IndividualExtensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Individual/IndividualExtensions.cs	(revision 15771)
@@ -0,0 +1,42 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public static class IndividualExtensions {
+
+    public static PushProgram ToPushProgram(this Individual individual, IReadOnlyPushConfiguration config) {
+      return individual.IntegerVector().ToPushProgram(config);
+    }
+
+    public static PushProgram ToPushProgram(this IntegerVector vector, IReadOnlyPushConfiguration config) {
+      //var currentIndex = 0;
+      //var close = 0;
+      var expressions = new List<Expression>(vector.Length);
+
+      for (var i = vector.Length - 1; i >= 0; i--) {
+        var index = vector[i];
+
+        if (index == PushSolutionEncoding.End) break;
+        if (index == PushSolutionEncoding.Noop) continue;
+
+        var name = config.EnabledExpressions[index];
+        var expression = ExpressionTable.GetExpression(name);
+
+        //var expression = CodeGeneratorUtils.MapToExpression(
+        //  index,
+        //  random,
+        //  config.ErcOptions,
+        //  config);
+
+        expressions.Add(expression);
+      }
+
+      return new PushProgram(expressions);
+
+      //using (var mapper = IndividualMapper.Create()) {
+      //  return mapper.FromPlush(vector, ref currentIndex, ref close, 0, config, random);
+      //}
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Individual/InduvidualMapper.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Individual/InduvidualMapper.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Individual/InduvidualMapper.cs	(revision 15771)
@@ -0,0 +1,105 @@
+﻿using System;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public class ListCheck {
+    public PooledList<Expression> List { get; set; }
+    public IManagedPool<PooledList<Expression>> Pool { get; set; }
+    public IndividualMapper Mapper { get; set; }
+  }
+
+  public class IndividualMapper : IDisposable {
+    private static readonly ObjectPool<IndividualMapper> MapperPool = new ObjectPool<IndividualMapper>(() => new IndividualMapper());
+    private static readonly ManagedPoolProvider<PushProgram> PushProgramPoolProvider = new ManagedPoolProvider<PushProgram>(1000, () => new PushProgram());
+    private static readonly ManagedPoolProvider<PooledList<Expression>> ExpressionListPoolProvider = new ManagedPoolProvider<PooledList<Expression>>(1000, () => new PooledList<Expression>());
+
+    private readonly IManagedPool<PushProgram> pushProgramPool = PushProgramPoolProvider.CreatePool();
+    private readonly IManagedPool<PooledList<Expression>> expressionListPool = ExpressionListPoolProvider.CreatePool();
+
+    private IndividualMapper() { }
+
+    public PushProgram FromPlush(
+      IntegerVector vector,
+      ref int currentIndex,
+      ref int close,
+      int depth,
+      IReadOnlyPushConfiguration config,
+      IRandom random) {
+
+      if (currentIndex >= vector.Length)
+        return PushProgram.Empty;
+
+      var expressions = expressionListPool.Get();
+
+      for (; currentIndex < vector.Length; currentIndex++) {
+        var expression = CodeGeneratorUtils.MapToExpression(
+          vector[currentIndex] % config.EnabledExpressions.Count,
+          random,
+          config.ErcOptions,
+          config);
+
+        var expressionType = expression.GetType();
+
+        if (config.CloseBiasLevel > 0) {
+          close += random.NextBiased(0, config.MaxClose, config.CloseBiasLevel);
+
+          // check if expression requires additional blocks
+          if (ExpressionTable.TypeToAttributeTable.ContainsKey(expressionType)) {
+            var attr = ExpressionTable.TypeToAttributeTable[expressionType];
+
+            for (var blockIdx = 0u; blockIdx < attr.RequiredBlockCount && currentIndex < vector.Length; blockIdx++) {
+              if (close != 0) {
+                close--;
+                expressions.Add(PushProgram.Empty);
+              } else {
+                currentIndex++;
+                var subProgram = FromPlush(vector, ref currentIndex, ref close, depth + 1, config, random);
+                var subExpression = subProgram.Count == 1 ? subProgram.Expressions[0] : subProgram;
+
+                expressions.Add(subExpression);
+              }
+            }
+          }
+        }
+
+        expressions.Add(expression);
+
+        if (close > 0 && depth > 0) {
+          close--;
+          break;
+        }
+
+        if (depth == 0) {
+          close = 0;
+        }
+      }
+
+      return PushProgram.Create(pushProgramPool, expressions);
+    }
+
+    public static IndividualMapper Create() {
+      return MapperPool.Allocate();
+    }
+
+    public static void Reset() {
+      foreach (var mapper in MapperPool.Items) {
+        mapper.expressionListPool.Release();
+        mapper.pushProgramPool.Release();
+      }
+    }
+
+    public static void Clear() {
+      Reset();
+
+      PushProgramPoolProvider.Clear();
+      ExpressionListPoolProvider.Clear();
+
+      MapperPool.Clear();
+    }
+
+    public void Dispose() {
+      MapperPool.Free(this);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/Extensions.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/Extensions.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/Extensions.cs	(revision 15771)
@@ -0,0 +1,126 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using System;
+using System.Collections;
+using System.Globalization;
+using System.Reflection;
+using HeuristicLab.BenchmarkSuite;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public static class Extensions {
+    private static readonly IDictionary<StackTypes, PropertyInfo> StackProperties = typeof(PushInterpreter)
+        .GetProperties()
+        .Select(p => new { Property = p, Attribute = p.GetCustomAttribute<PushStackAttribute>() })
+        .Where(x => x.Attribute != null)
+        .ToDictionary(x => x.Attribute.StackType, x => x.Property);
+
+    public static IEnumerable<T> GetStackEntriesByType<T>(this IPushInterpreter interpreter, StackTypes stackType) {
+      return StackProperties.ContainsKey(stackType)
+        ? ((IEnumerable)StackProperties[stackType].GetValue(interpreter)).OfType<T>()
+        : null;
+    }
+
+    public static string StringifyResult(this IPushInterpreter interpreter, ExampleArgumentType type, int offset) {
+      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 interpreter.PrintStack.ToString();
+
+        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;
+    }
+
+    public static void PrintStacks(this IPushInterpreter interpreter) {
+      var maxStackNameLength = interpreter.Stacks.Max(x => x.Key.ToString().Length);
+      var totalLength = maxStackNameLength + 6;
+
+      foreach (var pair in interpreter.Stacks) {
+        var stackName = pair.Key.ToString();
+        var stack = interpreter.Stacks[pair.Key];
+
+        if (stack.IsEmpty || !stack.IsEnabled)
+          continue;
+
+        var stackString = string.Join(" ", interpreter.StringifyStack(pair.Key));
+
+        //var padLength = (totalLength - stackName.Length) / 2;
+        //var padLengthLeft = stackName.Length + padLength;
+        //var padLengthRight = padLengthLeft + padLength;
+        //Console.WriteLine("{0}\n{1}\n", stackName.PadLeft(padLengthLeft, '-').PadRight(padLengthRight, '-'), stackString);
+
+        Console.WriteLine("{0}: {1}", stackName, stackString);
+      }
+
+      if (interpreter.CustomExpressions.Count > 0) {
+        Console.WriteLine("--------- Custom Expressions ---------");
+        foreach (var ce in interpreter.CustomExpressions) {
+          Console.WriteLine("{0}: {1}", ce.Key, ce.Value);
+        }
+      }
+    }
+
+    public static void InitExample(this IPushInterpreter interpreter, Example example) {
+      if (interpreter.Configuration.TopLevelPushInputArguments) {
+        interpreter.BooleanStack.Push(example.InputBoolean);
+        interpreter.IntegerStack.Push(example.InputInteger);
+        interpreter.FloatStack.Push(example.InputFloat);
+        interpreter.CharStack.Push(example.InputChar);
+        interpreter.StringStack.Push(example.InputString);
+        interpreter.StringVectorStack.Push(example.InputStringVector);
+        interpreter.IntegerVectorStack.Push(example.InputIntegerVector);
+        interpreter.FloatVectorStack.Push(example.InputFloatVector);
+      }
+
+      // init in expressions
+      interpreter.SetInput(
+        integers: example.InputInteger,
+        floats: example.InputFloat,
+        booleans: example.InputBoolean,
+        chars: example.InputChar,
+        strings: example.InputString,
+        integerVectors: example.InputIntegerVector,
+        floatVectors: example.InputFloatVector,
+        stringVectors: example.InputStringVector);
+    }
+  }
+}
+
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IInternalPushInterpreter.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IInternalPushInterpreter.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IInternalPushInterpreter.cs	(revision 15771)
@@ -0,0 +1,9 @@
+﻿using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public interface IInternalPushInterpreter : IPushInterpreter {
+    InterpreterPoolContainer PoolContainer { get; }
+    bool IsNameQuoteFlagSet { get; set; }
+    IReadOnlyList<Expression> InputExpressions { get; }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IPushInterpreter.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IPushInterpreter.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IPushInterpreter.cs	(revision 15771)
@@ -0,0 +1,50 @@
+﻿using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public interface IPushInterpreter {
+    IRandom Random { get; }
+    IPushStack<Expression> CodeStack { get; }
+    IPushStack<Expression> ExecStack { get; }
+    IPushStack<string> NameStack { get; }
+    IPushStack<bool> BooleanStack { get; }
+    IPushStack<long> IntegerStack { get; }
+    IPushStack<double> FloatStack { get; }
+    IPushStack<char> CharStack { get; }
+    IPushStack<string> StringStack { get; }
+    IPushStack<IReadOnlyList<long>> IntegerVectorStack { get; }
+    IPushStack<IReadOnlyList<double>> FloatVectorStack { get; }
+    IPushStack<IReadOnlyList<bool>> BooleanVectorStack { get; }
+    IPushStack<IReadOnlyList<string>> StringVectorStack { get; }
+    IPrintStack PrintStack { get; }
+    IDictionary<string, Expression> CustomExpressions { get; }
+    IReadOnlyDictionary<StackTypes, IPushStack> Stacks { get; }
+    IReadOnlyPushConfiguration Configuration { get; }
+    void ClearStacks();
+    void Reset(IRandom random = null);
+
+    void SetInput(
+      IReadOnlyList<long> integers = null,
+      IReadOnlyList<double> floats = null,
+      IReadOnlyList<bool> booleans = null,
+      IReadOnlyList<char> chars = null,
+      IReadOnlyList<string> strings = null,
+      IReadOnlyList<IReadOnlyList<long>> integerVectors = null,
+      IReadOnlyList<IReadOnlyList<double>> floatVectors = null,
+      IReadOnlyList<IReadOnlyList<string>> stringVectors = null);
+
+    void Run(bool stepwise);
+    void Run(string code, bool stepwise = false);
+    void Run(Expression expression, bool stepwise = false);
+    Task RunAsync(Expression expression, CancellationToken token = default(CancellationToken));
+    Task RunAsync(string code, CancellationToken token = default(CancellationToken));
+    Task AbortAndResetAsync();
+    Task AbortAsync();
+    Task PauseAsync();
+    void Resume();
+    Task ResumeAsync();
+    bool Step();
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/InterpreterPoolContainer.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/InterpreterPoolContainer.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/InterpreterPoolContainer.cs	(revision 15771)
@@ -0,0 +1,93 @@
+﻿using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public class InterpreterPoolContainer {
+    private readonly ManagedPoolProvider<PushProgram> pushProgramPoolProvider;
+    private readonly ManagedPoolProvider<PooledList<Expression>> expressionListPoolProvider;
+
+    private readonly IDictionary<Type, ManagedPoolProvider<Expression>> statefulExpressionPoolProviders
+      = new Dictionary<Type, ManagedPoolProvider<Expression>>();
+
+    private readonly IDictionary<Type, IManagedPool<Expression>> statefulExpressionPools
+      = new Dictionary<Type, IManagedPool<Expression>>();
+
+    public InterpreterPoolContainer(int partitionSize = 512, int maxPartitionCount = 1024) {
+      pushProgramPoolProvider = new ManagedPoolProvider<PushProgram>(partitionSize, () => new PushProgram(), maxPartitionCount);
+      expressionListPoolProvider = new ManagedPoolProvider<PooledList<Expression>>(partitionSize, () => new PooledList<Expression>(), maxPartitionCount);
+
+      InitStatefulExpressionPools(partitionSize, maxPartitionCount);
+    }
+
+    public InterpreterPoolContainer(
+      ManagedPoolProvider<PushProgram> pushProgramPoolProvider,
+      ManagedPoolProvider<PooledList<Expression>> expressionListPoolProvider) {
+      this.pushProgramPoolProvider = pushProgramPoolProvider;
+      this.expressionListPoolProvider = expressionListPoolProvider;
+
+      InitStatefulExpressionPools(1024, 2048);
+    }
+
+    private IManagedPool<PushProgram> pushProgramPool;
+    public IManagedPool<PushProgram> PushProgramPool {
+      get {
+        if (pushProgramPool == null) pushProgramPool = pushProgramPoolProvider.CreatePool();
+        return pushProgramPool;
+      }
+    }
+
+    private IManagedPool<PooledList<Expression>> expressionListPool;
+    public IManagedPool<PooledList<Expression>> ExpressionListPool {
+      get {
+        if (expressionListPool == null) expressionListPool = expressionListPoolProvider.CreatePool();
+        return expressionListPool;
+      }
+    }
+
+    private void InitStatefulExpressionPools(int partitionSize, int maxPartitionCount) {
+      foreach (var type in ExpressionTable.StatefulExpressionTypes) {
+        statefulExpressionPoolProviders.Add(type, new ManagedPoolProvider<Expression>(
+          partitionSize,
+          ExpressionTable.StatefulExpressionFactory[type],
+          maxPartitionCount));
+
+        statefulExpressionPools.Add(type, null);
+      }
+    }
+
+    public T GetStatefulExpression<T>() where T : Expression {
+      var type = typeof(T);
+      if (statefulExpressionPools[type] == null)
+        statefulExpressionPools[type] = statefulExpressionPoolProviders[type].CreatePool();
+
+      return (T)statefulExpressionPools[type].Get();
+    }
+
+    public IManagedPool<Expression> GetStatefulExpressionPool<T>() where T : Expression {
+      var type = typeof(T);
+      return statefulExpressionPools[type] ?? (statefulExpressionPools[type] = statefulExpressionPoolProviders[type].CreatePool());
+    }
+
+    public void DisposePools() {
+      if (pushProgramPool != null) {
+        pushProgramPool.Dispose();
+        pushProgramPool = null;
+      }
+
+      if (expressionListPool != null) {
+        expressionListPool.Dispose();
+        expressionListPool = null;
+      }
+
+      for (var i = 0; i < ExpressionTable.StatefulExpressionTypes.Count; i++) {
+        var type = ExpressionTable.StatefulExpressionTypes[i];
+        var pool = statefulExpressionPools[type];
+
+        if (pool != null) {
+          pool.Dispose();
+          statefulExpressionPools[type] = null;
+        }
+      }
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PooledPushInterpreter.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PooledPushInterpreter.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PooledPushInterpreter.cs	(revision 15771)
@@ -0,0 +1,19 @@
+﻿using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public class PooledPushInterpreter : PushInterpreter {
+
+    private readonly PushInterpreterPool pool;
+
+    public PooledPushInterpreter(PushInterpreterPool pool, IReadOnlyPushConfiguration config, InterpreterPoolContainer poolContainer, IRandom random = null)
+      : base(config, random, poolContainer) {
+      this.pool = pool;
+    }
+
+    public override void Dispose() {
+      base.Dispose();
+      ClearStacks();
+      pool.Free(this);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs	(revision 15771)
@@ -0,0 +1,445 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Threading;
+using System.Threading.Tasks;
+using HeuristicLab.Core;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public class PushInterpreter : IInternalPushInterpreter, IDisposable {
+    private Task currentTask;
+    private int evalPushLimit;
+
+    /// <summary>
+    /// An interpreter for Push
+    /// </summary>
+    /// <param name="config">Determines the runtime behavior of the interpreter</param>
+    /// <param name="random">Note that random may be reseted</param>
+    /// <param name="poolContainer">Used to save resources used by the interpreter</param>
+    public PushInterpreter(IReadOnlyPushConfiguration config = null, IRandom random = null, InterpreterPoolContainer poolContainer = null) {
+      randomOrigin = random ?? new MersenneTwister();
+      Random = (IRandom)randomOrigin.Clone();
+      Configuration = config ?? new PushConfiguration();
+
+      ExecStack = new PushStack<Expression>(Configuration.MaxProgramLength);
+      CodeStack = new PushStack<Expression>();
+      NameStack = new PushStack<string>();
+      BooleanStack = new PushStack<bool>();
+      IntegerStack = new PushStack<long>();
+      FloatStack = new PushStack<double>();
+      CharStack = new PushStack<char>();
+      StringStack = new PushStack<string>();
+      IntegerVectorStack = new PushStack<IReadOnlyList<long>>();
+      FloatVectorStack = new PushStack<IReadOnlyList<double>>();
+      BooleanVectorStack = new PushStack<IReadOnlyList<bool>>();
+      StringVectorStack = new PushStack<IReadOnlyList<string>>();
+      PrintStack = new PrintStack();
+
+      Stacks = new Dictionary<StackTypes, IPushStack> {
+        { StackTypes.Exec, ExecStack },
+        { StackTypes.Code, CodeStack },
+        { StackTypes.Integer, IntegerStack },
+        { StackTypes.Float, FloatStack },
+        { StackTypes.Boolean, BooleanStack },
+        { StackTypes.Char, CharStack },
+        { StackTypes.String, StringStack },
+        { StackTypes.Name, NameStack },
+        { StackTypes.Print, PrintStack },
+        { StackTypes.IntegerVector, IntegerVectorStack },
+        { StackTypes.FloatVector, FloatVectorStack },
+        { StackTypes.BooleanVector, BooleanVectorStack },
+        { StackTypes.StringVector, StringVectorStack },
+      };
+
+      supportedStackTypes = Stacks.Keys.ToArray();
+
+      CustomExpressions = new Dictionary<string, Expression>();
+      PoolContainer = poolContainer ?? new InterpreterPoolContainer();
+
+      InitEvalPushLimit();
+      ConfigureStacks();
+    }
+
+    public PushInterpreter(int seed, IReadOnlyPushConfiguration config = null)
+      : this(config, new FastRandom(seed)) {
+    }
+
+    private readonly StackTypes[] supportedStackTypes;
+    public IReadOnlyDictionary<StackTypes, IPushStack> Stacks { get; private set; }
+
+    private IRandom randomOrigin;
+    public IRandom Random { get; private set; }
+
+    public long ExecCounter { get; private set; }
+
+    public bool IsPaused { get; private set; }
+
+    public bool IsAborted { get; private set; }
+
+    public bool IsRunning {
+      get {
+        return !ExecStack.IsEmpty &&
+               !IsPaused &&
+               !IsAborted &&
+               (ExecCounter < evalPushLimit);
+      }
+    }
+
+    public bool IsCompleted {
+      get {
+        return ExecStack.IsEmpty || ExecCounter >= Configuration.EvalPushLimit;
+      }
+    }
+
+    public bool CanStep {
+      get {
+        return !IsCompleted && !IsAborted && IsPaused;
+      }
+    }
+
+    public InterpreterPoolContainer PoolContainer { get; private set; }
+
+    public IReadOnlyPushConfiguration Configuration { get; protected set; }
+    [PushStack(StackTypes.Code)]
+    public IPushStack<Expression> CodeStack { get; private set; }
+    [PushStack(StackTypes.Exec)]
+    public IPushStack<Expression> ExecStack { get; private set; }
+    [PushStack(StackTypes.Name)]
+    public IPushStack<string> NameStack { get; private set; }
+    [PushStack(StackTypes.Boolean)]
+    public IPushStack<bool> BooleanStack { get; private set; }
+    [PushStack(StackTypes.Integer)]
+    public IPushStack<long> IntegerStack { get; private set; }
+    [PushStack(StackTypes.Float)]
+    public IPushStack<double> FloatStack { get; private set; }
+    [PushStack(StackTypes.Char)]
+    public IPushStack<char> CharStack { get; private set; }
+    [PushStack(StackTypes.String)]
+    public IPushStack<string> StringStack { get; private set; }
+    [PushStack(StackTypes.IntegerVector)]
+    public IPushStack<IReadOnlyList<long>> IntegerVectorStack { get; private set; }
+    [PushStack(StackTypes.FloatVector)]
+    public IPushStack<IReadOnlyList<double>> FloatVectorStack { get; private set; }
+    [PushStack(StackTypes.BooleanVector)]
+    public IPushStack<IReadOnlyList<bool>> BooleanVectorStack { get; private set; }
+    [PushStack(StackTypes.StringVector)]
+    public IPushStack<IReadOnlyList<string>> StringVectorStack { get; private set; }
+    [PushStack(StackTypes.Print)]
+    public IPrintStack PrintStack { get; private set; }
+
+    public IDictionary<string, Expression> CustomExpressions { get; private set; }
+
+    public bool IsNameQuoteFlagSet { get; set; }
+
+    private readonly List<Expression> inputExpressions = new List<Expression>();
+    IReadOnlyList<Expression> IInternalPushInterpreter.InputExpressions { get { return inputExpressions; } }
+
+    public void SetInput(
+      IReadOnlyList<long> integers = null,
+      IReadOnlyList<double> floats = null,
+      IReadOnlyList<bool> booleans = null,
+      IReadOnlyList<char> chars = null,
+      IReadOnlyList<string> strings = null,
+      IReadOnlyList<IReadOnlyList<long>> integerVectors = null,
+      IReadOnlyList<IReadOnlyList<double>> floatVectors = null,
+      IReadOnlyList<IReadOnlyList<string>> stringVectors = null) {
+
+      // Integer
+      if (integers != null && integers.Count > 0) {
+        var integerPushExpressionPool = PoolContainer.GetStatefulExpressionPool<IntegerPushExpression>();
+
+        for (var i = 0; i < integers.Count; i++) {
+          var expression = IntegerPushExpression.Create(integerPushExpressionPool, integers[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // Float
+      if (floats != null && floats.Count > 0) {
+        var floatPushExpressionPool = PoolContainer.GetStatefulExpressionPool<FloatPushExpression>();
+
+        for (var i = 0; i < floats.Count; i++) {
+          var expression = FloatPushExpression.Create(floatPushExpressionPool, floats[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // Booleans
+      if (booleans != null && booleans.Count > 0) {
+        var booleanPushExpressionPool = PoolContainer.GetStatefulExpressionPool<BooleanPushExpression>();
+
+        for (var i = 0; i < booleans.Count; i++) {
+          var expression = BooleanPushExpression.Create(booleanPushExpressionPool, booleans[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // Char
+      if (chars != null && chars.Count > 0) {
+        var charPushExpressionPool = PoolContainer.GetStatefulExpressionPool<CharPushExpression>();
+
+        for (var i = 0; i < chars.Count; i++) {
+          var expression = CharPushExpression.Create(charPushExpressionPool, chars[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // String
+      if (strings != null && strings.Count > 0) {
+        var stringPushExpressionPool = PoolContainer.GetStatefulExpressionPool<StringPushExpression>();
+
+        for (var i = 0; i < strings.Count; i++) {
+          var expression = StringPushExpression.Create(stringPushExpressionPool, strings[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // IntegerVector
+      if (integerVectors != null && integerVectors.Count > 0) {
+        var integerVectorPushExpressionPool = PoolContainer.GetStatefulExpressionPool<IntegerVectorPushExpression>();
+
+        for (var i = 0; i < integerVectors.Count; i++) {
+          var expression = IntegerVectorPushExpression.Create(integerVectorPushExpressionPool, integerVectors[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // FloatVector
+      if (floatVectors != null && floatVectors.Count > 0) {
+        var floatVectorPushExpressionPool = PoolContainer.GetStatefulExpressionPool<FloatVectorPushExpression>();
+
+        for (var i = 0; i < floatVectors.Count; i++) {
+          var expression = FloatVectorPushExpression.Create(floatVectorPushExpressionPool, floatVectors[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // StringVector
+      if (stringVectors != null && stringVectors.Count > 0) {
+        var stringVectorPushExpressionPool = PoolContainer.GetStatefulExpressionPool<StringVectorPushExpression>();
+
+        for (var i = 0; i < stringVectors.Count; i++) {
+          var expression = StringVectorPushExpression.Create(stringVectorPushExpressionPool, stringVectors[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+    }
+
+
+    public Task RunAsync(string code, CancellationToken token = default(CancellationToken)) {
+      var program = PushParser.Parse(code);
+      currentTask = RunAsync(program, token);
+      return currentTask;
+    }
+    public async Task RunAsync(Expression expression, CancellationToken token = default(CancellationToken)) {
+      await Task.Run(() => Run(expression), token);
+    }
+
+    public void Run(string code, bool stepwise = false) {
+      var program = PushParser.Parse(code);
+      Run(program, stepwise);
+    }
+
+    public void Run(bool stepwise) {
+      Run(PushProgram.Empty, stepwise);
+    }
+
+    public void Run(Expression expression, bool stepwise = false) {
+      IsPaused = stepwise;
+
+      /* Push top expression so the loop is able to enter
+       * If the top expression is a single statement it gets evaluated in Run.
+       * Otherwise the push program will be evaluated and the expressions of the program are pushed onto the EXEC stack.
+       * Expanding the initial program is not counted in ExecCount */
+      InitRun(expression);
+
+      if (Configuration.TopLevelPushCode && CodeStack.IsEnabled)
+        CodeStack.Push(expression);
+
+      Run();
+    }
+
+    public bool CanRun(int count) {
+      return ExecStack.Count >= count &&
+             !IsPaused &&
+             !IsAborted &&
+             ExecCounter + count < Configuration.EvalPushLimit;
+    }
+
+    public async Task AbortAsync() {
+      if (IsAborted || IsCompleted) return;
+
+      IsAborted = true;
+
+      PoolContainer.DisposePools();
+
+      if (currentTask != null) await currentTask;
+    }
+
+    public async Task AbortAndResetAsync() {
+      await AbortAsync();
+      Reset();
+    }
+
+    public async Task PauseAsync() {
+      if (IsPaused || IsCompleted) return;
+
+      IsPaused = true;
+
+      if (currentTask != null) await currentTask;
+    }
+
+    public async Task ResumeAsync() {
+      if (IsPaused || !IsAborted) {
+        IsPaused = false;
+        await InterpretAsync();
+      } else await currentTask;
+    }
+
+    public void Resume() {
+      if (!IsPaused && IsAborted)
+        return;
+
+      IsPaused = false;
+      Run();
+    }
+
+    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    public bool Step() {
+      if (!CanStep) return false;
+
+      var successful = DoStep();
+
+      if (IsCompleted)
+        Finally();
+
+      return successful;
+    }
+
+    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    public void Step(int count) {
+      for (var i = 0u; i < count; i++) Step();
+    }
+
+    /// <summary>
+    /// Reset interpreter which clears and reconfigures stacks and local variables
+    /// </summary>
+    public void Reset(IRandom random = null) {
+      if (random != null)
+        randomOrigin = random;
+
+      // Reset Random
+      Random = (IRandom)randomOrigin.Clone();
+
+      InitEvalPushLimit();
+
+      ExecCounter = 0;
+      IsAborted = false;
+      IsPaused = false;
+      currentTask = null;
+
+      inputExpressions.Clear();
+      ClearStacks();
+      ConfigureStacks();
+    }
+
+    private void InitEvalPushLimit() {
+      // evalPushLimit is accessed very often and using the getter of the configuration object is rather expensive as the values is capsuled within a parameter
+      evalPushLimit = Configuration.EvalPushLimit;
+    }
+
+    private void EvalPushLimitChanged(object sender, EventArgs e) {
+      this.evalPushLimit = Configuration.EvalPushLimit;
+    }
+
+    private void ConfigureStacks() {
+      for (var i = 0u; i < supportedStackTypes.Length; i++) {
+        var key = supportedStackTypes[i];
+        Stacks[key].IsEnabled = Configuration.IsStackEnabled(key);
+      }
+
+      // exec stack must always be enabled
+      this.ExecStack.IsEnabled = true;
+    }
+
+    /// <summary>
+    /// Clears Stacks and custom expressions
+    /// </summary>
+    public void ClearStacks() {
+      for (var i = 0u; i < supportedStackTypes.Length; i++) {
+        var key = supportedStackTypes[i];
+        Stacks[key].Clear();
+      }
+
+      CustomExpressions.Clear();
+    }
+
+    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    private void Run() {
+      // if no stack which is modifies the exec stack is enabled, unroll loop due to performance reasons
+      if (!Configuration.IsStackEnabled(StackTypes.Exec)) {
+        while (CanRun(10))
+          DoTenSteps();
+      }
+
+      while (IsRunning)
+        DoStep();
+
+      if (IsCompleted)
+        Finally();
+    }
+
+    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    private void Finally() {
+      if (Configuration.TopLevelPopCode && !CodeStack.IsEmpty && CodeStack.IsEnabled)
+        CodeStack.Pop();
+
+      PoolContainer.DisposePools();
+    }
+
+    private void InitRun(Expression expression) {
+      ExecStack.Push(expression);
+
+      if (!expression.IsProgram)
+        return;
+
+      DoStep();
+      ExecCounter--;   // unpacking the initial program is not counted
+    }
+
+    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    private bool DoStep() {
+      ExecCounter++;
+      return ExecStack.Pop().TryEval(this);
+    }
+
+    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    private void DoTenSteps() {
+      ExecStack[0].TryEval(this);
+      ExecStack[1].TryEval(this);
+      ExecStack[2].TryEval(this);
+      ExecStack[3].TryEval(this);
+      ExecStack[4].TryEval(this);
+      ExecStack[5].TryEval(this);
+      ExecStack[6].TryEval(this);
+      ExecStack[7].TryEval(this);
+      ExecStack[8].TryEval(this);
+      ExecStack[9].TryEval(this);
+
+      ExecStack.Remove(10);
+      ExecCounter += 10;
+    }
+
+    private Task InterpretAsync() {
+      currentTask = Task.Run(() => Run());
+
+      return currentTask;
+    }
+
+    public virtual void Dispose() {
+      PoolContainer.DisposePools();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs	(revision 15771)
@@ -0,0 +1,49 @@
+﻿using System;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public class PushInterpreterPool {
+    private readonly ObjectPool<PooledPushInterpreter> pool;
+
+    public readonly ManagedPoolProvider<PushProgram> PushProgramPoolProvider;
+    public readonly ManagedPoolProvider<PooledList<Expression>> ExpressionListPoolProvider;
+
+    public PushInterpreterPool(IReadOnlyPushConfiguration config = null)
+      : this(Environment.ProcessorCount * 4, 1024, null, config) {
+    }
+
+    public PushInterpreterPool(int size, int poolPartitionSize, int? maxPartitionCount = null, IReadOnlyPushConfiguration config = null) {
+      PushConfiguration = config ?? new PushConfiguration();
+
+      PushProgramPoolProvider = new ManagedPoolProvider<PushProgram>(poolPartitionSize, () => new PushProgram(), maxPartitionCount);
+      ExpressionListPoolProvider = new ManagedPoolProvider<PooledList<Expression>>(poolPartitionSize, () => new PooledList<Expression>(), maxPartitionCount);
+
+      pool = new ObjectPool<PooledPushInterpreter>(CreateInterpreter, size);
+    }
+
+    private PooledPushInterpreter CreateInterpreter() {
+      var poolContainer = new InterpreterPoolContainer(PushProgramPoolProvider, ExpressionListPoolProvider);
+      return new PooledPushInterpreter(this, PushConfiguration, poolContainer);
+    }
+
+    public IReadOnlyPushConfiguration PushConfiguration { get; private set; }
+
+    public PooledPushInterpreter Create(IRandom random = null) {
+      var interpreter = pool.Allocate();
+      interpreter.Reset(random);
+
+      return interpreter;
+    }
+
+    public void Free(PooledPushInterpreter interpreter) {
+      interpreter.ClearStacks();
+      pool.Free(interpreter);
+    }
+
+    public void Clear() {
+      PushProgramPoolProvider.Clear();
+      ExpressionListPoolProvider.Clear();
+      pool.Clear();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Manipulator/IPlushManipulator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Manipulator/IPlushManipulator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Manipulator/IPlushManipulator.cs	(revision 15771)
@@ -0,0 +1,12 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public interface IPlushManipulator : IPlushOperator, IManipulator {
+    IValueLookupParameter<PercentValue> InInstructionProbabilityParameter { get; }
+    IValueLookupParameter<IReadOnlyErcOptions> ErcOptionsParameter { get; }
+    IValueLookupParameter<IReadOnlyExpressionsConfiguration> InstructionsParameter { get; }
+    ILookupParameter<PlushVector> PlushVectorParameter { get; }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Manipulator/UniformMutation.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Manipulator/UniformMutation.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Manipulator/UniformMutation.cs	(revision 15771)
@@ -0,0 +1,193 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Uniformly distributed change of a single position of an integer vector.
+  /// </summary>
+  [Item("UniformMutation", " Uniformly distributed change of a single position of an plush vector.")]
+  [StorableClass]
+  public class UniformMutation : InstrumentedOperator, IPlushManipulator, IStochasticOperator {
+
+    public UniformMutation() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new LookupParameter<PlushVector>("PlushVector", "The vector which should be manipulated."));
+      Parameters.Add(new ValueLookupParameter<IReadOnlyExpressionsConfiguration>("Instructions", "The enabled instructions"));
+      Parameters.Add(new ValueLookupParameter<IReadOnlyErcOptions>("ErcOptions", "ERC options"));
+      Parameters.Add(new ValueLookupParameter<PercentValue>("InInstructionProbability", "The probability of IN Instructions"));
+
+      Parameters.Add(new FixedValueParameter<PercentValue>("InstructionMutationProbability", "The probability instructions get mutated", new PercentValue(0.8)));
+      Parameters.Add(new FixedValueParameter<PercentValue>("InstructionMutationRate", "The probability an instruction gets mutated", new PercentValue(0.01)));
+      Parameters.Add(new FixedValueParameter<PercentValue>("InstructionConstantTweakRate", "When mutating an instruction, this parameter specifies if mutation is related to the current type (e.g. INTEGER, FLOAT) or not. ", new PercentValue(0)));
+      Parameters.Add(new FixedValueParameter<PercentValue>("CloseMutationProbability", "The probability close gets mutated", new PercentValue(0.2)));
+      Parameters.Add(new FixedValueParameter<PercentValue>("CloseIncrementRate", "When mutating individual, the increment rate specifies if close should be increased or decreased by 1.", new PercentValue(0.1)));
+    }
+
+    public UniformMutation(bool deserializing) : base(deserializing) {
+    }
+
+    public UniformMutation(UniformMutation origin, Cloner cloner) : base(origin, cloner) {
+    }
+
+    public IValueParameter<PercentValue> InstructionMutationProbabilityParameter {
+      get { return (IValueParameter<PercentValue>)Parameters["InstructionMutationProbability"]; }
+    }
+
+    public double InstructionMutationProbability {
+      get { return InstructionMutationProbabilityParameter.Value.Value; }
+      set { InstructionMutationProbabilityParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<PercentValue> InstructionMutationRateParameter {
+      get { return (IValueParameter<PercentValue>)Parameters["InstructionMutationRate"]; }
+    }
+
+    public double InstructionMutationRate {
+      get { return InstructionMutationRateParameter.Value.Value; }
+      set { InstructionMutationRateParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<PercentValue> InstructionConstantTweakRateParameter {
+      get { return (IValueParameter<PercentValue>)Parameters["InstructionConstantTweakRate"]; }
+    }
+
+    public double InstructionConstantTweakRate {
+      get { return InstructionConstantTweakRateParameter.Value.Value; }
+      set { InstructionConstantTweakRateParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<PercentValue> CloseMutationProbabilityParameter {
+      get { return (IValueParameter<PercentValue>)Parameters["CloseMutationProbability"]; }
+    }
+
+    public double CloseMutationProbability {
+      get { return CloseMutationProbabilityParameter.Value.Value; }
+      set { CloseMutationProbabilityParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<PercentValue> CloseIncrementRateParameter {
+      get { return (IValueParameter<PercentValue>)Parameters["CloseIncrementRate"]; }
+    }
+
+    public double CloseIncrementRate {
+      get { return CloseIncrementRateParameter.Value.Value; }
+      set { CloseIncrementRateParameter.Value.Value = value; }
+    }
+
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<PlushVector> PlushVectorParameter {
+      get { return (ILookupParameter<PlushVector>)Parameters["PlushVector"]; }
+    }
+    public IValueLookupParameter<IReadOnlyExpressionsConfiguration> InstructionsParameter {
+      get { return (IValueLookupParameter<IReadOnlyExpressionsConfiguration>)Parameters["Instructions"]; }
+    }
+    public IValueLookupParameter<IReadOnlyErcOptions> ErcOptionsParameter {
+      get { return (IValueLookupParameter<IReadOnlyErcOptions>)Parameters["ErcOptions"]; }
+    }
+    public IValueLookupParameter<PercentValue> InInstructionProbabilityParameter {
+      get { return (IValueLookupParameter<PercentValue>)Parameters["InInstructionProbability"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UniformMutation(this, cloner);
+    }
+
+    public sealed override IOperation InstrumentedApply() {
+      Manipulate(
+        RandomParameter.ActualValue,
+        PlushVectorParameter.ActualValue,
+        ErcOptionsParameter.ActualValue,
+        InstructionsParameter.ActualValue,
+        InInstructionProbabilityParameter.ActualValue.Value,
+        CloseMutationProbability,
+        CloseIncrementRate,
+        InstructionMutationProbability,
+        InstructionMutationRate,
+        InstructionConstantTweakRate);
+      return base.InstrumentedApply();
+    }
+
+    private static void Manipulate(
+      IRandom random,
+      PlushVector plushVector,
+      IReadOnlyErcOptions ercOptions,
+      IReadOnlyExpressionsConfiguration instructions,
+      double inInstructionProbability,
+      double closeMutationProbability,
+      double closeIncrementRate,
+      double instructionMutationProbability,
+      double instructionMutationRate,
+      double constantTweakRate
+      ) {
+
+      var x = random.NextDouble();
+
+      // instruction manipulation
+      if (x < instructionMutationProbability) {
+        if (instructionMutationRate == 0) return;
+        for (var i = 0; i < plushVector.Entries.Count; i++) {
+          MutateInstruction(random, ercOptions, instructions, inInstructionProbability, instructionMutationRate, constantTweakRate, plushVector[i]);
+        }
+
+        plushVector.UpdatePushProgram();
+        return;
+      }
+
+      // close manipulation
+      if (x < instructionMutationProbability + closeMutationProbability) {
+        if (closeIncrementRate == 0) return;
+        for (var i = 0; i < plushVector.Entries.Count; i++) {
+          MutateClose(random, closeIncrementRate, plushVector[i]);
+        }
+
+        plushVector.UpdatePushProgram();
+        return;
+      }
+    }
+
+    private static void MutateClose(IRandom random, double closeIncrementRate, PlushEntry entry) {
+      entry.Close += random.NextDouble() < closeIncrementRate ? 1 : -1;
+
+      if (entry.Close < 0)
+        entry.Close = 0;
+    }
+
+    private static void MutateInstruction(
+      IRandom random,
+      IReadOnlyErcOptions ercOptions,
+      IReadOnlyExpressionsConfiguration instructions,
+      double inInstructionProbability,
+      double instructionMutationRate,
+      double constantTweakRate,
+      PlushEntry entry) {
+
+      if (random.NextDouble() >= instructionMutationRate)
+        return;
+
+      var entryType = entry.Instruction.GetType();
+
+      if (constantTweakRate > 0 && random.NextDouble() < constantTweakRate &&
+          entryType.IsSubclass(typeof(PushExpression<>))) {
+        var attribute = ExpressionTable.TypeToAttributeTable[entryType];
+        entry.Instruction = CodeGeneratorUtils.CreateRandomErcExpression(attribute.StackType, random, ercOptions);
+        return;
+      }
+
+      entry.Instruction = CodeGeneratorUtils.GetRandomExpression(
+        random,
+        ercOptions,
+        instructions,
+        inInstructionProbability);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/ObjectPools/Random/SeededRandomPool.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/ObjectPools/Random/SeededRandomPool.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/ObjectPools/Random/SeededRandomPool.cs	(revision 15771)
@@ -0,0 +1,36 @@
+﻿using System;
+
+using HeuristicLab.Core;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  public class SeededRandomPool {
+    public int Seed;
+    protected readonly ObjectPool<IRandom> Pool;
+
+    public SeededRandomPool() : this(new System.Random().Next()) { }
+
+    public SeededRandomPool(int seed) : this(seed, () => new FastRandom()) { }
+
+    public SeededRandomPool(int seed, Func<IRandom> randomCreator) {
+      Seed = seed;
+      Pool = new ObjectPool<IRandom>(randomCreator);
+    }
+
+    public IRandom ResetAndAllocate() {
+      var random = Pool.Allocate();
+      random.Reset(Seed);
+
+      return random;
+    }
+
+    public void Free(IRandom random) {
+      Pool.Free(random);
+    }
+
+    public void Clear() {
+      Pool.Clear();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/ObjectPools/StringBuilderPool.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/ObjectPools/StringBuilderPool.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/ObjectPools/StringBuilderPool.cs	(revision 15771)
@@ -0,0 +1,8 @@
+﻿using System.Text;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+
+  public static class StringBuilderPool {
+    public static readonly ObjectPool<StringBuilder> Instance = new ObjectPool<StringBuilder>(() => new StringBuilder());
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Parser/PushParser.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Parser/PushParser.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Parser/PushParser.cs	(revision 15771)
@@ -0,0 +1,250 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text.RegularExpressions;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public static class PushParser {
+    private const char delimiter = ' ';
+
+    private static readonly CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture("en-US");
+
+    private static readonly char[] symbolTrim = { '\r', '\n' };
+
+    public static Expression Parse(string source, int startIndex = 0) {
+      bool error;
+      var symbols = GetSymbols(source, out error); // source.Split(delimiter);
+
+      int endIndex;
+      return Parse(symbols, startIndex, out endIndex);
+    }
+
+    public static PushProgram ParseProgram(string source, int startIndex = 0) {
+      var expression = Parse(source, startIndex);
+
+      return expression as PushProgram ?? new PushProgram(new[] { expression });
+    }
+
+    private static IReadOnlyList<string> GetSymbols(string source, out bool error) {
+      var chars = source.ToCharArray();
+      var symbols = new List<string>();
+
+      for (var i = 0; i < chars.Length; i++) {
+        var cur = chars[i];
+        int endIndex;
+        int length;
+        string str;
+
+        switch (cur) {
+          case delimiter: break;
+          case PushEnvironment.StringSymbol:
+            endIndex = source.IndexOf(PushEnvironment.StringSymbol, i + 1);
+            if (endIndex < i) {
+              error = true;
+              return symbols;
+            }
+
+            length = endIndex - i + 1;
+            str = source.Substring(i, length);
+            symbols.Add(str);
+            i += length; // skip following space
+
+            break;
+
+          case PushEnvironment.CharSymbol:
+            endIndex = source.IndexOf(PushEnvironment.CharSymbol, i + 1);
+            if (endIndex < i) {
+              error = true;
+              return symbols;
+            }
+
+            length = endIndex - i + 1;
+            str = source.Substring(i, length);
+            str = EscapeLikeALiteral(str);
+            symbols.Add(str);
+            i += length; // skip following space
+
+            break;
+
+          case PushEnvironment.VectorStartSymbol:
+            endIndex = source.IndexOf(PushEnvironment.VectorEndSymbol, i + 1);
+            if (endIndex < i) {
+              error = true;
+              return symbols;
+            }
+
+            length = endIndex - i + 1;
+            str = source.Substring(i, length);
+            symbols.Add(str);
+            i += length; // skip following space
+            break;
+
+          default:
+            endIndex = source.IndexOf(' ', i + 1);
+
+            length = endIndex < i
+              ? chars.Length - i
+              : endIndex - i;
+
+            str = source.Substring(i, length);
+            symbols.Add(str);
+            i += length; // skip following space
+
+            break;
+        }
+      }
+
+      error = true;
+      return symbols;
+    }
+
+    private static Expression Parse(IReadOnlyList<string> symbols, int startIndex, out int endIndex) {
+      var expressions = new List<Expression>();
+
+      for (var i = startIndex; i < symbols.Count; i++) {
+        var symbol = symbols[i].TrimEnd(symbolTrim);
+
+        if (string.IsNullOrWhiteSpace(symbol)) continue;
+
+        switch (symbol) {
+          case PushEnvironment.ProgramStartSymbolStr:
+            var subExpression = Parse(symbols, i + 1, out endIndex);
+            expressions.Insert(0, subExpression);
+            i = endIndex;
+            continue;
+          case PushEnvironment.ProgramEndSymbolStr:
+            endIndex = i;
+            return new PushProgram(expressions);
+        }
+
+        // literal
+        Expression expression;
+        if (TryParseLiteral(symbol, out expression)) {
+          expressions.Insert(0, expression);
+          continue;
+        }
+
+        // expression
+        if (ExpressionTable.TryGetStatelessExpression(symbol, out expression)
+         || ExpressionTable.TryGetStatefulExpression(symbol, out expression)) {
+          expressions.Insert(0, expression);
+          continue;
+        }
+
+        // identifier - custom expression or named literals
+        expressions.Insert(0, new NameDefineXExecExpression(symbol));
+      }
+
+      endIndex = symbols.Count - 1;
+
+      switch (expressions.Count) {
+        case 0:
+          return PushProgram.Empty;
+        case 1:
+          return expressions[0];
+        default:
+          return new PushProgram(expressions);
+      }
+    }
+
+    private static bool TryParseLiteral(string word, out Expression expression) {
+      if (word.StartsWith(PushEnvironment.CharSymbolStr) &&
+          word.EndsWith(PushEnvironment.CharSymbolStr) &&
+          word.Length == 3) {
+        expression = new CharPushExpression(word[1]);
+        return true;
+      }
+
+      if (word.StartsWith(PushEnvironment.StringSymbolStr) &&
+          word.EndsWith(PushEnvironment.StringSymbolStr)) {
+        var stringValue = word.Length == 0 ? string.Empty : word.Substring(1, word.Length - 2);
+        expression = new StringPushExpression(stringValue);
+        return true;
+      }
+
+      // "[]" has no values and can therefor not parsed correctly as vector of a specific type
+      if (word.StartsWith(PushEnvironment.VectorStartSymbolStr) &&
+          word.EndsWith(PushEnvironment.VectorEndSymbolStr) &&
+          word.Length > 2) {
+
+        var vectorEntries = word
+          .Substring(1, word.Length - 2)
+          .Split(PushEnvironment.VectorSeparatorSymbol)
+          .ToList();
+
+        if (vectorEntries.Count == 0) {
+          expression = null;
+          return false;
+        }
+
+        Expression e;
+        var first = vectorEntries.First();
+        if (!TryParseLiteral(first, out e)) {
+          expression = null;
+          return false;
+        }
+
+        if (e.GetType() == typeof(IntegerPushExpression)) {
+          var integerValues = vectorEntries.Select(long.Parse).ToList();
+          expression = new IntegerVectorPushExpression(integerValues);
+        } else if (e.GetType() == typeof(FloatPushExpression)) {
+          var doubleValues = vectorEntries.Select(x => double.Parse(x, NumberStyles.Float, cultureInfo)).ToList();
+          expression = new FloatVectorPushExpression(doubleValues);
+        } else if (e.GetType() == typeof(StringPushExpression)) {
+          var stringValues = vectorEntries.Select(str => str.Substring(1, str.Length - 2)).ToList();
+          expression = new StringVectorPushExpression(stringValues);
+        } else if (e.GetType() == typeof(BooleanPushExpression)) {
+          var booleanValues = vectorEntries.Select(bool.Parse).ToList();
+          expression = new BooleanVectorPushExpression(booleanValues);
+        } else {
+          expression = null;
+          return false;
+        }
+
+        return true;
+      }
+
+      long longValue;
+      if (long.TryParse(word, out longValue)) {
+        expression = new IntegerPushExpression(longValue);
+        return true;
+      }
+
+      double floatValue;
+      if (double.TryParse(word, NumberStyles.Float, cultureInfo, out floatValue)) {
+        expression = new FloatPushExpression(floatValue);
+        return true;
+      }
+
+      bool booleanValue;
+      if (bool.TryParse(word, out booleanValue)) {
+        expression = new BooleanPushExpression(booleanValue);
+        return true;
+      }
+
+      expression = null;
+      return false;
+    }
+
+    private static string EscapeLikeALiteral(string src) {
+      return Regex.Replace(src, @"\\(?<simple>['""\\0abfnrtv])", m => {
+        var s = m.Groups["simple"].Value;
+        switch (s) {
+          case "'": return "'";
+          case "\"": return "\"";
+          case "0": return "\0";
+          case "a": return "\a";
+          case "b": return "\b";
+          case "f": return "\f";
+          case "n": return "\n";
+          case "r": return "\r";
+          case "t": return "\t";
+          case "v": return "\v";
+          default:
+            throw new InvalidOperationException();
+        }
+      });
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/IntegerVectorPushBenchmarkSuiteProblem.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/IntegerVectorPushBenchmarkSuiteProblem.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/IntegerVectorPushBenchmarkSuiteProblem.cs	(revision 15771)
@@ -0,0 +1,67 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.BenchmarkSuite;
+using HeuristicLab.BenchmarkSuite.Problems;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 180)]
+  [Item("Integer Vector Push Problem", "")]
+  public class IntegerVectorPushBenchmarkSuiteProblem : IntegerVectorPushProblem, IProblemInstanceConsumer<ProblemData> {
+    public IntegerVectorPushBenchmarkSuiteProblem() : base(new PushBenchmarkSuiteEvaluator()) {
+      Parameters.Add(PushEvaluator.DataParameter);
+      Parameters.Add(PushEvaluator.DataBoundsParameter);
+
+      if (PushEvaluator.Data == null) {
+        var defaultProblem = new NumberIO();
+        Load(defaultProblem.CreateProblemData());
+      }
+    }
+
+    [StorableConstructor]
+    protected IntegerVectorPushBenchmarkSuiteProblem(bool deserializing)
+      : base(deserializing) {
+    }
+
+    protected IntegerVectorPushBenchmarkSuiteProblem(IntegerVectorPushBenchmarkSuiteProblem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntegerVectorPushBenchmarkSuiteProblem(this, cloner);
+    }
+
+    public new PushBenchmarkSuiteEvaluator PushEvaluator { get { return (PushBenchmarkSuiteEvaluator)base.PushEvaluator; } }
+
+    public void Load(ProblemData data) {
+      PushEvaluator.LoadData(data);
+
+      Name = "[Push][IntVector] " + data.Name;
+      Description = data.Description;
+      BestKnownQuality = data.BestResult;
+      Config.MaxProgramLength = data.MaxSize;
+      Config.EvalPushLimit = data.EvalLimit;
+      Config.ErcOptions = data.ErcOptions;
+      Config.FloatStringFormat = data.FloatStringFormat;
+
+      Config.SetEnabledStacks((StackTypes)data.EnabledDataTypes);
+      Config.InitInExpressions(data.TotalInputArgumentCount);
+
+      Encoding.Bounds[0, 0] = 0;
+      Encoding.Bounds[0, 1] = Config.EnabledExpressions.Count;
+
+      Encoding.Length = data.MaxSize / 2;
+
+    }
+
+    protected override PushSolution CreatePushSolution(
+      PushProgram program,
+      double bestQuality,
+      IRandom random,
+      IReadOnlyPushConfiguration config) {
+      return new PushBenchmarkSuiteSolution(program, bestQuality, random, config, (PushBenchmarkSuiteEvaluator)PushEvaluator.Clone());
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PlushPushBenchmarkSuiteProblem.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PlushPushBenchmarkSuiteProblem.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PlushPushBenchmarkSuiteProblem.cs	(revision 15771)
@@ -0,0 +1,64 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.BenchmarkSuite;
+  using HeuristicLab.BenchmarkSuite.Problems;
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+  using HeuristicLab.Problems.Instances;
+
+  [StorableClass]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 180)]
+  [Item("Plush Push Problem", "")]
+  public class PlushPushBenchmarkSuiteProblem : PlushPushProblem, IProblemInstanceConsumer<ProblemData> {
+    public PlushPushBenchmarkSuiteProblem() : base(new PushBenchmarkSuiteEvaluator()) {
+      Parameters.Add(PushEvaluator.DataParameter);
+      Parameters.Add(PushEvaluator.DataBoundsParameter);
+
+      if (PushEvaluator.Data == null) {
+        var defaultProblem = new NumberIO();
+        Load(defaultProblem.CreateProblemData());
+      }
+    }
+
+    [StorableConstructor]
+    protected PlushPushBenchmarkSuiteProblem(bool deserializing)
+      : base(deserializing) {
+    }
+
+    protected PlushPushBenchmarkSuiteProblem(PlushPushBenchmarkSuiteProblem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PlushPushBenchmarkSuiteProblem(this, cloner);
+    }
+
+    public new PushBenchmarkSuiteEvaluator PushEvaluator { get { return (PushBenchmarkSuiteEvaluator)base.PushEvaluator; } }
+
+    public void Load(ProblemData data) {
+      PushEvaluator.LoadData(data);
+
+      Name = "[Push][Plush] " + data.Name;
+      Description = data.Description;
+      BestKnownQuality = data.BestResult;
+      Config.MaxProgramLength = data.MaxSize;
+      Config.EvalPushLimit = data.EvalLimit;
+      Config.ErcOptions = data.ErcOptions;
+      Config.FloatStringFormat = data.FloatStringFormat;
+
+      Config.SetEnabledStacks((StackTypes)data.EnabledDataTypes);
+      Config.InitInExpressions(data.TotalInputArgumentCount);
+
+      Encoding.MinLength = 0;
+      Encoding.MaxLength = data.MaxSize / 2;
+    }
+
+    protected override PushSolution CreatePushSolution(
+      PushProgram program,
+      double bestQuality,
+      IRandom random,
+      IReadOnlyPushConfiguration config) {
+      return new PushBenchmarkSuiteSolution(program, bestQuality, random, config, (PushBenchmarkSuiteEvaluator)PushEvaluator.Clone());
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/DataBounds.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/DataBounds.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/DataBounds.cs	(revision 15771)
@@ -0,0 +1,55 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class DataBounds : ParameterizedNamedItem {
+
+    private const string TrainingParameterName = "Training";
+    private const string TestParameterName = "Test";
+
+    public DataBounds() : this(0, 0, 0, 0) {
+    }
+
+    public DataBounds(int trainingStart, int trainingEnd, int testStart, int testEnd) {
+      Parameters.Add(new FixedValueParameter<IntRange>(TrainingParameterName, new IntRange(trainingStart, trainingEnd)));
+      Parameters.Add(new FixedValueParameter<IntRange>(TestParameterName, new IntRange(testStart, testEnd)));
+    }
+
+    [StorableConstructor]
+    public DataBounds(bool deserializing) : base(deserializing) {
+    }
+
+    public DataBounds(DataBounds origin, Cloner cloner) : base(origin, cloner) {
+    }
+
+    public IValueParameter<IntRange> TrainingParameter
+    {
+      get { return (IValueParameter<IntRange>)Parameters[TrainingParameterName]; }
+    }
+
+    public IntRange TrainingRange
+    {
+      get { return TrainingParameter.Value; }
+      set { TrainingParameter.Value = value; }
+    }
+
+    public IValueParameter<IntRange> TestParameter
+    {
+      get { return (IValueParameter<IntRange>)Parameters[TestParameterName]; }
+    }
+
+    public IntRange TestRange
+    {
+      get { return TestParameter.Value; }
+      set { TestParameter.Value = value; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DataBounds(this, cloner);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IntegerVectorPushProblem.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IntegerVectorPushProblem.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IntegerVectorPushProblem.cs	(revision 15771)
@@ -0,0 +1,98 @@
+﻿using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  public abstract class IntegerVectorPushProblem : PushProblemBase<IntegerVectorEncoding> {
+    protected IntegerVectorPushProblem(IPushEvaluator evaluator) : base(evaluator) {
+      InitEvents();
+      InitEncoding();
+      InitOperators();
+    }
+
+    [StorableConstructor]
+    protected IntegerVectorPushProblem(bool deserializing)
+      : base(deserializing) {
+    }
+
+    protected IntegerVectorPushProblem(IntegerVectorPushProblem original, Cloner cloner)
+      : base(original, cloner) {
+      InitEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    // ReSharper disable once UnusedMember.Local
+    private void AfterDeserialization() {
+      InitEvents();
+    }
+
+    private void InitEvents() {
+      Config.EnabledExpressionsChanged += EnabledExpressionsChanged;
+    }
+
+    private void EnabledExpressionsChanged(object sender, EnabledExpressionsChangedEventArgs e) {
+      Encoding.Bounds[0, 1] = Config.EnabledExpressions.Count;
+      Encoding.BoundsParameter.Value[0, 1] = Config.EnabledExpressions.Count;
+    }
+
+    //protected override void OnReset() {
+    //  base.OnReset();
+
+    //  // clear pools and free reserved memory
+    //  Pool.Clear();
+    //  IndividualMapper.Clear();
+    //  RandomPool.Clear();
+    //}
+
+    private void InitEncoding() {
+      Encoding.Bounds[0, 0] = 0;
+      Encoding.Bounds[0, 1] = Config.EnabledExpressions.Count;
+    }
+
+    private void InitOperators() {
+
+      var solutionCreator = Operators.OfType<PushSolutionCreator>().FirstOrDefault();
+
+      if (solutionCreator == null) {
+        solutionCreator = new PushSolutionCreator();
+        Operators.Add(solutionCreator);
+      }
+
+      solutionCreator.ErcOptions = Config.ErcOptions;
+      solutionCreator.MinLength = Config.MinProgramLength;
+
+      if (!Operators.OfType<PushExpressionFrequencyAnalyzer>().Any()) {
+        Operators.Add(new PushExpressionFrequencyAnalyzer());
+      }
+
+      if (!Operators.OfType<IndividualZeroErrorAnalyzer>().Any()) {
+        Operators.Add(new IndividualZeroErrorAnalyzer());
+      }
+
+      SolutionCreator = solutionCreator;
+    }
+
+    protected override PushProgram MapIndividual(Individual individual) {
+      var program = individual.ToPushProgram(Config);
+
+      return program;
+    }
+
+    //public override double Evaluate(Individual individual, IRandom random) {
+    //  var seed = random.Next();
+
+    //  var program = individual.ToPushProgram(Config);
+
+    //  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;
+    //}
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PlushPushProblem.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PlushPushProblem.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PlushPushProblem.cs	(revision 15771)
@@ -0,0 +1,52 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Diagnostics;
+  using System.Linq;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Optimization;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public abstract class PlushPushProblem : PushProblemBase<PlushEncoding> {
+    protected PlushPushProblem(IPushEvaluator evaluator)
+      : base(evaluator) {
+      InitEncoding();
+      InitOperators();
+    }
+
+    protected PlushPushProblem(bool deserializing)
+      : base(deserializing) {
+    }
+
+    protected PlushPushProblem(PushProblemBase<PlushEncoding> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    private void InitEncoding() {
+      Encoding.ErcOptionsParameter = Config.ErcOptionsParameter;
+      Encoding.InstructionsParameter = Config.InstructionsParameter;
+      Encoding.MaxCloseParameter = Config.MaxCloseParameter;
+      Encoding.CloseBiasLevelParameter = Config.CloseBiasLevelParameter;
+    }
+
+    private void InitOperators() {
+      if (!Operators.OfType<PushExpressionFrequencyAnalyzer>().Any()) {
+        Operators.Add(new PushExpressionFrequencyAnalyzer());
+      }
+
+      if (!Operators.OfType<IndividualZeroErrorAnalyzer>().Any()) {
+        Operators.Add(new IndividualZeroErrorAnalyzer());
+      }
+    }
+
+    protected override PushProgram MapIndividual(Individual individual) {
+      var plushVector = individual.PlushVector();
+      var program = plushVector.PushProgram;
+
+      if (program == null)
+        Debugger.Break();
+
+      return program;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblem.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblem.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblem.cs	(revision 15771)
@@ -0,0 +1,13 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+{
+    public class PushProblem
+    {
+        
+    }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblemBase.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblemBase.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblemBase.cs	(revision 15771)
@@ -0,0 +1,153 @@
+﻿using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  public abstract class PushProblemBase<T> : SingleObjectiveBasicProblem<T> where T : class, IEncoding {
+    [Storable]
+    public readonly PushConfiguration Config;
+
+    protected PushInterpreterPool Pool;
+    protected readonly SeededRandomPool RandomPool = new SeededRandomPool();
+
+    [Storable]
+    protected readonly IPushEvaluator PushEvaluator;
+
+    private const string BEST_TRAINING_SOLUTION_RESULT_NAME = "Best Solution";
+    private const string TEST_QUALITY_RESULT_NAME = "Test Quality";
+    private const string PUSH_CONFIGURATION_PARAMETER_NAME = "PushConfiguration";
+
+    public const string CasesScopeParameterName = "CaseQualities";
+    public const string CaseQualitiesScopeParameterName = "CaseQualities";
+    public const string SeedScopeParameterName = "Seed";
+
+    protected PushProblemBase(IPushEvaluator evaluator) {
+      Config = new PushConfiguration();
+      PushEvaluator = evaluator;
+
+      InitData();
+      InitParameters();
+    }
+
+    [StorableConstructor]
+    protected PushProblemBase(bool deserializing)
+      : base(deserializing) {
+    }
+
+    protected PushProblemBase(PushProblemBase<T> original, Cloner cloner)
+      : base(original, cloner) {
+      Config = cloner.Clone(original.Config);
+      PushEvaluator = cloner.Clone(original.PushEvaluator);
+
+      InitData();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    // ReSharper disable once UnusedMember.Local
+    private void AfterDeserialization() {
+      InitData();
+      InitParameters();
+    }
+
+    private void InitData() {
+      Pool = new PushInterpreterPool(Environment.ProcessorCount * 2, 4096, 1024, Config);
+    }
+
+    private void InitParameters() {
+      foreach (var paramater in Config.Parameters) {
+        if (!Parameters.ContainsKey(paramater.Name)) {
+          Parameters.Add(paramater);
+        }
+      }
+
+      if (!Parameters.ContainsKey(PUSH_CONFIGURATION_PARAMETER_NAME))
+        Parameters.Add(new ValueParameter<IReadOnlyPushConfiguration>(PUSH_CONFIGURATION_PARAMETER_NAME, Config) {
+          Hidden = true
+        });
+
+      if (!Parameters.ContainsKey(CasesScopeParameterName))
+        Parameters.Add(new LookupParameter<BoolArray>(CasesScopeParameterName, "The training cases that have been successfully executed."));
+
+      if (!Parameters.ContainsKey(CaseQualitiesScopeParameterName))
+        Parameters.Add(new LookupParameter<DoubleArray>(CaseQualitiesScopeParameterName, "The quality of every single training case for each individual"));
+    }
+
+    public override bool Maximization { get { return false; } }
+
+    public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      var bestQuality = Maximization ? qualities.Max() : qualities.Min();
+      var bestIdx = Array.IndexOf(qualities, bestQuality);
+      var bestIndividual = individuals[bestIdx];
+      var seed = (IntValue)bestIndividual[SeedScopeParameterName];
+      var program = MapIndividual(bestIndividual);
+
+      var rand = new FastRandom(seed.Value);
+      var isIndividualBetter = AnalyzeBestTrainingSolution(program, bestQuality, results, rand);
+
+      if (isIndividualBetter) {
+        rand.Reset(seed.Value);
+        AnalyzeBestTestSolution(program, results, rand);
+      }
+    }
+
+    protected void AnalyzeBestTestSolution(PushProgram program, ResultCollection results, IRandom random) {
+      var testResult = PushEvaluator.EvaluateTest(Pool, program, random);
+
+      if (!results.ContainsKey(TEST_QUALITY_RESULT_NAME)) {
+        results.Add(new Result(TEST_QUALITY_RESULT_NAME, new DoubleValue(testResult.AvgQuality)));
+      } else {
+        ((DoubleValue)results[TEST_QUALITY_RESULT_NAME].Value).Value = testResult.AvgQuality;
+      }
+    }
+
+    protected bool AnalyzeBestTrainingSolution(PushProgram program, double bestQuality, ResultCollection results, IRandom random) {
+      var solution = CreatePushSolution(
+            program,
+            bestQuality,
+            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;
+      }
+
+      var currentBestQuality = ((PushSolution)results[BEST_TRAINING_SOLUTION_RESULT_NAME].Value).Quality;
+
+      if ((!Maximization && currentBestQuality > bestQuality) ||
+           (Maximization && currentBestQuality < bestQuality)) {
+        results[BEST_TRAINING_SOLUTION_RESULT_NAME].Value = solution;
+        return true;
+      }
+
+      return false;
+    }
+
+    public override double Evaluate(Individual individual, IRandom 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);
+
+    protected abstract PushSolution CreatePushSolution(
+      PushProgram program,
+      double bestQuality,
+      IRandom random,
+      IReadOnlyPushConfiguration config);
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Selector/ICaseSingleObjectiveSelector.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Selector/ICaseSingleObjectiveSelector.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Selector/ICaseSingleObjectiveSelector.cs	(revision 15771)
@@ -0,0 +1,9 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Optimization;
+
+  public interface ICaseSingleObjectiveSelector : ISingleObjectiveSelector {
+    ILookupParameter<ItemArray<DoubleArray>> CaseQualitiesParameter { get; }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Selector/LexicaseSelector.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Selector/LexicaseSelector.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Selector/LexicaseSelector.cs	(revision 15771)
@@ -0,0 +1,175 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Random;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// A lexicase selection operator which considers all successful evaluated training cases for selection.
+  /// </summary>
+  [Item("LexicaseSelector", "A lexicase selection operator which considers all successful evaluated training cases for selection.")]
+  [StorableClass]
+  public sealed class LexicaseSelector : StochasticSingleObjectiveSelector, ICaseSingleObjectiveSelector {
+    public ILookupParameter<ItemArray<DoubleArray>> CaseQualitiesParameter {
+      get { return (ILookupParameter<ItemArray<DoubleArray>>)Parameters[IntegerVectorPushProblem.CaseQualitiesScopeParameterName]; }
+    }
+
+    [StorableConstructor]
+    private LexicaseSelector(bool deserializing) : base(deserializing) { }
+    private LexicaseSelector(LexicaseSelector original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LexicaseSelector(this, cloner);
+    }
+
+    public LexicaseSelector() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleArray>(
+        IntegerVectorPushProblem.CaseQualitiesScopeParameterName,
+        "The quality of every single training case for each individual."));
+    }
+
+
+    protected override IScope[] Select(List<IScope> scopes) {
+      var count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
+      var copy = CopySelectedParameter.Value.Value;
+      var random = RandomParameter.ActualValue;
+      var maximization = MaximizationParameter.ActualValue.Value;
+      var caseQualities = CaseQualitiesParameter.ActualValue.ToList();
+
+      var selected = Apply(
+        scopes,
+        count,
+        copy,
+        maximization,
+        random,
+        caseQualities);
+
+      return selected;
+    }
+
+    public static IScope[] Apply(
+      List<IScope> scopes,
+      int count,
+      bool copy,
+      bool maximization,
+      IRandom random,
+      List<DoubleArray> caseQualities) {
+
+      for (var i = 0; i < caseQualities.Count; i++) {
+        if (caseQualities[i].Length == 0) {
+          scopes.RemoveAt(i);
+          caseQualities.RemoveAt(i);
+        }
+      }
+
+      var qualitiesLength = caseQualities[0].Length;
+
+      if (caseQualities.Any(x => x.Length != qualitiesLength)) {
+        throw new ArgumentException("Not all case qualities have the same length");
+      }
+
+      var selected = new IScope[count];
+
+      var candidates = new List<int>(caseQualities.Count);
+      for (var i = 0; i < caseQualities.Count; i++) candidates.Add(i);
+
+      var orderSource = new List<int>(qualitiesLength);
+      for (var i = 0; i < qualitiesLength; i++) orderSource.Add(i);
+
+      for (var i = 0; i < count; i++) {
+        var index = LexicaseSelect(
+          caseQualities,
+          candidates,
+          orderSource.Shuffle(random),
+          random,
+          maximization);
+
+        if (copy) {
+          selected[i] = (IScope)scopes[index].Clone();
+        } else {
+          selected[i] = scopes[index];
+          scopes.RemoveAt(index);
+          caseQualities.RemoveAt(index);
+        }
+      }
+
+      return selected;
+    }
+
+    private static int LexicaseSelect(
+      List<DoubleArray> caseQualities,
+      List<int> candidates,
+      IEnumerable<int> order,
+      IRandom random,
+      bool maximization) {
+
+      foreach (var curCase in order) {
+        var nextCandidates = new List<int>();
+
+        var best = maximization
+          ? double.NegativeInfinity
+          : double.PositiveInfinity;
+
+        for (var i = 0; i < candidates.Count; i++) {
+          var candidate = candidates[i];
+          var caseQuality = caseQualities[candidate][curCase];
+
+          if (caseQuality.IsAlmost(best)) {
+            // if the individuals is as good as the best one, add it
+            nextCandidates.Add(candidate);
+          } else if (
+             (maximization && (caseQuality > best)) ||
+             (!maximization && (caseQuality < best))) {
+            // if the individual is better than the best one, remove all previous candidates and add the new one
+            nextCandidates.Clear();
+            nextCandidates.Add(candidate);
+            // also set the next best quality value
+            best = caseQuality;
+          }
+          // else {do nothing}
+        }
+
+        if (nextCandidates.Count == 1) {
+          return nextCandidates[0];
+        }
+
+        if (nextCandidates.Count < 1) {
+          return candidates.SampleRandom(random);
+        }
+
+        candidates = nextCandidates;
+      }
+
+      return candidates.Count == 1
+        ? candidates[0]
+        : candidates.SampleRandom(random);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Simplifier/Simplifier.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Simplifier/Simplifier.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Simplifier/Simplifier.cs	(revision 15771)
@@ -0,0 +1,68 @@
+﻿using System;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public static class Simplifier {
+    private static readonly TreeNode<Expression> NoopNode =
+      new TreeNode<Expression>(ExpressionTable.GetStatelessExpression<ExecNoopExpression>());
+
+    public static PushProgram Simplify(PushProgram program, IReadOnlyPushConfiguration config, Func<PushProgram, double> evaluator, bool improveIfPossible = false) {
+      var bestResult = evaluator(program);
+      var tree = program.ToTree();
+      var optimizedTree = RemoveUnnecessaryExpressions(tree, tree, ref bestResult, evaluator, improveIfPossible);
+      var tmp = RemoveUnnecessaryExpressions(optimizedTree, optimizedTree, ref bestResult, evaluator, improveIfPossible);
+
+      while (tmp.Count < optimizedTree.Count) {
+        optimizedTree = tmp;
+      }
+
+      var optimizedProgram = optimizedTree.ToPushProgramWithoutNoopExpressions();
+      optimizedProgram = SimplifySubPrograms(optimizedProgram);
+
+      return optimizedProgram;
+    }
+
+    public static PushProgram SimplifySubPrograms(PushProgram program) {
+      var tree = program.ToTree();
+      var optimizedTree = SimplifySubPrograms(tree);
+      var optimizedPrgram = optimizedTree.ToPushProgram();
+
+      return optimizedPrgram;
+    }
+
+    private static TreeNode<Expression> SimplifySubPrograms(TreeNode<Expression> program) {
+      while (program.Children.Count == 1)
+        program = program.Children[0];
+
+      for (var i = 0; i < program.Children.Count; i++) {
+        var child = program.Children[i];
+        program.ReplaceNode(i, SimplifySubPrograms(child));
+      }
+
+      return program;
+    }
+
+    private static TreeNode<Expression> RemoveUnnecessaryExpressions(TreeNode<Expression> program, TreeNode<Expression> node, ref double bestResult, Func<PushProgram, double> evaluator, bool improveIfPossible = false) {
+      for (var i = 0; i < node.Children.Count; i++) {
+        var child = node.Children[i];
+        node.ReplaceNode(i, NoopNode);
+
+        var currentProgram = program.ToPushProgram();
+        var currentResult = evaluator(currentProgram);
+
+        if ((improveIfPossible && currentResult <= bestResult) ||
+            (!improveIfPossible && currentResult.IsAlmost(bestResult))) {
+          bestResult = currentResult;
+        } else if (child.Value.IsProgram) {
+          node.ReplaceNode(i, child);
+          var subProgram = RemoveUnnecessaryExpressions(program, child, ref bestResult, evaluator);
+          node.ReplaceNode(i, subProgram);
+        } else {
+          node.ReplaceNode(i, child);
+        }
+      }
+
+      return node;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Solution/BenchmarkSuite/PushBenchmarkSuiteSolution.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Solution/BenchmarkSuite/PushBenchmarkSuiteSolution.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Solution/BenchmarkSuite/PushBenchmarkSuiteSolution.cs	(revision 15771)
@@ -0,0 +1,30 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.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/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Solution/IPushSolution.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Solution/IPushSolution.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Solution/IPushSolution.cs	(revision 15771)
@@ -0,0 +1,7 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using HeuristicLab.Core;
+
+  public interface IPushSolution : IItem {
+
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Solution/PushSolution.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Solution/PushSolution.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Solution/PushSolution.cs	(revision 15771)
@@ -0,0 +1,60 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [StorableClass]
+  public class PushSolution : NamedItem, IPushSolution {
+    [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.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);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/IPlushCreator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/IPlushCreator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/IPlushCreator.cs	(revision 15771)
@@ -0,0 +1,16 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public interface IPlushCreator : ISolutionCreator, IPlushOperator {
+    IValueLookupParameter<IntValue> MinLengthParameter { get; }
+    IValueLookupParameter<IntValue> MaxLengthParameter { get; }
+    IValueLookupParameter<IntValue> MaxCloseParameter { get; }
+    IValueLookupParameter<DoubleValue> CloseBiasLevelParameter { get; }
+    IValueLookupParameter<PercentValue> InInstructionProbabilityParameter { get; }
+    IValueLookupParameter<IReadOnlyErcOptions> ErcOptionsParameter { get; }
+    IValueLookupParameter<IReadOnlyExpressionsConfiguration> InstructionsParameter { get; }
+    ILookupParameter<PlushVector> PlushVectorParameter { get; }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/PlushCreator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/PlushCreator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/PlushCreator.cs	(revision 15771)
@@ -0,0 +1,105 @@
+﻿using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  [Item("PlushCreator", "An operator which creates a new random plush vector with each element uniformly distributed")]
+  [StorableClass]
+  public class PlushCreator : InstrumentedOperator, IPlushCreator, IStochasticOperator {
+
+    public PlushCreator() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new LookupParameter<PlushVector>("PlushVector", "The vector which should be manipulated."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("MinLength", "The min length of the vector."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("MaxLength", "The max length of the vector."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("MaxClose", "The max close variable for a plush genome entry."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CloseBiasLevel", "Determines how strongly the random close variable is biased towards 0."));
+      Parameters.Add(new ValueLookupParameter<IReadOnlyExpressionsConfiguration>("Instructions", "The enabled instructions"));
+      Parameters.Add(new ValueLookupParameter<IReadOnlyErcOptions>("ErcOptions", "ERC options"));
+      Parameters.Add(new ValueLookupParameter<PercentValue>("InInstructionProbability", "The probability of IN Instructions"));
+    }
+
+    [StorableConstructor]
+    public PlushCreator(bool deserializing) : base(deserializing) { }
+
+    public PlushCreator(PlushCreator origin, Cloner cloner) : base(origin, cloner) { }
+
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<PlushVector> PlushVectorParameter {
+      get { return (ILookupParameter<PlushVector>)Parameters["PlushVector"]; }
+    }
+    public IValueLookupParameter<IntValue> MinLengthParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["MinLength"]; }
+    }
+    public IValueLookupParameter<IntValue> MaxLengthParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["MaxLength"]; }
+    }
+    public IValueLookupParameter<IReadOnlyExpressionsConfiguration> InstructionsParameter {
+      get { return (IValueLookupParameter<IReadOnlyExpressionsConfiguration>)Parameters["Instructions"]; }
+    }
+    public IValueLookupParameter<IReadOnlyErcOptions> ErcOptionsParameter {
+      get { return (IValueLookupParameter<IReadOnlyErcOptions>)Parameters["ErcOptions"]; }
+    }
+    public IValueLookupParameter<PercentValue> InInstructionProbabilityParameter {
+      get { return (IValueLookupParameter<PercentValue>)Parameters["InInstructionProbability"]; }
+    }
+    public IValueLookupParameter<IntValue> MaxCloseParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["MaxClose"]; }
+    }
+    public IValueLookupParameter<DoubleValue> CloseBiasLevelParameter {
+      get { return (IValueLookupParameter<DoubleValue>)Parameters["CloseBiasLevel"]; }
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PlushCreator(this, cloner);
+    }
+
+    public sealed override IOperation InstrumentedApply() {
+      PlushVectorParameter.ActualValue = Create();
+      return base.InstrumentedApply();
+    }
+
+    private PlushVector Create() {
+      var random = RandomParameter.ActualValue;
+      var minLength = MinLengthParameter.ActualValue.Value;
+      var maxLength = MaxLengthParameter.ActualValue.Value;
+      var ercOptions = ErcOptionsParameter.ActualValue;
+      var instructions = InstructionsParameter.ActualValue;
+      var inInstructionProbability = InInstructionProbabilityParameter.ActualValue.Value;
+      var maxClose = MaxCloseParameter.ActualValue.Value;
+      var biasLevel = CloseBiasLevelParameter.ActualValue.Value;
+
+      if (minLength > maxLength)
+        throw new InvalidOperationException("MinLength > MaxLength");
+
+      var length = random.Next(minLength, maxLength);
+      var result = new PlushVector(length);
+
+      for (var i = 0; i < length; i++) {
+        var expression = CodeGeneratorUtils.GetRandomExpression(
+          random,
+          ercOptions,
+          instructions,
+          inInstructionProbability);
+
+        var close = maxClose == 0 ? 1 : random.NextBiased(0, maxClose, biasLevel);
+
+        result.Add(new PlushEntry {
+          Close = close,
+          Instruction = expression,
+        });
+      }
+
+      return result;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/PushSolutionCreator.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/PushSolutionCreator.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/PushSolutionCreator.cs	(revision 15771)
@@ -0,0 +1,125 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Generates a new random integer vector with each element uniformly distributed in a specified range.
+  /// </summary>
+  [Item("PushSolutionCreator", "An operator which creates a new random int vector with each element uniformly distributed in a specified range and considering Push specific details")]
+  [StorableClass]
+  public class PushSolutionCreator : UniformRandomIntegerVectorCreator {
+
+    private const string ERC_OPTIONS_PARAMETER_NAME = "ERC options";
+    private const string MIN_LENGTH_PARAMETER_NAME = "Min. Length";
+    private const string MAX_LENGTH_PARAMETER_NAME = "Max. Length";
+    private const string IN_INSTRUCTION_PROBABILITY = "IN Instruction Probability";
+
+    public PushSolutionCreator() {
+      if (!Parameters.ContainsKey(ERC_OPTIONS_PARAMETER_NAME))
+        Parameters.Add(new ValueParameter<ErcOptions>(ERC_OPTIONS_PARAMETER_NAME));
+
+      if (!Parameters.ContainsKey(MIN_LENGTH_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<IntValue>(MIN_LENGTH_PARAMETER_NAME, new IntValue(20)));
+
+      //if (!Parameters.ContainsKey(MAX_LENGTH_PARAMETER_NAME))
+      //  Parameters.Add(new FixedValueParameter<IntValue>(MAX_LENGTH_PARAMETER_NAME, new IntValue(100)));
+
+      if (!Parameters.ContainsKey(IN_INSTRUCTION_PROBABILITY))
+        Parameters.Add(new FixedValueParameter<PercentValue>(IN_INSTRUCTION_PROBABILITY, new PercentValue(0.05)));
+
+      Parameters.Add(new ValueLookupParameter<IReadOnlyExpressionsConfiguration>("Instructions", "The enabled instructions"));
+    }
+
+    [StorableConstructor]
+    public PushSolutionCreator(bool deserializing) : base(deserializing) {
+    }
+
+    public PushSolutionCreator(PushSolutionCreator origin, Cloner cloner) : base(origin, cloner) { }
+
+
+    public IValueParameter<ErcOptions> ErcOptionsParameter {
+      get { return (IValueParameter<ErcOptions>)Parameters[ERC_OPTIONS_PARAMETER_NAME]; }
+    }
+
+    public ErcOptions ErcOptions {
+      get { return ErcOptionsParameter.Value; }
+      set {
+        ErcOptionsParameter.Value = value;
+      }
+    }
+
+    public IValueParameter<IntValue> MinLengthParameter {
+      get { return (IValueParameter<IntValue>)Parameters[MIN_LENGTH_PARAMETER_NAME]; }
+    }
+
+    public int MinLength {
+      get { return MinLengthParameter.Value.Value; }
+      set { MinLengthParameter.Value.Value = value; }
+    }
+
+    public IValueLookupParameter<IReadOnlyExpressionsConfiguration> InstructionsParameter {
+      get { return (IValueLookupParameter<IReadOnlyExpressionsConfiguration>)Parameters["Instructions"]; }
+    }
+
+    //public IValueParameter<IntValue> MaxLengthParameter
+    //{
+    //  get { return LengthParameter; } //(IValueParameter<IntValue>)Parameters[MAX_LENGTH_PARAMETER_NAME]; }
+    //}
+
+    //public int MaxLength
+    //{
+    //  get { return MaxLengthParameter.Value.Value; }
+    //  set { MaxLengthParameter.Value.Value = value; }
+    //}
+
+    public IValueParameter<PercentValue> InInstructionProbabilityParameter {
+      get { return (IValueParameter<PercentValue>)Parameters[IN_INSTRUCTION_PROBABILITY]; }
+    }
+
+    public double InInstructionProbability {
+      get { return InInstructionProbabilityParameter.Value.Value; }
+      set { InInstructionProbabilityParameter.Value.Value = value; }
+    }
+
+    protected override IntegerVector Create(IRandom random, IntValue length, IntMatrix bounds) {
+      var len = length.Value;
+      var result = new IntegerVector(len);
+
+      var contentLength = random.Next(MinLength, len);
+      var lowerBound = bounds[0, 0];
+      var upperBound = bounds[0, 1];
+      //var inInstructionRelativeProbability = ErcOptions.ErcProbability + InInstructionProbability;
+      //var instructions = InstructionsParameter.ActualValue;
+
+      for (var i = 0; i < contentLength; i++) {
+        //var x = random.NextDouble();
+
+        //if (ErcOptions.ErcProbability > 0 && x <= ErcOptions.ErcProbability) {
+        //  result[i] = PushSolutionEncoding.Erc;
+        //} else if (InInstructionProbability > 0 && x <= inInstructionRelativeProbability && instructions.InExpressionCount > 0) {
+        //  var index = random.Next(0, instructions.InExpressionCount);
+        //  var expression = ExpressionTable.InExpressionTable[index];
+
+        //  instructions.EnabledExpressions
+        //  //result[i] = PushSolutionEncoding.In;
+        //} else {
+        result[i] = random.Next(lowerBound, upperBound);
+        //}
+      }
+
+      if (contentLength < len) {
+        result[contentLength] = PushSolutionEncoding.End;
+
+        for (var i = contentLength + 1; i < len; i++) {
+          result[i] = PushSolutionEncoding.Noop;
+        }
+      }
+
+      return result;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/PushSolutionEncoding.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/PushSolutionEncoding.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/PushSolutionEncoding.cs	(revision 15771)
@@ -0,0 +1,8 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  public class PushSolutionEncoding {
+    public const int Noop = -1;
+    public const int Erc = -2;
+    public const int In = -3;
+    public const int End = -4;
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/IPrintStack.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/IPrintStack.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/IPrintStack.cs	(revision 15771)
@@ -0,0 +1,16 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Collections.Generic;
+
+  public interface IPrintStack : IPushStack {
+    bool IsCurrentLineEmpty { get; }
+    IReadOnlyList<string> Lines { get; }
+
+    void NewLine();
+    void Push<T>(T item);
+    void Push(double item);
+    void Push(long item);
+    void Push(int item);
+    void Push(char item);
+    void Push(bool item);
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/IPushStack.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/IPushStack.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/IPushStack.cs	(revision 15771)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Collections.Generic;
+
+  public interface IPushStack<T> : ICollection<T>, IPushStack {
+    T Top { get; set; }
+    T TopOrDefault { get; }
+    T Bottom { get; }
+    T BottomOrDefault { get; }
+    T this[int key] { get; set; }
+    new int Count { get; }
+    void Push(T item);
+    void Push(T item1, T item2);
+    void Push(T item1, T item2, T item3);
+    void Push(T item1, T item2, T item3, T item4);
+    void Push(IReadOnlyList<T> items, int startIndex);
+    void Push(IReadOnlyList<T> items);
+    void Push(IEnumerable<T> items);
+    void Swap(int count);
+    void Yank(int index);
+    void RemoveTop();
+    void Remove(int count);
+    void RemoveAt(int index);
+    void RemoveAt(int index, int count);
+    new void Clear();
+    IReadOnlyList<T> Peek(int count);
+    void Insert(int index, T item);
+    T Pop();
+    IReadOnlyList<T> Pop(int count);
+    bool TryPop(out T item);
+    T ElementAt(int index);
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/IPushStackBase.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/IPushStackBase.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/IPushStackBase.cs	(revision 15771)
@@ -0,0 +1,15 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System.Collections;
+  using System.Collections.Generic;
+
+  public interface IPushStack : IEnumerable {
+    bool IsEmpty { get; }
+    bool IsEnabled { get; set; }
+    int Count { get; }
+
+    void Clear();
+
+    IEnumerable<string> AsStrings();
+    IEnumerable<object> AsObjects();
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/InterpreterStackStringifier.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/InterpreterStackStringifier.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/InterpreterStackStringifier.cs	(revision 15771)
@@ -0,0 +1,64 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using System.Globalization;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  public static class InterpreterStackStringifier {
+
+    public static IEnumerable<string> StringifyStack(this IPushInterpreter interpreter, StackTypes type) {
+      switch (type) {
+        case StackTypes.Boolean: return StringifyLiteralStack(interpreter.BooleanStack);
+        case StackTypes.Integer: return StringifyLiteralStack(interpreter.IntegerStack);
+        case StackTypes.Float: return StringifyFloatStack(interpreter.FloatStack, interpreter.Configuration.FloatStringFormat);
+        case StackTypes.Char: return StringifyCharStack(interpreter.CharStack);
+        case StackTypes.String: return StringifyLiteralStack(interpreter.StringStack, PushEnvironment.StringSymbolStr, PushEnvironment.StringSymbolStr);
+        case StackTypes.Name: return StringifyLiteralStack(interpreter.NameStack);
+        case StackTypes.Code: return StringifyLiteralStack(interpreter.CodeStack);
+        case StackTypes.Exec: return StringifyLiteralStack(interpreter.ExecStack);
+        case StackTypes.Print: return StringifyLiteralStack(interpreter.PrintStack, PushEnvironment.StringSymbolStr, PushEnvironment.StringSymbolStr, false);
+
+        case StackTypes.BooleanVector: return StringifyVectorStack(interpreter.BooleanVectorStack);
+        case StackTypes.IntegerVector: return StringifyVectorStack(interpreter.IntegerVectorStack);
+        case StackTypes.FloatVector: return StringifyFloatVectorStack(interpreter.FloatVectorStack, interpreter.Configuration.FloatStringFormat);
+        case StackTypes.StringVector: return StringifyVectorStack(interpreter.StringVectorStack, PushEnvironment.StringSymbolStr, PushEnvironment.StringSymbolStr);
+
+        default: return Enumerable.Empty<string>();
+      }
+    }
+
+    private static IEnumerable<string> StringifyCharStack(IPushStack<char> stack) {
+      var result = stack.AsEnumerable();
+
+      return result.Select(x => PushEnvironment.CharSymbol + x.Printify() + PushEnvironment.CharSymbol);
+    }
+
+    private static IEnumerable<string> StringifyFloatStack(IPushStack<double> stack, string format) {
+      var result = stack.AsEnumerable();
+
+      return result.Select(x => x.ToString(format, CultureInfo.InvariantCulture));
+    }
+
+    private static IEnumerable<string> StringifyLiteralStack(IPushStack stack, string prefix = "", string postfix = "", bool reverse = true) {
+      var result = stack.AsStrings();
+
+      if (reverse)
+        result = result.Reverse();
+
+      return result.Select(x => prefix + x.ToString() + postfix);
+    }
+
+    private static IEnumerable<string> StringifyFloatVectorStack(IPushStack<IReadOnlyList<double>> stack, string format) {
+      var separator = PushEnvironment.VectorSeparatorSymbol.ToString();
+      return stack
+        .Reverse()
+        .Select(x => PushEnvironment.VectorStartSymbol + string.Join(separator, x.Select(_ => _.ToString(format, CultureInfo.InvariantCulture))) + PushEnvironment.VectorEndSymbol);
+    }
+
+    private static IEnumerable<string> StringifyVectorStack<T>(IPushStack<IReadOnlyList<T>> stack, string prefix = "", string postfix = "") {
+      var separator = PushEnvironment.VectorSeparatorSymbol.ToString();
+      return stack
+        .Reverse()
+        .Select(x => PushEnvironment.VectorStartSymbol + string.Join(separator, x.Select(_ => prefix + _.ToString() + postfix)) + PushEnvironment.VectorEndSymbol);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/PrintStack.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/PrintStack.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/PrintStack.cs	(revision 15771)
@@ -0,0 +1,146 @@
+﻿using System.Text;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.ProgramSynthesis {
+  /// <summary>
+  /// Optimized for string concatenation to reduce memory effort
+  /// </summary>
+  public class PrintStack : IPrintStack {
+    private int lineCount = 0;
+    private int length = 0;
+    private IReadOnlyList<string> lines;
+    private readonly StringBuilder stringBuilder = new StringBuilder();
+
+    public PrintStack() {
+      IsCurrentLineEmpty = true;
+    }
+
+    public bool IsCurrentLineEmpty { get; private set; }
+
+    IEnumerator IEnumerable.GetEnumerator() {
+      return Lines.GetEnumerator();
+    }
+
+    public void Add(string item) {
+      Push(item);
+    }
+
+    public IReadOnlyList<string> Lines {
+      get {
+        if (lines != null && stringBuilder.Length == length)
+          return lines;
+
+        length = stringBuilder.Length;
+        lines = stringBuilder.ToString().Split(PushEnvironment.NewLine);
+
+        return lines;
+      }
+    }
+
+    void IPushStack.Clear() {
+      lineCount = 0;
+      length = 0;
+      lines = null;
+      IsCurrentLineEmpty = true;
+      stringBuilder.Clear();
+    }
+
+    public void NewLine() {
+      stringBuilder.Append(PushEnvironment.NewLine);
+      IsCurrentLineEmpty = true;
+      lineCount++;
+    }
+
+    public void Push<T>(T item) {
+      if (IsEmpty) lineCount = 1;
+      var str = item.ToString();
+      stringBuilder.Append(str);
+      IsCurrentLineEmpty = IsCurrentLineEmpty && string.IsNullOrEmpty(str);
+    }
+
+    public void Push(float item) {
+      if (IsEmpty) lineCount = 1;
+      stringBuilder.Concat(item);
+      IsCurrentLineEmpty = false;
+    }
+
+    public void Push(double item) {
+      if (IsEmpty) lineCount = 1;
+      stringBuilder.Concat(item);
+      IsCurrentLineEmpty = false;
+    }
+
+    public void Push(long item) {
+      if (IsEmpty) lineCount = 1;
+      stringBuilder.Concat(item);
+      IsCurrentLineEmpty = false;
+    }
+
+    public void Push(int item) {
+      if (IsEmpty) lineCount = 1;
+      stringBuilder.Concat(item);
+      IsCurrentLineEmpty = false;
+    }
+
+    public void Push(char item) {
+      if (IsEmpty) lineCount = 1;
+      stringBuilder.Append(item);
+      IsCurrentLineEmpty = false;
+    }
+
+    public void Push(bool item) {
+      if (IsEmpty) lineCount = 1;
+      stringBuilder.Append(item);
+      IsCurrentLineEmpty = false;
+    }
+
+    public void Push(string item) {
+      if (IsEmpty) lineCount = 1;
+      stringBuilder.Append(item);
+      IsCurrentLineEmpty = IsCurrentLineEmpty && string.IsNullOrEmpty(item);
+    }
+
+    public void Push(IReadOnlyList<string> items, int startIndex) {
+      for (var i = startIndex; i < items.Count; i++)
+        stringBuilder.Append(items[i]);
+
+      IsCurrentLineEmpty = false;
+    }
+
+    public void Push(IReadOnlyList<string> items) {
+      Push(items, 0);
+    }
+
+    public void Push(IEnumerable<string> items) {
+      foreach (var item in items)
+        stringBuilder.Append(item);
+
+      IsCurrentLineEmpty = false;
+    }
+
+    public IEnumerable<string> AsStrings() {
+      return Lines;
+    }
+
+    public IEnumerable<object> AsObjects() {
+      return Lines;
+    }
+
+    int IPushStack.Count {
+      get {
+        return lineCount;
+      }
+    }
+
+    public bool IsEmpty { get { return stringBuilder.Length == 0; } }
+
+    public bool IsEnabled { get; set; }
+
+    public bool IsReadOnly { get { return false; } }
+
+    public override string ToString() {
+      return stringBuilder.ToString();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/PushStack.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/PushStack.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/PushStack.cs	(revision 15771)
@@ -0,0 +1,270 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+  using System.Collections;
+  using System.Collections.Generic;
+  using System.Linq;
+
+  /// <summary>
+  ///     While Push's Stacks are generally treated as genuine Stacks---that is, inclassions take their arguments from the
+  ///     tops of
+  ///     the Stacks and push their results onto the tops of the Stacks---a few inclassions (like YANK and SHOVE) do allow
+  ///     direct access
+  ///     to "deep" stack elements by means of integer indices. To this extent the Stacks can be used as general, random
+  ///     access memory
+  ///     classures. This is one of the features that ensures the Turing-completeness of Push (another being the arbitrary
+  ///     name/value
+  ///     bindings supported by the NAME data type and DEFINE methods; see below).
+  /// </summary>
+  /// <typeparam name="T">The item type of the collection.</typeparam>
+  public class PushStack<T> : IPushStack<T> {
+    private const string Delimiter = " ";
+
+    private readonly List<T> data;
+
+    public PushStack(int capacity = 0) {
+      data = new List<T>(capacity);
+      IsEnabled = true;
+    }
+
+    public bool IsEnabled { get; set; }
+
+    public int Capacity
+    {
+      get
+      {
+        return data.Capacity;
+      }
+    }
+
+    public T Top
+    {
+      get
+      {
+        return data[Count - 1];
+      }
+
+      set
+      {
+        data[Count - 1] = value;
+      }
+    }
+
+    public T TopOrDefault
+    {
+      get
+      {
+        return Count > 0 ? Top : default(T);
+      }
+    }
+
+    public T Bottom
+    {
+      get
+      {
+        return data[0];
+      }
+    }
+
+    public T BottomOrDefault
+    {
+      get
+      {
+        return Count > 0 ? Bottom : default(T);
+      }
+    }
+
+    public int Count
+    {
+      get
+      {
+        return data.Count;
+      }
+    }
+
+    public bool IsEmpty
+    {
+      get
+      {
+        return Count == 0;
+      }
+    }
+
+    public bool IsReadOnly
+    {
+      get
+      {
+        return false;
+      }
+    }
+
+    public void Add(T item) {
+      Push(item);
+    }
+
+    public void Clear() {
+      data.Clear();
+    }
+
+    public bool Contains(T item) {
+      return data.Contains(item);
+    }
+
+    public void CopyTo(T[] array, int arrayIndex) {
+      data.CopyTo(array, arrayIndex);
+    }
+
+    public IEnumerator<T> GetEnumerator() {
+      return data.GetEnumerator();
+    }
+
+    public T ElementAt(int index) {
+      return data[index];
+    }
+
+    public T this[int index]
+    {
+      get { return data[Count - 1 - index]; }
+      set { data[Count - 1 - index] = value; }
+    }
+
+    public void Swap(int count) {
+      var top = Top;
+      var bottomIndex = Count - count;
+
+      for (var i = Count - 1; i > bottomIndex; i--)
+        data[i] = data[i - 1];
+
+      data[bottomIndex] = top;
+    }
+
+    public void Yank(int index) {
+      if (index == Count - 1) return;
+
+      var item = data[index];
+      data.RemoveAt(index);
+      data.Add(item);
+    }
+
+    public T Pop() {
+      var top = Top;
+      data.RemoveAt(Count - 1);
+
+      return top;
+    }
+
+    public IReadOnlyList<T> Pop(int count) {
+      var items = Peek(count);
+      Remove(count);
+
+      return items;
+    }
+
+    public IReadOnlyList<T> Peek(int count) {
+      var startIndex = Count - count;
+
+      var items = new T[count];
+      data.CopyTo(startIndex, items, 0, count);
+
+      return items;
+    }
+
+    public void Push(T item) {
+      if (!IsEnabled) return;
+
+      data.Add(item);
+    }
+
+    public void Push(T item1, T item2) {
+      if (!IsEnabled) return;
+
+      data.Add(item1);
+      data.Add(item2);
+    }
+
+    public void Push(T item1, T item2, T item3) {
+      if (!IsEnabled) return;
+
+      data.Add(item1);
+      data.Add(item2);
+      data.Add(item3);
+    }
+
+    public void Push(T item1, T item2, T item3, T item4) {
+      if (!IsEnabled) return;
+
+      data.Add(item1);
+      data.Add(item2);
+      data.Add(item3);
+      data.Add(item4);
+    }
+
+    public void Push(IReadOnlyList<T> items, int startIndex) {
+      if (!IsEnabled) return;
+
+      for (var i = startIndex; i < items.Count; i++) data.Add(items[i]);
+    }
+
+    public void Push(IReadOnlyList<T> items) {
+      if (!IsEnabled) return;
+
+      data.AddRange(items);
+    }
+
+    public void Push(IEnumerable<T> items) {
+      if (!IsEnabled) return;
+
+      data.AddRange(items);
+    }
+
+    public void Insert(int index, T item) {
+      if (!IsEnabled) return;
+
+      data.Insert(Count - index, item);
+    }
+
+    public bool Remove(T item) {
+      return data.Remove(item);
+    }
+
+    public void RemoveTop() {
+      data.RemoveAt(Count - 1);
+    }
+
+    public void Remove(int count) {
+      data.RemoveRange(Count - count, count);
+    }
+
+    public void RemoveAt(int index) {
+      data.RemoveAt(index);
+    }
+
+    public void RemoveAt(int index, int count) {
+      data.RemoveRange(index, count);
+    }
+
+    public bool TryPop(out T item) {
+      if (Count > 0) {
+        item = Pop();
+        return true;
+      }
+      item = default(T);
+      return false;
+    }
+
+    IEnumerator IEnumerable.GetEnumerator() {
+      return data.GetEnumerator();
+    }
+
+    public override string ToString() {
+      return string.Join(Delimiter, data.Select(x => x.ToString()).Reverse());
+    }
+
+    IEnumerable<string> IPushStack.AsStrings() {
+      return data.Select(x => x.ToString());
+    }
+
+    IEnumerable<object> IPushStack.AsObjects() {
+      return data.OfType<object>();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/StackTypes.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/StackTypes.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/StackTypes.cs	(revision 15771)
@@ -0,0 +1,44 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis {
+  using System;
+
+  // Be aware that it is assumed that this values are equal to HeuristicLab.BenchmarkSuite.DataTypes
+  [Flags]
+  public enum StackTypes {
+    None = 0x01, // Required to specify expression dependencies
+    Integer = 0x02,
+    Float = 0x04,
+    Char = 0x08,
+    String = 0x10,
+    Boolean = 0x20,
+    Name = 0x40,
+    Code = 0x80,
+    Exec = 0x100,
+    Print = 0x200,
+    IntegerVector = 0x400,
+    FloatVector = 0x800,
+    StringVector = 0x1000,
+    BooleanVector = 0x2000,
+  }
+
+  //public static class StackTypeExtensions {
+  //  private static readonly IReadOnlyDictionary<StackTypes, string> StackTypesNameDict = new Dictionary<StackTypes, string> {
+  //    { StackTypes.Integer, "Integer" },
+  //    { StackTypes.Float, "Float" },
+  //    { StackTypes.Char, "Char" },
+  //    { StackTypes.String, "String" },
+  //    { StackTypes.Boolean, "Boolean" },
+  //    { StackTypes.Name, "Name" },
+  //    { StackTypes.Code, "Code" },
+  //    { StackTypes.Exec, "Exec" },
+  //    { StackTypes.Print, "Print" },
+  //    { StackTypes.IntegerVector, "IntegerVector" },
+  //    { StackTypes.FloatVector, "FloatVector" },
+  //    { StackTypes.StringVector, "StringVector" },
+  //    { StackTypes.BooleanVector, "BooleanVector" },
+  //  };
+
+  //  public static string GetName(this StackTypes types) {
+  //    return StackTypesNameDict[types];
+  //  }
+  //}
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/StyleCop.Cache
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/StyleCop.Cache	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/StyleCop.Cache	(revision 15771)
@@ -0,0 +1,5957 @@
+<stylecopresultscache>
+  <version>12</version>
+  <project key="-1474689600">
+    <configuration>DEBUG;TRACE</configuration>
+  </project>
+  <sourcecode name="PushExpressionAttriubte.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:08:45.112</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="UsingDirectivesMustBePlacedWithinNamespace" ruleCheckId="SA1200">
+        <context>All using directives must be placed inside of the namespace.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>3</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="IEnabledExpressionsConfiguration.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.05 10:52:56.139</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="UsingDirectivesMustBePlacedWithinNamespace" ruleCheckId="SA1200">
+        <context>All using directives must be placed inside of the namespace.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="UsingDirectivesMustBePlacedWithinNamespace" ruleCheckId="SA1200">
+        <context>All using directives must be placed inside of the namespace.</context>
+        <line>2</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="UsingDirectivesMustBePlacedWithinNamespace" ruleCheckId="SA1200">
+        <context>All using directives must be placed inside of the namespace.</context>
+        <line>3</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="UsingDirectivesMustBePlacedWithinNamespace" ruleCheckId="SA1200">
+        <context>All using directives must be placed inside of the namespace.</context>
+        <line>4</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="UsingDirectivesMustBePlacedWithinNamespace" ruleCheckId="SA1200">
+        <context>All using directives must be placed inside of the namespace.</context>
+        <line>5</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>12</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All classes must be placed after all interfaces.</context>
+        <line>24</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All properties must be placed after all constructors.</context>
+        <line>17</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>17</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to AddedExpressions must begin with the 'this.', 'base.', 'object.' or 'EnabledExpressionsChangedEventArgs.' or 'EventArgs.' prefix to indicate the intended method call. </context>
+        <line>19</line>
+        <index>718</index>
+        <endIndex>733</endIndex>
+        <startLine>19</startLine>
+        <startColumn>7</startColumn>
+        <endLine>19</endLine>
+        <endColumn>22</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to RemovedExpressions must begin with the 'this.', 'base.', 'object.' or 'EnabledExpressionsChangedEventArgs.' or 'EventArgs.' prefix to indicate the intended method call. </context>
+        <line>20</line>
+        <index>762</index>
+        <endIndex>779</endIndex>
+        <startLine>20</startLine>
+        <startColumn>7</startColumn>
+        <endLine>20</endLine>
+        <endColumn>24</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The interface must have a documentation header.</context>
+        <line>24</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The event must have a documentation header.</context>
+        <line>26</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>28</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>30</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>31</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>31</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>32</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>32</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>34</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>34</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>35</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>35</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="IReadonlyPushGpConfiguration.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.05 10:45:46.001</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The interface must have a documentation header.</context>
+        <line>4</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>4</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>5</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>6</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>6</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>10</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>10</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>12</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>12</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>13</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>13</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>16</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>16</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>17</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>17</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>18</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>18</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>19</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>19</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>20</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>20</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>21</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>21</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>23</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="PushGpConfiguration.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.05 10:52:56.105</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>13</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>13</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.NamingRules" rule="StaticReadonlyFieldsMustBeginWithUpperCaseLetter" ruleCheckId="SA1311">
+        <context>Static readonly fields must start with an upper-case letter: itemName.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.NamingRules" rule="StaticReadonlyFieldsMustBeginWithUpperCaseLetter" ruleCheckId="SA1311">
+        <context>Static readonly fields must start with an upper-case letter: itemDescription.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>17</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>17</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All constructors must be placed after all fields.</context>
+        <line>65</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All constructors must be placed after all fields.</context>
+        <line>85</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All constructors must be placed after all fields.</context>
+        <line>105</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All constructors must be placed after all fields.</context>
+        <line>125</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All constructors must be placed after all fields.</context>
+        <line>145</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All constructors must be placed after all fields.</context>
+        <line>165</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>35</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>61</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>63</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The property must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>63</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>65</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>67</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>76</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>80</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the else statement must be wrapped in opening and closing curly brackets.</context>
+        <line>81</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to EnableExpressionOfStack must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>80</line>
+        <index>2945</index>
+        <endIndex>2967</endIndex>
+        <startLine>80</startLine>
+        <startColumn>41</startColumn>
+        <endLine>80</endLine>
+        <endColumn>63</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to DisableExpressionOfStack must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>81</line>
+        <index>3003</index>
+        <endIndex>3026</endIndex>
+        <startLine>81</startLine>
+        <startColumn>14</startColumn>
+        <endLine>81</endLine>
+        <endColumn>37</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>85</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>87</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>96</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>100</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the else statement must be wrapped in opening and closing curly brackets.</context>
+        <line>101</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to EnableExpressionOfStack must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>100</line>
+        <index>3405</index>
+        <endIndex>3427</endIndex>
+        <startLine>100</startLine>
+        <startColumn>41</startColumn>
+        <endLine>100</endLine>
+        <endColumn>63</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to DisableExpressionOfStack must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>101</line>
+        <index>3463</index>
+        <endIndex>3486</endIndex>
+        <startLine>101</startLine>
+        <startColumn>14</startColumn>
+        <endLine>101</endLine>
+        <endColumn>37</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>105</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>107</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>116</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>120</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the else statement must be wrapped in opening and closing curly brackets.</context>
+        <line>121</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to EnableExpressionOfStack must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>120</line>
+        <index>3853</index>
+        <endIndex>3875</endIndex>
+        <startLine>120</startLine>
+        <startColumn>39</startColumn>
+        <endLine>120</endLine>
+        <endColumn>61</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to DisableExpressionOfStack must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>121</line>
+        <index>3909</index>
+        <endIndex>3932</endIndex>
+        <startLine>121</startLine>
+        <startColumn>14</startColumn>
+        <endLine>121</endLine>
+        <endColumn>37</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>125</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>127</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>136</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>140</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the else statement must be wrapped in opening and closing curly brackets.</context>
+        <line>141</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to EnableExpressionOfStack must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>140</line>
+        <index>4286</index>
+        <endIndex>4308</endIndex>
+        <startLine>140</startLine>
+        <startColumn>37</startColumn>
+        <endLine>140</endLine>
+        <endColumn>59</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to DisableExpressionOfStack must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>141</line>
+        <index>4341</index>
+        <endIndex>4364</endIndex>
+        <startLine>141</startLine>
+        <startColumn>14</startColumn>
+        <endLine>141</endLine>
+        <endColumn>37</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>145</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>147</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>156</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>160</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the else statement must be wrapped in opening and closing curly brackets.</context>
+        <line>161</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to EnableExpressionOfStack must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>160</line>
+        <index>4716</index>
+        <endIndex>4738</endIndex>
+        <startLine>160</startLine>
+        <startColumn>37</startColumn>
+        <endLine>160</endLine>
+        <endColumn>59</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to DisableExpressionOfStack must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>161</line>
+        <index>4771</index>
+        <endIndex>4794</endIndex>
+        <startLine>161</startLine>
+        <startColumn>14</startColumn>
+        <endLine>161</endLine>
+        <endColumn>37</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>165</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>167</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>176</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>180</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the else statement must be wrapped in opening and closing curly brackets.</context>
+        <line>181</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to EnableExpressionOfStack must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>180</line>
+        <index>5152</index>
+        <endIndex>5174</endIndex>
+        <startLine>180</startLine>
+        <startColumn>38</startColumn>
+        <endLine>180</endLine>
+        <endColumn>60</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to DisableExpressionOfStack must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>181</line>
+        <index>5207</index>
+        <endIndex>5230</endIndex>
+        <startLine>181</startLine>
+        <startColumn>14</startColumn>
+        <endLine>181</endLine>
+        <endColumn>37</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>185</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="PropertySummaryDocumentationMustMatchAccessors" ruleCheckId="SA1623">
+        <context>The property's documentation summary text must begin with: Gets or sets</context>
+        <line>196</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="PropertySummaryDocumentationMustMatchAccessors" ruleCheckId="SA1623">
+        <context>The property's documentation summary text must begin with: Gets or sets</context>
+        <line>201</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="PropertySummaryDocumentationMustMatchAccessors" ruleCheckId="SA1623">
+        <context>The property's documentation summary text must begin with: Gets or sets</context>
+        <line>210</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="PropertySummaryDocumentationMustMatchAccessors" ruleCheckId="SA1623">
+        <context>The property's documentation summary text must begin with: Gets or sets</context>
+        <line>215</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="PropertySummaryDocumentationMustMatchAccessors" ruleCheckId="SA1623">
+        <context>The property's documentation summary text must begin with: Gets or sets a value indicating whether</context>
+        <line>221</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="PropertySummaryDocumentationMustMatchAccessors" ruleCheckId="SA1623">
+        <context>The property's documentation summary text must begin with: Gets or sets a value indicating whether</context>
+        <line>226</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="PropertySummaryDocumentationMustMatchAccessors" ruleCheckId="SA1623">
+        <context>The property's documentation summary text must begin with: Gets or sets</context>
+        <line>231</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="PropertySummaryDocumentationMustMatchAccessors" ruleCheckId="SA1623">
+        <context>The property's documentation summary text must begin with: Gets or sets</context>
+        <line>236</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="PropertySummaryDocumentationMustMatchAccessors" ruleCheckId="SA1623">
+        <context>The property's documentation summary text must begin with: Gets or sets</context>
+        <line>241</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="PropertySummaryDocumentationMustMatchAccessors" ruleCheckId="SA1623">
+        <context>The property's documentation summary text must begin with: Gets or sets</context>
+        <line>246</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="PropertySummaryDocumentationMustMatchAccessors" ruleCheckId="SA1623">
+        <context>The property's documentation summary text must begin with: Gets or sets</context>
+        <line>253</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>255</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>255</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>256</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to EnableExpression must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>257</line>
+        <index>8766</index>
+        <endIndex>8781</endIndex>
+        <startLine>257</startLine>
+        <startColumn>9</startColumn>
+        <endLine>257</endLine>
+        <endColumn>24</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>261</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>261</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>262</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to DisableExpression must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>263</line>
+        <index>8952</index>
+        <endIndex>8968</endIndex>
+        <startLine>263</startLine>
+        <startColumn>9</startColumn>
+        <endLine>263</endLine>
+        <endColumn>25</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>267</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>267</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>268</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to EnabledExpressions must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>268</line>
+        <index>9055</index>
+        <endIndex>9072</endIndex>
+        <startLine>268</startLine>
+        <startColumn>11</startColumn>
+        <endLine>268</endLine>
+        <endColumn>28</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to EnabledExpressions must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>270</line>
+        <index>9107</index>
+        <endIndex>9124</endIndex>
+        <startLine>270</startLine>
+        <startColumn>7</startColumn>
+        <endLine>270</endLine>
+        <endColumn>24</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>273</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>273</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>274</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to EnabledExpressions must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>274</line>
+        <index>9208</index>
+        <endIndex>9225</endIndex>
+        <startLine>274</startLine>
+        <startColumn>12</startColumn>
+        <endLine>274</endLine>
+        <endColumn>29</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to EnabledExpressions must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>276</line>
+        <index>9260</index>
+        <endIndex>9277</endIndex>
+        <startLine>276</startLine>
+        <startColumn>7</startColumn>
+        <endLine>276</endLine>
+        <endColumn>24</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>279</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>279</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to EnableExpression must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>281</line>
+        <index>9493</index>
+        <endIndex>9508</endIndex>
+        <startLine>281</startLine>
+        <startColumn>7</startColumn>
+        <endLine>281</endLine>
+        <endColumn>22</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>284</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>284</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to DisableExpression must begin with the 'this.', 'base.', 'object.' or 'PushGpConfiguration.' or 'NamedItem.' prefix to indicate the intended method call. </context>
+        <line>286</line>
+        <index>9738</index>
+        <endIndex>9754</endIndex>
+        <startLine>286</startLine>
+        <startColumn>7</startColumn>
+        <endLine>286</endLine>
+        <endColumn>23</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>289</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="ObjectPool.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:01.938</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileHeaderMustShowCopyright" ruleCheckId="SA1634">
+        <context>The file header must contain a copyright tag.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="UsingDirectivesMustBePlacedWithinNamespace" ruleCheckId="SA1200">
+        <context>All using directives must be placed inside of the namespace.</context>
+        <line>5</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="DocumentationHeadersMustNotContainBlankLines" ruleCheckId="SA1644">
+        <context>The documentation header must not contain blank lines. Use the 'para' tag to insert line breaks within documentation text.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="GenericTypeParametersMustBeDocumented" ruleCheckId="SA1618">
+        <context>The documentation header must contain typeparam tags matching the generic types for the class.</context>
+        <line>27</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>27</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CodeMustNotContainMultipleBlankLinesInARow" ruleCheckId="SA1507">
+        <context>The code must not contain multiple blank lines in a row.</context>
+        <line>40</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The struct must have a documentation header.</context>
+        <line>28</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>28</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All structs must be placed after all fields.</context>
+        <line>28</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All structs must be placed after all constructors.</context>
+        <line>28</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All structs must be placed after all methods.</context>
+        <line>28</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>29</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.NamingRules" rule="FieldNamesMustNotBeginWithUnderscore" ruleCheckId="SA1309">
+        <context>Field names must not start with an underscore.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>38</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.NamingRules" rule="FieldNamesMustNotBeginWithUnderscore" ruleCheckId="SA1309">
+        <context>Field names must not start with an underscore.</context>
+        <line>38</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>41</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>42</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>44</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>44</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixLocalCallsWithThis" ruleCheckId="SA1101">
+        <context>The call to _factory must begin with the 'this.' prefix to indicate that the item is a member of the class.</context>
+        <line>45</line>
+        <index>1874</index>
+        <endIndex>1881</endIndex>
+        <startLine>45</startLine>
+        <startColumn>7</startColumn>
+        <endLine>45</endLine>
+        <endColumn>14</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixLocalCallsWithThis" ruleCheckId="SA1101">
+        <context>The call to _items must begin with the 'this.' prefix to indicate that the item is a member of the class.</context>
+        <line>46</line>
+        <index>1901</index>
+        <endIndex>1906</endIndex>
+        <startLine>46</startLine>
+        <startColumn>7</startColumn>
+        <endLine>46</endLine>
+        <endColumn>12</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>49</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>49</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustBeOrderedByAccess" ruleCheckId="SA1202">
+        <context>All private methods must be placed after all internal methods.</context>
+        <line>62</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustBeOrderedByAccess" ruleCheckId="SA1202">
+        <context>All private methods must be placed after all internal methods.</context>
+        <line>92</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixLocalCallsWithThis" ruleCheckId="SA1101">
+        <context>The call to _factory must begin with the 'this.' prefix to indicate that the item is a member of the class.</context>
+        <line>50</line>
+        <index>1990</index>
+        <endIndex>1997</endIndex>
+        <startLine>50</startLine>
+        <startColumn>18</startColumn>
+        <endLine>50</endLine>
+        <endColumn>25</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementReturnValueMustBeDocumented" ruleCheckId="SA1615">
+        <context>The documentation header must contain a returns tag since the element has a return value.</context>
+        <line>62</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>62</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>66</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>71</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>72</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixLocalCallsWithThis" ruleCheckId="SA1101">
+        <context>The call to _items must begin with the 'this.' prefix to indicate that the item is a member of the class.</context>
+        <line>63</line>
+        <index>2432</index>
+        <endIndex>2437</endIndex>
+        <startLine>63</startLine>
+        <startColumn>19</startColumn>
+        <endLine>63</endLine>
+        <endColumn>24</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixLocalCallsWithThis" ruleCheckId="SA1101">
+        <context>The call to CreateInstance must begin with the 'this.' prefix to indicate that the item is a member of the class.</context>
+        <line>78</line>
+        <index>2969</index>
+        <endIndex>2982</endIndex>
+        <startLine>78</startLine>
+        <startColumn>14</startColumn>
+        <endLine>78</endLine>
+        <endColumn>27</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementParametersMustBeDocumented" ruleCheckId="SA1611">
+        <context>The documentation header must contain param tags matching the element's parameter list.</context>
+        <line>92</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>92</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>94</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>95</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixLocalCallsWithThis" ruleCheckId="SA1101">
+        <context>The call to _items must begin with the 'this.' prefix to indicate that the item is a member of the class.</context>
+        <line>93</line>
+        <index>3462</index>
+        <endIndex>3467</endIndex>
+        <startLine>93</startLine>
+        <startColumn>19</startColumn>
+        <endLine>93</endLine>
+        <endColumn>24</endColumn>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="ExpressionNode.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:01.969</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>6</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>6</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>12</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>12</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CodeMustNotContainMultipleBlankLinesInARow" ruleCheckId="SA1507">
+        <context>The code must not contain multiple blank lines in a row.</context>
+        <line>17</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CodeMustNotContainMultipleBlankLinesInARow" ruleCheckId="SA1507">
+        <context>The code must not contain multiple blank lines in a row.</context>
+        <line>18</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="ExpressionTree.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.002</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>4</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>4</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>5</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>10</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="Exporter.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.015</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>5</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="BooleanExpressions.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.028</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>10</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>20</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="FileMayOnlyContainASingleClass" ruleCheckId="SA1402">
+        <context>A C# document may only contain a single class at the root level unless all of the classes are partial and are of the same type.</context>
+        <line>20</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>21</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>21</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>30</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>31</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>31</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>40</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>41</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>41</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>42</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>54</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>55</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>55</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>56</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="CodeExpressions.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.065</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementDocumentationHeadersMustNotBeFollowedByBlankLine" ruleCheckId="SA1506">
+        <context>A documentation header line must not be followed by a blank line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>23</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>24</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>24</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>26</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>37</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="FileMayOnlyContainASingleClass" ruleCheckId="SA1402">
+        <context>A C# document may only contain a single class at the root level unless all of the classes are partial and are of the same type.</context>
+        <line>37</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>38</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>38</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>40</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>51</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>52</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>52</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>62</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>63</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>63</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>65</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>78</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>79</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>79</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>81</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>95</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>96</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>96</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>97</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>107</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>137</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>110</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>126</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>115</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>126</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>130</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>137</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>149</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>143</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>149</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="CodeMustNotContainMultipleStatementsOnOneLine" ruleCheckId="SA1107">
+        <context>A line may only contain a single statement.</context>
+        <line>126</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="CodeMustNotContainMultipleStatementsOnOneLine" ruleCheckId="SA1107">
+        <context>A line may only contain a single statement.</context>
+        <line>137</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="CodeMustNotContainMultipleStatementsOnOneLine" ruleCheckId="SA1107">
+        <context>A line may only contain a single statement.</context>
+        <line>149</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>164</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>165</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>165</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>166</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>182</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>183</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>183</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>185</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>189</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>203</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>204</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>204</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>205</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>210</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>220</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>213</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>220</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="CodeMustNotContainMultipleStatementsOnOneLine" ruleCheckId="SA1107">
+        <context>A line may only contain a single statement.</context>
+        <line>220</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementDocumentationMustBeSpelledCorrectly" ruleCheckId="SA1650">
+        <context>The documentation text within the summary tag contains incorrectly spelled words: consing</context>
+        <line>234</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>234</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>235</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>235</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>237</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>241</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>253</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>245</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>253</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="CodeMustNotContainMultipleStatementsOnOneLine" ruleCheckId="SA1107">
+        <context>A line may only contain a single statement.</context>
+        <line>253</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>270</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>271</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>271</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>274</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>285</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>285</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>287</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>308</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>309</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>309</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>312</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>328</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>329</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>329</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>331</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="DocumentationMustContainValidXml" ruleCheckId="SA1603">
+        <context>The documentation header is composed of invalid Xml: The 'description' start tag on line 7 position 14 does not match the end tag of 'item'. Line 10, position 11.</context>
+        <line>364</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>364</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>365</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>365</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>366</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to DetermineUniqueItems must begin with the 'this.', 'base.', 'object.' or 'CodeDiscrepancyExpression.' or 'StatelessExpression.' prefix to indicate the intended method call. </context>
+        <line>372</line>
+        <index>15720</index>
+        <endIndex>15739</endIndex>
+        <startLine>372</startLine>
+        <startColumn>7</startColumn>
+        <endLine>372</endLine>
+        <endColumn>26</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to DetermineUniqueItems must begin with the 'this.', 'base.', 'object.' or 'CodeDiscrepancyExpression.' or 'StatelessExpression.' prefix to indicate the intended method call. </context>
+        <line>373</line>
+        <index>15778</index>
+        <endIndex>15797</endIndex>
+        <startLine>373</startLine>
+        <startColumn>7</startColumn>
+        <endLine>373</endLine>
+        <endColumn>26</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to GetDiscrepancy must begin with the 'this.', 'base.', 'object.' or 'CodeDiscrepancyExpression.' or 'StatelessExpression.' prefix to indicate the intended method call. </context>
+        <line>375</line>
+        <index>15855</index>
+        <endIndex>15868</endIndex>
+        <startLine>375</startLine>
+        <startColumn>25</startColumn>
+        <endLine>375</endLine>
+        <endColumn>38</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>380</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>380</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the foreach statement must be wrapped in opening and closing curly brackets.</context>
+        <line>385</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>386</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>393</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>393</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>394</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>402</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>397</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>399</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the else statement must be wrapped in opening and closing curly brackets.</context>
+        <line>400</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>402</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="CodeMustNotContainMultipleStatementsOnOneLine" ruleCheckId="SA1107">
+        <context>A line may only contain a single statement.</context>
+        <line>402</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>419</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>420</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>420</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>424</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>438</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>439</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>439</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>440</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>453</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>454</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>454</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>455</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>468</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>469</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>469</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>470</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>483</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>484</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>484</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>485</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>499</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>500</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>500</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>504</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>511</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>518</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>518</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="CodeMustNotContainMultipleStatementsOnOneLine" ruleCheckId="SA1107">
+        <context>A line may only contain a single statement.</context>
+        <line>518</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>534</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>535</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>535</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>536</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>542</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>552</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>553</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>553</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>554</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>569</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>570</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>570</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>571</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>589</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>590</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>590</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>591</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>598</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>609</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>601</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>603</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>603</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>609</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="CodeMustNotContainMultipleStatementsOnOneLine" ruleCheckId="SA1107">
+        <context>A line may only contain a single statement.</context>
+        <line>603</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="CodeMustNotContainMultipleStatementsOnOneLine" ruleCheckId="SA1107">
+        <context>A line may only contain a single statement.</context>
+        <line>609</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>626</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>627</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>627</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>628</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>635</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>645</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>638</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>640</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>640</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>645</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="CodeMustNotContainMultipleStatementsOnOneLine" ruleCheckId="SA1107">
+        <context>A line may only contain a single statement.</context>
+        <line>640</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="CodeMustNotContainMultipleStatementsOnOneLine" ruleCheckId="SA1107">
+        <context>A line may only contain a single statement.</context>
+        <line>645</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>657</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>658</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>658</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>659</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>672</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>673</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>673</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>674</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>681</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>685</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>685</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="CodeMustNotContainMultipleStatementsOnOneLine" ruleCheckId="SA1107">
+        <context>A line may only contain a single statement.</context>
+        <line>685</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>698</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>699</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>699</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>700</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementDocumentationMustBeSpelledCorrectly" ruleCheckId="SA1650">
+        <context>The documentation text within the summary tag contains incorrectly spelled words: subst</context>
+        <line>718</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>718</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>719</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>719</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>721</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the for statement must be wrapped in opening and closing curly brackets.</context>
+        <line>730</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="DefineExpressions.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.086</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="DocumentationTextMustContainWhitespace" ruleCheckId="SA1630">
+        <context>The documentation text within the typeparam tag does not contain any whitespace between words, indicating that it most likely does not follow a proper grammatical structure required for documentation text.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementDocumentationMustBeSpelledCorrectly" ruleCheckId="SA1650">
+        <context>The documentation text within the typeparam tag contains incorrectly spelled words: Stacktype</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>19</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>21</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>26</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the else statement must be wrapped in opening and closing curly brackets.</context>
+        <line>27</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>32</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>32</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="FileMayOnlyContainASingleClass" ruleCheckId="SA1402">
+        <context>A C# document may only contain a single class at the root level unless all of the classes are partial and are of the same type.</context>
+        <line>32</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>34</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>47</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>47</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>48</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>48</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>49</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>62</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>62</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="OpeningCurlyBracketsMustNotBeFollowedByBlankLine" ruleCheckId="SA1505">
+        <context>An opening curly bracket must not be followed by a blank line.</context>
+        <line>62</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>64</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>64</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>74</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>74</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>75</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>75</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>85</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>85</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>86</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>86</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="DoCountExpressions.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.109</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>6</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>6</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="OpeningCurlyBracketsMustNotBeFollowedByBlankLine" ruleCheckId="SA1505">
+        <context>An opening curly bracket must not be followed by a blank line.</context>
+        <line>6</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>10</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>10</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>10</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>16</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>16</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementDocumentationMustBeSpelledCorrectly" ruleCheckId="SA1650">
+        <context>The documentation text within the summary tag contains incorrectly spelled words: Arg, Arg</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="OpeningCurlyBracketsMustNotBeFollowedByBlankLine" ruleCheckId="SA1505">
+        <context>An opening curly bracket must not be followed by a blank line.</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="FileMayOnlyContainASingleClass" ruleCheckId="SA1402">
+        <context>A C# document may only contain a single class at the root level unless all of the classes are partial and are of the same type.</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>45</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>45</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>47</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>47</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>49</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>49</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>53</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>53</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementDocumentationMustBeSpelledCorrectly" ruleCheckId="SA1650">
+        <context>The documentation text within the summary tag contains incorrectly spelled words: Arg, RANGE'Exec, Arg</context>
+        <line>73</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>73</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>74</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>74</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>75</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>75</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>75</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>77</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>77</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>81</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>81</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="DoRangeExpressions.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.158</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>6</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>6</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>50</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="FileMayOnlyContainASingleClass" ruleCheckId="SA1402">
+        <context>A C# document may only contain a single class at the root level unless all of the classes are partial and are of the same type.</context>
+        <line>50</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>51</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>51</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>53</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>53</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>54</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>54</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>54</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>58</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>58</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>88</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>89</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>89</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>91</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>91</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>92</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>92</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>92</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ClosingCurlyBracketMustBeFollowedByBlankLine" ruleCheckId="SA1513">
+        <context>Statements or elements wrapped in curly brackets must be followed by a blank line.</context>
+        <line>94</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>95</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>95</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>95</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="DoTimesExpressions.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.184</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>6</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>6</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>13</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>13</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="SingleLineCommentsMustNotBeFollowedByBlankLine" ruleCheckId="SA1512">
+        <context>A single-line comment must not be followed by a blank line. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>17</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.SpacingRules" rule="SingleLineCommentsMustBeginWithSingleSpace" ruleCheckId="SA1005">
+        <context>The comment must start with a single space. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>14</line>
+        <index>795</index>
+        <endIndex>832</endIndex>
+        <startLine>14</startLine>
+        <startColumn>7</startColumn>
+        <endLine>14</endLine>
+        <endColumn>44</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.SpacingRules" rule="SingleLineCommentsMustBeginWithSingleSpace" ruleCheckId="SA1005">
+        <context>The comment must start with a single space. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>15</line>
+        <index>841</index>
+        <endIndex>903</endIndex>
+        <startLine>15</startLine>
+        <startColumn>7</startColumn>
+        <endLine>15</endLine>
+        <endColumn>69</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.SpacingRules" rule="SingleLineCommentsMustBeginWithSingleSpace" ruleCheckId="SA1005">
+        <context>The comment must start with a single space. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>16</line>
+        <index>912</index>
+        <endIndex>941</endIndex>
+        <startLine>16</startLine>
+        <startColumn>7</startColumn>
+        <endLine>16</endLine>
+        <endColumn>36</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.SpacingRules" rule="SingleLineCommentsMustBeginWithSingleSpace" ruleCheckId="SA1005">
+        <context>The comment must start with a single space. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>17</line>
+        <index>950</index>
+        <endIndex>978</endIndex>
+        <startLine>17</startLine>
+        <startColumn>7</startColumn>
+        <endLine>17</endLine>
+        <endColumn>35</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>26</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>26</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>45</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="FileMayOnlyContainASingleClass" ruleCheckId="SA1402">
+        <context>A C# document may only contain a single class at the root level unless all of the classes are partial and are of the same type.</context>
+        <line>45</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>46</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>46</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>47</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>47</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>47</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>49</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>49</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>53</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>53</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>68</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>69</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>69</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>70</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>70</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>70</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>72</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>72</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>76</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>76</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="DuplicateExpressions.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.210</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="DocumentationTextMustContainWhitespace" ruleCheckId="SA1630">
+        <context>The documentation text within the typeparam tag does not contain any whitespace between words, indicating that it most likely does not follow a proper grammatical structure required for documentation text.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementDocumentationMustBeSpelledCorrectly" ruleCheckId="SA1650">
+        <context>The documentation text within the typeparam tag contains incorrectly spelled words: Stacktype</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>12</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>12</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>13</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>18</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>18</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>19</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>28</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>28</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="FileMayOnlyContainASingleClass" ruleCheckId="SA1402">
+        <context>A C# document may only contain a single class at the root level unless all of the classes are partial and are of the same type.</context>
+        <line>28</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>29</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>29</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>35</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>35</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>36</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>36</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>42</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>42</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>49</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>49</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>50</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>50</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>56</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>56</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>57</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>57</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>63</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>63</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>64</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>64</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="EqualsExpressions.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.251</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="DocumentationTextMustContainWhitespace" ruleCheckId="SA1630">
+        <context>The documentation text within the typeparam tag does not contain any whitespace between words, indicating that it most likely does not follow a proper grammatical structure required for documentation text.</context>
+        <line>10</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementDocumentationMustBeSpelledCorrectly" ruleCheckId="SA1650">
+        <context>The documentation text within the typeparam tag contains incorrectly spelled words: Stacktype</context>
+        <line>10</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>10</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>12</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>21</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>21</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="FileMayOnlyContainASingleClass" ruleCheckId="SA1402">
+        <context>A C# document may only contain a single class at the root level unless all of the classes are partial and are of the same type.</context>
+        <line>21</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>22</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>22</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>28</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>28</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>29</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>29</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>35</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>35</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>36</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>36</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>42</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>42</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>49</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>49</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>50</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>50</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>56</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>56</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>57</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>57</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="ExecExpressions.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.268</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>12</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>18</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>18</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>21</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>21</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>25</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The property must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>25</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>27</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>27</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to ReferenceEquals must begin with the 'this.', 'base.', 'object.' or 'ExecExpandExpression.' or 'StatefullExpression&lt;Program&gt;.' prefix to indicate the intended method call. </context>
+        <line>29</line>
+        <index>1008</index>
+        <endIndex>1022</endIndex>
+        <startLine>29</startLine>
+        <startColumn>14</startColumn>
+        <endLine>29</endLine>
+        <endColumn>28</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>34</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>34</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to GetFromTree must begin with the 'this.', 'base.', 'object.' or 'ExecExpandExpression.' or 'StatefullExpression&lt;Program&gt;.' prefix to indicate the intended method call. </context>
+        <line>44</line>
+        <index>1599</index>
+        <endIndex>1609</endIndex>
+        <startLine>44</startLine>
+        <startColumn>14</startColumn>
+        <endLine>44</endLine>
+        <endColumn>24</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementDocumentationMustHaveSummary" ruleCheckId="SA1604">
+        <context>The documentation header must have a summary tag.</context>
+        <line>48</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementParametersMustBeDocumented" ruleCheckId="SA1611">
+        <context>The documentation header must contain param tags matching the element's parameter list.</context>
+        <line>48</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="GenericTypeParametersMustBeDocumented" ruleCheckId="SA1618">
+        <context>The documentation header must contain typeparam tags matching the generic types for the method.</context>
+        <line>48</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>49</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="SplitParametersMustStartOnLineAfterDeclaration" ruleCheckId="SA1116">
+        <context>If the method parameters are on separate lines, the first parameter must begin on the line beneath the name of the method.</context>
+        <line>48</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to GetFromTree must begin with the 'this.', 'base.', 'object.' or 'ExecExpandExpression.' or 'StatefullExpression&lt;Program&gt;.' prefix to indicate the intended method call. </context>
+        <line>50</line>
+        <index>1883</index>
+        <endIndex>1893</endIndex>
+        <startLine>50</startLine>
+        <startColumn>14</startColumn>
+        <endLine>50</endLine>
+        <endColumn>24</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>53</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>54</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>55</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>61</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>62</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the else statement must be wrapped in opening and closing curly brackets.</context>
+        <line>63</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="ParametersMustBeOnSameLineOrSeparateLines" ruleCheckId="SA1117">
+        <context>All method parameters must be placed on the same line, or each parameter must be placed on a separate line.</context>
+        <line>53</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="SplitParametersMustStartOnLineAfterDeclaration" ruleCheckId="SA1116">
+        <context>If the method parameters are on separate lines, the first parameter must begin on the line beneath the name of the method.</context>
+        <line>53</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="ParameterMustFollowComma" ruleCheckId="SA1115">
+        <context>The parameter must begin on the line after the previous parameter.</context>
+        <line>53</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="ParametersMustBeOnSameLineOrSeparateLines" ruleCheckId="SA1117">
+        <context>All method parameters must be placed on the same line, or each parameter must be placed on a separate line.</context>
+        <line>70</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="SplitParametersMustStartOnLineAfterDeclaration" ruleCheckId="SA1116">
+        <context>If the method parameters are on separate lines, the first parameter must begin on the line beneath the name of the method.</context>
+        <line>70</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="ParameterMustFollowComma" ruleCheckId="SA1115">
+        <context>The parameter must begin on the line after the previous parameter.</context>
+        <line>70</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="ParameterMustFollowComma" ruleCheckId="SA1115">
+        <context>The parameter must begin on the line after the previous parameter.</context>
+        <line>71</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>82</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="FileMayOnlyContainASingleClass" ruleCheckId="SA1402">
+        <context>A C# document may only contain a single class at the root level unless all of the classes are partial and are of the same type.</context>
+        <line>82</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>83</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>83</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>85</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>89</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the else statement must be wrapped in opening and closing curly brackets.</context>
+        <line>90</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="DocumentationMustContainValidXml" ruleCheckId="SA1603">
+        <context>The documentation header is composed of invalid Xml: The 'TopItem' start tag on line 3 position 16 does not match the end tag of 'summary'. Line 4, position 3.</context>
+        <line>99</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>99</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>100</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>100</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>104</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.SpacingRules" rule="SingleLineCommentsMustBeginWithSingleSpace" ruleCheckId="SA1005">
+        <context>The comment must start with a single space. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>109</line>
+        <index>4385</index>
+        <endIndex>4456</endIndex>
+        <startLine>109</startLine>
+        <startColumn>7</startColumn>
+        <endLine>109</endLine>
+        <endColumn>78</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>119</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>120</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>120</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>121</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>134</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>135</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>135</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>136</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="Expression.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.295</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The property must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>23</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>25</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>25</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="ExpressionTable.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.308</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>9</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>10</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>12</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>13</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>17</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>19</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>19</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>27</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>35</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>47</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>55</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustBeOrderedByAccess" ruleCheckId="SA1202">
+        <context>All private methods must be placed after all public methods.</context>
+        <line>125</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustBeOrderedByAccess" ruleCheckId="SA1202">
+        <context>All private methods must be placed after all public methods.</context>
+        <line>135</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustBeOrderedByAccess" ruleCheckId="SA1202">
+        <context>All private methods must be placed after all public methods.</context>
+        <line>139</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustBeOrderedByAccess" ruleCheckId="SA1202">
+        <context>All private methods must be placed after all public methods.</context>
+        <line>148</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustBeOrderedByAccess" ruleCheckId="SA1202">
+        <context>All private methods must be placed after all public methods.</context>
+        <line>152</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustBeOrderedByAccess" ruleCheckId="SA1202">
+        <context>All private methods must be placed after all public methods.</context>
+        <line>159</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustBeOrderedByAccess" ruleCheckId="SA1202">
+        <context>All private methods must be placed after all public methods.</context>
+        <line>163</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustBeOrderedByAccess" ruleCheckId="SA1202">
+        <context>All private methods must be placed after all public methods.</context>
+        <line>167</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustBeOrderedByAccess" ruleCheckId="SA1202">
+        <context>All private methods must be placed after all public methods.</context>
+        <line>174</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>65</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>65</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>70</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>82</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>92</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>92</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>94</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>96</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>99</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>98</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>99</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>105</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>108</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="CodeMustNotContainMultipleStatementsOnOneLine" ruleCheckId="SA1107">
+        <context>A line may only contain a single statement.</context>
+        <line>99</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>116</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>116</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>125</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>125</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>128</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>135</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>135</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>139</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>139</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>143</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>148</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>148</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>152</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>152</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>155</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>159</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>159</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>163</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>163</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>167</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>167</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>170</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>174</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>174</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>177</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="FloatExpressions.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.327</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>12</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>13</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>13</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to Eval must begin with the 'this.', 'base.', 'object.' or 'FloatAddExpression.' or 'PushResultExpression&lt;double&gt;.' prefix to indicate the intended method call. </context>
+        <line>14</line>
+        <index>551</index>
+        <endIndex>554</endIndex>
+        <startLine>14</startLine>
+        <startColumn>7</startColumn>
+        <endLine>14</endLine>
+        <endColumn>10</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>22</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="FileMayOnlyContainASingleClass" ruleCheckId="SA1402">
+        <context>A C# document may only contain a single class at the root level unless all of the classes are partial and are of the same type.</context>
+        <line>22</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>23</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>23</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>32</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>44</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>44</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementDocumentationMustBeSpelledCorrectly" ruleCheckId="SA1650">
+        <context>The documentation text within the summary tag contains incorrectly spelled words: lispworks, htm</context>
+        <line>57</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>57</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>58</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>58</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>67</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>68</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>68</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>77</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>78</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>78</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>87</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>88</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>88</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>97</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>98</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>98</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>107</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>108</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>108</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>117</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>118</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>118</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>127</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>128</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>128</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>129</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>142</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>143</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>143</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>144</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="FlushExpressions.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.373</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="DocumentationTextMustContainWhitespace" ruleCheckId="SA1630">
+        <context>The documentation text within the typeparam tag does not contain any whitespace between words, indicating that it most likely does not follow a proper grammatical structure required for documentation text.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementDocumentationMustBeSpelledCorrectly" ruleCheckId="SA1650">
+        <context>The documentation text within the typeparam tag contains incorrectly spelled words: Stacktype</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>11</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>12</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>12</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>18</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>18</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="FileMayOnlyContainASingleClass" ruleCheckId="SA1402">
+        <context>A C# document may only contain a single class at the root level unless all of the classes are partial and are of the same type.</context>
+        <line>18</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>19</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>19</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to Eval must begin with the 'this.', 'base.', 'object.' or 'IntegerFlushExpression.' or 'FlushExpression&lt;long&gt;.' prefix to indicate the intended method call. </context>
+        <line>20</line>
+        <index>633</index>
+        <endIndex>636</endIndex>
+        <startLine>20</startLine>
+        <startColumn>7</startColumn>
+        <endLine>20</endLine>
+        <endColumn>10</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>25</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>25</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>26</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>26</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to Eval must begin with the 'this.', 'base.', 'object.' or 'FloatFlushExpression.' or 'FlushExpression&lt;double&gt;.' prefix to indicate the intended method call. </context>
+        <line>27</line>
+        <index>868</index>
+        <endIndex>871</endIndex>
+        <startLine>27</startLine>
+        <startColumn>7</startColumn>
+        <endLine>27</endLine>
+        <endColumn>10</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>32</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>32</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to Eval must begin with the 'this.', 'base.', 'object.' or 'BooleanFlushExpression.' or 'FlushExpression&lt;bool&gt;.' prefix to indicate the intended method call. </context>
+        <line>34</line>
+        <index>1105</index>
+        <endIndex>1108</endIndex>
+        <startLine>34</startLine>
+        <startColumn>7</startColumn>
+        <endLine>34</endLine>
+        <endColumn>10</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>39</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>39</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>40</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>40</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to Eval must begin with the 'this.', 'base.', 'object.' or 'NameFlushExpression.' or 'FlushExpression&lt;string&gt;.' prefix to indicate the intended method call. </context>
+        <line>41</line>
+        <index>1337</index>
+        <endIndex>1340</endIndex>
+        <startLine>41</startLine>
+        <startColumn>7</startColumn>
+        <endLine>41</endLine>
+        <endColumn>10</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>46</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>46</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>47</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>47</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to Eval must begin with the 'this.', 'base.', 'object.' or 'ExecFlushExpression.' or 'FlushExpression&lt;Expression&gt;.' prefix to indicate the intended method call. </context>
+        <line>48</line>
+        <index>1570</index>
+        <endIndex>1573</endIndex>
+        <startLine>48</startLine>
+        <startColumn>7</startColumn>
+        <endLine>48</endLine>
+        <endColumn>10</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>53</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>53</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>54</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>54</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to Eval must begin with the 'this.', 'base.', 'object.' or 'CodeFlushExpression.' or 'FlushExpression&lt;Expression&gt;.' prefix to indicate the intended method call. </context>
+        <line>55</line>
+        <index>1803</index>
+        <endIndex>1806</endIndex>
+        <startLine>55</startLine>
+        <startColumn>7</startColumn>
+        <endLine>55</endLine>
+        <endColumn>10</endColumn>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="IntegerExpressions.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.389</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>13</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>14</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>23</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="FileMayOnlyContainASingleClass" ruleCheckId="SA1402">
+        <context>A C# document may only contain a single class at the root level unless all of the classes are partial and are of the same type.</context>
+        <line>23</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>24</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>24</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>34</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>34</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>44</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>45</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>45</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementDocumentationMustBeSpelledCorrectly" ruleCheckId="SA1650">
+        <context>The documentation text within the summary tag contains incorrectly spelled words: lispworks, htm</context>
+        <line>59</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>59</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>60</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>60</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>69</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>70</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>70</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>79</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>80</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>80</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>89</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>90</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>90</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>99</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>100</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>100</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>109</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>110</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>110</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>111</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>124</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>125</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>125</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>126</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="LoopExpression.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.03 17:05:02.412</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="OpeningCurlyBracketsMustNotBeFollowedByBlankLine" ruleCheckId="SA1505">
+        <context>An opening curly bracket must not be followed by a blank line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>6</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>6</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All constructors must be placed after all fields.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All constructors must be placed after all fields.</context>
+        <line>16</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All constructors must be placed after all fields.</context>
+        <line>17</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.OrderingRules" rule="ElementsMustAppearInTheCorrectOrder" ruleCheckId="SA1201">
+        <context>All constructors must be placed after all fields.</context>
+        <line>18</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>16</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>17</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The field must have a documentation header.</context>
+        <line>18</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>20</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>20</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>24</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="ArithmeticExpressionsMustDeclarePrecedence" ruleCheckId="SA1407">
+        <context>Insert parenthesis within the arithmetic expression to declare the operator precedence.</context>
+        <line>24</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="ArithmeticExpressionsMustDeclarePrecedence" ruleCheckId="SA1407">
+        <context>Insert parenthesis within the arithmetic expression to declare the operator precedence.</context>
+        <line>26</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="ArithmeticExpressionsMustDeclarePrecedence" ruleCheckId="SA1407">
+        <context>Insert parenthesis within the arithmetic expression to declare the operator precedence.</context>
+        <line>27</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="ArithmeticExpressionsMustDeclarePrecedence" ruleCheckId="SA1407">
+        <context>Insert parenthesis within the arithmetic expression to declare the operator precedence.</context>
+        <line>28</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>34</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>34</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="SingleLineCommentsMustNotBeFollowedByBlankLine" ruleCheckId="SA1512">
+        <context>A single-line comment must not be followed by a blank line. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>95</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.MaintainabilityRules" rule="FileMayOnlyContainASingleClass" ruleCheckId="SA1402">
+        <context>A C# document may only contain a single class at the root level unless all of the classes are partial and are of the same type.</context>
+        <line>34</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.SpacingRules" rule="SingleLineCommentsMustBeginWithSingleSpace" ruleCheckId="SA1005">
+        <context>The comment must start with a single space. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>75</line>
+        <index>2634</index>
+        <endIndex>2676</endIndex>
+        <startLine>75</startLine>
+        <startColumn>5</startColumn>
+        <endLine>75</endLine>
+        <endColumn>47</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.SpacingRules" rule="SingleLineCommentsMustBeginWithSingleSpace" ruleCheckId="SA1005">
+        <context>The comment must start with a single space. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>79</line>
+        <index>2735</index>
+        <endIndex>2789</endIndex>
+        <startLine>79</startLine>
+        <startColumn>5</startColumn>
+        <endLine>79</endLine>
+        <endColumn>59</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.SpacingRules" rule="SingleLineCommentsMustBeginWithSingleSpace" ruleCheckId="SA1005">
+        <context>The comment must start with a single space. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>82</line>
+        <index>2823</index>
+        <endIndex>2860</endIndex>
+        <startLine>82</startLine>
+        <startColumn>5</startColumn>
+        <endLine>82</endLine>
+        <endColumn>42</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.SpacingRules" rule="SingleLineCommentsMustBeginWithSingleSpace" ruleCheckId="SA1005">
+        <context>The comment must start with a single space. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>84</line>
+        <index>2869</index>
+        <endIndex>2930</endIndex>
+        <startLine>84</startLine>
+        <startColumn>5</startColumn>
+        <endLine>84</endLine>
+        <endColumn>66</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.SpacingRules" rule="SingleLineCommentsMustBeginWithSingleSpace" ruleCheckId="SA1005">
+        <context>The comment must start with a single space. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>89</line>
+        <index>3104</index>
+        <endIndex>3163</endIndex>
+        <startLine>89</startLine>
+        <startColumn>5</startColumn>
+        <endLine>89</endLine>
+        <endColumn>64</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.SpacingRules" rule="SingleLineCommentsMustBeginWithSingleSpace" ruleCheckId="SA1005">
+        <context>The comment must start with a single space. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>94</line>
+        <index>3352</index>
+        <endIndex>3374</endIndex>
+        <startLine>94</startLine>
+        <startColumn>5</startColumn>
+        <endLine>94</endLine>
+        <endColumn>27</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.SpacingRules" rule="SingleLineCommentsMustBeginWithSingleSpace" ruleCheckId="SA1005">
+        <context>The comment must start with a single space. To ignore this error when commenting out a line of code, begin the comment with '////' rather than '//'.</context>
+        <line>95</line>
+        <index>3381</index>
+        <endIndex>3383</endIndex>
+        <startLine>95</startLine>
+        <startColumn>5</startColumn>
+        <endLine>95</endLine>
+        <endColumn>7</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>35</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>35</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>36</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementsMustBeSeparatedByBlankLine" ruleCheckId="SA1516">
+        <context>Adjacent elements must be separated by a blank line.</context>
+        <line>36</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>36</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>38</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>38</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>40</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>41</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>51</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to Clone must begin with the 'this.', 'base.', 'object.' or 'LoopExpression.' or 'StatefullExpression&lt;LoopState&gt;.' prefix to indicate the intended method call. </context>
+        <line>44</line>
+        <index>1615</index>
+        <endIndex>1619</endIndex>
+        <startLine>44</startLine>
+        <startColumn>34</startColumn>
+        <endLine>44</endLine>
+        <endColumn>38</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>59</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>61</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>61</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.ReadabilityRules" rule="PrefixCallsCorrectly" ruleCheckId="SA1126">
+        <context>The call to Clone must begin with the 'this.', 'base.', 'object.' or 'LoopExpression.' or 'StatefullExpression&lt;LoopState&gt;.' prefix to indicate the intended method call. </context>
+        <line>65</line>
+        <index>2325</index>
+        <endIndex>2329</endIndex>
+        <startLine>65</startLine>
+        <startColumn>32</startColumn>
+        <endLine>65</endLine>
+        <endColumn>36</endColumn>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>70</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>70</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>97</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>99</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+  <sourcecode name="NameExpressions.cs" parser="StyleCop.CSharp.CsParser">
+    <timestamps>
+      <styleCop>2016.03.13 21:28:52.000</styleCop>
+      <settingsFile>2016.01.23 09:08:28.000</settingsFile>
+      <sourceFile>2017.03.04 21:22:32.556</sourceFile>
+      <parser>2016.03.13 21:28:52.000</parser>
+      <StyleCop.CSharp.DocumentationRules>2016.03.13 21:28:52.000</StyleCop.CSharp.DocumentationRules>
+      <StyleCop.CSharp.DocumentationRules.FilesHashCode>-200575793</StyleCop.CSharp.DocumentationRules.FilesHashCode>
+      <StyleCop.CSharp.LayoutRules>2016.03.13 21:28:52.000</StyleCop.CSharp.LayoutRules>
+      <StyleCop.CSharp.LayoutRules.FilesHashCode>0</StyleCop.CSharp.LayoutRules.FilesHashCode>
+      <StyleCop.CSharp.MaintainabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.MaintainabilityRules>
+      <StyleCop.CSharp.MaintainabilityRules.FilesHashCode>0</StyleCop.CSharp.MaintainabilityRules.FilesHashCode>
+      <StyleCop.CSharp.NamingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.NamingRules>
+      <StyleCop.CSharp.NamingRules.FilesHashCode>0</StyleCop.CSharp.NamingRules.FilesHashCode>
+      <StyleCop.CSharp.OrderingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.OrderingRules>
+      <StyleCop.CSharp.OrderingRules.FilesHashCode>0</StyleCop.CSharp.OrderingRules.FilesHashCode>
+      <StyleCop.CSharp.ReadabilityRules>2016.03.13 21:28:52.000</StyleCop.CSharp.ReadabilityRules>
+      <StyleCop.CSharp.ReadabilityRules.FilesHashCode>0</StyleCop.CSharp.ReadabilityRules.FilesHashCode>
+      <StyleCop.CSharp.SpacingRules>2016.03.13 21:28:52.000</StyleCop.CSharp.SpacingRules>
+      <StyleCop.CSharp.SpacingRules.FilesHashCode>0</StyleCop.CSharp.SpacingRules.FilesHashCode>
+    </timestamps>
+    <violations>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="FileMustHaveHeader" ruleCheckId="SA1633">
+        <context>The file has no header, the header Xml is invalid, or the header is not located at the top of the file.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>1</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The class must have a documentation header.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>7</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The constructor must have a documentation header.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The constructor must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>8</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>10</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>10</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>13</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the closing curly bracket must be placed on its own line.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>15</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The property must have a documentation header.</context>
+        <line>21</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="ElementMustNotBeOnSingleLine" ruleCheckId="SA1502">
+        <context>The property must not be placed on a single line. The opening and closing curly brackets must each be placed on their own line.</context>
+        <line>21</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>32</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>33</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>42</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.DocumentationRules" rule="ElementsMustBeDocumented" ruleCheckId="SA1600">
+        <context>The method must have a documentation header.</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsForMultiLineStatementsMustNotShareLine" ruleCheckId="SA1500">
+        <context>If a statement spans multiple lines, the opening curly bracket must be placed on its own line.</context>
+        <line>43</line>
+        <warning>False</warning>
+      </violation>
+      <violation namespace="StyleCop.CSharp.LayoutRules" rule="CurlyBracketsMustNotBeOmitted" ruleCheckId="SA1503">
+        <context>The body of the if statement must be wrapped in opening and closing curly brackets.</context>
+        <line>45</line>
+        <warning>False</warning>
+      </violation>
+    </violations>
+  </sourcecode>
+</stylecopresultscache>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/packages.config
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/packages.config	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/packages.config	(revision 15771)
@@ -0,0 +1,4 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Microsoft.IO.RecyclableMemoryStream" version="1.2.2" targetFramework="net45" />
+</packages>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Benchmark/GPTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Benchmark/GPTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Benchmark/GPTests.cs	(revision 15771)
@@ -0,0 +1,340 @@
+﻿using System.Linq;
+// ReSharper disable PossibleNullReferenceException
+
+namespace HeuristicLab.Tests.Benchmark {
+  using System;
+  using System.Threading;
+
+  using HeuristicLab.Algorithms.GeneticAlgorithm;
+  using HeuristicLab.BenchmarkSuite;
+  using HeuristicLab.BenchmarkSuite.Problems;
+  using HeuristicLab.Data;
+  using HeuristicLab.ParallelEngine;
+  using HeuristicLab.Problems.ProgramSynthesis;
+
+  using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+  [TestClass]
+  public class GpTests {
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void Checksum() {
+      Run<Checksum>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void CollatzNumbers() {
+      Run<CollatzNumbers>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void CompareStringLengths() {
+      Run<CompareStringLengths>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void CountOdds() {
+      Run<CountOdds>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void Digits() {
+      Run<Digits>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void DoubleLetters() {
+      Run<DoubleLetters>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void EvenSquares() {
+      Run<EvenSquares>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void ForLoopIndex() {
+      Run<ForLoopIndex>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void Grades() {
+      Run<Grades>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void LastIndexOfZero() {
+      Run<LastIndexOfZero>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void Median() {
+      Run<Median>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void MirrorImage() {
+      Run<MirrorImage>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void NegativeToZero() {
+      Run<NegativeToZero>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void NumberIo() {
+      Run<NumberIO>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void PigLatin() {
+      Run<PigLatin>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void ReplaceSpaceWithNewLine() {
+      Run<ReplaceSpaceWithNewline>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void ScrabbleScore() {
+      Run<ScrabbleScore>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void Smallest() {
+      Run<Smallest>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void SmallOrLarge() {
+      Run<SmallOrLarge>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void StringDifferences() {
+      Run<StringDifferences>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void StringLengthsBackwards() {
+      Run<StringLengthsBackwards>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void SumOfSquares() {
+      Run<SumOfSquares>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void SuperAnagrams() {
+      Run<SuperAnagrams>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void Syllables() {
+      Run<Syllables>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void VectorAverage() {
+      Run<VectorAverage>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void VectorSummed() {
+      Run<VectorSummed>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void WallisPi() {
+      Run<WallisPi>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void WordStats() {
+      Run<WordStats>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void XWordLines() {
+      Run<XWordLines>();
+    }
+
+    static void Run<T>() where T : IBenchmarkSuiteDataDescriptor, new() {
+      var trigger = new AutoResetEvent(false);
+      var alg = GetAlgorithm(new T());
+      Exception exception = null;
+
+      alg.ExceptionOccurred += (sender, args) => {
+        exception = args.Value;
+        trigger.Set();
+      };
+
+      alg.Stopped += (sender, args) => {
+        trigger.Set();
+      };
+
+      var lastGeneration = -1;
+      alg.ExecutionTimeChanged += (sender, args) => {
+        if (!alg.Results.Any() || !alg.Results.ContainsKey("CurrentBestQuality")) return;
+
+        var generation = (alg.Results["Generations"].Value as IntValue).Value;
+
+        if (lastGeneration != -1 && generation == lastGeneration) return;
+
+        Console.WriteLine(@"Generation: {0}", generation);
+
+        if (alg.Results.ContainsKey("CurrentBestQuality")) {
+          var best = (alg.Results["CurrentBestQuality"].Value as DoubleValue).Value;
+          Console.WriteLine(@"CurrentBestQuality: {0}", best);
+        }
+
+        if (alg.Results.ContainsKey("CurrentAverageQuality")) {
+          var average = (alg.Results["CurrentAverageQuality"].Value as DoubleValue).Value;
+          Console.WriteLine(@"CurrentAverageQuality: {0}", average);
+        }
+
+        if (alg.Results.ContainsKey("CurrentWorstQuality")) {
+          var worst = (alg.Results["CurrentWorstQuality"].Value as DoubleValue).Value;
+          Console.WriteLine(@"CurrentWorstQuality: {0}", worst);
+        }
+
+        Console.WriteLine();
+        lastGeneration = generation;
+      };
+
+      alg.Prepare();
+      alg.Start();
+      trigger.WaitOne();
+
+      if (exception != null) {
+        Console.WriteLine(exception.Message);
+        throw exception;
+      }
+
+      var finalGeneration = (alg.Results["Generations"].Value as IntValue).Value;
+      var bestQuality = (alg.Results["CurrentBestQuality"].Value as DoubleValue).Value;
+      var averageQuality = (alg.Results["CurrentAverageQuality"].Value as DoubleValue).Value;
+      var worstQuality = (alg.Results["CurrentWorstQuality"].Value as DoubleValue).Value;
+
+      Console.WriteLine(@"Final Generation: {0}", finalGeneration);
+      Console.WriteLine(@"CurrentBestQuality: {0}", bestQuality);
+      Console.WriteLine(@"CurrentAverageQuality: {0}", averageQuality);
+      Console.WriteLine(@"CurrentWorstQuality: {0}", worstQuality);
+    }
+
+    static GeneticAlgorithm GetAlgorithm(IBenchmarkSuiteDataDescriptor descriptor) {
+      var ga = new GeneticAlgorithm();
+
+      var problemData = descriptor.CreateProblemData();
+      var pushProblem = new PlushPushBenchmarkSuiteProblem();
+
+      pushProblem.Load(problemData);
+      ga.Name = "GA " + pushProblem.Name;
+
+      ga.Problem = pushProblem;
+
+      var crossover = ga.CrossoverParameter.ValidValues.OfType<AlternationCrossover>().First();
+
+      switch (problemData.ProblemType) {
+        case ProblemType.NumberIO:
+        case ProblemType.SmallOrLarge:
+        case ProblemType.Median:
+        case ProblemType.Smallest:
+          crossover.AlignmentDeviation = 5;
+          break;
+
+        default:
+          crossover.AlignmentDeviation = 10;
+          break;
+      }
+
+      crossover.AlternationRate = 0.01;
+      ga.Crossover = crossover;
+
+      ga.Selector = ga.SelectorParameter.ValidValues.OfType<LexicaseSelector>().First();
+
+      var mutator = ga.MutatorParameter.ValidValues.OfType<UniformMutation>().First();
+      mutator.InstructionMutationProbability = 0.875;
+      mutator.CloseMutationProbability = 0.125;
+      mutator.CloseIncrementRate = 0.1;
+      ga.Mutator = mutator;
+
+      ga.MutationProbability.Value = 0.8;
+      ga.SetSeedRandomly.Value = true;
+      ga.PopulationSize.Value = 1000;
+
+      ga.MaximumGenerations.Value = 9; // problemData.ProgramExecutionBudget / problemData.TrainingCount / 1000;
+
+      // remove unnecessary analyzers to improve performance
+      pushProblem.OperatorsParameter.Value
+        .RemoveAll(analyzer =>
+          analyzer.GetType() == typeof(IndividualZeroErrorAnalyzer) ||
+          analyzer.GetType() == typeof(PushExpressionFrequencyAnalyzer));
+
+      ga.Engine = new ParallelEngine();
+
+      return ga;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Benchmark/RandomWalkTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Benchmark/RandomWalkTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Benchmark/RandomWalkTests.cs	(revision 15771)
@@ -0,0 +1,250 @@
+﻿namespace HeuristicLab.Tests.Benchmark {
+  using System;
+  using System.Linq;
+  using BenchmarkSuite;
+
+  using HeuristicLab.BenchmarkSuite.Problems;
+  using HeuristicLab.Problems.ProgramSynthesis;
+
+  using Microsoft.VisualStudio.TestTools.UnitTesting;
+  using Random;
+
+  [TestClass]
+  public class RandomWalkTests {
+    private static void RandomWalk(BenchmarkSuiteDataDescriptor descriptor) {
+      var instance = new BenchmarkSuiteInstanceProvider();
+      var data = instance.LoadData(descriptor);
+      var evaluator = new PushBenchmarkSuiteEvaluator(data);
+
+      var config = new PushConfiguration {
+        EvalPushLimit = data.EvalLimit,
+        MaxProgramLength = data.MaxSize,
+        ErcOptions = data.ErcOptions,
+      };
+
+      config.SetEnabledStacks((StackTypes)data.EnabledDataTypes);
+
+      var pool = new PushInterpreterPool(config);
+      var best = Enumerable
+        .Range(0, 10)
+        .AsParallel()
+        .Select(_ => {
+          var random = new MersenneTwister(1337);
+          var program = LinearCodeGenerator.RandomProgram(data.MaxSize, random, config);
+          var result = evaluator.EvaluateTraining(pool, program, random);
+
+          return new {
+            Quality = result.AvgQuality,
+            Program = program
+          };
+        })
+        .OrderBy(x => x.Quality)
+        .First();
+
+      Console.WriteLine("Training: {0}", best.Quality);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void Checksum() {
+      RandomWalk(new Checksum());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void CollatzNumbers() {
+      RandomWalk(new CollatzNumbers());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void CompareStringLengths() {
+      RandomWalk(new CompareStringLengths());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void CountOdds() {
+      RandomWalk(new CountOdds());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void Digits() {
+      RandomWalk(new Digits());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void DoubleLetters() {
+      RandomWalk(new DoubleLetters());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void EvenSquares() {
+      RandomWalk(new EvenSquares());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void ForLoopIndex() {
+      RandomWalk(new ForLoopIndex());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void Grades() {
+      RandomWalk(new Grades());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void LastIndexOfZero() {
+      RandomWalk(new LastIndexOfZero());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void Median() {
+      RandomWalk(new Median());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void MirrorImage() {
+      RandomWalk(new MirrorImage());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void NegativeToZero() {
+      RandomWalk(new NegativeToZero());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void NumberIo() {
+      RandomWalk(new NumberIO());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void PigLatin() {
+      RandomWalk(new PigLatin());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void ReplaceSpaceWithNewLine() {
+      RandomWalk(new ReplaceSpaceWithNewline());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void ScrabbleScore() {
+      RandomWalk(new ScrabbleScore());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void Smallest() {
+      RandomWalk(new Smallest());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void SmallOrLarge() {
+      RandomWalk(new SmallOrLarge());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void StringDifferences() {
+      RandomWalk(new StringDifferences());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void StringLengthsBackwards() {
+      RandomWalk(new StringLengthsBackwards());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void SumOfSquares() {
+      RandomWalk(new SumOfSquares());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void SuperAnagrams() {
+      RandomWalk(new SuperAnagrams());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void Syllables() {
+      RandomWalk(new Syllables());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void VectorAverage() {
+      RandomWalk(new VectorAverage());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void VectorSummed() {
+      RandomWalk(new VectorSummed());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void WallisPi() {
+      RandomWalk(new WallisPi());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void WordStats() {
+      RandomWalk(new WordStats());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Medium")]
+    [TestCategory("ProblemTest")]
+    public void XWordLines() {
+      RandomWalk(new XWordLines());
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Benchmark/SolutionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Benchmark/SolutionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Benchmark/SolutionTests.cs	(revision 15771)
@@ -0,0 +1,616 @@
+﻿namespace HeuristicLab.Tests.Benchmark {
+
+  using HeuristicLab.BenchmarkSuite;
+  using HeuristicLab.BenchmarkSuite.Problems;
+  using HeuristicLab.Random;
+  using HeuristicLab.Problems.ProgramSynthesis;
+
+  using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+  [TestClass]
+  public class SolutionTests {
+    private void TestProgram(PushProgram program, IBenchmarkSuiteDataDescriptor descriptor) {
+      var data = descriptor.CreateProblemData();
+      var config = new PushConfiguration {
+        EvalPushLimit = data.EvalLimit,
+        MaxProgramLength = data.MaxSize,
+        ErcOptions = data.ErcOptions,
+        FloatStringFormat = data.FloatStringFormat
+      };
+
+      config.SetEnabledStacks((StackTypes)data.EnabledDataTypes);
+      config.InitInExpressions(data.TotalInputArgumentCount);
+
+      var evaluator = new PushBenchmarkSuiteEvaluator(data);
+      var pool = new PushInterpreterPool(config);
+
+      var trainingResult = evaluator.EvaluateTraining(pool, program, new MersenneTwister());
+      var testResult = evaluator.EvaluateTest(pool, program, new MersenneTwister());
+
+      Assert.AreEqual(0, trainingResult.AvgQuality);
+      Assert.AreEqual(0, testResult.AvgQuality);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void Checksum() {
+      TestProgram(
+        PushParser.ParseProgram(
+          @"(
+              0 STRING.ITERATE (
+                INTEGER.FROMCHAR INTEGER.+
+              )
+              64 INTEGER.% ' ' INTEGER.FROMCHAR INTEGER.+
+              ""Check sum is "" PRINT.PRINTSTRING
+              CHAR.FROMINTEGER PRINT.PRINTCHAR
+            )"),
+        new Checksum());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void CollatzNumbers() {
+      TestProgram(
+        PushParser.ParseProgram(
+          @"(
+              INTEGER.DUP 1 INTEGER.= BOOLEAN.NOT
+              EXEC.WHILE (
+                INTEGER.DUP INTEGER.DUP 2 INTEGER.% 0 INTEGER.=
+                EXEC.IF (
+                  2 INTEGER./
+                ) (
+                  3 INTEGER.* 1 INTEGER.+
+                )
+                INTEGER.DUP 1 INTEGER.= BOOLEAN.NOT
+              )
+              INTEGER.POP INTEGER.STACKDEPTH
+            )"),
+        new CollatzNumbers());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void CompareStringLengths() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+          (
+            STRING.LENGTH STRING.LENGTH INTEGER.DUP
+            STRING.LENGTH INTEGER.> INTEGER.> BOOLEAN.AND
+          )"),
+        new CompareStringLengths());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void CountOdds() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+          (
+            0 INTEGER[].ITERATE (
+              2 INTEGER.% INTEGER.DUP
+              1 INTEGER.=
+              -1 INTEGER.=
+              BOOLEAN.OR
+              EXEC.WHEN INTEGER.INC
+            )
+          )"),
+        new CountOdds());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void Digits() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          INTEGER.DUP STRING.FROMINTEGER
+          INTEGER.DUP 0 INTEGER.< BOOLEAN.DUP
+          BOOLEAN.DUP INTEGER.DUP -10 INTEGER.> BOOLEAN.AND
+          EXEC.WHEN (
+            PRINT.PRINTSTRING
+            EXEC.FLUSH
+          )
+          EXEC.WHEN (
+            STRING.REST STRING.DUP STRING.FIRST STRING.SWAP STRING.REST
+          )
+          STRING.REVERSE
+          STRING.DUP STRING.FIRST PRINT.PRINTSTRING
+          STRING.REST STRING.ITERATE (
+            PRINT.NEWLINE PRINT.PRINTCHAR
+          )
+          EXEC.WHEN (
+            PRINT.NEWLINE
+            '-' PRINT.PRINTCHAR PRINT.PRINTSTRING
+          )
+        )"),
+        new Digits());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void DoubleLetters() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          STRING.ITERATE (
+            3 EXEC.DO*COUNT CHAR.DUP
+            CHAR.ISLETTER EXEC.WHEN PRINT.PRINTCHAR
+            '!' CHAR.= EXEC.WHEN (
+              CHAR.DUP PRINT.PRINTCHAR PRINT.PRINTCHAR
+            )
+            PRINT.PRINTCHAR
+          )
+        )"),
+        new DoubleLetters());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void EvenSquares() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          INTEGER.DUP EXEC.DO*COUNT (
+            INTEGER.DUP 0 INTEGER.>
+            EXEC.WHEN (
+              INTEGER.DUP 2 INTEGER.*
+              INTEGER.DUP INTEGER.DUP INTEGER.*
+              INTEGER.DUP 4 INTEGER.YANKDUP INTEGER.<
+              EXEC.IF (
+                PRINT.ENSURE_NEWLINE
+                PRINT.PRINTINTEGER
+              )
+              EXEC.FLUSH
+              INTEGER.POP
+            )
+            INTEGER.POP
+          )
+        )"),
+        new EvenSquares());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void ForLoopIndex() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          STRING.FROMINTEGER INTEGER.SWAP true
+          EXEC.WHILE (
+            INTEGER.DUP PRINT.ENSURE_NEWLINE PRINT.PRINTINTEGER
+            STRING.DUP INTEGER.FROMSTRING INTEGER.+
+            INTEGER.DUP 2 INTEGER.YANKDUP INTEGER.<
+          )
+        )"),
+        new ForLoopIndex());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void Grades() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          ""Student has a "" PRINT.PRINTSTRING
+          INTEGER.DUP INTEGER.ROT INTEGER.>
+          EXEC.WHEN ( ""F"" "" grade."" STRING.CONCAT PRINT.PRINTSTRING EXEC.FLUSH )
+          INTEGER.DUP INTEGER.ROT INTEGER.>
+          EXEC.WHEN ( ""D"" "" grade."" STRING.CONCAT PRINT.PRINTSTRING EXEC.FLUSH )
+          INTEGER.DUP INTEGER.ROT INTEGER.>
+          EXEC.WHEN ( ""C"" "" grade."" STRING.CONCAT PRINT.PRINTSTRING EXEC.FLUSH )
+          INTEGER.DUP INTEGER.ROT INTEGER.>
+          EXEC.WHEN ( ""B"" "" grade."" STRING.CONCAT PRINT.PRINTSTRING EXEC.FLUSH )
+          ""A"" "" grade."" STRING.CONCAT PRINT.PRINTSTRING
+        )"),
+        new Grades());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void LastIndexOfZero() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          INTEGER[].DUP INTEGER[].LENGTH INTEGER[].REVERSE
+          0 INTEGER[].INDEXOF INTEGER.- INTEGER.DEC
+        )"),
+        new LastIndexOfZero());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void Median() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          INTEGER.ROT IN1 IN2 INTEGER.MAX
+          IN3 INTEGER.MIN
+          INTEGER.ROT INTEGER.MIN INTEGER.MAX
+          PRINT.PRINTINTEGER
+        )"),
+        new Median());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void MirrorImage() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          INTEGER[].PUSHALL INTEGER[].ITERATE (
+            INTEGER.= BOOLEAN.NOT EXEC.WHEN (
+              false EXEC.FLUSH
+            )
+          )
+          true
+        )"),
+        new MirrorImage());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void NegativeToZero() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          INTEGER[].DUP INTEGER[].LENGTH INTEGER.DEC
+          EXEC.DO*COUNT (
+            INTEGER.DUP INTEGER[].DUP INTEGER[].NTH 0 INTEGER.<
+            EXEC.WHEN (
+              0 INTEGER[].SET
+            )
+          )
+        )"),
+        new NegativeToZero());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void NumberIo() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          FLOAT.FROMINTEGER FLOAT.+ PRINT.PRINTFLOAT
+        )"),
+        new NumberIO());
+    }
+
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void PigLatin() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          STRING.SPLIT STRING.STACKDEPTH 0 INTEGER.=
+          EXEC.WHEN EXEC.FLUSH
+          STRING.STACKDEPTH EXEC.DO*TIMES (
+            STRING.DUP STRING.FIRST CHAR.ALLFROMSTRING CHAR.DUP ""aeiou""
+            STRING.CONTAINSCHAR EXEC.IF (
+              CHAR.POP
+            ) (
+              STRING.REST STRING.CONJCHAR
+            )
+            ""ay"" STRING.CONCAT
+            STRING.STACKDEPTH 1 INTEGER.>
+            EXEC.WHEN (
+              ' ' STRING.CONJCHAR
+            )
+            PRINT.PRINTSTRING
+          )
+        )"),
+        new PigLatin());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void ReplaceSpaceWithNewLine() {
+
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          STRING.DUP 0 STRING.ITERATE (
+              CHAR.DUP ' ' CHAR.=
+              EXEC.IF (
+                CHAR.POP '\n'
+              )
+            INTEGER.INC PRINT.PRINTCHAR
+          )
+        )"),
+        new ReplaceSpaceWithNewline());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void ScrabbleScore() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          STRING.ITERATE (
+            INTEGER.FROMCHAR INTEGER.DUP INTEGER.DUP
+            96 INTEGER.>
+            123 INTEGER.<
+            BOOLEAN.AND EXEC.WHEN (
+              32 INTEGER.-
+            )
+            65 INTEGER.- INTEGER.DUP INTEGER.DUP
+            0 INTEGER.>=
+            26 INTEGER.<
+            BOOLEAN.AND EXEC.IF (
+              [1 3 3 2 1 4 2 4 1 8 5 1 3 1 1 3 10 1 1 1 1 4 4 8 4 10]
+              INTEGER[].NTH INTEGER.+
+            ) (
+              INTEGER.POP
+            )
+          )
+          INTEGER.EMPTY EXEC.WHEN 0
+        )"),
+        new ScrabbleScore());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void Smallest() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          3 EXEC.DO*TIMES INTEGER.MIN
+          PRINT.PRINTINTEGER
+        )"),
+        new Smallest());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void SmallOrLarge() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          INTEGER.DUP 1000 INTEGER.< 2000 INTEGER.>=
+          EXEC.WHEN ""large""
+          EXEC.WHEN ""small""
+          STRING.EMPTY
+          EXEC.WHEN """"
+          PRINT.PRINTSTRING
+        )"),
+        new SmallOrLarge());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void StringDifferences() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          CHAR.ALLFROMSTRING 0
+          STRING.ITERATE (
+            CHAR.DUP 2 CHAR.YANKDUP CHAR.= BOOLEAN.NOT EXEC.IF (
+              INTEGER.DUP PRINT.ENSURE_NEWLINE PRINT.PRINTINTEGER
+              ' ' PRINT.PRINTCHAR PRINT.PRINTCHAR
+              ' ' PRINT.PRINTCHAR PRINT.PRINTCHAR
+            ) (
+              CHAR.POP CHAR.POP
+            )
+            INTEGER.INC
+          )
+        )"),
+        new StringDifferences());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void StringLengthsBackwards() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          STRING[].ITERATE (
+            STRING.LENGTH PRINT.ENSURE_NEWLINE PRINT.PRINTINTEGER
+          )
+        )"),
+        new StringLengthsBackwards());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void SumOfSquares() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          EXEC.DO*COUNT (
+            INTEGER.DUP INTEGER.* INTEGER.+
+          )
+        )"),
+        new SumOfSquares());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void SuperAnagrams() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          STRING.SWAP STRING.DUP STRING.ITERATE (
+            CHAR.DUP STRING.DUP STRING.OCCURRENCESOFCHAR
+            1 STRING.YANKDUP STRING.OCCURRENCESOFCHAR
+            INTEGER.> EXEC.WHEN (
+              false EXEC.FLUSH
+            )
+          )
+          true
+        )"),
+        new SuperAnagrams());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void Syllables() {
+      TestProgram(
+       PushParser.ParseProgram(@"
+       (
+          ""aeiouy"" 0 STRING.ITERATE (
+            STRING.DUP STRING.OCCURRENCESOFCHAR INTEGER.+
+          )
+          ""The number of syllables is ""
+          PRINT.PRINTSTRING PRINT.PRINTINTEGER
+       )"),
+       new Syllables());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void VectorAverage() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          FLOAT[].DUP FLOAT[].LENGTH
+          FLOAT[].ITERATE FLOAT.+
+          FLOAT.FROMINTEGER FLOAT./
+        )"),
+        new VectorAverage());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void VectorSummed() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          INTEGER[].PUSHALL INTEGER[].DUP
+          INTEGER[].LENGTH INTEGER.DEC
+          EXEC.DO*COUNT (
+            INTEGER.DUP INTEGER[].DUP INTEGER[].NTH
+            INTEGER.SWAP INTEGER.ROT INTEGER.+ INTEGER[].SET
+          )
+        )"),
+        new VectorSummed());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void WallisPi() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          2 3 INTEGER.ROT INTEGER.ROT
+          EXEC.DO*TIMES (
+            2 EXEC.DO*TIMES (
+              1 INTEGER.YANKDUP 1 INTEGER.YANKDUP
+            )
+            FLOAT.FROMINTEGER FLOAT.FROMINTEGER FLOAT.SWAP FLOAT./ FLOAT.* INTEGER.<
+            EXEC.IF (
+              INTEGER.SWAP 2 INTEGER.+ INTEGER.SWAP
+            ) (
+              2 INTEGER.+
+            )
+          )
+        )"),
+        new WallisPi());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void WordStats() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          STRING.DUP STRING.SPLIT
+          STRING.STACKDEPTH 1 INTEGER.= BOOLEAN.NOT
+          EXEC.WHEN (
+            true EXEC.WHILE (
+              STRING.LENGTH INTEGER.MAX STRING.STACKDEPTH 1 INTEGER.= BOOLEAN.NOT
+            )
+            [0] 2 INTEGER.- INTEGER.DUP 0 INTEGER.>=
+            EXEC.WHEN (
+              INTEGER.INC EXEC.DO*TIMES (
+                0 INTEGER[].CONJ
+              )
+            )
+            STRING.DUP STRING.SPLIT STRING.STACKDEPTH 1 INTEGER.>
+            EXEC.WHILE (
+              STRING.LENGTH INTEGER.DEC INTEGER.DUP INTEGER[].DUP
+              INTEGER[].NTH INTEGER.INC INTEGER[].SET STRING.STACKDEPTH 1 INTEGER.>
+            )
+            INTEGER[].DUP INTEGER[].LENGTH INTEGER.DEC
+            EXEC.DO*COUNT (
+              PRINT.ENSURE_NEWLINE
+              ""words of length "" PRINT.PRINTSTRING
+              INTEGER.DUP INTEGER.INC PRINT.PRINTINTEGER
+              "": "" PRINT.PRINTSTRING
+              INTEGER[].DUP INTEGER[].NTH PRINT.PRINTINTEGER
+            )
+            '.' STRING.DUP STRING.OCCURRENCESOFCHAR
+            '!' STRING.DUP STRING.OCCURRENCESOFCHAR INTEGER.+
+            '?' STRING.DUP STRING.OCCURRENCESOFCHAR INTEGER.+
+            INTEGER.DUP PRINT.ENSURE_NEWLINE
+            ""number of sentences: "" PRINT.PRINTSTRING PRINT.PRINTINTEGER
+            STRING.SPLIT STRING.STACKDEPTH FLOAT.FROMINTEGER FLOAT.FROMINTEGER FLOAT./
+            PRINT.ENSURE_NEWLINE
+            ""average sentence length: "" PRINT.PRINTSTRING PRINT.PRINTFLOAT
+          )
+        )"),
+        new WordStats());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ProblemTest")]
+    public void XWordLines() {
+      TestProgram(
+        PushParser.ParseProgram(@"
+        (
+          STRING.SPLIT STRING.EMPTY BOOLEAN.NOT INTEGER.DUP 1 INTEGER.=
+          EXEC.IF (
+            EXEC.WHILE (
+              PRINT.ENSURE_NEWLINE PRINT.PRINTSTRING
+              STRING.EMPTY BOOLEAN.NOT
+            )
+          ) (
+            2 INTEGER.- EXEC.WHILE (
+              STRING.STACKDEPTH 2 INTEGER.-
+              1 INTEGER.YANKDUP INTEGER.MIN
+              INTEGER.DUP 0 INTEGER.>=
+              EXEC.IF (
+                INTEGER.INC EXEC.DO*TIMES (
+                  ' ' STRING.CONJCHAR STRING.SWAP STRING.CONCAT
+                )
+                PRINT.ENSURE_NEWLINE PRINT.PRINTSTRING
+                STRING.EMPTY BOOLEAN.NOT
+              ) (
+                PRINT.ENSURE_NEWLINE PRINT.PRINTSTRING
+                STRING.EMPTY BOOLEAN.NOT
+              )
+            )
+          )
+        )"),
+        new XWordLines());
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Components/LexicaseTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Components/LexicaseTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Components/LexicaseTests.cs	(revision 15771)
@@ -0,0 +1,14 @@
+﻿namespace HeuristicLab.Tests.Components {
+
+  using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+  public class LexicaseTests {
+    [TestMethod]
+    [TestCategory("Problem")]
+    [TestProperty("Time", "short")]
+    public void TestLexicase() {
+      // how to test this?
+      //var selected = LexicaseSelector.Apply()
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Components/PrintStackTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Components/PrintStackTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Components/PrintStackTests.cs	(revision 15771)
@@ -0,0 +1,64 @@
+﻿using System.Linq;
+using HeuristicLab.Problems.ProgramSynthesis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Components {
+  [TestClass]
+  public class PrintStackTests {
+
+    private PrintStack printStack;
+
+    [TestInitialize]
+    public void BeforeTest() {
+      printStack = new PrintStack();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ComponentTest")]
+    public void TestPushLong() {
+      printStack.Push(100L);
+
+      Assert.AreEqual(100L.ToString(), printStack.ToString());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ComponentTest")]
+    public void TestPushDouble() {
+      printStack.Push(100.5D);
+
+      Assert.AreEqual(100.5D.ToString(), printStack.ToString());
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ComponentTest")]
+    public void TestAsStringsWithNewline() {
+      printStack.Push(100.5D);
+      printStack.Push(10);
+      printStack.NewLine();
+      printStack.Push("abc");
+      printStack.Push('d');
+
+      var lines = printStack.AsStrings().ToList();
+
+      Assert.AreEqual(2, lines.Count);
+      Assert.AreEqual("100,510", lines[0]);
+      Assert.AreEqual("abcd", lines[1]);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ComponentTest")]
+    public void TestAsStringsWithoutNewline() {
+      printStack.Push(100.5D);
+      printStack.Push(10);
+
+      var lines = printStack.AsStrings().ToList();
+
+      Assert.AreEqual(1, lines.Count);
+      Assert.AreEqual("100,510", lines[0]);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Erc/ErcTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Erc/ErcTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Erc/ErcTests.cs	(revision 15771)
@@ -0,0 +1,212 @@
+﻿using System.Linq;
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Random;
+using HeuristicLab.Problems.ProgramSynthesis;
+
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Erc {
+  [TestClass]
+  public class ErcTests {
+    private const double tolerance = 0.15;
+    private IRandom random;
+
+    [TestInitialize]
+    public void BeforeTest() {
+      random = new MersenneTwister(1337);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ErcTests")]
+    public void MixedIntegerErcValueTests() {
+      var options = new IntegerErcOptions(
+                        new IntegerConstantErc(true, 0.8, 11, 12, 13),
+                        new IntegerRangeErc(true, -10, 10, 0.2));
+
+      Assert.IsTrue(options.IsEnabled);
+
+      var distribution = Enumerable.Range(0, 1000)
+        .Select(_ => options.GetErcValue(random))
+        .GroupBy(x => x <= 10 ? "range" : "constants")
+        .ToDictionary(group => group.Key, group => group.Count());
+
+      var estimatedRatio = 0.8 / 0.2;
+      var ratio = distribution["constants"] / (double)distribution["range"];
+
+      Assert.IsTrue(IsAlmost(estimatedRatio, ratio, tolerance));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ErcTests")]
+    public void MixedFloatErcValueTests() {
+      var options = new FloatErcOptions(
+                        new FloatConstantErc(true, 0.8, 11.1, 12.1, 13.1),
+                        new FloatRangeErc(true, -10.5, 10.5, 0.2));
+
+      Assert.IsTrue(options.IsEnabled);
+
+      var distribution = Enumerable.Range(0, 1000)
+        .Select(_ => options.GetErcValue(random))
+        .GroupBy(x => x <= 10.5 ? "range" : "constants")
+        .ToDictionary(group => group.Key, group => group.Count());
+
+      var estimatedRatio = 0.8 / 0.2;
+      var ratio = distribution["constants"] / (double)distribution["range"];
+
+      Assert.IsTrue(IsAlmost(estimatedRatio, ratio, tolerance));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ErcTests")]
+    public void MixedCharErcValueTests() {
+      var options = new CharErcOptions(
+                        new IntegerConstantErc(true, 0.8, 11, 12, 13),
+                        new IntegerRangeErc(true, 65, 98, 0.2));
+
+      Assert.IsTrue(options.IsEnabled);
+
+      var distribution = Enumerable.Range(0, 1000)
+        .Select(_ => options.GetErcValue(random))
+        .GroupBy(x => x >= 65 ? "range" : "constants")
+        .ToDictionary(group => group.Key, group => group.Count());
+
+      var estimatedRatio = 0.8 / 0.2;
+      var ratio = distribution["constants"] / (double)distribution["range"];
+
+      Assert.IsTrue(IsAlmost(estimatedRatio, ratio, tolerance));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ErcTests")]
+    public void MixedStringErcValueTests() {
+      var options = new StringErcOptions(
+        new StringConstantErc(true, 0.8, "_1", "_2", "_3"),
+        new StringRandomErc(true, 0.2));
+
+      Assert.IsTrue(options.IsEnabled);
+
+      var distribution = Enumerable.Range(0, 1000)
+        .Select(_ => options.GetErcValue(random))
+        .GroupBy(x => x.StartsWith("_") ? "constants" : "random")
+        .ToDictionary(group => group.Key, group => group.Count());
+
+      var estimatedRatio = 0.8 / 0.2;
+      var ratio = distribution["constants"] / (double)distribution["random"];
+
+      Assert.IsTrue(IsAlmost(estimatedRatio, ratio, tolerance));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ErcTests")]
+    public void StringStringErcValueTests() {
+      var options = new StringErcOptions(
+        new StringConstantErc(true, 1.0, "_1", "_2", "_3"));
+
+      Assert.IsTrue(options.IsEnabled);
+
+      var distribution = Enumerable.Range(0, 1000)
+        .Select(_ => options.GetErcValue(random))
+        .GroupBy(x => x)
+        .ToDictionary(group => group.Key, group => group.Count());
+
+      var estimatedRatio = 1.0 / 3.0;
+
+      Assert.IsTrue(IsAlmost(estimatedRatio, distribution["_1"] / 1000.0, tolerance));
+      Assert.IsTrue(IsAlmost(estimatedRatio, distribution["_2"] / 1000.0, tolerance));
+      Assert.IsTrue(IsAlmost(estimatedRatio, distribution["_3"] / 1000.0, tolerance));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ErcTests")]
+    public void MixedIntegerVectorErcValueTests() {
+      var options = new IntegerVectorErcOptions(
+        new IntegerVectorConstantsErc(true, 0.8, new[] { 1, 2, 3 }, new[] { 4, 5, 6 }),
+        new IntegerVectorConstantsErc(true, 0.2, new[] { 10, 11, 12 }, new[] { 13, 14, 15 }));
+
+      Assert.IsTrue(options.IsEnabled);
+
+      var distribution = Enumerable.Range(0, 1000)
+        .Select(_ => options.GetErcValue(random))
+        .GroupBy(x => x.All(_ => _ < 10) ? "constants1" : "constants2")
+        .ToDictionary(group => group.Key, group => group.Count());
+
+      var estimatedRatio = 0.8 / 0.2;
+      var ratio = distribution["constants1"] / (double)distribution["constants2"];
+
+      Assert.IsTrue(IsAlmost(estimatedRatio, ratio, tolerance));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ErcTests")]
+    public void DisabledIntegerVectorErcValueTests() {
+      var options = new IntegerVectorErcOptions(
+        new IntegerVectorConstantsErc(false, 0.8, new[] { 1, 2, 3 }, new[] { 4, 5, 6 }),
+        new IntegerVectorConstantsErc(true, 0.2, new[] { 10, 11, 12 }, new[] { 13, 14, 15 }));
+
+      Assert.IsTrue(options.IsEnabled);
+
+      var distribution = Enumerable.Range(0, 1000)
+        .Select(_ => options.GetErcValue(random))
+        .GroupBy(x => x.All(_ => _ < 10) ? "constants1" : "constants2")
+        .ToDictionary(group => group.Key, group => group.Count());
+
+      Assert.IsFalse(distribution.ContainsKey("constants1"));
+      Assert.AreEqual(1000, distribution["constants2"]);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ErcTests")]
+    public void MixedFloatVectorErcValueTests() {
+      var options = new FloatVectorErcOptions(
+        new FloatVectorConstantsErc(true, 0.8, new[] { 1.0, 2.2, 3.1 }, new[] { 4.1, 5.2, 6.3 }),
+        new FloatVectorConstantsErc(true, 0.2, new[] { 10.1, 11.1, 12.2 }, new[] { 13.1, 14.2, 15.3 }));
+
+      Assert.IsTrue(options.IsEnabled);
+
+      var distribution = Enumerable.Range(0, 1000)
+        .Select(_ => options.GetErcValue(random))
+        .GroupBy(x => x.All(_ => _ < 10) ? "constants1" : "constants2")
+        .ToDictionary(group => group.Key, group => group.Count());
+
+      var estimatedRatio = 0.8 / 0.2;
+      var ratio = distribution["constants1"] / (double)distribution["constants2"];
+
+      Assert.IsTrue(IsAlmost(estimatedRatio, ratio, tolerance));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ErcTests")]
+    public void MixedStringVectorErcValueTests() {
+      var options = new StringVectorErcOptions(
+        new StringVectorConstantsErc(true, 0.8, new StringArray(new[] { "_1", "_2", "_3" }), new StringArray(new[] { "_4", "_5", "_5" })),
+        new StringVectorConstantsErc(true, 0.2, new StringArray(new[] { "-1", "-2", "-3" }), new StringArray(new[] { "-4", "-5", "-5" })));
+
+      Assert.IsTrue(options.IsEnabled);
+
+      var distribution = Enumerable.Range(0, 1000)
+        .Select(_ => options.GetErcValue(random))
+        .GroupBy(x => x.Any(_ => _.StartsWith("_")) ? "constants1" : "constants2")
+        .ToDictionary(group => group.Key, group => group.Count());
+
+      var estimatedRatio = 0.8 / 0.2;
+      var ratio = distribution["constants1"] / (double)distribution["constants2"];
+
+      Assert.IsTrue(IsAlmost(estimatedRatio, ratio, tolerance));
+    }
+
+    private static bool IsAlmost(double x, double y, double tolerance) {
+      return y < x * (1 + tolerance) && y > x * (1 - tolerance);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/HeuristicLab.Tests.csproj
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 15771)
@@ -0,0 +1,184 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{117B7D68-ED7D-4350-996B-9CA15259E107}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Tests</RootNamespace>
+    <AssemblyName>F</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
+    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
+    <IsCodedUITest>False</IsCodedUITest>
+    <TestProjectType>UnitTest</TestProjectType>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <LangVersion>5</LangVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <LangVersion>5</LangVersion>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="dotMemory.Unit, Version=103.0.0.0, Culture=neutral, PublicKeyToken=1010a0d8d6380325, processorArchitecture=MSIL">
+      <HintPath>..\packages\JetBrains.dotMemoryUnit.2.3.20160517.113140\lib\dotMemory.Unit.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.GeneticAlgorithm-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.ParallelEngine-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.ParallelEngine-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Selection-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Selection-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.SequentialEngine-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.SequentialEngine-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.IO.Compression" />
+  </ItemGroup>
+  <Choose>
+    <When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
+      <ItemGroup>
+        <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
+      </ItemGroup>
+    </When>
+    <Otherwise>
+      <ItemGroup>
+        <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework" />
+      </ItemGroup>
+    </Otherwise>
+  </Choose>
+  <ItemGroup>
+    <Compile Include="Benchmark\GPTests.cs" />
+    <Compile Include="Benchmark\RandomWalkTests.cs" />
+    <Compile Include="Benchmark\SolutionTests.cs" />
+    <Compile Include="Components\LexicaseTests.cs" />
+    <Compile Include="Components\PrintStackTests.cs" />
+    <Compile Include="Erc\ErcTests.cs" />
+    <Compile Include="Interpreter\Expressions\BooleanVectorExpressionsTests.cs" />
+    <Compile Include="Interpreter\Expressions\CharExpressionTests.cs" />
+    <Compile Include="Interpreter\Expressions\CommonTests.cs" />
+    <Compile Include="Interpreter\Expressions\ExampleTests.cs" />
+    <Compile Include="Interpreter\Expressions\FloatVectorExpressionTests.cs" />
+    <Compile Include="Interpreter\Expressions\IntegerVectorExpressionTests.cs" />
+    <Compile Include="Interpreter\Expressions\NameExpressionTests.cs" />
+    <Compile Include="Interpreter\Expressions\FloatExpressionTests.cs" />
+    <Compile Include="Interpreter\Expressions\BooleanExpressionTests.cs" />
+    <Compile Include="Interpreter\Expressions\ExecExpressionTests.cs" />
+    <Compile Include="Interpreter\Expressions\CodeExpressionTests.cs" />
+    <Compile Include="Interpreter\Expressions\IntegerExpressionTests.cs" />
+    <Compile Include="Interpreter\Expressions\PrintExpressionTests.cs" />
+    <Compile Include="Interpreter\Expressions\PushProgramTests.cs" />
+    <Compile Include="Interpreter\Expressions\StandardTests.cs" />
+    <Compile Include="Interpreter\Expressions\StringExpressionTests.cs" />
+    <Compile Include="Interpreter\Expressions\StringVectorExpressionTests.cs" />
+    <Compile Include="Interpreter\Expressions\VectorExpressionTests.cs" />
+    <Compile Include="Interpreter\ExpressionTest.cs" />
+    <Compile Include="Problem\DeterministicTests.cs" />
+    <Compile Include="Problem\IndividualMapperTests.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Simplifier\SimplifierTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Problems.ProgramSynthesis\HeuristicLab.Problems.ProgramSynthesis.csproj">
+      <Project>{5C93448C-47E3-4C3F-B1D0-EE62A48C3204}</Project>
+      <Name>HeuristicLab.Problems.ProgramSynthesis</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Choose>
+    <When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
+      <ItemGroup>
+        <Reference Include="Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <Private>False</Private>
+        </Reference>
+        <Reference Include="Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <Private>False</Private>
+        </Reference>
+        <Reference Include="Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <Private>False</Private>
+        </Reference>
+        <Reference Include="Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <Private>False</Private>
+        </Reference>
+      </ItemGroup>
+    </When>
+  </Choose>
+  <Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- 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/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/HeuristicLab.Tests.csproj.user
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/HeuristicLab.Tests.csproj.user	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/HeuristicLab.Tests.csproj.user	(revision 15771)
@@ -0,0 +1,6 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectView>ProjectFiles</ProjectView>
+  </PropertyGroup>
+</Project>
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/ExpressionTest.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/ExpressionTest.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/ExpressionTest.cs	(revision 15771)
@@ -0,0 +1,65 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Interpreter {
+  public class ExpressionTest {
+    protected PushInterpreter interpreter;
+
+    protected PushConfiguration configuration = new PushConfiguration {
+      TopLevelPushCode = false,
+      FloatStringFormat = "R",
+      ErcOptions = new ErcOptions {
+        ErcProbability = 0.05,
+        CharErcOptions = new CharErcOptions(new IntegerRangeErc(0x20, 0x7e)),
+        StringErcOptions = new StringErcOptions(new StringRandomErc {
+          IsEnabled = true,
+          AllowDigits = true,
+          NewStringProbability = 1,
+          AllowLowercaseLetters = true,
+          AllowUppercaseLetters = true
+        }),
+        IntegerErcOptions = new IntegerErcOptions(new IntegerRangeErc(-10000, 10000)),
+        FloatErcOptions = new FloatErcOptions(new FloatRangeErc(-10000, 10000)),
+        BooleanErcOptions = new BooleanErcOptions(new BooleanRandomErc(true, true, true)),
+        StringVectorErcOptions = new StringVectorErcOptions(
+          new StringVectorConstantsErc(new[] { "test", "123", "asdf", "a", "b" })),
+        IntegerVectorErcOptions = new IntegerVectorErcOptions(
+          new IntegerVectorConstantsErc(new[] { 0, -5, 10, 8, -3 })),
+        FloatVectorErcOptions = new FloatVectorErcOptions(
+          new FloatVectorConstantsErc(new[] { 0.0, -5.2, 10.3, 8.1, -3.4 }))
+      }
+    };
+
+    [TestInitialize]
+    public void BeforeTest() {
+      interpreter = new PushInterpreter(1337, configuration);
+    }
+
+    protected void TestStackCounts(
+      int? execStack = 0,
+      int? codeStack = 0,
+      int? nameStack = 0,
+      int? booleanStack = 0,
+      int? floatStack = 0,
+      int? integerStack = 0,
+      int? charStack = 0,
+      int? stringStack = 0,
+      int? integerVectorStack = 0,
+      int? floatVectorStack = 0,
+      int? booleanVectorStack = 0,
+      int? stringVectorStack = 0) {
+      if (execStack.HasValue) Assert.AreEqual(execStack, interpreter.ExecStack.Count);
+      if (codeStack.HasValue) Assert.AreEqual(codeStack, interpreter.CodeStack.Count);
+      if (nameStack.HasValue) Assert.AreEqual(nameStack, interpreter.NameStack.Count);
+      if (booleanStack.HasValue) Assert.AreEqual(booleanStack, interpreter.BooleanStack.Count);
+      if (floatStack.HasValue) Assert.AreEqual(floatStack, interpreter.FloatStack.Count);
+      if (integerStack.HasValue) Assert.AreEqual(integerStack, interpreter.IntegerStack.Count);
+      if (charStack.HasValue) Assert.AreEqual(charStack, interpreter.CharStack.Count);
+      if (stringStack.HasValue) Assert.AreEqual(stringStack, interpreter.StringStack.Count);
+      if (integerVectorStack.HasValue) Assert.AreEqual(integerVectorStack, interpreter.IntegerVectorStack.Count);
+      if (floatVectorStack.HasValue) Assert.AreEqual(floatVectorStack, interpreter.FloatVectorStack.Count);
+      if (booleanVectorStack.HasValue) Assert.AreEqual(booleanVectorStack, interpreter.BooleanVectorStack.Count);
+      if (stringVectorStack.HasValue) Assert.AreEqual(stringVectorStack, interpreter.StringVectorStack.Count);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/BooleanExpressionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/BooleanExpressionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/BooleanExpressionTests.cs	(revision 15771)
@@ -0,0 +1,136 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+  [TestClass]
+  public class BooleanExpressionTests : CommonTests<bool> {
+    protected override string TypeName {
+      get {
+        return "BOOLEAN";
+      }
+    }
+
+    protected override IPushStack<bool> Stack {
+      get {
+        return interpreter.BooleanStack;
+      }
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("BooleanExpressionTest")]
+    public void TestAnd() {
+      interpreter.BooleanStack.Push(true, false);
+      interpreter.Run(new BooleanAndExpression());
+
+      Assert.AreEqual(false, interpreter.BooleanStack.Top);
+
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("BooleanExpressionTest")]
+    public void TestAndWithInsufficientArguments() {
+      TestWithInsufficientArguments("AND", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("BooleanExpressionTest")]
+    public void TestOr() {
+      interpreter.BooleanStack.Push(true, false);
+      interpreter.Run(new BooleanOrExpression());
+
+      Assert.AreEqual(true, interpreter.BooleanStack.Top);
+
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("BooleanExpressionTest")]
+    public void TestOrWithInsufficientArguments() {
+      TestWithInsufficientArguments("OR", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("BooleanExpressionTest")]
+    public void TestNot() {
+      interpreter.BooleanStack.Push(true);
+      interpreter.Run(new BooleanNotExpression());
+
+      Assert.AreEqual(false, interpreter.BooleanStack.Top);
+
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("BooleanExpressionTest")]
+    public void TestNotWithInsufficientArguments() {
+      TestWithInsufficientArguments("NOT");
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("BooleanExpressionTest")]
+    public void TestFromFloat() {
+      interpreter.FloatStack.Push(2.0);
+      interpreter.Run(new BooleanFromFloatExpression());
+
+      Assert.AreEqual(true, interpreter.BooleanStack.Top);
+
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("BooleanExpressionTest")]
+    public void TestFromFloatWithInsufficientArguments() {
+      TestWithInsufficientArguments("FROMFLOAT");
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("BooleanExpressionTest")]
+    public void TestFromInteger() {
+      interpreter.IntegerStack.Push(2);
+      interpreter.Run(new BooleanFromIntegerExpression());
+
+      Assert.AreEqual(true, interpreter.BooleanStack.Top);
+
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("BooleanExpressionTest")]
+    public void TestFromIntegerWithInsufficientArguments() {
+      TestWithInsufficientArguments("FROMINTEGER");
+    }
+
+    protected override bool[] GetValues(int count) {
+      var values = new bool[count];
+
+      for (var i = 0; i < count; i++) values[i] = i % 2 == 0;
+
+      return values;
+    }
+
+    protected override void CheckOtherStacksAreEmpty() {
+      TestStackCounts(booleanStack: null);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/BooleanVectorExpressionsTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/BooleanVectorExpressionsTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/BooleanVectorExpressionsTests.cs	(revision 15771)
@@ -0,0 +1,34 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+
+  using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+  [TestClass]
+  public class BooleanVectorExpressionsTests : VectorExpressionTests<bool> {
+    protected override string TypeName { get { return "BOOLEAN[]"; } }
+
+    protected override IPushStack<IReadOnlyList<bool>> Stack { get { return interpreter.BooleanVectorStack; } }
+    protected override IPushStack<bool> LiteralStack { get { return interpreter.BooleanStack; } }
+
+    protected override IReadOnlyList<bool>[] GetValues(int count) {
+      return Enumerable
+        .Range(0, count)
+        .Select(x => GetLiterals(interpreter.Configuration.MaxVectorLength / 2 - 1))
+        .ToArray();
+    }
+
+    protected override IReadOnlyList<bool> GetLiterals(int count) {
+      return Enumerable
+        .Range(0, count)
+        .Select(x => interpreter.Configuration.ErcOptions.BooleanErcOptions.GetErcValue(interpreter.Random))
+        .ToArray();
+    }
+
+    protected override void CheckOtherStacksAreEmpty() {
+      TestStackCounts(booleanVectorStack: null);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/CharExpressionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/CharExpressionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/CharExpressionTests.cs	(revision 15771)
@@ -0,0 +1,112 @@
+﻿using System.Linq;
+using HeuristicLab.Problems.ProgramSynthesis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+  [TestClass]
+  public class CharExpressionTests : CommonTests<char> {
+    protected override string TypeName { get { return "CHAR"; } }
+
+    protected override IPushStack<char> Stack { get { return interpreter.CharStack; } }
+
+    protected override char[] GetValues(int count) {
+      return Enumerable
+        .Range(0, count)
+        .Select(_ => interpreter.Configuration.ErcOptions.CharErcOptions.GetErcValue(interpreter.Random))
+        .ToArray();
+    }
+
+    protected override void CheckOtherStacksAreEmpty() {
+      TestStackCounts(charStack: null);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CharExpressionTest")]
+    public void TestIsWhitespace() {
+      interpreter.CharStack.Push(' ', '_');
+      interpreter.Run(new CharIsWhitespaceExpression());
+      interpreter.Run(new CharIsWhitespaceExpression());
+
+      Assert.IsTrue(interpreter.BooleanStack[0]);
+      Assert.IsFalse(interpreter.BooleanStack[1]);
+      TestStackCounts(booleanStack: 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CharExpressionTest")]
+    public void TestIsLetter() {
+      interpreter.CharStack.Push('a', '_');
+      interpreter.Run(new CharIsLetterExpression());
+      interpreter.Run(new CharIsLetterExpression());
+
+      Assert.IsTrue(interpreter.BooleanStack[0]);
+      Assert.IsFalse(interpreter.BooleanStack[1]);
+      TestStackCounts(booleanStack: 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CharExpressionTest")]
+    public void TestIsDigit() {
+      interpreter.CharStack.Push('1', 'a');
+      interpreter.Run(new CharIsDigitExpression());
+      interpreter.Run(new CharIsDigitExpression());
+
+      Assert.IsTrue(interpreter.BooleanStack[0]);
+      Assert.IsFalse(interpreter.BooleanStack[1]);
+      TestStackCounts(booleanStack: 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CharExpressionTest")]
+    public void TestFromInteger() {
+      interpreter.IntegerStack.Push(1, -1, 129);
+      interpreter.Run(new CharFromIntegerExpression());
+      interpreter.Run(new CharFromIntegerExpression());
+      interpreter.Run(new CharFromIntegerExpression());
+
+      Assert.AreEqual(0x01, interpreter.CharStack[0]);
+      Assert.AreEqual(0x01, interpreter.CharStack[1]);
+      Assert.AreEqual(0x01, interpreter.CharStack[2]);
+      TestStackCounts(charStack: 3);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CharExpressionTest")]
+    public void TestFromFloat() {
+      interpreter.FloatStack.Push(1.5, -1.5, 129.5);
+      interpreter.Run(new CharFromFloatExpression());
+      interpreter.Run(new CharFromFloatExpression());
+      interpreter.Run(new CharFromFloatExpression());
+
+      Assert.AreEqual(0x01, interpreter.CharStack[0]);
+      Assert.AreEqual(0x01, interpreter.CharStack[1]);
+      Assert.AreEqual(0x01, interpreter.CharStack[2]);
+      TestStackCounts(charStack: 3);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CharExpressionTest")]
+    public void TestAllFromString() {
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new CharAllFromStringExpression());
+
+      Assert.AreEqual('t', interpreter.CharStack[0]);
+      Assert.AreEqual('e', interpreter.CharStack[1]);
+      Assert.AreEqual('s', interpreter.CharStack[2]);
+      Assert.AreEqual('t', interpreter.CharStack[3]);
+      TestStackCounts(charStack: 4);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/CodeExpressionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/CodeExpressionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/CodeExpressionTests.cs	(revision 15771)
@@ -0,0 +1,1059 @@
+﻿using Microsoft.VisualStudio.TestTools.UnitTesting;
+using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+
+  [TestClass]
+  public class CodeExpressionTests : CommonTests<Expression> {
+    protected override string TypeName {
+      get {
+        return "CODE";
+      }
+    }
+
+    protected override IPushStack<Expression> Stack {
+      get {
+        return interpreter.CodeStack;
+      }
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestAppendLists() {
+      var first = PushParser.Parse("( A )");
+      var second = PushParser.Parse("( B )");
+      var result = PushParser.Parse("( A B )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeAppendExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestAppendListAndLiteral() {
+      var first = PushParser.Parse("( A )");
+      var second = PushParser.Parse("5");
+      var result = PushParser.Parse("( A 5 )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeAppendExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestAppendLiterals() {
+      var first = PushParser.Parse("4");
+      var second = PushParser.Parse("5");
+      var result = PushParser.Parse("( 4 5 )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeAppendExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDuplicateList() {
+      var list = PushParser.Parse("( A B C )");
+      var result = PushParser.Parse("( A B C )");
+
+      interpreter.CodeStack.Push(list);
+      interpreter.Run(new CodeDuplicateExpression());
+
+      Assert.AreEqual(Stack.Count, 2);
+      Assert.AreEqual(Stack[0], list);
+      Assert.AreEqual(Stack[1], result);
+
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestAtomList() {
+      var first = PushParser.Parse("( A )");
+
+      interpreter.CodeStack.Push(first);
+      interpreter.Run(new CodeAtomExpression());
+
+      Assert.AreEqual(false, interpreter.BooleanStack.Top);
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestAtomLiteral() {
+      var first = PushParser.Parse("5");
+
+      interpreter.CodeStack.Push(first);
+      interpreter.Run(new CodeAtomExpression());
+
+      Assert.AreEqual(true, interpreter.BooleanStack.Top);
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestAtomSingleInstruction() {
+      var first = PushParser.Parse("INTEGER.+");
+
+      interpreter.CodeStack.Push(first);
+      interpreter.Run(new CodeAtomExpression());
+
+      Assert.AreEqual(true, interpreter.BooleanStack.Top);
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestCarList() {
+      var first = PushParser.Parse("( A B C )");
+      var result = PushParser.Parse("A");
+
+      interpreter.CodeStack.Push(first);
+      interpreter.Run(new CodeCarExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestCarNoList() {
+      var first = PushParser.Parse("5");
+      var result = PushParser.Parse("5");
+
+      interpreter.CodeStack.Push(first);
+      interpreter.Run(new CodeCarExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestCdrList() {
+      var first = PushParser.Parse("( A B C )");
+      var result = PushParser.Parse("( B C )");
+
+      interpreter.CodeStack.Push(first);
+      interpreter.Run(new CodeCdrExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestCdrNoList() {
+      var first = PushParser.Parse("5");
+      var result = PushParser.Parse("( )");
+
+      interpreter.CodeStack.Push(first);
+      interpreter.Run(new CodeCdrExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestCons() {
+      var first = PushParser.Parse("( B C )");
+      var second = PushParser.Parse("A");
+      var result = PushParser.Parse("( A B C )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeConsExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestContainsTrue() {
+      var first = PushParser.Parse("A");
+      var second = PushParser.Parse("( A B C )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeContainsExpression());
+
+      Assert.AreEqual(true, interpreter.BooleanStack.Top);
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestContainsFalse() {
+      var first = PushParser.Parse("D");
+      var second = PushParser.Parse("( A B C )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeContainsExpression());
+
+      Assert.AreEqual(false, interpreter.BooleanStack.Top);
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestContainer() {
+      var first = PushParser.Parse("( A )");
+      var second = PushParser.Parse("( B ( C ( A ) ) ( D ( A ) ) )");
+      var result = PushParser.Parse("( C ( A ) )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeContainerExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDefinition() {
+      var code = PushParser.Parse("( A )");
+
+      interpreter.CustomExpressions.Add("Test", code);
+      interpreter.NameStack.Push("Test");
+
+      interpreter.Run(new CodeDefinitionExpression());
+
+      Assert.AreEqual(code, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDefinitionWithoutMatchingName() {
+      var code = PushParser.Parse("( A )");
+      var program = new CodeDefinitionExpression();
+
+      interpreter.CustomExpressions.Add("Test1", code);
+      interpreter.NameStack.Push("Test2");
+      interpreter.Run(program);
+
+      TestStackCounts(nameStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDiscrepancy() {
+      var first = PushParser.Parse("( A B )");
+      var second = PushParser.Parse("( B C )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeDiscrepancyExpression());
+
+      Assert.AreEqual(2, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDiscrepancyAllEqual() {
+      var first = PushParser.Parse("( A B )");
+      var second = PushParser.Parse("( B A )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeDiscrepancyExpression());
+
+      Assert.AreEqual(0, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDiscrepancyComplex() {
+      var first = PushParser.Parse("( A A B C D A )");
+      var second = PushParser.Parse("( A A B D E )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeDiscrepancyExpression());
+
+      Assert.AreEqual(3, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDiscrepancWithLists() {
+      var first = PushParser.Parse("( ( A ) A ( B ) C D A )");
+      var second = PushParser.Parse("( A ( A ) B D E )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeDiscrepancyExpression());
+
+      Assert.AreEqual(5, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDo() {
+      var prog = PushParser.Parse("( 10 )");
+
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeDoExpression());
+
+      Assert.AreEqual(10, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDoX() {
+      var prog = PushParser.Parse("( 10 )");
+
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeDoXExpression());
+
+      Assert.AreEqual(10, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDoCount() {
+      var prog = PushParser.Parse("INTEGER.+");
+
+      interpreter.IntegerStack.Push(3);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeDoCountExpression());
+
+      Assert.AreEqual(6, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDoCountWithNegativeCounter() {
+      var prog = PushParser.Parse("INTEGER.+");
+
+      interpreter.IntegerStack.Push(-1);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeDoCountExpression());
+
+      Assert.AreEqual(-1, interpreter.IntegerStack.Top);
+      TestStackCounts(codeStack: 1, integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDoRange() {
+      var prog = PushParser.Parse("INTEGER.+");
+
+      interpreter.IntegerStack.Push(3, 5);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeDoRangeExpression());
+
+      Assert.AreEqual(12, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDoRangeWithEqualIndecators() {
+      var prog = PushParser.Parse("INTEGER.+");
+
+      interpreter.IntegerStack.Push(3, 3);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeDoRangeExpression());
+
+      Assert.AreEqual(3, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDoRangeWithNegativeIndecators() {
+      var prog = PushParser.Parse("INTEGER.+");
+
+      interpreter.IntegerStack.Push(-3, -5);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeDoRangeExpression());
+
+      Assert.AreEqual(-12, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDoTimes() {
+      var prog = PushParser.Parse("( INTEGER.DUP INTEGER.+ )");
+
+      interpreter.IntegerStack.Push(2, 4);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeDoTimesExpression());
+
+      Assert.AreEqual(32, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestDoTimesWithNegativeCounter() {
+      var prog = PushParser.Parse("( INTEGER.DUP INTEGER.+ )");
+
+      interpreter.IntegerStack.Push(2, -3);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeDoTimesExpression());
+
+      Assert.AreEqual(-3, interpreter.IntegerStack.Top);
+      TestStackCounts(codeStack: 1, integerStack: 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNestedDoRange() {
+      interpreter.Run(
+        "( 0 2 CODE.QUOTE ( 1 INTEGER.+ 0 3 CODE.QUOTE ( 1 INTEGER.+ INTEGER.* ) CODE.DO*RANGE INTEGER.+ ) CODE.DO*RANGE )");
+
+      Assert.AreEqual(144, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNestedDoCount() {
+      interpreter.Run(
+        "( 2 CODE.QUOTE ( 1 INTEGER.+ 3 CODE.QUOTE ( 1 INTEGER.+ INTEGER.* ) CODE.DO*COUNT INTEGER.+ ) CODE.DO*COUNT )");
+
+      Assert.AreEqual(144, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNestedDoTimes() {
+      interpreter.Run(
+        "( 4 CODE.QUOTE ( 2 4 CODE.QUOTE ( 2 INTEGER.* ) CODE.DO*TIMES INTEGER.+ ) CODE.DO*TIMES )");
+
+      Assert.AreEqual(128, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestExtract() {
+      var prog = PushParser.Parse("( A ( B C ( D ) E ) F G H I J ( K ) L )");
+      var result = PushParser.Parse("( D )");
+
+      interpreter.IntegerStack.Push(5);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeExtractExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestExtractInteger() {
+      var prog = PushParser.Parse("( A ( 5 C ( 4.2 ) INTEGER.+ ) FALSE )");
+      var result = PushParser.Parse("5");
+
+      interpreter.IntegerStack.Push(3);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeExtractExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestExtractFloat() {
+      var prog = PushParser.Parse("( A ( 5 C ( 4.2 ) INTEGER.+ ) FALSE )");
+      var result = PushParser.Parse("4.2");
+
+      interpreter.IntegerStack.Push(6);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeExtractExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestExtractBoolean() {
+      var prog = PushParser.Parse("( A ( 5 C ( 4.2 ) INTEGER.+ ) FALSE )");
+      var result = PushParser.Parse("FALSE");
+
+      interpreter.IntegerStack.Push(8);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeExtractExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestExtractInstruction() {
+      var prog = PushParser.Parse("( A ( 5 C ( 4.2 ) INTEGER.+ ) FALSE )");
+      var result = PushParser.Parse("INTEGER.+");
+
+      interpreter.IntegerStack.Push(7);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeExtractExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestFromBoolean() {
+      var result = PushParser.Parse("FALSE");
+      interpreter.BooleanStack.Push(false);
+      interpreter.Run(new CodeFromBooleanExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestFromFloat() {
+      var result = PushParser.Parse("4.1");
+      interpreter.FloatStack.Push(4.1);
+      interpreter.Run(new CodeFromFloatExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestFromInteger() {
+      var result = PushParser.Parse("4");
+      interpreter.IntegerStack.Push(4);
+      interpreter.Run(new CodeFromIntegerExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestFromName() {
+      var result = PushParser.Parse("A");
+      interpreter.NameStack.Push("A");
+      interpreter.Run(new CodeFromNameExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestIfTrue() {
+      var first = PushParser.Parse("FALSCH");
+      var second = PushParser.Parse("WAHR");
+
+      interpreter.BooleanStack.Push(true);
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeIfExpression());
+
+      Assert.AreEqual("WAHR", interpreter.NameStack.Top);
+      TestStackCounts(nameStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestIfFalse() {
+      var first = PushParser.Parse("FALSCH");
+      var second = PushParser.Parse("WAHR");
+
+      interpreter.BooleanStack.Push(false);
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeIfExpression());
+
+      Assert.AreEqual("FALSCH", interpreter.NameStack.Top);
+      TestStackCounts(nameStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestInsert() {
+      var first = PushParser.Parse("( A ( B ) C D )");
+      var second = PushParser.Parse("( E )");
+      var result = PushParser.Parse("( A ( B ) ( E ) D )");
+
+      interpreter.IntegerStack.Push(2);
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeInsertExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestInsertWithNegativeN() {
+      var first = PushParser.Parse("( A ( B ) C D )");
+      var second = PushParser.Parse("( E )");
+      var result = PushParser.Parse("( A ( B ) ( E ) D )");
+
+      interpreter.IntegerStack.Push(-2);
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeInsertExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestInsertWithTooBigN() {
+      var first = PushParser.Parse("( A ( B ) C D )");
+      var second = PushParser.Parse("( E )");
+      var result = PushParser.Parse("( A ( B ) ( E ) D )");
+
+      interpreter.IntegerStack.Push(10);
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeInsertExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestList() {
+      var first = PushParser.Parse("A");
+      var second = PushParser.Parse("( B )");
+      var result = PushParser.Parse("( A ( B ) )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeListExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestMemberTrue() {
+      var first = PushParser.Parse("( A B ( B ) C ");
+      var second = PushParser.Parse("( B )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeMemberExpression());
+
+      Assert.AreEqual(true, interpreter.BooleanStack.Top);
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestMemberFalse() {
+      var first = PushParser.Parse("( A B C ");
+      var second = PushParser.Parse("( B )");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeMemberExpression());
+
+      Assert.AreEqual(false, interpreter.BooleanStack.Top);
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestMemberIfNoList() {
+      var first = PushParser.Parse("B");
+      var second = PushParser.Parse("B");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodeMemberExpression());
+
+      Assert.AreEqual(true, interpreter.BooleanStack.Top);
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNoop() {
+      interpreter.Run(new CodeNoopExpression());
+
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNthIfNoList() {
+      var prog = PushParser.Parse("A");
+      var result = PushParser.Parse("A");
+
+      interpreter.IntegerStack.Push(3);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeNthExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNthIfEmpty() {
+      var prog = PushParser.Parse("( )");
+      var result = PushParser.Parse("( )");
+
+      interpreter.IntegerStack.Push(3);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeNthExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNth() {
+      var prog = PushParser.Parse("( A B C D E )");
+      var result = PushParser.Parse("D");
+
+      interpreter.IntegerStack.Push(3);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeNthExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNthWithTooBigN() {
+      var prog = PushParser.Parse("( A B C D E )");
+      var result = PushParser.Parse("D");
+
+      interpreter.IntegerStack.Push(13);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeNthExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNthWithNegativeN() {
+      var prog = PushParser.Parse("( A B C D E )");
+      var result = PushParser.Parse("D");
+
+      interpreter.IntegerStack.Push(-3);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeNthExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNthCdr() {
+      var prog = PushParser.Parse("( A B C D E )");
+      var result = PushParser.Parse("D");
+
+      interpreter.IntegerStack.Push(2);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeNthCdrExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNthCdrWithTooBigN() {
+      var prog = PushParser.Parse("( A B C D E )");
+      var result = PushParser.Parse("D");
+
+      interpreter.IntegerStack.Push(10);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeNthCdrExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNthCdrWithNegativeN() {
+      var prog = PushParser.Parse("( A B C D E )");
+      var result = PushParser.Parse("D");
+
+      interpreter.IntegerStack.Push(-2);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeNthCdrExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNthCdrIfEmpty() {
+      var prog = PushParser.Parse("( )");
+      var result = PushParser.Parse("( )");
+
+      interpreter.IntegerStack.Push(3);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeNthCdrExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNthCdrIfNoList() {
+      var prog = PushParser.Parse("A");
+      var result = PushParser.Parse("A");
+
+      interpreter.IntegerStack.Push(3);
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeNthCdrExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNullTrue() {
+      var prog = PushParser.Parse("( )");
+
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeNullExpression());
+
+      Assert.AreEqual(true, interpreter.BooleanStack.Top);
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestNullFalse() {
+      var prog = PushParser.Parse("A");
+
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeNullExpression());
+
+      Assert.AreEqual(false, interpreter.BooleanStack.Top);
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestPosition() {
+      var first = PushParser.Parse("( A B C D )");
+      var second = PushParser.Parse("C");
+
+      interpreter.CodeStack.Push(second, first);
+      interpreter.Run(new CodePositionExpression());
+
+      Assert.AreEqual(2, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestQuote() {
+      var result = PushParser.Parse("A");
+
+      interpreter.Run("( CODE.QUOTE A )");
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestSize() {
+      var prog = PushParser.Parse("( A ( B ( C ) ) ( D ) INTEGER.+ )");
+
+      interpreter.CodeStack.Push(prog);
+      interpreter.Run(new CodeSizeExpression());
+
+      Assert.AreEqual(4, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CodeExpressionTest")]
+    public void TestSubstitude() {
+      var first = PushParser.Parse("( A B C D A B C D )");
+      var second = PushParser.Parse("E");
+      var third = PushParser.Parse("A");
+      var result = PushParser.Parse("( E B C D E B C D )");
+
+      interpreter.CodeStack.Push(third, second, first);
+      interpreter.Run(new CodeSubstitutionExpression());
+
+      Assert.AreEqual(result, interpreter.CodeStack.Top);
+      CheckOtherStacksAreEmpty();
+    }
+
+    protected override Expression[] GetValues(int count) {
+      var values = new Expression[count];
+
+      for (var i = 0; i < count; i++) values[i] = new CodeNoopExpression();
+
+      return values;
+    }
+
+    protected override Expression[] Get2Different() {
+      return new Expression[] { new CodeNoopExpression(), new CodeNullExpression() };
+    }
+
+    protected override void CheckOtherStacksAreEmpty() {
+      TestStackCounts(codeStack: null);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/CommonTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/CommonTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/CommonTests.cs	(revision 15771)
@@ -0,0 +1,331 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+  public abstract class CommonTests<T> : ExpressionTest {
+    protected const string FullInstructionNameFormat = "{0}.{1}";
+
+    protected abstract string TypeName { get; }
+
+    protected abstract IPushStack<T> Stack { get; }
+
+    protected abstract T[] GetValues(int count);
+
+    protected virtual T[] Get2Different() {
+      return GetValues(2);
+    }
+
+    protected virtual void Test(Expression expression) {
+      interpreter.Run(expression);
+    }
+
+    protected abstract void CheckOtherStacksAreEmpty();
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestEqualsTrue() {
+      var values = GetValues(1);
+      var merged = new[] { values[0], values[0] };
+
+      Stack.Push(merged);
+
+      var isBooleanStack = interpreter.BooleanStack.Count == 2;
+      Test(ExpressionTable.GetStatelessExpression(TypeName + ".="));
+
+      if (isBooleanStack) Assert.AreEqual(1, Stack.Count);
+      else Assert.AreEqual(0, Stack.Count);
+
+      Assert.IsTrue(interpreter.BooleanStack.Top);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestEqualsFalse() {
+      var values = Get2Different();
+      Stack.Push(values);
+      var isBooleanStack = interpreter.BooleanStack.Count == 2;
+
+      Test(ExpressionTable.GetStatelessExpression(TypeName + ".="));
+
+      if (isBooleanStack) Assert.AreEqual(1, Stack.Count);
+      else Assert.AreEqual(0, Stack.Count);
+
+      Assert.IsFalse(interpreter.BooleanStack.Top);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestEqualsWithInsufficientArguments() {
+      TestWithInsufficientArguments("=", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestDuplicate() {
+      var values = GetValues(1);
+      Stack.Push(values);
+
+      Test(ExpressionTable.GetStatelessExpression(TypeName + ".DUP"));
+
+      Assert.AreEqual(Stack.Count, 2);
+      Assert.AreEqual(Stack[0], values[0]);
+      Assert.AreEqual(Stack[1], values[0]);
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestPop() {
+      var values = GetValues(2);
+      Stack.Push(values);
+
+      Test(ExpressionTable.GetStatelessExpression(TypeName + ".POP"));
+
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestSwap() {
+      var values = GetValues(3);
+      Stack.Push(values);
+
+      Test(ExpressionTable.GetStatelessExpression(TypeName + ".SWAP"));
+
+      Assert.AreEqual(values[0], Stack[2]);
+      Assert.AreEqual(values[1], Stack[0]);
+      Assert.AreEqual(values[2], Stack[1]);
+
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestSwapWithInsufficientArguments() {
+      TestWithInsufficientArguments("SWAP", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestRotate() {
+      var values = GetValues(4);
+      Stack.Push(values);
+
+      Test(ExpressionTable.GetStatelessExpression(TypeName + ".ROT"));
+
+      Assert.AreEqual(values[0], Stack[3]);
+      Assert.AreEqual(values[3], Stack[2]);
+      Assert.AreEqual(values[1], Stack[1]);
+      Assert.AreEqual(values[2], Stack[0]);
+
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestRotateWithInsufficientArguments() {
+      TestWithInsufficientArguments("ROT", 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestShove() {
+      var values = GetValues(3);
+      Stack.Push(values);
+
+      interpreter.IntegerStack.Push(1);
+      Test(ExpressionTable.GetStatelessExpression(TypeName + ".SHOVE"));
+
+      Assert.AreEqual(values[0], Stack[2]);
+      Assert.AreEqual(values[1], Stack[0]);
+      Assert.AreEqual(values[2], Stack[1]);
+
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestShoveWithInsufficientArguments() {
+      TestWithInsufficientArguments("SHOVE", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestShoveWithNegativeIndex() {
+      var values = GetValues(3);
+      Stack.Push(values);
+
+      interpreter.IntegerStack.Push(-1);
+      Test(ExpressionTable.GetStatelessExpression(TypeName + ".SHOVE"));
+
+      Assert.AreEqual(values[0], Stack[2]);
+      Assert.AreEqual(values[1], Stack[0]);
+      Assert.AreEqual(values[2], Stack[1]);
+
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestYank() {
+      var values = GetValues(3);
+      Stack.Push(values);
+
+      interpreter.IntegerStack.Push(1);
+      Test(ExpressionTable.GetStatelessExpression(TypeName + ".YANK"));
+
+      Assert.AreEqual(values[0], Stack[2]);
+      Assert.AreEqual(values[1], Stack[0]);
+      Assert.AreEqual(values[2], Stack[1]);
+
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestYankWithInsufficientArguments() {
+      TestWithInsufficientArguments("YANK", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestYankWithNegativeIndex() {
+      var values = GetValues(3);
+      Stack.Push(values);
+
+      interpreter.IntegerStack.Push(-1);
+      Test(ExpressionTable.GetStatelessExpression(TypeName + ".YANK"));
+
+      Assert.AreEqual(values[0], Stack[2]);
+      Assert.AreEqual(values[1], Stack[0]);
+      Assert.AreEqual(values[2], Stack[1]);
+
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestYankDuplicate() {
+      var values = GetValues(3);
+      Stack.Push(values);
+
+      interpreter.IntegerStack.Push(1);
+      Test(ExpressionTable.GetStatelessExpression(TypeName + ".YANKDUP"));
+
+      Assert.AreEqual(values[0], Stack[3]);
+      Assert.AreEqual(values[1], Stack[2]);
+      Assert.AreEqual(values[2], Stack[1]);
+      Assert.AreEqual(values[1], Stack[0]);
+
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestYankDuplicateWithInsufficientArguments() {
+      TestWithInsufficientArguments("YANKDUP", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestYankDuplicateWithNegativeIndex() {
+      var values = GetValues(3);
+      Stack.Push(values);
+
+      interpreter.IntegerStack.Push(-1);
+      Test(ExpressionTable.GetStatelessExpression(TypeName + ".YANKDUP"));
+
+      Assert.AreEqual(values[0], Stack[3]);
+      Assert.AreEqual(values[1], Stack[2]);
+      Assert.AreEqual(values[2], Stack[1]);
+      Assert.AreEqual(values[1], Stack[0]);
+
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("CommonExpressionTest")]
+    public virtual void TestStackdpeth() {
+      var values = GetValues(3);
+      Stack.Push(values);
+
+      Test(ExpressionTable.GetStatelessExpression(TypeName + ".STACKDEPTH"));
+
+      // if stack is integer stack
+      if (Stack.Count != values.Length) {
+        Assert.AreEqual(4, Stack.Count);
+        CheckOtherStacksAreEmpty();
+      } else {
+        Assert.AreEqual(3, Stack.Count);
+        Assert.AreEqual(values.Length, interpreter.IntegerStack.Top);
+      }
+    }
+
+    protected void TestWithInsufficientArguments(string instructionName, int argCount = 0) {
+      for (var i = 0; i < argCount + 1; i++) {
+        var values = GetValues(i);
+        Stack.Push(values);
+
+        var fullInstructionName = string.Format(FullInstructionNameFormat, TypeName, instructionName);
+        Test(ExpressionTable.GetStatelessExpression(fullInstructionName));
+
+        for (var j = 0; j < i; j++) Assert.AreEqual(values[j], Stack[i - j - 1]);
+
+        CheckOtherStacksAreEmpty();
+        interpreter.ClearStacks();
+      }
+    }
+
+    protected void TestWithNegativeIndex(string instructionName) {
+      var values = GetValues(3);
+      Stack.Push(values);
+
+      interpreter.IntegerStack.Push(-1);
+
+      var fullInstructionname = string.Format(FullInstructionNameFormat, TypeName, instructionName);
+      Test(ExpressionTable.GetStatelessExpression(fullInstructionname));
+
+      Assert.AreEqual(values[0], Stack[2]);
+      Assert.AreEqual(values[1], Stack[0]);
+      Assert.AreEqual(values[2], Stack[1]);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/ExampleTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/ExampleTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/ExampleTests.cs	(revision 15771)
@@ -0,0 +1,286 @@
+﻿namespace HeuristicLab.Tests.Interpreter.Expressions {
+  using HeuristicLab.Problems.ProgramSynthesis;
+
+  using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+  [TestClass]
+  public class MixedExpressionTests : ExpressionTest {
+    private const double Delta = 0.00000001;
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example1() {
+      interpreter.Run("( 2 3 INTEGER.* 4.1 5.2 FLOAT.+ TRUE FALSE BOOLEAN.OR )");
+
+      Assert.AreEqual(6, interpreter.IntegerStack.Top);
+      Assert.AreEqual(9.3, interpreter.FloatStack.Top);
+      Assert.IsTrue(interpreter.BooleanStack.Top);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example2() {
+      interpreter.Run("( 5 1.23 INTEGER.+ ( 4 ) INTEGER.- 5.67 FLOAT.* )");
+
+      Assert.AreEqual(1, interpreter.IntegerStack.Top);
+      Assert.AreEqual(6.9741, interpreter.FloatStack.Top);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example3() {
+      interpreter.Run("( 5 INTEGER.DUP INTEGER.+ )");
+
+      Assert.AreEqual(10, interpreter.IntegerStack.Top);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+      Assert.IsTrue(interpreter.FloatStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example4() {
+      interpreter.Run("( 5 CODE.QUOTE ( INTEGER.DUP INTEGER.+ ) CODE.DO )");
+
+      Assert.AreEqual(10, interpreter.IntegerStack.Top);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+      Assert.IsTrue(interpreter.FloatStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example5() {
+      interpreter.Run("( DOUBLE CODE.QUOTE ( INTEGER.DUP INTEGER.+ ) CODE.DEFINE 5 DOUBLE )");
+
+      Assert.AreEqual(10, interpreter.IntegerStack.Top);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+      Assert.IsTrue(interpreter.FloatStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example6() {
+      interpreter.Run("( CODE.QUOTE ( INTEGER.DUP INTEGER.+ ) DOUBLE CODE.DEFINE 5 DOUBLE )");
+
+      Assert.AreEqual(10, interpreter.IntegerStack.Top);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+      Assert.IsTrue(interpreter.FloatStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example7() {
+      interpreter.Run("( DOUBLE EXEC.DEFINE ( INTEGER.DUP INTEGER.+ ) 5 DOUBLE )");
+
+      Assert.AreEqual(10, interpreter.IntegerStack.Top);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+      Assert.IsTrue(interpreter.FloatStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example8() {
+      configuration.TopLevelPushCode = true;
+
+      interpreter.IntegerStack.Push(5);
+      interpreter.Run(@"( CODE.QUOTE ( INTEGER.POP 1 )
+                                           CODE.QUOTE ( CODE.DUP INTEGER.DUP 1 INTEGER.- CODE.DO INTEGER.* )
+                                           INTEGER.DUP 2 INTEGER.< CODE.IF )");
+
+      Assert.AreEqual(120, interpreter.IntegerStack.Top);
+      Assert.IsTrue(interpreter.CodeStack.Count == 1);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+      Assert.IsTrue(interpreter.FloatStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example9() {
+      interpreter.IntegerStack.Push(5);
+      interpreter.Run("( 1 INTEGER.MAX 1 EXEC.DO*RANGE INTEGER.* )");
+
+      Assert.AreEqual(120, interpreter.IntegerStack.Top);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+      Assert.IsTrue(interpreter.FloatStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example10() {
+      interpreter.IntegerStack.Push(5);
+      interpreter.Run("( 1 INTEGER.MAX 1 EXEC.DO*RANGE ( 2 INTEGER.* INTEGER.* ) )");
+
+      Assert.AreEqual(3840, interpreter.IntegerStack.Top);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+      Assert.IsTrue(interpreter.FloatStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example11() {
+      var program = PushParser.Parse("( INTEGER.= CODE.QUOTE FLOAT.* CODE.QUOTE FLOAT./ CODE.IF )");
+
+      interpreter.IntegerStack.Push(1, 1);
+      interpreter.FloatStack.Push(2.1, 0.7);
+
+      interpreter.Run(program);
+
+      Assert.IsTrue(interpreter.IntegerStack.IsEmpty);
+      Assert.AreEqual(1.47, interpreter.FloatStack.Top, Delta);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+
+      interpreter.ClearStacks();
+      interpreter.IntegerStack.Push(1, 2);
+      interpreter.FloatStack.Push(2.1, 0.7);
+      interpreter.Run(program);
+
+      Assert.IsTrue(interpreter.IntegerStack.IsEmpty);
+      Assert.AreEqual(3d, interpreter.FloatStack.Top, Delta);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example12() {
+      var program = PushParser.Parse("( INTEGER.= EXEC.IF FLOAT.* FLOAT./ )");
+
+      interpreter.IntegerStack.Push(1, 1);
+      interpreter.FloatStack.Push(2.1, 0.7);
+
+      interpreter.Run(program);
+
+      Assert.IsTrue(interpreter.IntegerStack.IsEmpty);
+      Assert.AreEqual(1.47, interpreter.FloatStack.Top, Delta);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+
+      interpreter.ClearStacks();
+      interpreter.IntegerStack.Push(1, 2);
+      interpreter.FloatStack.Push(2.1, 0.7);
+      interpreter.Run(program);
+
+      Assert.IsTrue(interpreter.IntegerStack.IsEmpty);
+      Assert.AreEqual(3d, interpreter.FloatStack.Top, Delta);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example13() {
+      interpreter.IntegerStack.Push(5);
+      interpreter.Run("( EXEC.Y ( ( FALSE 2 INTEGER.* ) EXEC.IF ( ) EXEC.POP ) )");
+
+      Assert.AreEqual(10, interpreter.IntegerStack.Top);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+      Assert.IsTrue(interpreter.FloatStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example14() {
+      interpreter.IntegerStack.Push(5);
+      interpreter.Run("( EXEC.Y ( ( 2 INTEGER.* INTEGER.DUP 1000 INTEGER.< ) EXEC.IF ( ) EXEC.POP ) )");
+
+      Assert.AreEqual(1280, interpreter.IntegerStack.Top);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+      Assert.IsTrue(interpreter.FloatStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example15() {
+      interpreter.IntegerStack.Push(10);
+      interpreter.FloatStack.Push(2);
+      interpreter.Run(@"( ARG FLOAT.DEFINE
+                          EXEC.Y (
+                            ARG FLOAT.*
+                            1 INTEGER.-
+                            INTEGER.DUP 1 INTEGER.>
+                            EXEC.IF ( ) EXEC.POP
+                          )
+                        )");
+
+      Assert.AreEqual(1024, interpreter.FloatStack.Top, Delta);
+      Assert.AreEqual(1, interpreter.IntegerStack.Top);
+      Assert.IsTrue(interpreter.CodeStack.IsEmpty);
+      Assert.IsTrue(interpreter.ExecStack.IsEmpty);
+      Assert.IsTrue(interpreter.NameStack.IsEmpty);
+      Assert.IsTrue(interpreter.BooleanStack.IsEmpty);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExampleTest")]
+    public void Example16() {
+      var list = PushParser.Parse("( A B C )");
+
+      interpreter.CodeStack.Push(list);
+      interpreter.Run("( CODE.DUP 0 CODE.INSERT )");
+
+      var id = interpreter.CodeStack.Top.GetHashCode();
+
+      if (id == default(int)) Assert.Fail();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/ExecExpressionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/ExecExpressionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/ExecExpressionTests.cs	(revision 15771)
@@ -0,0 +1,151 @@
+﻿using Microsoft.VisualStudio.TestTools.UnitTesting;
+using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+  [TestClass]
+  public class ExecExpressionTests : CommonTests<Expression> {
+    protected override string TypeName {
+      get {
+        return "EXEC";
+      }
+    }
+
+    protected override IPushStack<Expression> Stack {
+      get {
+        return interpreter.ExecStack;
+      }
+    }
+
+    protected override void Test(Expression expression) {
+      interpreter.Run(expression, true);
+      interpreter.Step();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("ExecExpressionTest")]
+    public void TestIfTrue() {
+      interpreter.BooleanStack.Push(true);
+      interpreter.Run("( EXEC.IF WAHR FALSCH )");
+
+      Assert.AreEqual("WAHR", interpreter.NameStack.Top);
+      TestStackCounts(nameStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("ExecExpressionTest")]
+    public void TestIfFalse() {
+      interpreter.BooleanStack.Push(false);
+      interpreter.Run("( EXEC.IF WAHR FALSCH )");
+
+      Assert.AreEqual("FALSCH", interpreter.NameStack.Top);
+      TestStackCounts(nameStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("ExecExpressionTest")]
+    public void TestK() {
+      var first = PushParser.Parse("A");
+      var second = PushParser.Parse("B");
+      var third = PushParser.Parse("C");
+
+      interpreter.ExecStack.Push(third, second, first);
+      Test(new ExecKExpression());
+
+      Assert.AreEqual(first, interpreter.ExecStack.Top);
+      Assert.AreEqual(third, interpreter.ExecStack.Bottom);
+      TestStackCounts(2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("ExecExpressionTest")]
+    public void TestS() {
+      var first = PushParser.Parse("A");
+      var second = PushParser.Parse("B");
+      var third = PushParser.Parse("C");
+      var result = PushParser.Parse("( B C )");
+
+      interpreter.ExecStack.Push(third, second, first);
+      Test(new ExecSExpression());
+
+      Assert.AreEqual(result, interpreter.ExecStack[2]);
+      Assert.AreEqual(third, interpreter.ExecStack[1]);
+      Assert.AreEqual(first, interpreter.ExecStack.Top);
+      TestStackCounts(3);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("ExecExpressionTest")]
+    public void TestY() {
+      var first = PushParser.Parse("A");
+      var result = PushParser.Parse("( EXEC.Y A )");
+
+      interpreter.ExecStack.Push(first);
+      Test(new ExecYExpression());
+
+      Assert.AreEqual(first, interpreter.ExecStack.Top);
+      Assert.AreEqual(result, interpreter.ExecStack[1]);
+      TestStackCounts(2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("ExecExpressionTest")]
+    public void TestNestedDoRange() {
+      interpreter.Run(
+        "( 1 0 2 EXEC.DO*RANGE ( INTEGER.POP 1 1 4 EXEC.DO*RANGE INTEGER.* INTEGER.* ) )");
+
+      Assert.AreEqual(13824, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("ExecExpressionTest")]
+    public void TestNestedDoCount() {
+      interpreter.Run(
+        "( 2 EXEC.DO*COUNT ( 1 INTEGER.+ 3 EXEC.DO*COUNT ( 1 INTEGER.+ INTEGER.* ) INTEGER.+ )");
+
+      Assert.AreEqual(144, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("ExecExpressionTest")]
+    public void TestNestedDoTimes() {
+      interpreter.Run("( 4 EXEC.DO*TIMES ( 2 4 EXEC.DO*TIMES ( 2 INTEGER.* ) INTEGER.+ )");
+
+      Assert.AreEqual(128, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    protected override Expression[] GetValues(int count) {
+      var values = new Expression[count];
+
+      for (var i = 0; i < count; i++) values[i] = new CodeNoopExpression();
+
+      return values;
+    }
+
+    protected override Expression[] Get2Different() {
+      return new Expression[] { new CodeNoopExpression(), new CodeNullExpression() };
+    }
+
+    protected override void CheckOtherStacksAreEmpty() {
+      TestStackCounts(null);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/FloatExpressionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/FloatExpressionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/FloatExpressionTests.cs	(revision 15771)
@@ -0,0 +1,320 @@
+﻿using System;
+using HeuristicLab.Problems.ProgramSynthesis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+  [TestClass]
+  public class FloatExpressionTests : CommonTests<double> {
+    private const double delta = 0.00001;
+
+    protected override string TypeName {
+      get {
+        return "FLOAT";
+      }
+    }
+
+    protected override IPushStack<double> Stack {
+      get {
+        return interpreter.FloatStack;
+      }
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestAdd() {
+      interpreter.FloatStack.Push(5.3, 5.3);
+      interpreter.Run(new FloatAddExpression());
+
+      Assert.AreEqual(10.6, interpreter.FloatStack.Top, delta);
+
+      TestStackCounts(floatStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestAddWithInsufficientArguments() {
+      TestWithInsufficientArguments("+", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestSubtract() {
+      interpreter.FloatStack.Push(10.2, 5.3);
+      interpreter.Run(new FloatSubtractExpression());
+
+      Assert.AreEqual(4.9, interpreter.FloatStack.Top, delta);
+
+      TestStackCounts(floatStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestSubractWithInsufficientArguments() {
+      TestWithInsufficientArguments("-", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestMultiply() {
+      interpreter.FloatStack.Push(9.9, 3.3);
+      interpreter.Run(new FloatMultiplyExpression());
+
+      Assert.AreEqual(32.67, interpreter.FloatStack.Top, delta);
+
+      TestStackCounts(floatStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestMultiplyWithInsufficientArguments() {
+      TestWithInsufficientArguments("*", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestDivide() {
+      interpreter.FloatStack.Push(9.9, 3.3);
+      interpreter.Run(new FloatDivideExpression());
+
+      Assert.AreEqual(3.0, interpreter.FloatStack.Top, delta);
+
+      TestStackCounts(floatStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestDivideWithInsufficientArguments() {
+      TestWithInsufficientArguments("/", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestModulo() {
+      interpreter.FloatStack.Push(11.6, 5.3);
+      interpreter.Run(new FloatModuloExpression());
+
+      Assert.AreEqual(1, interpreter.FloatStack.Top, delta);
+
+      TestStackCounts(floatStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestModuloWithInsufficientArguments() {
+      TestWithInsufficientArguments("%", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestMin() {
+      interpreter.FloatStack.Push(10.2, 5.3);
+      interpreter.Run(new FloatMinExpression());
+
+      Assert.AreEqual(5.3, interpreter.FloatStack.Top, delta);
+
+      TestStackCounts(floatStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestMinWithInsufficientArguments() {
+      TestWithInsufficientArguments("MIN", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestMax() {
+      interpreter.FloatStack.Push(10.3, 5.3);
+      interpreter.Run(new FloatMaxExpression());
+
+      Assert.AreEqual(10.3, interpreter.FloatStack.Top, delta);
+
+      TestStackCounts(floatStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestMaxWithInsufficientArguments() {
+      TestWithInsufficientArguments("MAX", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestSmallerThan() {
+      interpreter.FloatStack.Push(10.2, 5.3);
+      interpreter.Run(new FloatSmallerThanExpression());
+
+      Assert.AreEqual(false, interpreter.BooleanStack.Top);
+
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestSmallerThanWithInsufficientArguments() {
+      TestWithInsufficientArguments("<", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestGreaterThan() {
+      interpreter.FloatStack.Push(10.2, 5.3);
+      interpreter.Run(new FloatGreaterThanExpression());
+
+      Assert.AreEqual(true, interpreter.BooleanStack.Top);
+
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestGreaterThanWithInsufficientArguments() {
+      TestWithInsufficientArguments(">", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestFromBooleanTrue() {
+      interpreter.BooleanStack.Push(true);
+      interpreter.Run(new FloatFromBooleanExpression());
+
+      Assert.AreEqual(1d, interpreter.FloatStack.Top, delta);
+
+      TestStackCounts(floatStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestFromBooleanFalse() {
+      interpreter.BooleanStack.Push(false);
+      interpreter.Run(new FloatFromBooleanExpression());
+
+      Assert.AreEqual(0d, interpreter.FloatStack.Top, delta);
+
+      TestStackCounts(floatStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestFromBooleanWithInsufficientArguments() {
+      TestWithInsufficientArguments("FROMBOOLEAN");
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestFromInteger() {
+      interpreter.IntegerStack.Push(5);
+      interpreter.Run(new FloatFromIntegerExpression());
+
+      Assert.AreEqual(5d, interpreter.FloatStack.Top, delta);
+
+      TestStackCounts(floatStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestFromIntegerWithInsufficientArguments() {
+      TestWithInsufficientArguments("FROMINTEGER");
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestSine() {
+      interpreter.FloatStack.Push(Math.PI / 2);
+      interpreter.Run(new FloatSineExpression());
+
+      Assert.AreEqual(1, interpreter.FloatStack.Top, delta);
+
+      TestStackCounts(floatStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestSineWithInsufficientArguments() {
+      TestWithInsufficientArguments("SIN");
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestCosine() {
+      interpreter.FloatStack.Push(Math.PI);
+      interpreter.Run(new FloatCosineExpression());
+
+      Assert.AreEqual(-1, interpreter.FloatStack.Top, delta);
+
+      TestStackCounts(floatStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("FloatExpressionTest")]
+    public void TestCosineWithInsufficientArguments() {
+      TestWithInsufficientArguments("COS");
+    }
+
+    protected override double[] GetValues(int count) {
+      var values = new double[count];
+
+      for (var i = 0; i < count; i++) values[i] = i * 0.9;
+
+      return values;
+    }
+
+    protected override void CheckOtherStacksAreEmpty() {
+      TestStackCounts(floatStack: null);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/FloatVectorExpressionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/FloatVectorExpressionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/FloatVectorExpressionTests.cs	(revision 15771)
@@ -0,0 +1,32 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Problems.ProgramSynthesis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+  [TestClass]
+  public class FloatVectorExpressionTests : VectorExpressionTests<double> {
+    protected override string TypeName { get { return "FLOAT[]"; } }
+
+    protected override IPushStack<IReadOnlyList<double>> Stack { get { return interpreter.FloatVectorStack; } }
+    protected override IPushStack<double> LiteralStack { get { return interpreter.FloatStack; } }
+
+    protected override IReadOnlyList<double>[] GetValues(int count) {
+      return Enumerable
+        .Range(0, count)
+        .Select(x => GetLiterals(interpreter.Configuration.MaxVectorLength / 2 - 1))
+        .ToArray();
+    }
+
+    protected override IReadOnlyList<double> GetLiterals(int count) {
+      return Enumerable
+        .Range(0, count)
+        .Select(x => interpreter.Configuration.ErcOptions.FloatErcOptions.GetErcValue(interpreter.Random))
+        .ToArray();
+    }
+
+    protected override void CheckOtherStacksAreEmpty() {
+      TestStackCounts(floatVectorStack: null);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/IntegerExpressionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/IntegerExpressionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/IntegerExpressionTests.cs	(revision 15771)
@@ -0,0 +1,274 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+  [TestClass]
+  public class IntegerExpressionTests : CommonTests<long> {
+    protected override string TypeName {
+      get {
+        return "INTEGER";
+      }
+    }
+
+    protected override IPushStack<long> Stack {
+      get {
+        return interpreter.IntegerStack;
+      }
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestAdd() {
+      interpreter.IntegerStack.Push(5, 5);
+      interpreter.Run(new IntegerAddExpression());
+
+      Assert.AreEqual(10, interpreter.IntegerStack.Top);
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestAddWithInsufficientArguments() {
+      TestWithInsufficientArguments("+", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestSubtract() {
+      interpreter.IntegerStack.Push(10, 5);
+      interpreter.Run(new IntegerSubtractExpression());
+
+      Assert.AreEqual(5, interpreter.IntegerStack.Top);
+
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestSubtractWithInsufficientArguments() {
+      TestWithInsufficientArguments("-", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestMultiply() {
+      interpreter.IntegerStack.Push(10, 5);
+      interpreter.Run(new IntegerMultiplyExpression());
+
+      Assert.AreEqual(50, interpreter.IntegerStack.Top);
+
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestMultiplyWithInsufficientArguments() {
+      TestWithInsufficientArguments("*", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestDivide() {
+      interpreter.IntegerStack.Push(10, 5);
+      interpreter.Run(new IntegerDivideExpression());
+
+      Assert.AreEqual(2, interpreter.IntegerStack.Top);
+
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestDivideWithInsufficientArguments() {
+      TestWithInsufficientArguments("/", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestModulo() {
+      interpreter.IntegerStack.Push(10, 5);
+      interpreter.Run(new IntegerModuloExpression());
+
+      Assert.AreEqual(0, interpreter.IntegerStack.Top);
+
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestModuloWithInsufficientArguments() {
+      TestWithInsufficientArguments("%", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestMin() {
+      interpreter.IntegerStack.Push(10, 5);
+      interpreter.Run(new IntegerMinExpression());
+
+      Assert.AreEqual(5, interpreter.IntegerStack.Top);
+
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestMinWithInsufficientArguments() {
+      TestWithInsufficientArguments("MIN", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestMax() {
+      interpreter.IntegerStack.Push(10, 5);
+      interpreter.Run(new IntegerMaxExpression());
+
+      Assert.AreEqual(10, interpreter.IntegerStack.Top);
+
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestMaxWithInsufficientArguments() {
+      TestWithInsufficientArguments("MAX", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestSmallerThan() {
+      interpreter.IntegerStack.Push(10, 5);
+      interpreter.Run(new IntegerSmallerThanExpression());
+
+      Assert.AreEqual(false, interpreter.BooleanStack.Top);
+
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestSmallerThanWithInsufficientArguments() {
+      TestWithInsufficientArguments("<", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestGreaterThan() {
+      interpreter.IntegerStack.Push(10, 5);
+      interpreter.Run(new IntegerGreaterThanExpression());
+
+      Assert.AreEqual(true, interpreter.BooleanStack.Top);
+
+      TestStackCounts(booleanStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestGreaterThanWithInsufficientArguments() {
+      TestWithInsufficientArguments(">", 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestFromBooleanTrue() {
+      interpreter.BooleanStack.Push(true);
+      interpreter.Run(new IntegerFromBooleanExpression());
+
+      Assert.AreEqual(1, interpreter.IntegerStack.Top);
+
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestFromBooleanWithInsufficientArguments() {
+      TestWithInsufficientArguments("FROMBOOLEAN");
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestFromBooleanFalse() {
+      interpreter.BooleanStack.Push(false);
+      interpreter.Run(new IntegerFromBooleanExpression());
+
+      Assert.AreEqual(0, interpreter.IntegerStack.Top);
+
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestFromFloat() {
+      interpreter.FloatStack.Push(1.5);
+      interpreter.Run(new IntegerFromFloatExpression());
+
+      Assert.AreEqual(1, interpreter.IntegerStack.Top);
+
+      TestStackCounts(integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("IntegerExpressionTest")]
+    public void TestFromFloatWithInsufficientArguments() {
+      TestWithInsufficientArguments("FROMFLOAT");
+    }
+
+    protected override long[] GetValues(int count) {
+      var values = new long[count];
+
+      for (long i = 0; i < count; i++) values[i] = i;
+
+      return values;
+    }
+
+    protected override void CheckOtherStacksAreEmpty() {
+      TestStackCounts(integerStack: null);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/IntegerVectorExpressionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/IntegerVectorExpressionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/IntegerVectorExpressionTests.cs	(revision 15771)
@@ -0,0 +1,34 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+
+  using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+  [TestClass]
+  public class IntegerVectorExpressionTests : VectorExpressionTests<long> {
+    protected override string TypeName { get { return "INTEGER[]"; } }
+
+    protected override IPushStack<IReadOnlyList<long>> Stack { get { return interpreter.IntegerVectorStack; } }
+    protected override IPushStack<long> LiteralStack { get { return interpreter.IntegerStack; } }
+
+    protected override IReadOnlyList<long>[] GetValues(int count) {
+      return Enumerable
+        .Range(0, count)
+        .Select(x => GetLiterals(interpreter.Configuration.MaxVectorLength / 2 - 1))
+        .ToArray();
+    }
+
+    protected override IReadOnlyList<long> GetLiterals(int count) {
+      return Enumerable
+        .Range(0, count)
+        .Select(x => (long)interpreter.Configuration.ErcOptions.IntegerErcOptions.GetErcValue(interpreter.Random))
+        .ToArray();
+    }
+
+    protected override void CheckOtherStacksAreEmpty() {
+      TestStackCounts(integerVectorStack: null);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/NameExpressionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/NameExpressionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/NameExpressionTests.cs	(revision 15771)
@@ -0,0 +1,82 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+
+  [TestClass]
+  public class NameExpressionTests : CommonTests<string> {
+    protected override string TypeName {
+      get {
+        return "NAME";
+      }
+    }
+
+    protected override IPushStack<string> Stack {
+      get {
+        return interpreter.NameStack;
+      }
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("NameExpressionTest")]
+    public void TestRand() {
+      configuration.ErcOptions.NameErcOptions.IsEnabled = true;
+      interpreter.Run(new NameRandExpression());
+
+      Assert.IsTrue(interpreter.NameStack.Count == 1);
+
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("NameExpressionTest")]
+    public void TestRandomBound() {
+      interpreter.CustomExpressions.Add("c1", new CodeNoopExpression());
+      interpreter.CustomExpressions.Add("c2", new CodeNoopExpression());
+      interpreter.CustomExpressions.Add("c3", new CodeNoopExpression());
+
+      interpreter.Run(new NameRandBoundNameExpression());
+
+      Assert.IsTrue(interpreter.CustomExpressions.Keys.Contains(interpreter.NameStack.Top));
+
+      CheckOtherStacksAreEmpty();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("NameExpressionTest")]
+    public void TestRandomBoundWithInsufficientArguments() {
+      TestWithInsufficientArguments("RANDBOUNDNAME");
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("NameExpressionTest")]
+    public void TestQuote() {
+      interpreter.Run(new NameQuoteExpression());
+
+      Assert.IsTrue(interpreter.IsNameQuoteFlagSet);
+
+      TestStackCounts();
+    }
+
+    protected override string[] GetValues(int count) {
+      var ng = new StringGenerator();
+      var values = new string[count];
+
+      for (var i = 0; i < count; i++) values[i] = ng.GetNext();
+
+      return values;
+    }
+
+    protected override void CheckOtherStacksAreEmpty() {
+      TestStackCounts(nameStack: null);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/PrintExpressionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/PrintExpressionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/PrintExpressionTests.cs	(revision 15771)
@@ -0,0 +1,23 @@
+﻿namespace HeuristicLab.Tests.Interpreter.Expressions {
+  using System.Globalization;
+
+  using HeuristicLab.Problems.ProgramSynthesis;
+
+  using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+  [TestClass]
+  public class PrintExpressionTests : ExpressionTest {
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("PrintExpressionTest")]
+    public void TestPrintFloat() {
+      var value = 29.561570440978656;
+      interpreter.FloatStack.Push(value);
+      interpreter.Run(new FloatPrintExpression());
+
+      Assert.AreEqual(value.ToString("R", CultureInfo.InvariantCulture), interpreter.PrintStack.ToString());
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/PushProgramTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/PushProgramTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/PushProgramTests.cs	(revision 15771)
@@ -0,0 +1,37 @@
+﻿using HeuristicLab.Problems.ProgramSynthesis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+  [TestClass]
+  public class PushProgramTests : ExpressionTest {
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("PushProgramTests")]
+    public void TotalCountTest() {
+      var program = PushParser.ParseProgram("( 5 ( INTEGER.DUP FLOAT.+ FLOAT.- ) ( EXEC.DO ( EXEC.IF ) EXEC.Y ) INTEGER.+ )");
+
+      Assert.AreEqual(12, program.TotalCount);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("PushProgramTests")]
+    public void DepthTest() {
+      var program = PushParser.ParseProgram("( 5 ( INTEGER.DUP FLOAT.+ FLOAT.- ) ( EXEC.DO ( EXEC.IF ) EXEC.Y ) INTEGER.+ )");
+
+      Assert.AreEqual(3, program.Depth);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("PushProgramTests")]
+    public void BranchesTest() {
+      var program = PushParser.ParseProgram("( 5 ( INTEGER.DUP FLOAT.+ FLOAT.- ) ( EXEC.DO ( EXEC.IF ) EXEC.Y ) INTEGER.+ )");
+
+      Assert.AreEqual(4, program.Branches);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/StandardTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/StandardTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/StandardTests.cs	(revision 15771)
@@ -0,0 +1,125 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using HeuristicLab.Problems.ProgramSynthesis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+  [TestClass]
+  public class StandardTests {
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StandartTests")]
+    public void TestGetHashCode() {
+      var expressionTypes = from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
+                            from assemblyType in domainAssembly.GetTypes()
+                            where
+                            !assemblyType.IsAbstract && assemblyType.IsSubclassOf(typeof(Expression))
+                            && (assemblyType.GetConstructor(Type.EmptyTypes) != null)
+                            select assemblyType;
+
+      var expressions = expressionTypes.Select(et => Activator.CreateInstance(et) as Expression);
+      var ids = expressions.Select(e => new { Expression = e, Id = e.GetHashCode() });
+
+      var duplicateGroups = ids.GroupBy(s => s.Id).Where(grp => grp.Count() > 2).ToList();
+
+      if (!duplicateGroups.Any())
+        return;
+
+      Debug.WriteLine("Duplicates: ");
+      foreach (var group in duplicateGroups) {
+        foreach (var duplicate in group) {
+          string name;
+          if (!ExpressionTable.TypeToNameTable.TryGetValue(duplicate.Expression.GetType(), out name)) {
+            name = duplicate.Expression.ToString();
+          }
+
+          Debug.WriteLine("Id: {0}, Expression: {1}", duplicate.Id, name);
+        }
+
+        Debug.WriteLine("");
+      }
+
+      Assert.Fail();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StandartTests")]
+    public void TestExpandGetHashCode() {
+      var expand = PushParser.Parse("( A B C D E F )");
+
+      expand.GetHashCode();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StandartTests")]
+    public void TestExecExpandCopy() {
+      var expressions = new Expression[]
+                          {
+                            new IntegerPushExpression(2), new FloatPushExpression(2.0),
+                            new BooleanPushExpression(true), new NameDefineXExecExpression("A")
+                          };
+
+      var list = new PushProgram(expressions);
+      var clone = list.Copy();
+
+      Assert.AreNotSame(list, clone);
+      Assert.AreEqual(list, clone);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StandartTests")]
+    public void TestExecExpandRecursiveCopy() {
+      var expressions = new List<Expression>
+                          {
+                            new IntegerPushExpression(2),
+                            new FloatPushExpression(2.1),
+                            new BooleanPushExpression(true),
+                            new NameDefineXExecExpression("A")
+                          };
+
+      var list = new PushProgram(expressions.ToArray());
+
+      expressions.Add(list);
+
+      var list2 = new PushProgram(expressions.ToArray());
+      var clone = list2.Copy();
+
+      Assert.AreSame(list, clone.Expressions.Last());
+      Assert.AreEqual(list, clone.Expressions.Last());
+
+      Assert.AreNotSame(list2, clone);
+      Assert.AreEqual(list2, clone);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StandartTests")]
+    public void TestExecExpandRecursiveGetHashCode() {
+      var expressions = new List<Expression>
+                          {
+                            new IntegerPushExpression(2),
+                            new FloatPushExpression(2.0),
+                            new BooleanPushExpression(true),
+                            new NameDefineXExecExpression("A")
+                          };
+
+      var list = new PushProgram(expressions.ToArray());
+
+      expressions.Add(list);
+      var list2 = new PushProgram(expressions.ToArray());
+      var list3 = new PushProgram(expressions.ToArray());
+
+      Assert.AreEqual(list2.GetHashCode(), list3.GetHashCode());
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/StringExpressionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/StringExpressionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/StringExpressionTests.cs	(revision 15771)
@@ -0,0 +1,523 @@
+﻿using System.Linq;
+using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+
+  using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+  [TestClass]
+  public class StringExpressionTests : CommonTests<string> {
+    protected override string TypeName { get { return "STRING"; } }
+
+    protected override IPushStack<string> Stack { get { return interpreter.StringStack; } }
+
+    protected override string[] GetValues(int count) {
+      return Enumerable
+        .Range(0, count)
+        .Select(_ => interpreter.Configuration.ErcOptions.StringErcOptions.GetErcValue(interpreter.Random))
+        .ToArray();
+    }
+
+    protected override void CheckOtherStacksAreEmpty() {
+      TestStackCounts(stringStack: null);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestFromInteger() {
+      interpreter.IntegerStack.Push(123, -123);
+      interpreter.Run(new StringFromIntegerExpression());
+      interpreter.Run(new StringFromIntegerExpression());
+      interpreter.Run(new StringFromIntegerExpression());
+
+      Assert.AreEqual("123", interpreter.StringStack[0]);
+      Assert.AreEqual("-123", interpreter.StringStack[1]);
+      TestStackCounts(stringStack: 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestFromFloat() {
+      interpreter.FloatStack.Push(123.45, -123.45);
+      interpreter.Run(new StringFromFloatExpression());
+      interpreter.Run(new StringFromFloatExpression());
+      interpreter.Run(new StringFromFloatExpression());
+
+      Assert.AreEqual("123.45", interpreter.StringStack[0]);
+      Assert.AreEqual("-123.45", interpreter.StringStack[1]);
+      TestStackCounts(stringStack: 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestFromBoolean() {
+      interpreter.BooleanStack.Push(true, false);
+      interpreter.Run(new StringFromBooleanExpression());
+      interpreter.Run(new StringFromBooleanExpression());
+
+      Assert.AreEqual("True", interpreter.StringStack[0]);
+      Assert.AreEqual("False", interpreter.StringStack[1]);
+      TestStackCounts(stringStack: 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestFromChar() {
+      interpreter.CharStack.Push(' ', 'a');
+      interpreter.Run(new StringFromCharExpression());
+      interpreter.Run(new StringFromCharExpression());
+
+      Assert.AreEqual(" ", interpreter.StringStack[0]);
+      Assert.AreEqual("a", interpreter.StringStack[1]);
+      TestStackCounts(stringStack: 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestConcat() {
+      interpreter.StringStack.Push("test", "123");
+      interpreter.Run(new StringConcatExpression());
+
+      Assert.AreEqual("test123", interpreter.StringStack[0]);
+      TestStackCounts(stringStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestConjChar() {
+      interpreter.CharStack.Push('3', '2', '1');
+      interpreter.StringStack.Push("test");
+
+      interpreter.Run(new StringConjCharExpression());
+      interpreter.Run(new StringConjCharExpression());
+      interpreter.Run(new StringConjCharExpression());
+
+      Assert.AreEqual("test123", interpreter.StringStack[0]);
+      TestStackCounts(stringStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestTake() {
+      interpreter.IntegerStack.Push(3, -3, 7, 0);
+
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new StringTakeExpression());
+      Assert.AreEqual("", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new StringTakeExpression());
+      Assert.AreEqual("tes", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new StringTakeExpression());
+      Assert.AreEqual("tes", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new StringTakeExpression());
+      Assert.AreEqual("tes", interpreter.StringStack[0]);
+
+      TestStackCounts(stringStack: 4);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestFirst() {
+      interpreter.StringStack.Push("test");
+
+      interpreter.Run(new StringFirstExpression());
+
+      Assert.AreEqual("t", interpreter.StringStack[0]);
+      TestStackCounts(stringStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestLast() {
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new StringLastExpression());
+
+      Assert.AreEqual("t", interpreter.StringStack[0]);
+      TestStackCounts(stringStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestNth() {
+      interpreter.IntegerStack.Push(2, -2, 6);
+
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new StringNthExpression());
+      Assert.AreEqual("s", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new StringNthExpression());
+      Assert.AreEqual("s", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new StringNthExpression());
+      Assert.AreEqual("s", interpreter.StringStack[0]);
+
+      TestStackCounts(stringStack: 3);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestRest() {
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new StringRestExpression());
+
+      Assert.AreEqual("est", interpreter.StringStack[0]);
+      TestStackCounts(stringStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestButLast() {
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new StringButLastExpression());
+
+      Assert.AreEqual("tes", interpreter.StringStack[0]);
+      TestStackCounts(stringStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestLength() {
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new StringLengthExpression());
+
+      Assert.AreEqual(4, interpreter.IntegerStack.Top);
+      TestStackCounts(stringStack: 0, integerStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestReverse() {
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new StringReverseExpression());
+
+      Assert.AreEqual("tset", interpreter.StringStack[0]);
+      TestStackCounts(stringStack: 1);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestParseToChars() {
+      interpreter.StringStack.Push("test");
+      interpreter.Run(new StringParseToCharsExpression());
+
+      Assert.AreEqual("t", interpreter.StringStack[0]);
+      Assert.AreEqual("s", interpreter.StringStack[1]);
+      Assert.AreEqual("e", interpreter.StringStack[2]);
+      Assert.AreEqual("t", interpreter.StringStack[3]);
+      TestStackCounts(stringStack: 4);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestSplit() {
+      interpreter.StringStack.Push("test1 test2");
+      interpreter.Run(new StringSplitExpression());
+
+      Assert.AreEqual("test1", interpreter.StringStack[0]);
+      Assert.AreEqual("test2", interpreter.StringStack[1]);
+      TestStackCounts(stringStack: 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestEmptyString() {
+      interpreter.StringStack.Push("test1", "");
+      interpreter.Run(new StringEmptyStringExpression());
+      interpreter.Run(new StringEmptyStringExpression());
+
+      Assert.AreEqual(false, interpreter.BooleanStack[0]);
+      Assert.AreEqual(true, interpreter.BooleanStack[1]);
+      TestStackCounts(stringStack: 0, booleanStack: 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestContains() {
+      interpreter.StringStack.Push(new[] { "test1", "est", "test", "abc", "test", "" });
+      interpreter.Run(new StringContainsExpression());
+      interpreter.Run(new StringContainsExpression());
+      interpreter.Run(new StringContainsExpression());
+
+      Assert.AreEqual(true, interpreter.BooleanStack[0]);
+      Assert.AreEqual(false, interpreter.BooleanStack[1]);
+      Assert.AreEqual(true, interpreter.BooleanStack[2]);
+      TestStackCounts(stringStack: 0, booleanStack: 3);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestContainsChar() {
+      interpreter.CharStack.Push('e', 'a');
+      interpreter.StringStack.Push("test", "test");
+      interpreter.Run(new StringContainsCharExpression());
+      interpreter.Run(new StringContainsCharExpression());
+
+      Assert.AreEqual(true, interpreter.BooleanStack[0]);
+      Assert.AreEqual(false, interpreter.BooleanStack[1]);
+      TestStackCounts(stringStack: 0, charStack: 0, booleanStack: 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestIndexOfChar() {
+      interpreter.CharStack.Push('e', 'a');
+      interpreter.StringStack.Push("test", "test");
+      interpreter.Run(new StringIndexOfCharExpression());
+      interpreter.Run(new StringIndexOfCharExpression());
+
+      Assert.AreEqual(1, interpreter.IntegerStack[0]);
+      Assert.AreEqual(-1, interpreter.IntegerStack[1]);
+      TestStackCounts(stringStack: 0, charStack: 0, integerStack: 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestOccurrencesOfChar() {
+      interpreter.CharStack.Push('t', 'a');
+      interpreter.StringStack.Push("test", "test");
+      interpreter.Run(new StringOccurrencesOfCharExpression());
+      interpreter.Run(new StringOccurrencesOfCharExpression());
+
+      Assert.AreEqual(2, interpreter.IntegerStack[0]);
+      Assert.AreEqual(0, interpreter.IntegerStack[1]);
+      TestStackCounts(stringStack: 0, charStack: 0, integerStack: 2);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestReplace() {
+      interpreter.StringStack.Push("test", "es", "12");
+      interpreter.Run(new StringReplaceExpression());
+      Assert.AreEqual("t12t", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test test", "es", "12");
+      interpreter.Run(new StringReplaceExpression());
+      Assert.AreEqual("t12t t12t", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test", "ab", "12");
+      interpreter.Run(new StringReplaceExpression());
+      Assert.AreEqual("test", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test", "", "12");
+      interpreter.Run(new StringReplaceExpression());
+      Assert.AreEqual("test", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test", "ab", "");
+      interpreter.Run(new StringReplaceExpression());
+      Assert.AreEqual("test", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test", "es", "");
+      interpreter.Run(new StringReplaceExpression());
+      Assert.AreEqual("tt", interpreter.StringStack[0]);
+
+      TestStackCounts(stringStack: 6);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestReplaceFirst() {
+      interpreter.StringStack.Push("test", "es", "12");
+      interpreter.Run(new StringReplaceFirstExpression());
+      Assert.AreEqual("t12t", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test test", "es", "12");
+      interpreter.Run(new StringReplaceFirstExpression());
+      Assert.AreEqual("t12t test", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test", "ab", "12");
+      interpreter.Run(new StringReplaceFirstExpression());
+      Assert.AreEqual("test", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test", "", "12");
+      interpreter.Run(new StringReplaceFirstExpression());
+      Assert.AreEqual("test", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test", "ab", "");
+      interpreter.Run(new StringReplaceFirstExpression());
+      Assert.AreEqual("test", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test", "es", "");
+      interpreter.Run(new StringReplaceFirstExpression());
+      Assert.AreEqual("tt", interpreter.StringStack[0]);
+
+      TestStackCounts(stringStack: 6);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestReplaceChar() {
+      interpreter.StringStack.Push("test");
+      interpreter.CharStack.Push('t', 'T');
+      interpreter.Run(new StringReplaceCharExpression());
+      Assert.AreEqual("TesT", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test");
+      interpreter.CharStack.Push('a', 'T');
+      interpreter.Run(new StringReplaceCharExpression());
+      Assert.AreEqual("test", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("");
+      interpreter.CharStack.Push('t', 'T');
+      interpreter.Run(new StringReplaceCharExpression());
+      Assert.AreEqual("", interpreter.StringStack[0]);
+
+      TestStackCounts(stringStack: 3);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestReplaceFirstChar() {
+      interpreter.StringStack.Push("test");
+      interpreter.CharStack.Push('t', 'T');
+      interpreter.Run(new StringReplaceFirstCharExpression());
+      Assert.AreEqual("Test", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test");
+      interpreter.CharStack.Push('a', 'T');
+      interpreter.Run(new StringReplaceFirstCharExpression());
+      Assert.AreEqual("test", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("");
+      interpreter.CharStack.Push('t', 'T');
+      interpreter.Run(new StringReplaceFirstCharExpression());
+      Assert.AreEqual("", interpreter.StringStack[0]);
+
+      TestStackCounts(stringStack: 3);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestRemoveChar() {
+      interpreter.StringStack.Push("test");
+      interpreter.CharStack.Push('t');
+      interpreter.Run(new StringRemoveCharExpression());
+      Assert.AreEqual("es", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test");
+      interpreter.CharStack.Push('a');
+      interpreter.Run(new StringRemoveCharExpression());
+      Assert.AreEqual("test", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("");
+      interpreter.CharStack.Push('t');
+      interpreter.Run(new StringRemoveCharExpression());
+      Assert.AreEqual("", interpreter.StringStack[0]);
+
+      TestStackCounts(stringStack: 3);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestSetChar() {
+      interpreter.StringStack.Push("test");
+      interpreter.CharStack.Push('x');
+      interpreter.IntegerStack.Push(2);
+      interpreter.Run(new StringSetCharExpression());
+      Assert.AreEqual("text", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test");
+      interpreter.CharStack.Push('x');
+      interpreter.IntegerStack.Push(-2);
+      interpreter.Run(new StringSetCharExpression());
+      Assert.AreEqual("text", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("test");
+      interpreter.CharStack.Push('x');
+      interpreter.IntegerStack.Push(6);
+      interpreter.Run(new StringSetCharExpression());
+      Assert.AreEqual("text", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("");
+      interpreter.CharStack.Push('x');
+      interpreter.IntegerStack.Push(2);
+      interpreter.Run(new StringSetCharExpression());
+      Assert.AreEqual("", interpreter.StringStack[0]);
+
+      interpreter.StringStack.Push("s");
+      interpreter.CharStack.Push('x');
+      interpreter.IntegerStack.Push(2);
+      interpreter.Run(new StringSetCharExpression());
+      Assert.AreEqual("x", interpreter.StringStack[0]);
+
+      TestStackCounts(stringStack: 5);
+    }
+
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("StringExpressionTest")]
+    public void TestIterate() {
+      interpreter.StringStack.Push("test");
+      interpreter.IntegerStack.Push(0);
+      interpreter.Run(new PushProgram(new Expression[] {
+        new IntegerIncExpression(),
+        new StringIterateExpression(),
+      }));
+
+      Assert.AreEqual(4, interpreter.IntegerStack[0]);
+      TestStackCounts(integerStack: 1, charStack: 4);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/StringVectorExpressionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/StringVectorExpressionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/StringVectorExpressionTests.cs	(revision 15771)
@@ -0,0 +1,32 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Problems.ProgramSynthesis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Interpreter.Expressions {
+  [TestClass]
+  public class StringVectorExpressionTests : VectorExpressionTests<string> {
+    protected override string TypeName { get { return "STRING[]"; } }
+
+    protected override IPushStack<IReadOnlyList<string>> Stack { get { return interpreter.StringVectorStack; } }
+    protected override IPushStack<string> LiteralStack { get { return interpreter.StringStack; } }
+
+    protected override IReadOnlyList<string>[] GetValues(int count) {
+      return Enumerable
+        .Range(0, count)
+        .Select(x => GetLiterals(interpreter.Configuration.MaxVectorLength / 2 - 1))
+        .ToArray();
+    }
+
+    protected override IReadOnlyList<string> GetLiterals(int count) {
+      return Enumerable
+        .Range(0, count)
+        .Select(x => interpreter.Configuration.ErcOptions.StringErcOptions.GetErcValue(interpreter.Random))
+        .ToArray();
+    }
+
+    protected override void CheckOtherStacksAreEmpty() {
+      TestStackCounts(stringVectorStack: null);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/VectorExpressionTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/VectorExpressionTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Interpreter/Expressions/VectorExpressionTests.cs	(revision 15771)
@@ -0,0 +1,451 @@
+﻿namespace HeuristicLab.Tests.Interpreter.Expressions {
+  using System.Collections.Generic;
+  using System.Linq;
+  using HeuristicLab.Problems.ProgramSynthesis;
+  using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+  public abstract class VectorExpressionTests<T> : CommonTests<IReadOnlyList<T>> {
+
+    protected abstract IPushStack<T> LiteralStack { get; }
+    protected abstract IReadOnlyList<T> GetLiterals(int count);
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorButLast() {
+      var vector = GetValues(1)[0];
+      Stack.Push(vector);
+
+      var result = vector.Take(vector.Count - 1);
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".BUTLAST");
+      interpreter.Run(expression);
+
+      Assert.IsTrue(result.SequenceEqual(Stack.Top));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorConcat() {
+      var vectors = GetValues(2);
+      Stack.Push(vectors);
+
+      var result = vectors.SelectMany(x => x);
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".CONCAT");
+      interpreter.Run(expression);
+
+      Assert.IsTrue(result.SequenceEqual(Stack.Top));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorConj() {
+      var vectors = GetValues(1);
+      var literals = GetLiterals(1);
+
+      Stack.Push(vectors);
+      LiteralStack.Push(literals);
+
+      var result = new List<T>(vectors[0]);
+      result.AddRange(literals);
+
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".CONJ");
+      interpreter.Run(expression);
+
+      Assert.IsTrue(result.SequenceEqual(Stack.Top));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorContains() {
+      var vectors = Get2Different();
+      var literalContained = vectors[0].Last();
+      var literalNotContained = vectors[1].FirstOrDefault(x => !vectors[0].Contains(x));
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".CONTAINS");
+
+      Stack.Push(vectors[0], vectors[0]);
+      LiteralStack.Push(literalContained, literalNotContained);
+
+      interpreter.Run(expression);
+      interpreter.Run(expression);
+
+      Assert.IsTrue(interpreter.BooleanStack[0]);
+      Assert.IsFalse(interpreter.BooleanStack[1]);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorEmpty() {
+      var emptyVector = new List<T>();
+      var noneEmptyVector = GetValues(1)[0];
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".EMPTYVECTOR");
+
+      Stack.Push(emptyVector, noneEmptyVector);
+      interpreter.Run(expression);
+      interpreter.Run(expression);
+
+      Assert.IsTrue(interpreter.BooleanStack[0]);
+      Assert.IsFalse(interpreter.BooleanStack[1]);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorFirst() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".FIRST");
+
+      Stack.Push(emptyVector);
+      interpreter.Run(expression);
+      Assert.IsTrue(LiteralStack.IsEmpty);
+
+      Stack.Push(vector);
+      interpreter.Run(expression);
+      Assert.AreEqual(vector.First(), LiteralStack.Top);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorIndexOf() {
+      var vector = GetValues(1)[0].Distinct().ToList();
+      var emptyVector = new List<T>();
+      var literal = vector.Last();
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".INDEXOF");
+
+      Stack.Push(emptyVector);
+      LiteralStack.Push(literal);
+      interpreter.Run(expression);
+      Assert.IsTrue(LiteralStack == interpreter.IntegerStack ? LiteralStack.Count == 1 : LiteralStack.IsEmpty);
+
+      Stack.Push(vector);
+      LiteralStack.Push(literal);
+      interpreter.Run(expression);
+      Assert.AreEqual(vector.Count - 1, interpreter.IntegerStack.Top);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorIterate() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".ITERATE");
+      var bodyExpression = new ExecNoopExpression();
+
+      Stack.Push(emptyVector);
+      interpreter.Run(new PushProgram(new[] { expression, bodyExpression }));
+      Assert.IsTrue(LiteralStack.IsEmpty);
+      Assert.AreEqual(0, Stack.Top.Count);
+
+      Stack.Push(vector);
+      interpreter.Run(new PushProgram(new[] { bodyExpression, expression }));
+      Assert.AreEqual(vector.Count, LiteralStack.Count);
+      Assert.IsTrue(LiteralStack.Reverse().SequenceEqual(vector));
+    }
+
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorLast() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".LAST");
+
+      Stack.Push(emptyVector);
+      interpreter.Run(expression);
+      Assert.IsTrue(LiteralStack.IsEmpty);
+
+      Stack.Push(vector);
+      interpreter.Run(expression);
+      Assert.AreEqual(vector.Last(), LiteralStack.Top);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorLength() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".LENGTH");
+
+      Stack.Push(emptyVector);
+      interpreter.Run(expression);
+      Assert.AreEqual(0, interpreter.IntegerStack.Top);
+
+      Stack.Push(vector);
+      interpreter.Run(expression);
+      Assert.AreEqual(vector.Count, interpreter.IntegerStack.Top);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorNth() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var index = vector.Count / 2;
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".NTH");
+
+      Stack.Push(emptyVector);
+      interpreter.IntegerStack.Push(index);
+      interpreter.Run(expression);
+      Assert.IsTrue(LiteralStack == interpreter.IntegerStack ? LiteralStack.Count == 1 : LiteralStack.IsEmpty);
+
+      Stack.Push(vector);
+      interpreter.IntegerStack.Push(index);
+      interpreter.Run(expression);
+      Assert.AreEqual(vector[index], LiteralStack.Top);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorOccurrenceOf() {
+      var vector = GetValues(1)[0];
+      var literal = vector.Last();
+      var result = vector.Count(x => x.Equals(literal));
+      var emptyVector = new List<T>();
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".OCCURRENCEOF");
+
+      Stack.Push(emptyVector);
+      LiteralStack.Push(literal);
+      interpreter.Run(expression);
+      Assert.AreEqual(0, interpreter.IntegerStack.Top);
+
+      Stack.Push(vector);
+      LiteralStack.Push(literal);
+      interpreter.Run(expression);
+      Assert.AreEqual(result, interpreter.IntegerStack.Top);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorPushAll() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".PUSHALL");
+
+      Stack.Push(emptyVector);
+      interpreter.Run(expression);
+      Assert.IsTrue(LiteralStack.IsEmpty);
+
+      Stack.Push(vector);
+      interpreter.Run(expression);
+      Assert.IsTrue(LiteralStack.Reverse().SequenceEqual(vector));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorRemove() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var literal = vector.Last();
+      var result = vector.Where(x => !x.Equals(literal));
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".REMOVE");
+
+      Stack.Push(emptyVector);
+      LiteralStack.Push(literal);
+      interpreter.Run(expression);
+      Assert.AreEqual(0, Stack.Top.Count);
+
+      Stack.Push(vector);
+      LiteralStack.Push(literal);
+      interpreter.Run(expression);
+      Assert.IsTrue(Stack.Top.SequenceEqual(result));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorReplace() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var literal = vector.Last();
+      var literalTarget = vector.First();
+      var result = vector.Select(x => x.Equals(literal) ? literalTarget : x);
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".REPLACE");
+
+      Stack.Push(emptyVector);
+      LiteralStack.Push(literal, literalTarget);
+      interpreter.Run(expression);
+      Assert.AreEqual(0, Stack.Top.Count);
+
+      Stack.Push(vector);
+      LiteralStack.Push(literal, literalTarget);
+      interpreter.Run(expression);
+      Assert.IsTrue(Stack.Top.SequenceEqual(result));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorReplaceFirst() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var literal = vector.Last();
+      var literalTarget = vector.First(x => !x.Equals(literal));
+      var firstReplaced = false;
+      var result = vector.Select(x => {
+        if (!x.Equals(literal) || firstReplaced) return x;
+        firstReplaced = true;
+        return literalTarget;
+      }).ToArray();
+
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".REPLACEFIRST");
+
+      Stack.Push(emptyVector);
+      LiteralStack.Push(literal, literalTarget);
+      interpreter.Run(expression);
+      Assert.AreEqual(0, Stack.Top.Count);
+
+      Stack.Push(vector);
+      LiteralStack.Push(literal, literalTarget);
+      interpreter.Run(expression);
+      Assert.IsTrue(Stack.Top.SequenceEqual(result));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorRest() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var result = vector.Skip(1);
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".REST");
+
+      Stack.Push(emptyVector);
+      interpreter.Run(expression);
+      Assert.AreEqual(0, Stack.Top.Count);
+
+      Stack.Push(vector);
+      interpreter.Run(expression);
+      Assert.IsTrue(Stack.Top.SequenceEqual(result));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorReverse() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var result = new List<T>(vector);
+      result.Reverse();
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".REVERSE");
+
+      Stack.Push(emptyVector);
+      interpreter.Run(expression);
+      Assert.AreEqual(emptyVector, Stack.Top);
+
+      Stack.Push(vector);
+      interpreter.Run(expression);
+      Assert.IsTrue(Stack.Top.SequenceEqual(result));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorSet() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var index = vector.Count / 2;
+      var literal = vector.Last();
+      var result = vector.ToArray();
+      result[index] = literal;
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".SET");
+
+      Stack.Push(emptyVector);
+      LiteralStack.Push(literal);
+      interpreter.IntegerStack.Push(index);
+      interpreter.Run(expression);
+      Assert.AreEqual(emptyVector, Stack.Top);
+
+      Stack.Push(vector);
+      interpreter.IntegerStack.Push(index);
+      LiteralStack.Push(literal);
+      interpreter.Run(expression);
+      Assert.IsTrue(Stack.Top.SequenceEqual(result));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorSub() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var start = 0;
+      var end = vector.Count / 2;
+      var result = vector.Skip(start).Take(end).ToArray();
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".SUB");
+
+      Stack.Push(emptyVector);
+      interpreter.IntegerStack.Push(start, end);
+      interpreter.Run(expression);
+      Assert.AreEqual(emptyVector, Stack.Top);
+
+      Stack.Push(vector);
+      interpreter.IntegerStack.Push(start, end);
+      interpreter.Run(expression);
+      Assert.IsTrue(Stack.Top.SequenceEqual(result));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ExpressionTest")]
+    [TestCategory("VectorExpressionTest")]
+    public void TestVectorTake() {
+      var vector = GetValues(1)[0];
+      var emptyVector = new List<T>();
+      var count = vector.Count / 2;
+      var result = vector.Take(count).ToArray();
+      var expression = ExpressionTable.GetStatelessExpression(TypeName + ".TAKE");
+
+      Stack.Push(emptyVector);
+      interpreter.IntegerStack.Push(count);
+      interpreter.Run(expression);
+      Assert.AreEqual(emptyVector, Stack.Top);
+
+      Stack.Push(vector);
+      interpreter.IntegerStack.Push(count);
+      interpreter.Run(expression);
+      Assert.IsTrue(Stack.Top.SequenceEqual(result));
+
+      Stack.Push(vector);
+      interpreter.IntegerStack.Push(count * -1);
+      interpreter.Run(expression);
+      Assert.IsTrue(Stack.Top.SequenceEqual(result));
+
+      Stack.Push(vector);
+      interpreter.IntegerStack.Push(count + vector.Count);
+      interpreter.Run(expression);
+      Assert.IsTrue(Stack.Top.SequenceEqual(result));
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Problem/DeterministicTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Problem/DeterministicTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Problem/DeterministicTests.cs	(revision 15771)
@@ -0,0 +1,95 @@
+﻿using System;
+using System.Linq;
+
+namespace HeuristicLab.Tests.Problem {
+  using System.Threading;
+
+  using HeuristicLab.Algorithms.GeneticAlgorithm;
+  using HeuristicLab.BenchmarkSuite.Problems;
+  using HeuristicLab.Data;
+  using HeuristicLab.Encodings.IntegerVectorEncoding;
+  using HeuristicLab.Optimization;
+  using HeuristicLab.ParallelEngine;
+  using HeuristicLab.Problems.ProgramSynthesis;
+
+  using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+  [TestClass]
+  public class DeterministicTests {
+
+    [TestMethod]
+    [TestCategory("Problem")]
+    [TestProperty("Time", "long")]
+    public void TestMedian() {
+      var ga = GetAlgorithm();
+
+      RunAlgorithm(ga);
+    }
+
+    [TestMethod]
+    [TestCategory("Problem")]
+    [TestProperty("Time", "long")]
+    public void TestSimilarResult() {
+      var ga1 = GetAlgorithm();
+      var ga2 = GetAlgorithm();
+
+      RunAlgorithm(ga1);
+      RunAlgorithm(ga2);
+
+      var bestQuality1 = GetDoubleResult(ga1, "BestQuality");
+      var bestQuality2 = GetDoubleResult(ga2, "BestQuality");
+      Assert.AreEqual(bestQuality1, bestQuality2, 0.000001);
+
+      //var currentAverageQuality1 = GetDoubleResult(ga1, "CurrentAverageQuality");
+      //var currentAverageQuality2 = GetDoubleResult(ga2, "CurrentAverageQuality");
+      //Assert.AreEqual(currentAverageQuality1, currentAverageQuality2, 0.01);
+
+      var currentWorstQuality1 = GetDoubleResult(ga1, "CurrentWorstQuality");
+      var currentWorstQuality2 = GetDoubleResult(ga2, "CurrentWorstQuality");
+      Assert.AreEqual(currentWorstQuality1, currentWorstQuality2, 0.000001);
+    }
+
+    public static IAlgorithm GetAlgorithm() {
+      var ga = new GeneticAlgorithm();
+
+      var instance = new Median();
+      var problemData = instance.CreateProblemData();
+      var pushProblem = new IntegerVectorPushBenchmarkSuiteProblem();
+
+      pushProblem.Load(problemData);
+
+      ga.Problem = pushProblem;
+      pushProblem.Encoding.Length = 100;
+
+      ga.Crossover = ga.CrossoverParameter.ValidValues.OfType<SinglePointCrossover>().First();
+      ga.Selector = ga.SelectorParameter.ValidValues.OfType<LexicaseSelector>().First();
+      ga.Mutator = ga.MutatorParameter.ValidValues.OfType<UniformSomePositionsManipulator>().First();
+
+      ga.Seed.Value = 1337;
+      ga.SetSeedRandomly.Value = false;
+      ga.MutationProbability.Value = 0.05;
+      ga.PopulationSize.Value = 1000;
+      ga.MaximumGenerations.Value = 10;
+
+      ga.Engine = new ParallelEngine();
+
+      return ga;
+    }
+
+    public static void RunAlgorithm(IAlgorithm a) {
+      var trigger = new EventWaitHandle(false, EventResetMode.ManualReset);
+      Exception ex = null;
+      a.Stopped += (src, e) => trigger.Set();
+      a.ExceptionOccurred += (src, e) => { ex = e.Value; trigger.Set(); };
+      a.Prepare();
+      a.Start();
+      trigger.WaitOne();
+
+      Assert.AreEqual(ex, null);
+    }
+
+    public static double GetDoubleResult(IAlgorithm a, string resultName) {
+      return ((DoubleValue)a.Results[resultName].Value).Value;
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Problem/IndividualMapperTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Problem/IndividualMapperTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Problem/IndividualMapperTests.cs	(revision 15771)
@@ -0,0 +1,94 @@
+﻿using System;
+using System.Diagnostics;
+using System.Linq;
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Problems.ProgramSynthesis;
+using HeuristicLab.Random;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Problem {
+  [TestClass]
+  public class IndividualMapperTests {
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("Individual")]
+    public void TestRandomReset() {
+      var random = new MersenneTwister(1337);
+      var config = new PushConfiguration {
+        ErcOptions = new ErcOptions {
+          ErcProbability = 0.05,
+          IntegerErcOptions = new IntegerErcOptions(
+            new IntegerConstantErc(0),
+            new IntegerRangeErc(-1000, 100))
+        }
+      };
+
+      var vector = new IntegerVector(10000, random, 0, config.EnabledExpressions.Count);
+      var randomPool = new ObjectPool<IRandom>(() => new MersenneTwister());
+      var pool = new PushInterpreterPool(config);
+
+      var programs = Enumerable.Range(0, Environment.ProcessorCount)
+        .AsParallel()
+        .Select(i => vector.ToPushProgram(config))
+        .ToArray();
+
+      var referenceProgram = vector.ToPushProgram(config);
+      Assert.IsTrue(programs.All(p => p.Equals(referenceProgram)));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("Individual")]
+    public void TestPlushToProgram() {
+      var random = new MersenneTwister();
+      var config = new PushConfiguration {
+        CloseBiasLevel = 4
+      };
+
+      config.DisableStack(StackTypes.Name);
+      config.DisableStack(StackTypes.Float);
+      config.DisableStack(StackTypes.Code);
+      config.DisableStack(StackTypes.Boolean);
+      config.DisableStack(StackTypes.IntegerVector);
+      config.DisableStack(StackTypes.FloatVector);
+      config.DisableStack(StackTypes.StringVector);
+      config.DisableStack(StackTypes.BooleanVector);
+
+      var sw = new Stopwatch();
+      var vector = new IntegerVector(100, random, 0, config.EnabledExpressions.Count);
+
+      sw.Start();
+      var program = vector.ToPushProgram(config);
+      sw.Stop();
+
+      Console.WriteLine(@"Duration: {0}ms", sw.ElapsedMilliseconds);
+      Assert.AreEqual(vector.Length, program.TotalInstructionCount);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("Individual")]
+    public void PlushToPushProgram() {
+      var plushGenome = new PlushVector();
+
+      plushGenome.Add(new PlushEntry { Instruction = new ExecDoTimesExpression(), Close = 0 });
+      plushGenome.Add(new PlushEntry { Instruction = new IntegerPushExpression(8), Close = 0 });
+      plushGenome.Add(new PlushEntry { Instruction = new IntegerPushExpression(11), Close = 3 });
+      plushGenome.Add(new PlushEntry { Instruction = new IntegerAddExpression(), Close = 3, Silent = true });
+      plushGenome.Add(new PlushEntry { Instruction = new ExecIfExpression(), Close = 1 });
+      plushGenome.Add(new PlushEntry { Instruction = new IntegerPushExpression(17), Close = 0 });
+      plushGenome.Add(new PlushEntry { Instruction = new BooleanPushExpression(false), Close = 0 });
+      plushGenome.Add(new PlushEntry { Instruction = new CodeQuoteExpression(), Close = 0 });
+      plushGenome.Add(new PlushEntry { Instruction = new FloatMultiplyExpression(), Close = 2 });
+      plushGenome.Add(new PlushEntry { Instruction = new ExecRotateExpression(), Close = 0 });
+      plushGenome.Add(new PlushEntry { Instruction = new FloatPushExpression(34.44), Close = 0 });
+
+      var expected = PushParser.ParseProgram("( EXEC.DO*TIMES ( 8 11 ) EXEC.IF ( ) ( 17 false CODE.QUOTE ( FLOAT.* ) ) EXEC.ROT ( 34.44 ) ( ) ( ) )");
+
+      Assert.AreEqual(expected, plushGenome.PushProgram);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Properties/AssemblyInfo.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Properties/AssemblyInfo.cs	(revision 15771)
@@ -0,0 +1,39 @@
+﻿using System.Reflection;
+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.Tests")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.Tests")]
+[assembly: AssemblyCopyright("Copyright ©  2016")]
+[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("117b7d68-ed7d-4350-996b-9ca15259e107")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Simplifier/SimplifierTests.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Simplifier/SimplifierTests.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/Simplifier/SimplifierTests.cs	(revision 15771)
@@ -0,0 +1,45 @@
+﻿using System;
+using HeuristicLab.Problems.ProgramSynthesis;
+using HeuristicLab.Random;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests.Simplifier {
+  [TestClass]
+  public class SimplifierTests {
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("Simplifier")]
+    public void SimplifySubProgramsTest() {
+      var program = PushParser.ParseProgram("( ( ( ( ( 1 ) ) ) ) )");
+      var result = PushParser.ParseProgram("( 1 )");
+      var simplerProgram = HeuristicLab.Problems.ProgramSynthesis.Simplifier.SimplifySubPrograms(program);
+
+      Console.WriteLine(simplerProgram);
+      Assert.AreEqual(result, simplerProgram);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("Simplifier")]
+    public void RemoveUnnecessaryExpressionsTest() {
+      var program = PushParser.ParseProgram("( 5 ( INTEGER.DUP FLOAT.+ FLOAT.- ) ( EXEC.DO ( EXEC.IF ) EXEC.Y ) INTEGER.+ )");
+      var result = PushParser.ParseProgram("( 5 INTEGER.DUP INTEGER.+ )");
+      var pool = new PushInterpreterPool();
+      var random = new MersenneTwister(1337);
+
+      Func<PushProgram, double> evaluator = p => {
+        using (var interpreter = pool.Create(random)) {
+          interpreter.Run(p);
+          return interpreter.IntegerStack.IsEmpty
+            ? double.MaxValue
+            : Math.Abs(interpreter.IntegerStack.Top - 10);
+        }
+      };
+
+      var simplerProgram = HeuristicLab.Problems.ProgramSynthesis.Simplifier.Simplify(program, pool.PushConfiguration, evaluator);
+
+      Console.WriteLine(simplerProgram);
+      Assert.AreEqual(result, simplerProgram);
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/packages.config
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/packages.config	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Tests/packages.config	(revision 15771)
@@ -0,0 +1,4 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="JetBrains.dotMemoryUnit" version="2.3.20160517.113140" targetFramework="net45" />
+</packages>
Index: /branches/2895_PushGP_GenealogyAnalysis/PushGP.Cli/App.config
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/PushGP.Cli/App.config	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/PushGP.Cli/App.config	(revision 15771)
@@ -0,0 +1,6 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <startup>
+    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
+  </startup>
+</configuration>
Index: /branches/2895_PushGP_GenealogyAnalysis/PushGP.Cli/Program.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/PushGP.Cli/Program.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/PushGP.Cli/Program.cs	(revision 15771)
@@ -0,0 +1,73 @@
+﻿using System;
+using System.Threading.Tasks;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Problems.ProgramSynthesis;
+
+namespace HeuristicLab.Algorithms.PushGP.Cli {
+
+  class Program {
+    static void Main(string[] args) {
+      string code = null;
+
+      if (args.Length == 0) {
+        var lines = new List<string>();
+
+        Console.WriteLine(@"Program: ( must start with '(' and end with ')' )");
+
+        var bracesCount = 0;
+        var linesRead = 0;
+
+        while (bracesCount > 0 || lines.Count == 0 || linesRead == 0) {
+          var line = Console.ReadLine();
+          linesRead++;
+
+          if (string.IsNullOrWhiteSpace(line))
+            continue;
+
+          line = line.Trim();
+          lines.Add(line);
+
+          var openBraces = line.Count(c => c == PushEnvironment.ProgramStartSymbol);
+          var closeBraces = line.Count(c => c == PushEnvironment.ProgramEndSymbol);
+          bracesCount += openBraces - closeBraces;
+        }
+
+        code = string.Join(" ", lines);
+      } else {
+        code = args[0];
+      }
+
+      EvaluateStepwise(code).Wait();
+
+      Console.WriteLine(@"Press any key to terminate...");
+    }
+
+    static async Task EvaluateStepwise(string code) {
+      var interpreter = new PushInterpreter(new PushConfiguration {
+        TopLevelPushCode = false
+      });
+
+      Console.WriteLine(@"Press ESC to cancel, SPACE to resume, Any other key to step...");
+      interpreter.Run(code, true);
+
+      while (!interpreter.IsCompleted) {
+        Console.Clear();
+        interpreter.PrintStacks();
+        interpreter.Step();
+
+        var input = Console.ReadKey();
+        if (input.Key == ConsoleKey.Escape) {
+          break;
+        }
+
+        if (input.Key == ConsoleKey.Spacebar) {
+          await interpreter.ResumeAsync();
+        }
+      }
+
+      Console.Clear();
+      interpreter.PrintStacks();
+    }
+  }
+}
Index: /branches/2895_PushGP_GenealogyAnalysis/PushGP.Cli/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/PushGP.Cli/Properties/AssemblyInfo.cs	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/PushGP.Cli/Properties/AssemblyInfo.cs	(revision 15771)
@@ -0,0 +1,36 @@
+﻿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.Algorithms.PushGP.Cli")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.Algorithms.PushGP.Cli")]
+[assembly: AssemblyCopyright("Copyright ©  2016")]
+[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("293fd718-99e9-4f6a-a0ec-343c92d0b03e")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/2895_PushGP_GenealogyAnalysis/PushGP.Cli/Push.Cli.csproj
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/PushGP.Cli/Push.Cli.csproj	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/PushGP.Cli/Push.Cli.csproj	(revision 15771)
@@ -0,0 +1,81 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.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>{293FD718-99E9-4F6A-A0EC-343C92D0B03E}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Algorithms.PushGP.Cli</RootNamespace>
+    <AssemblyName>HeuristicLab.Algorithms.PushGP.Cli</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <LangVersion>5</LangVersion>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Problems.ProgramSynthesis\HeuristicLab.Problems.ProgramSynthesis.csproj">
+      <Project>{5C93448C-47E3-4C3F-B1D0-EE62A48C3204}</Project>
+      <Name>HeuristicLab.Problems.ProgramSynthesis</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- 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/2895_PushGP_GenealogyAnalysis/PushGp.sln
===================================================================
--- /branches/2895_PushGP_GenealogyAnalysis/PushGp.sln	(revision 15771)
+++ /branches/2895_PushGP_GenealogyAnalysis/PushGp.sln	(revision 15771)
@@ -0,0 +1,49 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27130.2026
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Push.Cli", "PushGP.Cli\Push.Cli.csproj", "{293FD718-99E9-4F6A-A0EC-343C92D0B03E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Tests", "HeuristicLab.Tests\HeuristicLab.Tests.csproj", "{117B7D68-ED7D-4350-996B-9CA15259E107}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.ProgramSynthesis", "HeuristicLab.Problems.ProgramSynthesis\HeuristicLab.Problems.ProgramSynthesis.csproj", "{5C93448C-47E3-4C3F-B1D0-EE62A48C3204}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis", "HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis\HeuristicLab.Problems.ProgramSynthesis.GenealogyAnalysis.csproj", "{1C1FA0C1-A077-4C26-A5DA-9CB1F8842A8C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.ProgramSynthesis.Views", "HeuristicLab.Problems.ProgramSynthesis.Views\HeuristicLab.Problems.ProgramSynthesis.Views.csproj", "{6F7C98F5-C420-4C35-9D57-F299492F533E}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{293FD718-99E9-4F6A-A0EC-343C92D0B03E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{293FD718-99E9-4F6A-A0EC-343C92D0B03E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{293FD718-99E9-4F6A-A0EC-343C92D0B03E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{293FD718-99E9-4F6A-A0EC-343C92D0B03E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{117B7D68-ED7D-4350-996B-9CA15259E107}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{117B7D68-ED7D-4350-996B-9CA15259E107}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{117B7D68-ED7D-4350-996B-9CA15259E107}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{117B7D68-ED7D-4350-996B-9CA15259E107}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5C93448C-47E3-4C3F-B1D0-EE62A48C3204}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5C93448C-47E3-4C3F-B1D0-EE62A48C3204}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5C93448C-47E3-4C3F-B1D0-EE62A48C3204}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5C93448C-47E3-4C3F-B1D0-EE62A48C3204}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1C1FA0C1-A077-4C26-A5DA-9CB1F8842A8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1C1FA0C1-A077-4C26-A5DA-9CB1F8842A8C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1C1FA0C1-A077-4C26-A5DA-9CB1F8842A8C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1C1FA0C1-A077-4C26-A5DA-9CB1F8842A8C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6F7C98F5-C420-4C35-9D57-F299492F533E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6F7C98F5-C420-4C35-9D57-F299492F533E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6F7C98F5-C420-4C35-9D57-F299492F533E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6F7C98F5-C420-4C35-9D57-F299492F533E}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {86F831E2-646D-4924-B191-98F175197410}
+	EndGlobalSection
+EndGlobal
