Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/BenchmarkSuiteDataDescriptor.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/BenchmarkSuiteDataDescriptor.cs	(revision 14513)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/BenchmarkSuiteDataDescriptor.cs	(revision 14602)
@@ -1,32 +1,134 @@
-﻿namespace HeuristicLab.BenchmarkSuite
-{
+﻿namespace HeuristicLab.BenchmarkSuite {
+  using System;
   using System.Collections.Generic;
+  using System.IO;
+  using System.IO.Compression;
+  using System.Linq;
+  using System.Reflection;
+  using System.Text.RegularExpressions;
 
-  using HeuristicLab.Core;
-  using HeuristicLab.Random;
+  using HeuristicLab.BenchmarkSuite.ProblemData;
 
-  public abstract class BenchmarkSuiteDataDescritpor<T> : ArtificialDataDescriptor
-  {
-    protected static IRandom rand = new FastRandom();
+  using Microsoft.VisualBasic.FileIO;
 
-    protected abstract IEnumerable<T> GenerateTraining();
+  public abstract class BenchmarkSuiteDataDescriptor<TIn, TOut> : IBenchmarkSuiteDataDescriptor {
+    //protected static IRandom rand = new FastRandom();
 
-    protected abstract IEnumerable<T> GenerateTest();
+    private const string InstanceArchiveName = "HeuristicLab.BenchmarkSuite.Data.BenchmarkExamples.zip";
+    private const string TestProblemPostfix = "Test.csv";
+    private const string TrainingProblemPostfix = "Training.csv";
+    private const string ResourcePath = @".*\.Data\.";
+    private const string ExampleSeparator = ",";
 
-    protected abstract IEnumerable<Example> GenerateExamples(IEnumerable<T> trainingAndTest);
+    protected const char ArrayValueSeparator = ' ';
+    protected static readonly char[] ArraySymbolTrim = { '[', ']' };
 
-    protected override IEnumerable<Example> GenerateExamples()
-    {
-      var training = this.GenerateTraining();
+    public abstract string Name { get; }
+    public abstract string Description { get; }
 
-      training = training.Shuffle(rand);
+    protected abstract int InputCount { get; }
+    protected abstract int OutputCount { get; }
 
-      var test = this.GenerateTest();
+    public abstract TIn ConvertInput(string[] input);
+    public abstract TOut ConvertOutput(string[] input);
 
-      var all = new List<T>();
-      all.AddRange(training);
-      all.AddRange(test);
+    public IData CreateData() {
+      var training = this.GetTraining();
+      var test = this.GetTest();
 
-      return this.GenerateExamples(all);
+      return new Data<TIn, TOut>(training, test, 0, double.MaxValue);
+    }
+
+    public IPushData CreatePushData() {
+      var training = this.GetTraining();
+      var test = this.GetTest();
+
+      return this.CreatePushData(training, test);
+    }
+
+    private Example<TIn, TOut>[] GetTest() {
+      return this.ParseData(TestProblemPostfix).ToArray();
+    }
+
+    private Example<TIn, TOut>[] GetTraining() {
+      return this.ParseData(TrainingProblemPostfix)/*.Shuffle(rand)*/.ToArray(); ;
+    }
+
+    public abstract IPushData CreatePushData(Example<TIn, TOut>[] training, Example<TIn, TOut>[] test);
+
+    protected IEnumerable<Example<TIn, TOut>> ParseData(string postfix) {
+      var type = this.GetType();
+      var problemInstanceName = type.Name + postfix;
+
+      using (var file = this.GetType().Assembly.GetManifestResourceStream(InstanceArchiveName))
+      using (var archive = new ZipArchive(file, ZipArchiveMode.Read)) {
+        var entry = archive.Entries.SingleOrDefault(x => x.Name == problemInstanceName);
+
+        using (var parser = new TextFieldParser(entry.Open())) {
+          parser.TextFieldType = FieldType.Delimited;
+          parser.SetDelimiters(ExampleSeparator);
+
+          while (!parser.EndOfData) {
+            //Processing row
+            var fields = parser.ReadFields();
+
+            if (fields.Length != InputCount + OutputCount)
+              throw new InvalidDataException("Number of values do not fit");
+
+            yield return new Example<TIn, TOut> {
+              Input = ConvertInput(fields.Take(this.InputCount).ToArray()),
+              Output = ConvertOutput(fields.Skip(this.InputCount).ToArray())
+            };
+          }
+        }
+      }
+    }
+
+    protected static string GetResourceName(string fileName) {
+      return Assembly
+          .GetExecutingAssembly()
+          .GetManifestResourceNames()
+          .SingleOrDefault(x => Regex.Match(x, ResourcePath + fileName).Success);
+    }
+
+    protected static double[] ConvertDoubles(string input) {
+      return ConvertMultiple(input, double.Parse);
+    }
+
+    protected static double ConvertDouble(string input) {
+      return double.Parse(input);
+    }
+
+    protected static long[] ConvertIntegers(string input) {
+      return ConvertMultiple(input, long.Parse);
+    }
+
+    protected static long ConvertInteger(string input) {
+
+      return string.IsNullOrEmpty(input) ? default(long) : long.Parse(input);
+    }
+
+    protected static T[] ConvertMultiple<T>(string input, Func<string, T> converter) {
+      return input
+       .Trim(ArraySymbolTrim)
+       .Split(ArrayValueSeparator)
+       .Where(s => !string.IsNullOrWhiteSpace(s))
+       .Select(converter)
+       .ToArray();
+    }
+
+    protected static IEnumerable<string> SplitByNewLine(string input) {
+      return input.Split(new[] { Environment.NewLine, "\n", "\r\n" }, StringSplitOptions.None);
+    }
+
+    private static string[] trueFormats = new[] { "true", "t", "1" };
+    private static string[] falseFormats = new[] { "false", "f", "0" };
+
+    protected static bool ConvertBool(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));
     }
   }
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/BenchmarkSuiteInstanceProvider.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/BenchmarkSuiteInstanceProvider.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/BenchmarkSuiteInstanceProvider.cs	(revision 14602)
@@ -0,0 +1,58 @@
+﻿using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.BenchmarkSuite {
+
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+  using HeuristicLab.BenchmarkSuite.Problems;
+  using HeuristicLab.Problems.Instances;
+
+  public abstract class BenchmarkSuiteInstanceProvider<TData> : ProblemInstanceProvider<TData>
+    where TData : IData {
+    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 CountOdds();
+      yield return new CollatzNumbers();
+      yield return new CompareStringLengths();
+      yield return new Checksum();
+      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 MirrorImage();
+      yield return new NegativeToZero();
+      yield return new NumberIo();
+      yield return new PigLatin();
+      yield return new ReplaceSpaceWithNewline();
+    }
+
+    public abstract override TData LoadData(IDataDescriptor descriptor);
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/BenchmarkSuitePushInstanceProvider.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/BenchmarkSuitePushInstanceProvider.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/BenchmarkSuitePushInstanceProvider.cs	(revision 14602)
@@ -0,0 +1,12 @@
+﻿namespace HeuristicLab.BenchmarkSuite {
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+  using HeuristicLab.Problems.Instances;
+
+  public class BenchmarkSuitePushInstanceProvider : BenchmarkSuiteInstanceProvider<IPushData> {
+    public override IPushData LoadData(IDataDescriptor descriptor) {
+      var benchmarkSuiteDataDescriptor = descriptor as IBenchmarkSuiteDataDescriptor;
+
+      return benchmarkSuiteDataDescriptor.CreatePushData();
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj	(revision 14513)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj	(revision 14602)
@@ -8,6 +8,6 @@
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>HeuristicLab.BenchmarkSuite</RootNamespace>
-    <AssemblyName>HeuristicLab.BenchmarkSuite</AssemblyName>
-    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
+    <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>
@@ -17,4 +17,5 @@
     <IsCodedUITest>False</IsCodedUITest>
     <TestProjectType>UnitTest</TestProjectType>
+    <TargetFrameworkProfile />
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -22,13 +23,14 @@
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
+    <OutputPath>..\..\..\..\trunk\sources\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>bin\Release\</OutputPath>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -42,4 +44,8 @@
       <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-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\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.Problems.Instances-3.3">
       <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
@@ -48,5 +54,7 @@
       <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Random-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="Microsoft.VisualBasic" />
     <Reference Include="System" />
+    <Reference Include="System.IO.Compression" />
   </ItemGroup>
   <Choose>
@@ -63,12 +71,55 @@
   </Choose>
   <ItemGroup>
-    <Compile Include="ArtificialDataDescriptor.cs" />
     <Compile Include="BenchmarkSuiteDataDescriptor.cs" />
-    <Compile Include="Example.cs" />
+    <Compile Include="BenchmarkSuiteInstanceProvider.cs" />
+    <Compile Include="BenchmarkSuitePushInstanceProvider.cs" />
+    <Compile Include="IBenchmarkSuiteDataDescriptor.cs" />
+    <Compile Include="ProblemData\ReplaceSpaceWithNewlinePushData.cs" />
+    <Compile Include="ProblemData\PigLatinPushData.cs" />
+    <Compile Include="ProblemData\NumberIoPushData.cs" />
+    <Compile Include="ProblemData\NegativeToZeroPushData.cs" />
+    <Compile Include="ProblemData\MirrorImagePushData.cs" />
+    <Compile Include="ProblemData\MedianPushData.cs" />
+    <Compile Include="ProblemData\LastIndexOfZeroPushData.cs" />
+    <Compile Include="ProblemData\GradePushData.cs" />
+    <Compile Include="ProblemData\ChecksumPushData.cs" />
+    <Compile Include="ProblemData\CollatzNumbersPushData.cs" />
+    <Compile Include="ProblemData\CompareStringLengthsPushData.cs" />
+    <Compile Include="ProblemData\ForLoopIndexPushData.cs" />
+    <Compile Include="ProblemData\EvenSquaresPushData.cs" />
+    <Compile Include="ProblemData\DoubleLettersPushData.cs" />
+    <Compile Include="ProblemData\DigitsPushData.cs" />
+    <Compile Include="ProblemData\Data.cs" />
+    <Compile Include="ProblemData\Example.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="ProblemData\IData.cs" />
+    <Compile Include="ProblemData\IPushData.cs" />
+    <Compile Include="ProblemData\CountOddsPushData.cs" />
+    <Compile Include="Problems\ReplaceSpaceWithNewline.cs" />
+    <Compile Include="Problems\PigLatin.cs" />
+    <Compile Include="Problems\NumberIo.cs" />
+    <Compile Include="Problems\NegativeToZero.cs" />
+    <Compile Include="Problems\MirrorImage.cs" />
+    <Compile Include="Problems\Median.cs" />
+    <Compile Include="Problems\LastIndexOfZero.cs" />
+    <Compile Include="Problems\Grades.cs" />
+    <Compile Include="Problems\ForLoopIndex.cs" />
+    <Compile Include="Problems\EvenSquares.cs" />
+    <Compile Include="Problems\DoubleLetters.cs" />
+    <Compile Include="Problems\Checksum.cs" />
+    <Compile Include="Problems\CollatzNumbers.cs" />
+    <Compile Include="Problems\CompareStringLengths.cs" />
+    <Compile Include="Problems\Digits.cs" />
     <Compile Include="Problems\CountOdds.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <ItemGroup>
-    <Folder Include="Data\" />
+    <ProjectReference Include="..\HeuristicLab.Algorithms.PushGP\HeuristicLab.Algorithms.PushGP.csproj">
+      <Project>{368D1303-470C-4F31-91F2-0FAD379DAA45}</Project>
+      <Name>HeuristicLab.Algorithms.PushGP</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Data\BenchmarkExamples.zip" />
   </ItemGroup>
   <Choose>
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj.user
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj.user	(revision 14513)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj.user	(revision 14602)
@@ -2,5 +2,5 @@
 <Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <ProjectView>ShowAllFiles</ProjectView>
+    <ProjectView>ProjectFiles</ProjectView>
   </PropertyGroup>
 </Project>
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/IBenchmarkSuiteDataDescriptor.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/IBenchmarkSuiteDataDescriptor.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/IBenchmarkSuiteDataDescriptor.cs	(revision 14602)
@@ -0,0 +1,10 @@
+﻿namespace HeuristicLab.BenchmarkSuite {
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+  using HeuristicLab.Problems.Instances;
+
+  public interface IBenchmarkSuiteDataDescriptor : IDataDescriptor {
+    IData CreateData();
+
+    IPushData CreatePushData();
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Plugin.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Plugin.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Plugin.cs	(revision 14602)
@@ -0,0 +1,37 @@
+﻿#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)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  public class PushGpPlugin : PluginBase {
+
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/ChecksumPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/ChecksumPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/ChecksumPushData.cs	(revision 14602)
@@ -0,0 +1,35 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class ChecksumPushData : Data<string, string>, IPushData {
+    public ChecksumPushData(Example<string, string>[] training, Example<string, string>[] test)
+      : base(training, test, 0, 256 * 10) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      var asciiValues = GetAsciiValues(this.Training[index].Input);
+      interpreter.IntegerStack.Push(asciiValues);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      var asciiValues = GetAsciiValues(this.Test[index].Input);
+      interpreter.IntegerStack.Push(asciiValues);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => GetAsciiResultDifference(data, interpreter.IntegerStack));
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => GetAsciiResultDifference(data, interpreter.IntegerStack));
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/CollatzNumbersPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/CollatzNumbersPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/CollatzNumbersPushData.cs	(revision 14602)
@@ -0,0 +1,33 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class CollatzNumbersPushData : Data<long, long>, IPushData {
+    public CollatzNumbersPushData(Example<long, long>[] training, Example<long, long>[] test)
+      : base(training, test, 0, 260) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Training[index].Input);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Test[index].Input);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => data - interpreter.IntegerStack.Top);
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => data - interpreter.IntegerStack.Top);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/CompareStringLengthsPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/CompareStringLengthsPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/CompareStringLengthsPushData.cs	(revision 14602)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class CompareStringLengthsPushData : Data<string[], bool>, IPushData {
+    public CompareStringLengthsPushData(Example<string[], bool>[] training, Example<string[], bool>[] test)
+      : base(training, test, 0, test.Length) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.NameStack.Push(Training[index].Input);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.NameStack.Push(Test[index].Input);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.BooleanStack,
+        index,
+        this.Training,
+        data => data == interpreter.BooleanStack.Top ? 1 : 0);
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.BooleanStack,
+        index, this.Test,
+        data => data == interpreter.BooleanStack.Top ? 1 : 0);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/CountOddsPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/CountOddsPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/CountOddsPushData.cs	(revision 14602)
@@ -0,0 +1,33 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class CountOddsPushData : Data<long[], long>, IPushData {
+    public CountOddsPushData(Example<long[], long>[] training, Example<long[], long>[] test)
+      : base(training, test, 0, 50) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Training[index].Input);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Test[index].Input);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => data - interpreter.IntegerStack.Top);
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Test,
+        data => data - interpreter.IntegerStack.Top);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/Data.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/Data.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/Data.cs	(revision 14602)
@@ -0,0 +1,58 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  using System;
+  using System.Linq;
+
+  using HeuristicLab.Algorithms.PushGP.Stack;
+
+  public class Data<TIn, TOut> : IData {
+    public readonly Example<TIn, TOut>[] Training;
+    public readonly Example<TIn, TOut>[] Test;
+
+    public Data(Example<TIn, TOut>[] training, Example<TIn, TOut>[] test, double bestResult, double worstResult) {
+      this.Training = training;
+      this.Test = test;
+      this.WorstResult = worstResult;
+      this.BestResult = bestResult;
+    }
+
+    public int TrainingCount { get { return Training.Length; } }
+    public int TestCount { get { return Test.Length; } }
+
+    public double WorstResult { get; private set; }
+    public double BestResult { get; private set; }
+
+    protected double CompareOutput<TStack>(IStack<TStack> stack, int index, Example<TIn, TOut>[] data, Func<TOut, double> differ) {
+      if (stack.IsEmpty)
+        return this.WorstResult;
+
+      var diff = differ(data[index].Output);
+      return diff == long.MinValue ? this.WorstResult : Math.Min(Math.Abs(diff), this.WorstResult);
+    }
+
+    protected static long[] GetAsciiValues(string str) {
+      return str.Select(c => (long)c).ToArray();
+    }
+
+    protected static double GetAsciiResultDifference(string data, IStack<long> stack) {
+      var resultCount = Math.Min(data.Length, stack.Count);
+      var resultValues = stack.Pop(resultCount);
+
+      return Math.Abs(GetAsciiValues(data).Sum() - resultValues.Sum());
+    }
+
+    protected static double GetFloatResultDifference(double data, IStack<double> stack) {
+      return Math.Abs(data - stack.Pop());
+    }
+
+    protected static double GetIntResultDifference(long data, IStack<long> stack) {
+      return Math.Abs(data - stack.Pop());
+    }
+
+    protected static double GetIntResultDifference(long[] data, IStack<long> stack) {
+      var resultCount = Math.Min(data.Length, stack.Count);
+      var resultValues = stack.Pop(resultCount);
+
+      return Math.Abs(data.Sum() - resultValues.Sum());
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/DigitsPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/DigitsPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/DigitsPushData.cs	(revision 14602)
@@ -0,0 +1,34 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class DigitsPushData : Data<long, long[]>, IPushData {
+    public DigitsPushData(Example<long, long[]>[] training, Example<long, long[]>[] test)
+      : base(training, test, 0, 19 * 15) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Training[index].Input);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Test[index].Input);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => GetIntResultDifference(data, interpreter.IntegerStack));
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Test,
+        data => GetIntResultDifference(data, interpreter.IntegerStack));
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/DoubleLettersPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/DoubleLettersPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/DoubleLettersPushData.cs	(revision 14602)
@@ -0,0 +1,35 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class DoubleLettersPushData : Data<string, string>, IPushData {
+    public DoubleLettersPushData(Example<string, string>[] training, Example<string, string>[] test)
+      : base(training, test, 0, 128 * 70) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      var asciiValues = GetAsciiValues(this.Training[index].Input);
+      interpreter.IntegerStack.Push(asciiValues);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      var asciiValues = GetAsciiValues(this.Training[index].Input);
+      interpreter.IntegerStack.Push(asciiValues);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => GetAsciiResultDifference(data, interpreter.IntegerStack));
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Test,
+        data => GetAsciiResultDifference(data, interpreter.IntegerStack));
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/EvenSquaresPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/EvenSquaresPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/EvenSquaresPushData.cs	(revision 14602)
@@ -0,0 +1,34 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class EvenSquaresPushData : Data<long, long[]>, IPushData {
+    public EvenSquaresPushData(Example<long, long[]>[] training, Example<long, long[]>[] test)
+      : base(training, test, 0, 100000) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Training[index].Input);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Test[index].Input);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => GetIntResultDifference(data, interpreter.IntegerStack));
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Test,
+        data => GetIntResultDifference(data, interpreter.IntegerStack));
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/Example.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/Example.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/Example.cs	(revision 14602)
@@ -0,0 +1,6 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  public class Example<TIn, TOut> {
+    public TIn Input { get; set; }
+    public TOut Output { get; set; }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/ForLoopIndexPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/ForLoopIndexPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/ForLoopIndexPushData.cs	(revision 14602)
@@ -0,0 +1,34 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class ForLoopIndexPushData : Data<long[], long[]>, IPushData {
+    public ForLoopIndexPushData(Example<long[], long[]>[] training, Example<long[], long[]>[] test)
+      : base(training, test, 0, 50 * 15) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Training[index].Input);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Test[index].Input);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => GetIntResultDifference(data, interpreter.IntegerStack));
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Test,
+        data => GetIntResultDifference(data, interpreter.IntegerStack));
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/GradePushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/GradePushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/GradePushData.cs	(revision 14602)
@@ -0,0 +1,33 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class GradePushData : Data<long[], string>, IPushData {
+    public GradePushData(Example<long[], string>[] training, Example<long[], string>[] test)
+      : base(training, test, 0, 5) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(this.Training[index].Input);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(this.Test[index].Input);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => GetAsciiResultDifference(data, interpreter.IntegerStack));
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => GetAsciiResultDifference(data, interpreter.IntegerStack));
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/IData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/IData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/IData.cs	(revision 14602)
@@ -0,0 +1,9 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  public interface IData {
+    int TrainingCount { get; }
+    int TestCount { get; }
+
+    double WorstResult { get; }
+    double BestResult { get; }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/IPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/IPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/IPushData.cs	(revision 14602)
@@ -0,0 +1,11 @@
+﻿using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+namespace HeuristicLab.BenchmarkSuite.ProblemData {
+
+  public interface IPushData : IData {
+    void ApplyTrainingInput(IPushGpInterpreter interpreter, int index);
+    void ApplyTestInput(IPushGpInterpreter interpreter, int index);
+    double CompareTrainingOutput(IPushGpInterpreter interpreter, int index);
+    double CompareTestOutput(IPushGpInterpreter interpreter, int index);
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/LastIndexOfZeroPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/LastIndexOfZeroPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/LastIndexOfZeroPushData.cs	(revision 14602)
@@ -0,0 +1,33 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class LastIndexOfZeroPushData : Data<long[], long>, IPushData {
+    public LastIndexOfZeroPushData(Example<long[], long>[] training, Example<long[], long>[] test)
+      : base(training, test, 0, 50) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Training[index].Input);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Test[index].Input);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => data - interpreter.IntegerStack.Top);
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Test,
+        data => data - interpreter.IntegerStack.Top);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/MedianPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/MedianPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/MedianPushData.cs	(revision 14602)
@@ -0,0 +1,33 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class MedianPushData : Data<long[], long>, IPushData {
+    public MedianPushData(Example<long[], long>[] training, Example<long[], long>[] test)
+      : base(training, test, 0, 100) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Training[index].Input);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Test[index].Input);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => GetIntResultDifference(data, interpreter.IntegerStack));
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Test,
+        data => GetIntResultDifference(data, interpreter.IntegerStack));
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/MirrorImagePushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/MirrorImagePushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/MirrorImagePushData.cs	(revision 14602)
@@ -0,0 +1,35 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class MirrorImagePushData : Data<long[][], bool>, IPushData {
+    public MirrorImagePushData(Example<long[][], bool>[] training, Example<long[][], bool>[] test)
+      : base(training, test, 0, 50) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Training[index].Input[0]);
+      interpreter.IntegerStack.Push(Training[index].Input[1]);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Test[index].Input[0]);
+      interpreter.IntegerStack.Push(Test[index].Input[1]);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.BooleanStack,
+        index,
+        this.Training,
+        data => data == interpreter.BooleanStack.Top ? 1 : 0);
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.BooleanStack,
+        index,
+        this.Test,
+        data => data == interpreter.BooleanStack.Top ? 1 : 0);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/NegativeToZeroPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/NegativeToZeroPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/NegativeToZeroPushData.cs	(revision 14602)
@@ -0,0 +1,33 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class NegativeToZeroPushData : Data<long[], long[]>, IPushData {
+    public NegativeToZeroPushData(Example<long[], long[]>[] training, Example<long[], long[]>[] test)
+      : base(training, test, 0, 50) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Training[index].Input);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.IntegerStack.Push(Test[index].Input);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => GetIntResultDifference(data, interpreter.IntegerStack));
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Test,
+        data => GetIntResultDifference(data, interpreter.IntegerStack));
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/NumberIoPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/NumberIoPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/NumberIoPushData.cs	(revision 14602)
@@ -0,0 +1,36 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class NumberIoPushData : Data<double[], double>, IPushData {
+    public NumberIoPushData(Example<double[], double>[] training, Example<double[], double>[] test)
+      : base(training, test, 0, 200) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.FloatStack.Push(Training[index].Input[0]);
+      interpreter.IntegerStack.Push((long)Training[index].Input[1]);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      interpreter.FloatStack.Push(Test[index].Input[0]);
+      interpreter.IntegerStack.Push((long)Test[index].Input[1]);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.FloatStack,
+        index,
+        this.Training,
+        data => GetFloatResultDifference(data, interpreter.FloatStack));
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.FloatStack,
+        index,
+        this.Test,
+        data => GetFloatResultDifference(data, interpreter.FloatStack));
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/PigLatinPushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/PigLatinPushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/PigLatinPushData.cs	(revision 14602)
@@ -0,0 +1,35 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class PigLatinPushData : Data<string, string>, IPushData {
+    public PigLatinPushData(Example<string, string>[] training, Example<string, string>[] test)
+      : base(training, test, 0, 128 * 70) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      var asciiValues = GetAsciiValues(this.Training[index].Input);
+      interpreter.IntegerStack.Push(asciiValues);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      var asciiValues = GetAsciiValues(this.Training[index].Input);
+      interpreter.IntegerStack.Push(asciiValues);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data => GetAsciiResultDifference(data, interpreter.IntegerStack));
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Test,
+        data => GetAsciiResultDifference(data, interpreter.IntegerStack));
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/ReplaceSpaceWithNewLinePushData.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/ReplaceSpaceWithNewLinePushData.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/ProblemData/ReplaceSpaceWithNewLinePushData.cs	(revision 14602)
@@ -0,0 +1,41 @@
+﻿namespace HeuristicLab.BenchmarkSuite.ProblemData {
+  using HeuristicLab.Algorithms.PushGP.Interpreter;
+
+  public class ReplaceSpaceWithNewlinePushData : Data<string, string[]>, IPushData {
+    public ReplaceSpaceWithNewlinePushData(Example<string, string[]>[] training, Example<string, string[]>[] test)
+      : base(training, test, 0, 128 * 70) {
+    }
+
+    public void ApplyTrainingInput(IPushGpInterpreter interpreter, int index) {
+      var asciiValues = GetAsciiValues(this.Training[index].Input);
+      interpreter.IntegerStack.Push(asciiValues);
+    }
+
+    public void ApplyTestInput(IPushGpInterpreter interpreter, int index) {
+      var asciiValues = GetAsciiValues(this.Training[index].Input);
+      interpreter.IntegerStack.Push(asciiValues);
+    }
+
+    public double CompareTrainingOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Training,
+        data =>
+          GetIntResultDifference(int.Parse(data[1]), interpreter.IntegerStack) +
+          data[0].CompareTo(interpreter.NameStack.Top)
+        );
+    }
+
+    public double CompareTestOutput(IPushGpInterpreter interpreter, int index) {
+      return this.CompareOutput(
+        interpreter.IntegerStack,
+        index,
+        this.Test,
+        data =>
+          GetIntResultDifference(int.Parse(data[1]), interpreter.IntegerStack) +
+          data[0].CompareTo(interpreter.NameStack.Top)
+        );
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/Checksum.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/Checksum.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/Checksum.cs	(revision 14602)
@@ -0,0 +1,25 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class Checksum : BenchmarkSuiteDataDescriptor<string, string> {
+    private const string displayMame = "Checksum";
+    private const string description = "";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+    protected override int InputCount { get { return 1; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override string ConvertInput(string[] input) {
+      return input[0];
+    }
+
+    public override string ConvertOutput(string[] output) {
+      return output[0];
+    }
+
+    public override IPushData CreatePushData(Example<string, string>[] training, Example<string, string>[] test) {
+      return new ChecksumPushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/CollatzNumbers.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/CollatzNumbers.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/CollatzNumbers.cs	(revision 14602)
@@ -0,0 +1,25 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class CollatzNumbers : BenchmarkSuiteDataDescriptor<long, long> {
+    private const string displayMame = "Collatz Numbers";
+    private const string description = "";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+    protected override int InputCount { get { return 1; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override long ConvertInput(string[] input) {
+      return ConvertInteger(input[0]);
+    }
+
+    public override long ConvertOutput(string[] output) {
+      return ConvertInteger(output[0]);
+    }
+
+    public override IPushData CreatePushData(Example<long, long>[] training, Example<long, long>[] test) {
+      return new CollatzNumbersPushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/CompareStringLengths.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/CompareStringLengths.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/CompareStringLengths.cs	(revision 14602)
@@ -0,0 +1,25 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class CompareStringLengths : BenchmarkSuiteDataDescriptor<string[], bool> {
+    private const string displayMame = "Compare String Lengths";
+    private const string description = "";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+    protected override int InputCount { get { return 3; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override string[] ConvertInput(string[] input) {
+      return input;
+    }
+
+    public override bool ConvertOutput(string[] output) {
+      return ConvertBool(output[0]);
+    }
+
+    public override IPushData CreatePushData(Example<string[], bool>[] training, Example<string[], bool>[] test) {
+      return new CompareStringLengthsPushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/CountOdds.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/CountOdds.cs	(revision 14513)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/CountOdds.cs	(revision 14602)
@@ -1,141 +1,25 @@
-﻿namespace HeuristicLab.BenchmarkSuite.Problems
-{
-  using System.Collections.Generic;
-  using System.Linq;
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using HeuristicLab.BenchmarkSuite.ProblemData;
 
-  public class CountOdds : BenchmarkSuiteDataDescritpor<List<int>>
-  {
-    public const int MaxOdd = 999;
+  public class CountOdds : BenchmarkSuiteDataDescriptor<long[], long> {
+    private const string displayMame = "Count Odds";
+    private const string description = "";
 
-    public const int MaxEven = 1000;
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
 
-    public const int MaxRandom = 1000;
+    protected override int InputCount { get { return 1; } }
+    protected override int OutputCount { get { return 1; } }
 
-    public const int MinRandom = 1000;
-
-    public const int MaxVectorLength = 50;
-
-    public override string Description
-    {
-      get
-      {
-        return string.Empty;
-      }
+    public override long[] ConvertInput(string[] input) {
+      return ConvertIntegers(input[0]);
     }
 
-    public override string Name
-    {
-      get
-      {
-        return "Count Odds";
-      }
+    public override long ConvertOutput(string[] output) {
+      return ConvertInteger(output[0]);
     }
 
-    protected override IEnumerable<Example> GenerateExamples(IEnumerable<List<int>> inputData)
-    {
-      foreach (var input in inputData)
-        yield return
-          new Example
-            {
-              Input = string.Format("[{0}]", string.Join(", ", input)),
-              Output = input.Count(x => x % 2 == 1).ToString()
-            };
-    }
-
-    protected override IEnumerable<List<int>> GenerateTest()
-    {
-      foreach (var list in this.GetHardcodedTrainingSamples()) yield return list;
-
-      foreach (var list in this.GetAllOdd(100)) yield return list;
-
-      foreach (var list in this.GetAllEven(100)) yield return list;
-
-      foreach (var list in this.GetRandom(1800)) yield return list;
-    }
-
-    protected override IEnumerable<List<int>> GenerateTraining()
-    {
-      foreach (var list in this.GetHardcodedTrainingSamples()) yield return list;
-
-      foreach (var list in this.GetAllOdd(9)) yield return list;
-
-      foreach (var list in this.GetAllEven(9)) yield return list;
-
-      foreach (var list in this.GetRandom(150)) yield return list;
-    }
-
-    private IEnumerable<List<int>> GetAllOdd(int n)
-    {
-      for (var i = 0; i < n; i++)
-      {
-        var length = rand.Next(0, MaxVectorLength);
-        var vector = new List<int>(length);
-
-        for (var j = 0; j < length; j++) vector.Add(rand.Next(0, MaxOdd) * 2 - MaxOdd);
-
-        yield return vector;
-      }
-    }
-
-    private IEnumerable<List<int>> GetAllEven(int n)
-    {
-      for (var i = 0; i < n; i++)
-      {
-        var length = rand.Next(0, MaxVectorLength);
-        var vector = new List<int>(length);
-
-        for (var j = 0; j < length; j++) vector.Add(rand.Next(0, MaxEven) * 2 - MaxEven);
-
-        yield return vector;
-      }
-    }
-
-    private IEnumerable<List<int>> GetRandom(int n)
-    {
-      for (var i = 0; i < n; i++)
-      {
-        var length = rand.Next(0, MaxVectorLength);
-        var vector = new List<int>(length);
-
-        for (var j = 0; j < length; j++) vector.Add(rand.Next(MinRandom, MaxRandom));
-
-        yield return vector;
-      }
-    }
-
-    private IEnumerable<List<int>> GetHardcodedTrainingSamples()
-    {
-      yield return new List<int>();
-      yield return new List<int> { -10 };
-      yield return new List<int> { -9 };
-      yield return new List<int> { -8 };
-      yield return new List<int> { -7 };
-      yield return new List<int> { -6 };
-      yield return new List<int> { -5 };
-      yield return new List<int> { -4 };
-      yield return new List<int> { -3 };
-      yield return new List<int> { -2 };
-      yield return new List<int> { -1 };
-      yield return new List<int> { -0 };
-      yield return new List<int> { 1 };
-      yield return new List<int> { 2 };
-      yield return new List<int> { 3 };
-      yield return new List<int> { 4 };
-      yield return new List<int> { 5 };
-      yield return new List<int> { 6 };
-      yield return new List<int> { 7 };
-      yield return new List<int> { 8 };
-      yield return new List<int> { 9 };
-      yield return new List<int> { 10 };
-      yield return new List<int> { -947 };
-      yield return new List<int> { -450 };
-      yield return new List<int> { 303 };
-      yield return new List<int> { 886 };
-      yield return new List<int> { 0, 0 };
-      yield return new List<int> { 0, 1 };
-      yield return new List<int> { 7, 1 };
-      yield return new List<int> { -9, -1 };
-      yield return new List<int> { -11, 40 };
-      yield return new List<int> { 944, 77 };
+    public override IPushData CreatePushData(Example<long[], long>[] training, Example<long[], long>[] test) {
+      return new CountOddsPushData(training, test);
     }
   }
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/Digits.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/Digits.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/Digits.cs	(revision 14602)
@@ -0,0 +1,30 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System.Linq;
+
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class Digits : BenchmarkSuiteDataDescriptor<long, long[]> {
+    private const string displayMame = "Digits";
+    private const string description = "";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+
+    protected override int InputCount { get { return 1; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override long ConvertInput(string[] input) {
+      return ConvertInteger(input[0]);
+    }
+
+    public override long[] ConvertOutput(string[] output) {
+      return SplitByNewLine(output[0])
+        .Select(ConvertInteger)
+        .ToArray();
+    }
+
+    public override IPushData CreatePushData(Example<long, long[]>[] training, Example<long, long[]>[] test) {
+      return new DigitsPushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/DoubleLetters.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/DoubleLetters.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/DoubleLetters.cs	(revision 14602)
@@ -0,0 +1,25 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class DoubleLetters : BenchmarkSuiteDataDescriptor<string, string> {
+    private const string displayMame = "Double Letters";
+    private const string description = "";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+    protected override int InputCount { get { return 1; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override string ConvertInput(string[] input) {
+      return input[0];
+    }
+
+    public override string ConvertOutput(string[] output) {
+      return output[0];
+    }
+
+    public override IPushData CreatePushData(Example<string, string>[] training, Example<string, string>[] test) {
+      return new DoubleLettersPushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/EvenSquares.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/EvenSquares.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/EvenSquares.cs	(revision 14602)
@@ -0,0 +1,30 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System.Linq;
+
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class EvenSquares : BenchmarkSuiteDataDescriptor<long, long[]> {
+    private const string displayMame = "Even Squares";
+    private const string description = "";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+
+    protected override int InputCount { get { return 1; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override long ConvertInput(string[] input) {
+      return ConvertInteger(input[0]);
+    }
+
+    public override long[] ConvertOutput(string[] output) {
+      return SplitByNewLine(output[0])
+        .Select(ConvertInteger)
+        .ToArray();
+    }
+
+    public override IPushData CreatePushData(Example<long, long[]>[] training, Example<long, long[]>[] test) {
+      return new EvenSquaresPushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/ForLoopIndex.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/ForLoopIndex.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/ForLoopIndex.cs	(revision 14602)
@@ -0,0 +1,30 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System.Linq;
+
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class ForLoopIndex : BenchmarkSuiteDataDescriptor<long[], long[]> {
+    private const string displayMame = "For Loop Index";
+    private const string description = "";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+
+    protected override int InputCount { get { return 3; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override long[] ConvertInput(string[] input) {
+      return input.Select(ConvertInteger).ToArray();
+    }
+
+    public override long[] ConvertOutput(string[] output) {
+      return SplitByNewLine(output[0])
+        .Select(ConvertInteger)
+        .ToArray();
+    }
+
+    public override IPushData CreatePushData(Example<long[], long[]>[] training, Example<long[], long[]>[] test) {
+      return new ForLoopIndexPushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/Grades.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/Grades.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/Grades.cs	(revision 14602)
@@ -0,0 +1,26 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System.Linq;
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class Grades : BenchmarkSuiteDataDescriptor<long[], string> {
+    private const string displayMame = "Checksum";
+    private const string description = "";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+    protected override int InputCount { get { return 5; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override long[] ConvertInput(string[] input) {
+      return input.Select(ConvertInteger).ToArray();
+    }
+
+    public override string ConvertOutput(string[] output) {
+      return output[0];
+    }
+
+    public override IPushData CreatePushData(Example<long[], string>[] training, Example<long[], string>[] test) {
+      return new GradePushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/LastIndexOfZero.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/LastIndexOfZero.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/LastIndexOfZero.cs	(revision 14602)
@@ -0,0 +1,26 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class LastIndexOfZero : BenchmarkSuiteDataDescriptor<long[], long> {
+    private const string displayMame = "Last Index of Zero";
+    private const string description = "";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+
+    protected override int InputCount { get { return 1; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override long[] ConvertInput(string[] input) {
+      return ConvertIntegers(input[0]);
+    }
+
+    public override long ConvertOutput(string[] output) {
+      return ConvertInteger(output[0]);
+    }
+
+    public override IPushData CreatePushData(Example<long[], long>[] training, Example<long[], long>[] test) {
+      return new LastIndexOfZeroPushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/Median.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/Median.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/Median.cs	(revision 14602)
@@ -0,0 +1,28 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System.Linq;
+
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class Median : BenchmarkSuiteDataDescriptor<long[], long> {
+    private const string displayMame = "Median";
+    private const string description = "";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+
+    protected override int InputCount { get { return 3; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override long[] ConvertInput(string[] input) {
+      return input.Select(ConvertInteger).ToArray();
+    }
+
+    public override long ConvertOutput(string[] output) {
+      return ConvertInteger(output[0]);
+    }
+
+    public override IPushData CreatePushData(Example<long[], long>[] training, Example<long[], long>[] test) {
+      return new MedianPushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/MirrorImage.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/MirrorImage.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/MirrorImage.cs	(revision 14602)
@@ -0,0 +1,28 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System.Linq;
+
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class MirrorImage : BenchmarkSuiteDataDescriptor<long[][], bool> {
+    private const string displayMame = "Mirror Image";
+    private const string description = "Given two vectors of integers, return true if one vector is the reverse of the other, and false otherwise";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+
+    protected override int InputCount { get { return 2; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override long[][] ConvertInput(string[] input) {
+      return input.Select(ConvertIntegers).ToArray();
+    }
+
+    public override bool ConvertOutput(string[] output) {
+      return ConvertBool(output[0]);
+    }
+
+    public override IPushData CreatePushData(Example<long[][], bool>[] training, Example<long[][], bool>[] test) {
+      return new MirrorImagePushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/NegativeToZero.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/NegativeToZero.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/NegativeToZero.cs	(revision 14602)
@@ -0,0 +1,26 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class NegativeToZero : BenchmarkSuiteDataDescriptor<long[], long[]> {
+    private const string displayMame = "Negative To Zero";
+    private const string description = "Given a vector of integers, return the vector where all negative integers have been replaced by 0.";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+
+    protected override int InputCount { get { return 1; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override long[] ConvertInput(string[] input) {
+      return ConvertIntegers(input[0]);
+    }
+
+    public override long[] ConvertOutput(string[] output) {
+      return ConvertIntegers(output[0]);
+    }
+
+    public override IPushData CreatePushData(Example<long[], long[]>[] training, Example<long[], long[]>[] test) {
+      return new NegativeToZeroPushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/NumberIo.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/NumberIo.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/NumberIo.cs	(revision 14602)
@@ -0,0 +1,28 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System.Linq;
+
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class NumberIo : BenchmarkSuiteDataDescriptor<double[], double> {
+    private const string displayMame = "NumberIO";
+    private const string description = " Given an integer and a float, print their sum.";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+
+    protected override int InputCount { get { return 2; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override double[] ConvertInput(string[] input) {
+      return input.Select(ConvertDouble).ToArray();
+    }
+
+    public override double ConvertOutput(string[] output) {
+      return ConvertDouble(output[0]);
+    }
+
+    public override IPushData CreatePushData(Example<double[], double>[] training, Example<double[], double>[] test) {
+      return new NumberIoPushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/PigLatin.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/PigLatin.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/PigLatin.cs	(revision 14602)
@@ -0,0 +1,25 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class PigLatin : BenchmarkSuiteDataDescriptor<string, string> {
+    private const string displayMame = "Pig Latin";
+    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”";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+    protected override int InputCount { get { return 1; } }
+    protected override int OutputCount { get { return 1; } }
+
+    public override string ConvertInput(string[] input) {
+      return input[0];
+    }
+
+    public override string ConvertOutput(string[] output) {
+      return output[0];
+    }
+
+    public override IPushData CreatePushData(Example<string, string>[] training, Example<string, string>[] test) {
+      return new PigLatinPushData(training, test);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/ReplaceSpaceWithNewLine.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/ReplaceSpaceWithNewLine.cs	(revision 14602)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.BenchmarkSuite/Problems/ReplaceSpaceWithNewLine.cs	(revision 14602)
@@ -0,0 +1,25 @@
+﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using HeuristicLab.BenchmarkSuite.ProblemData;
+
+  public class ReplaceSpaceWithNewline : BenchmarkSuiteDataDescriptor<string, string[]> {
+    private const string displayMame = "Replace Space with Newline";
+    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.";
+
+    public override string Name { get { return displayMame; } }
+    public override string Description { get { return description; } }
+    protected override int InputCount { get { return 1; } }
+    protected override int OutputCount { get { return 2; } }
+
+    public override string ConvertInput(string[] input) {
+      return input[0];
+    }
+
+    public override string[] ConvertOutput(string[] output) {
+      return output;
+    }
+
+    public override IPushData CreatePushData(Example<string, string[]>[] training, Example<string, string[]>[] test) {
+      return new ReplaceSpaceWithNewlinePushData(training, test);
+    }
+  }
+}
