Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/FullTreeCreator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/FullTreeCreator.cs	(revision 7478)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/FullTreeCreator.cs	(revision 7479)
@@ -33,5 +33,5 @@
   [StorableClass]
   [Item("FullTreeCreator", "An operator that creates new symbolic expression trees using the 'Full' method")]
-  public class FullTreeCreator : SymbolicExpressionTreeCreator,
+  public class FullTreeCreator : TracingSymbolicExpressionTreeCreator,
                                  ISymbolicExpressionTreeSizeConstraintOperator,
                                  ISymbolicExpressionTreeGrammarBasedOperator {
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/GrowTreeCreator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/GrowTreeCreator.cs	(revision 7478)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/GrowTreeCreator.cs	(revision 7479)
@@ -33,5 +33,5 @@
   [StorableClass]
   [Item("GrowTreeCreator", "An operator that creates new symbolic expression trees using the 'Grow' method")]
-  public class GrowTreeCreator : SymbolicExpressionTreeCreator,
+  public class GrowTreeCreator : TracingSymbolicExpressionTreeCreator,
                                  ISymbolicExpressionTreeSizeConstraintOperator,
                                  ISymbolicExpressionTreeGrammarBasedOperator {
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/RampedHalfAndHalfTreeCreator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/RampedHalfAndHalfTreeCreator.cs	(revision 7478)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/RampedHalfAndHalfTreeCreator.cs	(revision 7479)
@@ -31,5 +31,5 @@
   [StorableClass]
   [Item("RampedHalfAndHalfTreeCreator", "An operator that creates new symbolic expression trees in an alternate way: half the trees are created usign the 'Grow' method while the other half are created using the 'Full' method")]
-  public class RampedHalfAndHalfTreeCreator : SymbolicExpressionTreeCreator,
+  public class RampedHalfAndHalfTreeCreator : TracingSymbolicExpressionTreeCreator,
                                  ISymbolicExpressionTreeSizeConstraintOperator,
                                  ISymbolicExpressionTreeGrammarBasedOperator {
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/TracingSymbolicExpressionTreeCreator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/TracingSymbolicExpressionTreeCreator.cs	(revision 7479)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/TracingSymbolicExpressionTreeCreator.cs	(revision 7479)
@@ -0,0 +1,86 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
+  /// <summary>
+  /// A base class for operators creating symbolic expression trees.
+  /// </summary>
+  [Item("TracingSymbolicExpressionTreeCreator", "A base class for operators creating symbolic expression trees.")]
+  [StorableClass]
+  public abstract class TracingSymbolicExpressionTreeCreator : SymbolicExpressionTreeOperator, ISymbolicExpressionTreeCreator {
+    private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
+    private const string GlobalTreeCacheParameterName = "GlobalTreeCache";
+
+
+    #region Parameter Properties
+    public ILookupParameter<ISymbolicExpressionTree> SymbolicExpressionTreeParameter {
+      get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
+    }
+    #endregion
+
+    #region Properties
+    public ISymbolicExpressionTree SymbolicExpressionTree {
+      get { return SymbolicExpressionTreeParameter.ActualValue; }
+      set { SymbolicExpressionTreeParameter.ActualValue = value; }
+    }
+
+    #endregion
+    [StorableConstructor]
+    protected TracingSymbolicExpressionTreeCreator(bool deserializing) : base(deserializing) { }
+    protected TracingSymbolicExpressionTreeCreator(TracingSymbolicExpressionTreeCreator original, Cloner cloner) : base(original, cloner) { }
+    protected TracingSymbolicExpressionTreeCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression tree that should be created."));
+      Parameters.Add(new LookupParameter<ItemList<ISymbolicExpressionTree>>(GlobalTreeCacheParameterName, "The global cache for storing the trees"));
+      //globalScope.Variables.Add(new Variable(GlobalOperatorCacheParameterName, new ItemList<ISymbolicExpressionTree>()));
+    }
+
+    public override IOperation Apply() {
+      SymbolicExpressionTree = Create(Random);
+      // add tree to the global tree cache
+      AddTreeToGlobalCache();
+
+      return base.Apply();
+    }
+
+    private void AddTreeToGlobalCache() {
+      var globalScope = ExecutionContext.Scope;
+      while (globalScope.Parent != null) globalScope = globalScope.Parent;
+
+      Variable globalTreeCache;
+      if (!globalScope.Variables.ContainsKey(GlobalTreeCacheParameterName)) {
+        globalTreeCache = new Variable(GlobalTreeCacheParameterName, new ItemList<ISymbolicExpressionTree>());
+        globalScope.Variables.Add(globalTreeCache);
+      } else
+        globalTreeCache = (Variable)globalScope.Variables[GlobalTreeCacheParameterName];
+      var trees = (ItemList<ISymbolicExpressionTree>)globalTreeCache.Value;
+      trees.Add(SymbolicExpressionTree);
+    }
+
+    protected abstract ISymbolicExpressionTree Create(IRandom random);
+    public abstract ISymbolicExpressionTree CreateTree(IRandom random, ISymbolicExpressionGrammar grammar, int maxTreeLength, int maxTreeDepth);
+  }
+}
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SubtreeCrossover.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SubtreeCrossover.cs	(revision 7478)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SubtreeCrossover.cs	(revision 7479)
@@ -38,5 +38,5 @@
   [Item("SubtreeCrossover", "An operator which performs subtree swapping crossover.")]
   [StorableClass]
-  public sealed class SubtreeCrossover : SymbolicExpressionTreeCrossover, ISymbolicExpressionTreeSizeConstraintOperator {
+  public sealed class SubtreeCrossover : TracingSymbolicExpressionTreeCrossover, ISymbolicExpressionTreeSizeConstraintOperator {
     private const string InternalCrossoverPointProbabilityParameterName = "InternalCrossoverPointProbability";
     private const string MaximumSymbolicExpressionTreeLengthParameterName = "MaximumSymbolicExpressionTreeLength";
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/TracingSymbolicExpressionTreeCrossover.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/TracingSymbolicExpressionTreeCrossover.cs	(revision 7479)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/TracingSymbolicExpressionTreeCrossover.cs	(revision 7479)
@@ -0,0 +1,112 @@
+﻿#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;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+using TreeCacheType = HeuristicLab.Core.ItemList<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree>;
+using CloneMapType = HeuristicLab.Core.ItemDictionary<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree,
+                                                      HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree>;
+using TraceMapType = HeuristicLab.Core.ItemDictionary<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree,
+                                                      HeuristicLab.Core.IItemArray<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree>>;
+
+namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
+  /// <summary>
+  /// A base class for operators that perform a crossover of symbolic expression trees.
+  /// </summary>
+  [Item("SymbolicExpressionTreeCrossover", "A base class for operators that perform a crossover of symbolic expression trees.")]
+  [StorableClass]
+  public abstract class TracingSymbolicExpressionTreeCrossover : SymbolicExpressionTreeOperator, ISymbolicExpressionTreeCrossover {
+    private const string ParentsParameterName = "Parents";
+    private const string ChildParameterName = "Child";
+    private const string GlobalTraceMapParameterName = "GlobalTraceMap";
+    private const string GlobalCloneMapParameterName = "GlobalCloneMap";
+    #region Parameter Properties
+    public ILookupParameter<ItemArray<ISymbolicExpressionTree>> ParentsParameter {
+      get { return (ScopeTreeLookupParameter<ISymbolicExpressionTree>)Parameters[ParentsParameterName]; }
+    }
+    public ILookupParameter<ISymbolicExpressionTree> ChildParameter {
+      get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters[ChildParameterName]; }
+    }
+    public LookupParameter<CloneMapType> GlobalCloneMapParameter {
+      get { return (LookupParameter<CloneMapType>)Parameters[GlobalCloneMapParameterName]; }
+    }
+    public LookupParameter<TraceMapType> GlobalTraceMapParameter {
+      get { return (LookupParameter<TraceMapType>)Parameters[GlobalTraceMapParameterName]; }
+    }
+    #endregion
+    #region Properties
+    public ItemArray<ISymbolicExpressionTree> Parents {
+      get { return ParentsParameter.ActualValue; }
+    }
+    public ISymbolicExpressionTree Child {
+      get { return ChildParameter.ActualValue; }
+      set { ChildParameter.ActualValue = value; }
+    }
+    public CloneMapType GlobalCloneMap {
+      get { return GlobalCloneMapParameter.ActualValue; }
+    }
+    public TraceMapType GlobalTraceMap {
+      get { return GlobalTraceMapParameter.ActualValue; }
+    }
+    #endregion
+    [StorableConstructor]
+    protected TracingSymbolicExpressionTreeCrossover(bool deserializing) : base(deserializing) { }
+    protected TracingSymbolicExpressionTreeCrossover(TracingSymbolicExpressionTreeCrossover original, Cloner cloner) : base(original, cloner) { }
+    protected TracingSymbolicExpressionTreeCrossover()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<ISymbolicExpressionTree>(ParentsParameterName, "The parent symbolic expression trees which should be crossed."));
+      Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(ChildParameterName, "The child symbolic expression tree resulting from the crossover."));
+      Parameters.Add(new LookupParameter<ItemDictionary<ISymbolicExpressionTree, ISymbolicExpressionTree>>(GlobalCloneMapParameterName, "A global map keeping track of trees and their clones (made during selection)."));
+      Parameters.Add(new LookupParameter<ItemDictionary<ISymbolicExpressionTree, IItemArray<ISymbolicExpressionTree>>>(GlobalTraceMapParameterName, "A global cache containing tracing info."));
+    }
+
+    public sealed override IOperation Apply() {
+      if (Parents.Length != 2)
+        throw new ArgumentException("Number of parents must be exactly two for symbolic expression tree crossover operators.");
+      // add global trace cache if not already present in global scope
+      if (GlobalTraceMap == null) {
+        var gScope = ExecutionContext.Scope;
+        while (gScope.Parent != null) gScope = gScope.Parent;
+        gScope.Variables.Add(new Variable(GlobalTraceMapParameterName, new ItemDictionary<ISymbolicExpressionTree, IItemArray<ISymbolicExpressionTree>>()));
+      }
+      var originalParents = new ItemArray<ISymbolicExpressionTree>(Parents.Select(x => GlobalCloneMap[x]));
+      // prevent incestuous crossover (an individual mating with itself)
+      if (originalParents[0] == originalParents[1]) {
+        Child = Parents[0];
+        return base.Apply();
+      }
+      ISymbolicExpressionTree result = Cross(Random, Parents[0], Parents[1]);
+
+      Child = result;
+      GlobalTraceMap.Add(Child, originalParents);
+
+      return base.Apply();
+    }
+
+    protected abstract ISymbolicExpressionTree Cross(IRandom random,
+      ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1);
+  }
+}
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj	(revision 7478)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj	(revision 7479)
@@ -41,5 +41,5 @@
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -51,5 +51,5 @@
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
-    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -59,5 +59,5 @@
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
     <DebugSymbols>true</DebugSymbols>
