faiss 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/ext/faiss/extconf.rb +2 -1
  4. data/ext/faiss/{index_rb.cpp → index.cpp} +1 -1
  5. data/ext/faiss/index_binary.cpp +1 -1
  6. data/ext/faiss/kmeans.cpp +1 -1
  7. data/ext/faiss/pca_matrix.cpp +1 -1
  8. data/ext/faiss/product_quantizer.cpp +1 -1
  9. data/ext/faiss/{utils_rb.cpp → utils.cpp} +1 -1
  10. data/lib/faiss/version.rb +1 -1
  11. data/vendor/faiss/faiss/AutoTune.cpp +93 -80
  12. data/vendor/faiss/faiss/Clustering.cpp +39 -240
  13. data/vendor/faiss/faiss/Clustering.h +6 -0
  14. data/vendor/faiss/faiss/IVFlib.cpp +41 -21
  15. data/vendor/faiss/faiss/Index.cpp +6 -5
  16. data/vendor/faiss/faiss/Index.h +5 -5
  17. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  18. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +49 -37
  19. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  21. data/vendor/faiss/faiss/IndexBinary.cpp +5 -3
  22. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  23. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  24. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  25. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  26. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +84 -92
  27. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  28. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  29. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  30. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +87 -415
  31. data/vendor/faiss/faiss/IndexFastScan.cpp +72 -109
  32. data/vendor/faiss/faiss/IndexFastScan.h +25 -23
  33. data/vendor/faiss/faiss/IndexFlat.cpp +27 -20
  34. data/vendor/faiss/faiss/IndexFlat.h +21 -18
  35. data/vendor/faiss/faiss/IndexFlatCodes.cpp +42 -19
  36. data/vendor/faiss/faiss/IndexHNSW.cpp +283 -145
  37. data/vendor/faiss/faiss/IndexHNSW.h +16 -2
  38. data/vendor/faiss/faiss/IndexIDMap.cpp +25 -21
  39. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  40. data/vendor/faiss/faiss/IndexIVF.cpp +465 -362
  41. data/vendor/faiss/faiss/IndexIVF.h +33 -12
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +96 -93
  44. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -1
  45. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +357 -238
  46. data/vendor/faiss/faiss/IndexIVFFastScan.h +42 -41
  47. data/vendor/faiss/faiss/IndexIVFFlat.cpp +36 -68
  48. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  49. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +53 -30
  50. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  51. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  52. data/vendor/faiss/faiss/IndexIVFPQ.cpp +71 -843
  53. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
  54. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  55. data/vendor/faiss/faiss/IndexIVFPQR.cpp +21 -17
  56. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +26 -39
  57. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +2 -1
  58. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +475 -476
  59. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +248 -93
  60. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  61. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  62. data/vendor/faiss/faiss/IndexLSH.cpp +36 -19
  63. data/vendor/faiss/faiss/IndexLattice.cpp +13 -13
  64. data/vendor/faiss/faiss/IndexNNDescent.cpp +36 -21
  65. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  66. data/vendor/faiss/faiss/IndexNSG.cpp +39 -23
  67. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +31 -11
  68. data/vendor/faiss/faiss/IndexPQ.cpp +128 -221
  69. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  70. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  71. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  72. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  73. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  74. data/vendor/faiss/faiss/IndexRaBitQ.cpp +11 -36
  75. data/vendor/faiss/faiss/IndexRaBitQ.h +2 -1
  76. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +41 -277
  77. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +183 -27
  78. data/vendor/faiss/faiss/IndexRefine.cpp +30 -25
  79. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  80. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  81. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  82. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  83. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
  84. data/vendor/faiss/faiss/IndexShards.cpp +10 -9
  85. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  86. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  87. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  88. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  89. data/vendor/faiss/faiss/MetricType.h +14 -7
  90. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  91. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  92. data/vendor/faiss/faiss/VectorTransform.cpp +237 -149
  93. data/vendor/faiss/faiss/VectorTransform.h +16 -16
  94. data/vendor/faiss/faiss/build.cpp +23 -0
  95. data/vendor/faiss/faiss/build.h +15 -0
  96. data/vendor/faiss/faiss/clone_index.cpp +48 -47
  97. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  98. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  99. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  100. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  101. data/vendor/faiss/faiss/factory_tools.cpp +5 -0
  102. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  103. data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
  104. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
  106. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  107. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  108. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  109. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  110. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  111. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  112. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  113. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  114. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  115. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  116. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
  117. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  118. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
  119. data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
  120. data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
  121. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  122. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  123. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +29 -25
  124. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  125. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  126. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -0
  127. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  128. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  129. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +16 -16
  130. data/vendor/faiss/faiss/impl/CodePacker.cpp +3 -3
  131. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +1 -1
  132. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  133. data/vendor/faiss/faiss/impl/FaissAssert.h +6 -3
  134. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  135. data/vendor/faiss/faiss/impl/HNSW.cpp +92 -317
  136. data/vendor/faiss/faiss/impl/HNSW.h +13 -34
  137. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  138. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  139. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  140. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +82 -77
  141. data/vendor/faiss/faiss/impl/NNDescent.cpp +62 -25
  142. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  143. data/vendor/faiss/faiss/impl/NSG.cpp +38 -21
  144. data/vendor/faiss/faiss/impl/NSG.h +4 -4
  145. data/vendor/faiss/faiss/impl/Panorama.cpp +23 -6
  146. data/vendor/faiss/faiss/impl/Panorama.h +258 -87
  147. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  148. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  149. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +46 -32
  150. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  151. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  152. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  153. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +30 -23
  154. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  155. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +55 -49
  156. data/vendor/faiss/faiss/impl/RaBitQUtils.h +65 -0
  157. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +296 -283
  158. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +26 -23
  159. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  160. data/vendor/faiss/faiss/impl/ResultHandler.h +99 -75
  161. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +52 -4
  162. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -1
  163. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  164. data/vendor/faiss/faiss/impl/VisitedTable.h +7 -0
  165. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  166. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  167. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  168. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  169. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  170. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  171. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  172. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  173. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  174. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  175. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  176. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  177. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  178. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  179. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  180. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  181. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  182. data/vendor/faiss/faiss/impl/expanded_scanners.h +8 -3
  183. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  184. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  185. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  186. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  187. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  188. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
  189. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +169 -2
  190. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  191. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  192. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  193. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  194. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  195. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  196. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -356
  197. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  198. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  199. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +282 -134
  200. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  201. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  202. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
  203. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
  204. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
  205. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
  206. data/vendor/faiss/faiss/impl/index_read.cpp +1132 -45
  207. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
  208. data/vendor/faiss/faiss/impl/index_write.cpp +95 -13
  209. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  210. data/vendor/faiss/faiss/impl/io_macros.h +33 -16
  211. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  212. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +37 -23
  213. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  214. data/vendor/faiss/faiss/impl/mapped_io.cpp +6 -6
  215. data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
  216. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  217. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  218. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  219. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  220. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
  221. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
  222. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
  223. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx2.cpp → pq_code_distance-avx2.h} +9 -13
  224. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx512.cpp → pq_code_distance-avx512.h} +9 -57
  225. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +29 -111
  226. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  227. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +238 -5
  228. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -7
  229. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
  230. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +311 -477
  231. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  232. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +1 -1
  233. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +3 -2
  234. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +102 -11
  235. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +27 -1
  236. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +3 -3
  237. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +148 -0
  238. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +167 -0
  239. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +59 -0
  240. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +163 -0
  241. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
  242. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +192 -8
  243. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +12 -0
  244. data/vendor/faiss/faiss/impl/simd_dispatch.h +100 -66
  245. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  246. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +264 -172
  247. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  248. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  249. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  250. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +270 -218
  251. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  252. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  253. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  254. data/vendor/faiss/faiss/index_factory.cpp +86 -18
  255. data/vendor/faiss/faiss/index_io.h +24 -0
  256. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
  257. data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
  258. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  259. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
  260. data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
  261. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  262. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +13 -13
  263. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  264. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +1 -1
  265. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  266. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  267. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  268. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  269. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  270. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  271. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  272. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
  273. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +18 -2
  274. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
  275. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +12 -3
  276. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +7 -2
  277. data/vendor/faiss/faiss/utils/Heap.cpp +10 -10
  278. data/vendor/faiss/faiss/utils/NeuralNet.cpp +47 -36
  279. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  280. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  281. data/vendor/faiss/faiss/utils/distances.cpp +390 -560
  282. data/vendor/faiss/faiss/utils/distances.h +20 -1
  283. data/vendor/faiss/faiss/utils/distances_dispatch.h +117 -37
  284. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  285. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  286. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  287. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  288. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  289. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  290. data/vendor/faiss/faiss/utils/distances_simd.cpp +5 -177
  291. data/vendor/faiss/faiss/utils/extra_distances.cpp +9 -8
  292. data/vendor/faiss/faiss/utils/extra_distances.h +32 -6
  293. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  294. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  295. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  296. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  297. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
  298. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  299. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  300. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
  301. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
  302. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
  303. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
  304. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
  305. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
  306. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
  307. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
  308. data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
  309. data/vendor/faiss/faiss/utils/partitioning.h +31 -0
  310. data/vendor/faiss/faiss/utils/popcount.h +29 -0
  311. data/vendor/faiss/faiss/utils/pq_code_distance.h +2 -2
  312. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  313. data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
  314. data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
  315. data/vendor/faiss/faiss/utils/rabitq_simd.h +57 -536
  316. data/vendor/faiss/faiss/utils/random.cpp +6 -6
  317. data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
  318. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +5 -1
  319. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +213 -4
  320. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +163 -10
  321. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +250 -4
  322. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +7 -4
  323. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
  324. data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
  325. data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +2 -1
  326. data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
  327. data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
  328. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
  329. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
  330. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
  331. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
  332. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
  333. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  334. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  335. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  336. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  337. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  338. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  339. data/vendor/faiss/faiss/utils/simd_levels.cpp +17 -5
  340. data/vendor/faiss/faiss/utils/simd_levels.h +93 -1
  341. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  342. data/vendor/faiss/faiss/utils/utils.cpp +5 -5
  343. data/vendor/faiss/faiss/utils/utils.h +3 -3
  344. metadata +119 -34
  345. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  346. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  347. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -224
  348. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -230
  349. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  350. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  351. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  352. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  353. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -235
  354. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  355. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  356. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -449
  357. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  358. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  359. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  360. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -365
  361. /data/ext/faiss/{utils_rb.h → utils.h} +0 -0
