Index: branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs
===================================================================
--- branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs	(revision 17362)
+++ branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs	(revision 17364)
@@ -142,4 +142,6 @@
         else if (iter.Current[i] is string s)
           transposed.Add(new List<string>() { s });
+        else if (iter.Current[i] is IReadOnlyList<double> dv)
+          transposed.Add(new List<IReadOnlyList<double>>() { dv });
         else throw new NotSupportedException(string.Format("Variable {0} has type {1}. This is not supported when converting from row-wise data.", vnames[i], iter.Current[i].GetType()));
       }
@@ -212,12 +214,13 @@
       get { return variableValues.Where(p => p.Value is IList<double>).Select(p => p.Key); }
     }
-
     public IEnumerable<string> StringVariables {
       get { return variableValues.Where(p => p.Value is IList<string>).Select(p => p.Key); }
     }
-
     public IEnumerable<string> DateTimeVariables {
       get { return variableValues.Where(p => p.Value is IList<DateTime>).Select(p => p.Key); }
     }
+    public IEnumerable<string> DoubleVectorVariables {
+      get { return variableValues.Where(p => p.Value is IList<IReadOnlyList<double>>).Select(p => p.Key); }
+    }
 
     public IEnumerable<double> GetDoubleValues(string variableName) {
@@ -229,4 +232,7 @@
     public IEnumerable<DateTime> GetDateTimeValues(string variableName) {
       return GetValues<DateTime>(variableName);
+    }
+    public IEnumerable<IReadOnlyList<double>> GetDoubleVectorValues(string variableName) {
+      return GetValues<IReadOnlyList<double>>(variableName);
     }
 
@@ -247,5 +253,4 @@
       return values[row];
     }
-
     public IEnumerable<string> GetStringValues(string variableName, IEnumerable<int> rows) {
       return GetValues<string>(variableName, rows);
@@ -267,4 +272,17 @@
       return new ReadOnlyCollection<DateTime>(values);
     }
+
+    public IReadOnlyList<double> GetDoubleVectorValue(string variableName, int row) {
+      var values = GetValues<IReadOnlyList<double>>(variableName);
+      return values[row];
+    }
+    public IEnumerable<IReadOnlyList<double>> GetDoubleVectorValues(string variableName, IEnumerable<int> rows) {
+      return GetValues<IReadOnlyList<double>>(variableName, rows);
+    }
+    public ReadOnlyCollection<IReadOnlyList<double>> GetReadOnlyDoubleVectorValues(string variableName) {
+      var values = GetValues<IReadOnlyList<double>>(variableName);
+      return new ReadOnlyCollection<IReadOnlyList<double>>(values);
+    }
+
     private IEnumerable<T> GetValues<T>(string variableName, IEnumerable<int> rows) {
       var values = GetValues<T>(variableName);
@@ -298,5 +316,5 @@
     }
     protected static bool IsAllowedType(Type type) {
-      return type == typeof(double) || type == typeof(string) || type == typeof(DateTime);
+      return type == typeof(double) || type == typeof(string) || type == typeof(DateTime) || type == typeof(IReadOnlyList<double>);
     }
 
@@ -343,4 +361,7 @@
       if (dateTimeValues != null) return new List<DateTime>(dateTimeValues);
 
+      var doubleVectorValues = values as IList<IReadOnlyList<double>>;
+      if (doubleVectorValues != null) return doubleVectorValues.Select(x => new List<double>(x)).Cast<IReadOnlyList<double>>().ToList();
+
       throw new ArgumentException(string.Format("Unsupported variable type {0}.", GetElementType(values)));
     }
@@ -381,4 +402,7 @@
     }
     string IStringConvertibleMatrix.GetValue(int rowIndex, int columnIndex) {
+      var value = variableValues[variableNames[columnIndex]][rowIndex];
+      if (value is IReadOnlyList<double> doubleVector)
+        return $"[{string.Join(", ", doubleVector)}]";
       return variableValues[variableNames[columnIndex]][rowIndex].ToString();
     }
Index: branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs
===================================================================
--- branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs	(revision 17362)
+++ branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs	(revision 17364)
@@ -158,8 +158,9 @@
       if (allowedInputVariables == null) throw new ArgumentNullException("The allowed input variables must not be null.");
 
