12 #ifndef MLPACK_CORE_TREE_RECTANGLE_TREE_HILBERT_R_TREE_SPLIT_IMPL_HPP 13 #define MLPACK_CORE_TREE_RECTANGLE_TREE_HILBERT_R_TREE_SPLIT_IMPL_HPP 22 template<
size_t splitOrder>
23 template<
typename TreeType>
25 std::vector<bool>& relevels)
27 if (tree->Count() <= tree->MaxLeafSize())
32 if (tree->Parent() == NULL)
35 TreeType* copy =
new TreeType(*tree,
false);
37 copy->AuxiliaryInfo().HilbertValue().OwnsValueToInsert() =
false;
39 tree->AuxiliaryInfo().HilbertValue().OwnsLocalHilbertValues() =
false;
40 copy->Parent() = tree;
44 tree->children[(tree->NumChildren())++] = copy;
45 SplitLeafNode(copy, relevels);
49 TreeType* parent = tree->Parent();
51 for (iTree = 0; parent->children[iTree] != tree; iTree++) { }
55 size_t firstSibling, lastSibling;
56 if (FindCooperatingSiblings(parent, iTree, firstSibling, lastSibling))
58 RedistributePointsEvenly(parent, firstSibling, lastSibling);
64 size_t iNewSibling = (iTree + splitOrder < parent->NumChildren() ?
65 iTree + splitOrder : parent->NumChildren());
67 for (
size_t i = parent->NumChildren(); i > iNewSibling ; i--)
68 parent->children[i] = parent->children[i - 1];
70 parent->NumChildren()++;
72 parent->children[iNewSibling] =
new TreeType(parent);
74 lastSibling = (iTree + splitOrder < parent->NumChildren() ?
75 iTree + splitOrder : parent->NumChildren() - 1);
76 firstSibling = (lastSibling > splitOrder ? lastSibling - splitOrder : 0);
78 assert(lastSibling - firstSibling <= splitOrder);
79 assert(lastSibling < parent->NumChildren());
82 RedistributePointsEvenly(parent, firstSibling, lastSibling);
84 if (parent->NumChildren() == parent->MaxNumChildren() + 1)
85 SplitNonLeafNode(parent, relevels);
88 template<
size_t splitOrder>
89 template<
typename TreeType>
96 if (tree->Parent() == NULL)
99 TreeType* copy =
new TreeType(*tree,
false);
101 copy->AuxiliaryInfo().HilbertValue().OwnsValueToInsert() =
false;
102 copy->Parent() = tree;
103 tree->NumChildren() = 0;
105 tree->children[(tree->NumChildren())++] = copy;
107 SplitNonLeafNode(copy, relevels);
111 TreeType* parent = tree->Parent();
114 for (iTree = 0; parent->children[iTree] != tree; iTree++) { }
118 size_t firstSibling, lastSibling;
119 if (FindCooperatingSiblings(parent, iTree, firstSibling, lastSibling))
121 RedistributeNodesEvenly(parent, firstSibling, lastSibling);
127 size_t iNewSibling = (iTree + splitOrder < parent->NumChildren() ?
128 iTree + splitOrder : parent->NumChildren());
130 for (
size_t i = parent->NumChildren(); i > iNewSibling ; i--)
131 parent->children[i] = parent->children[i - 1];
133 parent->NumChildren()++;
135 parent->children[iNewSibling] =
new TreeType(parent);
137 lastSibling = (iTree + splitOrder < parent->NumChildren() ?
138 iTree + splitOrder : parent->NumChildren() - 1);
139 firstSibling = (lastSibling > splitOrder ?
140 lastSibling - splitOrder : 0);
142 assert(lastSibling - firstSibling <= splitOrder);
143 assert(lastSibling < parent->NumChildren());
146 RedistributeNodesEvenly(parent, firstSibling, lastSibling);
148 if (parent->NumChildren() == parent->MaxNumChildren() + 1)
149 SplitNonLeafNode(parent, relevels);
153 template<
size_t splitOrder>
154 template<
typename TreeType>
158 size_t& firstSibling,
161 size_t start = (iTree > splitOrder - 1 ? iTree - splitOrder + 1 : 0);
162 size_t end = (iTree + splitOrder <= parent->NumChildren() ?
163 iTree + splitOrder : parent->NumChildren());
165 size_t iUnderfullSibling;
168 if (parent->Child(iTree).NumChildren() != 0)
170 for (iUnderfullSibling = start; iUnderfullSibling < end;
172 if (parent->Child(iUnderfullSibling).NumChildren() <
173 parent->Child(iUnderfullSibling).MaxNumChildren() - 1)
178 for (iUnderfullSibling = start; iUnderfullSibling < end;
180 if (parent->Child(iUnderfullSibling).NumPoints() <
181 parent->Child(iUnderfullSibling).MaxLeafSize() - 1)
185 if (iUnderfullSibling == end)
188 if (iUnderfullSibling > iTree)
190 lastSibling = (iTree + splitOrder - 1 < parent->NumChildren() ?
191 iTree + splitOrder - 1 : parent->NumChildren() - 1);
192 firstSibling = (lastSibling > splitOrder - 1 ?
193 lastSibling - splitOrder + 1 : 0);
197 lastSibling = (iUnderfullSibling + splitOrder - 1 < parent->NumChildren() ?
198 iUnderfullSibling + splitOrder - 1 : parent->NumChildren() - 1);
199 firstSibling = (lastSibling > splitOrder - 1 ?
200 lastSibling - splitOrder + 1 : 0);
203 assert(lastSibling - firstSibling <= splitOrder - 1);
204 assert(lastSibling < parent->NumChildren());
209 template<
size_t splitOrder>
210 template<
typename TreeType>
213 size_t firstSibling,
size_t lastSibling)
215 size_t numChildren = 0;
216 size_t numChildrenPerNode, numRestChildren;
218 for (
size_t i = firstSibling; i <= lastSibling; ++i)
219 numChildren += parent->Child(i).NumChildren();
221 numChildrenPerNode = numChildren / (lastSibling - firstSibling + 1);
222 numRestChildren = numChildren % (lastSibling - firstSibling + 1);
224 std::vector<TreeType*> children(numChildren);
228 for (
size_t i = firstSibling; i <= lastSibling; ++i)
230 for (
size_t j = 0; j < parent->Child(i).NumChildren(); ++j)
232 children[iChild] = parent->Child(i).children[j];
238 for (
size_t i = firstSibling; i <= lastSibling; ++i)
242 parent->Child(i).Bound().Clear();
243 parent->Child(i).numDescendants = 0;
245 for (
size_t j = 0; j < numChildrenPerNode; ++j)
247 parent->Child(i).Bound() |= children[iChild]->Bound();
248 parent->Child(i).numDescendants += children[iChild]->numDescendants;
249 parent->Child(i).children[j] = children[iChild];
250 children[iChild]->Parent() = parent->children[i];
253 if (numRestChildren > 0)
255 parent->Child(i).Bound() |= children[iChild]->Bound();
256 parent->Child(i).numDescendants += children[iChild]->numDescendants;
257 parent->Child(i).children[numChildrenPerNode] = children[iChild];
258 children[iChild]->Parent() = parent->children[i];
259 parent->Child(i).NumChildren() = numChildrenPerNode + 1;
265 parent->Child(i).NumChildren() = numChildrenPerNode;
267 assert(parent->Child(i).NumChildren() <=
268 parent->Child(i).MaxNumChildren());
271 parent->Child(i).AuxiliaryInfo().HilbertValue().UpdateLargestValue(
272 parent->children[i]);
276 template<
size_t splitOrder>
277 template<
typename TreeType>
280 const size_t firstSibling,
281 const size_t lastSibling)
283 size_t numPoints = 0;
284 size_t numPointsPerNode, numRestPoints;
286 for (
size_t i = firstSibling; i <= lastSibling; ++i)
287 numPoints += parent->Child(i).NumPoints();
289 numPointsPerNode = numPoints / (lastSibling - firstSibling + 1);
290 numRestPoints = numPoints % (lastSibling - firstSibling + 1);
292 std::vector<size_t> points(numPoints);
296 for (
size_t i = firstSibling; i <= lastSibling; ++i)
298 for (
size_t j = 0; j < parent->Child(i).NumPoints(); ++j)
299 points[iPoint++] = parent->Child(i).Point(j);
303 for (
size_t i = firstSibling; i <= lastSibling; ++i)
307 parent->Child(i).Bound().Clear();
310 for (j = 0; j < numPointsPerNode; ++j)
312 parent->Child(i).Bound() |= parent->Dataset().col(points[iPoint]);
313 parent->Child(i).Point(j) = points[iPoint];
316 if (numRestPoints > 0)
318 parent->Child(i).Bound() |= parent->Dataset().col(points[iPoint]);
319 parent->Child(i).Point(j) = points[iPoint];
320 parent->Child(i).Count() = numPointsPerNode + 1;
326 parent->Child(i).Count() = numPointsPerNode;
328 parent->Child(i).numDescendants = parent->Child(i).Count();
330 assert(parent->Child(i).NumPoints() <=
331 parent->Child(i).MaxLeafSize());
335 parent->AuxiliaryInfo().HilbertValue().RedistributeHilbertValues(parent,
336 firstSibling, lastSibling);
338 TreeType* root = parent;
342 root->AuxiliaryInfo().HilbertValue().UpdateLargestValue(root);
343 root = root->Parent();
350 #endif // MLPACK_CORE_TREE_RECTANGLE_TREE_HILBERT_R_TREE_SPLIT_IMPL_HPP Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
The splitting procedure for the Hilbert R tree.
Definition: hilbert_r_tree_split.hpp:29
static bool SplitNonLeafNode(TreeType *tree, std::vector< bool > &relevels)
Split a non-leaf node using the "default" algorithm.
Definition: hilbert_r_tree_split_impl.hpp:91
static void SplitLeafNode(TreeType *tree, std::vector< bool > &relevels)
Split a leaf node using the "default" algorithm.
Definition: hilbert_r_tree_split_impl.hpp:24
Definition of the Range class, which represents a simple range with a lower and upper bound...