Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/10/12 17:17:14 (13 years ago)
Author:
bburlacu
Message:

#1772: Changelog:

  • Removed GetCutIndex method, and corresponding index field in the GenealogyGraphNode.
  • Implemented tracking for mutated fragments.
  • Improved FindMatch method.
  • Added IterateNodesBreadth functionality to symbolic expression trees and nodes.
  • Added check conditions for clearing global tracking structures so that the 2 analyzers are not mutually exclusive anymore.
Location:
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/TracingSymbolicExpressionTreeCrossover.cs

    r7788 r7792  
    2121
    2222using System;
     23using System.Collections.Generic;
    2324using System.Linq;
    2425using HeuristicLab.Common;
     
    3536  /// A base class for operators that perform a crossover of symbolic expression trees.
    3637  /// </summary>
    37   [Item("SymbolicExpressionTreeCrossover",
    38     "A base class for operators that perform a crossover of symbolic expression trees.")]
     38  [Item("SymbolicExpressionTreeCrossover", "A base class for operators that perform a crossover of symbolic expression trees.")]
    3939  [StorableClass]
    4040  public abstract class TracingSymbolicExpressionTreeCrossover : SymbolicExpressionTreeOperator, ISymbolicExpressionTreeCrossover {
     
    4646
    4747    #region Parameter Properties
    48 
    4948    public ILookupParameter<ItemArray<ISymbolicExpressionTree>> ParentsParameter {
    5049      get { return (ScopeTreeLookupParameter<ISymbolicExpressionTree>)Parameters[ParentsParameterName]; }
    5150    }
    52 
    5351    public ILookupParameter<ISymbolicExpressionTree> ChildParameter {
    5452      get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters[ChildParameterName]; }
    5553    }
    56 
    5754    public LookupParameter<CloneMapType> GlobalCloneMapParameter {
    5855      get { return (LookupParameter<CloneMapType>)Parameters[GlobalCloneMapParameterName]; }
    5956    }
    60 
    6157    public LookupParameter<TraceMapType> GlobalTraceMapParameter {
    6258      get { return (LookupParameter<TraceMapType>)Parameters[GlobalTraceMapParameterName]; }
    6359    }
    64 
    6560    public LookupParameter<CloneMapType> GlobalFragmentMapParameter {
    6661      get { return (LookupParameter<CloneMapType>)Parameters[GlobalFragmentMapParameterName]; }
    6762    }
    68 
    6963    #endregion
    7064
    7165    #region Properties
    72 
    7366    public ItemArray<ISymbolicExpressionTree> Parents {
    7467      get { return ParentsParameter.ActualValue; }
    7568    }
    76 
    7769    public ISymbolicExpressionTree Child {
    7870      get { return ChildParameter.ActualValue; }
    7971      set { ChildParameter.ActualValue = value; }
    8072    }
    81 
    8273    public CloneMapType GlobalCloneMap {
    8374      get { return GlobalCloneMapParameter.ActualValue; }
    8475    }
    85 
     76    public TraceMapType GlobalTraceMap {
     77      get { return GlobalTraceMapParameter.ActualValue; }
     78    }
    8679    public CloneMapType GlobalFragmentMap {
    8780      get { return GlobalFragmentMapParameter.ActualValue; }
    8881    }
    89 
    90     public TraceMapType GlobalTraceMap {
    91       get { return GlobalTraceMapParameter.ActualValue; }
    92     }
    93 
    9482    #endregion
    9583
     
    10593    protected TracingSymbolicExpressionTreeCrossover()
    10694      : base() {
    107       Parameters.Add(new ScopeTreeLookupParameter<ISymbolicExpressionTree>(ParentsParameterName,
    108                                                                            "The parent symbolic expression trees which should be crossed."));
    109       Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(ChildParameterName,
    110                                                                   "The child symbolic expression tree resulting from the crossover."));
    111       Parameters.Add(new LookupParameter<CloneMapType>(GlobalCloneMapParameterName,
    112                                                        "A global map keeping track of trees and their clones (made during selection)."));
    113       Parameters.Add(new LookupParameter<CloneMapType>(GlobalFragmentMapParameterName,
    114                                                        "A global map keeping track of tree fragments received via crossover."));
    115       Parameters.Add(new LookupParameter<TraceMapType>(GlobalTraceMapParameterName,
    116                                                        "A global cache containing tracing info."));
     95      Parameters.Add(new ScopeTreeLookupParameter<ISymbolicExpressionTree>(ParentsParameterName, "The parent symbolic expression trees which should be crossed."));
     96      Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(ChildParameterName, "The child symbolic expression tree resulting from the crossover."));
     97      Parameters.Add(new LookupParameter<CloneMapType>(GlobalCloneMapParameterName, "A global map keeping track of trees and their clones (made during selection)."));
     98      Parameters.Add(new LookupParameter<CloneMapType>(GlobalFragmentMapParameterName, "A global map keeping track of tree fragments received via crossover."));
     99      Parameters.Add(new LookupParameter<TraceMapType>(GlobalTraceMapParameterName, "A global cache containing tracing info."));
    117100    }
    118101
     
    120103      if (Parents.Length != 2)
    121104        throw new ArgumentException("Number of parents must be exactly two for symbolic expression tree crossover operators.");
     105
    122106      // add global trace cache if not already present in global scope
    123107      var gScope = ExecutionContext.Scope;
    124       while (gScope.Parent != null) gScope = gScope.Parent;
     108      while (gScope.Parent != null)
     109        gScope = gScope.Parent;
    125110      if (GlobalTraceMap == null)
    126111        gScope.Variables.Add(new Variable(GlobalTraceMapParameterName, new TraceMapType()));
    127112      if (GlobalFragmentMap == null)
    128113        gScope.Variables.Add(new Variable(GlobalFragmentMapParameterName, new CloneMapType()));
    129       // get original parents
     114
     115      // get original parents (this info will be needed later to construct the genealogy graph)
    130116      var originalParents = new ItemList<IItem>(Parents.Select(x => GlobalCloneMap[x]));
     117
    131118      // save the nodes of parent0 in a list so we can track what modifications are made by crossover
    132       var nodes0 = Parents[0].IterateNodes().ToList();
     119      var nodes0 = Parents[0].IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>;
     120
    133121      //perform crossover
    134122      Child = Crossover(Random, Parents[0], Parents[1]);
     123
    135124      // create another list of parent0's nodes, so we can compare it with the first list to see what changed
    136       var nodes1 = Child.IterateNodes().ToList();
     125      var nodes1 = Child.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>;
     126
    137127      // compare the two nodes lists and check the difference (comparing node references so we avoid false functional identity).
    138128      // if no difference is found, then it is assumed that the whole tree was swapped with itself (it can happen), so the index is 0
     
    141131        if (nodes0[i] != nodes1[i]) break;
    142132      if (i == min) i = 0;
    143       GlobalTraceMap[Child] = originalParents;
    144       GlobalFragmentMap[Child] = new IntValue(i);
     133
     134      // add heredity information into the global variables
     135      GlobalTraceMap[Child] = originalParents; // map child to its corresponding parents from the previous generation
     136      GlobalFragmentMap[Child] = new IntValue(i); // map child to the index of its fragment
    145137      return base.Apply();
    146138    }
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Interfaces/ISymbolicExpressionTree.cs

    r7439 r7792  
    3131    IEnumerable<ISymbolicExpressionTreeNode> IterateNodesPrefix();
    3232    IEnumerable<ISymbolicExpressionTreeNode> IterateNodesPostfix();
     33    IEnumerable<ISymbolicExpressionTreeNode> IterateNodesBreadth();
    3334  }
    3435}
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Interfaces/ISymbolicExpressionTreeNode.cs

    r7522 r7792  
    3636    IEnumerable<ISymbolicExpressionTreeNode> IterateNodesPostfix();
    3737    IEnumerable<ISymbolicExpressionTreeNode> IterateNodesPrefix();
     38    IEnumerable<ISymbolicExpressionTreeNode> IterateNodesBreadth();
    3839    void ForEachNodePostfix(Action<ISymbolicExpressionTreeNode> a);
    3940    void ForEachNodePrefix(Action<ISymbolicExpressionTreeNode> a);
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/TracingSymbolicExpressionTreeManipulator.cs

    r7514 r7792  
    2121
    2222using System;
     23using System.Linq;
    2324using HeuristicLab.Common;
    2425using HeuristicLab.Core;
     26using HeuristicLab.Data;
    2527using HeuristicLab.Parameters;
    2628using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     
    3941    private const string GlobalTraceMapParameterName = "GlobalTraceMap";
    4042    private const string GlobalCloneMapParameterName = "GlobalCloneMap";
     43    private const string GlobalFragmentMapParameterName = "GlobalFragmentMap";
    4144
    4245    #region Parameter Properties
     
    4952    public LookupParameter<TraceMapType> GlobalTraceMapParameter {
    5053      get { return (LookupParameter<TraceMapType>)Parameters[GlobalTraceMapParameterName]; }
     54    }
     55    public LookupParameter<CloneMapType> GlobalFragmentMapParameter {
     56      get { return (LookupParameter<CloneMapType>)Parameters[GlobalFragmentMapParameterName]; }
    5157    }
    5258    #endregion
     
    6268      get { return GlobalTraceMapParameter.ActualValue; }
    6369    }
     70    public CloneMapType GlobalFragmentMap {
     71      get { return GlobalFragmentMapParameter.ActualValue; }
     72    }
    6473    #endregion
    6574
     
    7281      Parameters.Add(new LookupParameter<CloneMapType>(GlobalCloneMapParameterName, "A global map keeping track of trees and their clones (made during selection)."));
    7382      Parameters.Add(new LookupParameter<TraceMapType>(GlobalTraceMapParameterName, "A global cache containing tracing info."));
     83      Parameters.Add(new LookupParameter<CloneMapType>(GlobalFragmentMapParameterName, "A global map keeping track of tree fragments received via crossover."));
    7484    }
    7585
     
    7787      ISymbolicExpressionTree tree = SymbolicExpressionTreeParameter.ActualValue;
    7888
    79       if (GlobalTraceMap == null) {
    80         var gScope = ExecutionContext.Scope;
    81         while (gScope.Parent != null) gScope = gScope.Parent;
     89      var gScope = ExecutionContext.Scope;
     90      while (gScope.Parent != null)
     91        gScope = gScope.Parent;
     92
     93      if (GlobalTraceMap == null)
    8294        gScope.Variables.Add(new Variable(GlobalTraceMapParameterName, new TraceMapType()));
    83       }
     95      if (GlobalFragmentMap == null)
     96        gScope.Variables.Add(new Variable(GlobalFragmentMapParameterName, new CloneMapType()));
     97
    8498      if (GlobalTraceMap.ContainsKey(tree)) {
    8599        // tree was affected by crossover before mutation
    86         // if the tree to be manipulated is already a product of crossover (in the current reproduction phase), then there exists no relationship with the original "parent".
     100        // if the tree to be manipulated is already a product of crossover (in the current reproduction phase),
     101        // then there exists no relationship with the original "parent".
    87102        // In order to preserve information, a tree clone is created before mutation and added to the trace map.
    88103        var clone = (IItem)tree.Clone();
    89104        GlobalTraceMap[clone] = GlobalTraceMap[tree];
    90105        GlobalTraceMap[tree] = new ItemList<IItem> { clone };
     106        GlobalFragmentMap[clone] = GlobalFragmentMap[tree];
    91107      } else {
    92108        var original = GlobalCloneMap[tree];
    93109        GlobalTraceMap[tree] = new ItemList<IItem> { original };
    94110      }
     111      var nodes0 = tree.IterateNodesBreadth().ToList();
    95112      Manipulate(RandomParameter.ActualValue, tree);
     113      var nodes1 = tree.IterateNodesBreadth().ToList();
     114      int i, min = Math.Max(nodes0.Count, nodes1.Count);
     115      for (i = 0; i != min; ++i)
     116        if (nodes0[i] != nodes1[i]) break;
     117      if (i == min) i = 0;
     118      GlobalFragmentMap[tree] = new IntValue(i);
    96119
    97120      return base.Apply();
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Plugin.cs

    r7788 r7792  
    2626
    2727namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
    28   [Plugin("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding","Provides operators and related classes for the symbolic expression tree encoding.", "3.4.2.7785")]
     28  [Plugin("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding","Provides operators and related classes for the symbolic expression tree encoding.", "3.4.2.7788")]
    2929  [PluginFile("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.dll", PluginFileType.Assembly)]
    3030  [PluginDependency("HeuristicLab.Analysis", "3.3")]
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTree.cs

    r7439 r7792  
    8585      return root.IterateNodesPostfix();
    8686    }
     87    public IEnumerable<ISymbolicExpressionTreeNode> IterateNodesBreadth() {
     88      if (root == null)
     89        return new SymbolicExpressionTreeNode[0];
     90      return root.IterateNodesBreadth();
     91    }
    8792
    8893    public override IDeepCloneable Clone(Cloner cloner) {
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeMatching.cs

    r7788 r7792  
    7070
    7171    public static bool ContainsFragment(this ISymbolicExpressionTree tree, ISymbolicExpressionTreeNode fragment, int mode) {
    72       var nodes = tree.IterateNodesPostfix().ToArray();
    73       var fragments = fragment.IterateNodesPostfix().ToArray();
     72      var nodes = tree.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>;
     73      var fragments = fragment.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>;
    7474      return FindMatch(nodes, fragments, mode) != -1;
    7575    }
    7676
    77     #region FindMatch signatures
    78     public static int FindMatch(ISymbolicExpressionTree t0, ISymbolicExpressionTree t1, int mode) {
    79       return FindMatch(t0.IterateNodesPostfix().ToArray(), t1.IterateNodesPostfix().ToArray(), mode);
    80     }
    81     private static int FindMatch(ISymbolicExpressionTreeNode t0, ISymbolicExpressionTreeNode t1, int mode) {
    82       return FindMatch(t0.IterateNodesPostfix().ToArray(), t1.IterateNodesPostfix().ToArray(), mode);
    83     }
    84     private static int FindMatch(ISymbolicExpressionTree t0, ISymbolicExpressionTreeNode t1, int mode) {
    85       return FindMatch(t0.IterateNodesPostfix().ToArray(), t1.IterateNodesPostfix().ToArray(), mode);
    86     }
    87     private static int FindMatch(ISymbolicExpressionTreeNode t0, ISymbolicExpressionTree t1, int mode) {
    88       return FindMatch(t0.IterateNodesPostfix().ToArray(), t1.IterateNodesPostfix().ToArray(), mode);
    89     }
    90     #endregion
    91 
    9277    // convenience methods for less typing :)
    9378    private static IEnumerator<ISymbolicExpressionTreeNode> Enumerator(this ISymbolicExpressionTree tree) {
    94       return tree.IterateNodes().GetEnumerator();
     79      return tree.IterateNodesBreadth().GetEnumerator();
    9580    }
    9681    private static IEnumerator<ISymbolicExpressionTreeNode> Enumerator(this ISymbolicExpressionTreeNode tree) {
    97       return tree.IterateNodes().GetEnumerator();
     82      return tree.IterateNodesBreadth().GetEnumerator();
    9883    }
    99     // method for breath-width iteration of nodes
    100     public static IEnumerable<ISymbolicExpressionTreeNode> IterateNodes(this ISymbolicExpressionTree tree) {
    101       return IterateNodes(tree.Root);
     84    public static int FindMatch(ISymbolicExpressionTree a, ISymbolicExpressionTree b, int mode) {
     85      var nodesA = a.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>;
     86      var nodesB = b.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>;
     87      return FindMatch(nodesA, nodesB, mode);
    10288    }
    103 
    104     private static IEnumerable<ISymbolicExpressionTreeNode> IterateNodes(this ISymbolicExpressionTreeNode root) {
    105       var list = new List<ISymbolicExpressionTreeNode> { root };
    106       int offset = 0, count = 1;
    107       while (offset != count) {
    108         var c = count;
    109         for (int i = offset; i != count; ++i) {
    110           yield return list[i]; // TODO: look into yield performance (vs returning the whole list at the end)
    111           if (!list[i].Subtrees.Any()) continue;
    112           list.AddRange(list[i].Subtrees);
    113         }
    114         offset = c;
    115         count = list.Count;
    116       }
    117       //return list;
     89    public static int FindMatch(ISymbolicExpressionTreeNode a, ISymbolicExpressionTreeNode b, int mode) {
     90      var nodesA = a.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>;
     91      var nodesB = b.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>;
     92      return FindMatch(nodesA, nodesB, mode);
    11893    }
    119 
    120     /// <summary>
    121     /// This method finds the point where parent and child differ. For instance in the case of crossover,
    122     /// it will return the node that was swapped into parent0 from parent1
    123     /// Prerequisites: as the naming implies, heredity should exist between parent and child,
    124     /// otherwise this method would not make much sense (it would always return the root of child)
    125     /// </summary>
    126     /// <param name="parent">The individual from the previous generation that was crossed over or mutated to produce child</param>
    127     /// <param name="child">The result of a genetic operation applied on parent</param>
    128     /// <returns>A symbolic expression tree node representing the difference fragment between parent and child</returns>
    129     public static ISymbolicExpressionTreeNode GetFragmentDiff(ISymbolicExpressionTree parent, ISymbolicExpressionTree child) {
    130       var nodes1 = parent.IterateNodes().ToList();
    131       var nodes2 = child.IterateNodes().ToList();
    132       var e1 = nodes1.AsEnumerable().GetEnumerator();
    133       var e2 = nodes2.AsEnumerable().GetEnumerator();
    134       while (e1.MoveNext() && e2.MoveNext()) {
    135         var comparer = new SymbolicExpressionTreeNodeComparer((int)SimilarityLevel.Exact);
    136         if (!comparer.Equals(e1.Current, e2.Current)) {
    137           return e2.Current;
    138         }
    139         //if (!e1.Current.IterateNodes().SequenceEqual(e2.Current.IterateNodes(), comparer)) {
    140         //  return e2.Current;
    141         //} // return the fragment by which child differs from parent
    142       }
    143       return null;
    144     }
    145 
    14694    // returns the index in the sequence 'seq', where pattern 'pat' is matched, or -1 for no match
    14795    // -1 means no match, 0 means perfect match (the sequences overlap, hence the match index is 0)
    148     public static int FindMatch(ISymbolicExpressionTreeNode[] seq, ISymbolicExpressionTreeNode[] pat, int mode) {
    149       int patlen = pat.Length;
    150       int seqlen = seq.Length;
     96    public static int FindMatch(List<ISymbolicExpressionTreeNode> seq, List<ISymbolicExpressionTreeNode> pat, int mode) {
     97      int patlen = pat.Count;
     98      int seqlen = seq.Count;
    15199      if (patlen == 0 || seqlen == 0) return -1;
    152100      var comparer = new SymbolicExpressionTreeNodeComparer(mode);
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeNode.cs

    r7522 r7792  
    172172    }
    173173
     174    public IEnumerable<ISymbolicExpressionTreeNode> IterateNodesBreadth() {
     175      var list = new List<ISymbolicExpressionTreeNode>(GetLength()) { this };
     176      int offset = 0, count = 1;
     177      while (offset != count) {
     178        var c = count;
     179        for (int i = offset; i != count; ++i)
     180          if (list[i].SubtreeCount > 0)
     181            list.AddRange(list[i].Subtrees);
     182        offset = c;
     183        count = list.Count;
     184      }
     185      return list;
     186    }
     187
    174188    public IEnumerable<ISymbolicExpressionTreeNode> IterateNodesPrefix() {
    175       List<ISymbolicExpressionTreeNode> list = new List<ISymbolicExpressionTreeNode>();
     189      List<ISymbolicExpressionTreeNode> list = new List<ISymbolicExpressionTreeNode>(GetLength());
    176190      ForEachNodePrefix((n) => list.Add(n));
    177191      return list;
     
    188202
    189203    public IEnumerable<ISymbolicExpressionTreeNode> IterateNodesPostfix() {
    190       List<ISymbolicExpressionTreeNode> list = new List<ISymbolicExpressionTreeNode>();
     204      List<ISymbolicExpressionTreeNode> list = new List<ISymbolicExpressionTreeNode>(GetLength());
    191205      ForEachNodePostfix((n) => list.Add(n));
    192206      return list;
Note: See TracChangeset for help on using the changeset viewer.