-      if (allowedInputVariables.Except(dataset.DoubleVariables).Except(dataset.StringVariables).Any())
-        throw new ArgumentException("All allowed input variables must be present in the dataset and of type double or string.");
-
-      var variables = dataset.VariableNames.Where(variable => dataset.VariableHasType<double>(variable) || dataset.VariableHasType<string>(variable));
+      if (allowedInputVariables.Except(dataset.DoubleVariables).Except(dataset.StringVariables).Except(dataset.DoubleVectorVariables).Any())
+        throw new ArgumentException("All allowed input variables must be present in the dataset and of type double, string or double-vector.");
+
+      var variables = dataset.VariableNames.Where(variable =>
+        dataset.VariableHasType<double>(variable) || dataset.VariableHasType<string>(variable) || dataset.VariableHasType<IReadOnlyList<double>>(variable));
       var inputVariables = new CheckedItemList<StringValue>(variables.Select(x => new StringValue(x).AsReadOnly()));
       foreach (StringValue x in inputVariables)
Index: branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataset.cs
===================================================================
--- branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataset.cs	(revision 17362)
+++ branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataset.cs	(revision 17364)
@@ -34,4 +34,5 @@
     IEnumerable<string> StringVariables { get; }
     IEnumerable<string> DateTimeVariables { get; }
+    IEnumerable<string> DoubleVectorVariables { get; }
 
     bool ContainsVariable(string variablename);
@@ -48,8 +49,13 @@
     ReadOnlyCollection<string> GetReadOnlyStringValues(string VariableName);
 
-    System.DateTime GetDateTimeValue(string variableName, int row);
+    DateTime GetDateTimeValue(string variableName, int row);
     IEnumerable<DateTime> GetDateTimeValues(string variableName);
     IEnumerable<DateTime> GetDateTimeValues(string variableName, IEnumerable<int> rows);
     ReadOnlyCollection<DateTime> GetReadOnlyDateTimeValues(string variableName);
+
+    IReadOnlyList<double> GetDoubleVectorValue(string variableName, int row);
+    IEnumerable<IReadOnlyList<double>> GetDoubleVectorValues(string variableName);
+    IEnumerable<IReadOnlyList<double>> GetDoubleVectorValues(string variableName, IEnumerable<int> rows);
+    ReadOnlyCollection<IReadOnlyList<double>> GetReadOnlyDoubleVectorValues(string variableName);
   }
 }
Index: branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/HeuristicLab.Problems.Instances.DataAnalysis-3.3.csproj
===================================================================
--- branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/HeuristicLab.Problems.Instances.DataAnalysis-3.3.csproj	(revision 17362)
+++ branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/HeuristicLab.Problems.Instances.DataAnalysis-3.3.csproj	(revision 17364)
@@ -24,5 +24,5 @@
     <WarningLevel>4</WarningLevel>
     <Prefer32Bit>false</Prefer32Bit>
-    <LangVersion>5</LangVersion>
+    <LangVersion>6</LangVersion>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
@@ -34,5 +34,5 @@
     <WarningLevel>4</WarningLevel>
     <Prefer32Bit>false</Prefer32Bit>
-    <LangVersion>5</LangVersion>
+    <LangVersion>6</LangVersion>
   </PropertyGroup>
   <PropertyGroup>
@@ -243,4 +243,6 @@
     <Compile Include="Regression\Various\SpatialCoevolution.cs" />
     <Compile Include="Regression\Various\VariousInstanceProvider.cs" />
+    <Compile Include="Regression\VectorData\VariousInstanceProvider.cs" />
+    <Compile Include="Regression\VectorData\VectorDataTestOne.cs" />
     <Compile Include="Regression\Vladislavleva\KotanchekFunction.cs" />
     <Compile Include="Regression\Vladislavleva\RationalPolynomialThreeDimensional.cs" />
Index: branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/ArtificialRegressionDataDescriptor.cs
===================================================================
--- branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/ArtificialRegressionDataDescriptor.cs	(revision 17362)
+++ branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/ArtificialRegressionDataDescriptor.cs	(revision 17364)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections;
 using System.Collections.Generic;
 using HeuristicLab.Problems.DataAnalysis;
@@ -26,9 +27,16 @@
   public abstract class ArtificialRegressionDataDescriptor : RegressionDataDescriptor {
     public IRegressionProblemData GenerateRegressionData() {
-      Dataset dataset = new Dataset(VariableNames, this.GenerateValues());
+      var values = GenerateValues();
+      Dataset dataset = values != null
+        ? new Dataset(VariableNames, GenerateValues())
+        : new Dataset(VariableNames, GenerateValuesExtended());
       return GenerateRegressionData(dataset);
     }
 
     protected abstract List<List<double>> GenerateValues();
+
+    protected virtual List<IList> GenerateValuesExtended() {
+      return null;
+    }
   }
 }
