Skip to content

Commit ffd3727

Browse files
trang-nm-nguyenmeta-codesync[bot]
authored andcommitted
Update pattern for index factory string with SVSVamana (#5201)
Summary: Pull Request resolved: #5201 Currently SVSVamana failed with error: Mitigation: Error in std::unique_ptr<Index> faiss::(anonymous namespace)::index_factory_sub(int, std::string, MetricType, bool) at fbcode/faiss/index_factory.cpp:1176: could not parse index string IVF524288_SVSVamana64_SQI8,SQ4 In this diff we will fix the issue f1078497787 Reviewed By: mnorris11 Differential Revision: D104326684 fbshipit-source-id: 974723c880d235cfee4ec36b3f4c91d251f408b4
1 parent f750815 commit ffd3727

2 files changed

Lines changed: 46 additions & 2 deletions

File tree

faiss/index_factory.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,10 +305,25 @@ Index* parse_coarse_quantizer(
305305
return new IndexNSGFlat(d, R, mt);
306306
}
307307
#ifdef FAISS_ENABLE_SVS
308-
if (match("IVF([0-9]+[kM]?)_SVSVamana([0-9]*)")) {
308+
if (match("IVF([0-9]+[kM]?)_SVSVamana([0-9]*)(_.+)?")) {
309309
nlist = parse_nlist(sm[1].str());
310310
int degree = sm[2].length() > 0 ? std::stoi(sm[2]) : 32;
311-
return new IndexSVSVamana(d, degree, mt);
311+
SVSStorageKind storage = SVSStorageKind::SVS_FP32;
312+
if (sm[3].matched) {
313+
std::string s = sm[3].str().substr(1);
314+
if (s == "SQI8") {
315+
storage = SVSStorageKind::SVS_SQI8;
316+
} else if (s == "FP16") {
317+
storage = SVSStorageKind::SVS_FP16;
318+
} else if (s == "FP32") {
319+
storage = SVSStorageKind::SVS_FP32;
320+
} else {
321+
FAISS_THROW_FMT(
322+
"unsupported SVSVamana coarse quantizer storage: %s",
323+
s.c_str());
324+
}
325+
}
326+
return new IndexSVSVamana(d, degree, mt, storage);
312327
}
313328
#endif
314329
if (match("IVF([0-9]+[kM]?)\\(Index([0-9])\\)")) {

tests/test_svs_py.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,35 @@ def test_svs_factory_leanvec(self):
308308
self.assertEqual(index.leanvec_d, 64)
309309

310310

311+
@unittest.skipIf(_SKIP_SVS, _SKIP_REASON)
312+
class TestSVSIVFCoarseQuantizerFactory(unittest.TestCase):
313+
"""Test that IVF with SVSVamana coarse quantizer supports storage kinds"""
314+
315+
def test_ivf_svsvamana_default(self):
316+
index = faiss.index_factory(32, "IVF256_SVSVamana32,Flat")
317+
self.assertEqual(index.d, 32)
318+
self.assertEqual(index.nlist, 256)
319+
320+
def test_ivf_svsvamana_sqi8(self):
321+
index = faiss.index_factory(32, "IVF256_SVSVamana32_SQI8,Flat")
322+
self.assertEqual(index.d, 32)
323+
self.assertEqual(index.nlist, 256)
324+
325+
def test_ivf_svsvamana_fp16(self):
326+
index = faiss.index_factory(32, "IVF256_SVSVamana32_FP16,Flat")
327+
self.assertEqual(index.d, 32)
328+
self.assertEqual(index.nlist, 256)
329+
330+
def test_ivf_svsvamana_fp32_explicit(self):
331+
index = faiss.index_factory(32, "IVF256_SVSVamana32_FP32,Flat")
332+
self.assertEqual(index.d, 32)
333+
self.assertEqual(index.nlist, 256)
334+
335+
def test_ivf_svsvamana_invalid_storage(self):
336+
with self.assertRaises(RuntimeError):
337+
faiss.index_factory(32, "IVF256_SVSVamana32_INVALID,Flat")
338+
339+
311340
@unittest.skipIf(_SKIP_SVS, _SKIP_REASON)
312341
class TestSVSAdapterFP16(TestSVSAdapter):
313342
"""Repeat all tests for SVS Float16 variant"""

0 commit comments

Comments
 (0)