void NSModel<SortPolicy>::BuildModel(arma::mat&& referenceSet, const size_t leafSize, const bool naive, const bool singleMode, const double epsilon) { // Initialize random basis if necessary. if (randomBasis) { Log::Info << "Creating random basis..." << std::endl; while (true) { // [Q, R] = qr(randn(d, d)); // Q = Q * diag(sign(diag(R))); arma::mat r; if (arma::qr(q, r, arma::randn<arma::mat>(referenceSet.n_rows, referenceSet.n_rows))) { arma::vec rDiag(r.n_rows); for (size_t i = 0; i < rDiag.n_elem; ++i) { if (r(i, i) < 0) rDiag(i) = -1; else if (r(i, i) > 0) rDiag(i) = 1; else rDiag(i) = 0; } q *= arma::diagmat(rDiag); // Check if the determinant is positive. if (arma::det(q) >= 0) break; } } } // Clean memory, if necessary. boost::apply_visitor(DeleteVisitor(), nSearch); // Do we need to modify the reference set? if (randomBasis) referenceSet = q * referenceSet; if (!naive) { Timer::Start("tree_building"); Log::Info << "Building reference tree..." << std::endl; } switch (treeType) { case KD_TREE: nSearch = new NSType<SortPolicy, tree::KDTree>(naive, singleMode, epsilon); break; case COVER_TREE: nSearch = new NSType<SortPolicy, tree::StandardCoverTree>(naive, singleMode, epsilon); break; case R_TREE: nSearch = new NSType<SortPolicy, tree::RTree>(naive, singleMode, epsilon); break; case R_STAR_TREE: nSearch = new NSType<SortPolicy, tree::RStarTree>(naive, singleMode, epsilon); break; case BALL_TREE: nSearch = new NSType<SortPolicy, tree::BallTree>(naive, singleMode, epsilon); break; case X_TREE: nSearch = new NSType<SortPolicy, tree::XTree>(naive, singleMode, epsilon); break; case HILBERT_R_TREE: nSearch = new NSType<SortPolicy, tree::HilbertRTree>(naive, singleMode, epsilon); break; case R_PLUS_TREE: nSearch = new NSType<SortPolicy, tree::RPlusTree>(naive, singleMode, epsilon); break; case R_PLUS_PLUS_TREE: nSearch = new NSType<SortPolicy, tree::RPlusPlusTree>(naive, singleMode, epsilon); break; } TrainVisitor<SortPolicy> tn(std::move(referenceSet), leafSize); boost::apply_visitor(tn, nSearch); if (!naive) { Timer::Stop("tree_building"); Log::Info << "Tree built." << std::endl; } }
void NSModel<SortPolicy>::BuildModel(arma::mat&& referenceSet, const size_t leafSize, const NeighborSearchMode searchMode, const double epsilon) { this->leafSize = leafSize; // Initialize random basis if necessary. if (randomBasis) { Log::Info << "Creating random basis..." << std::endl; while (true) { // [Q, R] = qr(randn(d, d)); // Q = Q * diag(sign(diag(R))); arma::mat r; if (arma::qr(q, r, arma::randn<arma::mat>(referenceSet.n_rows, referenceSet.n_rows))) { arma::vec rDiag(r.n_rows); for (size_t i = 0; i < rDiag.n_elem; ++i) { if (r(i, i) < 0) rDiag(i) = -1; else if (r(i, i) > 0) rDiag(i) = 1; else rDiag(i) = 0; } q *= arma::diagmat(rDiag); // Check if the determinant is positive. if (arma::det(q) >= 0) break; } } } // Clean memory, if necessary. boost::apply_visitor(DeleteVisitor(), nSearch); // Do we need to modify the reference set? if (randomBasis) referenceSet = q * referenceSet; if (searchMode != NAIVE_MODE) { Timer::Start("tree_building"); Log::Info << "Building reference tree..." << std::endl; } switch (treeType) { case KD_TREE: nSearch = new NSType<SortPolicy, tree::KDTree>(searchMode, epsilon); break; case COVER_TREE: nSearch = new NSType<SortPolicy, tree::StandardCoverTree>(searchMode, epsilon); break; case R_TREE: nSearch = new NSType<SortPolicy, tree::RTree>(searchMode, epsilon); break; case R_STAR_TREE: nSearch = new NSType<SortPolicy, tree::RStarTree>(searchMode, epsilon); break; case BALL_TREE: <<<<<<< HEAD // If necessary, build the ball tree. if (naive) { ballTreeNS = new NSType<tree::BallTree>(std::move(referenceSet), naive, singleMode); } else { std::vector<size_t> oldFromNewReferences; typename NSType<tree::BallTree>::Tree* ballTree = new typename NSType<tree::BallTree>::Tree(std::move(referenceSet), oldFromNewReferences, leafSize); ballTreeNS = new NSType<tree::BallTree>(ballTree, singleMode); // Give the model ownership of the tree and the mappings. ballTreeNS->treeOwner = true; ballTreeNS->oldFromNewReferences = std::move(oldFromNewReferences); } ======= nSearch = new NSType<SortPolicy, tree::BallTree>(searchMode, epsilon); >>>>>>> mlpack/master