# HG changeset patch # User Dmitriy Morozov # Date 1247864070 25200 # Node ID f1e962ffa1c22e979d80ab282aa26ab07d263390 # Parent 689462154b3a1e285a559ed5747063498660f1df ANNkd_tree:annkSearch() is reentrant, in particular it works with OpenMP diff -r 689462154b3a -r f1e962ffa1c2 src/bd_search.cpp --- a/src/bd_search.cpp Tue Jul 14 09:25:24 2009 -0700 +++ b/src/bd_search.cpp Fri Jul 17 13:54:30 2009 -0700 @@ -36,6 +36,8 @@ // bd_shrink::ann_search - search a shrinking node //---------------------------------------------------------------------- +ANNpoint ANNkdQ; // query point +ANNmin_k *ANNkdPointMK; // set of k closest points void ANNbd_shrink::ann_search(ANNdist box_dist) { // check dist calc term cond. diff -r 689462154b3a -r f1e962ffa1c2 src/kd_search.cpp --- a/src/kd_search.cpp Tue Jul 14 09:25:24 2009 -0700 +++ b/src/kd_search.cpp Fri Jul 17 13:54:30 2009 -0700 @@ -77,10 +77,8 @@ //---------------------------------------------------------------------- int ANNkdDim; // dimension of space -ANNpoint ANNkdQ; // query point double ANNkdMaxErr; // max tolerable squared error ANNpointArray ANNkdPts; // the points -ANNmin_k *ANNkdPointMK; // set of k closest points //---------------------------------------------------------------------- // annkSearch - search for the k nearest neighbors @@ -93,6 +91,8 @@ ANNdistArray dd, // the approximate nearest neighbor double eps) // the error bound { + ANNpoint ANNkdQ; // query point + ANNmin_k *ANNkdPointMK; // set of k closest points ANNkdDim = dim; // copy arguments to static equivs ANNkdQ = q; @@ -108,7 +108,7 @@ ANNkdPointMK = new ANNmin_k(k); // create set for closest k points // search starting at the root - root->ann_search(annBoxDistance(q, bnd_box_lo, bnd_box_hi, dim)); + root->ann_search(ANNkdQ, ANNkdPointMK, annBoxDistance(q, bnd_box_lo, bnd_box_hi, dim)); for (int i = 0; i < k; i++) { // extract the k-th closest points dd[i] = ANNkdPointMK->ith_smallest_key(i); @@ -121,7 +121,7 @@ // kd_split::ann_search - search a splitting node //---------------------------------------------------------------------- -void ANNkd_split::ann_search(ANNdist box_dist) +void ANNkd_split::ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist box_dist) { // check dist calc term condition if (ANNmaxPtsVisited != 0 && ANNptsVisited > ANNmaxPtsVisited) return; @@ -130,7 +130,7 @@ ANNcoord cut_diff = ANNkdQ[cut_dim] - cut_val; if (cut_diff < 0) { // left of cutting plane - child[ANN_LO]->ann_search(box_dist);// visit closer child first + child[ANN_LO]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);// visit closer child first ANNcoord box_diff = cd_bnds[ANN_LO] - ANNkdQ[cut_dim]; if (box_diff < 0) // within bounds - ignore @@ -141,11 +141,11 @@ // visit further child if close enough if (box_dist * ANNkdMaxErr < ANNkdPointMK->max_key()) - child[ANN_HI]->ann_search(box_dist); + child[ANN_HI]->ann_search(ANNkdQ, ANNkdPointMK, box_dist); } else { // right of cutting plane - child[ANN_HI]->ann_search(box_dist);// visit closer child first + child[ANN_HI]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);// visit closer child first ANNcoord box_diff = ANNkdQ[cut_dim] - cd_bnds[ANN_HI]; if (box_diff < 0) // within bounds - ignore @@ -156,7 +156,7 @@ // visit further child if close enough if (box_dist * ANNkdMaxErr < ANNkdPointMK->max_key()) - child[ANN_LO]->ann_search(box_dist); + child[ANN_LO]->ann_search(ANNkdQ, ANNkdPointMK, box_dist); } ANN_FLOP(10) // increment floating ops @@ -169,7 +169,7 @@ // some fine tuning to replace indexing by pointer operations. //---------------------------------------------------------------------- -void ANNkd_leaf::ann_search(ANNdist box_dist) +void ANNkd_leaf::ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist box_dist) { register ANNdist dist; // distance to data point register ANNcoord* pp; // data coordinate pointer diff -r 689462154b3a -r f1e962ffa1c2 src/kd_search.h --- a/src/kd_search.h Tue Jul 14 09:25:24 2009 -0700 +++ b/src/kd_search.h Fri Jul 17 13:54:30 2009 -0700 @@ -39,10 +39,10 @@ //---------------------------------------------------------------------- extern int ANNkdDim; // dimension of space (static copy) -extern ANNpoint ANNkdQ; // query point (static copy) +// extern ANNpoint ANNkdQ; // query point (static copy) extern double ANNkdMaxErr; // max tolerable squared error extern ANNpointArray ANNkdPts; // the points (static copy) -extern ANNmin_k *ANNkdPointMK; // set of k closest points +// extern ANNmin_k *ANNkdPointMK; // set of k closest points extern int ANNptsVisited; // number of points visited #endif diff -r 689462154b3a -r f1e962ffa1c2 src/kd_tree.h --- a/src/kd_tree.h Tue Jul 14 09:25:24 2009 -0700 +++ b/src/kd_tree.h Fri Jul 17 13:54:30 2009 -0700 @@ -28,6 +28,7 @@ #define ANN_kd_tree_H #include // all ANN includes +#include "pr_queue_k.h" // k-element priority queue using namespace std; // make std:: available @@ -47,7 +48,8 @@ public: virtual ~ANNkd_node() {} // virtual distroyer - virtual void ann_search(ANNdist) = 0; // tree search + virtual void ann_search(ANNdist) {} // tree search + virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist) {} // tree search virtual void ann_pri_search(ANNdist) = 0; // priority search virtual void ann_FR_search(ANNdist) = 0; // fixed-radius search @@ -110,7 +112,7 @@ virtual void print(int level, ostream &out);// print node virtual void dump(ostream &out); // dump node - virtual void ann_search(ANNdist); // standard search + virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist); // standard search virtual void ann_pri_search(ANNdist); // priority search virtual void ann_FR_search(ANNdist); // fixed-radius search }; @@ -176,7 +178,7 @@ virtual void print(int level, ostream &out);// print node virtual void dump(ostream &out); // dump node - virtual void ann_search(ANNdist); // standard search + virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist); // standard search virtual void ann_pri_search(ANNdist); // priority search virtual void ann_FR_search(ANNdist); // fixed-radius search };