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 17587)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/HeuristicLab.Problems.Instances.DataAnalysis-3.3.csproj	(revision 17588)
@@ -262,4 +262,5 @@
     <Compile Include="Regression\VectorData\RandomExtensions.cs" />
     <Compile Include="Regression\VectorData\VectorDataInstanceProvider.cs" />
+    <Compile Include="Regression\VectorData\VectorDataTestThree.cs" />
     <Compile Include="Regression\VectorData\VectorDataTestTwo.cs" />
     <Compile Include="Regression\VectorData\VectorDataTestOne.cs" />
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/AzzaliBenchmark3.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/AzzaliBenchmark3.cs	(revision 17587)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/AzzaliBenchmark3.cs	(revision 17588)
@@ -33,5 +33,5 @@
 namespace HeuristicLab.Problems.Instances.DataAnalysis {
   public class AzzaliBenchmark3 : ArtificialRegressionDataDescriptor {
-    public override string Name { get { return "Azzali Benchmark2 B3 = CumMin[3,3] * (X2 / X3) + X4"; } }
+    public override string Name { get { return "Azzali Benchmark3 B3 = CumMin[3,3] * (X2 / X3) + X4"; } }
     public override string Description { get { return "I. Azzali, L. Vanneschi, S. Silva, I. Bakurov, and M. Giacobini, “A Vectorial Approach to Genetic Programming,” EuroGP, pp. 213–227, 2019."; } }
 
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/RandomExtensions.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/RandomExtensions.cs	(revision 17587)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/RandomExtensions.cs	(revision 17588)
@@ -37,4 +37,13 @@
       return DoubleVector.Build.Dense(values);
     }
+
+    public static DoubleVector NextIncreasingDoubleVector(this IRandom rand, double min, double max, int length) {
+      var values = new double[length];
+      for (int i = 0; i < values.Length; i++) {
+        double offset = i * rand.NextDouble();
+        values[i] = rand.NextDouble(min, max) + offset;
+      }
+      return DoubleVector.Build.Dense(values);
+    }
   }
 }
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataInstanceProvider.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataInstanceProvider.cs	(revision 17587)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataInstanceProvider.cs	(revision 17588)
@@ -58,4 +58,8 @@
         //new VectorDataTestTwoC(rand.Next()),
         //new VectorDataTestTwoD(rand.Next()),
+        new VectorDataTestThreeA(rand.Next()),
+        new VectorDataTestThreeB(rand.Next()),
+        new VectorDataTestThreeC(rand.Next()),
+        new VectorDataTestThreeD(rand.Next()),
         new AzzaliBenchmark1(rand.Next()),
         new AzzaliBenchmark2(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 17587)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataTestOne.cs	(revision 17588)
@@ -27,5 +27,4 @@
 using HeuristicLab.Random;
 using MathNet.Numerics.Statistics;
-
 using DoubleVector = MathNet.Numerics.LinearAlgebra.Vector<double>;
 
