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