40 std::unique_lock lock(mutex_);
41 auto it = id_to_index_.find(
id);
42 if (it == id_to_index_.end())
return false;
43 size_t idx = it->second, last = ids_.size() - 1;
45 std::copy_n(vectors_data_.data() + last * dim_, dim_, vectors_data_.data() + idx * dim_);
46 ids_[idx] = ids_[last];
47 id_to_index_[ids_[idx]] = idx;
49 vectors_data_.resize(vectors_data_.size() - dim_);
51 id_to_index_.erase(it);
71 std::vector<SearchResult>
search(
const float* query,
size_t k)
const {
72 if (!query)
throw std::invalid_argument(
"Query must not be null");
73 if (k == 0)
throw std::invalid_argument(
"k must be > 0");
74 std::shared_lock lock(mutex_);
75 std::vector<SearchResult> results;
76 results.reserve(ids_.size());
77 for (
size_t i = 0; i < ids_.size(); ++i)
78 results.push_back({ids_[i], dist_(query, vectors_data_.data() + i * dim_)});
79 size_t n = std::min(k, results.size());
80 std::partial_sort(results.begin(), results.begin() + n, results.end());