using System; using System.Collections.Generic; using System.Linq; using HeuristicLab.Core; using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; using HeuristicLab.EvolutionTracking; namespace HeuristicLab.Problems.DataAnalysis.Symbolic { public class SymbolicDataAnalysisExpressionAfterCrossoverOperator : AfterCrossoverOperator { public override IOperation Apply() { var childVertex = GenealogyGraph[ChildParameter.ActualValue].Last(); var arc0 = (IGenealogyGraphArc)childVertex.InArcs[0]; var arc1 = (IGenealogyGraphArc)childVertex.InArcs[1]; var nodes0 = (List)arc0.Data; var nodes1 = (List)arc1.Data; var childNodes = ChildParameter.ActualValue.IterateNodesBreadth().ToList(); IFragment fragment = null; for (int i = 0; i < Math.Min(nodes0.Count, childNodes.Count); ++i) { if (nodes0[i] == childNodes[i]) continue; fragment = new Fragment { Root = childNodes[i], Index = i }; } if (fragment == null) throw new Exception("Could not determine fragment!"); for (int i = 0; i < nodes1.Count; ++i) { if (nodes1[i] != fragment.Root) continue; fragment.OldIndex = i; } arc0.Data = null; arc1.Data = fragment; return base.Apply(); } } }