2 # User Dmitriy Morozov <dmitriy@mrzv.org>
3 # Date 1247864070 25200
4 # Node ID f1e962ffa1c22e979d80ab282aa26ab07d263390
5 # Parent 689462154b3a1e285a559ed5747063498660f1df
6 ANNkd_tree:annkSearch() is reentrant, in particular it works with OpenMP
8 diff -r 689462154b3a -r f1e962ffa1c2 src/bd_search.cpp
9 --- a/src/bd_search.cpp Tue Jul 14 09:25:24 2009 -0700
10 +++ b/src/bd_search.cpp Fri Jul 17 13:54:30 2009 -0700
12 // bd_shrink::ann_search - search a shrinking node
13 //----------------------------------------------------------------------
15 +ANNpoint ANNkdQ; // query point
16 +ANNmin_k *ANNkdPointMK; // set of k closest points
17 void ANNbd_shrink::ann_search(ANNdist box_dist)
19 // check dist calc term cond.
20 diff -r 689462154b3a -r f1e962ffa1c2 src/kd_search.cpp
21 --- a/src/kd_search.cpp Tue Jul 14 09:25:24 2009 -0700
22 +++ b/src/kd_search.cpp Fri Jul 17 13:54:30 2009 -0700
24 //----------------------------------------------------------------------
26 int ANNkdDim; // dimension of space
27 -ANNpoint ANNkdQ; // query point
28 double ANNkdMaxErr; // max tolerable squared error
29 ANNpointArray ANNkdPts; // the points
30 -ANNmin_k *ANNkdPointMK; // set of k closest points
32 //----------------------------------------------------------------------
33 // annkSearch - search for the k nearest neighbors
35 ANNdistArray dd, // the approximate nearest neighbor
36 double eps) // the error bound
38 + ANNpoint ANNkdQ; // query point
39 + ANNmin_k *ANNkdPointMK; // set of k closest points
41 ANNkdDim = dim; // copy arguments to static equivs
45 ANNkdPointMK = new ANNmin_k(k); // create set for closest k points
46 // search starting at the root
47 - root->ann_search(annBoxDistance(q, bnd_box_lo, bnd_box_hi, dim));
48 + root->ann_search(ANNkdQ, ANNkdPointMK, annBoxDistance(q, bnd_box_lo, bnd_box_hi, dim));
50 for (int i = 0; i < k; i++) { // extract the k-th closest points
51 dd[i] = ANNkdPointMK->ith_smallest_key(i);
53 // kd_split::ann_search - search a splitting node
54 //----------------------------------------------------------------------
56 -void ANNkd_split::ann_search(ANNdist box_dist)
57 +void ANNkd_split::ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist box_dist)
59 // check dist calc term condition
60 if (ANNmaxPtsVisited != 0 && ANNptsVisited > ANNmaxPtsVisited) return;
62 ANNcoord cut_diff = ANNkdQ[cut_dim] - cut_val;
64 if (cut_diff < 0) { // left of cutting plane
65 - child[ANN_LO]->ann_search(box_dist);// visit closer child first
66 + child[ANN_LO]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);// visit closer child first
68 ANNcoord box_diff = cd_bnds[ANN_LO] - ANNkdQ[cut_dim];
69 if (box_diff < 0) // within bounds - ignore
72 // visit further child if close enough
73 if (box_dist * ANNkdMaxErr < ANNkdPointMK->max_key())
74 - child[ANN_HI]->ann_search(box_dist);
75 + child[ANN_HI]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);
78 else { // right of cutting plane
79 - child[ANN_HI]->ann_search(box_dist);// visit closer child first
80 + child[ANN_HI]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);// visit closer child first
82 ANNcoord box_diff = ANNkdQ[cut_dim] - cd_bnds[ANN_HI];
83 if (box_diff < 0) // within bounds - ignore
86 // visit further child if close enough
87 if (box_dist * ANNkdMaxErr < ANNkdPointMK->max_key())
88 - child[ANN_LO]->ann_search(box_dist);
89 + child[ANN_LO]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);
92 ANN_FLOP(10) // increment floating ops
94 // some fine tuning to replace indexing by pointer operations.
95 //----------------------------------------------------------------------
97 -void ANNkd_leaf::ann_search(ANNdist box_dist)
98 +void ANNkd_leaf::ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist box_dist)
100 register ANNdist dist; // distance to data point
101 register ANNcoord* pp; // data coordinate pointer
102 diff -r 689462154b3a -r f1e962ffa1c2 src/kd_search.h
103 --- a/src/kd_search.h Tue Jul 14 09:25:24 2009 -0700
104 +++ b/src/kd_search.h Fri Jul 17 13:54:30 2009 -0700
106 //----------------------------------------------------------------------
108 extern int ANNkdDim; // dimension of space (static copy)
109 -extern ANNpoint ANNkdQ; // query point (static copy)
110 +// extern ANNpoint ANNkdQ; // query point (static copy)
111 extern double ANNkdMaxErr; // max tolerable squared error
112 extern ANNpointArray ANNkdPts; // the points (static copy)
113 -extern ANNmin_k *ANNkdPointMK; // set of k closest points
114 +// extern ANNmin_k *ANNkdPointMK; // set of k closest points
115 extern int ANNptsVisited; // number of points visited
118 diff -r 689462154b3a -r f1e962ffa1c2 src/kd_tree.h
119 --- a/src/kd_tree.h Tue Jul 14 09:25:24 2009 -0700
120 +++ b/src/kd_tree.h Fri Jul 17 13:54:30 2009 -0700
122 #define ANN_kd_tree_H
124 #include <ANN/ANNx.h> // all ANN includes
125 +#include "pr_queue_k.h" // k-element priority queue
127 using namespace std; // make std:: available
131 virtual ~ANNkd_node() {} // virtual distroyer
133 - virtual void ann_search(ANNdist) = 0; // tree search
134 + virtual void ann_search(ANNdist) {} // tree search
135 + virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist) {} // tree search
136 virtual void ann_pri_search(ANNdist) = 0; // priority search
137 virtual void ann_FR_search(ANNdist) = 0; // fixed-radius search
140 virtual void print(int level, ostream &out);// print node
141 virtual void dump(ostream &out); // dump node
143 - virtual void ann_search(ANNdist); // standard search
144 + virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist); // standard search
145 virtual void ann_pri_search(ANNdist); // priority search
146 virtual void ann_FR_search(ANNdist); // fixed-radius search
149 virtual void print(int level, ostream &out);// print node
150 virtual void dump(ostream &out); // dump node
152 - virtual void ann_search(ANNdist); // standard search
153 + virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist); // standard search
154 virtual void ann_pri_search(ANNdist); // priority search
155 virtual void ann_FR_search(ANNdist); // fixed-radius search