Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionRLDView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionRLDView.Designer.cs	(revision 14647)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionRLDView.Designer.cs	(revision 14652)
@@ -64,11 +64,12 @@
       this.tabControl = new System.Windows.Forms.TabControl();
       this.byTargetTabPage = new System.Windows.Forms.TabPage();
+      this.relativeOrAbsoluteComboBox = new System.Windows.Forms.ComboBox();
       this.targetChart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
+      this.markerCheckBox = new System.Windows.Forms.CheckBox();
       this.boundShadingCheckBox = new System.Windows.Forms.CheckBox();
-      this.targetsRelativeCheckBox = new System.Windows.Forms.CheckBox();
       this.byCostTabPage = new System.Windows.Forms.TabPage();
       this.byCostViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.budgetLogScalingCheckBox = new System.Windows.Forms.CheckBox();
-      this.eachOrAllBudgetsCheckBox = new System.Windows.Forms.CheckBox();
+      this.aggregateBudgetsCheckBox = new System.Windows.Forms.CheckBox();
       this.generateBudgetsButton = new System.Windows.Forms.Button();
       this.byTableTabPage = new System.Windows.Forms.TabPage();
@@ -144,5 +145,5 @@
       this.targetsTextBox.Location = new System.Drawing.Point(59, 8);
       this.targetsTextBox.Name = "targetsTextBox";
-      this.targetsTextBox.Size = new System.Drawing.Size(211, 20);
+      this.targetsTextBox.Size = new System.Drawing.Size(204, 20);
       this.targetsTextBox.TabIndex = 1;
       this.toolTip.SetToolTip(this.targetsTextBox, "The order of the targets is important, first to-hit targets\r\nshould be given firs" +
@@ -201,5 +202,5 @@
       this.budgetsTextBox.Location = new System.Drawing.Point(59, 8);
       this.budgetsTextBox.Name = "budgetsTextBox";
-      this.budgetsTextBox.Size = new System.Drawing.Size(326, 20);
+      this.budgetsTextBox.Size = new System.Drawing.Size(309, 20);
       this.budgetsTextBox.TabIndex = 6;
       this.budgetsTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.budgetsTextBox_Validating);
@@ -222,5 +223,5 @@
       this.aggregateTargetsCheckBox.Checked = true;
       this.aggregateTargetsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
-      this.aggregateTargetsCheckBox.Location = new System.Drawing.Point(353, 10);
+      this.aggregateTargetsCheckBox.Location = new System.Drawing.Point(374, 10);
       this.aggregateTargetsCheckBox.Name = "aggregateTargetsCheckBox";
       this.aggregateTargetsCheckBox.Size = new System.Drawing.Size(74, 17);
@@ -246,9 +247,10 @@
       // byTargetTabPage
       // 
+      this.byTargetTabPage.Controls.Add(this.relativeOrAbsoluteComboBox);
       this.byTargetTabPage.Controls.Add(this.targetChart);
+      this.byTargetTabPage.Controls.Add(this.markerCheckBox);
       this.byTargetTabPage.Controls.Add(this.boundShadingCheckBox);
       this.byTargetTabPage.Controls.Add(this.targetLogScalingCheckBox);
       this.byTargetTabPage.Controls.Add(this.targetsLabel);
-      this.byTargetTabPage.Controls.Add(this.targetsRelativeCheckBox);
       this.byTargetTabPage.Controls.Add(this.aggregateTargetsCheckBox);
       this.byTargetTabPage.Controls.Add(this.targetsTextBox);
@@ -262,4 +264,18 @@
       this.byTargetTabPage.Text = "Performance by Target";
       this.byTargetTabPage.UseVisualStyleBackColor = true;
