Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/09/12 17:29:33 (12 years ago)
Author:
bburlacu
Message:

#1772: Fixed bug in fragment tracing.

Location:
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4
Files:
4 edited

Legend:

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

    r7522 r7788  
    2424using HeuristicLab.Common;
    2525using HeuristicLab.Core;
     26using HeuristicLab.Data;
    2627using HeuristicLab.Parameters;
    2728using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     
    3435  /// A base class for operators that perform a crossover of symbolic expression trees.
    3536  /// </summary>
    36   [Item("SymbolicExpressionTreeCrossover", "A base class for operators that perform a crossover of symbolic expression trees.")]
     37  [Item("SymbolicExpressionTreeCrossover",
     38    "A base class for operators that perform a crossover of symbolic expression trees.")]
    3739  [StorableClass]
    3840  public abstract class TracingSymbolicExpressionTreeCrossover : SymbolicExpressionTreeOperator, ISymbolicExpressionTreeCrossover {
     
    4143    private const string GlobalTraceMapParameterName = "GlobalTraceMap";
    4244    private const string GlobalCloneMapParameterName = "GlobalCloneMap";
     45    private const string GlobalFragmentMapParameterName = "GlobalFragmentMap";
     46
    4347    #region Parameter Properties
     48
    4449    public ILookupParameter<ItemArray<ISymbolicExpressionTree>> ParentsParameter {
    4550      get { return (ScopeTreeLookupParameter<ISymbolicExpressionTree>)Parameters[ParentsParameterName]; }
    4651    }
     52
    4753    public ILookupParameter<ISymbolicExpressionTree> ChildParameter {
    4854      get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters[ChildParameterName]; }
    4955    }
     56
    5057    public LookupParameter<CloneMapType> GlobalCloneMapParameter {
    5158      get { return (LookupParameter<CloneMapType>)Parameters[GlobalCloneMapParameterName]; }
    5259    }
     60
    5361    public LookupParameter<TraceMapType> GlobalTraceMapParameter {
    5462      get { return (LookupParameter<TraceMapType>)Parameters[GlobalTraceMapParameterName]; }
    5563    }
     64
     65    public LookupParameter<CloneMapType> GlobalFragmentMapParameter {
     66      get { return (LookupParameter<CloneMapType>)Parameters[GlobalFragmentMapParameterName]; }
     67    }
     68
    5669    #endregion
     70
    5771    #region Properties
     72
    5873    public ItemArray<ISymbolicExpressionTree> Parents {
    5974      get { return ParentsParameter.ActualValue; }
    6075    }
     76
    6177    public ISymbolicExpressionTree Child {
    6278      get { return ChildParameter.ActualValue; }
    6379      set { ChildParameter.ActualValue = value; }
    6480    }
     81
    6582    public CloneMapType GlobalCloneMap {
    6683      get { return GlobalCloneMapParameter.ActualValue; }
    6784    }
     85
     86    public CloneMapType GlobalFragmentMap {
     87      get { return GlobalFragmentMapParameter.ActualValue; }
     88    }
     89
    6890    public TraceMapType GlobalTraceMap {
    6991      get { return GlobalTraceMapParameter.ActualValue; }
    7092    }
     93
    7194    #endregion
     95
    7296    [StorableConstructor]
    73     protected TracingSymbolicExpressionTreeCrossover(bool deserializing) : base(deserializing) { }
    74     protected TracingSymbolicExpressionTreeCrossover(TracingSymbolicExpressionTreeCrossover original, Cloner cloner) : base(original, cloner) { }
     97    protected TracingSymbolicExpressionTreeCrossover(bool deserializing)
     98      : base(deserializing) {
     99    }
     100
     101    protected TracingSymbolicExpressionTreeCrossover(TracingSymbolicExpressionTreeCrossover original, Cloner cloner)
     102      : base(original, cloner) {
     103    }
     104
    75105    protected TracingSymbolicExpressionTreeCrossover()
    76106      : base() {
    77       Parameters.Add(new ScopeTreeLookupParameter<ISymbolicExpressionTree>(ParentsParameterName, "The parent symbolic expression trees which should be crossed."));
    78       Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(ChildParameterName, "The child symbolic expression tree resulting from the crossover."));
    79       Parameters.Add(new LookupParameter<CloneMapType>(GlobalCloneMapParameterName, "A global map keeping track of trees and their clones (made during selection)."));
    80       Parameters.Add(new LookupParameter<TraceMapType>(GlobalTraceMapParameterName, "A global cache containing tracing info."));
     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."));
    81117    }
    82118
     
    85121        throw new ArgumentException("Number of parents must be exactly two for symbolic expression tree crossover operators.");
    86122      // add global trace cache if not already present in global scope
    87       if (GlobalTraceMap == null) {
    88         var gScope = ExecutionContext.Scope;
    89         while (gScope.Parent != null) gScope = gScope.Parent;
     123      var gScope = ExecutionContext.Scope;
     124      while (gScope.Parent != null) gScope = gScope.Parent;
     125      if (GlobalTraceMap == null)
    90126        gScope.Variables.Add(new Variable(GlobalTraceMapParameterName, new TraceMapType()));
    91       }
     127      if (GlobalFragmentMap == null)
     128        gScope.Variables.Add(new Variable(GlobalFragmentMapParameterName, new CloneMapType()));
     129      // get original parents
    92130      var originalParents = new ItemList<IItem>(Parents.Select(x => GlobalCloneMap[x]));
    93       ISymbolicExpressionTree result = Crossover(Random, Parents[0], Parents[1]);
    94       Child = result;
    95       GlobalTraceMap.Add(Child, originalParents);
    96 
     131      // 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();
     133      //perform crossover
     134      Child = Crossover(Random, Parents[0], Parents[1]);
     135      // 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();
     137      // compare the two nodes lists and check the difference (comparing node references so we avoid false functional identity).
     138      // 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
     139      int i, min = Math.Max(nodes0.Count, nodes1.Count);
     140      for (i = 0; i != min; ++i)
     141        if (nodes0[i] != nodes1[i]) break;
     142      if (i == min) i = 0;
     143      GlobalTraceMap[Child] = originalParents;
     144      GlobalFragmentMap[Child] = new IntValue(i);
    97145      return base.Apply();
    98146    }
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj.user

    r7785 r7788  
    77  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
    88    <StartAction>Program</StartAction>
    9     <StartProgram>C:\Users\Bogdan\Desktop\Trunk\sources\bin\HeuristicLab 3.3.exe</StartProgram>
     9    <StartProgram>C:\Users\bburlacu\Desktop\HL-Core\trunk\sources\bin\HeuristicLab 3.3.exe</StartProgram>
    1010  </PropertyGroup>
    1111  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Plugin.cs

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

    r7785 r7788  
    9292    // convenience methods for less typing :)
    9393    private static IEnumerator<ISymbolicExpressionTreeNode> Enumerator(this ISymbolicExpressionTree tree) {
    94       return tree.IterateNodesPostfix().GetEnumerator();
     94      return tree.IterateNodes().GetEnumerator();
    9595    }
    9696    private static IEnumerator<ISymbolicExpressionTreeNode> Enumerator(this ISymbolicExpressionTreeNode tree) {
    97       return tree.IterateNodesPostfix().GetEnumerator();
     97      return tree.IterateNodes().GetEnumerator();
    9898    }
    9999    // method for breath-width iteration of nodes
    100     private static IEnumerable<ISymbolicExpressionTreeNode> IterateNodes(this ISymbolicExpressionTree tree) {
     100    public static IEnumerable<ISymbolicExpressionTreeNode> IterateNodes(this ISymbolicExpressionTree tree) {
    101101      return IterateNodes(tree.Root);
    102102    }
     
    128128    /// <returns>A symbolic expression tree node representing the difference fragment between parent and child</returns>
    129129    public static ISymbolicExpressionTreeNode GetFragmentDiff(ISymbolicExpressionTree parent, ISymbolicExpressionTree child) {
    130       var e1 = parent.Enumerator();
    131       var e2 = child.Enumerator();
     130      var nodes1 = parent.IterateNodes().ToList();
     131      var nodes2 = child.IterateNodes().ToList();
     132      var e1 = nodes1.AsEnumerable().GetEnumerator();
     133      var e2 = nodes2.AsEnumerable().GetEnumerator();
    132134      while (e1.MoveNext() && e2.MoveNext()) {
    133135        var comparer = new SymbolicExpressionTreeNodeComparer((int)SimilarityLevel.Exact);
    134         if (!comparer.Equals(e1.Current, e2.Current)) { return e2.Current; } // return the fragment by which child differs from parent
     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
    135142      }
    136143      return null;
     
    145152      var comparer = new SymbolicExpressionTreeNodeComparer(mode);
    146153      if (patlen == seqlen) return seq.SequenceEqual(pat, comparer) ? 0 : -1;
    147       //int i = patlen;           
    148       //while (i <= seqlen) {
    149       //  var ch = seq[i - 1];
    150       //  if (comparer.Equals(ch, pat.Last()))
    151       //    if (seq.Skip(i - patlen).Take(patlen).SequenceEqual(pat, comparer))
    152       //      return i - patlen;
    153       //  ++i;
    154       //}
    155154      for (int i = patlen; i <= seqlen; ++i) {
    156155        if (comparer.Equals(seq[i - 1], pat.Last())) // first check if last element is a match
Note: See TracChangeset for help on using the changeset viewer.