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 SymbolicDataAnalysisExpressionAfterManipulatorOperator : AfterManipulatorOperator { private readonly SymbolicExpressionTreeNodeSimilarityComparer comparer; public SymbolicDataAnalysisExpressionAfterManipulatorOperator() { comparer = new SymbolicExpressionTreeNodeSimilarityComparer { MatchVariableNames = true, MatchVariableWeights = true, MatchConstantValues = true }; } public override IOperation Apply() { var vChild = (IGenealogyGraphNode)GenealogyGraph[ChildParameter.ActualValue]; var nodesBefore = (List)vChild.InArcs.First().Data; var nodesAfter = ChildParameter.ActualValue.IterateNodesPrefix().ToList(); IFragment fragment = null; for (int i = 0; i < Math.Min(nodesAfter.Count, nodesBefore.Count); ++i) { var a = nodesAfter[i]; var b = nodesBefore[i]; if (ReferenceEquals(a, b) && comparer.Equals(a, b)) continue; fragment = new Fragment { Root = a, Index1 = i }; } vChild.InArcs.First().Data = fragment; return base.Apply(); } } }