Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/02/15 01:08:30 (9 years ago)
Author:
bburlacu
Message:

#1772:

  • added parameters to the SchemaCreator for calculating things in parallel
  • added parallel code to the SchemaEvaluator
  • implemented quality calculation and saving of estimated values in the scope in the UpdateEstimatedValuesOperator
  • small refactoring of QueryMatch (added some useful methods and made NodeInfo internal)
  • updated query match unit test
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/TreeMatching/QueryMatch.cs

    r12951 r12979  
    2828  // by M. Götz, C. Koch and W. Martens in http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.182.5440
    2929  public class QueryMatch {
    30     private List<NodeInfo> dNodes;
    31     private List<NodeInfo> qNodes;
    32     private readonly ISymbolicExpressionTreeNodeEqualityComparer comparer;
     30    public ISymbolicExpressionTreeNodeEqualityComparer Comparer { get; }
    3331
    3432    private QueryMatch() { }
     
    4139
    4240    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;
    4450    }
    4551
     
    4955
    5056    public bool Match(ISymbolicExpressionTreeNode data, ISymbolicExpressionTreeNode query) {
    51       if (!comparer.Equals(data, query))
     57      if (!Comparer.Equals(data, query))
    5258        return false;
    5359
    54       dNodes = InitializePostOrder(data);
    55       qNodes = InitializePostOrder(query);
     60      var dNodes = InitializePostOrder(data);
     61      var qNodes = InitializePostOrder(query);
    5662
    5763      var dRoot = dNodes.Last();
    5864      var qRoot = qNodes.Last();
    59       var result = Tmatch(dRoot, qNodes.First(), qNodes.Last());
     65      var result = Tmatch(dRoot, qNodes.First(), qRoot);
    6066      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;
    6174    }
    6275
     
    6679        return false;
    6780
    68       bool equals = comparer.Equals(a.Node, b.Node);
     81      bool equals = Comparer.Equals(a.Node, b.Node);
    6982
    7083      if (equals && MatchParents) {
     
    7487          return true;
    7588        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);
    7790        return false;
    7891      }
     
    145158    }
    146159
    147     private List<NodeInfo> InitializePostOrder(ISymbolicExpressionTreeNode node) {
     160    internal static List<NodeInfo> InitializePostOrder(ISymbolicExpressionTreeNode node) {
    148161      var list = node.IterateNodesPostfix().ToList();
    149162      var nodes = list.Select((x, i) => new NodeInfo { Node = x, Index = i, Level = node.GetBranchLevel(x) }).ToList();
     
    171184      return nodes;
    172185    }
    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;
    205218        }
    206219      }
Note: See TracChangeset for help on using the changeset viewer.