Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/BrokenInteritanceSchemaAnalyzer.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/BrokenInteritanceSchemaAnalyzer.cs	(revision 8216)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/BrokenInteritanceSchemaAnalyzer.cs	(revision 8216)
@@ -0,0 +1,115 @@
+﻿#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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior {
+
+  /// <summary>
+  /// An operator that analyzes broken inheritance of building blocks.
+  /// </summary>
+  [Item("BrokenInteritanceSchemaAnalyzer", "An operator that analyzes broken inheritance of building blocks.")]
+  [StorableClass]
+  public sealed class BrokenInteritanceSchemaAnalyzer : SingleSuccessorOperator, IAnalyzer {
+    private const string ResultsParameterName = "Results";
+    private const string PopulationGraphResultParameterName = "PopulationGraph";
+    private const string SchemataParameterName = "Schemata";
+    private const string BrokenInteritanceSchemaOccurrenceName = "BrokenInteritanceSchemaOccurrenceMatrix";
+
+    #region IAnalyzer Members
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+    #endregion
+
+    #region Parameter properties
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
+    }
+    #endregion
+
+    #region Properties
+    public ResultCollection Results {
+      get { return ResultsParameter.ActualValue; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private BrokenInteritanceSchemaAnalyzer(bool deserializing) : base(deserializing) { }
+    private BrokenInteritanceSchemaAnalyzer(BrokenInteritanceSchemaAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public BrokenInteritanceSchemaAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The results collection where the analysis values should are stored."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BrokenInteritanceSchemaAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var graph = (GenealogyGraph<Permutation>)Results[PopulationGraphResultParameterName].Value;
+      var schemata = (ItemArray<IntArray>)Results[SchemataParameterName].Value;
+      var generationZero = graph.Values.Where(x => x.Rank == 0);
+
+      var brokenInteritanceSchemaOccurrenceMatrix = new StringMatrix(schemata.Count(), generationZero.Count());
+      IList<string> brokenRowNames = new List<string>();
+      IList<string> brokenColumnNames = new List<string>();
+      for (int i = 0; i < schemata.Count(); i++) {
+        var schema = schemata[i];
+        brokenRowNames.Add(new Permutation(PermutationTypes.RelativeUndirected, schema).ToString());
+        for (int j = 0; j < generationZero.Count(); j++) {
+          var individual = generationZero.ElementAt(j);
+          if (i == 0) brokenColumnNames.Add(((Permutation)individual.Data).ToString());
+          brokenInteritanceSchemaOccurrenceMatrix[i, j] = CalculateBrokenInheritanceOccurrences(schema, individual).ToString();
+        }
+      }
+      brokenInteritanceSchemaOccurrenceMatrix.RowNames = brokenRowNames;
+      brokenInteritanceSchemaOccurrenceMatrix.ColumnNames = brokenColumnNames;
+      Results.Add(new Result(BrokenInteritanceSchemaOccurrenceName, brokenInteritanceSchemaOccurrenceMatrix));
+
+      return base.Apply();
+    }
+
+    private int CalculateBrokenInheritanceOccurrences(IntArray schema, GenealogyGraphNode individual) {
+      var filteredDescendants = individual.Descendants().Where(x => IsMatch(schema, ((Permutation)x.Data).ToArray()));
+      return filteredDescendants.Any() ? (int)filteredDescendants.Max(x => x.Rank) : 0;
+    }
+
+    // attention: brute force matching
+    // should be replaced with KMP, BM or RK
+    private bool IsMatch(IntArray pattern, int[] tour) {
+      bool match = false;
+      for (int i = 0; i <= tour.Length - pattern.Length && !match; i++) {
+        for (int j = 0; j < pattern.Length && (match = pattern[j] == tour[i + j] || pattern[j] == -1); j++) ;
+      }
+      return match;
+    }
+  }
+}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/BuildingBlockAnalyzer.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/BuildingBlockAnalyzer.cs	(revision 8215)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/BuildingBlockAnalyzer.cs	(revision 8216)
@@ -29,4 +29,5 @@
 
 namespace HeuristicLab.Analysis.AlgorithmBehavior {
+  using System;
   using System.Collections.Generic;
   using HeuristicLab.Data;
@@ -37,5 +38,5 @@
   /// An operator that analyzes building blocks.
   /// </summary>
-  [Item("BuildingBlockAnalyzer", "An operator that tracks the genealogy of every individual.")]
+  [Item("BuildingBlockAnalyzer", "An operator that analyzes building blocks.")]
   [StorableClass]
   public sealed class BuildingBlockAnalyzer : SingleSuccessorOperator, IAnalyzer {
@@ -44,4 +45,6 @@
     private const string PopulationGraphResultParameterName = "PopulationGraph";
     private const string BuildingBlockSchemaMatrixParameterName = "BuildingBlockSchemaMatrix";
+    private const string BrokenInteritanceSchemaOccurrenceName = "BrokenInteritanceSchemaOccurrenceMatrix";
+    private const string UnbrokenInteritanceSchemaOccurrenceName = "UnbrokenInteritanceSchemaOccurrence";
     private const string BuildingBlockPatternMatrixParameterName = "BuildingBlockPatternMatrix";
 
@@ -100,6 +103,6 @@
             var categories = new int[3];
             categories[0] = ExploreGlobalSchemaOccurrence(graph, schema);
-            categories[1] = ExploreBrokenInteritanceSchemaOccurrence(graph, schema);
-            categories[2] = ExploreUnbrokenInteritanceSchemaOccurrence(graph, schema);
+            categories[1] = -1;
+            categories[2] = -1;
             schemataMatrix.Add(schema, categories);
           }
@@ -109,18 +112,60 @@
       // order schemas according to their global occurrence count
       var sortedSchemataMatrix = schemataMatrix.OrderByDescending(x => x.Value[0]).ToDictionary(x => x.Key, x => x.Value);
-
-      var stringMatrix = new StringMatrix(sortedSchemataMatrix.Keys.Count, 4);
+      IList<string> rowNames = new List<string>();
+      var schemataStringMatrix = new StringMatrix(sortedSchemataMatrix.Keys.Count, 3);
       for (int i = 0; i < sortedSchemataMatrix.Keys.Count; i++) {
         var element = sortedSchemataMatrix.ElementAt(i);
-        stringMatrix[i, 0] = new Permutation(PermutationTypes.RelativeUndirected, element.Key).ToString();
+        rowNames.Add(new Permutation(PermutationTypes.RelativeUndirected, element.Key).ToString());
         for (int j = 0; j < element.Value.Count(); j++) {
-          stringMatrix[i, j + 1] = element.Value[j].ToString();
-        }
-      }
-      stringMatrix.ColumnNames = new[] { "Schema", "GlobalSchemaOccurrence", "BrokenInteritanceSchemaOccurrence", "UnbrokenInteritanceSchemaOccurrence" };
-
-      Results.Add(new Result(BuildingBlockSchemaMatrixParameterName, stringMatrix));
+          schemataStringMatrix[i, j] = element.Value[j].ToString();
+        }
+      }
+      schemataStringMatrix.RowNames = rowNames;
+      schemataStringMatrix.ColumnNames = new[] { "GlobalSchemaOccurrence", "<unused>", "<unused>" };
+      Results.Add(new Result(BuildingBlockSchemaMatrixParameterName, schemataStringMatrix));
+
+      var brokenInteritanceSchemaOccurrenceMatrix = new StringMatrix(sortedSchemataMatrix.Keys.Count, generationZero.Count());
+      IList<string> brokenRowNames = new List<string>();
+      IList<string> brokenColumnNames = new List<string>();
+      for (int i = 0; i < sortedSchemataMatrix.Keys.Count; i++) {
+        var entry = sortedSchemataMatrix.ElementAt(i);
+        brokenRowNames.Add(new Permutation(PermutationTypes.RelativeUndirected, entry.Key).ToString());
+        for (int j = 0; j < generationZero.Count(); j++) {
+          var individual = generationZero.ElementAt(j);
+          if (i == 0) brokenColumnNames.Add(((Permutation)individual.Data).ToString());
+          brokenInteritanceSchemaOccurrenceMatrix[i, j] = CalculateBrokenInheritanceOccurrences(entry.Key, individual).ToString();
+        }
+      }
+      brokenInteritanceSchemaOccurrenceMatrix.RowNames = brokenRowNames;
+      brokenInteritanceSchemaOccurrenceMatrix.ColumnNames = brokenColumnNames;
+      Results.Add(new Result(BrokenInteritanceSchemaOccurrenceName, brokenInteritanceSchemaOccurrenceMatrix));
+
+      var unbrokenInteritanceSchemaOccurrenceMatrix = new StringMatrix(sortedSchemataMatrix.Keys.Count, generationZero.Count());
+      IList<string> unbrokenRowNames = new List<string>();
+      IList<string> unbrokenColumnNames = new List<string>();
+      for (int i = 0; i < sortedSchemataMatrix.Keys.Count; i++) {
+        var entry = sortedSchemataMatrix.ElementAt(i);
+        unbrokenRowNames.Add(new Permutation(PermutationTypes.RelativeUndirected, entry.Key).ToString());
+        for (int j = 0; j < generationZero.Count(); j++) {
+          var individual = generationZero.ElementAt(j);
+          if (i == 0) unbrokenColumnNames.Add(((Permutation)individual.Data).ToString());
+          unbrokenInteritanceSchemaOccurrenceMatrix[i, j] = CalculateUnbrokenInheritanceOccurrences(entry.Key, individual).ToString();
+        }
+      }
+      unbrokenInteritanceSchemaOccurrenceMatrix.RowNames = unbrokenRowNames;
+      unbrokenInteritanceSchemaOccurrenceMatrix.ColumnNames = brokenColumnNames;
+      Results.Add(new Result(UnbrokenInteritanceSchemaOccurrenceName, unbrokenInteritanceSchemaOccurrenceMatrix));
 
       return base.Apply();
