diff --git a/include/svs/index/vamana/dynamic_search_buffer.h b/include/svs/index/vamana/dynamic_search_buffer.h index 52b071d9..6ab5c346 100644 --- a/include/svs/index/vamana/dynamic_search_buffer.h +++ b/include/svs/index/vamana/dynamic_search_buffer.h @@ -221,6 +221,18 @@ template > class MutableBuffer { best_unvisited_ = 0; } + /// Keep only the ids now in the buffer in the visited set, so dropped ids can be + /// re-inserted. + void reset_visited_to_contents() { + if (!visited_set_enabled()) { + return; + } + visited_->reset(); + for (const auto& neighbor : candidates_) { + visited_->emplace(neighbor.id()); + } + } + size_t capacity() const { return candidates_.capacity(); } /// @brief Return the number of valid elements currently contained in the buffer. diff --git a/include/svs/index/vamana/iterator.h b/include/svs/index/vamana/iterator.h index 284b8bfb..7bf3a9b6 100644 --- a/include/svs/index/vamana/iterator.h +++ b/include/svs/index/vamana/iterator.h @@ -54,6 +54,8 @@ template struct RestartInitializer { return; } + // Let ids dropped from the buffer be inserted again in the larger window. + buffer.reset_visited_to_contents(); // Otherwise, sort the buffer to prepare for the next search. buffer.sort(); } diff --git a/include/svs/index/vamana/search_buffer.h b/include/svs/index/vamana/search_buffer.h index 62c255b1..a6e8b72b 100644 --- a/include/svs/index/vamana/search_buffer.h +++ b/include/svs/index/vamana/search_buffer.h @@ -287,6 +287,18 @@ template > class SearchBuffer { best_unvisited_ = 0; } + /// Keep only the ids now in the buffer in the visited set, so dropped ids can be + /// re-inserted. + void reset_visited_to_contents() { + if (!visited_set_enabled()) { + return; + } + visited_->reset(); + for (size_t i = 0; i < size_; ++i) { + visited_->emplace(candidates_[i].id()); + } + } + /// @brief Return the current number of valid elements in the buffer. size_t size() const { return size_; }