Index: /branches/PerformanceComparison/HeuristicLab.Analysis/3.3/Clustering/ClusterHelper.cs
===================================================================
--- /branches/PerformanceComparison/HeuristicLab.Analysis/3.3/Clustering/ClusterHelper.cs	(revision 13796)
+++ /branches/PerformanceComparison/HeuristicLab.Analysis/3.3/Clustering/ClusterHelper.cs	(revision 13797)
@@ -31,4 +31,5 @@
     private List<KeyValuePair<T, double>> excluded;
     private int[] clusterValues;
+    private int[] rankedMap;
 
     private ClusteringHelper(int K) {
@@ -50,7 +51,15 @@
       var helper = new ClusteringHelper<T>(k);
       helper.Initialize(values, excludeFunc);
-      if (helper.instances.Count == 0) 
+      if (helper.instances.Count == 0) {
         helper.clusterValues = new int[0];
-      else CkMeans1D.Cluster(helper.instances.Select(x => x.Value).ToArray(), k, out helper.clusterValues);
+        helper.rankedMap = new int[k + 1];
+      } else {
+        var centroids = CkMeans1D.Cluster(helper.instances.Select(x => x.Value).ToArray(), k, out helper.clusterValues);
+        helper.rankedMap = new int[k + 1];
+        var rank = 0;
+        foreach (var c in centroids) helper.rankedMap[c.Value] = rank++;
+      }
+      // excluded are always ranked last
+      helper.rankedMap[k] = k;
       return helper;
     }
@@ -61,10 +70,10 @@
     /// <returns></returns>
     public IEnumerable<KeyValuePair<T, Tuple<double, int>>> GetByInstance() {
-      return GetClustered().Select(x => new KeyValuePair<T, Tuple<double, int>>(x.Item1.Key, Tuple.Create(x.Item1.Value, x.Item2)));
+      return GetClustered().Select(x => new KeyValuePair<T, Tuple<double, int>>(x.Item1.Key, Tuple.Create(x.Item1.Value, rankedMap[x.Item2])));
     }
 
     public IEnumerable<KeyValuePair<int, List<KeyValuePair<T, double>>>> GetByCluster() {
       return GetClustered().GroupBy(x => x.Item2)
-        .Select(x => new KeyValuePair<int, List<KeyValuePair<T, double>>>(x.Key, x.Select(y => y.Item1).ToList()));
+        .Select(x => new KeyValuePair<int, List<KeyValuePair<T, double>>>(rankedMap[x.Key], x.Select(y => y.Item1).ToList()));
     }
 
Index: /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/KnowledgeCenter.cs
===================================================================
--- /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/KnowledgeCenter.cs	(revision 13796)
+++ /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/KnowledgeCenter.cs	(revision 13797)
@@ -421,5 +421,5 @@
         var characteristics = new HashSet<string>();
         var totalProblems = adminClient.Problems.Count(x => x.ProblemClassId == probClassId);
