13 #ifndef MLPACK_CORE_TREE_COVER_TREE_SINGLE_TREE_TRAVERSER_IMPL_HPP 14 #define MLPACK_CORE_TREE_COVER_TREE_SINGLE_TREE_TRAVERSER_IMPL_HPP 27 typename StatisticType,
29 typename RootPointPolicy
45 return (score < other.
score);
51 typename StatisticType,
53 typename RootPointPolicy
55 template<
typename RuleType>
64 typename StatisticType,
66 typename RootPointPolicy
68 template<
typename RuleType>
71 const size_t queryIndex,
85 std::map<int, std::vector<MapEntryType>, std::greater<int>> mapQueue;
88 double rootChildScore = rule.Score(queryIndex, referenceNode);
90 if (rootChildScore == DBL_MAX)
100 double rootBaseCase = rule.BaseCase(queryIndex, referenceNode.
Point());
112 MapEntryType newFrame;
113 newFrame.node = &referenceNode.
Child(i);
114 newFrame.score = rootChildScore;
115 newFrame.baseCase = rootBaseCase;
116 newFrame.parent = referenceNode.
Point();
119 mapQueue[newFrame.node->Scale()].push_back(newFrame);
124 if (mapQueue.empty())
126 int maxScale = mapQueue.cbegin()->first;
129 while (maxScale != INT_MIN)
132 std::vector<MapEntryType>& scaleVector = mapQueue[maxScale];
135 std::sort(scaleVector.begin(), scaleVector.end());
138 for (
size_t i = 0; i < scaleVector.size(); ++i)
141 const MapEntryType& frame = scaleVector.at(i);
144 const double score = frame.score;
145 const size_t parent = frame.parent;
146 const size_t point = node->
Point();
147 double baseCase = frame.baseCase;
150 if (rule.Rescore(queryIndex, *node, score) == DBL_MAX)
157 const double childScore = rule.Score(queryIndex, *node);
161 if (childScore == DBL_MAX)
173 baseCase = rule.BaseCase(queryIndex, point);
186 MapEntryType newFrame;
187 newFrame.node = &node->
Child(j);
188 newFrame.score = childScore;
189 newFrame.baseCase = baseCase;
190 newFrame.parent = point;
192 mapQueue[newFrame.node->Scale()].push_back(newFrame);
197 mapQueue.erase(maxScale);
198 maxScale = mapQueue.begin()->first;
202 for (
size_t i = 0; i < mapQueue[INT_MIN].size(); ++i)
204 const MapEntryType& frame = mapQueue[INT_MIN].at(i);
207 const double score = frame.score;
208 const size_t point = node->
Point();
211 double rescore = rule.Rescore(queryIndex, *node, score);
213 if (rescore == DBL_MAX)
222 const double actualScore = rule.Score(queryIndex, *node);
224 if (actualScore == DBL_MAX)
235 rule.BaseCase(queryIndex, point);
size_t parent
The index of the parent node.
Definition: single_tree_traverser_impl.hpp:38
bool operator<(const CoverTreeMapEntry &other) const
Comparison operator.
Definition: single_tree_traverser_impl.hpp:43
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
double baseCase
The base case evaluation.
Definition: single_tree_traverser_impl.hpp:40
CoverTree< MetricType, StatisticType, MatType, RootPointPolicy > * node
The node this entry refers to.
Definition: single_tree_traverser_impl.hpp:34
double score
The score of the node.
Definition: single_tree_traverser_impl.hpp:36
size_t Point() const
Get the index of the point which this node represents.
Definition: cover_tree.hpp:286
const CoverTree & Child(const size_t index) const
Get a particular child node.
Definition: cover_tree.hpp:294
size_t NumChildren() const
Get the number of children.
Definition: cover_tree.hpp:301
This is the structure the cover tree map will use for traversal.
Definition: single_tree_traverser_impl.hpp:31
A cover tree is a tree specifically designed to speed up nearest-neighbor computation in high-dimensi...
Definition: cover_tree.hpp:99