void RAModel<SortPolicy>::Search(const size_t k, arma::Mat<size_t>& neighbors, arma::mat& distances) { Log::Info << "Searching for " << k << " approximate nearest neighbors with "; if (!Naive() && !SingleMode()) Log::Info << "dual-tree rank-approximate " << TreeName() << " search..."; else if (!Naive()) Log::Info << "single-tree rank-approximate " << TreeName() << " search..."; else Log::Info << "brute-force (naive) rank-approximate search..."; Log::Info << std::endl; switch (treeType) { case KD_TREE: kdTreeRA->Search(k, neighbors, distances); break; case COVER_TREE: coverTreeRA->Search(k, neighbors, distances); break; case R_TREE: rTreeRA->Search(k, neighbors, distances); break; case R_STAR_TREE: rStarTreeRA->Search(k, neighbors, distances); break; case X_TREE: xTreeRA->Search(k, neighbors, distances); break; } }
void NSModel<SortPolicy>::Search(const size_t k, arma::Mat<size_t>& neighbors, arma::mat& distances) { Log::Info << "Searching for " << k << " neighbors with "; switch (SearchMode()) { case NAIVE_MODE: Log::Info << "brute-force (naive) search..." << std::endl; break; case SINGLE_TREE_MODE: Log::Info << "single-tree " << TreeName() << " search..." << std::endl; break; case DUAL_TREE_MODE: Log::Info << "dual-tree " << TreeName() << " search..." << std::endl; break; case GREEDY_SINGLE_TREE_MODE: Log::Info << "greedy single-tree " << TreeName() << " search..." << std::endl; break; } if (Epsilon() != 0 && SearchMode() != NAIVE_MODE) Log::Info << "Maximum of " << Epsilon() * 100 << "% relative error." << std::endl; MonoSearchVisitor search(k, neighbors, distances); boost::apply_visitor(search, nSearch); }
void NSModel<SortPolicy>::Search(arma::mat&& querySet, const size_t k, arma::Mat<size_t>& neighbors, arma::mat& distances) { // We may need to map the query set randomly. if (randomBasis) querySet = q * querySet; Log::Info << "Searching for " << k << " neighbors with "; switch (SearchMode()) { case NAIVE_MODE: Log::Info << "brute-force (naive) search..." << std::endl; break; case SINGLE_TREE_MODE: Log::Info << "single-tree " << TreeName() << " search..." << std::endl; break; case DUAL_TREE_MODE: Log::Info << "dual-tree " << TreeName() << " search..." << std::endl; break; case GREEDY_SINGLE_TREE_MODE: Log::Info << "greedy single-tree " << TreeName() << " search..." << std::endl; break; } BiSearchVisitor<SortPolicy> search(querySet, k, neighbors, distances, leafSize, tau, rho); boost::apply_visitor(search, nSearch); }
void NSModel<SortPolicy>::Search(const size_t k, arma::Mat<size_t>& neighbors, arma::mat& distances) { Log::Info << "Searching for " << k << " neighbors with "; if (!Naive() && !SingleMode()) Log::Info << "dual-tree " << TreeName() << " search..." << std::endl; else if (!Naive()) Log::Info << "single-tree " << TreeName() << " search..." << std::endl; else Log::Info << "brute-force (naive) search..." << std::endl; if (Epsilon() != 0 && !Naive()) Log::Info << "Maximum of " << Epsilon() * 100 << "% relative error." << std::endl; MonoSearchVisitor search(k, neighbors, distances); boost::apply_visitor(search, nSearch); }
void NSModel<SortPolicy>::Search(arma::mat&& querySet, const size_t k, arma::Mat<size_t>& neighbors, arma::mat& distances) { // We may need to map the query set randomly. if (randomBasis) querySet = q * querySet; Log::Info << "Searching for " << k << " neighbors with "; if (!Naive() && !SingleMode()) Log::Info << "dual-tree " << TreeName() << " search..." << std::endl; else if (!Naive()) Log::Info << "single-tree " << TreeName() << " search..." << std::endl; else Log::Info << "brute-force (naive) search..." << std::endl; if (Epsilon() != 0 && !Naive()) Log::Info << "Maximum of " << Epsilon() * 100 << "% relative error." << std::endl; BiSearchVisitor<SortPolicy> search(querySet, k, neighbors, distances, leafSize); boost::apply_visitor(search, nSearch); }
void RAModel<SortPolicy>::Search(arma::mat&& querySet, const size_t k, arma::Mat<size_t>& neighbors, arma::mat& distances) { // Apply the random basis if necessary. if (randomBasis) querySet = q * querySet; Log::Info << "Searching for " << k << " approximate nearest neighbors with "; if (!Naive() && !SingleMode()) Log::Info << "dual-tree rank-approximate " << TreeName() << " search..."; else if (!Naive()) Log::Info << "single-tree rank-approximate " << TreeName() << " search..."; else Log::Info << "brute-force (naive) rank-approximate search..."; Log::Info << std::endl; switch (treeType) { case KD_TREE: if (!kdTreeRA->Naive() && !kdTreeRA->SingleMode()) { // Build a second tree and search. Timer::Start("tree_building"); Log::Info << "Building query tree..." << std::endl; std::vector<size_t> oldFromNewQueries; typename RAType<tree::KDTree>::Tree queryTree(std::move(querySet), oldFromNewQueries, leafSize); Log::Info << "Tree built." << std::endl; Timer::Stop("tree_building"); arma::Mat<size_t> neighborsOut; arma::mat distancesOut; kdTreeRA->Search(&queryTree, k, neighborsOut, distancesOut); // Unmap the query points. distances.set_size(distancesOut.n_rows, distancesOut.n_cols); neighbors.set_size(neighborsOut.n_rows, neighborsOut.n_cols); for (size_t i = 0; i < neighborsOut.n_cols; ++i) { neighbors.col(oldFromNewQueries[i]) = neighborsOut.col(i); distances.col(oldFromNewQueries[i]) = distancesOut.col(i); } } else { // Search without building a second tree. kdTreeRA->Search(querySet, k, neighbors, distances); } break; case COVER_TREE: // No mapping necessary. coverTreeRA->Search(querySet, k, neighbors, distances); break; case R_TREE: // No mapping necessary. rTreeRA->Search(querySet, k, neighbors, distances); break; case R_STAR_TREE: // No mapping necessary. rStarTreeRA->Search(querySet, k, neighbors, distances); break; case X_TREE: // No mapping necessary. xTreeRA->Search(querySet, k, neighbors, distances); break; } }