+    }
+
+    private int CalculateBrokenInheritanceOccurrences(int[] schema, GenealogyGraphNode individual) {
+      // TODO
+      return -1;
+    }
+
+    private int CalculateUnbrokenInheritanceOccurrences(int[] schema, GenealogyGraphNode individual) {
+      var filteredDescendants = individual.Descendants().Where(x => IsMatch(schema, ((Permutation)x.Data).ToArray()));
+      return filteredDescendants.Any() ? (int)filteredDescendants.Max(x => x.Rank) : 0;
     }
 
@@ -130,14 +175,4 @@
         if (IsSubtour(schema, (Permutation)individual.Data)) occurrences++;
       return occurrences;
-    }
-
-    private int ExploreBrokenInteritanceSchemaOccurrence(GenealogyGraph<Permutation> graph, int[] schema) {
-      // TODO
-      return 0;
-    }
-
-    private int ExploreUnbrokenInteritanceSchemaOccurrence(GenealogyGraph<Permutation> graph, int[] schema) {
-      // TODO
-      return 0;
     }
 
@@ -171,4 +206,38 @@
     }
 
+    // attention: brute force matching
+    // should be replaced with KMP, BM or RK
+    private bool IsMatch(int[] pattern, int[] tour) {
+      bool match = false;
+      for (int i = 0; i <= tour.Length - pattern.Length && !match; i++) {
+        for (int j = 0; j < pattern.Length && (match = pattern[j] == tour[i + j] || pattern[j] == -1); j++) ;
+      }
+      return match;
+    }
+
+    private IList<int[]> GenerateWildcardSchemata(int[] schema) {
+      string formatString = "{0:d" + schema.Length + "}";
+      var combs = new List<bool[]>();
+      string comb = string.Empty;
+
+      // create all desired wildcard combinations
+      int i = 0;
+      int wildcardCount = 0; // first wildcard combination contains no wildcards
+      while (wildcardCount < schema.Length) {
+        if (wildcardCount > schema.Length / 8 && wildcardCount < schema.Length / 2)
+          combs.Add(comb.Select(x => x == '1').ToArray()); // '1' becomes true which indicates a wildcard
+        wildcardCount = (comb = string.Format(formatString, Convert.ToString(++i, 2))).Count(x => x == '1');
+      }
+
+      // create all desired wildcard instances
+      var wildcardSchemata = new List<int[]>();
+      foreach (var c in combs) {
+        wildcardSchemata.Add(schema.Select((x, index) => c[index] ? -1 : x).ToArray()); // -1 is a wildcard in the schema
+      }
+
+      return wildcardSchemata;
+    }
+
+
     private class SchemaEqualityComparer : EqualityComparer<int[]> {
       public override bool Equals(int[] x, int[] y) {
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/GenealogyAnalyzer.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/GenealogyAnalyzer.cs	(revision 8215)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/GenealogyAnalyzer.cs	(revision 8216)
@@ -202,5 +202,5 @@
           foreach (var parent in parents) {
             if (GlobalTraceMap.ContainsKey(parent)) {
-              // handle cycle
+              // handle mutation
               double quality = Evaluate(parent);
               var node = new GenealogyGraphNode(parent) { Quality = quality, Label = label, Rank = generation - 0.5 };
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/SchemaAnalyzer.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/SchemaAnalyzer.cs	(revision 8216)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/SchemaAnalyzer.cs	(revision 8216)
@@ -0,0 +1,179 @@
+﻿#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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior {
+  using System.Collections.Generic;
+  using HeuristicLab.Data;
+  using HeuristicLab.Encodings.PermutationEncoding;
+  using TraceMapType = HeuristicLab.Core.ItemDictionary<HeuristicLab.Core.IItem, HeuristicLab.Core.IItemList<HeuristicLab.Core.IItem>>;
+
+  /// <summary>
+  /// An operator that analyzes schemata.
+  /// </summary>
+  [Item("SchemaAnalyzer", "An operator that analyzes schemata.")]
+  [StorableClass]
+  public sealed class SchemaAnalyzer : SingleSuccessorOperator, IAnalyzer {
+    private const string GlobalTraceMapParameterName = "GlobalTraceMap";
+    private const string ResultsParameterName = "Results";
+    private const string PopulationGraphResultParameterName = "PopulationGraph";
+    private const string SchemaMatrixParameterName = "SchemaMatrix";
+    private const string SchemataParameterName = "Schemata";
+
+    #region IAnalyzer Members
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+    #endregion
+
+    #region Parameter properties
+    public ILookupParameter<TraceMapType> GlobalTraceMapParameter {
+      get { return (ILookupParameter<TraceMapType>)Parameters[GlobalTraceMapParameterName]; }
+    }
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
+    }
+    #endregion
+
+    #region Properties
+    public TraceMapType GlobalTraceMap {
+      get { return GlobalTraceMapParameter.ActualValue; }
+    }
+    public ResultCollection Results {
+      get { return ResultsParameter.ActualValue; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private SchemaAnalyzer(bool deserializing) : base(deserializing) { }
+    private SchemaAnalyzer(SchemaAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public SchemaAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<TraceMapType>(GlobalTraceMapParameterName, "A global cache containing the whole genealogy."));
+      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The results collection where the analysis values should are stored."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SchemaAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var graph = (GenealogyGraph<Permutation>)Results[PopulationGraphResultParameterName].Value;
+      var generationZero = graph.Values.Where(x => x.Rank == 0);
+
+      // extract all subtours for each individual in generation zero
+      var subtours = new Dictionary<Permutation, ItemArray<IntArray>>();
+      foreach (var individual in generationZero) {
+        subtours[(Permutation)individual.Data] = ExtractSubtours((Permutation)individual.Data);
+      }
+
+      // process all schemata
+      var schemataMatrix = new Dictionary<IntArray, int>(new SchemaEqualityComparer());
+      foreach (var entry in subtours) {
+        foreach (var schema in entry.Value) {
+          if (!schemataMatrix.ContainsKey(schema)) {
+            schemataMatrix.Add(schema, ExploreGlobalSchemaOccurrence(graph, schema));
+          }
+        }
+      }
+
+      // order schemas according to their global occurrence count
+      var sortedSchemataMatrix = schemataMatrix.OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value);
+      IList<string> rowNames = new List<string>();
+      var schemataStringMatrix = new StringMatrix(sortedSchemataMatrix.Keys.Count, 1);
+      for (int i = 0; i < sortedSchemataMatrix.Keys.Count; i++) {
+        var element = sortedSchemataMatrix.ElementAt(i);
+        rowNames.Add(new Permutation(PermutationTypes.RelativeUndirected, element.Key).ToString());
+        schemataStringMatrix[i, 0] = element.Value.ToString();
+      }
+      schemataStringMatrix.RowNames = rowNames;
+      schemataStringMatrix.ColumnNames = new[] { "GlobalSchemaOccurrence" };
+
+      Results.Add(new Result(SchemataParameterName, new ItemArray<IntArray>(schemataMatrix.Keys)));
+      Results.Add(new Result(SchemaMatrixParameterName, schemataStringMatrix));
+
+      return base.Apply();
+    }
+
+    private int ExploreGlobalSchemaOccurrence(GenealogyGraph<Permutation> graph, IntArray schema) {
+      int occurrences = 0;
+      foreach (var individual in graph.Values)
+        if (IsSubtour(schema, (Permutation)individual.Data)) occurrences++;
+      return occurrences;
+    }
+
+    private ItemArray<IntArray> ExtractSubtours(Permutation permutation) {
+      var subtours = new List<IntArray>();
+      for (int i = 2; i <= permutation.Count() / 2; i++) { // increase schema length from 2 to n/2
+        for (int j = 0; j < permutation.Count(); j++) { // visit all positions in the permutation
+          var schema = new IntArray(i);
+          for (int k = 0; k < i; k++) schema[k] = permutation[(j + k) % permutation.Length]; // copy edge to schema
+          subtours.Add(schema);
+        }
+      }
+      return new ItemArray<IntArray>(subtours);
+    }
+
+    private bool IsSubtour(IntArray tour, Permutation permutation) {
+      // determine starting position for subtour match
+      int idx = permutation.Select((x, index) => new { Value = x, Index = index }).Single(x => x.Value == tour[0]).Index;
+      bool isSubtour = true;
+      for (int i = 1; i < tour.Length; i++) {
+        if (tour[i] == permutation[(idx + 1) % permutation.Length]) { // check right side
+          idx = (idx + 1) % permutation.Length;
+        } else if (tour[i] == permutation[(idx - 1 + permutation.Length) % permutation.Length]) { // check left side
+          idx = (idx - 1 + permutation.Length) % permutation.Length;
+        } else {
+          isSubtour = false;
+          break;
+        }
+      }
+      return isSubtour;
+    }
+
+    private class SchemaEqualityComparer : EqualityComparer<IntArray> {
+      public override bool Equals(IntArray x, IntArray y) {
+        if (object.ReferenceEquals(x, y)) return true;
+        if (x == null || y == null || x.Length != y.Length) return false;
+        bool match = true;
+        for (int i = 0; i < x.Length && match; i++) // check normal tour
+          if (x[i] != y[i]) match = false;
+        if (!match) {
+          match = true;
+          for (int i = x.Length - 1; i >= 0 && match; i--) // check inverse tour
+            if (x[i] != y[i]) match = false;
+        }
+        return match;
+      }
+
+      public override int GetHashCode(IntArray obj) {
+        return 0; // return the same hash code for each object, otherwise Equals will not be called
+      }
+    }
+  }
+}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/HeuristicLab.Analysis.AlgorithmBehavior-3.3.csproj
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/HeuristicLab.Analysis.AlgorithmBehavior-3.3.csproj	(revision 8215)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/HeuristicLab.Analysis.AlgorithmBehavior-3.3.csproj	(revision 8216)
@@ -75,4 +75,6 @@
   <ItemGroup>
     <Compile Include="Analyzers\BuildingBlockAnalyzer.cs" />
+    <Compile Include="Analyzers\BrokenInteritanceSchemaAnalyzer.cs" />
+    <Compile Include="Analyzers\SchemaAnalyzer.cs" />
     <Compile Include="Analyzers\GenealogyAnalyzer.cs" />
     <Compile Include="GenealogyGraph.cs" />
