Index: branches/CMAES/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/CMAAnalyzer.cs
===================================================================
--- branches/CMAES/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/CMAAnalyzer.cs	(revision 9299)
+++ branches/CMAES/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/CMAAnalyzer.cs	(revision 9302)
@@ -20,7 +20,10 @@
 #endregion
 
+using System;
+using System.Linq;
 using HeuristicLab.Analysis;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Operators;
@@ -28,5 +31,4 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System;
 
 namespace HeuristicLab.Algorithms.CMAEvolutionStrategy {
@@ -48,4 +50,8 @@
     }
 
+    public IScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
     public ILookupParameter<ResultCollection> ResultsParameter {
       get { return (ILookupParameter<ResultCollection>)Parameters["Results"]; }
@@ -60,4 +66,5 @@
       Parameters.Add(new LookupParameter<CMAParameters>("StrategyParameters", "The CMA strategy parameters to be analyzed."));
       Parameters.Add(new LookupParameter<RealVector>("Mean", "The mean real vector that is being optimized."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the solutions."));
       Parameters.Add(new LookupParameter<ResultCollection>("Results", "The collection to store the results in."));
     }
@@ -71,26 +78,31 @@
       var vector = MeanParameter.ActualValue;
       var results = ResultsParameter.ActualValue;
+      var qualities = QualityParameter.ActualValue;
+      double min = qualities[0].Value, max = qualities[0].Value, avg = qualities[0].Value;
+      for (int i = 1; i < qualities.Length; i++) {
+        if (qualities[i].Value < min) min = qualities[i].Value;
+        if (qualities[i].Value > max) max = qualities[i].Value;
+        avg += qualities[i].Value;
+      }
+      avg /= qualities.Length;
 
-      DataTable axisRatio;
-      if (results.ContainsKey("AxisRatio")) {
-        axisRatio = (DataTable)results["AxisRatio"].Value;
+      DataTable progress;
+      if (results.ContainsKey("Progress")) {
+        progress = (DataTable)results["Progress"].Value;
       } else {
-        axisRatio = new DataTable("AxisRatio");
-        axisRatio.Rows.Add(new DataRow("AxisRatio"));
-        axisRatio.VisualProperties.YAxisLogScale = true;
-        results.Add(new Result("AxisRatio", axisRatio));
+        progress = new DataTable("Progress");
+        progress.Rows.Add(new DataRow("AxisRatio"));
+        progress.Rows.Add(new DataRow("Sigma"));
+        progress.Rows.Add(new DataRow("Min Quality"));
+        progress.Rows.Add(new DataRow("Max Quality"));
+        progress.Rows.Add(new DataRow("Avg Quality"));
+        progress.VisualProperties.YAxisLogScale = true;
+        results.Add(new Result("Progress", progress));
       }
-      axisRatio.Rows["AxisRatio"].Values.Add(sp.AxisRatio);
-
-      DataTable sigma;
-      if (results.ContainsKey("Sigma")) {
-        sigma = (DataTable)results["Sigma"].Value;
-      } else {
-        sigma = new DataTable("Sigma");
-        sigma.VisualProperties.YAxisLogScale = true;
-        sigma.Rows.Add(new DataRow("Sigma"));
-        results.Add(new Result("Sigma", sigma));
-      }
-      sigma.Rows["Sigma"].Values.Add(sp.Sigma);
+      progress.Rows["AxisRatio"].Values.Add(sp.AxisRatio);
+      progress.Rows["Sigma"].Values.Add(sp.Sigma);
+      progress.Rows["Min Quality"].Values.Add(min);
+      progress.Rows["Max Quality"].Values.Add(max);
+      progress.Rows["Avg Quality"].Values.Add(avg);
 
       DataTable scaling;
@@ -108,11 +120,11 @@
 
       DataTable realVector;
-      if (results.ContainsKey("RealVector")) {
-        realVector = (DataTable)results["RealVector"].Value;
+      if (results.ContainsKey("Object Variables")) {
+        realVector = (DataTable)results["Object Variables"].Value;
       } else {
-        realVector = new DataTable("RealVector");
+        realVector = new DataTable("Object Variables");
         for (int i = 0; i < vector.Length; i++)
           realVector.Rows.Add(new DataRow("Axis" + i.ToString()));
-        results.Add(new Result("RealVector", realVector));
+        results.Add(new Result("Object Variables", realVector));
       }
       for (int i = 0; i < vector.Length; i++)
@@ -120,15 +132,19 @@
 
       DataTable stdDevs;
-      if (results.ContainsKey("StandardDeviations")) {
-        stdDevs = (DataTable)results["StandardDeviations"].Value;
+      if (results.ContainsKey("Standard Deviations")) {
+        stdDevs = (DataTable)results["Standard Deviations"].Value;
       } else {
-        stdDevs = new DataTable("StandardDeviations");
+        stdDevs = new DataTable("Standard Deviations");
         stdDevs.VisualProperties.YAxisLogScale = true;
+        stdDevs.Rows.Add(new DataRow("MinStdDev"));
+        stdDevs.Rows.Add(new DataRow("MaxStdDev"));
         for (int i = 0; i < vector.Length; i++)
           stdDevs.Rows.Add(new DataRow("Axis" + i.ToString()));
-        results.Add(new Result("StandardDeviations", stdDevs));
+        results.Add(new Result("Standard Deviations", stdDevs));
       }
       for (int i = 0; i < vector.Length; i++)
         stdDevs.Rows["Axis" + i.ToString()].Values.Add(Math.Sqrt(sp.C[i, i]));
+      stdDevs.Rows["MinStdDev"].Values.Add(sp.D.Min() * sp.Sigma);
+      stdDevs.Rows["MaxStdDev"].Values.Add(sp.D.Max() * sp.Sigma);
 
       return base.Apply();
