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 "; 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); }
int main() { // Assume we calculate x^n+ x^n-1 + ....+ 1 // n=100 const int size = 10 + 1; int a[size]; for (int i=0; i<=size; i++) a[i] = 1; for (int i=0; i<=size; i++) printf("%d ", a[i]); printf("\n"); printf("Naive sum=%d\n", Naive(a, size, 5)); printf("Honer sum=%d\n", Honer(a, size, 5)); }
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; } }
int Naive(int *a, int n, int x) { if (n==0) return a[n]; int s = Naive(a, n-1, x) + a[n]*exponent(x,n); return s; }