+      // 
+      // relativeOrAbsoluteComboBox
+      // 
+      this.relativeOrAbsoluteComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.relativeOrAbsoluteComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.relativeOrAbsoluteComboBox.FormattingEnabled = true;
+      this.relativeOrAbsoluteComboBox.Items.AddRange(new object[] {
+            "relative",
+            "absolute"});
+      this.relativeOrAbsoluteComboBox.Location = new System.Drawing.Point(269, 8);
+      this.relativeOrAbsoluteComboBox.Name = "relativeOrAbsoluteComboBox";
+      this.relativeOrAbsoluteComboBox.Size = new System.Drawing.Size(99, 21);
+      this.relativeOrAbsoluteComboBox.TabIndex = 8;
+      this.relativeOrAbsoluteComboBox.SelectedIndexChanged += new System.EventHandler(this.relativeOrAbsoluteComboBox_SelectedIndexChanged);
       // 
       // targetChart
@@ -293,4 +309,16 @@
       this.targetChart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart_MouseMove);
       // 
+      // markerCheckBox
+      // 
+      this.markerCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.markerCheckBox.AutoSize = true;
+      this.markerCheckBox.Location = new System.Drawing.Point(229, 364);
+      this.markerCheckBox.Name = "markerCheckBox";
+      this.markerCheckBox.Size = new System.Drawing.Size(91, 17);
+      this.markerCheckBox.TabIndex = 6;
+      this.markerCheckBox.Text = "show markers";
+      this.markerCheckBox.UseVisualStyleBackColor = true;
+      this.markerCheckBox.CheckedChanged += new System.EventHandler(this.markerCheckBox_CheckedChanged);
+      // 
       // boundShadingCheckBox
       // 
@@ -307,24 +335,9 @@
       this.boundShadingCheckBox.CheckedChanged += new System.EventHandler(this.boundShadingCheckBox_CheckedChanged);
       // 
-      // targetsRelativeCheckBox
-      // 
-      this.targetsRelativeCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.targetsRelativeCheckBox.Appearance = System.Windows.Forms.Appearance.Button;
-      this.targetsRelativeCheckBox.Checked = true;
-      this.targetsRelativeCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
-      this.targetsRelativeCheckBox.Location = new System.Drawing.Point(276, 6);
-      this.targetsRelativeCheckBox.Name = "targetsRelativeCheckBox";
-      this.targetsRelativeCheckBox.Size = new System.Drawing.Size(65, 23);
-      this.targetsRelativeCheckBox.TabIndex = 2;
-      this.targetsRelativeCheckBox.Text = "relative";
-      this.targetsRelativeCheckBox.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
-      this.targetsRelativeCheckBox.UseVisualStyleBackColor = true;
-      this.targetsRelativeCheckBox.CheckedChanged += new System.EventHandler(this.targetsRelativeCheckBox_CheckedChanged);
-      // 
       // byCostTabPage
       // 
       this.byCostTabPage.Controls.Add(this.byCostViewHost);
       this.byCostTabPage.Controls.Add(this.budgetLogScalingCheckBox);
-      this.byCostTabPage.Controls.Add(this.eachOrAllBudgetsCheckBox);
+      this.byCostTabPage.Controls.Add(this.aggregateBudgetsCheckBox);
       this.byCostTabPage.Controls.Add(this.generateBudgetsButton);
       this.byCostTabPage.Controls.Add(this.budgetsLabel);
@@ -367,15 +380,17 @@
       this.budgetLogScalingCheckBox.CheckedChanged += new System.EventHandler(this.logScalingCheckBox_CheckedChanged);
       // 
