Index: /trunk/sources/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj	(revision 14120)
+++ /trunk/sources/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj	(revision 14121)
@@ -21,5 +21,5 @@
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -30,5 +30,5 @@
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
-    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
Index: /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/CrowdingTest.cs
===================================================================
--- /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/CrowdingTest.cs	(revision 14121)
+++ /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/CrowdingTest.cs	(revision 14121)
@@ -0,0 +1,140 @@
+﻿#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/>.
+ */
+#endregion
+using System;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Problems.TestFunctions.MultiObjective.Tests {
+  [TestClass]
+  public class CrowdingTest {
+
+    [TestMethod]
+    [ExpectedException(typeof(ArgumentException))]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void CrowdingTestEmptyFront() {
+      double[][] front = { };
+
+      Crowding.Calculate(front, null);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void CrowdingTestSamePoint() {
+
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+
+      double[] point1 = new double[2];
+      point1[0] = 0.5;
+      point1[1] = 0.5;
+      double[][] front = { point, point1 };
+      double dist = Crowding.Calculate(front, new double[,] { { 0, 1 }, { 0, 1 } });
+      Assert.AreEqual(double.PositiveInfinity, dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void CrowdingTestSinglePoint() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[][] front = { point };
+      double dist = Crowding.Calculate(front, new double[,] { { 0, 1 }, { 0, 1 } });
+      Assert.AreEqual(double.PositiveInfinity, dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void CrowdingTestDiagonal() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[] point1 = new double[2];
+      point1[0] = 0.5;
+      point1[1] = 0.5;
+
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 1;
+      double[][] front = { point, point1, point2 };
+      double dist = Crowding.Calculate(front, new double[,] { { 0, 1 }, { 0, 1 } });
+      Assert.AreEqual(2, dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void CrowdingTestDiamond() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[] point1 = new double[2];
+      point1[0] = 1;
+      point1[1] = 1.5;
+
+      double[] point2 = new double[2];
+      point2[0] = 3;
+      point2[1] = 0.5;
+      double[] point3 = new double[2];
+      point3[0] = 4;
+      point3[1] = 2;
+      double[][] front = { point, point1, point2, point3 };
+      double dist = Crowding.Calculate(front, new double[,] { { 0, 4 }, { 0, 2 } });
+      Assert.AreEqual(1.5, dist);
+    }
+
+    /// <summary> 
+    /// deltoid with 4 points of the 1-unit-square and the northeastern point at 4,4
+    /// 
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void CrowdingTestDeltoid() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[] point1 = new double[2];
+      point1[0] = 0.00000001;         //points should not be exactly equal because sorting behaviour could change result
+      point1[1] = 1.00000001;
+
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 0;
+      double[] point3 = new double[2];
+      point3[0] = 4;
+      point3[1] = 4;
+
+
+      double[][] front = { point, point1, point2, point3, };
+      double dist = Crowding.Calculate(front, new double[,] { { 0, 4 }, { 0, 4 } });
+      Assert.AreEqual(1.25, dist);
+    }
+
+
+  }
+
+
+}
Index: /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/FastHyperVolumeTests.cs
===================================================================
--- /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/FastHyperVolumeTests.cs	(revision 14121)
+++ /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/FastHyperVolumeTests.cs	(revision 14121)
@@ -0,0 +1,115 @@
+﻿#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/>.
+ */
+#endregion
+using System;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Problems.TestFunctions.MultiObjective.Tests {
+  [TestClass]
+  public class FastHypervolumeTest {
+    /// <summary>
+    ///  /*
+    /// +-----+
+    /// |     |
+    /// |  x  |
+    /// |     |
+    /// +-----+
+    /// 
+    /// box between(0,0,0) and(1,1,1) with singular point pareto front at(0.5,0.5,0.5)
+    /// Hypervolume should be 0.125;  
+    /// 
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void FastHypervolumeTestSinglePoint() {
+      double[] point = new double[] { 0.5, 0.5, 0.5 };
+      double[][] front = { point };
+      double[] referencePoint = new double[] { 1, 1, 1 };
+      double hv = Hypervolume.Calculate(front, referencePoint, new bool[3]);
+      Assert.AreEqual(0.125, hv);
+    }
+
+    /// <summary>
+    ///  /*
+    /// +-----+
+    /// | x   |
+    /// |     |
+    /// |     |
+    /// +-----+
+    /// 
+    /// box between(0,0) and(1,1) with singular point pareto front at a random Location
+    /// Sum of the Hypervolume to each of the corners should be 1;  
+    /// 
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void FastHypervolumeTestRandomSinglePoint() {
+      //Front with a single Point
+      double[] point = new double[3];
+      var r = new System.Random();
+
+      point[0] = r.NextDouble();
+      point[1] = r.NextDouble();
+      point[2] = r.NextDouble();
+      double[][] front = { point };
+
+      double[] referencePoint = new double[3];
+
+      //Northeast
+      referencePoint[0] = 1;
+      referencePoint[1] = 1;
+      referencePoint[2] = 1;
+      double hv = Hypervolume.Calculate(front, referencePoint, new bool[3]);
+      double hv2 = 1;
+      foreach (double d in point) {
+        hv2 *= Math.Abs(d - 1);
+      }
+      Assert.AreEqual(hv2, hv);
+    }
+
+    /// <summary>
+    ///  /*
+    /// x-----+
+    /// |     |
+    /// |  X  |
+    /// |     |
+    /// +-----x
+    /// 
+    /// box between(0,0,0) and(1,1,1) with three point (pareto) front at (1,0,0), (0.5,0.5,0)  and (0,1,0) 
+    /// Hypervolume should be 0.25
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void FastHypervolumeTestDiagonalPoint() {
+      //Front with three points
+      double[] point1 = new double[] { 1, 0, 0 };
+      double[] point2 = new double[] { 0, 1, 0 };
+      double[] point3 = new double[] { 0.5, 0.5, 0 };
+      double[][] front = { point1, point2, point3 };
+
+      double[] referencePoint = new double[] { 1, 1, 1 };
+      double hv = Hypervolume.Calculate(front, referencePoint, new bool[3]);
+      Assert.AreEqual(0.5, hv);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/GenerationalDistanceTest.cs
===================================================================
--- /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/GenerationalDistanceTest.cs	(revision 14121)
+++ /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/GenerationalDistanceTest.cs	(revision 14121)
@@ -0,0 +1,130 @@
+﻿#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/>.
+ */
+#endregion
+using System;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Problems.TestFunctions.MultiObjective.Tests {
+  [TestClass]
+  public class GenerationalDistanceTest {
+
+    [TestMethod]
+    [ExpectedException(typeof(ArgumentException))]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void GenerationalDistanceTestEmptyOptimalFront() {
+
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+      double[][] referencefront = { };
+      GenerationalDistance.Calculate(front, referencefront, 1);
+    }
+
+    [TestMethod]
+    [ExpectedException(typeof(ArgumentException))]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void GenerationalDistanceTestEmptyFront() {
+
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { };
+      double[][] referencefront = { point };
+      GenerationalDistance.Calculate(front, referencefront, 1);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void GenerationalDistanceTestSamePoint() {
+
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+      double[] point1 = new double[2];
+      point1[0] = 0.5;
+      point1[1] = 0.5;
+      double[][] referencefront = { point1 };
+      double dist = GenerationalDistance.Calculate(front, referencefront, 1);
+      Assert.AreEqual(0, dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void GenerationalDistanceTestSinglePoint() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[][] front = { point };
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 1;
+      double[][] referencefront = { point2 };
+      double dist = GenerationalDistance.Calculate(front, referencefront, 1);
+      Assert.AreEqual(Math.Sqrt(2), dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void GenerationalDistanceTestDifferentSizes() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[] point1 = new double[2];
+      point1[0] = 1;
+      point1[1] = 0.5;
+      double[][] front = { point, point1 };
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 0;
+      double[][] referencefront = { point2 };
+      double dist = GenerationalDistance.Calculate(front, referencefront, 1);
+      Assert.AreEqual(0.75, dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void GenerationalDistanceTestQuadratic() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[] point1 = new double[2];
+      point1[0] = 0;
+      point1[1] = 1;
+      double[][] front = { point, point1 };
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 0;
+      double[] point3 = new double[2];
+      point3[0] = 1;
+      point3[1] = 1;
+      double[][] referencefront = { point2, point3 };
+      double dist = GenerationalDistance.Calculate(front, referencefront, 1);
+      Assert.AreEqual(1, dist);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/HyperVolumeTests.cs
===================================================================
--- /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/HyperVolumeTests.cs	(revision 14121)
+++ /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/HyperVolumeTests.cs	(revision 14121)
@@ -0,0 +1,286 @@
+﻿#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/>.
+ */
+#endregion
+using System;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Problems.TestFunctions.MultiObjective.Tests {
+  [TestClass]
+  public class HypervolumeTest {
+
+    /// <summary>
+    ///  /*
+    /// +-----+
+    /// |     |
+    /// |  x  |
+    /// |     |
+    /// +-----+
+    /// 
+    /// box between(0,0) and(1,1) with singular point pareto front at(0.5,0.5)
+    /// Hypervolume to each of the corners should be 0.25;  
+    /// 
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestSinglePoint() {
+
+      //Front with a single Point
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //Northeast
+      maximization = new bool[] { false, false };
+      referencePoint[0] = 1;
+      referencePoint[1] = 1;
+      double ne = Hypervolume.Calculate(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, ne);
+
+      //NorthWest
+      maximization = new bool[] { true, false };
+      referencePoint[0] = 0;
+      referencePoint[1] = 1;
+      double nw = Hypervolume.Calculate(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, nw);
+
+      //SouthWest
+      maximization = new bool[] { true, true };
+      referencePoint[0] = 0;
+      referencePoint[1] = 0;
+      double sw = Hypervolume.Calculate(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, sw);
+
+      //SouthEast
+      maximization = new bool[] { false, true };
+      referencePoint[0] = 1;
+      referencePoint[1] = 0;
+      double se = Hypervolume.Calculate(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, se);
+
+
+    }
+
+    /// <summary>
+    ///  /*
+    /// +-----+
+    /// | x   |
+    /// |     |
+    /// |     |
+    /// +-----+
+    /// 
+    /// box between(0,0) and(1,1) with singular point pareto front at a random Location
+    /// Sum of the Hypervolume to each of the corners should be 1;  
+    /// 
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestRandomSinglePoint() {
+      //Front with a single Point
+      double[] point = new double[2];
+      var r = new System.Random();
+
+      point[0] = r.NextDouble();
+      point[1] = r.NextDouble();
+      double[][] front = { point };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //Northeast
+      maximization = new bool[] { false, false };
+      referencePoint[0] = 1;
+      referencePoint[1] = 1;
+      double ne = Hypervolume.Calculate(front, referencePoint, maximization);
+
+      //NorthWest
+      maximization = new bool[] { true, false };
+      referencePoint[0] = 0;
+      referencePoint[1] = 1;
+      double nw = Hypervolume.Calculate(front, referencePoint, maximization);
+
+      //SouthWest
+      maximization = new bool[] { true, true };
+      referencePoint[0] = 0;
+      referencePoint[1] = 0;
+      double sw = Hypervolume.Calculate(front, referencePoint, maximization);
+
+      //SouthEast
+      maximization = new bool[] { false, true };
+      referencePoint[0] = 1;
+      referencePoint[1] = 0;
+      double se = Hypervolume.Calculate(front, referencePoint, maximization);
+      Assert.AreEqual(1.0, ne + se + nw + sw, 1e8);
+    }
+
+    /// <summary>
+    ///  /*
+    /// x-----+
+    /// |     |
+    /// |  X  |
+    /// |     |
+    /// +-----x
+    /// 
+    /// box between(0,0) and(1,1) with three point (pareto) front at (1,0), (0.5,0.5)  and (0,1) 
+    /// Hypervolume to (1,0) and (0,1) of the corners should be 1 (dominated Points need to be reemoved beforehand and   
+    /// Hypervolume to (0,0) and (1,1) of the corners should be 0.25
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestDiagonalPoint() {
+      //Front with three points
+      double[] point1 = new double[2];
+      point1[0] = 0;
+      point1[1] = 1;
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 0;
+      double[] point3 = new double[2];
+      point3[0] = 0.5;
+      point3[1] = 0.5;
+      double[][] front = { point1, point2, point3 };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //Northeast
+      maximization = new bool[] { false, false };
+      referencePoint[0] = 1;
+      referencePoint[1] = 1;
+      double ne = Hypervolume.Calculate(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, ne);
+
+      //NorthWest
+      maximization = new bool[] { true, false };
+      referencePoint[0] = 0;
+      referencePoint[1] = 1;
+      double nw = Hypervolume.Calculate(NonDominatedSelect.SelectNonDominatedVectors(front, maximization, true), referencePoint, maximization);
+      Assert.AreEqual(1, nw);
+
+      //SouthWest
+      maximization = new bool[] { true, true };
+      referencePoint[0] = 0;
+      referencePoint[1] = 0;
+      double sw = Hypervolume.Calculate(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, sw);
+
+      //SouthEast
+      maximization = new bool[] { false, true };
+      referencePoint[0] = 1;
+      referencePoint[1] = 0;
+      double se = Hypervolume.Calculate(NonDominatedSelect.SelectNonDominatedVectors(front, maximization, true), referencePoint, maximization);
+      Assert.AreEqual(1, se);
+
+    }
+
+    [TestMethod()]
+    [ExpectedException(typeof(ArgumentException))]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestReferencePointViolationNE() {
+      //Front with a single Point
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //Northeast
+      maximization = new bool[] { true, true };
+      referencePoint[0] = 1;
+      referencePoint[1] = 1;
+      double ne = Hypervolume.Calculate(front, referencePoint, maximization);
+    }
+
+    [TestMethod()]
+    [ExpectedException(typeof(ArgumentException))]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestReferencePointViolationNW() {
+      //Front with a single Point
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //NorthWest
+      maximization = new bool[] { false, true };
+      referencePoint[0] = 0;
+      referencePoint[1] = 1;
+      double nw = Hypervolume.Calculate(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, nw);
+    }
+
+    [TestMethod()]
+    [ExpectedException(typeof(ArgumentException))]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestReferencePointViolationSW() {
+      //Front with a single Point
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //SouthWest
+      maximization = new bool[] { false, false };
+      referencePoint[0] = 0;
+      referencePoint[1] = 0;
+      double sw = Hypervolume.Calculate(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, sw);
+    }
+
+    [TestMethod()]
+    [ExpectedException(typeof(ArgumentException))]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestReferencePointViolationSE() {
+      //Front with a single Point
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //SouthEast
+      maximization = new bool[] { true, false };
+      referencePoint[0] = 1;
+      referencePoint[1] = 0;
+      double se = Hypervolume.Calculate(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, se);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/InvertedGenerationalDistanceTest.cs
===================================================================
--- /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/InvertedGenerationalDistanceTest.cs	(revision 14121)
+++ /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/InvertedGenerationalDistanceTest.cs	(revision 14121)
@@ -0,0 +1,131 @@
+﻿#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/>.
+ */
+#endregion
+using System;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Problems.TestFunctions.MultiObjective.Tests {
+  [TestClass]
+  public class InvertedGenerationalDistanceTest {
+
+    [TestMethod]
+    [ExpectedException(typeof(ArgumentException))]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void InvertedGenerationalDistanceTestEmptyOptimalFront() {
+
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+      double[][] referencefront = { };
+      InvertedGenerationalDistance.Calculate(front, referencefront, 1);
+    }
+
+    [TestMethod]
+    [ExpectedException(typeof(ArgumentException))]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void InvertedGenerationalDistanceTestEmptyFront() {
+
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { };
+      double[][] referencefront = { point };
+      InvertedGenerationalDistance.Calculate(front, referencefront, 1);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void InvertedGenerationalDistanceTestSamePoint() {
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+      double[] point1 = new double[2];
+      point1[0] = 0.5;
+      point1[1] = 0.5;
+      double[][] referencefront = { point1 };
+      double dist = GenerationalDistance.Calculate(front, referencefront, 1);
+      Assert.AreEqual(0, dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void InvertedGenerationalDistanceTestSinglePoint() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[][] front = { point };
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 1;
+      double[][] referencefront = { point2 };
+      double dist = InvertedGenerationalDistance.Calculate(front, referencefront, 1);
+      Assert.AreEqual(Math.Sqrt(2), dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void InvertedGenerationalDistanceTestDifferentSizes() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[] point1 = new double[2];
+      point1[0] = 1;
+      point1[1] = 0.5;
+      double[][] front = { point, point1 };
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 0;
+      double[][] referencefront = { point2 };
+      double dist = InvertedGenerationalDistance.Calculate(front, referencefront, 1);
+      Assert.AreEqual(0.5, dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void InvertedGenerationalDistanceTestQuadratic() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[] point1 = new double[2];
+      point1[0] = 0;
+      point1[1] = 1;
+      double[][] front = { point, point1 };
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 0;
+      double[] point3 = new double[2];
+      point3[0] = 1;
+      point3[1] = 1;
+      double[][] referencefront = { point2, point3 };
+      double dist = InvertedGenerationalDistance.Calculate(front, referencefront, 1);
+      Assert.AreEqual(1, dist);
+    }
+  }
+
+
+}
Index: /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/SpacingTest.cs
===================================================================
--- /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/SpacingTest.cs	(revision 14121)
+++ /trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3/SpacingTest.cs	(revision 14121)
@@ -0,0 +1,137 @@
+﻿#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/>.
+ */
+#endregion
+using System;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Problems.TestFunctions.MultiObjective.Tests {
+  [TestClass]
+  public class SpacingTest {
+    [TestMethod]
+    [ExpectedException(typeof(ArgumentException))]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void SpacingTestEmptyFront() {
+      double[][] front = { };
+
+      Spacing.Calculate(front);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void SpacingTestSamePoint() {
+
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+
+      double[] point1 = new double[2];
+      point1[0] = 0.5;
+      point1[1] = 0.5;
+      double[][] front = { point, point1 };
+      double dist = Spacing.Calculate(front);
+      Assert.AreEqual(0, dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void SpacingTestSinglePoint() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[][] front = { point };
+      double dist = Spacing.Calculate(front);
+      Assert.AreEqual(0, dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void SpacingTestQuadratic() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[] point1 = new double[2];
+      point1[0] = 0;
+      point1[1] = 1;
+
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 0;
+      double[] point3 = new double[2];
+      point3[0] = 1;
+      point3[1] = 1;
+      double[][] front = { point, point1, point2, point3 };
+      double dist = Spacing.Calculate(front);
+      Assert.AreEqual(0, dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void SpacingTestRectangular() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[] point1 = new double[2];
+      point1[0] = 0;
+      point1[1] = 1;
+
+      double[] point2 = new double[2];
+      point2[0] = 2;
+      point2[1] = 0;
+      double[] point3 = new double[2];
+      point3[0] = 2;
+      point3[1] = 1;
+      double[][] front = { point, point1, point2, point3 };
+      double dist = Spacing.Calculate(front);
+      Assert.AreEqual(0, dist);
+    }
+
+    /// <summary> 
+    /// deltoid with 3 points of the 1-unit-square and the northeastern point at 4,4
+    /// which gives d=(1,1,1,5) for minimal distances. Mean of d is 2 and variance of d is 3
+    /// Spacing is defined as the standarddeviation of d
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Problems.TestFunctions.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void SpacingTestDeltoid() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[] point1 = new double[2];
+      point1[0] = 0;
+      point1[1] = 1;
+
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 0;
+      double[] point3 = new double[2];
+      point3[0] = 4;
+      point3[1] = 4;
+      double[][] front = { point, point1, point2, point3 };
+      double dist = Spacing.Calculate(front);
+      Assert.AreEqual(Math.Sqrt(3), dist);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Tests/HeuristicLab.Tests.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 14120)
+++ /trunk/sources/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 14121)
@@ -385,4 +385,9 @@
     <Reference Include="HeuristicLab.Problems.TestFunctions-3.3">
       <HintPath>..\bin\HeuristicLab.Problems.TestFunctions-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.TestFunctions.MultiObjective-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\bin\HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
@@ -594,4 +599,10 @@
     <Compile Include="HeuristicLab.Problems.TestFunctions-3.3\SumSquaresEvaluatorTest.cs" />
     <Compile Include="HeuristicLab.Problems.TestFunctions-3.3\ZakharovEvaluatorTest.cs" />
+    <Compile Include="HeuristicLab.Problems.TestFunctions.MultiObjective-3.3\CrowdingTest.cs" />
+    <Compile Include="HeuristicLab.Problems.TestFunctions.MultiObjective-3.3\FastHyperVolumeTests.cs" />
+    <Compile Include="HeuristicLab.Problems.TestFunctions.MultiObjective-3.3\GenerationalDistanceTest.cs" />
+    <Compile Include="HeuristicLab.Problems.TestFunctions.MultiObjective-3.3\HyperVolumeTests.cs" />
+    <Compile Include="HeuristicLab.Problems.TestFunctions.MultiObjective-3.3\InvertedGenerationalDistanceTest.cs" />
+    <Compile Include="HeuristicLab.Problems.TestFunctions.MultiObjective-3.3\SpacingTest.cs" />
     <Compile Include="HeuristicLab.Problems.TravelingSalesman-3.3\TSPMoveEvaluatorTest.cs" />
     <Compile Include="HeuristicLab.Problems.LinearAssignment-3.3\LinearAssignmentProblemSolverTest.cs" />
