Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/VecSim/algorithms/brute_force/brute_force.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,6 @@ int BruteForceIndex::deleteVector(size_t label) {

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

float *destination = vectorBlock->getVector(vectorIndex);
float *origin = lastVectorBlock->removeAndFetchVector();
Expand Down
2 changes: 2 additions & 0 deletions src/VecSim/algorithms/brute_force/vector_block.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ struct VectorBlock : public VecsimBaseObject {

inline void setMember(size_t index, VectorBlockMember *member) {
this->members[index] = member;
member->index = index;
member->block = this;
}

// Compute the score for every vector in the block by using the given distance function.
Expand Down
44 changes: 44 additions & 0 deletions tests/unit/test_bruteforce.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,50 @@ TEST_F(BruteForceTest, brute_force_reindexing_same_vector_different_id) {
VecSimIndex_Free(index);
}

TEST_F(BruteForceTest, test_delete_swap_block) {
size_t n = 6;
size_t k = 5;
size_t dim = 2;

// This test creates 2 vector blocks with size of 3
// Insert 6 vectors with ascending ids; The vector blocks will look like
// 0 [0, 1, 2]
// 1 [3, 4, 5]
// Delete the id 1 will delete it from the first vector block 0 [0 ,1, 2] and will move id 5
// from block 1 [3, 4, 5] to vector block 0, so our vector blocks will look like 0 [0, 5, 2] 1
// [3, 4]
VecSimParams params{.algo = VecSimAlgo_BF,
.bfParams = BFParams{.type = VecSimType_FLOAT32,
.dim = dim,
.metric = VecSimMetric_L2,
.initialCapacity = 3,
.blockSize = 3}};
VecSimIndex *index = VecSimIndex_New(&params);

for (size_t i = 0; i < n; i++) {
float f[dim];
for (size_t j = 0; j < dim; j++) {
f[j] = (float)i; // i
}
VecSimIndex_AddVector(index, (const void *)f, i);
}
ASSERT_EQ(VecSimIndex_IndexSize(index), n);

// Here the shift should happen.
VecSimIndex_DeleteVector(index, 1);

float query[] = {0.0, 0.0};
auto verify_res = [&](size_t id, float score, size_t index) {
if (index == 0) {
ASSERT_EQ(id, index);
} else {
ASSERT_EQ(id, index + 1);
}
};
runTopKSearchTest(index, query, k, verify_res);
VecSimIndex_Free(index);
}

TEST_F(BruteForceTest, sanity_rinsert_1280) {
size_t n = 5;
size_t d = 1280;
Expand Down