-      // eachOrAllBudgetsCheckBox
-      // 
-      this.eachOrAllBudgetsCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.eachOrAllBudgetsCheckBox.AutoSize = true;
-      this.eachOrAllBudgetsCheckBox.Location = new System.Drawing.Point(414, 10);
-      this.eachOrAllBudgetsCheckBox.Name = "eachOrAllBudgetsCheckBox";
-      this.eachOrAllBudgetsCheckBox.Size = new System.Drawing.Size(36, 17);
-      this.eachOrAllBudgetsCheckBox.TabIndex = 10;
-      this.eachOrAllBudgetsCheckBox.Text = "all";
-      this.eachOrAllBudgetsCheckBox.UseVisualStyleBackColor = true;
-      this.eachOrAllBudgetsCheckBox.CheckedChanged += new System.EventHandler(this.eachOrAllBudgetsCheckBox_CheckedChanged);
+      // aggregateBudgetsCheckBox
+      // 
+      this.aggregateBudgetsCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.aggregateBudgetsCheckBox.AutoSize = true;
+      this.aggregateBudgetsCheckBox.Checked = true;
+      this.aggregateBudgetsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.aggregateBudgetsCheckBox.Location = new System.Drawing.Point(374, 10);
+      this.aggregateBudgetsCheckBox.Name = "aggregateBudgetsCheckBox";
+      this.aggregateBudgetsCheckBox.Size = new System.Drawing.Size(74, 17);
+      this.aggregateBudgetsCheckBox.TabIndex = 10;
+      this.aggregateBudgetsCheckBox.Text = "aggregate";
+      this.aggregateBudgetsCheckBox.UseVisualStyleBackColor = true;
+      this.aggregateBudgetsCheckBox.CheckedChanged += new System.EventHandler(this.aggregateBudgetsCheckBox_CheckedChanged);
       // 
       // generateBudgetsButton
@@ -481,5 +496,5 @@
     private System.Windows.Forms.TabPage byCostTabPage;
     private System.Windows.Forms.TabPage byTableTabPage;
-    private System.Windows.Forms.CheckBox eachOrAllBudgetsCheckBox;
+    private System.Windows.Forms.CheckBox aggregateBudgetsCheckBox;
     private System.Windows.Forms.Button generateBudgetsButton;
     private System.Windows.Forms.CheckBox budgetLogScalingCheckBox;
@@ -490,5 +505,6 @@
     private MainForm.WindowsForms.ViewHost byCostViewHost;
     private System.Windows.Forms.CheckBox boundShadingCheckBox;
-    private System.Windows.Forms.CheckBox targetsRelativeCheckBox;
+    private System.Windows.Forms.CheckBox markerCheckBox;
+    private System.Windows.Forms.ComboBox relativeOrAbsoluteComboBox;
   }
 }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionRLDView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionRLDView.cs	(revision 14647)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionRLDView.cs	(revision 14652)
@@ -106,5 +106,6 @@
       };
       byCostViewHost.Content = byCostDataTable;
-      targetsRelativeCheckBox.Checked = targetsAreRelative;
+      suppressUpdates = true;
+      relativeOrAbsoluteComboBox.SelectedItem = targetsAreRelative ? "relative" : "absolute";
       problems = new BindingList<ProblemInstance>();
       problemComboBox.DataSource = new BindingSource() { DataSource = problems };
@@ -399,8 +400,9 @@
           }
         }
