Index: /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Views/3.3/ExpertSystemView.Designer.cs
===================================================================
--- /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Views/3.3/ExpertSystemView.Designer.cs	(revision 12956)
+++ /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Views/3.3/ExpertSystemView.Designer.cs	(revision 12957)
@@ -48,6 +48,8 @@
       this.runsView = new HeuristicLab.Optimization.Views.RunCollectionView();
       this.okbTabPage = new System.Windows.Forms.TabPage();
+      this.algorithmInstancesViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.problemInstancesTabPage = new System.Windows.Forms.TabPage();
+      this.problemInstancesView = new HeuristicLab.Optimization.Views.RunCollectionBubbleChartView();
       this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
-      this.algorithmInstancesViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
@@ -56,4 +58,5 @@
       this.runsTabPage.SuspendLayout();
       this.okbTabPage.SuspendLayout();
+      this.problemInstancesTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -98,4 +101,5 @@
       this.tabControl.Controls.Add(this.runsTabPage);
       this.tabControl.Controls.Add(this.okbTabPage);
+      this.tabControl.Controls.Add(this.problemInstancesTabPage);
       this.tabControl.Location = new System.Drawing.Point(0, 52);
       this.tabControl.Name = "tabControl";
@@ -242,11 +246,4 @@
       this.okbTabPage.UseVisualStyleBackColor = true;
       // 
-      // openFileDialog
-      // 
-      this.openFileDialog.DefaultExt = "hl";
-      this.openFileDialog.FileName = "Optimizer";
-      this.openFileDialog.Filter = "HeuristicLab Files|*.hl|All Files|*.*";
-      this.openFileDialog.Title = "Open Optimizer";
-      // 
       // algorithmInstancesViewHost
       // 
@@ -263,5 +260,36 @@
       this.algorithmInstancesViewHost.ViewType = null;
       // 
-      // ExpertSystemOptimizerView
+      // problemInstancesTabPage
+      // 
+      this.problemInstancesTabPage.Controls.Add(this.problemInstancesView);
+      this.problemInstancesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.problemInstancesTabPage.Name = "problemInstancesTabPage";
+      this.problemInstancesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.problemInstancesTabPage.Size = new System.Drawing.Size(538, 335);
+      this.problemInstancesTabPage.TabIndex = 6;
+      this.problemInstancesTabPage.Text = "Problem Instances";
+      this.problemInstancesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // problemInstancesView
+      // 
+      this.problemInstancesView.BackColor = System.Drawing.SystemColors.Window;
+      this.problemInstancesView.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.problemInstancesView.Caption = "Bubble Chart";
+      this.problemInstancesView.Content = null;
+      this.problemInstancesView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.problemInstancesView.Location = new System.Drawing.Point(3, 3);
+      this.problemInstancesView.Name = "problemInstancesView";
+      this.problemInstancesView.ReadOnly = false;
+      this.problemInstancesView.Size = new System.Drawing.Size(532, 329);
+      this.problemInstancesView.TabIndex = 0;
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "hl";
+      this.openFileDialog.FileName = "Optimizer";
+      this.openFileDialog.Filter = "HeuristicLab Files|*.hl|All Files|*.*";
+      this.openFileDialog.Title = "Open Optimizer";
+      // 
+      // ExpertSystemView
       // 
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
@@ -269,5 +297,5 @@
       this.Controls.Add(this.evaluationsLimitabel);
       this.Controls.Add(this.maxEvaluationsTextBox);
-      this.Name = "ExpertSystemOptimizerView";
+      this.Name = "ExpertSystemView";
       this.Size = new System.Drawing.Size(549, 413);
       this.Controls.SetChildIndex(this.maxEvaluationsTextBox, 0);
@@ -284,4 +312,5 @@
       this.runsTabPage.ResumeLayout(false);
       this.okbTabPage.ResumeLayout(false);
+      this.problemInstancesTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -307,4 +336,6 @@
     private System.Windows.Forms.TabPage okbTabPage;
     private MainForm.WindowsForms.ViewHost algorithmInstancesViewHost;
+    private System.Windows.Forms.TabPage problemInstancesTabPage;
+    private Optimization.Views.RunCollectionBubbleChartView problemInstancesView;
   }
 }
Index: /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Views/3.3/HeuristicLab.OptimizationExpertSystem.Views-3.3.csproj
===================================================================
--- /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Views/3.3/HeuristicLab.OptimizationExpertSystem.Views-3.3.csproj	(revision 12956)
+++ /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Views/3.3/HeuristicLab.OptimizationExpertSystem.Views-3.3.csproj	(revision 12957)
@@ -73,4 +73,9 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="ALGLIB-3.7.0, Version=3.7.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\ALGLIB-3.7.0.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
@@ -121,4 +126,9 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Visualization.ChartControlsExtensions-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Visualization.ChartControlsExtensions-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
Index: /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystem.cs
===================================================================
--- /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystem.cs	(revision 12956)
+++ /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystem.cs	(revision 12957)
@@ -67,4 +67,9 @@
     public ItemList<IAlgorithm> AlgorithmInstances {
       get { return algorithmInstances; }
+      set {
+        if (algorithmInstances == value) return;
+        algorithmInstances = value;
+        OnPropertyChanged("AlgorithmInstances");
+      }
     }
 