@@ -14,9 +14,8 @@
14
14
 
15
15
  #include <faiss/impl/AuxIndexStructures.h>
16
16
  #include <faiss/impl/FaissAssert.h>
17
- #include <faiss/impl/FastScanDistancePostProcessing.h>
18
- #include <faiss/impl/LookupTableScaler.h>
19
- #include <faiss/impl/pq4_fast_scan.h>
17
+ #include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
18
+ #include <faiss/impl/fast_scan/fast_scan.h>
20
19
  #include <faiss/impl/simd_dispatch.h>
21
20
  #include <faiss/invlists/BlockInvertedLists.h>
22
21
  #include <faiss/utils/distances.h>
@@ -30,46 +29,46 @@ inline size_t roundup(size_t a, size_t b) {
30
29
  }
31
30
 
32
31
  IndexIVFAdditiveQuantizerFastScan::IndexIVFAdditiveQuantizerFastScan(
33
- Index* quantizer,
34
- AdditiveQuantizer* aq,
35
- size_t d,
36
- size_t nlist,
32
+ Index* quantizer_,
33
+ AdditiveQuantizer* aq_,
34
+ size_t d_,
35
+ size_t nlist_,
37
36
  MetricType metric,
38
- int bbs,
39
- bool own_invlists)
40
- : IndexIVFFastScan(quantizer, d, nlist, 0, metric, own_invlists) {
41
- if (aq != nullptr) {
42
- init(aq, nlist, metric, bbs, own_invlists);
37
+ int bbs_,
38
+ bool own_invlists_)
39
+ : IndexIVFFastScan(quantizer_, d_, nlist_, 0, metric, own_invlists_) {
40
+ if (aq_ != nullptr) {
41
+ init(aq_, nlist_, metric, bbs_, own_invlists_);
43
42
  }
44
43
  }
45
44
 
46
45
  void IndexIVFAdditiveQuantizerFastScan::init(
47
- AdditiveQuantizer* aq,
48
- size_t nlist,
46
+ AdditiveQuantizer* aq_,
47
+ size_t nlist_,
49
48
  MetricType metric,
50
- int bbs,
51
- bool own_invlists) {
52
- FAISS_THROW_IF_NOT(aq != nullptr);
53
- FAISS_THROW_IF_NOT(!aq->nbits.empty());
54
- FAISS_THROW_IF_NOT(aq->nbits[0] == 4);
49
+ int bbs_,
50
+ bool own_invlists_) {
51
+ FAISS_THROW_IF_NOT(aq_ != nullptr);
52
+ FAISS_THROW_IF_NOT(!aq_->nbits.empty());
53
+ FAISS_THROW_IF_NOT(aq_->nbits[0] == 4);
55
54
  if (metric == METRIC_INNER_PRODUCT) {
56
55
  FAISS_THROW_IF_NOT_MSG(
57
- aq->search_type == AdditiveQuantizer::ST_LUT_nonorm,
56
+ aq_->search_type == AdditiveQuantizer::ST_LUT_nonorm,
58
57
  "Search type must be ST_LUT_nonorm for IP metric");
59
58
  } else {
60
59
  FAISS_THROW_IF_NOT_MSG(
61
- aq->search_type == AdditiveQuantizer::ST_norm_lsq2x4 ||
62
- aq->search_type == AdditiveQuantizer::ST_norm_rq2x4,
60
+ aq_->search_type == AdditiveQuantizer::ST_norm_lsq2x4 ||
61
+ aq_->search_type == AdditiveQuantizer::ST_norm_rq2x4,
63
62
  "Search type must be lsq2x4 or rq2x4 for L2 metric");
64
63
  }
65
64
 
66
- this->aq = aq;
65
+ this->aq = aq_;
67
66
  if (metric_type == METRIC_L2) {
68
- M = aq->M + 2; // 2x4 bits AQ
67
+ M = aq_->M + 2; // 2x4 bits AQ
69
68
  } else {
70
- M = aq->M;
69
+ M = aq_->M;
71
70
  }
72
- init_fastscan(aq, M, 4, nlist, metric, bbs, own_invlists);
71
+ init_fastscan(aq_, M, 4, nlist_, metric, bbs_, own_invlists_);
73
72
 
74
73
  max_train_points = 1024 * ksub * M;
75
74
  by_residual = true;
@@ -77,7 +76,7 @@ void IndexIVFAdditiveQuantizerFastScan::init(
77
76
 
78
77
  IndexIVFAdditiveQuantizerFastScan::IndexIVFAdditiveQuantizerFastScan(
79
78
  const IndexIVFAdditiveQuantizer& orig,
80
- int bbs)
79
+ int bbs_)
81
80
  : IndexIVFFastScan(
82
81
  orig.quantizer,
83
82
  orig.d,
@@ -89,7 +88,7 @@ IndexIVFAdditiveQuantizerFastScan::IndexIVFAdditiveQuantizerFastScan(
89
88
  FAISS_THROW_IF_NOT(
90
89
  metric_type == METRIC_INNER_PRODUCT || !orig.by_residual);
91
90
 
92
- init(aq, nlist, metric_type, bbs, own_invlists);
91
+ init(aq, nlist, metric_type, bbs_, own_invlists);
93
92
 
94
93
  is_trained = orig.is_trained;
95
94
  ntotal = orig.ntotal;
@@ -130,6 +129,10 @@ IndexIVFAdditiveQuantizerFastScan::IndexIVFAdditiveQuantizerFastScan() {
130
129
  IndexIVFAdditiveQuantizerFastScan::~IndexIVFAdditiveQuantizerFastScan() =
131
130
  default;
132
131
 
132
+ size_t IndexIVFAdditiveQuantizerFastScan::fast_scan_code_size() const {
133
+ return M2 / 2;
134
+ }
135
+
133
136
  /*********************************************************
134
137
  * Training
135
138
  *********************************************************/
@@ -317,9 +320,8 @@ void IndexIVFAdditiveQuantizerFastScan::search(
317
320
  return;
318
321
  }
319
322
 
320
- NormTableScaler scaler(norm_scale);
321
323
  FastScanDistancePostProcessing context;
322
- context.norm_scaler = &scaler;
324
+ context.pq2x4_scale = norm_scale;
323
325
  IndexIVFFastScan::CoarseQuantized cq{nprobe};
324
326
  search_dispatch_implem(n, x, k, distances, labels, cq, context);
325
327
  }
@@ -393,7 +395,7 @@ void IndexIVFAdditiveQuantizerFastScan::compute_LUT(
393
395
  const FastScanDistancePostProcessing&) const {
394
396
  const size_t dim12 = ksub * M;
395
397
  const size_t ip_dim12 = aq->M * ksub;
396
- const size_t nprobe = cq.nprobe;
398
+ const size_t cq_nprobe = cq.nprobe;
397
399
 
398
400
  dis_tables.resize(n * dim12);
399
401
 
@@ -405,7 +407,7 @@ void IndexIVFAdditiveQuantizerFastScan::compute_LUT(
405
407
  if (by_residual) {
406
408
  // bias = coef * <q, c>
407
409
  // NOTE: q^2 is not added to `biases`
408
- biases.resize(n * nprobe);
410
+ biases.resize(n * cq_nprobe);
409
411
  with_simd_level([&]<SIMDLevel SL>() {
410
412
  #pragma omp parallel
411
413
  {
@@ -413,8 +415,9 @@ void IndexIVFAdditiveQuantizerFastScan::compute_LUT(
413
415
  float* c = centroid.data();
414
416
 
415
417
  #pragma omp for
416
- for (idx_t ij = 0; ij < n * nprobe; ij++) {
417
- int i = ij / nprobe;
418
+ for (idx_t ij = 0; ij < static_cast<idx_t>(n * cq_nprobe);
419
+ ij++) {
420
+ idx_t i = ij / cq_nprobe;
418
421
  quantizer->reconstruct(cq.ids[ij], c);
419
422
  biases[ij] = coef * fvec_inner_product<SL>(c, x + i * d, d);
420
423
  }
@@ -440,7 +443,7 @@ void IndexIVFAdditiveQuantizerFastScan::compute_LUT(
440
443
 
441
444
  // combine them
442
445
  #pragma omp parallel for if (n > 100)
443
- for (idx_t i = 0; i < n; i++) {
446
+ for (idx_t i = 0; i < static_cast<idx_t>(n); i++) {
444
447
  float* tab = dis_tables.data() + i * dim12 + ip_dim12;
445
448
  memcpy(tab, norm_lut, norm_dim12 * sizeof(*tab));
446
449
  }
@@ -454,26 +457,26 @@ void IndexIVFAdditiveQuantizerFastScan::compute_LUT(
454
457
 
455
458
  /********** IndexIVFLocalSearchQuantizerFastScan ************/
456
459
  IndexIVFLocalSearchQuantizerFastScan::IndexIVFLocalSearchQuantizerFastScan(
457
- Index* quantizer,
458
- size_t d,
459
- size_t nlist,
460
- size_t M,
461
- size_t nbits,
460
+ Index* quantizer_,
461
+ size_t d_,
462
+ size_t nlist_,
463
+ size_t M_,
464
+ size_t nbits_,
462
465
  MetricType metric,
463
466
  Search_type_t search_type,
464
- int bbs,
465
- bool own_invlists)
467
+ int bbs_,
468
+ bool own_invlists_)
466
469
  : IndexIVFAdditiveQuantizerFastScan(
467
- quantizer,
470
+ quantizer_,
468
471
  nullptr,
469
- d,
470
- nlist,
472
+ d_,
473
+ nlist_,
471
474
  metric,
472
- bbs,
473
- own_invlists),
474
- lsq(d, M, nbits, search_type) {
475
- FAISS_THROW_IF_NOT(nbits == 4);
476
- init(&lsq, nlist, metric, bbs, own_invlists);
475
+ bbs_,
476
+ own_invlists_),
477
+ lsq(d_, M_, nbits_, search_type) {
478
+ FAISS_THROW_IF_NOT(nbits_ == 4);
479
+ init(&lsq, nlist_, metric, bbs_, own_invlists_);
477
480
  }
478
481
 
479
482
  IndexIVFLocalSearchQuantizerFastScan::IndexIVFLocalSearchQuantizerFastScan() {
@@ -482,26 +485,26 @@ IndexIVFLocalSearchQuantizerFastScan::IndexIVFLocalSearchQuantizerFastScan() {
482
485
 
483
486
  /********** IndexIVFResidualQuantizerFastScan ************/
484
487
  IndexIVFResidualQuantizerFastScan::IndexIVFResidualQuantizerFastScan(
485
- Index* quantizer,
486
- size_t d,
487
- size_t nlist,
488
- size_t M,
489
- size_t nbits,
488
+ Index* quantizer_,
489
+ size_t d_,
490
+ size_t nlist_,
491
+ size_t M_,
492
+ size_t nbits_,
490
493
  MetricType metric,
491
494
  Search_type_t search_type,
492
- int bbs,
493
- bool own_invlists)
495
+ int bbs_,
496
+ bool own_invlists_)
494
497
  : IndexIVFAdditiveQuantizerFastScan(
495
- quantizer,
498
+ quantizer_,
496
499
  nullptr,
497
- d,
498
- nlist,
500
+ d_,
501
+ nlist_,
499
502
  metric,
500
- bbs,
501
- own_invlists),
502
- rq(d, M, nbits, search_type) {
503
- FAISS_THROW_IF_NOT(nbits == 4);
504
- init(&rq, nlist, metric, bbs, own_invlists);
503
+ bbs_,
504
+ own_invlists_),
505
+ rq(d_, M_, nbits_, search_type) {
506
+ FAISS_THROW_IF_NOT(nbits_ == 4);
507
+ init(&rq, nlist_, metric, bbs_, own_invlists_);
505
508
  }
506
509
 
507
510
  IndexIVFResidualQuantizerFastScan::IndexIVFResidualQuantizerFastScan() {
@@ -511,27 +514,27 @@ IndexIVFResidualQuantizerFastScan::IndexIVFResidualQuantizerFastScan() {
511
514
  /********** IndexIVFProductLocalSearchQuantizerFastScan ************/
512
515
  IndexIVFProductLocalSearchQuantizerFastScan::
513
516
  IndexIVFProductLocalSearchQuantizerFastScan(
514
- Index* quantizer,
515
- size_t d,
516
- size_t nlist,
517
+ Index* quantizer_,
518
+ size_t d_,
519
+ size_t nlist_,
517
520
  size_t nsplits,
518
521
  size_t Msub,
519
- size_t nbits,
522
+ size_t nbits_,
520
523
  MetricType metric,
521
524
  Search_type_t search_type,
522
- int bbs,
523
- bool own_invlists)
525
+ int bbs_,
526
+ bool own_invlists_)
524
527
  : IndexIVFAdditiveQuantizerFastScan(
525
- quantizer,
528
+ quantizer_,
526
529
  nullptr,
527
- d,
528
- nlist,
530
+ d_,
531
+ nlist_,
529
532
  metric,
530
- bbs,
531
- own_invlists),
532
- plsq(d, nsplits, Msub, nbits, search_type) {
533
- FAISS_THROW_IF_NOT(nbits == 4);
534
- init(&plsq, nlist, metric, bbs, own_invlists);
533
+ bbs_,
534
+ own_invlists_),
535
+ plsq(d_, nsplits, Msub, nbits_, search_type) {
536
+ FAISS_THROW_IF_NOT(nbits_ == 4);
537
+ init(&plsq, nlist_, metric, bbs_, own_invlists_);
535
538
  }
536
539
 
537
540
  IndexIVFProductLocalSearchQuantizerFastScan::
@@ -542,27 +545,27 @@ IndexIVFProductLocalSearchQuantizerFastScan::
542
545
  /********** IndexIVFProductResidualQuantizerFastScan ************/
543
546
  IndexIVFProductResidualQuantizerFastScan::
544
547
  IndexIVFProductResidualQuantizerFastScan(
545
- Index* quantizer,
546
- size_t d,
547
- size_t nlist,
548
+ Index* quantizer_,
549
+ size_t d_,
550
+ size_t nlist_,
548
551
  size_t nsplits,
549
552
  size_t Msub,
550
- size_t nbits,
553
+ size_t nbits_,
551
554
  MetricType metric,
552
555
  Search_type_t search_type,
553
- int bbs,
554
- bool own_invlists)
556
+ int bbs_,
557
+ bool own_invlists_)
555
558
  : IndexIVFAdditiveQuantizerFastScan(
556
- quantizer,
559
+ quantizer_,
557
560
  nullptr,
558
- d,
559
- nlist,
561
+ d_,
562
+ nlist_,
560
563
  metric,
561
- bbs,
562
- own_invlists),
563
- prq(d, nsplits, Msub, nbits, search_type) {
564
- FAISS_THROW_IF_NOT(nbits == 4);
565
- init(&prq, nlist, metric, bbs, own_invlists);
564
+ bbs_,
565
+ own_invlists_),
566
+ prq(d_, nsplits, Msub, nbits_, search_type) {
567
+ FAISS_THROW_IF_NOT(nbits_ == 4);
568
+ init(&prq, nlist_, metric, bbs_, own_invlists_);
566
569
  }
567
570
 
568
571
  IndexIVFProductResidualQuantizerFastScan::
@@ -12,8 +12,8 @@
12
12
  #include <faiss/IndexIVFAdditiveQuantizer.h>
13
13
  #include <faiss/IndexIVFFastScan.h>
14
14
  #include <faiss/impl/AdditiveQuantizer.h>
15
- #include <faiss/impl/FastScanDistancePostProcessing.h>
16
15
  #include <faiss/impl/ProductAdditiveQuantizer.h>
16
+ #include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
17
17
  #include <faiss/utils/AlignedTable.h>
18
18
 
19
19
  namespace faiss {
@@ -70,6 +70,9 @@ struct IndexIVFAdditiveQuantizerFastScan : IndexIVFFastScan {
70
70
  const IndexIVFAdditiveQuantizer& orig,
71
71
  int bbs = 32);
72
72
 
73
+ /// Packed code size: M2 / 2 bytes (4-bit AQ sub-quantizer nibbles)
74
+ size_t fast_scan_code_size() const override;
75
+
73
76
  void train_encoder(idx_t n, const float* x, const idx_t* assign) override;
74
77
 
75
78
  idx_t train_encoder_num_vectors() const override;