+        var showMarkers = markerCheckBox.Checked;
         foreach (var list in hits) {
           var row = new Series(list.Key) {
             ChartType = SeriesChartType.StepLine,
-            BorderWidth = 2,
+            BorderWidth = 3,
             Color = colors[colorCount],
             BorderDashStyle = lineStyles[lineStyleCount],
@@ -420,11 +422,34 @@
           if (aggregateTargetsCheckBox.Checked) totalTargets *= targets.Length;
           var movingTargets = totalTargets;
+          var labelPrinted = false;
           foreach (var h in list.Value) {
+            var prevmissedecdf = missedecdf;
             while (moreMisses && iter.Current.Key <= h.Key) {
+              if (!labelPrinted && row.Points.Count > 0) {
+                var point = row.Points.Last();
+                point.Label = row.Name;
+                point.MarkerStyle = MarkerStyle.Cross;
+                point.MarkerBorderWidth = 1;
+                point.MarkerSize = 10;
+                labelPrinted = true;
+                rowShade.Points.Add(new DataPoint(point.XValue, new[] { ecdf / totalTargets, (ecdf + missedecdf) / totalTargets }));
+              }
               missedecdf += iter.Current.Value;
               movingTargets -= iter.Current.Value;
-              if (row.Points.Count > 0 && row.Points.Last().XValue == iter.Current.Key)
+              if (row.Points.Count > 0 && row.Points.Last().XValue == iter.Current.Key) {
                 row.Points.Last().SetValueY(ecdf / movingTargets);
-              else row.Points.AddXY(iter.Current.Key, ecdf / movingTargets);
+                row.Points.Last().Color = Color.FromArgb(255 - (int)Math.Floor(255 * (prevmissedecdf / totalTargets)), colors[colorCount]);
+              } else {
+                var dp = new DataPoint(iter.Current.Key, ecdf / movingTargets) {
+                  Color = Color.FromArgb(255 - (int)Math.Floor(255 * (prevmissedecdf / totalTargets)), colors[colorCount])
+                };
+                if (showMarkers) {
+                  dp.MarkerStyle = MarkerStyle.Circle;
+                  dp.MarkerBorderWidth = 1;
+                  dp.MarkerSize = 5;
+                }
+                row.Points.Add(dp);
+                prevmissedecdf = missedecdf;
+              }
               if (boundShadingCheckBox.Checked) {
                 if (rowShade.Points.Count > 0 && rowShade.Points.Last().XValue == iter.Current.Key)
@@ -433,9 +458,28 @@
               }
               moreMisses = iter.MoveNext();
+              if (!labelPrinted) {
+                var point = row.Points.Last();
+                point.Label = row.Name;
+                point.MarkerStyle = MarkerStyle.Cross;
+                point.MarkerBorderWidth = 1;
+                point.MarkerSize = 10;
+                labelPrinted = true;
+              }
             }
             ecdf += h.Value;
-            if (row.Points.Count > 0 && row.Points.Last().XValue == h.Key)
+            if (row.Points.Count > 0 && row.Points.Last().XValue == h.Key) {
               row.Points.Last().SetValueY(ecdf / movingTargets);
-            else row.Points.AddXY(h.Key, ecdf / movingTargets);
+              row.Points.Last().Color = Color.FromArgb(255 - (int)Math.Floor(255 * (missedecdf / totalTargets)), colors[colorCount]);
+            } else {
+              var dp = new DataPoint(h.Key, ecdf / movingTargets) {
+                Color = Color.FromArgb(255 - (int)Math.Floor(255 * (missedecdf / totalTargets)), colors[colorCount])
+              };
+              if (showMarkers) {
+                dp.MarkerStyle = MarkerStyle.Circle;
+                dp.MarkerBorderWidth = 1;
+                dp.MarkerSize = 5;
+              }
+              row.Points.Add(dp);
+            }
             if (missedecdf > 0 && boundShadingCheckBox.Checked) {
               if (rowShade.Points.Count > 0 && rowShade.Points.Last().XValue == h.Key)
@@ -445,11 +489,31 @@
           }
 
+          if (!labelPrinted && row.Points.Count > 0) {
+            var point = row.Points.Last();
+            point.Label = row.Name;
+            point.MarkerStyle = MarkerStyle.Cross;
+            point.MarkerBorderWidth = 1;
+            point.MarkerSize = 10;
+            rowShade.Points.Add(new DataPoint(point.XValue, new[] { ecdf / totalTargets, (ecdf + missedecdf) / totalTargets }));
+          }
+
           while (moreMisses) {
             // if there are misses beyond the last hit we extend the shaded area
             missedecdf += iter.Current.Value;
             //movingTargets -= iter.Current.Value;
-            if (row.Points.Count > 0 && row.Points.Last().XValue == iter.Current.Key)
+            if (row.Points.Count > 0 && row.Points.Last().XValue == iter.Current.Key) {
               row.Points.Last().SetValueY(ecdf / movingTargets);
-            else row.Points.AddXY(iter.Current.Key, ecdf / movingTargets);
+              row.Points.Last().Color = Color.FromArgb(255 - (int)Math.Floor(255 * (missedecdf / totalTargets)), colors[colorCount]);
+            } else {
+              var dp = new DataPoint(iter.Current.Key, ecdf / movingTargets) {
+                Color = Color.FromArgb(255 - (int)Math.Floor(255 * (missedecdf / totalTargets)), colors[colorCount])
+              };
+              if (showMarkers) {
+                dp.MarkerStyle = MarkerStyle.Circle;
+                dp.MarkerBorderWidth = 1;
+                dp.MarkerSize = 5;
+              }
+              row.Points.Add(dp);
+            }
             if (boundShadingCheckBox.Checked) {
               if (rowShade.Points.Count > 0 && rowShade.Points.Last().XValue == iter.Current.Key)
@@ -460,12 +524,14 @@
           }
 
-          if (maxLength > 0 && (row.Points.Count == 0 || row.Points.Last().XValue < maxLength))
-            row.Points.AddXY(maxLength, ecdf / movingTargets);
-
-          if (row.Points.Count > 0) {
-            var point = row.Points.Last();
-            point.Label = row.Name;
-            point.MarkerStyle = MarkerStyle.Cross;
-            point.MarkerBorderWidth = 1;
+          if (maxLength > 0 && (row.Points.Count == 0 || row.Points.Last().XValue < maxLength)) {
+            var dp = new DataPoint(maxLength, ecdf / movingTargets) {
+              Color = Color.FromArgb(255 - (int)Math.Floor(255 * (missedecdf / totalTargets)), colors[colorCount])
+            };
+            if (showMarkers) {
+              dp.MarkerStyle = MarkerStyle.Circle;
+              dp.MarkerBorderWidth = 1;
+              dp.MarkerSize = 5;
+            }
+            row.Points.Add(dp);
           }
 
@@ -651,8 +717,8 @@
             var resultsTable = (IndexedDataTable<double>)run.Results[table];
 
-            if (eachOrAllBudgetsCheckBox.Checked) {
+            if (aggregateBudgetsCheckBox.Checked) {
+              CalculateHitsForAllBudgets(hits, resultsTable.Rows.First(), group.Value.Count, problem.Key, group.Key, problem.Value.Count);
+            } else {
               CalculateHitsForEachBudget(hits, resultsTable.Rows.First(), group.Value.Count, problem.Key, group.Key, problem.Value.Count);
-            } else {
-              CalculateHitsForAllBudgets(hits, resultsTable.Rows.First(), group.Value.Count, problem.Key, group.Key, problem.Value.Count);
             }
           }
@@ -835,6 +901,5 @@
     }
 
-    private void targetsRelativeCheckBox_CheckedChanged(object sender, EventArgs e) {
-      targetsRelativeCheckBox.Text = targetsRelativeCheckBox.Checked ? "relative" : "absolute";
+    private void relativeOrAbsoluteComboBox_SelectedIndexChanged(object sender, EventArgs e) {
       if (suppressUpdates) return;
       var pd = (ProblemInstance)problemComboBox.SelectedItem;
@@ -851,5 +916,5 @@
         }
       }
-      targetsAreRelative = targetsRelativeCheckBox.Checked;
+      targetsAreRelative = (string)relativeOrAbsoluteComboBox.SelectedItem == "relative";
       SuspendRepaint();
       suppressTargetsEvents = true;
@@ -919,4 +984,11 @@
       }
     }
+
+    private void markerCheckBox_CheckedChanged(object sender, EventArgs e) {
+      SuspendRepaint();
+      try {
+        UpdateResultsByTarget();
+      } finally { ResumeRepaint(true); }
+    }
     #endregion
 
@@ -948,7 +1020,5 @@
     }
 
-    private void eachOrAllBudgetsCheckBox_CheckedChanged(object sender, EventArgs e) {
-      var each = eachOrAllBudgetsCheckBox.Checked;
-      eachOrAllBudgetsCheckBox.Text = each ? "each" : "all";
+    private void aggregateBudgetsCheckBox_CheckedChanged(object sender, EventArgs e) {
       SuspendRepaint();
       try {