@@ -33,5 +32,5 @@
   public abstract class VectorDataTestOne : ArtificialRegressionDataDescriptor {
 
-    protected const int Rows = 100;
+    protected const int Rows = 1000;
 
     public override string Description { get { return ""; } }
@@ -77,5 +76,5 @@
         int v1Length = vectorLengths[0][i];
         int v2Length = vectorLengths[1][i];
-        v1 = rand.NextDoubleVector(-2, 2, v1Length);
+        v1 = rand.NextDoubleVector(2, 6, v1Length);
         v2 = rand.NextDoubleVector(3, 5, v2Length);
 
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataTestThree.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataTestThree.cs	(revision 17588)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataTestThree.cs	(revision 17588)
@@ -0,0 +1,167 @@
+﻿#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 HeuristicLab.Core;
+using HeuristicLab.Random;
+using MathNet.Numerics.Statistics;
+using DoubleVector = MathNet.Numerics.LinearAlgebra.Vector<double>;
+
+namespace HeuristicLab.Problems.Instances.DataAnalysis {
+  public abstract class VectorDataTestThree : ArtificialRegressionDataDescriptor {
+
+    protected const int Rows = 1000;
+
+    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 Rows * 3 / 4; } }
+    protected override int TestPartitionStart { get { return TrainingPartitionEnd; } }
+    protected override int TestPartitionEnd { get { return Rows; } }
+
+    public int Seed { get; private set; }
+
+    protected VectorDataTestThree()
+      : this((int)DateTime.Now.Ticks) { }
+    protected VectorDataTestThree(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;
+      DoubleVector v1, v2;
+      double y;
+
+      var x1Column = new List<double>(Rows);
+      var x2Column = new List<double>(Rows);
+      var x3Column = new List<double>(Rows);
+      var v1Column = new List<DoubleVector>(Rows);
+      var v2Column = new List<DoubleVector>(Rows);
+      var yColumn = new List<double>(Rows);
+
+      var vectorLengths = GetVectorLengths(rand);
+      for (int i = 0; i < Rows; i++) {
+        x1 = rand.NextDouble(-2, 2);
+        x2 = rand.NextDouble(2, 6);
+        x3 = rand.NextDouble(0, 1);
+        int v1Length = vectorLengths[0][i];
+        int v2Length = vectorLengths[1][i];
+        v1 = rand.NextIncreasingDoubleVector(1, 4, v1Length);
+        v2 = rand.NextIncreasingDoubleVector(3, 5, v2Length);
+
+        //Y = (X1 + sum[2:](V1)) * mean[:-2](V2 + X2)
+        y = (x1 + v1.SubVector(2, v1.Count - 2).Sum() ) * (v2 + x2).SubVector(0, v2.Count - 2).Mean();
+
+        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 };
+    }
+
+    protected abstract List<int>[] GetVectorLengths(IRandom rand);
+  }
+
+  public class VectorDataTestThreeA : VectorDataTestThree {
+    public override string Name {
+      get { return "Vector Data Test - III [fully-constrained]: Y = (X1 + sum[2:](V1)) * mean[:-2](V2 + X2)"; }
+    }
+
+    public VectorDataTestThreeA() : base() { }
+    public VectorDataTestThreeA(int seed) : base(seed) { }
+
+    protected override List<int>[] GetVectorLengths(IRandom rand) {
+      // always same length
+      const int length = 8;
+      return new List<int>[2] {
+        Enumerable.Repeat(length, Rows).ToList(),
+        Enumerable.Repeat(length, Rows).ToList()
+      };
+    }
+  }
+
+  public class VectorDataTestThreeB : VectorDataTestThree {
+    public override string Name { get { return "Vector Data Test - III [row-constrained]: Y = (X1 + sum[2:](V1)) * mean[:-2](V2 + X2)"; } }
+
+    public VectorDataTestThreeB() : base() { }
+    public VectorDataTestThreeB(int seed) : base(seed) { }
+
+    protected override List<int>[] GetVectorLengths(IRandom rand) {
+      // length between length 6 and 10, same row always the same length
+      var lengths = Enumerable.Range(0, Rows).Select(i => rand.Next(6, 10)).ToList();
+      return new List<int>[2] {
+        Enumerable.Range(0, Rows).Select(i => lengths[i]).ToList(),
+        Enumerable.Range(0, Rows).Select(i => lengths[i]).ToList()
+      };
+    }
+  }
+
+  public class VectorDataTestThreeC : VectorDataTestThree {
+    public override string Name { get { return "Vector Data Test - III [column-constrained]: Y = (X1 + sum[2:](V1)) * mean[:-2](V2 + X2)"; } }
+
+    public VectorDataTestThreeC() : base() { }
+    public VectorDataTestThreeC(int seed) : base(seed) { }
+
+    protected override List<int>[] GetVectorLengths(IRandom rand) {
+      // length between length 6 and 10; each feature is same length
+      // force two different lengths
+      int v1Length = rand.Next(6, 10);
+      int v2Length;
+      do {
+        v2Length = rand.Next(6, 10);
+      } while (v1Length != v2Length);
+      return new List<int>[2] {
+        Enumerable.Repeat(v1Length, Rows).ToList(),
+        Enumerable.Repeat(v2Length, Rows).ToList()
+      };
+    }
+  }
+
+  public class VectorDataTestThreeD : VectorDataTestThree {
+    public override string Name { get { return "Vector Data Test - III [unconstrained]: Y = (X1 + sum[2:](V1)) * mean[:-2](V2 + X2)"; } }
+
+    public VectorDataTestThreeD() : base() { }
+    public VectorDataTestThreeD(int seed) : base(seed) { }
+
+    protected override List<int>[] GetVectorLengths(IRandom rand) {
+      // always random between 6 and 10
+      return new List<int>[2] {
+          Enumerable.Range(0, Rows).Select(i => rand.Next(6, 10)).ToList(),
+          Enumerable.Range(0, Rows).Select(i => rand.Next(6, 10)).ToList()
+        };
+    }
+  }
+}
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataTestTwo.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataTestTwo.cs	(revision 17587)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataTestTwo.cs	(revision 17588)
@@ -26,6 +26,4 @@
 using HeuristicLab.Core;
 using HeuristicLab.Random;