@@ -86,4 +91,15 @@
     public ReadOnlyItemList<IAlgorithm> SuggestedInstances {
       get { return readOnlySuggestedInstances; }
+    }
+
+    [Storable]
+    private RunCollection problemInstances;
+    public RunCollection ProblemInstances {
+      get { return problemInstances; }
+      set {
+        if (problemInstances == value) return;
+        problemInstances = value;
+        OnPropertyChanged("ProblemInstances");
+      }
     }
 
@@ -101,4 +117,5 @@
       suggestedInstances = cloner.Clone(original.suggestedInstances);
       readOnlySuggestedInstances = suggestedInstances.AsReadOnly();
+      problemInstances = cloner.Clone(original.problemInstances);
       RegisterEventHandlers();
     }
@@ -110,4 +127,5 @@
       suggestedInstances = new ItemList<IAlgorithm>();
       readOnlySuggestedInstances = suggestedInstances.AsReadOnly();
+      problemInstances = new RunCollection();
       RegisterEventHandlers();
     }
@@ -137,5 +155,69 @@
       var runCollection = sender as RunCollection;
       if (runCollection != null && runCollection.UpdateOfRunsInProgress) return;
+      UpdateInstanceMap();
       UpdateSuggestions();
+    }
+
+    private void UpdateInstanceMap() {
+      var flaValues = ProblemInstances.ResultNames
+                      .Where(x => x.StartsWith("Characteristic.")
+                        && ProblemInstances.All(y => y.Results.ContainsKey(x) && y.Results[x] is DoubleValue))
+                      .Select(x => x).ToList();
+      var ds = new double[ProblemInstances.Count, flaValues.Count];
+      var instanceCounter = 0;
+      foreach (var instance in ProblemInstances) {
+        for (var feature = 0; feature < flaValues.Count; feature++)
+          ds[instanceCounter, feature] = ((DoubleValue)instance.Results[flaValues[feature]]).Value;
+        instanceCounter++;
+      }
+
+      int info;
+      double[] s2;
+      double[,] v;
+      alglib.pcabuildbasis(ds, instanceCounter, flaValues.Count, out info, out s2, out v);
+
+      var algInstRunDict = AlgorithmInstances.SelectMany(x => x.Runs)
+                                             .Where(x => x.Parameters.ContainsKey("Problem Name") && x.Parameters["Problem Name"] is StringValue)
+                                             .GroupBy(x => ((StringValue)x.Parameters["Problem Name"]).Value)
+                                             .ToDictionary(x => x.Key, x => x.GroupBy(y => ((StringValue)y.Parameters["Algorithm Name"]).Value)
+                                                                             .ToDictionary(y => y.Key, y => y.ToList()));
+      ProblemInstances.UpdateOfRunsInProgress = true;
+      try {
+        instanceCounter = 0;
+        foreach (var instance in ProblemInstances) {
+          IItem probNameParam;
+          if (!instance.Parameters.TryGetValue("Problem Name", out probNameParam)) continue;
+          var probInstanceName = ((StringValue)probNameParam).Value;
+
+          double x = 0, y = 0;
+          for (var feature = 0; feature < flaValues.Count; feature++) {
+            x += ds[instanceCounter, feature] * v[feature, 0];
+            y += ds[instanceCounter, feature] * v[feature, 1];
+          }
+          IItem item;
+          if (instance.Results.TryGetValue("Projection.PCA1", out item)) {
+            ((DoubleValue)item).Value = x;
+          } else instance.Results.Add("Projection.PCA1", new DoubleValue(x));
+          if (instance.Results.TryGetValue("Projection.PCA2", out item)) {
+            ((DoubleValue)item).Value = y;
+          } else instance.Results.Add("Projection.PCA2", new DoubleValue(y));
+
+          var bkQuality = ((DoubleValue)instance.Parameters["BestKnownQuality"]).Value;
+          var maximization = ((BoolValue)instance.Parameters["Maximization"]).Value;
+          foreach (var kvp in algInstRunDict[probInstanceName]) {
+            var algInstanceName = kvp.Key;
+            foreach (var run in kvp.Value) {
+              // TODO: Things needs to be configurable here (table name, targets)
+              foreach (var target in new[] { 1, 1.01, 1.05, 1.1, 1.2, 1.5 }) {
+                var result = ExpectedRuntimeHelper.CalculateErt(kvp.Value, "QualityPerEvaluations", bkQuality * target, maximization);
+                var resultName = algInstanceName + "@" + ((target - 1) * 100) + "%";
+                if (run.Results.TryGetValue(resultName, out item))
+                  ((DoubleValue)item).Value = result.ExpectedRuntime;
+                else run.Results.Add(resultName, new DoubleValue(result.ExpectedRuntime));
+              }
+            }
+          }
+        }
+      } finally { ProblemInstances.UpdateOfRunsInProgress = false; }
     }
 
Index: /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/HeuristicLab.OptimizationExpertSystem-3.3.csproj
===================================================================
--- /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/HeuristicLab.OptimizationExpertSystem-3.3.csproj	(revision 12956)
+++ /branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/HeuristicLab.OptimizationExpertSystem-3.3.csproj	(revision 12957)
@@ -73,4 +73,9 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="ALGLIB-3.7.0, Version=3.7.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\ALGLIB-3.7.0.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Collections-3.3">
       <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
