14 #ifndef MLPAC_CORE_TREE_RECTANGLE_TREE_DUAL_TREE_TRAVERSER_IMPL_HPP 15 #define MLPAC_CORE_TREE_RECTANGLE_TREE_DUAL_TREE_TRAVERSER_IMPL_HPP 25 template<
typename MetricType,
26 typename StatisticType,
30 template<
typename>
class AuxiliaryInformationType>
31 template<
typename RuleType>
32 RectangleTree<MetricType, StatisticType, MatType, SplitType, DescentType,
33 AuxiliaryInformationType>::
34 DualTreeTraverser<RuleType>::DualTreeTraverser(RuleType& rule) :
42 template<
typename MetricType,
43 typename StatisticType,
47 template<
typename>
class AuxiliaryInformationType>
48 template<
typename RuleType>
50 AuxiliaryInformationType>
:: 58 traversalInfo = rule.TraversalInfo();
71 for (
size_t query = 0; query < queryNode.
Count(); ++query)
74 rule.TraversalInfo() = traversalInfo;
75 const double childScore = rule.Score(queryNode.
Point(query),
78 if (childScore == DBL_MAX)
81 for (
size_t ref = 0; ref < referenceNode.
Count(); ++ref)
82 rule.BaseCase(queryNode.
Point(query), referenceNode.
Point(ref));
84 numBaseCases += referenceNode.
Count();
90 for (
size_t i = 0; i < queryNode.
NumChildren(); ++i)
93 rule.TraversalInfo() = traversalInfo;
95 if (rule.Score(queryNode.
Child(i), referenceNode) < DBL_MAX)
107 std::vector<NodeAndScore> nodesAndScores(referenceNode.
NumChildren());
108 for (
size_t i = 0; i < referenceNode.
NumChildren(); ++i)
110 rule.TraversalInfo() = traversalInfo;
111 nodesAndScores[i].node = &(referenceNode.
Child(i));
112 nodesAndScores[i].score = rule.Score(queryNode,
113 *(nodesAndScores[i].node));
114 nodesAndScores[i].travInfo = rule.TraversalInfo();
116 std::sort(nodesAndScores.begin(), nodesAndScores.end(), nodeComparator);
117 numScores += nodesAndScores.size();
119 for (
size_t i = 0; i < nodesAndScores.size(); ++i)
121 rule.TraversalInfo() = nodesAndScores[i].travInfo;
122 if (rule.Rescore(queryNode, *(nodesAndScores[i].node),
123 nodesAndScores[i].score) < DBL_MAX)
125 Traverse(queryNode, *(nodesAndScores[i].node));
129 numPrunes += nodesAndScores.size() - i;
139 for (
size_t j = 0; j < queryNode.
NumChildren(); ++j)
142 std::vector<NodeAndScore> nodesAndScores(referenceNode.
NumChildren());
143 for (
size_t i = 0; i < referenceNode.
NumChildren(); ++i)
145 rule.TraversalInfo() = traversalInfo;
146 nodesAndScores[i].node = &(referenceNode.
Child(i));
147 nodesAndScores[i].score = rule.Score(queryNode.
Child(j),
148 *nodesAndScores[i].node);
149 nodesAndScores[i].travInfo = rule.TraversalInfo();
151 std::sort(nodesAndScores.begin(), nodesAndScores.end(), nodeComparator);
152 numScores += nodesAndScores.size();
154 for (
size_t i = 0; i < nodesAndScores.size(); ++i)
156 rule.TraversalInfo() = nodesAndScores[i].travInfo;
157 if (rule.Rescore(queryNode.
Child(j), *(nodesAndScores[i].node),
158 nodesAndScores[i].score) < DBL_MAX)
164 numPrunes += nodesAndScores.size() - i;
size_t Point(const size_t index) const
Return the index (with reference to the dataset) of a particular point in this node.
Definition: rectangle_tree.hpp:480
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
friend DescentType
Give friend access for DescentType.
Definition: rectangle_tree.hpp:580
size_t NumChildren() const
Return the number of child nodes. (One level beneath this one only.)
Definition: rectangle_tree.hpp:371
friend SplitType
Give friend access for SplitType.
Definition: rectangle_tree.hpp:583
void Traverse(RectangleTree &queryNode, RectangleTree &referenceNode)
Traverse the two trees.
Definition: dual_tree_traverser_impl.hpp:51
A rectangle type tree tree, such as an R-tree or X-tree.
Definition: rectangle_tree.hpp:54
A dual tree traverser for rectangle type trees.
Definition: dual_tree_traverser.hpp:31
bool IsLeaf() const
Return whether or not this node is a leaf (true if it has no children).
Definition: rectangle_tree_impl.hpp:760
RectangleTree & Child(const size_t child) const
Get the specified child.
Definition: rectangle_tree.hpp:437
size_t Count() const
Return the number of points in this subset.
Definition: rectangle_tree.hpp:548