Index: /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3.csproj
===================================================================
--- /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3.csproj	(revision 5378)
+++ /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3.csproj	(revision 5379)
@@ -12,5 +12,6 @@
     <AssemblyName>HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3</AssemblyName>
     <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <TargetFrameworkProfile></TargetFrameworkProfile>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
     <FileAlignment>512</FileAlignment>
     <SignAssembly>true</SignAssembly>
@@ -115,4 +116,5 @@
     <Compile Include="OffspringSelectionGeneticAlgorithmMainOperator.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SuccessProgressAnalysis\SuccessProgressAnalyzer.cs" />
   </ItemGroup>
   <ItemGroup>
Index: /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SuccessProgressAnalysis/SuccessProgressAnalyzer.cs
===================================================================
--- /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SuccessProgressAnalysis/SuccessProgressAnalyzer.cs	(revision 5379)
+++ /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SuccessProgressAnalysis/SuccessProgressAnalyzer.cs	(revision 5379)
@@ -0,0 +1,131 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Common;
+using HeuristicLab.Parameters;
+using HeuristicLab.Data;
+using HeuristicLab.Analysis;
+
+namespace HeuristicLab.Algorithms.OffspringSelectionAlgorithm.SuccessProgressAnalysis {
+  /// <summary>
+  /// An operator for analyzing the solution diversity in a population.
+  /// </summary>
+  [Item("SuccessProgressAnalyzer", "An operator for analyzing the success progress in a population.")]
+  [StorableClass]
+  public sealed class SuccessProgressAnalyzer: SingleSuccessorOperator, IAnalyzer {
+    public ScopeTreeLookupParameter<BoolValue> SuccessfulOffspring {
+      get { return (ScopeTreeLookupParameter<BoolValue>)Parameters["SuccessfulOffspring"]; }
+    }
+
+    public ValueParameter<ItemCollection<StringValue>> CollectedValues {
+      get { return (ValueParameter<ItemCollection<StringValue>>)Parameters["CollectedValues"]; }
+    }
+
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public LookupParameter<IntValue> Generations {
+      get { return (LookupParameter<IntValue>)Parameters["Generations"]; }
+    }
+    
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SuccessProgressAnalyzer(this, cloner);
+    }    
+    [StorableConstructor]
+    private SuccessProgressAnalyzer(bool deserializing) : base(deserializing) { }
+    private SuccessProgressAnalyzer(SuccessProgressAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public SuccessProgressAnalyzer()
+      : base() {
+        Parameters.Add(new ScopeTreeLookupParameter<BoolValue>("SuccessfulOffspring", "Indicates if the individual was successful."));
+        Parameters.Add(new ValueParameter<ItemCollection<StringValue>>("CollectedValues", "The values that should be collected.", new ItemCollection<StringValue>()));
+        Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the succedd progress analysis results should be stored."));
+        Parameters.Add(new LookupParameter<IntValue>("Generations", "The current number of generations."));
+    }
+
+    public override IOperation Apply() {
+      ResultCollection results = ResultsParameter.ActualValue;
+      
+      ItemArray<BoolValue> successfulOffspring = SuccessfulOffspring.ActualValue;
+      ItemCollection<StringValue> collectedValues = CollectedValues.Value;
+
+      int successfulCount = successfulOffspring.Where(s => s.Value).Count();
+      if (successfulCount > 0 && collectedValues.Count > 0 && successfulOffspring.Length == ExecutionContext.Scope.SubScopes.Count) {
+        foreach (StringValue collected in collectedValues) {
+          Dictionary<String, int> counts = new Dictionary<String, int>();
+          for (int i = 0; i < ExecutionContext.Scope.SubScopes.Count; i++) {
+            IScope child = ExecutionContext.Scope.SubScopes[i];
+
+            if (successfulOffspring[i].Value && child.Variables.ContainsKey(collected.Value)) {
+              String key = child.Variables[collected.Value].Value.ToString();
+  
+              if (!counts.ContainsKey(key))
+               counts.Add(key, 1);
+              else
+               counts[key]++;
+            }
+          }
+
+          DataTable successProgressAnalysis;
+          string resultKey = "Success Progress " + collected.Value;
+          if (!results.ContainsKey(resultKey)) {
+            successProgressAnalysis = new DataTable();
+            results.Add(new Result(resultKey, successProgressAnalysis));
+          } else {
+            successProgressAnalysis = results[resultKey].Value as DataTable;
+          }
+
+          foreach(String value in counts.Keys) {            
+            DataRow row;
+            if (!successProgressAnalysis.Rows.ContainsKey(value)) {
+              row = new DataRow(value);
+              int iterations = Generations.ActualValue.Value;
+
+              for (int i = 0; i < iterations; i++)
+                row.Values.Add(0);
+
+              successProgressAnalysis.Rows.Add(row);
+            } else {
+              row = successProgressAnalysis.Rows[value];
+            }
+
+            row.Values.Add(counts[value] / (double)successfulCount);
+          }
+
+          foreach (DataRow row in successProgressAnalysis.Rows) {
+            if (!counts.ContainsKey(row.Name))
+              row.Values.Add(0);
+          }
+        }  
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/SuccessProgressAnalysis/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj
===================================================================
--- /branches/SuccessProgressAnalysis/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 5378)
+++ /branches/SuccessProgressAnalysis/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 5379)
@@ -137,5 +137,4 @@
     <Compile Include="HeuristicLabAnalysisPlugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="SuccessProgressAnalysis\SuccessProgressAnalyzer.cs" />
     <Compile Include="ValueAnalysis\MinAverageMaxValueAnalyzer.cs" />
     <Compile Include="ValueAnalysis\MinAverageMaxValueCalculator.cs" />
Index: /branches/SuccessProgressAnalysis/HeuristicLab.Operators/3.3/StochasticMultiBranch.cs
===================================================================
--- /branches/SuccessProgressAnalysis/HeuristicLab.Operators/3.3/StochasticMultiBranch.cs	(revision 5378)
+++ /branches/SuccessProgressAnalysis/HeuristicLab.Operators/3.3/StochasticMultiBranch.cs	(revision 5379)
@@ -49,4 +49,7 @@
       get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
     }
+    public ValueParameter<BoolValue> ReportExecutedOperatorParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["ReportExecutedOperator"]; }
+    }
     public ValueLookupParameter<StringValue> ExecutedOperatorParameter {
       get { return (ValueLookupParameter<StringValue>)Parameters["ExecutedOperator"]; }
@@ -63,4 +66,7 @@
       if (!Parameters.ContainsKey("ExecutedOperator")) {
         Parameters.Add(new ValueLookupParameter<StringValue>("ExecutedOperator", "The operator that was executed."));
+      }
+      if (!Parameters.ContainsKey("ReportExecutedOperator")) {
+        Parameters.Add(new ValueParameter<BoolValue>("ReportExecutedOperator", "Report the executed operator", new BoolValue(false)));
       }
       #endregion
@@ -81,4 +87,5 @@
       Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
       Parameters.Add(new ValueLookupParameter<StringValue>("ExecutedOperator", "The operator that was executed."));
+      Parameters.Add(new ValueParameter<BoolValue>("ReportExecutedOperator", "Report the executed operator", new BoolValue(false)));
     }
 
