summarylogtreecommitdiffstats
path: root/parallel.patch
blob: 1d5e3ebb4ca4a7a37e34112114c395183089bce8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# HG changeset patch
# User Dmitriy Morozov <dmitriy@mrzv.org>
# 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 <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
 };