Skip to content

Commit b2cd2b6

Browse files
authored
Add IVF_PQ backwards compatibility data generation and testing (#555)
1 parent aac14ed commit b2cd2b6

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

apis/python/test/test_backwards_compatibility.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from tiledb.vector_search.flat_index import FlatIndex
44
from tiledb.vector_search.ivf_flat_index import IVFFlatIndex
5+
from tiledb.vector_search.ivf_pq_index import IVFPQIndex
56
from tiledb.vector_search.utils import load_fvecs
67
from tiledb.vector_search.vamana_index import VamanaIndex
78

@@ -63,6 +64,8 @@ def test_query_old_indices():
6364
index = FlatIndex(uri=index_uri)
6465
elif "vamana" in index_name:
6566
index = VamanaIndex(uri=index_uri)
67+
elif "ivf_pq" in index_name:
68+
index = IVFPQIndex(uri=index_uri)
6669
else:
6770
assert False, f"Unknown index name: {index_name}"
6871

backwards-compatibility-data/generate_data.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def generate_indexes(version):
6666
queries = base[indices]
6767

6868
# Generate each index and query to make sure it works before we write it.
69-
index_types = ["FLAT", "IVF_FLAT", "VAMANA"]
69+
index_types = ["FLAT", "IVF_FLAT", "VAMANA", "IVF_PQ"]
7070
data_types = ["float32", "uint8"]
7171
for index_type in index_types:
7272
for data_type in data_types:
@@ -75,6 +75,7 @@ def generate_indexes(version):
7575
index_type=index_type,
7676
index_uri=index_uri,
7777
input_vectors=base.astype(data_type),
78+
num_subspaces=len(base[0]),
7879
)
7980

8081
result_d, result_i = index.query(queries, k=1)

src/include/test/unit_backwards_compatibility.cc

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@
3535
#include <iostream>
3636
#include "api/feature_vector_array.h"
3737
#include "api/ivf_flat_index.h"
38+
#include "api/ivf_pq_index.h"
3839
#include "api/vamana_index.h"
3940
#include "detail/linalg/matrix.h"
4041
#include "index/ivf_flat_index.h"
42+
#include "index/ivf_pq_index.h"
4143
#include "index/vamana_index.h"
4244
#include "mdspan/mdspan.hpp"
4345
#include "test/utils/array_defs.h"
@@ -135,6 +137,27 @@ TEST_CASE("test_query_old_indices", "[backwards_compatibility]") {
135137
// Next check that we can load the metadata.
136138
auto metadata = vamana_index_metadata();
137139
metadata.load_metadata(read_group);
140+
} else if (index_uri.find("ivf_pq") != std::string::npos) {
141+
// First check that we can query the index.
142+
auto index = IndexIVFPQ(ctx, index_uri);
143+
auto&& [scores, ids] = index.query(queries_feature_vector_array, 1, 10);
144+
auto scores_span =
145+
MatrixView<siftsmall_feature_type, stdx::layout_left>{
146+
(siftsmall_feature_type*)scores.data(),
147+
extents(scores)[0],
148+
extents(scores)[1]};
149+
150+
auto ids_span = MatrixView<siftsmall_ids_type, stdx::layout_left>{
151+
(siftsmall_ids_type*)ids.data(), extents(ids)[0], extents(ids)[1]};
152+
153+
for (size_t i = 0; i < query_indices.size(); ++i) {
154+
CHECK(ids_span[0][i] == query_indices[i]);
155+
CHECK(scores_span[0][i] == 0);
156+
}
157+
158+
// Next check that we can load the metadata.
159+
auto metadata = ivf_pq_metadata();
160+
metadata.load_metadata(read_group);
138161
} else {
139162
REQUIRE(false);
140163
}

0 commit comments

Comments
 (0)