Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/TracingSymbolicExpressionTreeManipulator.cs @ 7792

Last change on this file since 7792 was 7792, checked in by bburlacu, 12 years ago

#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.
File size: 6.0 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Linq;
24using HeuristicLab.Common;
25using HeuristicLab.Core;
26using HeuristicLab.Data;
27using HeuristicLab.Parameters;
28using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
29
30using CloneMapType = HeuristicLab.Core.ItemDictionary<HeuristicLab.Core.IItem, HeuristicLab.Core.IItem>;
31using TraceMapType = HeuristicLab.Core.ItemDictionary<HeuristicLab.Core.IItem, HeuristicLab.Core.IItemList<HeuristicLab.Core.IItem>>;
32
33namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
34  /// <summary>
35  /// A base class for operators that manipulate real-valued vectors.
36  /// </summary>
37  [Item("TracingSymbolicExpressionTreeManipulator", "A base class for operators that manipulate symbolic expression trees.")]
38  [StorableClass]
39  public abstract class TracingSymbolicExpressionTreeManipulator : SymbolicExpressionTreeOperator, ISymbolicExpressionTreeManipulator {
40    private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
41    private const string GlobalTraceMapParameterName = "GlobalTraceMap";
42    private const string GlobalCloneMapParameterName = "GlobalCloneMap";
43    private const string GlobalFragmentMapParameterName = "GlobalFragmentMap";
44
45    #region Parameter Properties
46    public ILookupParameter<ISymbolicExpressionTree> SymbolicExpressionTreeParameter {
47      get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
48    }
49    public LookupParameter<CloneMapType> GlobalCloneMapParameter {
50      get { return (LookupParameter<CloneMapType>)Parameters[GlobalCloneMapParameterName]; }
51    }
52    public LookupParameter<TraceMapType> GlobalTraceMapParameter {
53      get { return (LookupParameter<TraceMapType>)Parameters[GlobalTraceMapParameterName]; }
54    }
55    public LookupParameter<CloneMapType> GlobalFragmentMapParameter {
56      get { return (LookupParameter<CloneMapType>)Parameters[GlobalFragmentMapParameterName]; }
57    }
58    #endregion
59
60    #region Properties
61    public ISymbolicExpressionTree SymbolicExpressionTree {
62      get { return SymbolicExpressionTreeParameter.ActualValue; }
63    }
64    public CloneMapType GlobalCloneMap {
65      get { return GlobalCloneMapParameter.ActualValue; }
66    }
67    public TraceMapType GlobalTraceMap {
68      get { return GlobalTraceMapParameter.ActualValue; }
69    }
70    public CloneMapType GlobalFragmentMap {
71      get { return GlobalFragmentMapParameter.ActualValue; }
72    }
73    #endregion
74
75    [StorableConstructor]
76    protected TracingSymbolicExpressionTreeManipulator(bool deserializing) : base(deserializing) { }
77    protected TracingSymbolicExpressionTreeManipulator(TracingSymbolicExpressionTreeManipulator original, Cloner cloner) : base(original, cloner) { }
78    public TracingSymbolicExpressionTreeManipulator()
79      : base() {
80      Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression tree on which the operator should be applied."));
81      Parameters.Add(new LookupParameter<CloneMapType>(GlobalCloneMapParameterName, "A global map keeping track of trees and their clones (made during selection)."));
82      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."));
84    }
85
86    public sealed override IOperation Apply() {
87      ISymbolicExpressionTree tree = SymbolicExpressionTreeParameter.ActualValue;
88
89      var gScope = ExecutionContext.Scope;
90      while (gScope.Parent != null)
91        gScope = gScope.Parent;
92
93      if (GlobalTraceMap == null)
94        gScope.Variables.Add(new Variable(GlobalTraceMapParameterName, new TraceMapType()));
95      if (GlobalFragmentMap == null)
96        gScope.Variables.Add(new Variable(GlobalFragmentMapParameterName, new CloneMapType()));
97
98      if (GlobalTraceMap.ContainsKey(tree)) {
99        // tree was affected by crossover before mutation
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".
102        // In order to preserve information, a tree clone is created before mutation and added to the trace map.
103        var clone = (IItem)tree.Clone();
104        GlobalTraceMap[clone] = GlobalTraceMap[tree];
105        GlobalTraceMap[tree] = new ItemList<IItem> { clone };
106        GlobalFragmentMap[clone] = GlobalFragmentMap[tree];
107      } else {
108        var original = GlobalCloneMap[tree];
109        GlobalTraceMap[tree] = new ItemList<IItem> { original };
110      }
111      var nodes0 = tree.IterateNodesBreadth().ToList();
112      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);
119
120      return base.Apply();
121    }
122
123    protected abstract void Manipulate(IRandom random, ISymbolicExpressionTree symbolicExpressionTree);
124  }
125}
Note: See TracBrowser for help on using the repository browser.