Changeset 11225 for branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SimilarityCalculators/BottomUpSimilarityCalculator.cs
- Timestamp:
- 07/24/14 23:44:39 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SimilarityCalculators/BottomUpSimilarityCalculator.cs
r11224 r11225 77 77 var reverseMap = new Dictionary<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>(); // nodes of t2 => nodes of t1 78 78 79 foreach (var v in IterateBreadthOrdered(n1)) { 80 if (forwardMap.ContainsKey(v)) continue; 79 // visit nodes in order of decreasing height to ensure correct mapping 80 foreach (var v in n1.IterateNodesPrefix().OrderByDescending(x => compactedGraph[x].Weight)) { 81 if (forwardMap.ContainsKey(v)) 82 continue; 81 83 var kv = compactedGraph[v]; 82 84 ISymbolicExpressionTreeNode w = null; 83 foreach (var t in IterateBreadthOrdered(n2)) { 84 if (reverseMap.ContainsKey(t) || compactedGraph[t] != kv) continue; 85 foreach (var t in n2.IterateNodesPrefix()) { 86 if (reverseMap.ContainsKey(t) || compactedGraph[t] != kv) 87 continue; 85 88 w = t; 86 89 break; … … 96 99 var s = eV.Current; 97 100 var t = eW.Current; 98 if (reverseMap.ContainsKey(t)) 99 throw new Exception("Mapping already present"); 101 102 if (reverseMap.ContainsKey(t)) { 103 throw new Exception("A mapping to this node already exists."); 104 } 105 100 106 forwardMap[s] = t; 101 107 reverseMap[t] = s; … … 124 130 if (n.SubtreeCount == 0) { 125 131 var label = n.ToString(); 126 var z = new Vertex { Content = n, Label = label }; 127 labelsToVertices[z.Label] = z; 128 vertices.Add(z); 132 if (!labelsToVertices.ContainsKey(label)) { 133 var z = new Vertex { Content = n, Label = label }; 134 labelsToVertices[z.Label] = z; 135 vertices.Add(z); 136 } 137 nodesToVertices[n] = labelsToVertices[label]; 129 138 queue.Enqueue(n); 130 139 } else { … … 135 144 while (queue.Any()) { 136 145 var v = queue.Dequeue(); 137 string label; 138 if (v.SubtreeCount == 0) { 139 label = v.ToString(); 140 nodesToVertices[v] = labelsToVertices[label]; // 18 141 } else { 142 label = v.Symbol.Name; 146 147 if (v.SubtreeCount > 0) { 148 var label = v.Symbol.Name; 143 149 bool found = false; 144 150 var height = v.GetDepth(); … … 152 158 var w = vertices[i]; 153 159 var n = (ISymbolicExpressionTreeNode)w.Content; 154 if (n.SubtreeCount == 0) continue; // v is a function node so w will have to be a function node as well 155 if (height != (int)w.Weight || v.SubtreeCount != n.SubtreeCount || label != w.Label) 160 if (v.SubtreeCount != n.SubtreeCount || label != w.Label || height != (int)w.Weight) 156 161 continue; 157 162 158 163 // sort V and W when the symbol is commutative because we are dealing with unordered trees 159 var wSubtrees = sort ? w.OutArcs.Select(x => x.Target).OrderBy(x => x.Label)160 : w.OutArcs.Select(x => x.Target);164 var wSubtrees = n.Subtrees.Select(x => nodesToVertices[x]).ToList(); 165 if (sort) wSubtrees.Sort((a, b) => String.Compare(a.Label, b.Label, StringComparison.Ordinal)); 161 166 162 167 if (vSubtrees.SequenceEqual(wSubtrees)) {
Note: See TracChangeset
for help on using the changeset viewer.