Changeset 12979 for branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/TreeMatching
- Timestamp:
- 10/02/15 01:08:30 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/TreeMatching/QueryMatch.cs
r12951 r12979 28 28 // by M. Götz, C. Koch and W. Martens in http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.182.5440 29 29 public class QueryMatch { 30 private List<NodeInfo> dNodes; 31 private List<NodeInfo> qNodes; 32 private readonly ISymbolicExpressionTreeNodeEqualityComparer comparer; 30 public ISymbolicExpressionTreeNodeEqualityComparer Comparer { get; } 33 31 34 32 private QueryMatch() { } … … 41 39 42 40 public QueryMatch(ISymbolicExpressionTreeNodeEqualityComparer comparer) { 43 this.comparer = comparer; 41 this.Comparer = comparer; 42 } 43 44 internal bool Match(List<NodeInfo> data, List<NodeInfo> query) { 45 var dRoot = data.Last(); 46 var qRoot = query.Last(); 47 48 var result = Tmatch(dRoot, query.First(), qRoot); 49 return result == qRoot; 44 50 } 45 51 … … 49 55 50 56 public bool Match(ISymbolicExpressionTreeNode data, ISymbolicExpressionTreeNode query) { 51 if (! comparer.Equals(data, query))57 if (!Comparer.Equals(data, query)) 52 58 return false; 53 59 54 dNodes = InitializePostOrder(data);55 qNodes = InitializePostOrder(query);60 var dNodes = InitializePostOrder(data); 61 var qNodes = InitializePostOrder(query); 56 62 57 63 var dRoot = dNodes.Last(); 58 64 var qRoot = qNodes.Last(); 59 var result = Tmatch(dRoot, qNodes.First(), q Nodes.Last());65 var result = Tmatch(dRoot, qNodes.First(), qRoot); 60 66 return result == qRoot; 67 } 68 69 public IEnumerable<ISymbolicExpressionTree> GetMatchingTrees(IEnumerable<ISymbolicExpressionTree> data, ISymbolicExpressionTree query) { 70 var qRoot = query.Root.GetSubtree(0).GetSubtree(0); 71 var filtered = data.Where(x => x.Length >= query.Length && Comparer.Equals(x.Root.GetSubtree(0).GetSubtree(0), qRoot)); 72 var qNodes = InitializePostOrder(query.Root.GetSubtree(0).GetSubtree(0)); 73 return from d in filtered let dNodes = InitializePostOrder(d.Root.GetSubtree(0).GetSubtree(0)) where Match(dNodes, qNodes) select d; 61 74 } 62 75 … … 66 79 return false; 67 80 68 bool equals = comparer.Equals(a.Node, b.Node);81 bool equals = Comparer.Equals(a.Node, b.Node); 69 82 70 83 if (equals && MatchParents) { … … 74 87 return true; 75 88 if (pa != null && pb != null) 76 return pa.Level == pb.Level && comparer.Equals(pa.Node, pb.Node);89 return pa.Level == pb.Level && Comparer.Equals(pa.Node, pb.Node); 77 90 return false; 78 91 } … … 145 158 } 146 159 147 privateList<NodeInfo> InitializePostOrder(ISymbolicExpressionTreeNode node) {160 internal static List<NodeInfo> InitializePostOrder(ISymbolicExpressionTreeNode node) { 148 161 var list = node.IterateNodesPostfix().ToList(); 149 162 var nodes = list.Select((x, i) => new NodeInfo { Node = x, Index = i, Level = node.GetBranchLevel(x) }).ToList(); … … 171 184 return nodes; 172 185 } 173 174 private class NodeInfo { 175 public ISymbolicExpressionTreeNode Node { get; set; }176 public int Index{ get; set; }177 public int Level{ get; set; }178 public NodeInfo Parent{ get; set; }179 public NodeInfo Previous{ get; set; }180 public NodeInfo PreviousSibling{ get; set; }181 public NodeInfo Next{ get; set; }182 public NodeInfo NextSibling{ get; set; }183 public NodeInfo LastSibling { get; set; }184 public NodeInfo LastChild{ get; set; }185 186 public bool IsLeaf { 187 get { return Node.SubtreeCount == 0; }188 }189 190 public bool IsFirstSibling { 191 get { return Node.Parent != null && Node == Node.Parent.Subtrees.First(); }192 }193 194 public bool IsLastSibling { 195 get { return Node.Parent != null && Node == Node.Parent.Subtrees.Last(); }196 }197 198 public IEnumerable<NodeInfo> Ancestors { 199 get{200 var p = Parent;201 while (p != null) {202 yield return p;203 p = p.Parent;204 }186 } 187 188 internal class NodeInfo { 189 public ISymbolicExpressionTreeNode Node { get; set; } 190 public int Index { get; set; } 191 public int Level { get; set; } 192 public NodeInfo Parent { get; set; } 193 public NodeInfo Previous { get; set; } 194 public NodeInfo PreviousSibling { get; set; } 195 public NodeInfo Next { get; set; } 196 public NodeInfo NextSibling { get; set; } 197 public NodeInfo LastSibling { get; set; } 198 public NodeInfo LastChild { get; set; } 199 200 public bool IsLeaf { 201 get { return Node.SubtreeCount == 0; } 202 } 203 204 public bool IsFirstSibling { 205 get { return Node.Parent != null && Node == Node.Parent.Subtrees.First(); } 206 } 207 208 public bool IsLastSibling { 209 get { return Node.Parent != null && Node == Node.Parent.Subtrees.Last(); } 210 } 211 212 public IEnumerable<NodeInfo> Ancestors { 213 get { 214 var p = Parent; 215 while (p != null) { 216 yield return p; 217 p = p.Parent; 205 218 } 206 219 }
Note: See TracChangeset
for help on using the changeset viewer.