Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/FullTreeCreator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/FullTreeCreator.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/FullTreeCreator.cs	(revision 10278)
@@ -94,5 +94,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (ClonedSymbolicExpressionTreeGrammarParameter.ActualValue == null) {
         SymbolicExpressionTreeGrammarParameter.ActualValue.ReadOnly = true;
@@ -104,5 +104,5 @@
           (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone()));
       }
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/GrowTreeCreator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/GrowTreeCreator.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/GrowTreeCreator.cs	(revision 10278)
@@ -94,5 +94,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (ClonedSymbolicExpressionTreeGrammarParameter.ActualValue == null) {
         SymbolicExpressionTreeGrammarParameter.ActualValue.ReadOnly = true;
@@ -104,5 +104,5 @@
           (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone()));
       }
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/ProbabilisticTreeCreator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/ProbabilisticTreeCreator.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/ProbabilisticTreeCreator.cs	(revision 10278)
@@ -87,5 +87,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (ClonedSymbolicExpressionTreeGrammarParameter.ActualValue == null) {
         SymbolicExpressionTreeGrammarParameter.ActualValue.ReadOnly = true;
@@ -96,5 +96,5 @@
         globalScope.Variables.Add(new Variable(ClonedSymbolicExpressionTreeGrammarParameterName, (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone()));
       }
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/RampedHalfAndHalfTreeCreator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/RampedHalfAndHalfTreeCreator.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/RampedHalfAndHalfTreeCreator.cs	(revision 10278)
@@ -95,5 +95,5 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       if (ClonedSymbolicExpressionTreeGrammarParameter.ActualValue == null) {
         SymbolicExpressionTreeGrammarParameter.ActualValue.ReadOnly = true;
@@ -105,5 +105,5 @@
           (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone()));
       }
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/SymbolicExpressionTreeCreator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/SymbolicExpressionTreeCreator.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/SymbolicExpressionTreeCreator.cs	(revision 10278)
@@ -54,7 +54,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       SymbolicExpressionTree = Create(Random);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SymbolicExpressionTreeCrossover.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SymbolicExpressionTreeCrossover.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SymbolicExpressionTreeCrossover.cs	(revision 10278)
@@ -63,5 +63,5 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       if (Parents.Length != 2)
         throw new ArgumentException("Number of parents must be exactly two for symbolic expression tree crossover operators.");
@@ -70,5 +70,5 @@
 
       Child = result;
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/SymbolicExpressionTreeManipulator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/SymbolicExpressionTreeManipulator.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/SymbolicExpressionTreeManipulator.cs	(revision 10278)
@@ -22,5 +22,4 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -55,9 +54,9 @@
     }
 
