… | |
… | |
32 | } |
32 | } |
33 | |
33 | |
34 | return dist; |
34 | return dist; |
35 | } |
35 | } |
36 | |
36 | |
|
|
37 | |
|
|
38 | Object::Object(double *pkey) |
|
|
39 | { |
|
|
40 | k = pkey; |
|
|
41 | |
|
|
42 | // discretize the vector |
|
|
43 | for (int i = NDIMS; i--; ) |
|
|
44 | k[i] = int2double (double2int (k[i])); |
|
|
45 | } |
|
|
46 | |
37 | Object::Object(char *key) |
47 | Object::Object(char *key) |
38 | { |
48 | { |
39 | unsigned char *c = (unsigned char *)key; |
49 | unsigned char *c = (unsigned char *)key; |
40 | |
50 | |
41 | k = new double [NDIMS]; |
51 | k = new double [NDIMS]; |
… | |
… | |
53 | break; |
63 | break; |
54 | default: |
64 | default: |
55 | abort (); |
65 | abort (); |
56 | } |
66 | } |
57 | |
67 | |
58 | k[i] = ((double)elem) * ACC->max / ACC->steps + ACC->min; |
68 | k[i] = int2double(elem); |
59 | } |
69 | } |
60 | } |
70 | } |
61 | |
71 | |
62 | void Object::Compress(char *key) |
72 | void Object::Compress(char *key) |
63 | { |
73 | { |
64 | unsigned char *c = (unsigned char *)key; |
74 | unsigned char *c = (unsigned char *)key; |
65 | |
75 | |
66 | for (int i = 0; i < NDIMS; i++) |
76 | for (int i = 0; i < NDIMS; i++) |
67 | { |
77 | { |
68 | unsigned long elem = (unsigned long)floor ((k[i] - ACC->min) * ACC->steps / ACC->max); |
78 | unsigned long elem = double2int (k[i]); |
69 | |
79 | |
70 | switch (ACC->elemsize) |
80 | switch (ACC->elemsize) |
71 | { |
81 | { |
72 | case 4: *c++ = (elem >> 24) & 0xff; |
82 | case 4: *c++ = (elem >> 24) & 0xff; |
73 | case 3: *c++ = (elem >> 16) & 0xff; |
83 | case 3: *c++ = (elem >> 16) & 0xff; |
… | |
… | |
145 | Object o(k); |
155 | Object o(k); |
146 | Pred p(o); |
156 | Pred p(o); |
147 | SimpleQuery q(&p, r); |
157 | SimpleQuery q(&p, r); |
148 | GiSTlist<MTentry *> res = mt->RangeSearch(q); |
158 | GiSTlist<MTentry *> res = mt->RangeSearch(q); |
149 | |
159 | |
150 | while(!res.IsEmpty()) { |
160 | while(!res.IsEmpty()) |
|
|
161 | { |
151 | MTentry *e = res.RemoveFront (); |
162 | MTentry *e = res.RemoveFront (); |
152 | |
|
|
153 | add_result(e->Key()->distance, e->Ptr(), e->Key()->obj.data(), ndims); |
163 | add_result(e->Ptr(), e->Key()->obj.data(), ndims); |
154 | |
|
|
155 | delete e; |
164 | delete e; |
156 | } |
165 | } |
157 | } |
166 | } |
158 | |
167 | |
159 | void PMT::top(double *k, int n) const |
168 | void PMT::top(double *k, int n) const |
160 | { |
169 | { |
161 | abort (); |
170 | SETCUR; |
|
|
171 | Object o(k); |
|
|
172 | Pred p(o); |
|
|
173 | TopQuery q(&p, n); |
|
|
174 | MTentry **res = mt->TopSearch(q); |
|
|
175 | |
|
|
176 | for (int i=0; i < n; i++) |
|
|
177 | { |
|
|
178 | MTentry *e = res[i]; |
|
|
179 | add_result(e->Ptr(), e->Key()->obj.data(), ndims); |
|
|
180 | delete e; |
|
|
181 | } |
162 | } |
182 | } |
|
|
183 | |
|
|
184 | int PMT::maxlevel() const |
|
|
185 | { |
|
|
186 | SETCUR; |
|
|
187 | return mt->MaxLevel(); |
|
|
188 | } |