Index: branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VariousInstanceProvider.cs
===================================================================
--- branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VariousInstanceProvider.cs	(revision 17364)
+++ branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VariousInstanceProvider.cs	(revision 17364)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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.Random;
+
+namespace HeuristicLab.Problems.Instances.DataAnalysis {
+  public class VectorDataInstanceProvider : ArtificialRegressionInstanceProvider {
+    public override string Name {
+      get { return "Vector Data Benchmark Problems"; }
+    }
+    public override string Description {
+      get { return ""; }
+    }
+    public override Uri WebLink {
+      get { return new Uri("http://dev.heuristiclab.com/trac/hl/core/wiki/AdditionalMaterial"); }
+    }
+    public override string ReferencePublication {
+      get { return ""; }
+    }
+    public int Seed { get; private set; }
+
+    public VectorDataInstanceProvider()
+      : this((int)DateTime.Now.Ticks) { }
+
+    public VectorDataInstanceProvider(int seed)
+      : base() {
+      Seed = seed;
+    }
+    public override IEnumerable<IDataDescriptor> GetDataDescriptors() {
+      var rand = new MersenneTwister((uint)Seed);
+      return new List<IDataDescriptor> {
+        new VectorDataTestOne(rand.Next())
+      };
+    }
+  }
+}
Index: branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataTestOne.cs
===================================================================
--- branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataTestOne.cs	(revision 17364)
+++ branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataTestOne.cs	(revision 17364)
@@ -0,0 +1,101 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Remoting.Messaging;
+using HeuristicLab.Core;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.Instances.DataAnalysis {
+  public class VectorDataTestOne : ArtificialRegressionDataDescriptor {
+
+    public override string Name { get { return "Vector Data Test - I (Y = X1 * sum(V1) + X2 * avg(V2)"; } }
+    public override string Description { get { return ""; } }
+
+    protected override string TargetVariable { get { return "Y"; } }
+    protected override string[] VariableNames { get { return new string[] { "X1", "X2", "X3", "V1", "V2", "Y" }; } }
+    protected override string[] AllowedInputVariables { get { return new string[] { "X1", "X2", "X3", "V1", "V2" }; } }
+    protected override int TrainingPartitionStart { get { return 0; } }
+    protected override int TrainingPartitionEnd { get { return 80; } }
+    protected override int TestPartitionStart { get { return 80; } }
+    protected override int TestPartitionEnd { get { return 100; } }
+
+    public int Seed { get; private set; }
+
+    public VectorDataTestOne()
+      : this((int)DateTime.Now.Ticks) { }
+    public VectorDataTestOne(int seed)
+      : base() {
+      Seed = seed;
+    }
+
+
+    protected override List<List<double>> GenerateValues() { return null; }
+    protected override List<IList> GenerateValuesExtended() {
+      var rand = new MersenneTwister((uint)Seed);
+
+      double x1, x2, x3;
+      IReadOnlyList<double> v1, v2;
+      double y;
+
+      var x1Column = new List<double>(100);
+      var x2Column = new List<double>(100);
+      var x3Column = new List<double>(100);
+      var v1Column = new List<IReadOnlyList<double>>(100);
+      var v2Column = new List<IReadOnlyList<double>>(100);
+      var yColumn = new List<double>(100);
+
+      for (int i = 0; i < 100; i++) {
+        x1 = GetRandomDouble(-2, 2, rand);
+        x2 = GetRandomDouble(2, 6, rand);
+        x3 = GetRandomDouble(0, 1, rand);
+        int length = rand.Next(3, 6);
+        v1 = GetRandomDoubleVector(-2, 2, length, rand);
+        v2 = GetRandomDoubleVector(3, 5, length, rand);
+        y = x1 * v1.Sum() + x2 * v2.Average();
+
+        x1Column.Add(x1);
+        x2Column.Add(x2);
+        x3Column.Add(x3);
+        v1Column.Add(v1);
+        v2Column.Add(v2);
+        yColumn.Add(y);
+      }
+
+      return new List<IList> { x1Column, x2Column, x3Column, v1Column, v2Column, yColumn };
+    }
+
+
+    private static double GetRandomDouble(double min, double max, IRandom rand) {
+      return (max - min) * rand.NextDouble() + min;
+    }
+    private static double[] GetRandomDoubleVector(double min, double max, int length, IRandom rand) {
+      var values = new double[length];
+      for (int i = 0; i < values.Length; i++) {
+        values[i] = GetRandomDouble(min, max, rand);
+      }
+      return values;
+    }
+  }
+}
