faiss 0.5.3 → 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 (379) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/ext/faiss/ext.cpp +1 -1
  4. data/ext/faiss/extconf.rb +4 -4
  5. data/ext/faiss/index.cpp +63 -45
  6. data/ext/faiss/index_binary.cpp +37 -27
  7. data/ext/faiss/kmeans.cpp +9 -8
  8. data/ext/faiss/pca_matrix.cpp +9 -7
  9. data/ext/faiss/product_quantizer.cpp +13 -11
  10. data/ext/faiss/utils.cpp +4 -2
  11. data/ext/faiss/utils.h +4 -0
  12. data/lib/faiss/version.rb +1 -1
  13. data/lib/faiss.rb +1 -1
  14. data/vendor/faiss/faiss/AutoTune.cpp +214 -82
  15. data/vendor/faiss/faiss/AutoTune.h +14 -1
  16. data/vendor/faiss/faiss/Clustering.cpp +97 -249
  17. data/vendor/faiss/faiss/Clustering.h +18 -0
  18. data/vendor/faiss/faiss/IVFlib.cpp +67 -44
  19. data/vendor/faiss/faiss/Index.cpp +25 -12
  20. data/vendor/faiss/faiss/Index.h +26 -4
  21. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  22. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +68 -61
  23. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  24. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  25. data/vendor/faiss/faiss/IndexBinary.cpp +6 -3
  26. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  27. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  28. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  29. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  30. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +92 -95
  31. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  32. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  33. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  34. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +120 -414
  35. data/vendor/faiss/faiss/IndexFastScan.cpp +105 -129
  36. data/vendor/faiss/faiss/IndexFastScan.h +35 -24
  37. data/vendor/faiss/faiss/IndexFlat.cpp +216 -152
  38. data/vendor/faiss/faiss/IndexFlat.h +32 -14
  39. data/vendor/faiss/faiss/IndexFlatCodes.cpp +88 -41
  40. data/vendor/faiss/faiss/IndexFlatCodes.h +7 -1
  41. data/vendor/faiss/faiss/IndexHNSW.cpp +299 -187
  42. data/vendor/faiss/faiss/IndexHNSW.h +30 -14
  43. data/vendor/faiss/faiss/IndexIDMap.cpp +26 -22
  44. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  45. data/vendor/faiss/faiss/IndexIVF.cpp +535 -405
  46. data/vendor/faiss/faiss/IndexIVF.h +47 -16
  47. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
  48. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +105 -99
  49. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +6 -3
  50. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +379 -249
  51. data/vendor/faiss/faiss/IndexIVFFastScan.h +65 -60
  52. data/vendor/faiss/faiss/IndexIVFFlat.cpp +41 -124
  53. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  54. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +89 -138
  55. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  56. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  57. data/vendor/faiss/faiss/IndexIVFPQ.cpp +77 -907
  58. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +184 -122
  59. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  60. data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -18
  61. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +59 -60
  62. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +4 -3
  63. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +564 -416
  64. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +269 -111
  65. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  66. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  67. data/vendor/faiss/faiss/IndexLSH.cpp +44 -25
  68. data/vendor/faiss/faiss/IndexLattice.cpp +41 -36
  69. data/vendor/faiss/faiss/IndexNNDescent.cpp +37 -21
  70. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  71. data/vendor/faiss/faiss/IndexNSG.cpp +40 -23
  72. data/vendor/faiss/faiss/IndexNSG.h +0 -2
  73. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +32 -12
  74. data/vendor/faiss/faiss/IndexPQ.cpp +129 -213
  75. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  76. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  77. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  78. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  79. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  80. data/vendor/faiss/faiss/IndexRaBitQ.cpp +31 -43
  81. data/vendor/faiss/faiss/IndexRaBitQ.h +4 -3
  82. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +135 -317
  83. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +192 -34
  84. data/vendor/faiss/faiss/IndexRefine.cpp +30 -55
  85. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  86. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  87. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  88. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  89. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
  90. data/vendor/faiss/faiss/IndexShards.cpp +13 -13
  91. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  92. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  93. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  94. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  95. data/vendor/faiss/faiss/MetricType.h +29 -6
  96. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  97. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  98. data/vendor/faiss/faiss/VectorTransform.cpp +349 -141
  99. data/vendor/faiss/faiss/VectorTransform.h +39 -16
  100. data/vendor/faiss/faiss/build.cpp +23 -0
  101. data/vendor/faiss/faiss/build.h +15 -0
  102. data/vendor/faiss/faiss/clone_index.cpp +55 -51
  103. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  104. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  105. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  106. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  107. data/vendor/faiss/faiss/{cppcontrib/factory_tools.cpp → factory_tools.cpp} +6 -1
  108. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +1 -1
  109. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  110. data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
  111. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
  112. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
  113. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  114. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  115. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  116. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  117. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  118. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  119. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  120. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  121. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  122. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  123. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
  124. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  125. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
  126. data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
  127. data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
  128. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  129. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  130. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +64 -34
  131. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  132. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  133. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -28
  134. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  135. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  136. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +367 -0
  137. data/vendor/faiss/faiss/impl/ClusteringInitialization.h +107 -0
  138. data/vendor/faiss/faiss/impl/CodePacker.cpp +7 -3
  139. data/vendor/faiss/faiss/impl/CodePacker.h +11 -3
  140. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +83 -0
  141. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.h +47 -0
  142. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  143. data/vendor/faiss/faiss/impl/FaissAssert.h +64 -3
  144. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  145. data/vendor/faiss/faiss/impl/HNSW.cpp +117 -351
  146. data/vendor/faiss/faiss/impl/HNSW.h +21 -40
  147. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  148. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  149. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  150. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +114 -102
  151. data/vendor/faiss/faiss/impl/NNDescent.cpp +63 -26
  152. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  153. data/vendor/faiss/faiss/impl/NSG.cpp +44 -26
  154. data/vendor/faiss/faiss/impl/NSG.h +20 -10
  155. data/vendor/faiss/faiss/impl/Panorama.cpp +76 -52
  156. data/vendor/faiss/faiss/impl/Panorama.h +265 -78
  157. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  158. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  159. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +62 -37
  160. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  161. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  162. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  163. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +99 -80
  164. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  165. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +135 -37
  166. data/vendor/faiss/faiss/impl/RaBitQUtils.h +148 -21
  167. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +298 -301
  168. data/vendor/faiss/faiss/impl/RaBitQuantizer.h +3 -10
  169. data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +15 -41
  170. data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.h +0 -4
  171. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +40 -32
  172. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  173. data/vendor/faiss/faiss/impl/ResultHandler.h +218 -113
  174. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +119 -2362
  175. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -3
  176. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  177. data/vendor/faiss/faiss/impl/VisitedTable.cpp +42 -0
  178. data/vendor/faiss/faiss/impl/VisitedTable.h +76 -0
  179. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  180. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  181. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  182. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  183. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  184. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  185. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  186. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  187. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  188. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  189. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  190. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  191. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  192. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  193. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  194. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  195. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  196. data/vendor/faiss/faiss/impl/expanded_scanners.h +163 -0
  197. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  198. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  199. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  200. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  201. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  202. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
  203. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +176 -4
  204. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  205. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  206. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  207. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  208. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  209. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  210. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -348
  211. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  212. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  213. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +290 -142
  214. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  215. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  216. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
  217. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
  218. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
  219. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
  220. data/vendor/faiss/faiss/impl/index_read.cpp +1950 -505
  221. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -2
  222. data/vendor/faiss/faiss/impl/index_write.cpp +112 -21
  223. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  224. data/vendor/faiss/faiss/impl/io_macros.h +33 -16
  225. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  226. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +81 -40
  227. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  228. data/vendor/faiss/faiss/impl/mapped_io.cpp +15 -8
  229. data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
  230. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  231. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  232. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  233. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  234. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
  235. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
  236. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
  237. data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx2.h → pq_code_distance/pq_code_distance-avx2.h} +43 -220
  238. data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx512.h → pq_code_distance/pq_code_distance-avx512.h} +25 -112
  239. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +59 -0
  240. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  241. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +256 -0
  242. data/vendor/faiss/faiss/impl/{code_distance/code_distance-sve.h → pq_code_distance/pq_code_distance-sve.cpp} +57 -146
  243. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
  244. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +320 -483
  245. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  246. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +121 -0
  247. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +137 -0
  248. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +371 -0
  249. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +190 -0
  250. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +94 -0
  251. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +603 -0
  252. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +597 -0
  253. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +388 -0
  254. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +630 -0
  255. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
  256. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +387 -0
  257. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +54 -0
  258. data/vendor/faiss/faiss/impl/simd_dispatch.h +173 -0
  259. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  260. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +274 -171
  261. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  262. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  263. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  264. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +275 -217
  265. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  266. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  267. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  268. data/vendor/faiss/faiss/index_factory.cpp +115 -28
  269. data/vendor/faiss/faiss/index_io.h +53 -3
  270. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +73 -20
  271. data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
  272. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  273. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
  274. data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
  275. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  276. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +14 -14
  277. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  278. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +9 -19
  279. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  280. data/vendor/faiss/faiss/svs/IndexSVSFlat.h +2 -0
  281. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  282. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  283. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  284. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  285. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  286. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  287. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
  288. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +19 -2
  289. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
  290. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +19 -2
  291. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +14 -0
  292. data/vendor/faiss/faiss/utils/Heap.cpp +56 -10
  293. data/vendor/faiss/faiss/utils/Heap.h +21 -0
  294. data/vendor/faiss/faiss/utils/NeuralNet.cpp +54 -40
  295. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  296. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  297. data/vendor/faiss/faiss/utils/distances.cpp +507 -559
  298. data/vendor/faiss/faiss/utils/distances.h +118 -1
  299. data/vendor/faiss/faiss/utils/distances_dispatch.h +250 -0
  300. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  301. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  302. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  303. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  304. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  305. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  306. data/vendor/faiss/faiss/utils/distances_simd.cpp +72 -3681
  307. data/vendor/faiss/faiss/utils/extra_distances.cpp +60 -102
  308. data/vendor/faiss/faiss/utils/extra_distances.h +79 -7
  309. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  310. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  311. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  312. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  313. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
  314. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  315. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  316. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
  317. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
  318. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
  319. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
  320. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
  321. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
  322. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
  323. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
  324. data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
  325. data/vendor/faiss/faiss/utils/partitioning.h +31 -0
  326. data/vendor/faiss/faiss/utils/popcount.h +29 -0
  327. data/vendor/faiss/faiss/utils/pq_code_distance.h +251 -0
  328. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  329. data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
  330. data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
  331. data/vendor/faiss/faiss/utils/rabitq_simd.h +124 -343
  332. data/vendor/faiss/faiss/utils/random.cpp +6 -6
  333. data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
  334. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +154 -0
  335. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +777 -0
  336. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +306 -0
  337. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +1431 -0
  338. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +1095 -0
  339. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
  340. data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
  341. data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +392 -0
  342. data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
  343. data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
  344. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
  345. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
  346. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
  347. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
  348. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
  349. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  350. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  351. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  352. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  353. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  354. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  355. data/vendor/faiss/faiss/utils/simd_levels.cpp +334 -0
  356. data/vendor/faiss/faiss/utils/simd_levels.h +183 -0
  357. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  358. data/vendor/faiss/faiss/utils/utils.cpp +21 -14
  359. data/vendor/faiss/faiss/utils/utils.h +3 -3
  360. metadata +156 -42
  361. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  362. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  363. data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +0 -81
  364. data/vendor/faiss/faiss/impl/code_distance/code_distance.h +0 -186
  365. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -216
  366. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -224
  367. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  368. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  369. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  370. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  371. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -228
  372. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  373. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  374. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -450
  375. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  376. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  377. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  378. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -296
  379. /data/vendor/faiss/faiss/{cppcontrib/factory_tools.h → factory_tools.h} +0 -0
