1 --- a/src/bd_search.cpp Tue Jul 14 09:25:24 2009 -0700
2 +++ b/src/bd_search.cpp Fri Jul 17 13:54:30 2009 -0700
3 @@ -36,6 +36,8 @@
4 // bd_shrink::ann_search - search a shrinking node
5 //----------------------------------------------------------------------
6
7 +ANNpoint ANNkdQ; // query point
8 +ANNmin_k *ANNkdPointMK; // set of k closest points
9 void ANNbd_shrink::ann_search(ANNdist box_dist)
10 {
11 // check dist calc term cond.
1.1 --- a/src/kd_search.cpp Tue Jul 14 09:25:24 2009 -0700
1.2 +++ b/src/kd_search.cpp Fri Jul 17 13:54:30 2009 -0700
1.3 @@ -77,10 +77,8 @@
1.4 //----------------------------------------------------------------------
1.5
1.6 int ANNkdDim; // dimension of space
1.7 -ANNpoint ANNkdQ; // query point
1.8 double ANNkdMaxErr; // max tolerable squared error
1.9 ANNpointArray ANNkdPts; // the points
1.10 -ANNmin_k *ANNkdPointMK; // set of k closest points
1.11
1.12 //----------------------------------------------------------------------
1.13 // annkSearch - search for the k nearest neighbors
1.14 @@ -93,6 +91,8 @@
1.15 ANNdistArray dd, // the approximate nearest neighbor
1.16 double eps) // the error bound
1.17 {
1.18 + ANNpoint ANNkdQ; // query point
1.19 + ANNmin_k *ANNkdPointMK; // set of k closest points
1.20
1.21 ANNkdDim = dim; // copy arguments to static equivs
1.22 ANNkdQ = q;
1.23 @@ -108,7 +108,7 @@
1.24
1.25 ANNkdPointMK = new ANNmin_k(k); // create set for closest k points
1.26 // search starting at the root
1.27 - root->ann_search(annBoxDistance(q, bnd_box_lo, bnd_box_hi, dim));
1.28 + root->ann_search(ANNkdQ, ANNkdPointMK, annBoxDistance(q, bnd_box_lo, bnd_box_hi, dim));
1.29
1.30 for (int i = 0; i < k; i++) { // extract the k-th closest points
1.31 dd[i] = ANNkdPointMK->ith_smallest_key(i);
1.32 @@ -121,7 +121,7 @@
1.33 // kd_split::ann_search - search a splitting node
1.34 //----------------------------------------------------------------------
1.35
1.36 -void ANNkd_split::ann_search(ANNdist box_dist)
1.37 +void ANNkd_split::ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist box_dist)
1.38 {
1.39 // check dist calc term condition
1.40 if (ANNmaxPtsVisited != 0 && ANNptsVisited > ANNmaxPtsVisited) return;
1.41 @@ -130,7 +130,7 @@
1.42 ANNcoord cut_diff = ANNkdQ[cut_dim] - cut_val;
1.43
1.44 if (cut_diff < 0) { // left of cutting plane
1.45 - child[ANN_LO]->ann_search(box_dist);// visit closer child first
1.46 + child[ANN_LO]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);// visit closer child first
1.47
1.48 ANNcoord box_diff = cd_bnds[ANN_LO] - ANNkdQ[cut_dim];
1.49 if (box_diff < 0) // within bounds - ignore
1.50 @@ -141,11 +141,11 @@
1.51
1.52 // visit further child if close enough
1.53 if (box_dist * ANNkdMaxErr < ANNkdPointMK->max_key())
1.54 - child[ANN_HI]->ann_search(box_dist);
1.55 + child[ANN_HI]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);
1.56
1.57 }
1.58 else { // right of cutting plane
1.59 - child[ANN_HI]->ann_search(box_dist);// visit closer child first
1.60 + child[ANN_HI]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);// visit closer child first
1.61
1.62 ANNcoord box_diff = ANNkdQ[cut_dim] - cd_bnds[ANN_HI];
1.63 if (box_diff < 0) // within bounds - ignore
1.64 @@ -156,7 +156,7 @@
1.65
1.66 // visit further child if close enough
1.67 if (box_dist * ANNkdMaxErr < ANNkdPointMK->max_key())
1.68 - child[ANN_LO]->ann_search(box_dist);
1.69 + child[ANN_LO]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);
1.70
1.71 }
1.72 ANN_FLOP(10) // increment floating ops
1.73 @@ -169,7 +169,7 @@
1.74 // some fine tuning to replace indexing by pointer operations.
1.75 //----------------------------------------------------------------------
1.76
1.77 -void ANNkd_leaf::ann_search(ANNdist box_dist)
1.78 +void ANNkd_leaf::ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist box_dist)
1.79 {
1.80 register ANNdist dist; // distance to data point
1.81 register ANNcoord* pp; // data coordinate pointer
2.1 --- a/src/kd_search.h Tue Jul 14 09:25:24 2009 -0700
2.2 +++ b/src/kd_search.h Fri Jul 17 13:54:30 2009 -0700
2.3 @@ -39,10 +39,10 @@
2.4 //----------------------------------------------------------------------
2.5
2.6 extern int ANNkdDim; // dimension of space (static copy)
2.7 -extern ANNpoint ANNkdQ; // query point (static copy)
2.8 +// extern ANNpoint ANNkdQ; // query point (static copy)
2.9 extern double ANNkdMaxErr; // max tolerable squared error
2.10 extern ANNpointArray ANNkdPts; // the points (static copy)
2.11 -extern ANNmin_k *ANNkdPointMK; // set of k closest points
2.12 +// extern ANNmin_k *ANNkdPointMK; // set of k closest points
2.13 extern int ANNptsVisited; // number of points visited
2.14
2.15 #endif
3.1 --- a/src/kd_tree.h Tue Jul 14 09:25:24 2009 -0700
3.2 +++ b/src/kd_tree.h Fri Jul 17 13:54:30 2009 -0700
3.3 @@ -28,6 +28,7 @@
3.4 #define ANN_kd_tree_H
3.5
3.6 #include <ANN/ANNx.h> // all ANN includes
3.7 +#include "pr_queue_k.h" // k-element priority queue
3.8
3.9 using namespace std; // make std:: available
3.10
3.11 @@ -47,7 +48,8 @@
3.12 public:
3.13 virtual ~ANNkd_node() {} // virtual distroyer
3.14
3.15 - virtual void ann_search(ANNdist) = 0; // tree search
3.16 + virtual void ann_search(ANNdist) {} // tree search
3.17 + virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist) {} // tree search
3.18 virtual void ann_pri_search(ANNdist) = 0; // priority search
3.19 virtual void ann_FR_search(ANNdist) = 0; // fixed-radius search
3.20
3.21 @@ -110,7 +112,7 @@
3.22 virtual void print(int level, ostream &out);// print node
3.23 virtual void dump(ostream &out); // dump node
3.24
3.25 - virtual void ann_search(ANNdist); // standard search
3.26 + virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist); // standard search
3.27 virtual void ann_pri_search(ANNdist); // priority search
3.28 virtual void ann_FR_search(ANNdist); // fixed-radius search
3.29 };
3.30 @@ -176,7 +178,7 @@
3.31 virtual void print(int level, ostream &out);// print node
3.32 virtual void dump(ostream &out); // dump node
3.33
3.34 - virtual void ann_search(ANNdist); // standard search
3.35 + virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist); // standard search
3.36 virtual void ann_pri_search(ANNdist); // priority search
3.37 virtual void ann_FR_search(ANNdist); // fixed-radius search
3.38 };