Changeset 7792
- Timestamp:
- 05/10/12 17:17:14 (13 years ago)
- Location:
- branches/HeuristicLab.EvolutionaryTracking
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/TracingSymbolicExpressionTreeCrossover.cs
r7788 r7792 21 21 22 22 using System; 23 using System.Collections.Generic; 23 24 using System.Linq; 24 25 using HeuristicLab.Common; … … 35 36 /// A base class for operators that perform a crossover of symbolic expression trees. 36 37 /// </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.")] 39 39 [StorableClass] 40 40 public abstract class TracingSymbolicExpressionTreeCrossover : SymbolicExpressionTreeOperator, ISymbolicExpressionTreeCrossover { … … 46 46 47 47 #region Parameter Properties 48 49 48 public ILookupParameter<ItemArray<ISymbolicExpressionTree>> ParentsParameter { 50 49 get { return (ScopeTreeLookupParameter<ISymbolicExpressionTree>)Parameters[ParentsParameterName]; } 51 50 } 52 53 51 public ILookupParameter<ISymbolicExpressionTree> ChildParameter { 54 52 get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters[ChildParameterName]; } 55 53 } 56 57 54 public LookupParameter<CloneMapType> GlobalCloneMapParameter { 58 55 get { return (LookupParameter<CloneMapType>)Parameters[GlobalCloneMapParameterName]; } 59 56 } 60 61 57 public LookupParameter<TraceMapType> GlobalTraceMapParameter { 62 58 get { return (LookupParameter<TraceMapType>)Parameters[GlobalTraceMapParameterName]; } 63 59 } 64 65 60 public LookupParameter<CloneMapType> GlobalFragmentMapParameter { 66 61 get { return (LookupParameter<CloneMapType>)Parameters[GlobalFragmentMapParameterName]; } 67 62 } 68 69 63 #endregion 70 64 71 65 #region Properties 72 73 66 public ItemArray<ISymbolicExpressionTree> Parents { 74 67 get { return ParentsParameter.ActualValue; } 75 68 } 76 77 69 public ISymbolicExpressionTree Child { 78 70 get { return ChildParameter.ActualValue; } 79 71 set { ChildParameter.ActualValue = value; } 80 72 } 81 82 73 public CloneMapType GlobalCloneMap { 83 74 get { return GlobalCloneMapParameter.ActualValue; } 84 75 } 85 76 public TraceMapType GlobalTraceMap { 77 get { return GlobalTraceMapParameter.ActualValue; } 78 } 86 79 public CloneMapType GlobalFragmentMap { 87 80 get { return GlobalFragmentMapParameter.ActualValue; } 88 81 } 89 90 public TraceMapType GlobalTraceMap {91 get { return GlobalTraceMapParameter.ActualValue; }92 }93 94 82 #endregion 95 83 … … 105 93 protected TracingSymbolicExpressionTreeCrossover() 106 94 : 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.")); 117 100 } 118 101 … … 120 103 if (Parents.Length != 2) 121 104 throw new ArgumentException("Number of parents must be exactly two for symbolic expression tree crossover operators."); 105 122 106 // add global trace cache if not already present in global scope 123 107 var gScope = ExecutionContext.Scope; 124 while (gScope.Parent != null) gScope = gScope.Parent; 108 while (gScope.Parent != null) 109 gScope = gScope.Parent; 125 110 if (GlobalTraceMap == null) 126 111 gScope.Variables.Add(new Variable(GlobalTraceMapParameterName, new TraceMapType())); 127 112 if (GlobalFragmentMap == null) 128 113 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) 130 116 var originalParents = new ItemList<IItem>(Parents.Select(x => GlobalCloneMap[x])); 117 131 118 // 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 133 121 //perform crossover 134 122 Child = Crossover(Random, Parents[0], Parents[1]); 123 135 124 // 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 137 127 // compare the two nodes lists and check the difference (comparing node references so we avoid false functional identity). 138 128 // 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 … … 141 131 if (nodes0[i] != nodes1[i]) break; 142 132 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 145 137 return base.Apply(); 146 138 } -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Interfaces/ISymbolicExpressionTree.cs
r7439 r7792 31 31 IEnumerable<ISymbolicExpressionTreeNode> IterateNodesPrefix(); 32 32 IEnumerable<ISymbolicExpressionTreeNode> IterateNodesPostfix(); 33 IEnumerable<ISymbolicExpressionTreeNode> IterateNodesBreadth(); 33 34 } 34 35 } -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Interfaces/ISymbolicExpressionTreeNode.cs
r7522 r7792 36 36 IEnumerable<ISymbolicExpressionTreeNode> IterateNodesPostfix(); 37 37 IEnumerable<ISymbolicExpressionTreeNode> IterateNodesPrefix(); 38 IEnumerable<ISymbolicExpressionTreeNode> IterateNodesBreadth(); 38 39 void ForEachNodePostfix(Action<ISymbolicExpressionTreeNode> a); 39 40 void ForEachNodePrefix(Action<ISymbolicExpressionTreeNode> a); -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/TracingSymbolicExpressionTreeManipulator.cs
r7514 r7792 21 21 22 22 using System; 23 using System.Linq; 23 24 using HeuristicLab.Common; 24 25 using HeuristicLab.Core; 26 using HeuristicLab.Data; 25 27 using HeuristicLab.Parameters; 26 28 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; … … 39 41 private const string GlobalTraceMapParameterName = "GlobalTraceMap"; 40 42 private const string GlobalCloneMapParameterName = "GlobalCloneMap"; 43 private const string GlobalFragmentMapParameterName = "GlobalFragmentMap"; 41 44 42 45 #region Parameter Properties … … 49 52 public LookupParameter<TraceMapType> GlobalTraceMapParameter { 50 53 get { return (LookupParameter<TraceMapType>)Parameters[GlobalTraceMapParameterName]; } 54 } 55 public LookupParameter<CloneMapType> GlobalFragmentMapParameter { 56 get { return (LookupParameter<CloneMapType>)Parameters[GlobalFragmentMapParameterName]; } 51 57 } 52 58 #endregion … … 62 68 get { return GlobalTraceMapParameter.ActualValue; } 63 69 } 70 public CloneMapType GlobalFragmentMap { 71 get { return GlobalFragmentMapParameter.ActualValue; } 72 } 64 73 #endregion 65 74 … … 72 81 Parameters.Add(new LookupParameter<CloneMapType>(GlobalCloneMapParameterName, "A global map keeping track of trees and their clones (made during selection).")); 73 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.")); 74 84 } 75 85 … … 77 87 ISymbolicExpressionTree tree = SymbolicExpressionTreeParameter.ActualValue; 78 88 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) 82 94 gScope.Variables.Add(new Variable(GlobalTraceMapParameterName, new TraceMapType())); 83 } 95 if (GlobalFragmentMap == null) 96 gScope.Variables.Add(new Variable(GlobalFragmentMapParameterName, new CloneMapType())); 97 84 98 if (GlobalTraceMap.ContainsKey(tree)) { 85 99 // 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". 87 102 // In order to preserve information, a tree clone is created before mutation and added to the trace map. 88 103 var clone = (IItem)tree.Clone(); 89 104 GlobalTraceMap[clone] = GlobalTraceMap[tree]; 90 105 GlobalTraceMap[tree] = new ItemList<IItem> { clone }; 106 GlobalFragmentMap[clone] = GlobalFragmentMap[tree]; 91 107 } else { 92 108 var original = GlobalCloneMap[tree]; 93 109 GlobalTraceMap[tree] = new ItemList<IItem> { original }; 94 110 } 111 var nodes0 = tree.IterateNodesBreadth().ToList(); 95 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); 96 119 97 120 return base.Apply(); -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Plugin.cs
r7788 r7792 26 26 27 27 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding { 28 [Plugin("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding","Provides operators and related classes for the symbolic expression tree encoding.", "3.4.2.778 5")]28 [Plugin("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding","Provides operators and related classes for the symbolic expression tree encoding.", "3.4.2.7788")] 29 29 [PluginFile("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.dll", PluginFileType.Assembly)] 30 30 [PluginDependency("HeuristicLab.Analysis", "3.3")] -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTree.cs
r7439 r7792 85 85 return root.IterateNodesPostfix(); 86 86 } 87 public IEnumerable<ISymbolicExpressionTreeNode> IterateNodesBreadth() { 88 if (root == null) 89 return new SymbolicExpressionTreeNode[0]; 90 return root.IterateNodesBreadth(); 91 } 87 92 88 93 public override IDeepCloneable Clone(Cloner cloner) { -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeMatching.cs
r7788 r7792 70 70 71 71 public static bool ContainsFragment(this ISymbolicExpressionTree tree, ISymbolicExpressionTreeNode fragment, int mode) { 72 var nodes = tree.IterateNodes Postfix().ToArray();73 var fragments = fragment.IterateNodes Postfix().ToArray();72 var nodes = tree.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>; 73 var fragments = fragment.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>; 74 74 return FindMatch(nodes, fragments, mode) != -1; 75 75 } 76 76 77 #region FindMatch signatures78 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 #endregion91 92 77 // convenience methods for less typing :) 93 78 private static IEnumerator<ISymbolicExpressionTreeNode> Enumerator(this ISymbolicExpressionTree tree) { 94 return tree.IterateNodes ().GetEnumerator();79 return tree.IterateNodesBreadth().GetEnumerator(); 95 80 } 96 81 private static IEnumerator<ISymbolicExpressionTreeNode> Enumerator(this ISymbolicExpressionTreeNode tree) { 97 return tree.IterateNodes ().GetEnumerator();82 return tree.IterateNodesBreadth().GetEnumerator(); 98 83 } 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); 102 88 } 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); 118 93 } 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 parent1123 /// 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 parent142 }143 return null;144 }145 146 94 // returns the index in the sequence 'seq', where pattern 'pat' is matched, or -1 for no match 147 95 // -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; 151 99 if (patlen == 0 || seqlen == 0) return -1; 152 100 var comparer = new SymbolicExpressionTreeNodeComparer(mode); -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeNode.cs
r7522 r7792 172 172 } 173 173 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 174 188 public IEnumerable<ISymbolicExpressionTreeNode> IterateNodesPrefix() { 175 List<ISymbolicExpressionTreeNode> list = new List<ISymbolicExpressionTreeNode>( );189 List<ISymbolicExpressionTreeNode> list = new List<ISymbolicExpressionTreeNode>(GetLength()); 176 190 ForEachNodePrefix((n) => list.Add(n)); 177 191 return list; … … 188 202 189 203 public IEnumerable<ISymbolicExpressionTreeNode> IterateNodesPostfix() { 190 List<ISymbolicExpressionTreeNode> list = new List<ISymbolicExpressionTreeNode>( );204 List<ISymbolicExpressionTreeNode> list = new List<ISymbolicExpressionTreeNode>(GetLength()); 191 205 ForEachNodePostfix((n) => list.Add(n)); 192 206 return list; -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking.Views/3.4/GenealogyGraphChart.cs
r7785 r7792 114 114 style = DashStyle.Dash; 115 115 } else { 116 style = arc.OperatorType == 0? DashStyle.Solid : DashStyle.Dash;116 style = node.InEdges.Count == 2 ? DashStyle.Solid : DashStyle.Dash; 117 117 } 118 118 var arcPen = new Pen(Color.Transparent) { DashStyle = style }; … … 183 183 var end = new Point((int)arc.End.X, (int)arc.End.Y); 184 184 arc.Pen.Brush = new LinearGradientBrush(start, end, arc.Source.ToColor(), arc.Target.ToColor()); 185 if (node.Data.CutpointIndex == -1) {186 // if the cut index wasn't computed yet187 var parent = arc.Source.Data.Data as ISymbolicExpressionTree;188 var child = node.Data.Data as ISymbolicExpressionTree;189 node.Data.CutpointIndex = GetCutIndex(parent, child);190 }191 185 } 192 186 } … … 236 230 Chart.EnforceUpdate(); 237 231 } 238 239 // maybe this method does't belong here240 // TODO: find a good location for this kind of functionality241 private static int GetCutIndex(ISymbolicExpressionTree parent, ISymbolicExpressionTree child) {242 var e1 = parent.IterateNodesPostfix().GetEnumerator();243 var e2 = child.IterateNodesPostfix().GetEnumerator();244 int pos = 0;245 var comparer = new SymbolicExpressionTreeNodeComparer((int)SymbolicExpressionTreeMatching.SimilarityLevel.Exact);246 while (e1.MoveNext() && e2.MoveNext() && comparer.Equals(e1.Current, e2.Current)) ++pos;247 if (pos == 0) return -1;248 if (pos == child.Length) return 0;249 return pos;250 //return pos == 0 ? -1 : pos;251 }252 232 } 253 233 } -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking.Views/3.4/GenealogyGraphView.cs
r7785 r7792 21 21 22 22 using System; 23 using System.Collections.Generic; 23 24 using System.Drawing; 24 25 using System.Linq; … … 92 93 symbolicExpressionTreeChart.Tree = (ISymbolicExpressionTree)genealogyGraphNode.Data; 93 94 if (_selectedVisualSymbolicExpressionTreeNode != null) { 94 var nodes = symbolicExpressionTreeChart.Tree.IterateNodes Postfix().ToArray();95 var fragments = _selectedVisualSymbolicExpressionTreeNode.SymbolicExpressionTreeNode.IterateNodes Postfix().ToArray();95 var nodes = symbolicExpressionTreeChart.Tree.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>; 96 var fragments = _selectedVisualSymbolicExpressionTreeNode.SymbolicExpressionTreeNode.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>; 96 97 int index = SymbolicExpressionTreeMatching.FindMatch(nodes, fragments, similarityModeSelector.SelectedIndex); 97 98 if (index != -1) { 98 _selectedVisualSymbolicExpressionTreeNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(nodes[index + fragments.Count ()- 1]);99 _selectedVisualSymbolicExpressionTreeNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(nodes[index + fragments.Count - 1]); 99 100 var subtree = _selectedVisualSymbolicExpressionTreeNode.SymbolicExpressionTreeNode; 100 101 foreach (var visualNode in subtree.IterateNodesPostfix().Select(node => symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node))) { … … 104 105 } 105 106 } 106 // the cutpoint index represents the index of the node/subtree (when the tree is enumerated in postfix order) 107 // that was changed (by mutation) or received from a parent (by crossover) 108 if (visualGenealogyGraphNode.Data.CutpointIndex != -1) { 109 var gNode = visualGenealogyGraphNode.Data; 110 var symbExprTree = gNode.Data as ISymbolicExpressionTree; 111 if (symbExprTree == null) return; 112 var nodes = symbExprTree.IterateNodesPostfix(); 113 var fragment = nodes.ElementAt(gNode.CutpointIndex); 114 if (fragment != null) foreach (var node in fragment.IterateNodesPostfix()) { 115 var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node); 116 visualNode.FillColor = Color.LightPink; 117 } 118 symbolicExpressionTreeChart.Repaint(); 119 } 107 // what's left to be done here is to: 108 // - get the symbolic expression tree 109 // - get the corresponding fragment 110 // - for all symbolic expression tree nodes in the fragment, colorize the corresponding visual nodes 111 // - repaint the tree 120 112 } 121 113 -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Analyzers/SymbolicExpressionTreeFragmentsAnalyzer.cs
r7788 r7792 20 20 #endregion 21 21 22 using System; 22 23 using System.Collections.Generic; 23 24 using System.Linq; … … 162 163 ResultCollection results = ResultsParameter.ActualValue; 163 164 if (FragmentStatistics == null) { 164 FragmentStatisticsParameter.ActualValue = new DataTable("Fragment Statistics", 165 "Statistical measurements of fragments aggregated over the whole population"); 165 FragmentStatisticsParameter.ActualValue = new DataTable("Fragment Statistics", "Statistical measurements of fragments aggregated over the whole population"); 166 166 FragmentStatistics.VisualProperties.YAxisTitle = "Fragment length/Similarities"; 167 167 results.Add(new Result("Fragment Statistics", FragmentStatistics)); … … 177 177 var trees = (from s in gScope.SubScopes select s.Variables.First().Value as ISymbolicExpressionTree).ToList(); 178 178 foreach (var tree in trees.Where(x => GlobalTraceMap.ContainsKey(x))) { 179 if (GlobalTraceMap[tree].Count == 2) { 180 var fragment = tree.IterateNodes().ElementAt(((IntValue)GlobalFragmentMap[tree]).Value); 181 if (fragment != null) { 182 parents.AddRange(GlobalTraceMap[tree].Cast<ISymbolicExpressionTree>()); 183 fragments.Add(fragment); 184 } else { // "intermediate crossovers" (immediately followed by mutation) 185 var parent0 = (ISymbolicExpressionTree)GlobalTraceMap[tree][0]; 186 if (GlobalTraceMap.ContainsKey(parent0)) { 187 var p = (ISymbolicExpressionTree)GlobalTraceMap[parent0][0]; 188 fragment = parent0.IterateNodes().ElementAt(((IntValue)GlobalFragmentMap[parent0]).Value); 189 if (fragment != null) { 190 parents.AddRange(GlobalTraceMap[parent0].Cast<ISymbolicExpressionTree>()); 191 fragments.Add(fragment); 192 } 193 } 194 } 179 if (GlobalTraceMap[tree].Count == 2) { // crossover 180 var nodes = tree.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>; 181 var index = ((IntValue)GlobalFragmentMap[tree]).Value; 182 var fragment = nodes[index]; 183 if (fragment == null) throw new ArgumentException("Fragment not found"); 184 parents.AddRange(GlobalTraceMap[tree].Cast<ISymbolicExpressionTree>()); 185 fragments.Add(fragment); 186 } else { // crossover followed by mutation 187 // maybe mutation fragments should be also taken into account? 188 var parent0 = (ISymbolicExpressionTree)GlobalTraceMap[tree][0]; 189 if (!GlobalFragmentMap.ContainsKey(parent0)) throw new ArgumentException("Fragment not found"); 190 var nodes = parent0.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>; 191 var index = ((IntValue)GlobalFragmentMap[parent0]).Value; 192 var fragment = nodes[index]; 193 fragments.Add(fragment); 194 if (!GlobalTraceMap.ContainsKey(parent0)) throw new ArgumentException("Parent information not found"); 195 parents.AddRange(GlobalTraceMap[parent0].Cast<ISymbolicExpressionTree>()); 195 196 } 196 197 } … … 201 202 double a3 = parents.Average(x => x.Length); 202 203 double s1 = CalculateSimilarity(fragments, (int)SymbolicExpressionTreeMatching.SimilarityLevel.Exact); 203 //double s2 = CalculateSimilarity(fragments, (int)SymbolicExpressionTreeMatching.SimilarityLevel.High);204 //double s3 = CalculateSimilarity(fragments, (int)SymbolicExpressionTreeMatching.SimilarityLevel.Relaxed);205 204 206 205 #region Table data 207 206 // fragments 208 207 if (!FragmentStatistics.Rows.ContainsKey("Average fragment length")) { 209 DataRow row = new DataRow("Average fragment length", ""); 210 row.VisualProperties.StartIndexZero = true; 208 var row = new DataRow("Average fragment length", "") { VisualProperties = { StartIndexZero = true } }; 211 209 FragmentStatistics.Rows.Add(row); 212 210 } … … 214 212 // child trees 215 213 if (!FragmentStatistics.Rows.ContainsKey("Average child length")) { 216 DataRow row = new DataRow("Average child length", ""); 217 row.VisualProperties.StartIndexZero = true; 214 var row = new DataRow("Average child length", "") { VisualProperties = { StartIndexZero = true } }; 218 215 FragmentStatistics.Rows.Add(row); 219 216 } … … 221 218 // parents 222 219 if (!FragmentStatistics.Rows.ContainsKey("Average parent length")) { 223 DataRow row = new DataRow("Average parent length", ""); 224 row.VisualProperties.StartIndexZero = true; 220 var row = new DataRow("Average parent length", "") { VisualProperties = { StartIndexZero = true } }; 225 221 FragmentStatistics.Rows.Add(row); 226 222 } … … 228 224 // exact similarity 229 225 if (!FragmentStatistics.Rows.ContainsKey("Similarity (exact)")) { 230 DataRow row = new DataRow("Similarity (exact)", ""); 231 row.VisualProperties.StartIndexZero = true; 226 var row = new DataRow("Similarity (exact)", "") { VisualProperties = { StartIndexZero = true } }; 232 227 FragmentStatistics.Rows.Add(row); 233 228 } 234 229 FragmentStatistics.Rows["Similarity (exact)"].Values.Add(s1); 235 // high similarity236 //if (!FragmentStatistics.Rows.ContainsKey("Similarity (high)")) {237 // DataRow row = new DataRow("Similarity (high)", "");238 // row.VisualProperties.StartIndexZero = true;239 // FragmentStatistics.Rows.Add(row);240 //}241 //FragmentStatistics.Rows["Similarity (high)"].Values.Add(s2);242 //// relaxed similarity243 //if (!FragmentStatistics.Rows.ContainsKey("Similarity (relaxed)")) {244 // DataRow row = new DataRow("Similarity (relaxed)", "");245 // row.VisualProperties.StartIndexZero = true;246 // FragmentStatistics.Rows.Add(row);247 //}248 //FragmentStatistics.Rows["Similarity (relaxed)"].Values.Add(s3);249 230 #endregion 250 231 … … 252 233 253 234 // clear the global maps to save memory 254 GlobalCloneMap.Clear(); 255 GlobalTraceMap.Clear(); 235 if (this.Successor == null || !(this.Successor is SymbolicExpressionTreeGenealogyAnalyzer)) { 236 GlobalCloneMap.Clear(); 237 GlobalTraceMap.Clear(); 238 } 256 239 GlobalFragmentMap.Clear(); 257 240 } … … 315 298 #endregion 316 299 300 /// <summary> 301 /// Provide a measure of how similar the fragments that get passed by crossover from one generation to the next are. 302 /// </summary> 303 /// <param name="fragments">The symbolic expression tree fragments</param> 304 /// <param name="mode">The similarity mode (0 - exact, 1 - high, 2 - relaxed)</param> 305 /// <returns>The average number of similar fragments</returns> 317 306 private double CalculateSimilarity(List<ISymbolicExpressionTreeNode> fragments, int mode) { 318 bool[]visited = new bool[fragments.Count];319 int count= 0;307 var visited = new bool[fragments.Count]; 308 int groups = 0; 320 309 for (int i = 0; i != fragments.Count - 1; ++i) { 321 310 if (visited[i]) continue; … … 324 313 if (fragments[i].IsSimilarTo(fragments[j], mode)) visited[j] = true; 325 314 } 326 ++ count;327 } 328 return (double)fragments.Count / count;315 ++groups; 316 } 317 return (double)fragments.Count / groups; 329 318 } 330 319 #endregion -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Analyzers/SymbolicExpressionTreeGenealogyAnalyzer.cs
r7785 r7792 21 21 22 22 using System; 23 using System.Collections.Generic;24 23 using System.Drawing; 25 24 using System.Globalization; … … 219 218 Results.Add(new Result(PopulationGraphResultParameterName, PopulationGraphResultParameterDescription, graph)); 220 219 } else { 221 //graph = (SymbolicExpressionTreeGenealogyGraph)Results[PopulationGraphResultParameterName].Value;222 220 graph = (SymbolicExpressionTreeGenealogyGraph)(Results[PopulationGraphResultParameterName].Value); 223 221 } … … 233 231 string label; 234 232 if (generation == 0) { 235 // at generation 0 no trace map is present (since no reproduction has taken place yet), so we only add the initial trees as nodes in the genealogy graph 233 // at generation 0 no trace map is present (since no reproduction has taken place yet), 234 // so we only add the initial individuals as nodes in the genealogy graph 236 235 for (int i = 0; i != qualities.Count; ++i) { 237 236 var tree = qualities.ElementAt(i).Key; … … 246 245 var child = qualities.ElementAt(i).Key; 247 246 label = (generation * qualities.Count + i + 1).ToString(CultureInfo.InvariantCulture); 248 if (!graph.HasNode(child)) graph.AddNode(child, qualities[child], label, generation, i < Elites.Value); 247 if (!graph.HasNode(child)) 248 graph.AddNode(child, qualities[child], label, generation, i < Elites.Value); 249 249 if (!GlobalTraceMap.ContainsKey(child)) continue; 250 250 var parents = GlobalTraceMap[child]; … … 264 264 265 265 // clear trace and clone maps in preparation for the next generation 266 GlobalTraceMap.Clear(); 267 GlobalCloneMap.Clear(); 266 if (this.Successor == null || !(this.Successor is SymbolicExpressionTreeFragmentsAnalyzer)) { 267 GlobalTraceMap.Clear(); 268 GlobalCloneMap.Clear(); 269 } 268 270 269 271 #region end of the run (code for writing results to dot files) … … 315 317 } 316 318 317 319 318 320 319 321 private double Evaluate(ISymbolicExpressionTree tree) { -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/GenealogyGraph.cs
r7785 r7792 95 95 /// <param name="rank">The node rank</param> 96 96 /// <param name="elite">Specifies if this node is an elite</param> 97 public void AddNode(T t, double quality = 0.0, string label = "", double rank = 0, bool elite = false , int cutIndex = -1) {97 public void AddNode(T t, double quality = 0.0, string label = "", double rank = 0, bool elite = false) { 98 98 if (HasNode(t)) return; 99 _dictionary[t] = new GenealogyGraphNode { Data = t, Quality = quality, Label = label, IsElite = elite, Rank = rank , CutpointIndex = cutIndex};99 _dictionary[t] = new GenealogyGraphNode { Data = t, Quality = quality, Label = label, IsElite = elite, Rank = rank }; 100 100 } 101 101 … … 103 103 /// more of a low level method to minimize memory usage when creating and returning subgraphs 104 104 /// </summary> 105 /// <param name="n ">The node to be added</param>106 public void AddNode(GenealogyGraphNode n ) {107 var t = (T)n .Data;105 /// <param name="node">The node to be added</param> 106 public void AddNode(GenealogyGraphNode node) { 107 var t = (T)node.Data; 108 108 if (HasNode(t)) return; 109 _dictionary[t] = n ;109 _dictionary[t] = node; 110 110 } 111 111 … … 116 116 public void RemoveNode(T t) { 117 117 if (!_dictionary.ContainsKey(t)) return; 118 GenealogyGraphNode n= _dictionary[t];119 if (n .InEdges != null) {120 foreach (var e in n .InEdges.Where(e => e.Target.OutEdges != null)) {121 e.Target.OutEdges.RemoveAll(arc => arc.Target == n );118 var node = _dictionary[t]; 119 if (node.InEdges != null) { 120 foreach (var e in node.InEdges.Where(e => e.Target.OutEdges != null)) { 121 e.Target.OutEdges.RemoveAll(arc => arc.Target == node); 122 122 if (!e.Target.OutEdges.Any()) 123 123 e.Target.OutEdges = null; // set to null to be a little more memory efficient 124 124 } 125 n .InEdges = null;126 } 127 if (n .OutEdges != null) {128 foreach (var e in n .OutEdges.Where(e => e.Target.InEdges != null)) {129 e.Target.InEdges.RemoveAll(arc => arc.Target == n );125 node.InEdges = null; 126 } 127 if (node.OutEdges != null) { 128 foreach (var e in node.OutEdges.Where(e => e.Target.InEdges != null)) { 129 e.Target.InEdges.RemoveAll(arc => arc.Target == node); 130 130 if (!e.Target.InEdges.Any()) 131 131 e.Target.InEdges = null; // set to null to be a little more memory efficient 132 132 } 133 n .OutEdges = null;133 node.OutEdges = null; 134 134 } 135 135 _dictionary.Remove(t); … … 145 145 /// <param name="a"></param> 146 146 /// <param name="b"></param> 147 /// <param name="label"></param> 148 public void AddArc(T a, T b, int opType = 0) { 147 public void AddArc(T a, T b) { 149 148 GenealogyGraphNode src, dest; 150 149 if (!HasNode(a)) { … … 161 160 } 162 161 // add forward and reverse arcs 163 src.AddForwardArc(dest , opType);164 dest.AddReverseArc(src , opType);165 } 166 167 public void AddArcs(T[] a, T b , int opType = 0) {162 src.AddForwardArc(dest); 163 dest.AddReverseArc(src); 164 } 165 166 public void AddArcs(T[] a, T b) { 168 167 GenealogyGraphNode src, dest; 169 168 if (!HasNode(b)) { … … 180 179 src = _dictionary[o]; 181 180 } 182 src.AddForwardArc(dest , opType);183 dest.AddReverseArc(src , opType);181 src.AddForwardArc(dest); 182 dest.AddReverseArc(src); 184 183 } 185 184 } … … 193 192 public double Quality { get; set; } 194 193 public double Rank { get; set; } 195 public int CutpointIndex { get; set; }196 194 public List<GenealogyGraphArc> InEdges { get; set; } 197 195 public List<GenealogyGraphArc> OutEdges { get; set; } … … 210 208 InEdges = node.InEdges; 211 209 OutEdges = node.OutEdges; 212 CutpointIndex = node.CutpointIndex; 213 } 214 215 /// <summary> 216 /// Returns all the ancestors of the current node 217 /// </summary> 218 /// <returns></returns> 210 } 211 212 /// <summary> 213 /// Performs an upward-breath-traversal of the genealogy graph using the nodes InEdges 214 /// </summary> 215 /// <returns>All the ancestors of the current node</returns> 219 216 public IEnumerable<GenealogyGraphNode> Ancestors() { 220 217 var nodes = new HashSet<GenealogyGraphNode> { this }; … … 236 233 237 234 /// <summary> 238 /// Returns all the descendants of the current node (identical to above method except for using the OutEdges)239 /// </summary> 240 /// <returns> </returns>235 /// Performs a downward-breath-traversal of the genealogy graph using the nodes OutEdges 236 /// </summary> 237 /// <returns>All the descendants of the current node</returns> 241 238 public IEnumerable<GenealogyGraphNode> Descendants() { 242 239 var nodes = new HashSet<GenealogyGraphNode> { this }; … … 257 254 } 258 255 259 public void AddForwardArc(GenealogyGraphNode target , int opType) {260 var e = new GenealogyGraphArc { Target = target , OperatorType = opType};256 public void AddForwardArc(GenealogyGraphNode target) { 257 var e = new GenealogyGraphArc { Target = target }; 261 258 if (OutEdges == null) OutEdges = new List<GenealogyGraphArc> { e }; 262 259 else OutEdges.Add(e); 263 260 } 264 261 265 public void AddReverseArc(GenealogyGraphNode target , int opType) {266 var e = new GenealogyGraphArc { Target = target , OperatorType = opType};262 public void AddReverseArc(GenealogyGraphNode target) { 263 var e = new GenealogyGraphArc { Target = target }; 267 264 if (InEdges == null) InEdges = new List<GenealogyGraphArc> { e }; 268 265 else InEdges.Add(e); … … 289 286 public class GenealogyGraphArc { 290 287 public GenealogyGraphNode Target { get; set; } 291 // OperationType is an identifier for the genetic operation (mutation, crossover) that a graph arc will represent292 // So basically it describes which operator was applied to an individual/graph node (the one emitting the arc),293 // while Target represents the end result of that operator (node ==GeneticOperation==> Target)294 public int OperatorType { get; set; }295 288 // these two fields are not used, but they might be useful later 296 289 public string Label { get; set; } // might be useful later -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Interfaces/IGenealogyGraph.cs
r7779 r7792 30 30 bool Any(Func<KeyValuePair<T, GenealogyGraphNode>, bool> predicate); // graph contains any nodes matching the given predicate? 31 31 void Clear(); // clear graph 32 void AddNode(T t, double quality = 0.0, string label = "", double rank = 0, bool elite = false , int cutIndex = -1);32 void AddNode(T t, double quality = 0.0, string label = "", double rank = 0, bool elite = false); 33 33 void RemoveNode(T t); // remove node if contained in the graph 34 34 GenealogyGraphNode GetNode(T t); // return node corresponding to object t, or null 35 35 // arc operation 36 void AddArc(T source, T target , int opType = 0);37 void AddArcs(T[] a, T b , int opType = 0);36 void AddArc(T source, T target); 37 void AddArcs(T[] a, T b); 38 38 } 39 39 } -
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Selection/3.3/Plugin.cs
r7788 r7792 26 26 /// Plugin class for HeuristicLab.Selection plugin. 27 27 /// </summary> 28 [Plugin("HeuristicLab.Selection", "3.3.6.778 5")]28 [Plugin("HeuristicLab.Selection", "3.3.6.7788")] 29 29 [PluginFile("HeuristicLab.Selection-3.3.dll", PluginFileType.Assembly)] 30 30 [PluginDependency("HeuristicLab.Collections", "3.3")]
Note: See TracChangeset
for help on using the changeset viewer.