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