mlpack
spill_single_tree_traverser_impl.hpp
Go to the documentation of this file.
1 
15 #ifndef MLPACK_CORE_TREE_SPILL_TREE_SPILL_SINGLE_TREE_TRAVERSER_IMPL_HPP
16 #define MLPACK_CORE_TREE_SPILL_TREE_SPILL_SINGLE_TREE_TRAVERSER_IMPL_HPP
17 
18 // In case it hasn't been included yet.
20 
21 namespace mlpack {
22 namespace tree {
23 
24 template<typename MetricType,
25  typename StatisticType,
26  typename MatType,
27  template<typename HyperplaneMetricType> class HyperplaneType,
28  template<typename SplitMetricType, typename SplitMatType>
29  class SplitType>
30 template<typename RuleType, bool Defeatist>
33  RuleType& rule) :
34  rule(rule),
35  numPrunes(0)
36 { /* Nothing to do. */ }
37 
38 template<typename MetricType,
39  typename StatisticType,
40  typename MatType,
41  template<typename HyperplaneMetricType> class HyperplaneType,
42  template<typename SplitMetricType, typename SplitMatType>
43  class SplitType>
44 template<typename RuleType, bool Defeatist>
47  const size_t queryIndex,
49  referenceNode,
50  const bool bruteForce)
51 {
52  // If we have too few points, then we need to backtrack up one level and
53  // brute-force search.
54  if (!bruteForce && Defeatist &&
55  (referenceNode.NumDescendants() < rule.MinimumBaseCases()) &&
56  (referenceNode.Parent() != NULL) &&
57  (referenceNode.Parent()->Overlap()))
58  {
59  Traverse(queryIndex, *referenceNode.Parent(), true);
60  }
61  else if (referenceNode.IsLeaf() || bruteForce)
62  {
63  for (size_t i = 0; i < referenceNode.NumDescendants(); ++i)
64  rule.BaseCase(queryIndex, referenceNode.Descendant(i));
65  }
66  else
67  {
68  if (Defeatist && referenceNode.Overlap())
69  {
70  // If referenceNode is a overlapping node we do defeatist search.
71  size_t bestChild = rule.GetBestChild(queryIndex, referenceNode);
72  Traverse(queryIndex, referenceNode.Child(bestChild));
73  ++numPrunes;
74  }
75  else
76  {
77  // If either score is DBL_MAX, we do not recurse into that node.
78  double leftScore = rule.Score(queryIndex, *referenceNode.Left());
79  double rightScore = rule.Score(queryIndex, *referenceNode.Right());
80 
81  if (leftScore < rightScore)
82  {
83  // Recurse to the left.
84  Traverse(queryIndex, *referenceNode.Left());
85 
86  // Is it still valid to recurse to the right?
87  rightScore = rule.Rescore(queryIndex, *referenceNode.Right(),
88  rightScore);
89 
90  if (rightScore != DBL_MAX) // Recurse to the right.
91  Traverse(queryIndex, *referenceNode.Right());
92  else
93  ++numPrunes;
94  }
95  else if (rightScore < leftScore)
96  {
97  // Recurse to the right.
98  Traverse(queryIndex, *referenceNode.Right());
99 
100  // Is it still valid to recurse to the left?
101  leftScore = rule.Rescore(queryIndex, *referenceNode.Left(), leftScore);
102 
103  if (leftScore != DBL_MAX) // Recurse to the left.
104  Traverse(queryIndex, *referenceNode.Left());
105  else
106  ++numPrunes;
107  }
108  else // leftScore is equal to rightScore.
109  {
110  if (leftScore == DBL_MAX)
111  {
112  numPrunes += 2; // Pruned both left and right.
113  }
114  else
115  {
116  // Choose the left first.
117  Traverse(queryIndex, *referenceNode.Left());
118 
119  // Is it still valid to recurse to the right?
120  rightScore = rule.Rescore(queryIndex, *referenceNode.Right(),
121  rightScore);
122 
123  if (rightScore != DBL_MAX)
124  Traverse(queryIndex, *referenceNode.Right());
125  else
126  ++numPrunes;
127  }
128  }
129  }
130  }
131 }
132 
133 } // namespace tree
134 } // namespace mlpack
135 
136 #endif
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
SpillTree & Child(const size_t child) const
Return the specified child (0 will be left, 1 will be right).
Definition: spill_tree_impl.hpp:631
void Traverse(const size_t queryIndex, SpillTree &referenceNode, const bool bruteForce=false)
Traverse the tree with the given point.
Definition: spill_single_tree_traverser_impl.hpp:46
SpillTree * Right() const
Gets the right child of this node.
Definition: spill_tree.hpp:262
A hybrid spill tree is a variant of binary space trees in which the children of a node can "spill ove...
Definition: spill_tree.hpp:73
bool Overlap() const
Distinguish overlapping nodes from non-overlapping nodes.
Definition: spill_tree.hpp:275
size_t NumDescendants() const
Return the number of descendants of this node.
Definition: spill_tree_impl.hpp:666
SpillTree * Parent() const
Gets the parent of this node.
Definition: spill_tree.hpp:267
SpillTree * Left() const
Gets the left child of this node.
Definition: spill_tree.hpp:257
bool IsLeaf() const
Return whether or not this node is a leaf (true if it has no children).
Definition: spill_tree_impl.hpp:433
size_t Descendant(const size_t index) const
Return the index (with reference to the dataset) of a particular descendant of this node...
Definition: spill_tree_impl.hpp:681
SpillSingleTreeTraverser(RuleType &rule)
Instantiate the single tree traverser with the given rule set.
Definition: spill_single_tree_traverser_impl.hpp:32