-using MathNet.Numerics.Statistics;
-
 using DoubleVector = MathNet.Numerics.LinearAlgebra.Vector<double>;
 
@@ -73,12 +71,12 @@
       for (int i = 0; i < Rows; i++) {
         x1 = rand.NextDouble(-2, 2);
-        x2 = rand.NextDouble(2, 6);
+        x2 = rand.NextDouble(4, 6);
         x3 = rand.NextDouble(0, 1);
         int v1Length = vectorLengths[0][i];
         int v2Length = vectorLengths[1][i];
         v1 = rand.NextDoubleVector(-2, 2, v1Length);
-        v2 = rand.NextDoubleVector(3, 5, v2Length);
+        v2 = rand.NextDoubleVector(2, 4, v2Length);
 
-        y = x1 * v1.PointwiseExp().PointwiseMultiply(v2 + x2).Sum();
+        y = x1 * v1.PointwiseExp().PointwiseMultiply(x2  - v2 - 2).Sum();
 
         x1Column.Add(x1);
@@ -98,5 +96,5 @@
   public class VectorDataTestTwoA : VectorDataTestTwo {
     public override string Name {
-      get { return "Vector Data Test - II [fully-constrained]: Y = X1 * sum(exp(V1) * (V2 + X2))"; }
+      get { return "Vector Data Test - II [fully-constrained]: Y = X1 * sum(exp(V1) * (X2 - V2 - 2))"; }
     }
 
@@ -115,5 +113,5 @@
 
   public class VectorDataTestTwoB : VectorDataTestTwo {
-    public override string Name { get { return "Vector Data Test - II [row-constrained]: Y = X1 * mean(exp(V1) + X2 * V2)"; } }
+    public override string Name { get { return "Vector Data Test - II [row-constrained]: Y = X1 * sum(exp(V1) * (X2 - V2 - 2))"; } }
 
     public VectorDataTestTwoB() : base() { }
@@ -131,5 +129,5 @@
 
   //public class VectorDataTestTwoC : VectorDataTestTwo {
-  //  public override string Name { get { return "Vector Data Test - II [column-constrained]: Y = X1 * mean(exp(V1) + X2 * V2)"; } }
+  //  public override string Name { get { return "Vector Data Test - II [column-constrained]: Y = X1 * sum(exp(V1) * (X2 - V2 - 2))"; } }
 
   //  public VectorDataTestTwoC() : base() { }
@@ -152,5 +150,5 @@
 
   //public class VectorDataTestTwoD : VectorDataTestTwo {
-  //  public override string Name { get { return "Vector Data Test - II [unconstrained]: Y = X1 * mean(exp(V1) + X2 * V2)"; } }
+  //  public override string Name { get { return "Vector Data Test - II [unconstrained]: Y = X1 * sum(exp(V1) * (X2 - V2 - 2))"; } }
 
   //  public VectorDataTestTwoD() : base() { }
