Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/EvolutionTrackingAnalyzer.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/EvolutionTrackingAnalyzer.cs	(revision 12156)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/EvolutionTrackingAnalyzer.cs	(revision 12163)
@@ -31,10 +31,10 @@
   [Item("EvolutionTrackingAnalyzer", "Base class for analyzers that use the genealogy graph")]
   [StorableClass]
-  public abstract class EvolutionTrackingAnalyzer<T> : SingleSuccessorOperator, IAnalyzer where T : class,IItem {
+  public abstract class EvolutionTrackingAnalyzer : SingleSuccessorOperator, IAnalyzer {
     #region parameter names
     private const string GenerationsParameterName = "Generations";
     private const string ResultsParameterName = "Results";
     private const string PopulationSizeParameterName = "PopulationSize";
-    private const string PopulationGraphResultName = "PopulationGraph";
+    protected const string PopulationGraphResultName = "PopulationGraph";
     #endregion
 
@@ -64,8 +64,8 @@
     public IntValue Generation { get { return GenerationsParameter.ActualValue; } }
     public IntValue PopulationSize { get { return PopulationSizeParameter.ActualValue; } }
-    public IGenealogyGraph<T> PopulationGraph {
+    public IGenealogyGraph PopulationGraph {
       get {
         if (Results.ContainsKey(PopulationGraphResultName))
-          return (IGenealogyGraph<T>)Results[PopulationGraphResultName].Value;
+          return (IGenealogyGraph)Results[PopulationGraphResultName].Value;
         return null;
       }
@@ -79,5 +79,5 @@
 
     protected EvolutionTrackingAnalyzer() {
-      Parameters.Add(new LookupParameter<IGenealogyGraph<T>>(PopulationGraphResultName, "The genealogy graph."));
+      Parameters.Add(new LookupParameter<IGenealogyGraph>(PopulationGraphResultName, "The genealogy graph."));
       Parameters.Add(new LookupParameter<IntValue>(GenerationsParameterName, "The number of generations."));
       Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The results collection."));
@@ -87,5 +87,5 @@
     }
 
-    protected EvolutionTrackingAnalyzer(EvolutionTrackingAnalyzer<T> original, Cloner cloner)
+    protected EvolutionTrackingAnalyzer(EvolutionTrackingAnalyzer original, Cloner cloner)
       : base(original, cloner) {
     }
@@ -94,3 +94,26 @@
     protected EvolutionTrackingAnalyzer(bool deserializing) : base(deserializing) { }
   }
+
+  [Item("EvolutionTrackingAnalyzer", "Base class for analyzers that use the genealogy graph")]
+  [StorableClass]
+  public class EvolutionTrackingAnalyzer<T> : EvolutionTrackingAnalyzer where T : class, IItem {
+    public EvolutionTrackingAnalyzer() { }
+
+    protected EvolutionTrackingAnalyzer(EvolutionTrackingAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvolutionTrackingAnalyzer<T>(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected EvolutionTrackingAnalyzer(bool deserializing) : base(deserializing) { }
+
+    new public IGenealogyGraph<T> PopulationGraph {
+      get {
+        if (Results.ContainsKey(PopulationGraphResultName))
+          return (IGenealogyGraph<T>)Results[PopulationGraphResultName].Value;
+        return null;
+      }
+    }
+  }
 }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/SelectionSchemeAnalyzer.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/SelectionSchemeAnalyzer.cs	(revision 12163)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/SelectionSchemeAnalyzer.cs	(revision 12163)
@@ -0,0 +1,125 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.EvolutionTracking {
+  [Item("SelectionSchemeAnalyzer", "An analyzer which gives information about the relative amount of individuals that get selected each generation")]
+  [StorableClass]
+  public class SelectionSchemeAnalyzer : EvolutionTrackingAnalyzer {
+    private const string StoreHistoryParameterName = "StoreHistory";
+
+    public IFixedValueParameter<BoolValue> StoreHistoryParameter {
+      get { return (IFixedValueParameter<BoolValue>)Parameters[StoreHistoryParameterName]; }
+    }
+
+    public SelectionSchemeAnalyzer() {
+      UpdateCounterParameter.ActualName = "SelectionSchemeAnalyzerUpdateCounter";
+      Parameters.Add(new FixedValueParameter<BoolValue>(StoreHistoryParameterName, new BoolValue(false)));
+    }
+
+    public bool StoreHistory { get { return StoreHistoryParameter.Value.Value; } }
+
+    [StorableConstructor]
+    protected SelectionSchemeAnalyzer(bool deserializing) : base(deserializing) { }
+
+    protected SelectionSchemeAnalyzer(SelectionSchemeAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SelectionSchemeAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      int updateInterval = UpdateIntervalParameter.Value.Value;
+      IntValue updateCounter = UpdateCounterParameter.ActualValue;
+      // if counter does not yet exist then initialize it with update interval
+      // to make sure the solutions are analyzed on the first application of this operator
+      if (updateCounter == null) {
+        updateCounter = new IntValue(updateInterval);
+        UpdateCounterParameter.ActualValue = updateCounter;
+      }
+      //analyze solutions only every 'updateInterval' times
+      if (updateCounter.Value != updateInterval) {
+        updateCounter.Value++;
+        return base.Apply();
+      }
+      updateCounter.Value = 1;
+
+      if (PopulationGraph == null)
+        return base.Apply();
+
+      double selectionRatio = 1;
+
+      if (Generations.Value > 0) {
+        var previousRank = PopulationGraph.GetByRank(Generation.Value - 1);
+        selectionRatio = (double)previousRank.Count(x => x.OutDegree > 0) / PopulationSize.Value;
+      }
+
+      // the selection ratio represents the percentage of the old population that survived to reproduce
+      DataTable table;
+      if (!Results.ContainsKey("SelectionRatio")) {
+        table = new DataTable("Selection ratio");
+        Results.Add(new Result("SelectionRatio", table));
+        var row = new DataRow("Selection ratio") { VisualProperties = { StartIndexZero = true } };
+        row.Values.Add(selectionRatio);
+        table.Rows.Add(row);
+      } else {
+        table = (DataTable)Results["SelectionRatio"].Value;
+        table.Rows["Selection ratio"].Values.Add(selectionRatio);
+      }
+      DataTable contributionCountTable;
+      var contributions = PopulationGraph.GetByRank(Generation.Value - 1).OrderByDescending(x => x.Quality).Select(x => (double)x.OutDegree);
+      if (Results.ContainsKey("ContributionCount")) {
+        contributionCountTable = (DataTable)Results["ContributionCount"].Value;
+
+        var row = contributionCountTable.Rows["Contribution count"];
+        row.Values.Replace(contributions);
+      } else {
+        contributionCountTable = new DataTable("Contribution count");
+        Results.Add(new Result("ContributionCount", contributionCountTable));
+        var row = new DataRow("Contribution count") {
+          VisualProperties = { StartIndexZero = true, ChartType = DataRowVisualProperties.DataRowChartType.Columns }
+        };
+        row.Values.AddRange(contributions);
+        contributionCountTable.Rows.Add(row);
+      }
+
+      if (StoreHistory) {
+        DataTableHistory history;
+        if (Results.ContainsKey("ContributionCountHistory")) {
+          history = (DataTableHistory)Results["ContributionCountHistory"].Value;
+        } else {
+          history = new DataTableHistory();
+          Results.Add(new Result("ContributionCountHistory", history));
+        }
+        history.Add((DataTable)contributionCountTable.Clone());
+      }
+      return base.Apply();
+    }
+  }
+}
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 12156)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/HeuristicLab.EvolutionTracking-3.4.csproj	(revision 12163)
@@ -112,4 +112,5 @@
     <Compile Include="Analyzers\EvolutionTrackingAnalyzer.cs" />
     <Compile Include="Analyzers\GenealogyAnalyzer.cs" />
+    <Compile Include="Analyzers\SelectionSchemeAnalyzer.cs" />
     <Compile Include="Collections\CloneableCollection.cs" />
     <Compile Include="Fragment.cs" />
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 12156)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj	(revision 12163)
@@ -307,4 +307,6 @@
     <Compile Include="Symbols\VariableConditionTreeNode.cs" />
     <Compile Include="Symbols\VariableTreeNode.cs" />
+    <Compile Include="Tracking\Analyzers\SymbolicDataAnalysisFragmentLengthAnalyzer.cs" />
+    <Compile Include="Tracking\Analyzers\SymbolicDataAnalysisTraceOverlapAnalyzer.cs" />
     <Compile Include="Tracking\SymbolicDataAnalysisExpressionAfterCrossoverOperator.cs" />
     <Compile Include="Tracking\SymbolicDataAnalysisExpressionAfterManipulatorOperator.cs" />
