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
@@ -17,7 +17,7 @@
17
17
 
18
18
  #define FAISS_VERSION_MAJOR 1
19
19
  #define FAISS_VERSION_MINOR 14
20
- #define FAISS_VERSION_PATCH 1
20
+ #define FAISS_VERSION_PATCH 2
21
21
 
22
22
  // Macro to combine the version components into a single string
23
23
  #ifndef FAISS_STRINGIFY
@@ -114,8 +114,8 @@ struct Index {
114
114
  MetricType metric_type;
115
115
  float metric_arg; ///< argument of the metric type
116
116
 
117
- explicit Index(idx_t d = 0, MetricType metric = METRIC_L2)
118
- : d(d),
117
+ explicit Index(idx_t d_in = 0, MetricType metric = METRIC_L2)
118
+ : d(static_cast<int>(d_in)),
119
119
  ntotal(0),
120
120
  verbose(false),
121
121
  is_trained(true),
@@ -131,7 +131,7 @@ struct Index {
131
131
  */
132
132
  virtual void train(idx_t n, const float* x);
133
133
 
134
- /** Perfrom training on a representative set of vectors and a representative
134
+ /** Perform training on a representative set of vectors and a representative
135
135
  * set of queries
136
136
  *
137
137
  * @param n nb of training vectors
@@ -139,7 +139,7 @@ struct Index {
139
139
  * @param n_train_q nb of training queries
140
140
  * @param xq_train training queries, size n_train_q * d
141
141
  */
142
- virtual void train(
142
+ virtual void train_with_queries(
143
143
  idx_t n,
144
144
  const float* x,
145
145
  idx_t n_train_q,
@@ -13,10 +13,6 @@
13
13
  #include <cstdint>
14
14
  #include <cstdio>
15
15
 
16
- #ifdef __SSE3__
17
- #include <immintrin.h>
18
- #endif
19
-
20
16
  #include <algorithm>
21
17
 
22
18
  #include <faiss/IndexIVFPQ.h>
@@ -138,12 +134,13 @@ struct Distance2Level : DistanceComputer {
138
134
  size_t d;
139
135
  const Index2Layer& storage;
140
136
  std::vector<float> buf;
141
- const float* q;
137
+ const float* q = nullptr;
142
138
 
143
- const float *pq_l1_tab, *pq_l2_tab;
139
+ const float* pq_l1_tab = nullptr;
140
+ const float* pq_l2_tab = nullptr;
144
141
 
145
- explicit Distance2Level(const Index2Layer& storage) : storage(storage) {
146
- d = storage.d;
142
+ explicit Distance2Level(const Index2Layer& storage_) : storage(storage_) {
143
+ d = storage_.d;
147
144
  FAISS_ASSERT(storage.pq.dsub == 4);
148
145
  pq_l2_tab = storage.pq.centroids.data();
149
146
  buf.resize(2 * d);
@@ -162,46 +159,40 @@ struct Distance2Level : DistanceComputer {
162
159
 
163
160
  // well optimized for xNN+PQNN
164
161
  struct DistanceXPQ4 : Distance2Level {
165
- int M, k;
162
+ int M = 0;
163
+ int k = 0;
166
164
 
167
- explicit DistanceXPQ4(const Index2Layer& storage)
168
- : Distance2Level(storage) {
165
+ explicit DistanceXPQ4(const Index2Layer& storage_)
166
+ : Distance2Level(storage_) {
169
167
  const IndexFlat* quantizer =
170
168
  dynamic_cast<IndexFlat*>(storage.q1.quantizer);
171
169
 
172
170
  FAISS_ASSERT(quantizer);
173
- M = storage.pq.M;
171
+ M = static_cast<int>(storage.pq.M);
174
172
  pq_l1_tab = quantizer->get_xb();
175
173
  }
176
174
 
177
175
  float operator()(idx_t i) override {
178
- #ifdef __SSE3__
179
176
  const uint8_t* code = storage.codes.data() + i * storage.code_size;
180
177
  idx_t key = 0;
181
178
  memcpy(&key, code, storage.code_size_1);
182
179
  code += storage.code_size_1;
183
180
 
184
- // walking pointers
185
181
  const float* qa = q;
186
- const __m128* l1_t = (const __m128*)(pq_l1_tab + d * key);
187
- const __m128* pq_l2_t = (const __m128*)pq_l2_tab;
188
- __m128 accu = _mm_setzero_ps();
182
+ const float* l1 = pq_l1_tab + d * key;
183
+ const float* l2 = pq_l2_tab;
184
+ float accu = 0;
189
185
 
190
186
  for (int m = 0; m < M; m++) {
191
- __m128 qi = _mm_loadu_ps(qa);
192
- __m128 recons = _mm_add_ps(l1_t[m], pq_l2_t[*code++]);
193
- __m128 diff = _mm_sub_ps(qi, recons);
194
- accu = _mm_add_ps(accu, _mm_mul_ps(diff, diff));
195
- pq_l2_t += 256;
187
+ for (int j = 0; j < 4; j++) {
188
+ float diff = qa[j] - (l1[m * 4 + j] + l2[*code * 4 + j]);
189
+ accu += diff * diff;
190
+ }
191
+ code++;
192
+ l2 += 256 * 4;
196
193
  qa += 4;
197
194
  }
198
-
199
- accu = _mm_hadd_ps(accu, accu);
200
- accu = _mm_hadd_ps(accu, accu);
201
- return _mm_cvtss_f32(accu);
202
- #else
203
- FAISS_THROW_MSG("not implemented for non-x64 platforms");
204
- #endif
195
+ return accu;
205
196
  }
206
197
  };
207
198
 
@@ -209,15 +200,15 @@ struct DistanceXPQ4 : Distance2Level {
209
200
  struct Distance2xXPQ4 : Distance2Level {
210
201
  int M_2, mi_nbits;
211
202
 
212
- explicit Distance2xXPQ4(const Index2Layer& storage)
213
- : Distance2Level(storage) {
203
+ explicit Distance2xXPQ4(const Index2Layer& storage_)
204
+ : Distance2Level(storage_) {
214
205
  const MultiIndexQuantizer* mi =
215
206
  dynamic_cast<MultiIndexQuantizer*>(storage.q1.quantizer);
216
207
 
217
208
  FAISS_ASSERT(mi);
218
209
  FAISS_ASSERT(storage.pq.M % 2 == 0);
219
- M_2 = storage.pq.M / 2;
220
- mi_nbits = mi->pq.nbits;
210
+ M_2 = static_cast<int>(storage.pq.M / 2);
211
+ mi_nbits = static_cast<int>(mi->pq.nbits);
221
212
  pq_l1_tab = mi->pq.centroids.data();
222
213
  }
223
214
 
@@ -226,42 +217,36 @@ struct Distance2xXPQ4 : Distance2Level {
226
217
  int64_t key01 = 0;
227
218
  memcpy(&key01, code, storage.code_size_1);
228
219
  code += storage.code_size_1;
229
- #ifdef __SSE3__
230
220
 
231
- // walking pointers
232
221
  const float* qa = q;
233
- const __m128* pq_l1_t = (const __m128*)pq_l1_tab;
234
- const __m128* pq_l2_t = (const __m128*)pq_l2_tab;
235
- __m128 accu = _mm_setzero_ps();
222
+ const float* l1 = pq_l1_tab;
223
+ const float* l2 = pq_l2_tab;
224
+ float accu = 0;
236
225
 
237
226
  for (int mi_m = 0; mi_m < 2; mi_m++) {
238
227
  int64_t l1_idx = key01 & (((int64_t)1 << mi_nbits) - 1);
239
- const __m128* pq_l1 = pq_l1_t + M_2 * l1_idx;
228
+ const float* l1_sub = l1 + M_2 * l1_idx * 4;
240
229
 
241
230
  for (int m = 0; m < M_2; m++) {
242
- __m128 qi = _mm_loadu_ps(qa);
243
- __m128 recons = _mm_add_ps(pq_l1[m], pq_l2_t[*code++]);
244
- __m128 diff = _mm_sub_ps(qi, recons);
245
- accu = _mm_add_ps(accu, _mm_mul_ps(diff, diff));
246
- pq_l2_t += 256;
231
+ for (int j = 0; j < 4; j++) {
232
+ float diff =
233
+ qa[j] - (l1_sub[m * 4 + j] + l2[*code * 4 + j]);
234
+ accu += diff * diff;
235
+ }
236
+ code++;
237
+ l2 += 256 * 4;
247
238
  qa += 4;
248
239
  }
249
- pq_l1_t += M_2 << mi_nbits;
240
+ l1 += (M_2 << mi_nbits) * 4;
250
241
  key01 >>= mi_nbits;
251
242
  }
252
- accu = _mm_hadd_ps(accu, accu);
253
- accu = _mm_hadd_ps(accu, accu);
254
- return _mm_cvtss_f32(accu);
255
- #else
256
- FAISS_THROW_MSG("not implemented for non-x64 platforms");
257
- #endif
243
+ return accu;
258
244
  }
259
245
  };
260
246
 
261
247
  } // namespace
262
248
 
263
249
  DistanceComputer* Index2Layer::get_distance_computer() const {
264
- #ifdef __SSE3__
265
250
  const MultiIndexQuantizer* mi =
266
251
  dynamic_cast<MultiIndexQuantizer*>(q1.quantizer);
267
252
 
@@ -274,7 +259,6 @@ DistanceComputer* Index2Layer::get_distance_computer() const {
274
259
  if (fl && pq.dsub == 4) {
275
260
  return new DistanceXPQ4(*this);
276
261
  }
277
- #endif
278
262
 
279
263
  return Index::get_distance_computer();
280
264
  }
@@ -13,6 +13,7 @@
13
13
  #include <faiss/impl/FaissAssert.h>
14
14
  #include <faiss/impl/ResidualQuantizer.h>
15
15
  #include <faiss/impl/ResultHandler.h>
16
+ #include <faiss/utils/distances_dispatch.h>
16
17
  #include <faiss/utils/extra_distances.h>
17
18
 
18
19
  namespace faiss {
@@ -22,10 +23,10 @@ namespace faiss {
22
23
  **************************************************************************************/
23
24
 
24
25
  IndexAdditiveQuantizer::IndexAdditiveQuantizer(
25
- idx_t d,
26
- AdditiveQuantizer* aq,
26
+ idx_t d_,
27
+ AdditiveQuantizer* aq_,
27
28
  MetricType metric)
28
- : IndexFlatCodes(aq->code_size, d, metric), aq(aq) {
29
+ : IndexFlatCodes(aq_->code_size, d_, metric), aq(aq_) {
29
30
  FAISS_THROW_IF_NOT(metric == METRIC_INNER_PRODUCT || metric == METRIC_L2);
30
31
  }
31
32
 
@@ -44,14 +45,14 @@ struct AQDistanceComputerDecompress : FlatCodesDistanceComputer {
44
45
 
45
46
  AQDistanceComputerDecompress(
46
47
  const IndexAdditiveQuantizer& iaq,
47
- VectorDistance vd)
48
+ VectorDistance vd_)
48
49
  : FlatCodesDistanceComputer(iaq.codes.data(), iaq.code_size),
49
50
  tmp(iaq.d * 2),
50
51
  aq(*iaq.aq),
51
- vd(vd),
52
+ vd(vd_),
52
53
  d(iaq.d) {}
53
54
 
54
- const float* q;
55
+ const float* q = nullptr;
55
56
  void set_query(const float* x) final {
56
57
  q = x;
57
58
  }
@@ -82,7 +83,7 @@ struct AQDistanceComputerLUT : FlatCodesDistanceComputer {
82
83
  aq(*iaq.aq),
83
84
  d(iaq.d) {}
84
85
 
85
- float bias;
86
+ float bias = 0.0f;
86
87
  void set_query(const float* x) final {
87
88
  q = x;
88
89
  // this is quite sub-optimal for multiple queries
@@ -127,7 +128,7 @@ void search_with_decompress(
127
128
  typename BlockResultHandler::SingleResultHandler;
128
129
 
129
130
  #pragma omp parallel for if (res.nq > 100)
130
- for (int64_t q = 0; q < res.nq; q++) {
131
+ for (int64_t q = 0; q < static_cast<int64_t>(res.nq); q++) {
131
132
  SingleResultHandler resi(res);
132
133
  resi.begin(q);
133
134
  std::vector<float> tmp(ir.d);
@@ -163,7 +164,7 @@ void search_with_LUT(
163
164
  aq.compute_LUT(nq, xq, LUT.get());
164
165
 
165
166
  #pragma omp parallel for if (nq > 100)
166
- for (int64_t q = 0; q < nq; q++) {
167
+ for (int64_t q = 0; q < static_cast<int64_t>(nq); q++) {
167
168
  SingleResultHandler resi(res);
168
169
  resi.begin(q);
169
170
  std::vector<float> tmp(aq.d);
@@ -298,23 +299,23 @@ void IndexAdditiveQuantizer::sa_decode(idx_t n, const uint8_t* bytes, float* x)
298
299
  **************************************************************************************/
299
300
 
300
301
  IndexResidualQuantizer::IndexResidualQuantizer(
301
- int d, ///< dimensionality of the input vectors
302
+ int d_, ///< dimensionality of the input vectors
302
303
  size_t M, ///< number of subquantizers
303
304
  size_t nbits, ///< number of bit per subvector index
304
305
  MetricType metric,
305
306
  Search_type_t search_type)
306
307
  : IndexResidualQuantizer(
307
- d,
308
+ d_,
308
309
  std::vector<size_t>(M, nbits),
309
310
  metric,
310
311
  search_type) {}
311
312
 
312
313
  IndexResidualQuantizer::IndexResidualQuantizer(
313
- int d,
314
+ int d_,
314
315
  const std::vector<size_t>& nbits,
315
316
  MetricType metric,
316
317
  Search_type_t search_type)
317
- : IndexAdditiveQuantizer(d, &rq, metric), rq(d, nbits, search_type) {
318
+ : IndexAdditiveQuantizer(d_, &rq, metric), rq(d_, nbits, search_type) {
318
319
  code_size = rq.code_size;
319
320
  is_trained = false;
320
321
  }
@@ -332,13 +333,13 @@ void IndexResidualQuantizer::train(idx_t n, const float* x) {
332
333
  **************************************************************************************/
333
334
 
334
335
  IndexLocalSearchQuantizer::IndexLocalSearchQuantizer(
335
- int d,
336
+ int d_,
336
337
  size_t M, ///< number of subquantizers
337
338
  size_t nbits, ///< number of bit per subvector index
338
339
  MetricType metric,
339
340
  Search_type_t search_type)
340
- : IndexAdditiveQuantizer(d, &lsq, metric),
341
- lsq(d, M, nbits, search_type) {
341
+ : IndexAdditiveQuantizer(d_, &lsq, metric),
342
+ lsq(d_, M, nbits, search_type) {
342
343
  code_size = lsq.code_size;
343
344
  is_trained = false;
344
345
  }
@@ -356,14 +357,14 @@ void IndexLocalSearchQuantizer::train(idx_t n, const float* x) {
356
357
  **************************************************************************************/
357
358
 
358
359
  IndexProductResidualQuantizer::IndexProductResidualQuantizer(
359
- int d, ///< dimensionality of the input vectors
360
+ int d_, ///< dimensionality of the input vectors
360
361
  size_t nsplits, ///< number of residual quantizers
361
362
  size_t Msub, ///< number of subquantizers per RQ
362
363
  size_t nbits, ///< number of bit per subvector index
363
364
  MetricType metric,
364
365
  Search_type_t search_type)
365
- : IndexAdditiveQuantizer(d, &prq, metric),
366
- prq(d, nsplits, Msub, nbits, search_type) {
366
+ : IndexAdditiveQuantizer(d_, &prq, metric),
367
+ prq(d_, nsplits, Msub, nbits, search_type) {
367
368
  code_size = prq.code_size;
368
369
  is_trained = false;
369
370
  }
@@ -381,14 +382,14 @@ void IndexProductResidualQuantizer::train(idx_t n, const float* x) {
381
382
  **************************************************************************************/
382
383
 
383
384
  IndexProductLocalSearchQuantizer::IndexProductLocalSearchQuantizer(
384
- int d, ///< dimensionality of the input vectors
385
+ int d_, ///< dimensionality of the input vectors
385
386
  size_t nsplits, ///< number of local search quantizers
386
387
  size_t Msub, ///< number of subquantizers per LSQ
387
388
  size_t nbits, ///< number of bit per subvector index
388
389
  MetricType metric,
389
390
  Search_type_t search_type)
390
- : IndexAdditiveQuantizer(d, &plsq, metric),
391
- plsq(d, nsplits, Msub, nbits, search_type) {
391
+ : IndexAdditiveQuantizer(d_, &plsq, metric),
392
+ plsq(d_, nsplits, Msub, nbits, search_type) {
392
393
  code_size = plsq.code_size;
393
394
  is_trained = false;
394
395
  }
@@ -406,10 +407,10 @@ void IndexProductLocalSearchQuantizer::train(idx_t n, const float* x) {
406
407
  **************************************************************************************/
407
408
 
408
409
  AdditiveCoarseQuantizer::AdditiveCoarseQuantizer(
409
- idx_t d,
410
- AdditiveQuantizer* aq,
410
+ idx_t d_,
411
+ AdditiveQuantizer* aq_,
411
412
  MetricType metric)
412
- : Index(d, metric), aq(aq) {}
413
+ : Index(d_, metric), aq(aq_) {}
413
414
 
414
415
  void AdditiveCoarseQuantizer::add(idx_t, const float*) {
415
416
  FAISS_THROW_MSG("not applicable");
@@ -463,7 +464,8 @@ void AdditiveCoarseQuantizer::search(
463
464
  if (metric_type == METRIC_INNER_PRODUCT) {
464
465
  aq->knn_centroids_inner_product(n, x, k, distances, labels);
465
466
  } else if (metric_type == METRIC_L2) {
466
- FAISS_THROW_IF_NOT(centroid_norms.size() == ntotal);
467
+ FAISS_THROW_IF_NOT(
468
+ centroid_norms.size() == static_cast<size_t>(ntotal));
467
469
  aq->knn_centroids_L2(n, x, k, distances, labels, centroid_norms.data());
468
470
  }
469
471
  }
@@ -473,20 +475,20 @@ void AdditiveCoarseQuantizer::search(
473
475
  **************************************************************************************/
474
476
 
475
477
  ResidualCoarseQuantizer::ResidualCoarseQuantizer(
476
- int d, ///< dimensionality of the input vectors
478
+ int d_, ///< dimensionality of the input vectors
477
479
  const std::vector<size_t>& nbits,
478
480
  MetricType metric)
479
- : AdditiveCoarseQuantizer(d, &rq, metric), rq(d, nbits) {
481
+ : AdditiveCoarseQuantizer(d_, &rq, metric), rq(d_, nbits) {
480
482
  FAISS_THROW_IF_NOT(rq.tot_bits <= 63);
481
483
  is_trained = false;
482
484
  }
483
485
 
484
486
  ResidualCoarseQuantizer::ResidualCoarseQuantizer(
485
- int d,
487
+ int d_,
486
488
  size_t M, ///< number of subquantizers
487
489
  size_t nbits, ///< number of bit per subvector index
488
490
  MetricType metric)
489
- : ResidualCoarseQuantizer(d, std::vector<size_t>(M, nbits), metric) {}
491
+ : ResidualCoarseQuantizer(d_, std::vector<size_t>(M, nbits), metric) {}
490
492
 
491
493
  ResidualCoarseQuantizer::ResidualCoarseQuantizer()
492
494
  : ResidualCoarseQuantizer(0, 0, 0) {}
@@ -504,7 +506,8 @@ void ResidualCoarseQuantizer::set_beam_factor(float new_beam_factor) {
504
506
  // Does not use the cross_products
505
507
  rq.codebook_cross_products.resize(0);
506
508
  // but the centroid norms are necessary!
507
- if (metric_type == METRIC_L2 && ntotal != centroid_norms.size()) {
509
+ if (metric_type == METRIC_L2 &&
510
+ static_cast<size_t>(ntotal) != centroid_norms.size()) {
508
511
  if (verbose) {
509
512
  printf("AdditiveCoarseQuantizer::train: computing centroid norms for %zd centroids\n",
510
513
  size_t(ntotal));
@@ -540,7 +543,7 @@ void ResidualCoarseQuantizer::search(
540
543
 
541
544
  int beam_size = int(k * actual_beam_factor);
542
545
  if (beam_size > ntotal) {
543
- beam_size = ntotal;
546
+ beam_size = static_cast<int>(ntotal);
544
547
  }
545
548
  size_t memory_per_point = rq.memory_per_point(beam_size);
546
549
 
@@ -573,8 +576,17 @@ void ResidualCoarseQuantizer::search(
573
576
  return;
574
577
  }
575
578
 
576
- std::vector<int32_t> codes(beam_size * rq.M * n);
577
- std::vector<float> beam_distances(n * beam_size);
579
+ size_t codes_size = mul_no_overflow(
580
+ mul_no_overflow(
581
+ static_cast<size_t>(beam_size), rq.M, "beam_size * M"),
582
+ static_cast<size_t>(n),
583
+ "beam_size * M * n");
584
+ size_t beam_dist_size = mul_no_overflow(
585
+ static_cast<size_t>(n),
586
+ static_cast<size_t>(beam_size),
587
+ "n * beam_size");
588
+ std::vector<int32_t> codes(codes_size);
589
+ std::vector<float> beam_distances(beam_dist_size);
578
590
 
579
591
  rq.refine_beam(
580
592
  n, 1, x, beam_size, codes.data(), nullptr, beam_distances.data());
@@ -590,7 +602,7 @@ void ResidualCoarseQuantizer::search(
590
602
  for (idx_t j = 0; j < k; j++) {
591
603
  idx_t l = 0;
592
604
  int shift = 0;
593
- for (int m = 0; m < rq.M; m++) {
605
+ for (size_t m = 0; m < rq.M; m++) {
594
606
  l |= (*codes_i++) << shift;
595
607
  shift += rq.nbits[m];
596
608
  }
@@ -613,11 +625,11 @@ void ResidualCoarseQuantizer::initialize_from(
613
625
  **************************************************************************************/
614
626
 
615
627
  LocalSearchCoarseQuantizer::LocalSearchCoarseQuantizer(
616
- int d, ///< dimensionality of the input vectors
628
+ int d_, ///< dimensionality of the input vectors
617
629
  size_t M, ///< number of subquantizers
618
630
  size_t nbits, ///< number of bit per subvector index
619
631
  MetricType metric)
620
- : AdditiveCoarseQuantizer(d, &lsq, metric), lsq(d, M, nbits) {
632
+ : AdditiveCoarseQuantizer(d_, &lsq, metric), lsq(d_, M, nbits) {
621
633
  FAISS_THROW_IF_NOT(lsq.tot_bits <= 63);
622
634
  is_trained = false;
623
635
  }
@@ -11,11 +11,10 @@
11
11
  #include <memory>
12
12
 
13
13
  #include <faiss/impl/FaissAssert.h>
14
- #include <faiss/impl/FastScanDistancePostProcessing.h>
15
14
  #include <faiss/impl/LocalSearchQuantizer.h>
16
- #include <faiss/impl/LookupTableScaler.h>
17
15
  #include <faiss/impl/ResidualQuantizer.h>
18
- #include <faiss/impl/pq4_fast_scan.h>
16
+ #include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
17
+ #include <faiss/impl/fast_scan/fast_scan.h>
19
18
  #include <faiss/utils/quantize_lut.h>
20
19
  #include <faiss/utils/utils.h>
21
20
 
@@ -26,16 +25,16 @@ inline size_t roundup(size_t a, size_t b) {
26
25
  }
27
26
 
28
27
  IndexAdditiveQuantizerFastScan::IndexAdditiveQuantizerFastScan(
29
- AdditiveQuantizer* aq,
28
+ AdditiveQuantizer* aq_,
30
29
  MetricType metric,
31
- int bbs) {
32
- init(aq, metric, bbs);
30
+ int bbs_) {
31
+ init(aq_, metric, bbs_);
33
32
  }
34
33
 
35
34
  void IndexAdditiveQuantizerFastScan::init(
36
35
  AdditiveQuantizer* aq_init,
37
36
  MetricType metric,
38
- int bbs) {
37
+ int bbs_) {
39
38
  FAISS_THROW_IF_NOT(aq_init != nullptr);
40
39
  FAISS_THROW_IF_NOT(!aq_init->nbits.empty());
41
40
  FAISS_THROW_IF_NOT(aq_init->nbits[0] == 4);
@@ -57,7 +56,7 @@ void IndexAdditiveQuantizerFastScan::init(
57
56
  } else {
58
57
  M = aq_init->M;
59
58
  }
60
- init_fastscan(aq_init->d, M, 4, metric, bbs);
59
+ init_fastscan(static_cast<int>(aq_init->d), M, 4, metric, bbs_);
61
60
 
62
61
  max_train_points = 1024 * ksub * M;
63
62
  }
@@ -70,8 +69,8 @@ IndexAdditiveQuantizerFastScan::IndexAdditiveQuantizerFastScan()
70
69
 
71
70
  IndexAdditiveQuantizerFastScan::IndexAdditiveQuantizerFastScan(
72
71
  const IndexAdditiveQuantizer& orig,
73
- int bbs) {
74
- init(orig.aq, orig.metric_type, bbs);
72
+ int bbs_) {
73
+ init(orig.aq, orig.metric_type, bbs_);
75
74
 
76
75
  ntotal = orig.ntotal;
77
76
  is_trained = orig.is_trained;
@@ -202,9 +201,8 @@ void IndexAdditiveQuantizerFastScan::search(
202
201
  return;
203
202
  }
204
203
 
205
- NormTableScaler scaler(norm_scale);
206
204
  FastScanDistancePostProcessing context;
207
- context.norm_scaler = &scaler;
205
+ context.pq2x4_scale = norm_scale;
208
206
  if (metric_type == METRIC_L2) {
209
207
  search_dispatch_implem<true>(n, x, k, distances, labels, context);
210
208
  } else {
@@ -219,19 +217,23 @@ void IndexAdditiveQuantizerFastScan::sa_decode(
219
217
  aq->decode(bytes, x, n);
220
218
  }
221
219
 
220
+ size_t IndexAdditiveQuantizerFastScan::fast_scan_code_size() const {
221
+ return M2 / 2;
222
+ }
223
+
222
224
  /**************************************************************************************
223
225
  * IndexResidualQuantizerFastScan
224
226
  **************************************************************************************/
225
227
 
226
228
  IndexResidualQuantizerFastScan::IndexResidualQuantizerFastScan(
227
- int d, ///< dimensionality of the input vectors
228
- size_t M, ///< number of subquantizers
229
- size_t nbits, ///< number of bit per subvector index
229
+ int d_, ///< dimensionality of the input vectors
230
+ size_t M_, ///< number of subquantizers
231
+ size_t nbits_, ///< number of bit per subvector index
230
232
  MetricType metric,
231
233
  Search_type_t search_type,
232
- int bbs)
233
- : rq(d, M, nbits, search_type) {
234
- init(&rq, metric, bbs);
234
+ int bbs_)
235
+ : rq(d_, M_, nbits_, search_type) {
236
+ init(&rq, metric, bbs_);
235
237
  }
236
238
 
237
239
  IndexResidualQuantizerFastScan::IndexResidualQuantizerFastScan() {
@@ -243,14 +245,14 @@ IndexResidualQuantizerFastScan::IndexResidualQuantizerFastScan() {
243
245
  **************************************************************************************/
244
246
 
245
247
  IndexLocalSearchQuantizerFastScan::IndexLocalSearchQuantizerFastScan(
246
- int d,
247
- size_t M, ///< number of subquantizers
248
- size_t nbits, ///< number of bit per subvector index
248
+ int d_,
249
+ size_t M_, ///< number of subquantizers
250
+ size_t nbits_, ///< number of bit per subvector index
249
251
  MetricType metric,
250
252
  Search_type_t search_type,
251
- int bbs)
252
- : lsq(d, M, nbits, search_type) {
253
- init(&lsq, metric, bbs);
253
+ int bbs_)
254
+ : lsq(d_, M_, nbits_, search_type) {
255
+ init(&lsq, metric, bbs_);
254
256
  }
255
257
 
256
258
  IndexLocalSearchQuantizerFastScan::IndexLocalSearchQuantizerFastScan() {
@@ -262,15 +264,15 @@ IndexLocalSearchQuantizerFastScan::IndexLocalSearchQuantizerFastScan() {
262
264
  **************************************************************************************/
263
265
 
264
266
  IndexProductResidualQuantizerFastScan::IndexProductResidualQuantizerFastScan(
265
- int d, ///< dimensionality of the input vectors
267
+ int d_, ///< dimensionality of the input vectors
266
268
  size_t nsplits, ///< number of residual quantizers
267
269
  size_t Msub, ///< number of subquantizers per RQ
268
- size_t nbits, ///< number of bit per subvector index
270
+ size_t nbits_, ///< number of bit per subvector index
269
271
  MetricType metric,
270
272
  Search_type_t search_type,
271
- int bbs)
272
- : prq(d, nsplits, Msub, nbits, search_type) {
273
- init(&prq, metric, bbs);
273
+ int bbs_)
274
+ : prq(d_, nsplits, Msub, nbits_, search_type) {
275
+ init(&prq, metric, bbs_);
274
276
  }
275
277
 
276
278
  IndexProductResidualQuantizerFastScan::IndexProductResidualQuantizerFastScan() {
@@ -283,15 +285,15 @@ IndexProductResidualQuantizerFastScan::IndexProductResidualQuantizerFastScan() {
283
285
 
284
286
  IndexProductLocalSearchQuantizerFastScan::
285
287
  IndexProductLocalSearchQuantizerFastScan(
286
- int d, ///< dimensionality of the input vectors
288
+ int d_, ///< dimensionality of the input vectors
287
289
  size_t nsplits, ///< number of local search quantizers
288
290
  size_t Msub, ///< number of subquantizers per LSQ
289
- size_t nbits, ///< number of bit per subvector index
291
+ size_t nbits_, ///< number of bit per subvector index
290
292
  MetricType metric,
291
293
  Search_type_t search_type,
292
- int bbs)
293
- : plsq(d, nsplits, Msub, nbits, search_type) {
294
- init(&plsq, metric, bbs);
294
+ int bbs_)
295
+ : plsq(d_, nsplits, Msub, nbits_, search_type) {
296
+ init(&plsq, metric, bbs_);
295
297
  }
296
298
 
297
299
  IndexProductLocalSearchQuantizerFastScan::
@@ -28,7 +28,7 @@ namespace faiss {
28
28
  */
29
29
 
30
30
  struct IndexAdditiveQuantizerFastScan : IndexFastScan {
31
- AdditiveQuantizer* aq;
31
+ AdditiveQuantizer* aq = nullptr;
32
32
  using Search_type_t = AdditiveQuantizer::Search_type_t;
33
33
 
34
34
  bool rescale_norm = true;
@@ -86,6 +86,9 @@ struct IndexAdditiveQuantizerFastScan : IndexFastScan {
86
86
  * @param x output vectors, size n * d
87
87
  */
88
88
  void sa_decode(idx_t n, const uint8_t* bytes, float* x) const override;
89
+
90
+ /// Packed code size: M2 / 2 bytes (4-bit AQ sub-quantizer nibbles)
91
+ size_t fast_scan_code_size() const override;
89
92
  };
90
93
 
91
94
  /** Index based on a residual quantizer. Stored vectors are
@@ -16,9 +16,11 @@
16
16
 
17
17
  namespace faiss {
18
18
 
19
- IndexBinary::IndexBinary(idx_t d, MetricType metric)
20
- : d(d), code_size(d / 8), metric_type(metric) {
21
- FAISS_THROW_IF_NOT(d % 8 == 0);
19
+ IndexBinary::IndexBinary(idx_t d_, MetricType metric)
20
+ : d(static_cast<int>(d_)),
21
+ code_size(static_cast<int>(d_ / 8)),
22
+ metric_type(metric) {
23
+ FAISS_THROW_IF_NOT(d_ % 8 == 0);
22
24
  }
23
25
 
24
26
  IndexBinary::~IndexBinary() = default;