@@ -2113,6 +2113,57 @@ TYPED_TEST(SVSTest, resolve_epsilon_runtime_params) {
2113
2113
VecSimIndex_Free (index );
2114
2114
}
2115
2115
2116
+ TEST (SVSTest, quant_modes) {
2117
+ const size_t dim = 4 ;
2118
+ const size_t n = 100 ;
2119
+ const size_t k = 10 ;
2120
+
2121
+ for (auto quant_bits :
2122
+ {VecSimSvsQuant_NONE, VecSimSvsQuant_8, VecSimSvsQuant_4, VecSimSvsQuant_4x4,
2123
+ VecSimSvsQuant_4x8, VecSimSvsQuant_4x8_leanvec, VecSimSvsQuant_8x8_leanvec}) {
2124
+ SVSParams params = {
2125
+ .type = VecSimType_FLOAT32,
2126
+ .dim = dim,
2127
+ .metric = VecSimMetric_L2,
2128
+ .quantBits = quant_bits,
2129
+ };
2130
+
2131
+ VecSimParams index_params = CreateParams (params);
2132
+ VecSimIndex *index = VecSimIndex_New (&index_params);
2133
+ if (index == nullptr ) {
2134
+ if (std::get<1 >(svs_details::isSVSQuantBitsSupported (quant_bits))) {
2135
+ GTEST_FAIL () << " Failed to create SVS index" ;
2136
+ } else {
2137
+ GTEST_SKIP () << " SVS LVQ is not supported." ;
2138
+ }
2139
+ }
2140
+
2141
+ EXPECT_EQ (VecSimIndex_IndexSize (index ), 0 );
2142
+
2143
+ std::vector<float [dim]> v (n);
2144
+ for (size_t i = 0 ; i < n; i++) {
2145
+ GenerateVector<float >(v[i], dim, i);
2146
+ }
2147
+
2148
+ std::vector<size_t > ids (n);
2149
+ std::iota (ids.begin (), ids.end (), 0 );
2150
+
2151
+ auto svs_index = dynamic_cast <SVSIndexBase *>(index );
2152
+ ASSERT_NE (svs_index, nullptr );
2153
+ svs_index->addVectors (v.data (), ids.data (), n);
2154
+
2155
+ ASSERT_EQ (VecSimIndex_IndexSize (index ), n);
2156
+
2157
+ float query[] = {50 , 50 , 50 , 50 };
2158
+ auto verify_res = [&](size_t id, double score, size_t index ) {
2159
+ EXPECT_EQ (id, (index + 45 ));
2160
+ };
2161
+ runTopKSearchTest (index , query, k, verify_res, nullptr , BY_ID);
2162
+
2163
+ VecSimIndex_Free (index );
2164
+ }
2165
+ }
2166
+
2116
2167
#else // HAVE_SVS
2117
2168
2118
2169
TEST (SVSTest, svs_not_supported) {
0 commit comments