Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/KnowledgeCenter.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/KnowledgeCenter.cs	(revision 13809)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/KnowledgeCenter.cs	(revision 13878)
@@ -657,4 +657,48 @@
     }
 
+    public static double[][] GetFeaturesStandardized(IRun[] problemInstances, string[] characteristics, out double[] means, out double[] sdevs, double[] medianValues = null) {
+      var instances = new double[problemInstances.Length][];
+      var columns = new List<double>[characteristics.Length];
+      for (var p = 0; p < problemInstances.Length; p++) {
+        instances[p] = new double[characteristics.Length];
+        for (var f = 0; f < characteristics.Length; f++) {
+          if (columns[f] == null) {
+            columns[f] = new List<double>(problemInstances.Length);
+          }
+          IItem item;
+          if (problemInstances[p].Results.TryGetValue(characteristics[f], out item)) {
+            double val = 0;
+            var dItem = item as DoubleValue;
+            if (dItem != null) {
+              val = dItem.Value;
+            } else {
+              var iItem = item as IntValue;
+              if (iItem != null) val = iItem.Value;
+              else val = double.NaN;
+            }
+            if (double.IsNaN(val) && medianValues != null)
+              instances[p][f] = medianValues[f];
+            else instances[p][f] = val;
+            columns[f].Add(instances[p][f]);
+          } else instances[p][f] = medianValues != null ? medianValues[f] : double.NaN;
+        }
+      }
+
+      means = new double[characteristics.Length];
+      sdevs = new double[characteristics.Length];
+      for (var f = 0; f < characteristics.Length; f++) {
+        var mean = columns[f].Average();
+        var dev = columns[f].StandardDeviation();
+        means[f] = mean;
+        sdevs[f] = dev;
+        for (var p = 0; p < problemInstances.Length; p++) {
+          if (dev.IsAlmost(0)) instances[p][f] = 0;
+          else instances[p][f] = (instances[p][f] - mean) / dev;
+        }
+      }
+
+      return instances;
+    }
+
     public static double[] GetMedianValues(IRun[] problemInstances, string[] characteristics) {
       var values = new List<double>[characteristics.Length];
@@ -704,4 +748,12 @@
                           .GroupBy(x => algorithmId2AlgorithmInstanceMapping.GetByFirst(algorithmId2RunMapping.GetBySecond(x).Single()))
                           .ToDictionary(x => x.Key, x => ExpectedRuntimeHelper.CalculateErt(x.ToList(), "QualityPerEvaluations", target, Maximization).ExpectedRuntime);
+    }
+
+    public Dictionary<IAlgorithm, double> GetAlgorithmPerformanceLog10(IRun problemInstance) {
+      if (!problemInstance.Parameters.ContainsKey("BestKnownQuality")) return new Dictionary<IAlgorithm, double>();
+      var target = GetTarget(((DoubleValue)problemInstance.Parameters["BestKnownQuality"]).Value, MinimumTarget.Value, Maximization);
+      return knowledgeBase.Where(x => ((StringValue)x.Parameters["Problem Name"]).Value == ((StringValue)problemInstance.Parameters["Problem Name"]).Value)
+                          .GroupBy(x => algorithmId2AlgorithmInstanceMapping.GetByFirst(algorithmId2RunMapping.GetBySecond(x).Single()))
+                          .ToDictionary(x => x.Key, x => Math.Log10(ExpectedRuntimeHelper.CalculateErt(x.ToList(), "QualityPerEvaluations", target, Maximization).ExpectedRuntime));
     }
 
@@ -802,5 +854,5 @@
 
         var values = pr.GroupBy(x => algorithmId2RunMapping.GetBySecond(x).Single())
-                       .ToDictionary(x => x.Key, x => ExpectedRuntimeHelper.CalculateErt(x.ToList(), "QualityPerEvaluations", GetTarget(bkq, target, max), max).ExpectedRuntime);
+                       .ToDictionary(x => x.Key, x => Math.Log10(ExpectedRuntimeHelper.CalculateErt(x.ToList(), "QualityPerEvaluations", GetTarget(bkq, target, max), max).ExpectedRuntime));
         var ranks = ClusteringHelper<long>.Cluster(nClasses, values, x => double.IsInfinity(x.Value))
           .GetByCluster().ToList();
