@@ -168,6 +168,45 @@ void IndexRefine::search(
168
168
}
169
169
}
170
170
171
+ void IndexRefine::range_search (
172
+ idx_t n,
173
+ const float * x,
174
+ float radius,
175
+ RangeSearchResult* result,
176
+ const SearchParameters* params_in) const {
177
+ const IndexRefineSearchParameters* params = nullptr ;
178
+ if (params_in) {
179
+ params = dynamic_cast <const IndexRefineSearchParameters*>(params_in);
180
+ FAISS_THROW_IF_NOT_MSG (
181
+ params, " IndexRefine params have incorrect type" );
182
+ }
183
+
184
+ SearchParameters* base_index_params =
185
+ (params != nullptr ) ? params->base_index_params : nullptr ;
186
+
187
+ base_index->range_search (n, x, radius, result, base_index_params);
188
+
189
+ #pragma omp parallel if (n > 1)
190
+ {
191
+ std::unique_ptr<DistanceComputer> dc (
192
+ refine_index->get_distance_computer ());
193
+
194
+ #pragma omp for
195
+ for (idx_t i = 0 ; i < n; i++) {
196
+ dc->set_query (x + i * d);
197
+
198
+ // reevaluate distances
199
+ const size_t idx_start = result->lims [i];
200
+ const size_t idx_end = result->lims [i + 1 ];
201
+
202
+ for (size_t j = idx_start; j < idx_end; j++) {
203
+ const auto label = result->labels [j];
204
+ result->distances [j] = (*dc)(label);
205
+ }
206
+ }
207
+ }
208
+ }
209
+
171
210
void IndexRefine::reconstruct (idx_t key, float * recons) const {
172
211
refine_index->reconstruct (key, recons);
173
212
}
0 commit comments