-    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DebugType>full</DebugType>
@@ -67,5 +67,5 @@
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
-    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <Optimize>true</Optimize>
@@ -77,5 +77,5 @@
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
     <DebugSymbols>true</DebugSymbols>
-    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DebugType>full</DebugType>
@@ -85,5 +85,5 @@
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
-    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <Optimize>true</Optimize>
@@ -92,4 +92,7 @@
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup>
+    <StartupObject />
   </PropertyGroup>
   <ItemGroup>
@@ -163,4 +166,5 @@
     <Compile Include="Compiler\Instruction.cs" />
     <Compile Include="Compiler\SymbolicExpressionTreeCompiler.cs" />
+    <Compile Include="Creators\TracingSymbolicExpressionTreeCreator.cs" />
     <Compile Include="Creators\FullTreeCreator.cs">
       <SubType>Code</SubType>
@@ -170,4 +174,5 @@
     </Compile>
     <Compile Include="Creators\RampedHalfAndHalfTreeCreator.cs" />
+    <Compile Include="Crossovers\TracingSymbolicExpressionTreeCrossover.cs" />
     <Compile Include="Interfaces\IReadOnlySymbol.cs" />
     <Compile Include="Interfaces\ISymbolicExpressionGrammar.cs" />
@@ -191,4 +196,5 @@
     <Compile Include="Manipulators\ChangeNodeTypeManipulation.cs" />
     <Compile Include="Interfaces\Operators\ISymbolicExpressionTreeManipulator.cs" />
