bool RectangleTree<MetricType, StatisticType, MatType, SplitType, DescentType>:: DeletePoint(const size_t point) { // It is possible that this will cause a reinsertion, so we need to handle the // levels properly. RectangleTree* root = this; while (root->Parent() != NULL) root = root->Parent(); std::vector<bool> lvls(root->TreeDepth()); for (size_t i = 0; i < lvls.size(); i++) lvls[i] = true; if (numChildren == 0) { for (size_t i = 0; i < count; i++) { if (points[i] == point) { localDataset->col(i) = localDataset->col(--count); // Decrement count. points[i] = points[count]; // This function wil ensure that minFill is satisfied. CondenseTree(dataset->col(point), lvls, true); return true; } } } for (size_t i = 0; i < numChildren; i++) if (children[i]->Bound().Contains(dataset->col(point))) if (children[i]->DeletePoint(point, lvls)) return true; return false; }
bool RectangleTree<MetricType, StatisticType, MatType, SplitType, DescentType, AuxiliaryInformationType>:: DeletePoint(const size_t point) { // It is possible that this will cause a reinsertion, so we need to handle the // levels properly. RectangleTree* root = this; while (root->Parent() != NULL) root = root->Parent(); std::vector<bool> lvls(root->TreeDepth()); for (size_t i = 0; i < lvls.size(); i++) lvls[i] = true; if (numChildren == 0) { for (size_t i = 0; i < count; i++) { if (points[i] == point) { if (!auxiliaryInfo.HandlePointDeletion(this, i)) points[i] = points[--count]; RectangleTree* tree = this; while (tree != NULL) { tree->numDescendants--; tree = tree->Parent(); } // This function wil ensure that minFill is satisfied. CondenseTree(dataset->col(point), lvls, true); return true; } } } for (size_t i = 0; i < numChildren; i++) if (children[i]->Bound().Contains(dataset->col(point))) if (children[i]->DeletePoint(point, lvls)) return true; return false; }