ANNkd_tree:annkSearch() is reentrant, in particular it works with OpenMP
authorDmitriy Morozov <dmitriy@mrzv.org>
Fri Jul 17 13:54:30 2009 -0700 (2 years ago)
changeset 3f1e962ffa1c2
parent 2689462154b3a
child 4c2859a25fad6
ANNkd_tree:annkSearch() is reentrant, in particular it works with OpenMP
src/bd_search.cpp
src/kd_search.cpp
src/kd_search.h
src/kd_tree.h
       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  };