Skip to content

Commit 62d8e32

Browse files
author
DvirDukhan
authored
fixed BF missing vector block member update (#134)
* fixed BF missing vector block member update * fixed PR comments
1 parent 5469027 commit 62d8e32

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

src/VecSim/algorithms/brute_force/brute_force.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ int BruteForceIndex::deleteVector(size_t label) {
125125

126126
// Swap the last vector with the deleted vector;
127127
vectorBlock->setMember(vectorIndex, lastVectorBlockMember);
128-
lastVectorBlockMember->block = vectorBlock;
129128

130129
float *destination = vectorBlock->getVector(vectorIndex);
131130
float *origin = lastVectorBlock->removeAndFetchVector();

src/VecSim/algorithms/brute_force/vector_block.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ struct VectorBlock : public VecsimBaseObject {
3838

3939
inline void setMember(size_t index, VectorBlockMember *member) {
4040
this->members[index] = member;
41+
member->index = index;
42+
member->block = this;
4143
}
4244

4345
// Compute the score for every vector in the block by using the given distance function.

tests/unit/test_bruteforce.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,50 @@ TEST_F(BruteForceTest, brute_force_reindexing_same_vector_different_id) {
260260
VecSimIndex_Free(index);
261261
}
262262

263+
TEST_F(BruteForceTest, test_delete_swap_block) {
264+
size_t n = 6;
265+
size_t k = 5;
266+
size_t dim = 2;
267+
268+
// This test creates 2 vector blocks with size of 3
269+
// Insert 6 vectors with ascending ids; The vector blocks will look like
270+
// 0 [0, 1, 2]
271+
// 1 [3, 4, 5]
272+
// Delete the id 1 will delete it from the first vector block 0 [0 ,1, 2] and will move id 5
273+
// from block 1 [3, 4, 5] to vector block 0, so our vector blocks will look like 0 [0, 5, 2] 1
274+
// [3, 4]
275+
VecSimParams params{.algo = VecSimAlgo_BF,
276+
.bfParams = BFParams{.type = VecSimType_FLOAT32,
277+
.dim = dim,
278+
.metric = VecSimMetric_L2,
279+
.initialCapacity = 3,
280+
.blockSize = 3}};
281+
VecSimIndex *index = VecSimIndex_New(&params);
282+
283+
for (size_t i = 0; i < n; i++) {
284+
float f[dim];
285+
for (size_t j = 0; j < dim; j++) {
286+
f[j] = (float)i; // i
287+
}
288+
VecSimIndex_AddVector(index, (const void *)f, i);
289+
}
290+
ASSERT_EQ(VecSimIndex_IndexSize(index), n);
291+
292+
// Here the shift should happen.
293+
VecSimIndex_DeleteVector(index, 1);
294+
295+
float query[] = {0.0, 0.0};
296+
auto verify_res = [&](size_t id, float score, size_t index) {
297+
if (index == 0) {
298+
ASSERT_EQ(id, index);
299+
} else {
300+
ASSERT_EQ(id, index + 1);
301+
}
302+
};
303+
runTopKSearchTest(index, query, k, verify_res);
304+
VecSimIndex_Free(index);
305+
}
306+
263307
TEST_F(BruteForceTest, sanity_rinsert_1280) {
264308
size_t n = 5;
265309
size_t d = 1280;

0 commit comments

Comments
 (0)