-    public sealed override IOperation Apply() {
+    public sealed override IOperation InstrumentedApply() {
       ISymbolicExpressionTree tree = SymbolicExpressionTreeParameter.ActualValue;
       Manipulate(RandomParameter.ActualValue, tree);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeOperator.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeOperator.cs	(revision 10278)
@@ -22,5 +22,4 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
@@ -34,5 +33,5 @@
   [Item("SymbolicExpressionTreeOperator", "A base class for operators for symbolic expression trees.")]
   [StorableClass]
-  public abstract class SymbolicExpressionTreeOperator : SingleSuccessorOperator, IStochasticOperator, ISymbolicExpressionTreeOperator {
+  public abstract class SymbolicExpressionTreeOperator : InstrumentedOperator, IStochasticOperator, ISymbolicExpressionTreeOperator {
     private const string RandomParameterName = "Random";
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 10278)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 10278)
@@ -0,0 +1,204 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.EvolutionTracking {
+  [StorableClass]
+  [Item("GenealogyAnalyzer", "An analyzer which performs the necessary instrumentation to record the evolution of a genetic algorithm.")]
+  public class GenealogyAnalyzer<TGraph, TVertex, TContent> : SingleSuccessorOperator, IAnalyzer
+    where TGraph : class, IGenealogyGraph<TVertex, TContent>
+    where TVertex : class, IGenealogyGraphNode<TContent>, new()
+    where TContent : class, IItem {
+
+    private AfterCrossoverOperator<TGraph, TVertex, TContent> afterCrossoverOperator;
+    private AfterManipulatorOperator<TGraph, TVertex, TContent> afterManipulatorOperator;
+    private BeforeManipulatorOperator<TGraph, TVertex, TContent> beforeManipulatorOperator;
+    //    private AfterSolutionCreatorOperator<TGraph, TVertex, TContent> afterSolutionCreatorOperator;
+    public string CrossoverParentsParameterName { get; set; }
+    public string CrossoverChildParameterName { get; set; }
+    public string ManipulatorChildParameterName { get; set; }
+
+    private string solutionCreatorIndividualParameterName;
+    public string SolutionCreatorIndividualParameterName {
+      get { return solutionCreatorIndividualParameterName; }
+      set {
+        if (solutionCreatorIndividualParameterName != null && Parameters.ContainsKey(solutionCreatorIndividualParameterName)) {
+          Parameters.Remove(solutionCreatorIndividualParameterName);
+        }
+        solutionCreatorIndividualParameterName = value;
+        if (!Parameters.ContainsKey(solutionCreatorIndividualParameterName)) {
+          Parameters.Add(new ScopeTreeLookupParameter<TContent>(solutionCreatorIndividualParameterName));
+        }
+      }
+    }
+
+    private const string GenerationsParameterName = "Generations";
+    private const string ResultsParameterName = "Results";
+    private const string PopulationGraphParameterName = "PopulationGraph";
+
+    private const string CrossoverParameterName = "Crossover";
+    private const string ManipulatorParameterName = "Mutator";
+    private const string SolutionCreatorParameterName = "SolutionCreator";
+
+    private const string EnableCrossoverTrackingParameterName = "EnableCrossoverTracking";
+    private const string EnableManipulatorTrackingParameterName = "EnableManipulatorTracking";
+    private const string EnableSolutionCreatorTrackingParameterName = "EnableSolutionCreatorTracking"; // should always be enabled. maybe superfluous
+
+    #region parameter properties
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
+    }
+    public IScopeTreeLookupParameter<TContent> PopulationParameter {
+      get { return (IScopeTreeLookupParameter<TContent>)Parameters[solutionCreatorIndividualParameterName]; }
+    }
+    public ILookupParameter<IntValue> GenerationsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[GenerationsParameterName]; }
+    }
+    public IValueParameter<BoolValue> EnableCrossoverTrackingParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[EnableCrossoverTrackingParameterName]; }
+    }
+    public IValueParameter<BoolValue> EnableManipulatorTrackingParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[EnableManipulatorTrackingParameterName]; }
+    }
+    public IValueParameter<BoolValue> EnableSolutionCreatorTrackingParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[EnableSolutionCreatorTrackingParameterName]; }
+    }
+    public ILookupParameter<ICrossover> CrossoverParameter {
+      get { return (ILookupParameter<ICrossover>)Parameters[CrossoverParameterName]; }
+    }
+    public ILookupParameter<IManipulator> ManipulatorParameter {
+      get { return (ILookupParameter<IManipulator>)Parameters[ManipulatorParameterName]; }
+    }
+    public ILookupParameter<ISolutionCreator> SolutionCreatorParameter {
+      get { return (ILookupParameter<ISolutionCreator>)Parameters[SolutionCreatorParameterName]; }
+    }
+    public IntValue Generations {
+      get { return GenerationsParameter.ActualValue; }
+    }
+    #endregion
+
+    #region properties
+    public ICrossover Crossover {
+      get { return CrossoverParameter.ActualValue; }
+    }
+    public IManipulator Manipulator {
+      get { return ManipulatorParameter.ActualValue; }
+    }
+    public ISolutionCreator SolutionCreator {
+      get { return SolutionCreatorParameter.ActualValue; }
+    }
+    public BoolValue EnableCrossoverTracking {
+      get { return EnableCrossoverTrackingParameter.Value; }
+    }
+    public BoolValue EnableManipulatorTracking {
+      get { return EnableManipulatorTrackingParameter.Value; }
+    }
+    public BoolValue EnableSolutionCreatorTracking {
+      get { return EnableSolutionCreatorTrackingParameter.Value; }
+    }
+    public ResultCollection Results {
+      get { return ResultsParameter.ActualValue; }
+    }
+    public IGenealogyGraph<TVertex, TContent> GenealogyGraph {
+      get {
+        IResult result;
+        if (!Results.ContainsKey(PopulationGraphParameterName)) {
+          result = new Result(PopulationGraphParameterName, new GenealogyGraph<TVertex, TContent>());
+          Results.Add(result);
+        } else {
+          result = Results[PopulationGraphParameterName];
+        }
+        var graph = (GenealogyGraph<TVertex, TContent>)result.Value;
+        return graph;
+      }
+    }
+    #endregion
+
+    public GenealogyAnalyzer() {
+      // the instrumented operators
+      Parameters.Add(new LookupParameter<ICrossover>(CrossoverParameterName, "The crossover operator."));
+      Parameters.Add(new LookupParameter<IManipulator>(ManipulatorParameterName, "The manipulator operator."));
+      Parameters.Add(new LookupParameter<ISolutionCreator>(SolutionCreatorParameterName, "The solution creator operator."));
+      // the analyzer parameters
+      Parameters.Add(new ValueParameter<BoolValue>(EnableCrossoverTrackingParameterName, new BoolValue(true)));
+      Parameters.Add(new ValueParameter<BoolValue>(EnableManipulatorTrackingParameterName, new BoolValue(true)));
+      Parameters.Add(new ValueParameter<BoolValue>(EnableSolutionCreatorTrackingParameterName, new BoolValue(true)));
+      // parameters required by the analyzer to do its work
+      Parameters.Add(new LookupParameter<IntValue>(GenerationsParameterName, "The number of generations so far."));
+      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GenealogyAnalyzer<TGraph, TVertex, TContent>(this, cloner);
+    }
+    protected GenealogyAnalyzer(GenealogyAnalyzer<TGraph, TVertex, TContent> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    public override IOperation Apply() {
+      // wire the before- and after operators
+      //      if (EnableSolutionCreatorTracking.Value) {
+      //        if (afterSolutionCreatorOperator == null) {
+      //          afterSolutionCreatorOperator = new AfterSolutionCreatorOperator<TGraph, TVertex, TContent>();
+      //          afterSolutionCreatorOperator.NewIndividualParameterName = SolutionCreatorIndividualParameterName;
+      //        }
+      //        var instrumentedSolutionCreator = (InstrumentedOperator)SolutionCreator;
+      //        instrumentedSolutionCreator.AfterExecutionOperators.Add(afterSolutionCreatorOperator);
+      //      }
+
+      if (Generations.Value == 0) {
+        foreach (var individual in PopulationParameter.ActualValue) {
+          var vertex = new TVertex {
+            Content = individual,
+            Rank = Generations.Value
+          };
+          GenealogyGraph.AddVertex(vertex);
+        }
+      } else {
+        // add missing individuals in the current generation
+        foreach (var individual in PopulationParameter.ActualValue) {
+          if (!GenealogyGraph.Contains(individual)) continue;
+          // it is an elite which was already added to the graph in the previous generation
+          var vertex = new TVertex {
+            Content = individual,
+            Rank = Generations.Value
+          };
+          GenealogyGraph.AddVertex(vertex);
+        }
+      }
+
+      if (EnableCrossoverTracking.Value) {
+        if (afterCrossoverOperator == null) {
+          afterCrossoverOperator = new AfterCrossoverOperator<TGraph, TVertex, TContent>();
+          afterCrossoverOperator.ParentsParameterName = CrossoverParentsParameterName;
+          afterCrossoverOperator.ChildParameterName = CrossoverChildParameterName;
+        }
+        var instrumentedCrossover = (InstrumentedOperator)Crossover;
+        instrumentedCrossover.AfterExecutionOperators.Add(afterCrossoverOperator);
+      }
+
+      if (EnableManipulatorTracking.Value) {
+        if (beforeManipulatorOperator == null) {
+          beforeManipulatorOperator = new BeforeManipulatorOperator<TGraph, TVertex, TContent>();
+          beforeManipulatorOperator.ChildParameterName = ManipulatorChildParameterName;
+        }
+        if (afterManipulatorOperator == null) {
+          afterManipulatorOperator = new AfterManipulatorOperator<TGraph, TVertex, TContent>();
+          afterManipulatorOperator.ChildParameterName = ManipulatorChildParameterName;
+        }
+        var instrumentedManipulator = (InstrumentedOperator)Manipulator;
+        instrumentedManipulator.BeforeExecutionOperators.Add(beforeManipulatorOperator);
+        instrumentedManipulator.AfterExecutionOperators.Add(afterManipulatorOperator);
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Arc.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Arc.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Arc.cs	(revision 10278)
@@ -1,3 +1,24 @@
-﻿using HeuristicLab.Common;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/DirectedGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/DirectedGraph.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/DirectedGraph.cs	(revision 10278)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -29,9 +29,9 @@
 
 namespace HeuristicLab.EvolutionTracking {
-  [Item("", "")]
+  [Item("DirectedGraph", "Generic class representing a directed graph with custom vertices and content")]
   [StorableClass]
   public class DirectedGraph<TVertex> : Item, IDirectedGraph<TVertex> where TVertex : class,IVertex {
     [Storable]
-    protected readonly List<TVertex> nodes; // graph will consist of a set of nodes of type T
+    protected readonly List<TVertex> nodes; // for performance reasons, maybe this should be a linked list (fast remove)
     public List<TVertex> Nodes {
       get { return nodes; }
@@ -46,5 +46,5 @@
     protected DirectedGraph(DirectedGraph<TVertex> original, Cloner cloner)
       : base(original, cloner) {
-      nodes = new List<TVertex>(original.Nodes); // bburlacu: maybe the list should be empty
+      nodes = new List<TVertex>(original.Nodes);
     }
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -116,9 +116,4 @@
       base.Clear();
     }
-
-    /// <summary>
-    /// Adds a node representing an individual
-    /// </summary>
-    /// <param name="node">The node to add</param>
     public override void AddVertex(TVertex vertex) {
       if (contentMap.ContainsKey(vertex.Content)) {
@@ -130,12 +125,9 @@
     }
 
-    /// <summary>
-    /// Remove a node from the graph along with edges associated with it
-    /// </summary>
-    /// <param name="t">The graph node</param>
-    public override void RemoveVertex(TVertex t) {
-      if (contentMap.ContainsKey(t.Content)) {
-        contentMap[t.Content].Remove(t);
+    public override void RemoveVertex(TVertex vertex) {
+      if (contentMap.ContainsKey(vertex.Content)) {
+        contentMap[vertex.Content].Remove(vertex);
       }
+      base.RemoveVertex(vertex);
     }
   }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IArc.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IArc.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IArc.cs	(revision 10278)
@@ -1,3 +1,24 @@
-﻿namespace HeuristicLab.EvolutionTracking {
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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
+
+namespace HeuristicLab.EvolutionTracking {
   public interface IArc {
     IVertex Source { get; set; }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IDirectedGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IDirectedGraph.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IDirectedGraph.cs	(revision 10278)
@@ -38,5 +38,5 @@
     where TVertex : class, IVertex
     where TContent : class, IItem {
-    bool Contains(TContent content); // graph contains specific node?
+    bool Contains(TContent content); // graph contains node with given content?
   }
 }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Vertex.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Vertex.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Vertex.cs	(revision 10278)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/FPGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/FPGraph.cs	(revision 10278)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/FPGraph.cs	(revision 10278)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.EvolutionTracking {
+  [Item("Symbol graph", "A graph used to store the relationship between symbols in a population of individuals")]
+  [StorableClass]
+  public class FPGraph : DirectedGraph<SymbolNode> {
+    [Storable]
+    public Dictionary<int, List<SymbolNode>> Levels { get { return levels; } }
+    private Dictionary<int, List<SymbolNode>> levels = new Dictionary<int, List<SymbolNode>>();
+
+    public void AddNode(SymbolNode node, int level) {
+      if (levels.ContainsKey(level)) {
+        SymbolNode match = levels[level].Find(n => n.Label.Equals(node.Label));
+        if (match == null) {
+          levels[level].Add(node);
+        }
+      } else {
+        levels[level] = new List<SymbolNode> { node };
+      }
+      base.AddVertex(node);
+    }
+
+    public bool ContainsKey(string key, int level) {
+      return levels.ContainsKey(level) && levels[level].Select(n => n.Label).Contains(key);
+    }
+
+    public SymbolNode GetNode(string key, int level) {
+      SymbolNode node = null;
+      if (levels.ContainsKey(level))
+        node = levels[level].Find(n => n.Label.Equals(key));
+      return node;
+    }
+
+    void AddArc(SymbolNode source, SymbolNode target, double weight, object data = null) {
+      source.AddForwardArc(target, weight, data);
+    }
+  }
+}
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs	(revision 10278)
@@ -1,3 +1,23 @@
-﻿
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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;
@@ -35,5 +55,60 @@
       Ranks = new Dictionary<double, LinkedList<TVertex>>();
     }
+    public override void AddVertex(TVertex vertex) {
+      if (!Ranks.ContainsKey(vertex.Rank)) {
+        Ranks[vertex.Rank] = new LinkedList<TVertex>();
+      }
+      Ranks[vertex.Rank].AddLast(vertex);
+      base.AddVertex(vertex);
+    }
+    public override void RemoveVertex(TVertex vertex) {
+      if (Ranks.ContainsKey(vertex.Rank)) {
+        Ranks[vertex.Rank].Remove(vertex);
+      }
+      base.RemoveVertex(vertex);
+    }
+    // updated event
+    public event EventHandler GraphUpdated;
+    private void OnGraphUpdated(object sender, EventArgs args) {
+      var updated = GraphUpdated;
+      if (updated != null) updated(sender, args);
+    }
+  }
 
+  [StorableClass]
+  [Item("GenealogyGraph",
+    "A class representing a genealogy graph (of a population of individuals) in which each vertex stores a content.")]
+  public class GenealogyGraph<TVertex, TContent> : DirectedGraph<TVertex, TContent>, IGenealogyGraph<TVertex, TContent>
+    where TVertex : class, IGenealogyGraphNode<TContent>
+    where TContent : class, IItem {
+    [Storable]
+    private Dictionary<double, LinkedList<TVertex>> ranks;
+    public Dictionary<double, LinkedList<TVertex>> Ranks {
+      get { return ranks; }
+      set { ranks = value; }
+    }
+    protected GenealogyGraph(GenealogyGraph<TVertex, TContent> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GenealogyGraph<TVertex, TContent>(this, cloner);
+    }
+    public GenealogyGraph() {
+      Ranks = new Dictionary<double, LinkedList<TVertex>>();
+    }
+    public override void AddVertex(TVertex vertex) {
+      if (!Ranks.ContainsKey(vertex.Rank)) {
+        Ranks[vertex.Rank] = new LinkedList<TVertex>();
+      }
+      Ranks[vertex.Rank].AddLast(vertex);
+      base.AddVertex(vertex);
+    }
+    public override void RemoveVertex(TVertex vertex) {
+      if (Ranks.ContainsKey(vertex.Rank)) {
+        Ranks[vertex.Rank].Remove(vertex);
+      }
+      base.RemoveVertex(vertex);
+    }
+    // updated event
     public event EventHandler GraphUpdated;
     private void OnGraphUpdated(object sender, EventArgs args) {
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphArc.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphArc.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphArc.cs	(revision 10278)
@@ -1,3 +1,23 @@
-﻿
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Common;
 using HeuristicLab.Core;
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs	(revision 10278)
@@ -1,3 +1,23 @@
-﻿
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Collections.Generic;
 using System.Linq;
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraph.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraph.cs	(revision 10278)
@@ -1,10 +1,40 @@
-﻿using System.Collections.Generic;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Collections.Generic;
+using HeuristicLab.Core;
 
 namespace HeuristicLab.EvolutionTracking {
+
+
+  public interface IGenealogyGraph : IGenealogyGraph<IGenealogyGraphNode> {
+  }
   public interface IGenealogyGraph<TVertex> : IDirectedGraph<TVertex> where TVertex : class, IGenealogyGraphNode {
     Dictionary<double, LinkedList<TVertex>> Ranks { get; set; }
   }
 
-  public interface IGenealogyGraph : IGenealogyGraph<IGenealogyGraphNode> {
+  public interface IGenealogyGraph<TVertex, in TContent> : IDirectedGraph<TVertex, TContent>, IGenealogyGraph<TVertex>
+    where TVertex : class, IGenealogyGraphNode<TContent>
+    where TContent : class, IItem {
+
+    List<TVertex> this[TContent content] { get; }
   }
 }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphArc.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphArc.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphArc.cs	(revision 10278)
@@ -1,3 +1,24 @@
-﻿namespace HeuristicLab.EvolutionTracking {
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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
+
+namespace HeuristicLab.EvolutionTracking {
   public interface IGenealogyGraphArc : IArc {
     new IGenealogyGraphNode Source { get; set; }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs	(revision 10278)
@@ -1,3 +1,24 @@
-﻿using System;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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;
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/HeuristicLab.EvolutionTracking-3.4.csproj
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/HeuristicLab.EvolutionTracking-3.4.csproj	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/HeuristicLab.EvolutionTracking-3.4.csproj	(revision 10278)
@@ -131,4 +131,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Analyzers\GenealogyAnalyzer.cs" />
     <Compile Include="DirectedGraph\Arc.cs" />
     <Compile Include="DirectedGraph\DirectedGraph.cs" />
@@ -137,7 +138,9 @@
     <Compile Include="DirectedGraph\Interfaces\IVertex.cs" />
     <Compile Include="DirectedGraph\Vertex.cs" />
-    <Compile Include="EvolutionTrackingOperators\EvolutionTrackingAfterCreationOperator.cs" />
-    <Compile Include="EvolutionTrackingOperators\EvolutionTrackingAfterCrossoverOperator.cs" />
-    <Compile Include="EvolutionTrackingOperators\EvolutionTrackingOperator.cs" />
+    <Compile Include="Operators\AfterCrossoverOperator.cs" />
+    <Compile Include="Operators\AfterManipulatorOperator.cs" />
+    <Compile Include="Operators\AfterSolutionCreatorOperator.cs" />
+    <Compile Include="Operators\BeforeManipulatorOperator.cs" />
+    <Compile Include="Operators\EvolutionTrackingOperator.cs" />
     <Compile Include="FPGraph.cs">
       <SubType>Code</SubType>
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterCrossoverOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterCrossoverOperator.cs	(revision 10278)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterCrossoverOperator.cs	(revision 10278)
@@ -0,0 +1,90 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.EvolutionTracking {
+  [StorableClass]
+  [Item("AfterCrossoverOperator", "A generic operator that can record genealogical relationships between crossover parents and children.")]
+  public class AfterCrossoverOperator<TGraph, TVertex, TContent> : EvolutionTrackingOperator<TGraph, TVertex, TContent>
+    where TGraph : class,IGenealogyGraph<TVertex, TContent>
+    where TVertex : class,IGenealogyGraphNode<TContent>, new()
+    where TContent : class,IItem {
+
+    private string parentsParameterName;
+    public string ParentsParameterName {
+      get { return parentsParameterName; }
+      set {
+        if (parentsParameterName != null && Parameters.ContainsKey(parentsParameterName)) Parameters.Remove(parentsParameterName); // remove old parameter
+        parentsParameterName = value;
+        if (!Parameters.ContainsKey(parentsParameterName)) Parameters.Add(new ScopeTreeLookupParameter<TContent>(parentsParameterName));
+      }
+    }
+    private string childParameterName;
+    public string ChildParameterName {
+      get { return childParameterName; }
+      set {
+        if (childParameterName != null && Parameters.ContainsKey(childParameterName)) Parameters.Remove(childParameterName);
+        childParameterName = value;
+        if (!Parameters.ContainsKey(childParameterName)) Parameters.Add(new LookupParameter<TContent>(childParameterName));
+      }
+    }
+
+    public IScopeTreeLookupParameter<TContent> ParentsParameter {
+      get { return (IScopeTreeLookupParameter<TContent>)Parameters[ParentsParameterName]; }
+    }
+
+    public ILookupParameter<TContent> ChildParameter {
+      get { return (ILookupParameter<TContent>)Parameters[ChildParameterName]; }
+    }
+
+    protected AfterCrossoverOperator(AfterCrossoverOperator<TGraph, TVertex, TContent> original, Cloner cloner)
+      : base(original, cloner) {
+      ParentsParameterName = original.ParentsParameterName;
+      ChildParameterName = original.ChildParameterName;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AfterCrossoverOperator<TGraph, TVertex, TContent>(this, cloner);
+    }
+
+    public AfterCrossoverOperator() { }
+
+    public override IOperation Apply() {
+      //      var parentVertices = ParentsParameter.ActualValue.Select(x => GenealogyGraph[x].Last()).ToList();
+      var lastGen = GenealogyGraph.Ranks[Generations.Value].ToList();
+      var parentVertices = ExecutionContext.Scope.SubScopes.Select(s => lastGen[int.Parse(s.Name)]).ToList();
+      var childVertex = new TVertex {
+        Content = ChildParameter.ActualValue,
+        Rank = parentVertices[0].Rank + 1
+      };
+      GenealogyGraph.AddVertex(childVertex);
+      foreach (var v in parentVertices) {
+        childVertex.AddReverseArc(v);
+        v.AddForwardArc(childVertex);
+      }
+      return base.Apply();
+    }
+  }
+}
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterManipulatorOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterManipulatorOperator.cs	(revision 10278)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterManipulatorOperator.cs	(revision 10278)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.EvolutionTracking {
+  [StorableClass]
+  [Item("AfterCrossoverOperator", "Performs an action after the crossover operator is applied.")]
+  public class AfterManipulatorOperator<TGraph, TVertex, TContent> : EvolutionTrackingOperator<TGraph, TVertex, TContent>
+    where TGraph : class,IGenealogyGraph<TVertex, TContent>
+    where TVertex : class,IGenealogyGraphNode<TContent>, new()
+    where TContent : class,IItem {
+
+    private string childParameterName;
+    public string ChildParameterName {
+      get { return childParameterName; }
+      set {
+        if (childParameterName != null && Parameters.ContainsKey(childParameterName)) Parameters.Remove(childParameterName);
+        childParameterName = value;
+        if (!Parameters.ContainsKey(childParameterName)) Parameters.Add(new LookupParameter<TContent>(childParameterName));
+      }
+    }
+
+    #region parameter properties
+    public ILookupParameter<TContent> ChildParameter {
+      get { return (ILookupParameter<TContent>)Parameters[ChildParameterName]; }
+    }
+    #endregion
+    protected AfterManipulatorOperator(AfterManipulatorOperator<TGraph, TVertex, TContent> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AfterManipulatorOperator<TGraph, TVertex, TContent>(this, cloner);
+    }
+
+    public AfterManipulatorOperator() { }
+
+    public override IOperation Apply() {
+      return base.Apply();
+    }
+  }
+}
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterSolutionCreatorOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterSolutionCreatorOperator.cs	(revision 10278)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterSolutionCreatorOperator.cs	(revision 10278)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.EvolutionTracking.Operators {
+  [StorableClass]
+  [Item("AfterSolutionCreatorOperator", "An operator that runs after the solution creator and performs additional actions.")]
+  public class AfterSolutionCreatorOperator<TGraph, TVertex, TContent> : EvolutionTrackingOperator<TGraph, TVertex, TContent>
+    where TGraph : class,IGenealogyGraph<TVertex, TContent>
+    where TVertex : class,IGenealogyGraphNode<TContent>, new()
+    where TContent : class,IItem {
+
+    private string newIndividualParameterName;
+    public string NewIndividualParameterName {
+      get { return newIndividualParameterName; }
+      set {
+        if (newIndividualParameterName != null && Parameters.ContainsKey(newIndividualParameterName))
+          Parameters.Remove(newIndividualParameterName);
+        newIndividualParameterName = value;
+        if (!Parameters.ContainsKey(newIndividualParameterName)) {
+          Parameters.Add(new LookupParameter<TContent>(newIndividualParameterName));
+        }
+      }
+    }
+
+    public ILookupParameter<TContent> NewIndividualParameter {
+      get { return (ILookupParameter<TContent>)Parameters[NewIndividualParameterName]; }
+    }
+    public TContent NewIndividual { get { return NewIndividualParameter.ActualValue; } }
+
+    public override IOperation Apply() {
+      var vertex = new TVertex {
+        Content = NewIndividual
+      };
+      GenealogyGraph.AddVertex(vertex);
+      return base.Apply();
+    }
+  }
+}
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 10278)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 10278)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.EvolutionTracking {
+  [StorableClass]
+  [Item("AfterCrossoverOperator", "Performs an action after the crossover operator is applied.")]
+  public class BeforeManipulatorOperator<TGraph, TVertex, TContent> : EvolutionTrackingOperator<TGraph, TVertex, TContent>
+    where TGraph : class,IGenealogyGraph<TVertex, TContent>
+    where TVertex : class,IGenealogyGraphNode<TContent>, new()
+    where TContent : class,IItem {
+    private string childParameterName;
+    public string ChildParameterName {
+      get { return childParameterName; }
+      set {
+        if (childParameterName != null && Parameters.ContainsKey(childParameterName)) Parameters.Remove(childParameterName);
+        childParameterName = value;
+        if (!Parameters.ContainsKey(childParameterName)) Parameters.Add(new LookupParameter<TContent>(childParameterName));
+      }
+    }
+
+    #region parameter properties
+    public ILookupParameter<TContent> ChildParameter {
+      get { return (ILookupParameter<TContent>)Parameters[ChildParameterName]; }
+    }
+    #endregion
+    protected BeforeManipulatorOperator(BeforeManipulatorOperator<TGraph, TVertex, TContent> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BeforeManipulatorOperator<TGraph, TVertex, TContent>(this, cloner);
+    }
+
+    public BeforeManipulatorOperator() { }
+
+    public override IOperation Apply() {
+      if (GenealogyGraph.Contains(ChildParameter.ActualValue)) {
+        // if the individual has been affected by crossover before mutation, we keep it in the graph and feed a clone of it to the mutation operator
+        ChildParameter.ActualValue = (TContent)ChildParameter.ActualValue.Clone();
+      }
+      return base.Apply();
+    }
+  }
+}
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/EvolutionTrackingOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/EvolutionTrackingOperator.cs	(revision 10278)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/EvolutionTrackingOperator.cs	(revision 10278)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+
+namespace HeuristicLab.EvolutionTracking {
+  public class EvolutionTrackingOperator<TGraph, TVertex, TContent> : SingleSuccessorOperator
+    where TGraph : class,IGenealogyGraph<TVertex, TContent>
+    where TVertex : class,IGenealogyGraphNode<TContent>
+    where TContent : class,IItem {
+    // evolution tracking-related parameters
+    private const string ResultsParameterName = "Results";
+    private const string PopulationGraphParameterName = "PopulationGraph";
+    private const string GenerationsParameterName = "Generations";
+
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
+    }
+    public ILookupParameter<IntValue> GenerationsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[GenerationsParameterName]; }
+    }
+    public ResultCollection Results {
+      get { return ResultsParameter.ActualValue; }
+    }
+    public IntValue Generations {
+      get { return GenerationsParameter.ActualValue; }
+    }
+    public IGenealogyGraph<TVertex, TContent> GenealogyGraph {
+      get {
+        IResult result;
+        if (!Results.ContainsKey(PopulationGraphParameterName)) {
+          result = new Result(PopulationGraphParameterName, new GenealogyGraph<TVertex, TContent>());
+          Results.Add(result);
+        } else {
+          result = Results[PopulationGraphParameterName];
+        }
+        var graph = (GenealogyGraph<TVertex, TContent>)result.Value;
+        return graph;
+      }
+    }
+    public EvolutionTrackingOperator() {
+      Parameters.Add(new LookupParameter<IntValue>(GenerationsParameterName));
+      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName));
+    }
+    protected EvolutionTrackingOperator(EvolutionTrackingOperator<TGraph, TVertex, TContent> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvolutionTrackingOperator<TGraph, TVertex, TContent>(this, cloner);
+    }
+  }
+}
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Plugin.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Plugin.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Plugin.cs	(revision 10278)
@@ -22,6 +22,6 @@
 using HeuristicLab.PluginInfrastructure;
 
-namespace HeuristicLab.EvolutionaryTracking {
-  [Plugin("HeuristicLab.EvolutionaryTracking", "Provides operators and related classes for tracking the evolution within a GA.", "3.4.2.7439")]
+namespace HeuristicLab.EvolutionTracking {
+  [Plugin("HeuristicLab.EvolutionTracking", "Provides operators and related classes for tracking the evolution within a GA.", "3.4.2.7439")]
   [PluginFile("HeuristicLab.EvolutionaryTracking-3.4.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Analysis", "3.3")]
@@ -42,5 +42,5 @@
   [PluginDependency("HeuristicLab.Problems.DataAnalysis", "3.4")]
 
-  public class HeuristicLabEvolutionaryTrackingPlugin : PluginBase {
+  public class HeuristicLabEvolutionTrackingPlugin : PluginBase {
   }
 }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/SymbolGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/SymbolGraph.cs	(revision 10278)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/SymbolGraph.cs	(revision 10278)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.EvolutionTracking {
+  [Item("Symbol graph", "A graph used to store the relationship between symbols in a population of individuals")]
+  [StorableClass]
+  public class SymbolGraph : DirectedGraph<SymbolNode> {
+    [Storable]
+    private readonly Dictionary<string, SymbolNode> nodeMap = new Dictionary<string, SymbolNode>();
+
+    public override void AddVertex(SymbolNode node) {
+      if (nodeMap.ContainsKey(node.Label)) return; // node already present? do nothing
+      nodeMap[node.Label] = node;
+      base.AddVertex(node);
+    }
+
+    public bool ContainsKey(string key) {
+      return nodeMap.ContainsKey(key);
+    }
+
+    public SymbolNode GetNode(string key) {
+      SymbolNode node;
+      nodeMap.TryGetValue(key, out node);
+      return node;
+    }
+
+    void AddArc(SymbolNode source, SymbolNode target, double weight, object data = null) {
+      source.AddForwardArc(target, weight, data);
+    }
+  }
+
+  [StorableClass]
+  public class SymbolNode : Vertex {
+    public ISymbol Symbol { get; set; }
+    public Dictionary<int, int> Positions { get; set; }
+    public double AverageArity { get; set; }
+
+    public new List<SymbolArc> InArcs {
+      get { return base.InArcs == null ? null : base.InArcs.Cast<SymbolArc>().ToList(); }
+    }
+
+    public new List<SymbolArc> OutArcs {
+      get { return base.OutArcs == null ? null : base.OutArcs.Cast<SymbolArc>().ToList(); }
+    }
+
+    public SymbolNode() {
+    }
+  }
+
+  public class SymbolArc : IArc {
+    public IVertex Source { get; set; }
+    public IVertex Target { get; set; }
+    public double Weight { get; set; }
+  }
+}
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/LatexSymbolicDataAnalysisModelView.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/LatexSymbolicDataAnalysisModelView.cs	(revision 10278)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/LatexSymbolicDataAnalysisModelView.cs	(revision 10278)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.IO;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Views {
+  [View("Latex Representation")]
+  [Content(typeof(ISymbolicDataAnalysisModel))]
+  public partial class LatexSymbolicDataAnalysisModelView : AsynchronousContentView {
+    private SymbolicDataAnalysisExpressionLatexFormatter formatter = new SymbolicDataAnalysisExpressionLatexFormatter();
+    public LatexSymbolicDataAnalysisModelView()
+      : base() {
+      InitializeComponent();
+      webBrowser.ScrollBarsEnabled = true;
+      webBrowser.ScriptErrorsSuppressed = false;
+
+      // update for the first time after page has loaded
+      webBrowser.DocumentCompleted += (sender, args) => RefreshHtmlPage();
+
+      string hlDir = Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory);
+      webBrowser.Navigate("file://" + Path.Combine(hlDir, "displayModelFrame.html"));
+    }
+
+    public new ISymbolicDataAnalysisModel Content {
+      get { return (ISymbolicDataAnalysisModel)base.Content; }
+      set { base.Content = value; }
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      RefreshHtmlPage();
+    }
+
+    private void RefreshHtmlPage() {
+      // only update if the page has loaded already
+      if (webBrowser.Document == null || webBrowser.Document.Body == null) return;
+
+      if (Content != null) {
+        HtmlElement newElement = webBrowser.Document.GetElementById("model");
+        newElement.InnerText = formatter.Format(Content.SymbolicExpressionTree);
+      } else {
+        HtmlElement newElement = webBrowser.Document.GetElementById("model");
+        newElement.InnerText = string.Empty;
+      }
+      webBrowser.Document.InvokeScript("refreshModel");
+    }
+  }
+}
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/LatexSymbolicDataAnalysisModelView.designer.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/LatexSymbolicDataAnalysisModelView.designer.cs	(revision 10278)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/LatexSymbolicDataAnalysisModelView.designer.cs	(revision 10278)
@@ -0,0 +1,81 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Views {
+  partial class LatexSymbolicDataAnalysisModelView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        webBrowser.Dispose();
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.webBrowser = new System.Windows.Forms.WebBrowser();
+      this.SuspendLayout();
+      // 
+      // webBrowser
+      // 
+      this.webBrowser.AllowNavigation = false;
+      this.webBrowser.AllowWebBrowserDrop = false;
+      this.webBrowser.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.webBrowser.IsWebBrowserContextMenuEnabled = false;
+      this.webBrowser.Location = new System.Drawing.Point(0, 0);
+      this.webBrowser.MinimumSize = new System.Drawing.Size(20, 20);
+      this.webBrowser.Name = "webBrowser";
+      this.webBrowser.Size = new System.Drawing.Size(352, 413);
+      this.webBrowser.TabIndex = 0;
+      this.webBrowser.WebBrowserShortcutsEnabled = false;
+      // 
+      // MathSymbolicDataAnalysisModelView
+      // 
+      this.AllowDrop = true;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.webBrowser);
+      this.Name = "MathSymbolicDataAnalysisModelView";
+      this.Size = new System.Drawing.Size(352, 413);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.WebBrowser webBrowser;
+
+  }
+}
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/MenuItems/OptimizeDataAnalysisRunsMenuItem.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/MenuItems/OptimizeDataAnalysisRunsMenuItem.cs	(revision 10278)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/MenuItems/OptimizeDataAnalysisRunsMenuItem.cs	(revision 10278)
@@ -0,0 +1,74 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimizer;
+
+using MenuItem = HeuristicLab.MainForm.WindowsForms.MenuItem;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  public abstract class OptimizeDataAnalysisRunsMenuItem : MenuItem, IOptimizerUserInterfaceItemProvider {
+    public override string Name {
+      get { return "Optimize Runs"; }
+    }
+    public override IEnumerable<string> Structure {
+      get { return new string[] { "&Data Analysis" }; }
+    }
+    public override int Position {
+      get { return 5400; }
+    }
+    public override string ToolTipText {
+      get {
+        return "This command tries to optimize each run by performing a pruning and a constant optimization step on the solution models.";
+      }
+    }
+    protected override void OnToolStripItemSet(EventArgs e) {
+      ToolStripItem.Enabled = false;
+    }
+    protected RunCollection runCollection;
+
+    protected override void OnActiveViewChanged(object sender, EventArgs e) {
+      IContentView activeView = MainFormManager.MainForm.ActiveView as IContentView;
+      if (activeView == null) {
+        ToolStripItem.Enabled = false;
+        return;
+      }
+
+      var content = activeView.Content;
+      runCollection = content as RunCollection;
+      if (runCollection == null && content is IOptimizer)
+        runCollection = ((IOptimizer)content).Runs;
+
+      if (runCollection == null) {
+        ToolStripItem.Enabled = false;
+        return;
+      }
+
+      ToolStripItem.Enabled = runCollection.Any(run => run.Results.ContainsKey("Best training solution"));
+    }
+  }
+}
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj	(revision 10278)
@@ -332,4 +332,7 @@
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Tracking\" />
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisProblem.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisProblem.cs	(revision 10277)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisProblem.cs	(revision 10278)
@@ -28,4 +28,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.EvolutionTracking;
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
@@ -33,4 +34,8 @@
 using HeuristicLab.PluginInfrastructure;
 using HeuristicLab.Problems.Instances;
+
+using TGraph = HeuristicLab.EvolutionTracking.IGenealogyGraph<HeuristicLab.EvolutionTracking.GenealogyGraphNode<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree>,
+                                                              HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree>;
+using TVertex = HeuristicLab.EvolutionTracking.GenealogyGraphNode<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree>;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
@@ -231,4 +236,5 @@
       Operators.Add(new MinAverageMaxSymbolicExpressionTreeLengthAnalyzer());
       Operators.Add(new SymbolicExpressionTreeLengthAnalyzer());
+      Operators.Add(new GenealogyAnalyzer<TGraph, TVertex, ISymbolicExpressionTree>());
       ParameterizeOperators();
     }
@@ -350,4 +356,14 @@
         op.EvaluatorParameter.ActualName = EvaluatorParameter.Name;
       }
+      // add tracking analyzer
+      foreach (var op in operators.OfType<GenealogyAnalyzer<TGraph, TVertex, ISymbolicExpressionTree>>()) {
+        var crossover = operators.OfType<ISymbolicExpressionTreeCrossover>().First();
+        op.CrossoverParentsParameterName = crossover.ParentsParameter.Name;
+        op.CrossoverChildParameterName = crossover.ChildParameter.Name;
+        var manipulator = operators.OfType<ISymbolicExpressionTreeManipulator>().First();
+        op.ManipulatorChildParameterName = manipulator.SymbolicExpressionTreeParameter.Name;
+        var creator = operators.OfType<ISymbolicExpressionTreeCreator>().First();
+        op.SolutionCreatorIndividualParameterName = creator.SymbolicExpressionTreeParameter.Name;
+      }
     }
 
