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
};
|