-        Parallel.ForEach(adminClient.Problems.Where(x => x.ProblemClassId == probClassId), new ParallelOptions { MaxDegreeOfParallelism = 3 }, (pInst) => { 
+        Parallel.ForEach(adminClient.Problems.Where(x => x.ProblemClassId == probClassId), new ParallelOptions { MaxDegreeOfParallelism = 8 }, (pInst) => { 
           var charas = new List<string>();
           IRun probRun = null;
@@ -457,5 +457,5 @@
         progress.ProgressValue = 0;
         p[0] = 0;
-        Parallel.ForEach(adminClient.Algorithms, new ParallelOptions { MaxDegreeOfParallelism = 3 }, (algInst) => {
+        Parallel.ForEach(adminClient.Algorithms, new ParallelOptions { MaxDegreeOfParallelism = 8 }, (algInst) => {
           IAlgorithm alg = null;
           var data = Clients.OKB.Administration.AdministrationClient.GetAlgorithmData(algInst.Id);
@@ -490,5 +490,5 @@
         var runIds = queryClient.GetRunIds(problemClassFilter).ToList();
         var batches = runIds.Select((v, i) => new { Idx = i, Val = v }).GroupBy(x => x.Idx / 500, x => x.Val);
-        Parallel.ForEach(batches.Select(x => x.ToList()), new ParallelOptions { MaxDegreeOfParallelism = 3 }, (batch) => {
+        Parallel.ForEach(batches.Select(x => x.ToList()), new ParallelOptions { MaxDegreeOfParallelism = 4 }, (batch) => {
           var okbRuns = queryClient.GetRunsWithValues(batch, true, interestingValues);
           var hlRuns = okbRuns.AsParallel().Select(x => new { AlgorithmId = x.Algorithm.Id, Run = queryClient.ConvertToOptimizationRun(x) }).ToList();
@@ -535,10 +535,10 @@
 
         // add algorithm instance ranks as features to the problem instances for a range of targets
-        foreach (var target in new[] {1, 1.01, 1.05, 1.1, 1.2, 1.5}) {
+        foreach (var target in new[] {0, 0.01, 0.05, 0.1, 0.2, 0.5}) {
           var cls = GetPerformanceClasses(target, 5);
           foreach (var kvp in cls) {
             var prob = kvp.Key;
             foreach (var kvp2 in kvp.Value) {
-              var resultName = "Rank." + algorithmId2AlgorithmInstanceMapping.GetByFirst(kvp2.Key) + "@" + ((target - 1) * 100) + "%";
+              var resultName = "Rank." + algorithmId2AlgorithmInstanceMapping.GetByFirst(kvp2.Key) + "@" + (target * 100) + "%";
               prob.Results[resultName] = new IntValue(kvp2.Value);
             }
@@ -617,5 +617,5 @@
     public Dictionary<IAlgorithm, double> GetAlgorithmPerformance(IRun problemInstance) {
       if (!problemInstance.Parameters.ContainsKey("BestKnownQuality")) return new Dictionary<IAlgorithm, double>();
-      var target = GetTarget(((DoubleValue)problemInstance.Parameters["BestKnownQuality"]).Value, Maximization);
+      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()))
@@ -653,5 +653,5 @@
           var max = ((BoolValue)prob.Parameters["Maximization"]).Value;
           var bkq = ((DoubleValue)prob.Parameters["BestKnownQuality"]).Value;
-          var ert = ExpectedRuntimeHelper.CalculateErt(pr.ToList(), "QualityPerEvaluations", GetTarget(bkq, max), max).ExpectedRuntime;
+          var ert = ExpectedRuntimeHelper.CalculateErt(pr.ToList(), "QualityPerEvaluations", GetTarget(bkq, target, max), max).ExpectedRuntime;
           if (double.IsNaN(ert)) ert = int.MaxValue;
           ds.AddRow(new object[] { pr.Key }.Concat(f.Cast<object>()).Concat(new object[] { ert }));
@@ -719,11 +719,10 @@
 
         var values = pr.GroupBy(x => algorithmId2RunMapping.GetBySecond(x).Single())
-                       .ToDictionary(x => x.Key, x => ExpectedRuntimeHelper.CalculateErt(x.ToList(), "QualityPerEvaluations", GetTarget(bkq, max), max).ExpectedRuntime);
+                       .ToDictionary(x => x.Key, x => ExpectedRuntimeHelper.CalculateErt(x.ToList(), "QualityPerEvaluations", GetTarget(bkq, target, max), max).ExpectedRuntime);
         var ranks = ClusteringHelper<long>.Cluster(nClasses, values, x => double.IsNaN(x.Value))
           .GetByCluster().ToList();
-        var minRank = ranks.Min(x => x.Key);
         foreach (var c in ranks) {
           foreach (var a in c.Value)
-            result[problemMap[pr.Key]][a.Key] = c.Key == nClasses ? c.Key : c.Key - minRank;
+            result[problemMap[pr.Key]][a.Key] = c.Key;
         }
       }
@@ -731,6 +730,6 @@
     }
 
-    public double GetTarget(double bestKnownQuality, bool maximization) {
-      return bestKnownQuality * (maximization ? (1 - MinimumTarget.Value) : (1 + MinimumTarget.Value));
+    public double GetTarget(double bestKnownQuality, double target, bool maximization) {
+      return bestKnownQuality * (maximization ? (1 - target) : (1 + target));
     }
 
Index: /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Recommenders/OverallBestRecommender.cs
===================================================================
--- /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Recommenders/OverallBestRecommender.cs	(revision 13796)
+++ /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Recommenders/OverallBestRecommender.cs	(revision 13797)
@@ -62,5 +62,5 @@
           double bkq;
           if (!pis.TryGetValue(problemRuns.Key, out bkq)) continue;
-          var ert = ExpectedRuntimeHelper.CalculateErt(problemRuns.ToList(), "QualityPerEvaluations", kc.GetTarget(bkq, kc.Maximization), kc.Maximization).ExpectedRuntime;
+          var ert = ExpectedRuntimeHelper.CalculateErt(problemRuns.ToList(), "QualityPerEvaluations", kc.GetTarget(bkq, kc.MinimumTarget.Value, kc.Maximization), kc.Maximization).ExpectedRuntime;
           if (double.IsNaN(ert)) ert = int.MaxValue;
           avgERT += ert;
Index: /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/PerformanceModelingView.Designer.cs
===================================================================
--- /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/PerformanceModelingView.Designer.cs	(revision 13796)
+++ /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/PerformanceModelingView.Designer.cs	(revision 13797)
@@ -56,6 +56,10 @@
       this.crossvalidationTabPage = new System.Windows.Forms.TabPage();
       this.kendallsTauLabel = new System.Windows.Forms.Label();
+      this.predictedLabel = new System.Windows.Forms.Label();
+      this.actualLabel = new System.Windows.Forms.Label();
+      this.absoluteLogErrorLabel = new System.Windows.Forms.Label();
       this.absoluteErrorLabel = new System.Windows.Forms.Label();
       this.kendallsTauView = new HeuristicLab.Data.Views.StringConvertibleValueView();
+      this.absoluteLogErrorView = new HeuristicLab.Data.Views.StringConvertibleValueView();
       this.absoluteErrorView = new HeuristicLab.Data.Views.StringConvertibleValueView();
       this.confusionMatrixView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
@@ -63,6 +67,4 @@
       this.minTargetView = new HeuristicLab.Data.Views.StringConvertibleValueView();
       this.minimumTargetLabel = new System.Windows.Forms.Label();
-      this.actualLabel = new System.Windows.Forms.Label();
-      this.predictedLabel = new System.Windows.Forms.Label();
       this.tabControl.SuspendLayout();
       this.characteristicsTabPage.SuspendLayout();
@@ -111,5 +113,5 @@
       this.tabControl.Name = "tabControl";
       this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(817, 509);
+      this.tabControl.Size = new System.Drawing.Size(960, 509);
       this.tabControl.TabIndex = 14;
       // 
@@ -121,5 +123,5 @@
       this.characteristicsTabPage.Name = "characteristicsTabPage";
       this.characteristicsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.characteristicsTabPage.Size = new System.Drawing.Size(692, 324);
+      this.characteristicsTabPage.Size = new System.Drawing.Size(952, 483);
       this.characteristicsTabPage.TabIndex = 2;
       this.characteristicsTabPage.Text = "Characteristics";
@@ -158,5 +160,5 @@
       this.parametersTabPage.Name = "parametersTabPage";
       this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.parametersTabPage.Size = new System.Drawing.Size(692, 324);
+      this.parametersTabPage.Size = new System.Drawing.Size(952, 483);
       this.parametersTabPage.TabIndex = 0;
       this.parametersTabPage.Text = "Parameters";
@@ -173,5 +175,5 @@
       this.parameterCollectionView.ReadOnly = false;
       this.parameterCollectionView.ShowDetails = true;
-      this.parameterCollectionView.Size = new System.Drawing.Size(686, 318);
+      this.parameterCollectionView.Size = new System.Drawing.Size(946, 477);
       this.parameterCollectionView.TabIndex = 0;
       // 
@@ -181,6 +183,8 @@
       this.crossvalidationTabPage.Controls.Add(this.predictedLabel);
       this.crossvalidationTabPage.Controls.Add(this.actualLabel);
+      this.crossvalidationTabPage.Controls.Add(this.absoluteLogErrorLabel);
       this.crossvalidationTabPage.Controls.Add(this.absoluteErrorLabel);
       this.crossvalidationTabPage.Controls.Add(this.kendallsTauView);
+      this.crossvalidationTabPage.Controls.Add(this.absoluteLogErrorView);
       this.crossvalidationTabPage.Controls.Add(this.absoluteErrorView);
       this.crossvalidationTabPage.Controls.Add(this.confusionMatrixView);
@@ -189,5 +193,5 @@
       this.crossvalidationTabPage.Name = "crossvalidationTabPage";
       this.crossvalidationTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.crossvalidationTabPage.Size = new System.Drawing.Size(809, 483);
+      this.crossvalidationTabPage.Size = new System.Drawing.Size(952, 483);
       this.crossvalidationTabPage.TabIndex = 1;
       this.crossvalidationTabPage.Text = "Crossvalidation";
@@ -197,5 +201,5 @@
       // 
       this.kendallsTauLabel.AutoSize = true;
-      this.kendallsTauLabel.Location = new System.Drawing.Point(536, 110);
+      this.kendallsTauLabel.Location = new System.Drawing.Point(519, 165);
       this.kendallsTauLabel.Margin = new System.Windows.Forms.Padding(3);
       this.kendallsTauLabel.Name = "kendallsTauLabel";
@@ -204,8 +208,40 @@
       this.kendallsTauLabel.Text = "Mean Kendall\'s Tau:";
       // 
+      // predictedLabel
+      // 
+      this.predictedLabel.AutoSize = true;
+      this.predictedLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.predictedLabel.Location = new System.Drawing.Point(223, 52);
+      this.predictedLabel.Margin = new System.Windows.Forms.Padding(3);
+      this.predictedLabel.Name = "predictedLabel";
+      this.predictedLabel.Size = new System.Drawing.Size(69, 13);
+      this.predictedLabel.TabIndex = 3;
+      this.predictedLabel.Text = "PREDICTED";
+      // 
+      // actualLabel
+      // 
+      this.actualLabel.AutoSize = true;
+      this.actualLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.actualLabel.Location = new System.Drawing.Point(16, 155);
+      this.actualLabel.Margin = new System.Windows.Forms.Padding(3);
+      this.actualLabel.Name = "actualLabel";
+      this.actualLabel.Size = new System.Drawing.Size(15, 78);
+      this.actualLabel.TabIndex = 3;
+      this.actualLabel.Text = "A\r\nC\r\nT\r\nU\r\nA\r\nL";
+      // 
+      // absoluteLogErrorLabel
+      // 
+      this.absoluteLogErrorLabel.AutoSize = true;
+      this.absoluteLogErrorLabel.Location = new System.Drawing.Point(519, 109);
+      this.absoluteLogErrorLabel.Margin = new System.Windows.Forms.Padding(3);
+      this.absoluteLogErrorLabel.Name = "absoluteLogErrorLabel";
+      this.absoluteLogErrorLabel.Size = new System.Drawing.Size(127, 13);
+      this.absoluteLogErrorLabel.TabIndex = 3;
+      this.absoluteLogErrorLabel.Text = "Mean Absolute Log Error:";
+      // 
       // absoluteErrorLabel
       // 
       this.absoluteErrorLabel.AutoSize = true;
-      this.absoluteErrorLabel.Location = new System.Drawing.Point(536, 52);
+      this.absoluteErrorLabel.Location = new System.Drawing.Point(519, 52);
       this.absoluteErrorLabel.Margin = new System.Windows.Forms.Padding(3);
       this.absoluteErrorLabel.Name = "absoluteErrorLabel";
@@ -219,5 +255,5 @@
       this.kendallsTauView.Content = null;
       this.kendallsTauView.LabelVisible = false;
-      this.kendallsTauView.Location = new System.Drawing.Point(520, 129);
+      this.kendallsTauView.Location = new System.Drawing.Point(503, 184);
       this.kendallsTauView.Name = "kendallsTauView";
       this.kendallsTauView.ReadOnly = true;
@@ -225,4 +261,15 @@
       this.kendallsTauView.TabIndex = 2;
       // 
+      // absoluteLogErrorView
+      // 
+      this.absoluteLogErrorView.Caption = "StringConvertibleValue View";
+      this.absoluteLogErrorView.Content = null;
+      this.absoluteLogErrorView.LabelVisible = false;
+      this.absoluteLogErrorView.Location = new System.Drawing.Point(503, 128);
+      this.absoluteLogErrorView.Name = "absoluteLogErrorView";
+      this.absoluteLogErrorView.ReadOnly = true;
+      this.absoluteLogErrorView.Size = new System.Drawing.Size(194, 21);
+      this.absoluteLogErrorView.TabIndex = 2;
+      // 
       // absoluteErrorView
       // 
@@ -230,5 +277,5 @@
       this.absoluteErrorView.Content = null;
       this.absoluteErrorView.LabelVisible = false;
-      this.absoluteErrorView.Location = new System.Drawing.Point(520, 71);
+      this.absoluteErrorView.Location = new System.Drawing.Point(503, 71);
       this.absoluteErrorView.Name = "absoluteErrorView";
       this.absoluteErrorView.ReadOnly = true;
@@ -245,5 +292,5 @@
       this.confusionMatrixView.ShowRowsAndColumnsTextBox = false;
       this.confusionMatrixView.ShowStatisticalInformation = false;
-      this.confusionMatrixView.Size = new System.Drawing.Size(477, 363);
+      this.confusionMatrixView.Size = new System.Drawing.Size(438, 244);
       this.confusionMatrixView.TabIndex = 1;
       // 
@@ -277,26 +324,4 @@
       this.minimumTargetLabel.TabIndex = 17;
       this.minimumTargetLabel.Text = "Target:";
-      // 
-      // actualLabel
-      // 
-      this.actualLabel.AutoSize = true;
-      this.actualLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-      this.actualLabel.Location = new System.Drawing.Point(16, 210);
-      this.actualLabel.Margin = new System.Windows.Forms.Padding(3);
-      this.actualLabel.Name = "actualLabel";
-      this.actualLabel.Size = new System.Drawing.Size(15, 78);
-      this.actualLabel.TabIndex = 3;
-      this.actualLabel.Text = "A\r\nC\r\nT\r\nU\r\nA\r\nL";
-      // 
-      // predictedLabel
-      // 
-      this.predictedLabel.AutoSize = true;
-      this.predictedLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-      this.predictedLabel.Location = new System.Drawing.Point(241, 52);
-      this.predictedLabel.Margin = new System.Windows.Forms.Padding(3);
-      this.predictedLabel.Name = "predictedLabel";
-      this.predictedLabel.Size = new System.Drawing.Size(69, 13);
-      this.predictedLabel.TabIndex = 3;
-      this.predictedLabel.Text = "PREDICTED";
       // 
       // PerformanceModelingView
@@ -311,5 +336,5 @@
       this.Controls.Add(this.recommendStartButton);
       this.Name = "PerformanceModelingView";
-      this.Size = new System.Drawing.Size(817, 539);
+      this.Size = new System.Drawing.Size(960, 539);
       this.tabControl.ResumeLayout(false);
       this.characteristicsTabPage.ResumeLayout(false);
@@ -344,4 +369,6 @@
     private System.Windows.Forms.Label predictedLabel;
     private System.Windows.Forms.Label actualLabel;
+    private System.Windows.Forms.Label absoluteLogErrorLabel;
+    private Data.Views.StringConvertibleValueView absoluteLogErrorView;
   }
 }
Index: /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/PerformanceModelingView.cs
===================================================================
--- /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/PerformanceModelingView.cs	(revision 13796)
+++ /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/PerformanceModelingView.cs	(revision 13797)
@@ -31,4 +31,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading.Tasks;
 
 namespace HeuristicLab.OptimizationExpertSystem {
@@ -131,32 +132,48 @@
     private void xValidateButton_Click(object sender, EventArgs e) {
       var recommender = (IAlgorithmInstanceRecommender)recommenderComboBox.SelectedItem;
+      var progress = MainForm.AddOperationProgressToView(this, "Performing Leave-one-out Crossvalidation");
+
+      Task.Factory.StartNew(() => { DoCrossvalidate(recommender, progress); }, TaskCreationOptions.LongRunning);
+    }
+
+    private void DoCrossvalidate(IAlgorithmInstanceRecommender recommender, IProgress progress) {
       var features = characteristics.CheckedItems.Select(x => x.Value.Value).ToArray();
-
       var trainingSet = Content.ProblemInstances.Where(x => !Content.IsCurrentInstance(x)).ToArray();
 
       var absErr = 0.0;
+      var absLogError = 0.0;
       var confMatrix = new int[6, 6];
       var tau = 0.0;
       // leave one out crossvalidation
+      var count = 0;
       foreach (var pi in trainingSet) {
+        progress.Status = pi.Name + "...";
         var model = recommender.TrainModel(trainingSet.Where(x => x != pi).ToArray(), Content, features);
         var predicted = model.GetRanking(pi).ToDictionary(x => x.Key, x => x.Value);
         var observed = Content.GetAlgorithmPerformance(pi);
         absErr += AbsoluteError(observed, predicted);
+        absLogError += AbsoluteLogError(observed, predicted);
         var confMat = ConfusionMatrix(observed, predicted);
-        for (var i = 0; i < confMat.GetLength(0); i++)
+        for (var i = 0; i < confMat.GetLength(0); i++) {
           for (var j = 0; j < confMat.GetLength(1); j++)
             confMatrix[i, j] += confMat[i, j];
+        }
         tau += KendallsTau(observed, predicted);
         // average NCDG ... relevance determined by clustering (unsuccessful algorithms being penalized with negative relevance)
         // mean reciprocal rank
         // optional: expected reciprocal rank
+        progress.ProgressValue = ++count / (double)trainingSet.Length;
       }
       absErr /= trainingSet.Length;
+      absLogError /= trainingSet.Length;
       tau /= trainingSet.Length;
 
-      confusionMatrixView.Content = new IntMatrix(confMatrix);
       absoluteErrorView.Content = new DoubleValue(absErr);
+      absoluteLogErrorView.Content = new DoubleValue(absLogError);
+      var description = new[] { "A", "B", "C", "D", "E", "F" };
+      confusionMatrixView.Content = new IntMatrix(confMatrix) { ColumnNames = description, RowNames = description };
       kendallsTauView.Content = new DoubleValue(tau);
+
+      progress.Finish();
     }
 
@@ -168,4 +185,15 @@
         if (double.IsNaN(actual)) actual = int.MaxValue;
         error += Math.Abs(actual - tuple.Value);
+      }
+      return error;
+    }
+
+    private static double AbsoluteLogError(Dictionary<IAlgorithm, double> performance, Dictionary<IAlgorithm, double> ranking) {
+      var error = 0.0;
+      foreach (var tuple in ranking) {
+        double actual;
+        if (!performance.TryGetValue(tuple.Key, out actual)) continue;
+        if (double.IsNaN(actual)) actual = int.MaxValue;
+        error += Math.Abs(Math.Log10(actual) - Math.Log10(tuple.Value));
       }
       return error;
Index: /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/UnderstandingProblemInstanceView.Designer.cs
===================================================================
--- /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/UnderstandingProblemInstanceView.Designer.cs	(revision 13796)
+++ /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/UnderstandingProblemInstanceView.Designer.cs	(revision 13797)
@@ -147,5 +147,5 @@
       this.invPropCheckBox.Checked = true;
       this.invPropCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
-      this.invPropCheckBox.Location = new System.Drawing.Point(515, 8);
+      this.invPropCheckBox.Location = new System.Drawing.Point(577, 8);
       this.invPropCheckBox.Name = "invPropCheckBox";
       this.invPropCheckBox.Size = new System.Drawing.Size(118, 17);
@@ -158,5 +158,5 @@
       // 
       this.colorLabel.AutoSize = true;
-      this.colorLabel.Location = new System.Drawing.Point(652, 9);
+      this.colorLabel.Location = new System.Drawing.Point(714, 9);
       this.colorLabel.Name = "colorLabel";
       this.colorLabel.Size = new System.Drawing.Size(34, 13);
@@ -222,7 +222,7 @@
       this.colorComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.colorComboBox.FormattingEnabled = true;
-      this.colorComboBox.Location = new System.Drawing.Point(692, 6);
+      this.colorComboBox.Location = new System.Drawing.Point(754, 6);
       this.colorComboBox.Name = "colorComboBox";
-      this.colorComboBox.Size = new System.Drawing.Size(222, 21);
+      this.colorComboBox.Size = new System.Drawing.Size(305, 21);
       this.colorComboBox.TabIndex = 13;
       this.colorComboBox.SelectedIndexChanged += new System.EventHandler(this.colorComboBox_SelectedIndexChanged);
@@ -234,5 +234,5 @@
       this.sizeComboBox.Location = new System.Drawing.Point(287, 6);
       this.sizeComboBox.Name = "sizeComboBox";
-      this.sizeComboBox.Size = new System.Drawing.Size(222, 21);
+      this.sizeComboBox.Size = new System.Drawing.Size(271, 21);
       this.sizeComboBox.TabIndex = 13;
       this.sizeComboBox.SelectedIndexChanged += new System.EventHandler(this.SizeComboBoxOnSelectedIndexChanged);