@@ -8,13 +8,12 @@
8
8
  #include <faiss/IndexAdditiveQuantizer.h>
9
9
 
10
10
  #include <algorithm>
11
- #include <cmath>
12
11
  #include <cstring>
13
12
 
14
13
  #include <faiss/impl/FaissAssert.h>
15
14
  #include <faiss/impl/ResidualQuantizer.h>
16
15
  #include <faiss/impl/ResultHandler.h>
17
- #include <faiss/utils/distances.h>
16
+ #include <faiss/utils/distances_dispatch.h>
18
17
  #include <faiss/utils/extra_distances.h>
19
18
 
20
19
  namespace faiss {
@@ -24,10 +23,10 @@ namespace faiss {
24
23
  **************************************************************************************/
25
24
 
26
25
  IndexAdditiveQuantizer::IndexAdditiveQuantizer(
27
- idx_t d,
28
- AdditiveQuantizer* aq,
26
+ idx_t d_,
27
+ AdditiveQuantizer* aq_,
29
28
  MetricType metric)
30
- : IndexFlatCodes(aq->code_size, d, metric), aq(aq) {
29
+ : IndexFlatCodes(aq_->code_size, d_, metric), aq(aq_) {
31
30
  FAISS_THROW_IF_NOT(metric == METRIC_INNER_PRODUCT || metric == METRIC_L2);
32
31
  }
33
32
 
@@ -46,14 +45,14 @@ struct AQDistanceComputerDecompress : FlatCodesDistanceComputer {
46
45
 
47
46
  AQDistanceComputerDecompress(
48
47
  const IndexAdditiveQuantizer& iaq,
49
- VectorDistance vd)
48
+ VectorDistance vd_)
50
49
  : FlatCodesDistanceComputer(iaq.codes.data(), iaq.code_size),
51
50
  tmp(iaq.d * 2),
52
51
  aq(*iaq.aq),
53
- vd(vd),
52
+ vd(vd_),
54
53
  d(iaq.d) {}
55
54
 
56
- const float* q;
55
+ const float* q = nullptr;
57
56
  void set_query(const float* x) final {
58
57
  q = x;
59
58
  }
@@ -84,7 +83,7 @@ struct AQDistanceComputerLUT : FlatCodesDistanceComputer {
84
83
  aq(*iaq.aq),
85
84
  d(iaq.d) {}
86
85
 
87
- float bias;
86
+ float bias = 0.0f;
88
87
  void set_query(const float* x) final {
89
88
  q = x;
90
89
  // this is quite sub-optimal for multiple queries
@@ -129,7 +128,7 @@ void search_with_decompress(
129
128
  typename BlockResultHandler::SingleResultHandler;
130
129
 
131
130
  #pragma omp parallel for if (res.nq > 100)
132
- for (int64_t q = 0; q < res.nq; q++) {
131
+ for (int64_t q = 0; q < static_cast<int64_t>(res.nq); q++) {
133
132
  SingleResultHandler resi(res);
134
133
  resi.begin(q);
135
134
  std::vector<float> tmp(ir.d);
@@ -165,7 +164,7 @@ void search_with_LUT(
165
164
  aq.compute_LUT(nq, xq, LUT.get());
166
165
 
167
166
  #pragma omp parallel for if (nq > 100)
168
- for (int64_t q = 0; q < nq; q++) {
167
+ for (int64_t q = 0; q < static_cast<int64_t>(nq); q++) {
169
168
  SingleResultHandler resi(res);
170
169
  resi.begin(q);
171
170
  std::vector<float> tmp(aq.d);
@@ -189,17 +188,14 @@ void search_with_LUT(
189
188
  FlatCodesDistanceComputer* IndexAdditiveQuantizer::
190
189
  get_FlatCodesDistanceComputer() const {
191
190
  if (aq->search_type == AdditiveQuantizer::ST_decompress) {
192
- if (metric_type == METRIC_L2) {
193
- using VD = VectorDistance<METRIC_L2>;
194
- VD vd = {size_t(d), metric_arg};
195
- return new AQDistanceComputerDecompress<VD>(*this, vd);
196
- } else if (metric_type == METRIC_INNER_PRODUCT) {
197
- using VD = VectorDistance<METRIC_INNER_PRODUCT>;
198
- VD vd = {size_t(d), metric_arg};
199
- return new AQDistanceComputerDecompress<VD>(*this, vd);
200
- } else {
201
- FAISS_THROW_MSG("unsupported metric");
202
- }
191
+ return with_VectorDistance(
192
+ d,
193
+ metric_type,
194
+ metric_arg,
195
+ [&](auto vd) -> FlatCodesDistanceComputer* {
196
+ return new AQDistanceComputerDecompress<decltype(vd)>(
197
+ *this, vd);
198
+ });
203
199
  } else {
204
200
  if (metric_type == METRIC_INNER_PRODUCT) {
205
201
  return new AQDistanceComputerLUT<
@@ -242,17 +238,17 @@ void IndexAdditiveQuantizer::search(
242
238
  !params, "search params not supported for this index");
243
239
 
244
240
  if (aq->search_type == AdditiveQuantizer::ST_decompress) {
245
- if (metric_type == METRIC_L2) {
246
- using VD = VectorDistance<METRIC_L2>;
247
- VD vd = {size_t(d), metric_arg};
248
- HeapBlockResultHandler<VD::C> rh(n, distances, labels, k);
249
- search_with_decompress(*this, x, vd, rh);
250
- } else if (metric_type == METRIC_INNER_PRODUCT) {
251
- using VD = VectorDistance<METRIC_INNER_PRODUCT>;
252
- VD vd = {size_t(d), metric_arg};
253
- HeapBlockResultHandler<VD::C> rh(n, distances, labels, k);
254
- search_with_decompress(*this, x, vd, rh);
255
- }
241
+ with_VectorDistance(d, metric_type, metric_arg, [&](auto vd) {
242
+ if constexpr (decltype(vd)::is_similarity) {
243
+ HeapBlockResultHandler<CMin<float, idx_t>> rh(
244
+ n, distances, labels, k);
245
+ search_with_decompress(*this, x, vd, rh);
246
+ } else {
247
+ HeapBlockResultHandler<CMax<float, idx_t>> rh(
248
+ n, distances, labels, k);
249
+ search_with_decompress(*this, x, vd, rh);
250
+ }
251
+ });
256
252
  } else {
257
253
  if (metric_type == METRIC_INNER_PRODUCT) {
258
254
  HeapBlockResultHandler<CMin<float, idx_t>> rh(
@@ -303,23 +299,23 @@ void IndexAdditiveQuantizer::sa_decode(idx_t n, const uint8_t* bytes, float* x)
303
299
  **************************************************************************************/
304
300
 
305
301
  IndexResidualQuantizer::IndexResidualQuantizer(
306
- int d, ///< dimensionality of the input vectors
302
+ int d_, ///< dimensionality of the input vectors
307
303
  size_t M, ///< number of subquantizers
308
304
  size_t nbits, ///< number of bit per subvector index
309
305
  MetricType metric,
310
306
  Search_type_t search_type)
311
307
  : IndexResidualQuantizer(
312
- d,
308
+ d_,
313
309
  std::vector<size_t>(M, nbits),
314
310
  metric,
315
311
  search_type) {}
316
312
 
317
313
  IndexResidualQuantizer::IndexResidualQuantizer(
318
- int d,
314
+ int d_,
319
315
  const std::vector<size_t>& nbits,
320
316
  MetricType metric,
321
317
  Search_type_t search_type)
322
- : IndexAdditiveQuantizer(d, &rq, metric), rq(d, nbits, search_type) {
318
+ : IndexAdditiveQuantizer(d_, &rq, metric), rq(d_, nbits, search_type) {
323
319
  code_size = rq.code_size;
324
320
  is_trained = false;
325
321
  }
@@ -337,13 +333,13 @@ void IndexResidualQuantizer::train(idx_t n, const float* x) {
337
333
  **************************************************************************************/
338
334
 
339
335
  IndexLocalSearchQuantizer::IndexLocalSearchQuantizer(
340
- int d,
336
+ int d_,
341
337
  size_t M, ///< number of subquantizers
342
338
  size_t nbits, ///< number of bit per subvector index
343
339
  MetricType metric,
344
340
  Search_type_t search_type)
345
- : IndexAdditiveQuantizer(d, &lsq, metric),
346
- lsq(d, M, nbits, search_type) {
341
+ : IndexAdditiveQuantizer(d_, &lsq, metric),
342
+ lsq(d_, M, nbits, search_type) {
347
343
  code_size = lsq.code_size;
348
344
  is_trained = false;
349
345
  }
@@ -361,14 +357,14 @@ void IndexLocalSearchQuantizer::train(idx_t n, const float* x) {
361
357
  **************************************************************************************/
362
358
 
363
359
  IndexProductResidualQuantizer::IndexProductResidualQuantizer(
364
- int d, ///< dimensionality of the input vectors
360
+ int d_, ///< dimensionality of the input vectors
365
361
  size_t nsplits, ///< number of residual quantizers
366
362
  size_t Msub, ///< number of subquantizers per RQ
367
363
  size_t nbits, ///< number of bit per subvector index
368
364
  MetricType metric,
369
365
  Search_type_t search_type)
370
- : IndexAdditiveQuantizer(d, &prq, metric),
371
- prq(d, nsplits, Msub, nbits, search_type) {
366
+ : IndexAdditiveQuantizer(d_, &prq, metric),
367
+ prq(d_, nsplits, Msub, nbits, search_type) {
372
368
  code_size = prq.code_size;
373
369
  is_trained = false;
374
370
  }
@@ -386,14 +382,14 @@ void IndexProductResidualQuantizer::train(idx_t n, const float* x) {
386
382
  **************************************************************************************/
387
383
 
388
384
  IndexProductLocalSearchQuantizer::IndexProductLocalSearchQuantizer(
389
- int d, ///< dimensionality of the input vectors
385
+ int d_, ///< dimensionality of the input vectors
390
386
  size_t nsplits, ///< number of local search quantizers
391
387
  size_t Msub, ///< number of subquantizers per LSQ
392
388
  size_t nbits, ///< number of bit per subvector index
393
389
  MetricType metric,
394
390
  Search_type_t search_type)
395
- : IndexAdditiveQuantizer(d, &plsq, metric),
396
- plsq(d, nsplits, Msub, nbits, search_type) {
391
+ : IndexAdditiveQuantizer(d_, &plsq, metric),
392
+ plsq(d_, nsplits, Msub, nbits, search_type) {
397
393
  code_size = plsq.code_size;
398
394
  is_trained = false;
399
395
  }
@@ -411,10 +407,10 @@ void IndexProductLocalSearchQuantizer::train(idx_t n, const float* x) {
411
407
  **************************************************************************************/
412
408
 
413
409
  AdditiveCoarseQuantizer::AdditiveCoarseQuantizer(
414
- idx_t d,
415
- AdditiveQuantizer* aq,
410
+ idx_t d_,
411
+ AdditiveQuantizer* aq_,
416
412
  MetricType metric)
417
- : Index(d, metric), aq(aq) {}
413
+ : Index(d_, metric), aq(aq_) {}
418
414
 
419
415
  void AdditiveCoarseQuantizer::add(idx_t, const float*) {
420
416
  FAISS_THROW_MSG("not applicable");
@@ -468,7 +464,8 @@ void AdditiveCoarseQuantizer::search(
468
464
  if (metric_type == METRIC_INNER_PRODUCT) {
469
465
  aq->knn_centroids_inner_product(n, x, k, distances, labels);
470
466
  } else if (metric_type == METRIC_L2) {
471
- FAISS_THROW_IF_NOT(centroid_norms.size() == ntotal);
467
+ FAISS_THROW_IF_NOT(
468
+ centroid_norms.size() == static_cast<size_t>(ntotal));
472
469
  aq->knn_centroids_L2(n, x, k, distances, labels, centroid_norms.data());
473
470
  }
474
471
  }
@@ -478,20 +475,20 @@ void AdditiveCoarseQuantizer::search(
478
475
  **************************************************************************************/
479
476
 
480
477
  ResidualCoarseQuantizer::ResidualCoarseQuantizer(
481
- int d, ///< dimensionality of the input vectors
478
+ int d_, ///< dimensionality of the input vectors
482
479
  const std::vector<size_t>& nbits,
483
480
  MetricType metric)
484
- : AdditiveCoarseQuantizer(d, &rq, metric), rq(d, nbits) {
481
+ : AdditiveCoarseQuantizer(d_, &rq, metric), rq(d_, nbits) {
485
482
  FAISS_THROW_IF_NOT(rq.tot_bits <= 63);
486
483
  is_trained = false;
487
484
  }
488
485
 
489
486
  ResidualCoarseQuantizer::ResidualCoarseQuantizer(
490
- int d,
487
+ int d_,
491
488
  size_t M, ///< number of subquantizers
492
489
  size_t nbits, ///< number of bit per subvector index
493
490
  MetricType metric)
494
- : ResidualCoarseQuantizer(d, std::vector<size_t>(M, nbits), metric) {}
491
+ : ResidualCoarseQuantizer(d_, std::vector<size_t>(M, nbits), metric) {}
495
492
 
496
493
  ResidualCoarseQuantizer::ResidualCoarseQuantizer()
497
494
  : ResidualCoarseQuantizer(0, 0, 0) {}
@@ -509,7 +506,8 @@ void ResidualCoarseQuantizer::set_beam_factor(float new_beam_factor) {
509
506
  // Does not use the cross_products
510
507
  rq.codebook_cross_products.resize(0);
511
508
  // but the centroid norms are necessary!
512
- if (metric_type == METRIC_L2 && ntotal != centroid_norms.size()) {
509
+ if (metric_type == METRIC_L2 &&
510
+ static_cast<size_t>(ntotal) != centroid_norms.size()) {
513
511
  if (verbose) {
514
512
  printf("AdditiveCoarseQuantizer::train: computing centroid norms for %zd centroids\n",
515
513
  size_t(ntotal));
@@ -545,7 +543,7 @@ void ResidualCoarseQuantizer::search(
545
543
 
546
544
  int beam_size = int(k * actual_beam_factor);
547
545
  if (beam_size > ntotal) {
548
- beam_size = ntotal;
546
+ beam_size = static_cast<int>(ntotal);
549
547
  }
550
548
  size_t memory_per_point = rq.memory_per_point(beam_size);
551
549
 
@@ -578,8 +576,17 @@ void ResidualCoarseQuantizer::search(
578
576
  return;
579
577
  }
580
578
 
581
- std::vector<int32_t> codes(beam_size * rq.M * n);
582
- 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);
583
590
 
584
591
  rq.refine_beam(
585
592
  n, 1, x, beam_size, codes.data(), nullptr, beam_distances.data());
@@ -595,7 +602,7 @@ void ResidualCoarseQuantizer::search(
595
602
  for (idx_t j = 0; j < k; j++) {
596
603
  idx_t l = 0;
597
604
  int shift = 0;
598
- for (int m = 0; m < rq.M; m++) {
605
+ for (size_t m = 0; m < rq.M; m++) {
599
606
  l |= (*codes_i++) << shift;
600
607
  shift += rq.nbits[m];
601
608
  }
@@ -618,11 +625,11 @@ void ResidualCoarseQuantizer::initialize_from(
618
625
  **************************************************************************************/
619
626
 
620
627
  LocalSearchCoarseQuantizer::LocalSearchCoarseQuantizer(
621
- int d, ///< dimensionality of the input vectors
628
+ int d_, ///< dimensionality of the input vectors
622
629
  size_t M, ///< number of subquantizers
623
630
  size_t nbits, ///< number of bit per subvector index
624
631
  MetricType metric)
625
- : AdditiveCoarseQuantizer(d, &lsq, metric), lsq(d, M, nbits) {
632
+ : AdditiveCoarseQuantizer(d_, &lsq, metric), lsq(d_, M, nbits) {
626
633
  FAISS_THROW_IF_NOT(lsq.tot_bits <= 63);
627
634
  is_trained = false;
628
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
@@ -12,12 +12,15 @@
12
12
 
13
13
  #include <cinttypes>
14
14
  #include <cstring>
15
+ #include <typeinfo>
15
16
 
16
17
  namespace faiss {
17
18
 
18
- IndexBinary::IndexBinary(idx_t d, MetricType metric)
19
- : d(d), code_size(d / 8), metric_type(metric) {
20
- 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);
21
24
  }
22
25
 
23
26
  IndexBinary::~IndexBinary() = default;
@@ -58,7 +58,7 @@ struct IndexBinary {
58
58
  } else {
59
59
  FAISS_THROW_MSG("IndexBinary::train: unsupported numeric type");
60
60
  }
61
- };
61
+ }
62
62
 
63
63
  /** Add n vectors of dimension d to the index.
64
64
  *
@@ -72,7 +72,7 @@ struct IndexBinary {
72
72
  } else {
73
73
  FAISS_THROW_MSG("IndexBinary::add: unsupported numeric type");
74
74
  }
75
- };
75
+ }
76
76
 
77
77
  /** Same as add, but stores xids instead of sequential ids.
78
78
  *
@@ -93,7 +93,7 @@ struct IndexBinary {
93
93
  FAISS_THROW_MSG(
94
94
  "IndexBinary::add_with_ids: unsupported numeric type");
95
95
  }
96
- };
96
+ }
97
97
 
98
98
  /** Query n vectors of dimension d to the index.
99
99
  *
@@ -129,7 +129,7 @@ struct IndexBinary {
129
129
  } else {
130
130
  FAISS_THROW_MSG("IndexBinary::search: unsupported numeric type");
131
131
  }
132
- };
132
+ }
133
133
 
134
134
  /** Query n vectors of dimension d to the index.
135
135
  *
@@ -18,7 +18,7 @@
18
18
 
19
19
  namespace faiss {
20
20
 
21
- IndexBinaryFlat::IndexBinaryFlat(idx_t d) : IndexBinary(d) {}
21
+ IndexBinaryFlat::IndexBinaryFlat(idx_t d_) : IndexBinary(d_) {}
22
22
 
23
23
  void IndexBinaryFlat::add(idx_t n, const uint8_t* x) {
24
24
  xb.insert(xb.end(), x, x + n * code_size);
@@ -14,8 +14,8 @@
14
14
 
15
15
  #include <faiss/IndexBinary.h>
16
16
 
17
+ #include <faiss/impl/approx_topk/approx_topk.h>
17
18
  #include <faiss/impl/maybe_owned_vector.h>
18
- #include <faiss/utils/approx_topk/mode.h>
19
19
 
20
20
  namespace faiss {
21
21
 
@@ -18,10 +18,10 @@ namespace faiss {
18
18
 
19
19
  IndexBinaryFromFloat::IndexBinaryFromFloat() = default;
20
20
 
21
- IndexBinaryFromFloat::IndexBinaryFromFloat(Index* index)
22
- : IndexBinary(index->d), index(index), own_fields(false) {
23
- is_trained = index->is_trained;
24
- ntotal = index->ntotal;
21
+ IndexBinaryFromFloat::IndexBinaryFromFloat(Index* index_)
22
+ : IndexBinary(index_->d), index(index_), own_fields(false) {
23
+ is_trained = index_->is_trained;
24
+ ntotal = index_->ntotal;
25
25
  }
26
26
 
27
27
  IndexBinaryFromFloat::~IndexBinaryFromFloat() {