void CheckContainment(const TreeType& tree) { if (tree.NumChildren() == 0) { for (size_t i = 0; i < tree.Count(); i++) BOOST_REQUIRE(tree.Bound().Contains( tree.Dataset().unsafe_col(tree.Points()[i]))); } else { for (size_t i = 0; i < tree.NumChildren(); i++) { for (size_t j = 0; j < tree.Bound().Dim(); j++) BOOST_REQUIRE(tree.Bound()[j].Contains(tree.Children()[i]->Bound()[j])); CheckContainment(*(tree.Children()[i])); } } }
int GetMinLevel(const TreeType& tree) { int min = 1; if (!tree.IsLeaf()) { int m = INT_MAX; for (size_t i = 0; i < tree.NumChildren(); i++) { int n = GetMinLevel(*tree.Children()[i]); if (n < m) m = n; } min += m; } return min; }
int GetMaxLevel(const TreeType& tree) { int max = 1; if (!tree.IsLeaf()) { int m = 0; for (size_t i = 0; i < tree.NumChildren(); i++) { int n = GetMaxLevel(*tree.Children()[i]); if (n > m) m = n; } max += m; } return max; }
void CheckFills(const TreeType& tree) { if (tree.IsLeaf()) { BOOST_REQUIRE(tree.Count() >= tree.MinLeafSize() || tree.Parent() == NULL); BOOST_REQUIRE(tree.Count() <= tree.MaxLeafSize()); } else { for (size_t i = 0; i < tree.NumChildren(); i++) { BOOST_REQUIRE(tree.NumChildren() >= tree.MinNumChildren() || tree.Parent() == NULL); BOOST_REQUIRE(tree.NumChildren() <= tree.MaxNumChildren()); CheckFills(*tree.Children()[i]); } } }
void CheckSync(const TreeType& tree) { if (tree.IsLeaf()) { for (size_t i = 0; i < tree.Count(); i++) { for (size_t j = 0; j < tree.LocalDataset().n_rows; j++) { BOOST_REQUIRE_EQUAL(tree.LocalDataset().col(i)[j], tree.Dataset().col(tree.Points()[i])[j]); } } } else { for (size_t i = 0; i < tree.NumChildren(); i++) CheckSync(*tree.Children()[i]); } }
std::vector<arma::vec*> GetAllPointsInTree(const TreeType& tree) { std::vector<arma::vec*> vec; if (tree.NumChildren() > 0) { for (size_t i = 0; i < tree.NumChildren(); i++) { std::vector<arma::vec*> tmp = GetAllPointsInTree(*(tree.Children()[i])); vec.insert(vec.begin(), tmp.begin(), tmp.end()); } } else { for (size_t i = 0; i < tree.Count(); i++) { arma::vec* c = new arma::vec(tree.Dataset().col(tree.Points()[i])); vec.push_back(c); } } return vec; }