14 #ifndef MLPACK_CORE_TREE_BINARY_SPACE_TREE_BF_DUAL_TREE_TRAVERSER_IMPL_HPP 15 #define MLPACK_CORE_TREE_BINARY_SPACE_TREE_BF_DUAL_TREE_TRAVERSER_IMPL_HPP 23 template<
typename MetricType,
24 typename StatisticType,
26 template<
typename BoundMetricType,
typename...>
class BoundType,
27 template<
typename SplitBoundType,
typename SplitMatType>
29 template<
typename RuleType>
40 template<
typename TreeType,
typename TraversalInfoType>
41 bool operator<(const QueueFrame<TreeType, TraversalInfoType>& a,
44 if (a.queryDepth > b.queryDepth)
46 else if ((a.queryDepth == b.queryDepth) && (a.score > b.score))
51 template<
typename MetricType,
52 typename StatisticType,
54 template<
typename BoundMetricType,
typename...>
class BoundType,
55 template<
typename SplitBoundType,
typename SplitMatType>
57 template<
typename RuleType>
69 traversalInfo = rule.TraversalInfo();
72 const double rootScore = rule.Score(queryRoot, referenceRoot);
73 if (rootScore == DBL_MAX)
76 std::priority_queue<QueueFrameType> queue;
79 rootFrame.queryNode = &queryRoot;
80 rootFrame.referenceNode = &referenceRoot;
81 rootFrame.queryDepth = 0;
82 rootFrame.score = 0.0;
83 rootFrame.traversalInfo = rule.TraversalInfo();
85 queue.push(rootFrame);
91 template<
typename MetricType,
92 typename StatisticType,
94 template<
typename BoundMetricType,
typename...>
class BoundType,
95 template<
typename SplitBoundType,
typename SplitMatType>
97 template<
typename RuleType>
102 std::priority_queue<QueueFrameType>& referenceQueue)
106 std::priority_queue<QueueFrameType> leftChildQueue;
107 std::priority_queue<QueueFrameType> rightChildQueue;
109 while (!referenceQueue.empty())
112 referenceQueue.pop();
116 typename RuleType::TraversalInfoType ti = currentFrame.traversalInfo;
117 rule.TraversalInfo() = ti;
118 const size_t queryDepth = currentFrame.queryDepth;
120 double score = rule.Score(queryNode, referenceNode);
123 if (score == DBL_MAX)
133 const size_t queryEnd = queryNode.
Begin() + queryNode.
Count();
134 const size_t refEnd = referenceNode.
Begin() + referenceNode.
Count();
135 for (
size_t query = queryNode.
Begin(); query < queryEnd; ++query)
145 for (
size_t ref = referenceNode.
Begin(); ref < refEnd; ++ref)
146 rule.BaseCase(query, ref);
148 numBaseCases += referenceNode.
Count();
151 else if ((!queryNode.
IsLeaf()) && referenceNode.
IsLeaf())
155 score, rule.TraversalInfo() };
156 leftChildQueue.push(fl);
160 rightChildQueue.push(fr);
162 else if (queryNode.
IsLeaf() && (!referenceNode.
IsLeaf()))
168 score, rule.TraversalInfo() };
169 referenceQueue.push(fl);
173 referenceQueue.push(fr);
182 queryDepth + 1, score, rule.TraversalInfo() };
183 leftChildQueue.push(fll);
186 queryDepth + 1, score, rule.TraversalInfo() };
187 leftChildQueue.push(flr);
190 queryDepth + 1, score, rule.TraversalInfo() };
191 rightChildQueue.push(frl);
194 queryDepth + 1, score, rule.TraversalInfo() };
195 rightChildQueue.push(frr);
201 if (leftChildQueue.size() > 0)
203 if (rightChildQueue.size() > 0)
210 #endif // MLPACK_CORE_TREE_BINARY_SPACE_TREE_BF_DUAL_TREE_TRAVERSER_IMPL_HPP Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
size_t Count() const
Return the number of points in this subset.
Definition: binary_space_tree.hpp:503
BreadthFirstDualTreeTraverser(RuleType &rule)
Instantiate the dual-tree traverser with the given rule set.
Definition: breadth_first_dual_tree_traverser_impl.hpp:31
BinarySpaceTree * Right() const
Gets the right child of this node.
Definition: binary_space_tree.hpp:337
A binary space partitioning tree, such as a KD-tree or a ball tree.
Definition: binary_space_tree.hpp:54
Definition: breadth_first_dual_tree_traverser.hpp:27
BinarySpaceTree * Left() const
Gets the left child of this node.
Definition: binary_space_tree.hpp:332
bool IsLeaf() const
Return whether or not this node is a leaf (true if it has no children).
Definition: binary_space_tree_impl.hpp:594
size_t Begin() const
Return the index of the beginning point of this subset.
Definition: binary_space_tree.hpp:498
void Traverse(BinarySpaceTree &queryNode, BinarySpaceTree &referenceNode)
Traverse the two trees.
Definition: breadth_first_dual_tree_traverser_impl.hpp:59