updated on Thu Jan 26 16:09:46 UTC 2012
[aur-mirror.git] / ann / parallel.patch
blob1d5e3ebb4ca4a7a37e34112114c395183089bce8
1 # HG changeset patch
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
11 @@ -36,6 +36,8 @@
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
23 @@ -77,10 +77,8 @@
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
34 @@ -93,6 +91,8 @@
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
42 ANNkdQ = q;
43 @@ -108,7 +108,7 @@
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);
52 @@ -121,7 +121,7 @@
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;
61 @@ -130,7 +130,7 @@
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
70 @@ -141,11 +141,11 @@
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
84 @@ -156,7 +156,7 @@
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
93 @@ -169,7 +169,7 @@
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
105 @@ -39,10 +39,10 @@
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
117 #endif
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
121 @@ -28,6 +28,7 @@
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
129 @@ -47,7 +48,8 @@
130 public:
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
139 @@ -110,7 +112,7 @@
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
148 @@ -176,7 +178,7 @@
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