Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/ConvexHullMeasures.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/ConvexHullMeasures.cs	(revision 10096)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/ConvexHullMeasures.cs	(revision 10097)
@@ -54,13 +54,13 @@
     //calculates the volume of a convex d-polytope
     //decomposition based on boundary triangulation
-    public static double CalculateVolume(List<double[]> hyperHull) {
-      double[] innerPoint = CalculateInnerPoint(hyperHull);
+    public static double CalculateVolume(List<double[]> convexHull) {
+      double[] innerPoint = CalculateInnerPoint(convexHull);
       double volume = 0.0;
 
-      for (int i = 0; i < hyperHull.Count - 1; i += 2) {
+      for (int i = 0; i < convexHull.Count - 1; i += 2) {
         List<double[]> simplex = new List<double[]>();
         simplex.Add(innerPoint);
-        simplex.Add(hyperHull[i]);
-        simplex.Add(hyperHull[i + 1]);
+        simplex.Add(convexHull[i]);
+        simplex.Add(convexHull[i + 1]);
         volume += CalculateSimplexVolume(simplex);
       }
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/DistanceMatrixToPoints.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/DistanceMatrixToPoints.cs	(revision 10096)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/DistanceMatrixToPoints.cs	(revision 10097)
@@ -61,5 +61,70 @@
       int pi = 0;
       for (int i = 0; i < dm.Length; i++) {
-        if (!q[i].IsAlmost(0) && q[i] > 0.0) {
+        if (!q[i].IsAlmost(0.0) && q[i] > 0.0) {
+          for (int j = 0; j < dm.Length; j++) {
+            points[j][pi] = Math.Sqrt(q[i]) * v[j, i];
+          }
+          pi++;
+        }
+      }
+
+      return points;
+    }
+
+    public static double[][] MetricMDS(double[][] dm) {
+      double[][] points = new double[dm.Length][];
+      double[,] a = new double[dm.Length, dm.Length];
+      double[,] b = new double[dm.Length, dm.Length];
+      double[] ai = new double[dm.Length];
+      double[] aj = new double[dm.Length];
+      double aavg = 0.0;
+      double[] q = new double[dm.Length];
+      double[,] v = new double[dm.Length, dm.Length];
+
+
+      for (int i = 0; i < dm.Length; i++) {
+        for (int j = 0; j < dm.Length; j++) {
+          a[i, j] = -0.5 * Math.Pow(dm[i][j], 2);
+          aavg += a[i, j];
+        }
+      }
+
+      aavg /= dm.Length * dm.Length;
+
+      for (int i = 0; i < dm.Length; i++) {
+        ai[i] = dm[i].Average();
+      }
+
+      for (int i = 0; i < dm.Length; i++) {
+        for (int j = 0; j < dm.Length; j++) {
+          aj[i] += dm[j][i];
+        }
+        aj[i] /= dm.Length;
+      }
+
+      for (int i = 0; i < dm.Length; i++) {
+        for (int j = 0; j < dm.Length; j++) {
+          b[i, j] = a[i, j] - ai[i] - aj[j] + aavg;
+        }
+      }
+
+      //TODO: check b for negative values and make it positiv
+
+      double[] tau;
+      double[,] r;
+      alglib.rmatrixqr(ref b, dm.Length, dm.Length, out tau);
+      alglib.rmatrixqrunpackr(b, dm.Length, dm.Length, out r);
+
+      bool res = alglib.smatrixevd(r, dm.Length, 1, true, out q, out v);
+      if (!res) throw new Exception("Eigenvalue computation did not converge!");
+
+      int zeroCnt = q.Count(x => x.IsAlmost(0) || x < 0.0);
+      for (int i = 0; i < dm.Length; i++) {
+        points[i] = new double[dm.Length - zeroCnt];
+      }
+
+      int pi = 0;
+      for (int i = 0; i < dm.Length; i++) {
+        if (!q[i].IsAlmost(0.0) && q[i] > 0.0) {
           for (int j = 0; j < dm.Length; j++) {
             points[j][pi] = Math.Sqrt(q[i]) * v[j, i];
