Skip to content

Commit fde76ec

Browse files
authored
Add max_empty_result_buckerts for ScaNN range search (#467)
Signed-off-by: chasingegg <[email protected]>
1 parent f0af3e7 commit fde76ec

File tree

3 files changed

+19
-16
lines changed

3 files changed

+19
-16
lines changed

src/index/ivf/ivf.cc

+4-7
Original file line numberDiff line numberDiff line change
@@ -769,14 +769,11 @@ IvfIndexNode<DataType, IndexType>::RangeSearch(const DataSet& dataset, const Con
769769
}
770770

771771
// todo aguzhva: this is somewhat alogical. Refactor?
772-
faiss::IVFSearchParameters base_search_params;
773-
base_search_params.max_empty_result_buckets = ivf_cfg.max_empty_result_buckets.value();
774-
base_search_params.sel = id_selector;
775-
776-
faiss::IndexScaNNSearchParameters scann_search_params;
777-
scann_search_params.base_index_params = &base_search_params;
772+
faiss::IVFSearchParameters search_params;
773+
search_params.max_empty_result_buckets = ivf_cfg.max_empty_result_buckets.value();
774+
search_params.sel = id_selector;
778775

779-
index_->range_search(1, cur_query, radius, &res, &scann_search_params);
776+
index_->range_search(1, cur_query, radius, &res, &search_params);
780777
} else {
781778
auto cur_query = (const float*)xq + index * dim;
782779
if (is_cosine) {

thirdparty/faiss/faiss/IndexIVFFastScan.cpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,7 @@ void IndexIVFFastScan::range_search_implem_12(
13691369

13701370
const size_t nprobe = params ? params->nprobe : this->nprobe;
13711371
const size_t max_codes = params ? params->max_codes : this->max_codes;
1372+
const int max_empty_result_buckets = params ? params->max_empty_result_buckets : 1;
13721373
const IDSelector* sel = params ? params->sel : nullptr;
13731374
const SearchParameters* quantizer_params =
13741375
params ? params->quantizer_params : nullptr;
@@ -1445,6 +1446,8 @@ void IndexIVFFastScan::range_search_implem_12(
14451446

14461447
size_t i0 = 0;
14471448
uint64_t t_copy_pack = 0, t_scan = 0;
1449+
handler->in_range_num = 0;
1450+
int ndup = 0;
14481451
while (i0 < qcs.size()) {
14491452
uint64_t tt0 = get_cy();
14501453

@@ -1498,7 +1501,7 @@ void IndexIVFFastScan::range_search_implem_12(
14981501
handler->ntotal = list_size;
14991502
handler->q_map = q_map.data();
15001503
handler->id_map = ids.get();
1501-
handler->in_range_num = 0;
1504+
int prev_in_range_num = handler->in_range_num;
15021505
uint64_t tt1 = get_cy();
15031506

15041507
pq4_accumulate_loop_qbs(
@@ -1509,7 +1512,12 @@ void IndexIVFFastScan::range_search_implem_12(
15091512
LUT.get(),
15101513
*(handler.get()),
15111514
scaler);
1512-
if (handler->in_range_num <= 0) {
1515+
if (handler->in_range_num == prev_in_range_num) {
1516+
ndup++;
1517+
} else {
1518+
ndup = 0;
1519+
}
1520+
if (ndup == max_empty_result_buckets) {
15131521
break;
15141522
}
15151523

thirdparty/faiss/faiss/IndexScaNN.cpp

+5-7
Original file line numberDiff line numberDiff line change
@@ -202,23 +202,21 @@ void IndexScaNN::range_search(
202202

203203
FAISS_THROW_IF_NOT(is_trained);
204204

205-
const IndexScaNNSearchParameters* params = nullptr;
205+
const IVFSearchParameters* params = nullptr;
206206
if (params_in) {
207-
params = dynamic_cast<const IndexScaNNSearchParameters*>(params_in);
207+
params = dynamic_cast<const IVFSearchParameters*>(params_in);
208208
FAISS_THROW_IF_NOT_MSG(params, "IndexScaNN params have incorrect type");
209209
}
210210

211-
SearchParameters* base_index_params =
212-
(params != nullptr) ? params->base_index_params : nullptr;
213-
214-
215211
auto base = dynamic_cast<const IndexIVFPQFastScan*>(base_index);
216212
FAISS_THROW_IF_NOT(base);
217213

218214
IVFSearchParameters ivf_search_params;
219215
ivf_search_params.nprobe = base->nlist;
216+
ivf_search_params.max_empty_result_buckets = params->max_empty_result_buckets;
220217
// todo aguzhva: this is somewhat hacky
221-
ivf_search_params.sel = base_index_params->sel;
218+
ivf_search_params.sel = params->sel;
219+
222220
base->range_search(n, x, radius, result, &ivf_search_params);
223221

224222
// nothing to refine, directly return the result

0 commit comments

Comments
 (0)