+    <Compile Include="Manipulators\TracingSymbolicExpressionTreeManipulator.cs" />
     <Compile Include="Manipulators\ReplaceBranchManipulation.cs" />
     <Compile Include="Manipulators\FullTreeShaker.cs" />
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj.user
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj.user	(revision 7478)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj.user	(revision 7479)
@@ -9,3 +9,11 @@
     <StartProgram>C:\Users\bburlacu\Desktop\HL-Core\trunk\sources\bin\HeuristicLab 3.3.exe</StartProgram>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <StartAction>Program</StartAction>
+    <StartProgram>C:\Users\bburlacu\Desktop\HL-Core\trunk\sources\bin\HeuristicLab 3.3.exe</StartProgram>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <StartAction>Program</StartAction>
+    <StartProgram>C:\Users\bburlacu\Desktop\HL-Core\trunk\sources\bin\HeuristicLab 3.3.exe</StartProgram>
+  </PropertyGroup>
 </Project>
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/FullTreeShaker.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/FullTreeShaker.cs	(revision 7478)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/FullTreeShaker.cs	(revision 7479)
@@ -29,5 +29,5 @@
   [StorableClass]
   [Item("FullTreeShaker", "Manipulates all nodes that have local parameters.")]
-  public sealed class FullTreeShaker : SymbolicExpressionTreeManipulator {
+  public sealed class FullTreeShaker : TracingSymbolicExpressionTreeManipulator {
     private const string ShakingFactorParameterName = "ShakingFactor";
     #region parameter properties
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/TracingSymbolicExpressionTreeManipulator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/TracingSymbolicExpressionTreeManipulator.cs	(revision 7479)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/TracingSymbolicExpressionTreeManipulator.cs	(revision 7479)
@@ -0,0 +1,96 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
+  /// <summary>
+  /// A base class for operators that manipulate real-valued vectors.
+  /// </summary>
+  [Item("TracingSymbolicExpressionTreeManipulator", "A base class for operators that manipulate symbolic expression trees.")]
+  [StorableClass]
+  public abstract class TracingSymbolicExpressionTreeManipulator : SymbolicExpressionTreeOperator, ISymbolicExpressionTreeManipulator {
+    private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
+    private const string GlobalTraceCacheParameterName = "GlobalTraceCache";
+    private const string GlobalTreeMapParameterName = "GlobalTreeMap";
+
+    #region Parameter Properties
+    public ILookupParameter<ISymbolicExpressionTree> SymbolicExpressionTreeParameter {
+      get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
+    }
+    public LookupParameter<ItemDictionary<ISymbolicExpressionTree, ISymbolicExpressionTree>> GlobalTreeMapParameter {
+      get {
+        return (LookupParameter<ItemDictionary<ISymbolicExpressionTree, ISymbolicExpressionTree>>)Parameters[GlobalTreeMapParameterName];
+      }
+    }
+    #endregion
+
+    #region Properties
+    public ISymbolicExpressionTree SymbolicExpressionTree {
+      get { return SymbolicExpressionTreeParameter.ActualValue; }
+    }
+    public ItemDictionary<ISymbolicExpressionTree, ISymbolicExpressionTree> GlobalTreeMap {
+      get { return GlobalTreeMapParameter.ActualValue; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected TracingSymbolicExpressionTreeManipulator(bool deserializing) : base(deserializing) { }
+    protected TracingSymbolicExpressionTreeManipulator(TracingSymbolicExpressionTreeManipulator original, Cloner cloner) : base(original, cloner) { }
+    public TracingSymbolicExpressionTreeManipulator()
+      : base() {
+      Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression tree on which the operator should be applied."));
+      Parameters.Add(new LookupParameter<ItemDictionary<ISymbolicExpressionTree, ISymbolicExpressionTree>>(GlobalTreeMapParameterName, "A global map keeping track of trees and their clones (made during selection)."));
+    }
+
+    public sealed override IOperation Apply() {
+      ISymbolicExpressionTree tree = SymbolicExpressionTreeParameter.ActualValue;
+
+      Manipulate(RandomParameter.ActualValue, tree);
+
+      //AddTraceInfoToGlobalCache();
+
+      return base.Apply();
+    }
+
+    private void AddTraceInfoToGlobalCache() {
+      var globalScope = ExecutionContext.Scope;
+      while (globalScope.Parent != null) globalScope = globalScope.Parent;
+
+      Variable globalTraceCache;
+      if (!globalScope.Variables.ContainsKey(GlobalTraceCacheParameterName)) {
+        globalTraceCache = new Variable(GlobalTraceCacheParameterName, new ItemDictionary<ISymbolicExpressionTree, IItemArray<ISymbolicExpressionTree>>());
+        globalScope.Variables.Add(globalTraceCache);
+      } else
+        globalTraceCache = (Variable)globalScope.Variables[GlobalTraceCacheParameterName];
+
+      var traceCache = (ItemDictionary<ISymbolicExpressionTree, IItemArray<ISymbolicExpressionTree>>)globalTraceCache.Value;
+
+      traceCache.Add(SymbolicExpressionTree, new ItemArray<ISymbolicExpressionTree>(new[] { GlobalTreeMap[SymbolicExpressionTree] }));
+    }
+
+    protected abstract void Manipulate(IRandom random, ISymbolicExpressionTree symbolicExpressionTree);
+  }
+}
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Plugin.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Plugin.cs	(revision 7478)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Plugin.cs	(revision 7479)
@@ -26,5 +26,5 @@
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
-  [Plugin("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding","Provides operators and related classes for the symbolic expression tree encoding.", "3.4.2.0")]
+  [Plugin("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding","Provides operators and related classes for the symbolic expression tree encoding.", "3.4.2.7439")]
   [PluginFile("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Analysis", "3.3")]
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Analyzers/SymbolicExpressionTreeGenealogyAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Analyzers/SymbolicExpressionTreeGenealogyAnalyzer.cs	(revision 7479)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Analyzers/SymbolicExpressionTreeGenealogyAnalyzer.cs	(revision 7479)
@@ -0,0 +1,307 @@
+﻿#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;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+using TreeCacheType = HeuristicLab.Core.ItemList<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree>;
+using CloneMapType = HeuristicLab.Core.ItemDictionary<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree,
+                                                      HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree>;
+using TraceMapType = HeuristicLab.Core.ItemDictionary<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree,
+                                                      HeuristicLab.Core.IItemArray<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree>>;
+
+namespace HeuristicLab.EvolutionaryTracking {
+  /// <summary>
+  /// An operator that tracks the genealogy of every individual
+  /// </summary>
+  [Item("SymbolicExpressionTreeGenealogyAnalyzer", "An operator that tracks tree lengths of Symbolic Expression Trees")]
+  [StorableClass]
+  public sealed class SymbolicExpressionTreeGenealogyAnalyzer : SingleSuccessorOperator, IAnalyzer {
+    private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
+    private const string UpdateIntervalParameterName = "UpdateInterval";
+    private const string UpdateCounterParameterName = "UpdateCounter";
+    private const string ResultsParameterName = "Results";
+    private const string ElitesParameterName = "Elites";
+    private const string GenerationsParameterName = "Generations";
+    private const string MaximumGenerationsParameterName = "MaximumGenerations";
+    private const string MaximumSelectionPressureParameterName = "MaximumSelectionPressure";
+    private const string SelectionPressureParameterName = "SelectionPressure";
+    private const string GlobalTreeCacheParameterName = "GlobalTreeCache";
+    private const string GlobalTraceMapParameterName = "GlobalTraceMap";
+    private const string GlobalCloneMapParameterName = "GlobalCloneMap";
+    private const string PopulationGraphResultParameterName = "PopulationGraph";
+    private const string PopulationGraphResultParameterDescription = "Individual lineages";
+
+    #region Parameter properties
+    public ValueParameter<IntValue> UpdateIntervalParameter {
+      get { return (ValueParameter<IntValue>)Parameters[UpdateIntervalParameterName]; }
+    }
+    public ValueParameter<IntValue> UpdateCounterParameter {
+      get { return (ValueParameter<IntValue>)Parameters[UpdateCounterParameterName]; }
+    }
+    public LookupParameter<ResultCollection> ResultsParameter {
+      get { return (LookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
+    }
+    public LookupParameter<IntValue> ElitesParameter {
+      get { return (LookupParameter<IntValue>)Parameters[ElitesParameterName]; }
+    }
+    public LookupParameter<IntValue> GenerationsParameter {
+      get { return (LookupParameter<IntValue>)Parameters[GenerationsParameterName]; }
+    }
+    public LookupParameter<IntValue> MaximumGenerationsParameter {
+      get { return (LookupParameter<IntValue>)Parameters[MaximumGenerationsParameterName]; }
+    }
+    public LookupParameter<DoubleValue> SelectionPressureParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters[SelectionPressureParameterName]; }
+    }
+    public LookupParameter<DoubleValue> MaximumSelectionPressureParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters[MaximumSelectionPressureParameterName]; }
+    }
+    // genealogy global parameters
+    public LookupParameter<TreeCacheType> GlobalTreeCacheParameter {
+      get { return (LookupParameter<TreeCacheType>)Parameters[GlobalTreeCacheParameterName]; }
+    }
+    public LookupParameter<TraceMapType> GlobalTraceMapParameter {
+      get { return (LookupParameter<TraceMapType>)Parameters[GlobalTraceMapParameterName]; }
+    }
+    public LookupParameter<CloneMapType> GlobalCloneMapParameter {
+      get { return (LookupParameter<CloneMapType>)Parameters[GlobalCloneMapParameterName]; }
+    }
+    #endregion
+
+    #region Properties
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+    public IntValue UpdateInterval {
+      get { return UpdateIntervalParameter.Value; }
+    }
+    public IntValue UpdateCounter {
+      get { return UpdateCounterParameter.Value; }
+    }
+    public ResultCollection Results {
+      get { return ResultsParameter.ActualValue; }
+    }
+    public IntValue Elites {
+      get { return ElitesParameter.ActualValue; }
+    }
+    public IntValue Generations {
+      get { return GenerationsParameter.ActualValue; }
+    }
+    public IntValue MaximumGenerations {
+      get { return MaximumGenerationsParameter.ActualValue; }
+    }
+    public DoubleValue SelectionPressure {
+      get { return SelectionPressureParameter.ActualValue; }
+    }
+    public DoubleValue MaximumSelectionPressure {
+      get { return MaximumSelectionPressureParameter.ActualValue; }
+    }
+    public ItemList<ISymbolicExpressionTree> GlobalTreeCache {
+      get { return GlobalTreeCacheParameter.ActualValue; }
+    }
+    public ItemDictionary<ISymbolicExpressionTree, ISymbolicExpressionTree> GlobalCloneMap {
+      get { return GlobalCloneMapParameter.ActualValue; }
+    }
+    public ItemDictionary<ISymbolicExpressionTree, IItemArray<ISymbolicExpressionTree>> GlobalTraceMap {
+      get { return GlobalTraceMapParameter.ActualValue; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private SymbolicExpressionTreeGenealogyAnalyzer(bool deserializing)
+      : base() {
+    }
+    private SymbolicExpressionTreeGenealogyAnalyzer(SymbolicExpressionTreeGenealogyAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicExpressionTreeGenealogyAnalyzer(this, cloner);
+    }
+    public SymbolicExpressionTreeGenealogyAnalyzer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<ISymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression tree whose length should be calculated."));
+      Parameters.Add(new LookupParameter<IntValue>(ElitesParameterName, "The number of elites."));
+      Parameters.Add(new LookupParameter<IntValue>(GenerationsParameterName, "The number of generations so far."));
+      Parameters.Add(new LookupParameter<IntValue>(MaximumGenerationsParameterName, "The maximum number of generations"));
+      Parameters.Add(new LookupParameter<DoubleValue>(SelectionPressureParameterName, "The current selection (ony for OSGA)"));
+      Parameters.Add(new LookupParameter<DoubleValue>(MaximumSelectionPressureParameterName, "Maximum allowed value of selection pressure."));
+      Parameters.Add(new ValueParameter<IntValue>(UpdateIntervalParameterName, "The interval in which the tree length analysis should be applied.", new IntValue(1)));
+      Parameters.Add(new ValueParameter<IntValue>(UpdateCounterParameterName, "The value which counts how many times the operator was called since the last update", new IntValue(0)));
+      Parameters.Add(new LookupParameter<TreeCacheType>(GlobalTreeCacheParameterName, "A global list holding all trees from all generations."));
+      Parameters.Add(new LookupParameter<TraceMapType>(GlobalTraceMapParameterName, "A global cache containing the whole genealogy."));
+      Parameters.Add(new LookupParameter<CloneMapType>(GlobalCloneMapParameterName, "A global map keeping track of trees and their clones (made during selection)."));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>(ResultsParameterName, "The results collection where the analysis values should be stored."));
+
+      UpdateCounterParameter.Hidden = true;
+      UpdateIntervalParameter.Hidden = true;
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // check if all the parameters are present and accounted for 
+      if (!Parameters.ContainsKey(UpdateIntervalParameterName)) {
+        Parameters.Add(new ValueParameter<IntValue>(UpdateIntervalParameterName,
+                                                    "The interval in which the tree length analysis should be applied.",
+                                                    new IntValue(1)));
+      }
+      //necessary code to correct UpdateCounterParameter - type was changed from LookupParameter to ValueParameter
+      if (Parameters.ContainsKey(UpdateCounterParameterName) &&
+          (Parameters[UpdateCounterParameterName] is LookupParameter<IntValue>))
+        Parameters.Remove(UpdateCounterParameterName);
+      if (!Parameters.ContainsKey(UpdateCounterParameterName)) {
+        Parameters.Add(new ValueParameter<IntValue>(UpdateCounterParameterName,
+                                                    "The value which counts how many times the operator was called since the last update",
+                                                    new IntValue(0)));
+        UpdateCounterParameter.Hidden = true;
+      }
+    }
+
+    #region IStatefulItem members
+    public override void InitializeState() {
+      base.InitializeState();
+      UpdateCounter.Value = 0;
+    }
+
+    public override void ClearState() {
+      base.ClearState();
+      UpdateCounter.Value = 0;
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      UpdateCounter.Value++;
+      // the analyzer runs periodically, every 'updateInterval' times
+      if (UpdateCounter.Value == UpdateInterval.Value) {
+        UpdateCounter.Value = 0; // reset counter
+
+        var gScope = ExecutionContext.Scope;
+        while (gScope.Parent != null) gScope = gScope.Parent;
+
+        GenealogyGraph _graph;
+        if (!Results.ContainsKey(PopulationGraphResultParameterName)) {
+          _graph = new GenealogyGraph();
+          Results.Add(new Result(PopulationGraphResultParameterName, PopulationGraphResultParameterDescription, _graph));
+        } else {
+          _graph = (GenealogyGraph)Results[PopulationGraphResultParameterName].Value;
+        }
+
+        var treeQualities = (from s in gScope.SubScopes
+                             let tree = (SymbolicExpressionTree)s.Variables["SymbolicExpressionTree"].Value
+                             let quality = (DoubleValue)s.Variables["Quality"].Value
+                             orderby quality.Value descending
+                             select new Tuple<ISymbolicExpressionTree, DoubleValue>(tree, quality)).ToList();
+        // add all individuals to the evolutionary graph
+        for (int i = 0; i != treeQualities.Count; ++i) {
+          var tree = treeQualities[i].Item1;
+          var quality = treeQualities[i].Item2;
+          if (!_graph.HasNode(tree)) {
+            _graph.AddNode(tree, quality.Value, (Generations.Value * treeQualities.Count + i + 1).ToString(CultureInfo.InvariantCulture));
+          } else {
+            _graph.GetNode(tree).Label += "\\n" + (Generations.Value * treeQualities.Count + i + 1).ToString(CultureInfo.InvariantCulture);
+          }
+
+          if (GlobalTraceMap == null || !GlobalTraceMap.ContainsKey(tree))
+            continue;
+          // get number of parents and adjust label (2 parents => crossover, 1 parent => mutation)
+          var parents = GlobalTraceMap[tree];
+          string label = (parents.Count == 2) ? "c" : "m";
+          foreach (var parent in parents) {
+            _graph.AddArc(parent, tree, label);
+          }
+        }
+        if (GlobalTraceMap != null)
+          GlobalTraceMap.Clear();
+
+        // mark elites
+        for (int i = 0; i != Elites.Value; ++i)
+          _graph.GetNode(treeQualities[i].Item1).IsElite = true;
+
+        // if we've reached the end of the run
+        if (Generations.Value == MaximumGenerations.Value ||
+           (SelectionPressureParameter != null && SelectionPressure.Value >= MaximumSelectionPressure.Value)) {
+
+          var path = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
+
+          // write whole graph to a dot file
+          WriteDot(path + @"\lineage.dot", _graph);
+
+          // get genealogy of the best solution
+          var bestSolution = treeQualities.First().Item1;
+          var genealogy = _graph.GetNode(bestSolution).Genealogy();
+          WriteDot(path + @"\bestlineage.dot", genealogy);
+
+          // trim the graph
+          // exclude the individuals of the last generation
+          var individuals = _graph.Keys.Except(treeQualities.Select(x => x.Item1)).ToList();
+          bool done = false;
+          while (!done) {
+            done = true;
+            foreach (var ind in individuals) {
+              // if node has no outgoing connections (absence of offspring), remove it from the graph
+              var node = _graph.GetNode(ind);
+              if (node == null) continue;
+              if (node.OutEdges == null) {
+                done = false; // we still have "dead" nodes
+                _graph.RemoveNode(ind);
+              }
+            }
+          }
+          WriteDot(path + @"\trimmedlineage.dot", _graph);
+        }
+      }
+      return base.Apply();
+    }
+
+    private static void WriteDot(string path, GenealogyGraph graph) {
+      using (var file = new System.IO.StreamWriter(path)) {
+        string nl = Environment.NewLine;
+        file.WriteLine("digraph \"lineage " + graph.AverageDegree.ToString() + "\" {" + nl +
+                       "ratio=auto;" + nl +
+                       "mincross=2.0");
+        file.WriteLine("\tnode [shape=circle,label=\"\",style=filled]");
+
+        foreach (var node in graph.Values) {
+          var quality = node.Quality;
+          string fillColor = String.Format("#{0:x2}{1:x2}{2:x2}", (int)(255 - 255 * quality), (int)(255 * quality), (int)(100 * quality));
+          if (node.IsElite)
+            fillColor = String.Format("#{0:x2}{1:x2}{2:x2}", (int)(255 - 255 * quality), (int)(255 * quality), (int)(255 * quality));
+          file.WriteLine("\t\"" + node.Id + "\" [fillcolor=\"" + fillColor + "\",label=\"" + node.Label + "\"];");
+          if (node.InEdges == null)
+            continue;
+          foreach (var edge in node.InEdges)
+            file.WriteLine("\t\"" + edge.Target.Id + "\" -> \"" + node.Id + "\" [arrowsize=.5, color=\"" + fillColor + "\"];");
+        }
+        file.WriteLine("}");
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/GenealogyGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/GenealogyGraph.cs	(revision 7479)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/GenealogyGraph.cs	(revision 7479)
@@ -0,0 +1,233 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.EvolutionaryTracking {
+  public class GenealogyGraph : NamedItem {
+    private readonly Dictionary<ISymbolicExpressionTree, Node> _dictionary;
+    public GenealogyGraph() {
+      _dictionary = new Dictionary<ISymbolicExpressionTree, Node>();
+    }
+
+    public GenealogyGraph(GenealogyGraph g) {
+      _dictionary = new Dictionary<ISymbolicExpressionTree, Node>(g._dictionary);
+    }
+
+    [StorableConstructor]
+    private GenealogyGraph(bool serializing) : base(serializing) { }
+
+    private GenealogyGraph(GenealogyGraph original, Cloner cloner)
+      : base(original, cloner) {
+      _dictionary = new Dictionary<ISymbolicExpressionTree, Node>(original._dictionary);
+    }
+
+    public bool HasNode(ISymbolicExpressionTree t) {
+      return _dictionary.ContainsKey(t);
+    }
+
+    public Node GetNode(ISymbolicExpressionTree t) {
+      return this.HasNode(t) ? _dictionary[t] : null;
+    }
+
+    public IEnumerable<ISymbolicExpressionTree> Keys {
+      get { return _dictionary.Keys; }
+    }
+
+    public IEnumerable<Node> Values {
+      get { return _dictionary.Values; }
+    }
+
+    public bool Any() {
+      return _dictionary.Any();
+    }
+
+    public bool Any(Func<KeyValuePair<ISymbolicExpressionTree, Node>, bool> predicate) {
+      return _dictionary.Any(predicate);
+    }
+
+    public void Clear() {
+      _dictionary.Clear();
+    }
+
+    /// <summary>
+    /// Adds a node representing an individual
+    /// </summary>
+    /// <param name="t">The symbolic expression tree</param>
+    public void AddNode(ISymbolicExpressionTree t, double q = 0.0, string l = "", bool elite = false) {
+      if (HasNode(t)) return;
+      _dictionary[t] = new Node { Data = t, Quality = q, Label = l, IsElite = elite };
+    }
+
+    /// <summary>
+    ///  more of a low level method to minimize memory usage when creating and returning subgraphs
+    /// </summary>
+    /// <param name="n"></param>
+    public void AddNode(Node n) {
+      var t = (ISymbolicExpressionTree)n.Data;
+      if (HasNode(t))
+        return;
+      _dictionary[t] = n;
+    }
+
+    /// <summary>
+    /// Remove a node from the graph along with edges associated with it
+    /// </summary>
+    /// <param name="t">The graph node</param>
+    public void RemoveNode(ISymbolicExpressionTree t) {
+      if (!_dictionary.ContainsKey(t))
+        return;
+      Node n = _dictionary[t];
+      if (n.InEdges != null) {
+        foreach (var e in n.InEdges.Where(e => e.Target.OutEdges != null)) {
+          e.Target.OutEdges.RemoveAll(arc => arc.Target == n);
+          if (!e.Target.OutEdges.Any())
+            e.Target.OutEdges = null; // set to null to be a little more memory efficient
+        }
+        n.InEdges = null;
+      }
+      if (n.OutEdges != null) {
+        foreach (var e in n.OutEdges.Where(e => e.Target.InEdges != null)) {
+          e.Target.InEdges.RemoveAll(arc => arc.Target == n);
+          if (!e.Target.OutEdges.Any())
+            e.Target.InEdges = null; // set to null to be a little more memory efficient
+        }
+        n.OutEdges = null;
+      }
+      _dictionary.Remove(t);
+    }
+
+    public double AverageDegree {
+      get { return Values.Average(x => x.Degree); }
+    }
+
+    /// <summary>
+    /// Adds a graph arc from a to b
+    /// </summary>
+    /// <param name="a"></param>
+    /// <param name="b"></param>
+    /// <param name="label"></param>
+    public void AddArc(ISymbolicExpressionTree a, ISymbolicExpressionTree b, string label) {
+      Node src, dest;
+      if (!HasNode(a)) {
+        src = new Node { Data = a };
+        _dictionary[a] = src;
+      } else {
+        src = _dictionary[a];
+      }
+      if (!HasNode(b)) {
+        dest = new Node { Data = b };
+        _dictionary[b] = dest;
+      } else {
+        dest = _dictionary[b];
+      }
+      // add forward and reverse arcs
+      src.AddForwardArc(dest, label);
+      dest.AddReverseArc(src, label);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GenealogyGraph(this, cloner);
+    }
+
+    public override string ItemName {
+      get { return "GenealogyGraph"; }
+    }
+
+    public override string ItemDescription {
+      get { return "A graph describing the genealogies of all the individuals"; }
+    }
+
+    public new Version ItemVersion {
+      get { return new Version(3, 3, 6); }
+    }
+
+    public new Image ItemImage {
+      get { return Common.Resources.VSImageLibrary.Graph; }
+    }
+  }
+
+  public class Node {
+    public string Id { get; private set; }
+    public string Label { get; set; }
+    public bool IsElite { get; set; }
+    public List<Arc> InEdges { get; set; }
+    public List<Arc> OutEdges { get; set; }
+    public object Data { get; set; }
+    public double Quality { get; set; }
+
+    public int Degree {
+      get { return (InEdges == null ? 0 : InEdges.Count) + (OutEdges == null ? 0 : OutEdges.Count); }
+    }
+
+    public Node() {
+      Id = Guid.NewGuid().ToString();
+    }
+
+    /// <summary>
+    /// Returns a genealogical graph rooted in the current node, containing all ancestry information
+    /// </summary>
+    /// <returns></returns>
+    public GenealogyGraph Genealogy() {
+      var graph = new GenealogyGraph();
+      graph.AddNode(this);
+      foreach (var node in this.Ancestors())
+        graph.AddNode(node);
+      return graph;
+    }
+
+    /// <summary>
+    /// Returns an enumerable of all the ancestors of the current node
+    /// </summary>
+    /// <returns></returns>
+    public IEnumerable<Node> Ancestors() {
+      var nodes = new HashSet<Node> { this };
+      int offset = 0;
+      int c0 = 1;
+      while (offset != c0) {
+        int c1 = c0;
+        for (int i = offset; i != c1; ++i) {
+          if (nodes.ElementAt(i).InEdges == null) continue;
+          foreach (var p in nodes.ElementAt(i).InEdges.Select(e => e.Target)) {
+            nodes.Add(p);
+            yield return p;
+          }
+        }
+        offset = c1;
+        c0 = nodes.Count;
+      }
+    }
+
+    public void AddForwardArc(Node target, string label) {
+      var e = new Arc { Target = target, Label = label };
+      if (OutEdges == null)
+        OutEdges = new List<Arc> { e };
+      else
+        OutEdges.Add(e);
+    }
+
+    public void AddReverseArc(Node target, string label) {
+      var e = new Arc { Target = target, Label = label };
+      if (InEdges == null)
+        InEdges = new List<Arc> { e };
+      else
+        InEdges.Add(e);
+    }
+  }
+
+  /// <summary>
+  /// An arc is an edge along with an orientation
+  /// </summary>
+  public class Arc {
+    public Node Target { get; set; }
+    public string Label { get; set; }
+    public double Weight { get; set; }
+    // other attributes
+  }
+
+  // an edge can be represented as a tuple<Node, Node> TODO: figure it out (might be useful for easier querying)
+}
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/GenealogyGraphView.Designer.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/GenealogyGraphView.Designer.cs	(revision 7479)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/GenealogyGraphView.Designer.cs	(revision 7479)
@@ -0,0 +1,33 @@
+﻿
+namespace HeuristicLab.EvolutionaryTracking {
+  partial class GenealogyGraphView {
+    /// <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)) {
+        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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/GenealogyGraphView.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/GenealogyGraphView.cs	(revision 7479)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/GenealogyGraphView.cs	(revision 7479)
@@ -0,0 +1,109 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Drawing.Imaging;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using Microsoft.Glee.Drawing;
+using Microsoft.Glee.GraphViewerGdi;
+
+namespace HeuristicLab.EvolutionaryTracking {
+  [View("GenealogyGraphView")]
+  [Content(typeof(GenealogyGraph), IsDefaultView = true)]
+  public sealed partial class GenealogyGraphView : ItemView {
+    private readonly GViewer _gViewer;
+
+    public new GenealogyGraph Content {
+      get { return (GenealogyGraph)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public GenealogyGraphView()
+      : base() {
+      InitializeComponent();
+      _gViewer = new GViewer() { Dock = DockStyle.Fill };
+      this.Controls.Add(_gViewer);
+    }
+
+    protected override void DeregisterContentEvents() {
+      // TODO: Deregister your event handlers here
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // TODO: Register your event handlers here
+    }
+
+    #region Event Handlers (Content)
+    // TODO: Put event handlers of the content here
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        // TODO: Add code when content has been changed and is null
+      } else {
+        // TODO: Add code when content has been changed and is not null
+        if (InvokeRequired) {
+          Invoke(new EventHandler(Content_GraphChanged), this, null);
+        } else {
+          SetEnabledStateOfControls();
+          Content_GraphChanged(this, null);
+        }
+      }
+    }
+
+    private void Content_GraphChanged(object sender, EventArgs e) {
+      var graph = Content;
+      var nodes = graph.Values;
+      var gleeGraph = new Microsoft.Glee.Drawing.Graph("PopulationGraph") {
+        GraphAttr = {
+          Backgroundcolor = Microsoft.Glee.Drawing.Color.White,
+          NodeAttr = { Shape = Shape.Circle, Label = String.Empty, Padding = 40 },
+          AspectRatio = 2
+        }
+      };
+
+      foreach (var node in nodes) {
+        var n = gleeGraph.AddNode(node.Id); // Glee does not actually add a new node if the node already exists in the graph
+        n.Attr.Fillcolor = new Microsoft.Glee.Drawing.Color((byte)((1 - node.Quality) * 255), (byte)(255 * node.Quality), 0);
+        n.Attr.Color = new Microsoft.Glee.Drawing.Color((byte)((1 - node.Quality) * 255), (byte)(255 * node.Quality), 0);
+        n.Attr.Label = node.Label;
+        n.Attr.Fontsize = 8;
+        n.Attr.FontName = "Consolas";
+        if (node.IsElite) {
+          n.Attr.Color = Microsoft.Glee.Drawing.Color.DodgerBlue;
+          n.Attr.Shape = Shape.Box;
+        }
+
+        if (node.OutEdges == null) continue;
+        foreach (var arc in node.OutEdges) {
+          var edge = gleeGraph.AddEdge(node.Id, arc.Target.Id);
+          edge.Attr.LineWidth = 1;
+          byte r = (byte)((edge.SourceNode.Attr.Color.R + edge.TargetNode.Attr.Color.R) / 2);
+          byte g = (byte)((edge.SourceNode.Attr.Color.G + edge.TargetNode.Attr.Color.G) / 2);
+          byte b = (byte)((edge.SourceNode.Attr.Color.B + edge.TargetNode.Attr.Color.B) / 2);
+          edge.Attr.Color = new Microsoft.Glee.Drawing.Color(r, g, b);
+        }
+      }
+      _gViewer.Graph = gleeGraph;
+      _gViewer.Refresh();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // TODO: Enable or disable controls based on whether the content is null or the view is set readonly
+    }
+
+    #region Event Handlers (child controls)
+    // TODO: Put event handlers of child controls here.
+    #endregion
+  }
+
+}
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/HeuristicLab.EvolutionaryTracking-3.4.csproj
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/HeuristicLab.EvolutionaryTracking-3.4.csproj	(revision 7479)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/HeuristicLab.EvolutionaryTracking-3.4.csproj	(revision 7479)
@@ -0,0 +1,124 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.EvolutionaryTracking</RootNamespace>
+    <AssemblyName>HeuristicLab.EvolutionaryTracking-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="Microsoft.GLEE">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\Microsoft Research\GLEE\bin\Microsoft.GLEE.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.GLEE.Drawing">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\Microsoft Research\GLEE\bin\Microsoft.GLEE.Drawing.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.GLEE.GraphViewerGDI">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\Microsoft Research\GLEE\bin\Microsoft.GLEE.GraphViewerGDI.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Analyzers\SymbolicExpressionTreeGenealogyAnalyzer.cs" />
+    <Compile Include="GenealogyGraph.cs" />
+    <Compile Include="GenealogyGraphView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="GenealogyGraphView.Designer.cs">
+      <DependentUpon>GenealogyGraphView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Interfaces\" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding\3.4\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj">
+      <Project>{06D4A186-9319-48A0-BADE-A2058D462EEA}</Project>
+      <Name>HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <WCFMetadata Include="Service References\" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/HeuristicLab.EvolutionaryTracking-3.4.csproj.user
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/HeuristicLab.EvolutionaryTracking-3.4.csproj.user	(revision 7479)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/HeuristicLab.EvolutionaryTracking-3.4.csproj.user	(revision 7479)
@@ -0,0 +1,6 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectView>ShowAllFiles</ProjectView>
+  </PropertyGroup>
+</Project>
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Plugin.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Plugin.cs	(revision 7479)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Plugin.cs	(revision 7479)
@@ -0,0 +1,41 @@
+#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;
+using System.Collections.Generic;
+using System.Text;
+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")]
+  [PluginFile("HeuristicLab.EvolutionaryTracking-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.4")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  public class HeuristicLabEvolutionaryTrackingPlugin : PluginBase {
+  }
+}
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Plugin.cs.frame	(revision 7479)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Plugin.cs.frame	(revision 7479)
@@ -0,0 +1,41 @@
+#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;
+using System.Collections.Generic;
+using System.Text;
+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")]
+  [PluginFile("HeuristicLab.EvolutionaryTracking-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.4")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  public class HeuristicLabEvolutionaryTrackingPlugin : PluginBase {
+  }
+}
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Properties/AssemblyInfo.cs
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Properties/AssemblyInfo.cs	(revision 7479)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Properties/AssemblyInfo.cs	(revision 7479)
@@ -0,0 +1,36 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.EvolutionaryTracking")]
+[assembly: AssemblyDescription("Provides operators and related classes for tracking the evolution within a GA.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("410e1c1e-c991-49cd-843d-35a741927e4d")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.2.7280")]
Index: /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Tracking.sln
===================================================================
--- /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Tracking.sln	(revision 7478)
+++ /branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Tracking.sln	(revision 7479)
@@ -10,10 +10,16 @@
 	EndProjectSection
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Selection-3.3", "HeuristicLab.Selection\3.3\HeuristicLab.Selection-3.3.csproj", "{2C36CD4F-E5F5-43A4-801A-201EA895FE17}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.EvolutionaryTracking-3.4", "HeuristicLab.EvolutionaryTracking\3.4\HeuristicLab.EvolutionaryTracking-3.4.csproj", "{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed Platforms = Debug|Mixed Platforms
 		Debug|x64 = Debug|x64
 		Debug|x86 = Debug|x86
 		Release|Any CPU = Release|Any CPU
+		Release|Mixed Platforms = Release|Mixed Platforms
 		Release|x64 = Release|x64
 		Release|x86 = Release|x86
@@ -22,4 +28,6 @@
 		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Debug|Mixed Platforms.Build.0 = Debug|x86
 		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Debug|x64.ActiveCfg = Debug|x64
 		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Debug|x64.Build.0 = Debug|x64
@@ -28,8 +36,38 @@
 		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Release|Mixed Platforms.ActiveCfg = Release|x86
+		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Release|Mixed Platforms.Build.0 = Release|x86
 		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Release|x64.ActiveCfg = Release|x64
 		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Release|x64.Build.0 = Release|x64
 		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Release|x86.ActiveCfg = Release|x86
 		{06D4A186-9319-48A0-BADE-A2058D462EEA}.Release|x86.Build.0 = Release|x86
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Debug|Mixed Platforms.Build.0 = Debug|x64
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Debug|x64.ActiveCfg = Debug|x64
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Debug|x64.Build.0 = Debug|x64
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Debug|x86.ActiveCfg = Debug|x86
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Debug|x86.Build.0 = Debug|x86
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Release|Mixed Platforms.Build.0 = Release|x64
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Release|x64.ActiveCfg = Release|x64
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Release|x64.Build.0 = Release|x64
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Release|x86.ActiveCfg = Release|x86
+		{2C36CD4F-E5F5-43A4-801A-201EA895FE17}.Release|x86.Build.0 = Release|x86
+		{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}.Release|x64.ActiveCfg = Release|Any CPU
+		{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}.Release|x86.ActiveCfg = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
