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
@@ -0,0 +1,268 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ /**
11
+ * @file dispatching.h
12
+ * @brief Per-SIMD TU dispatch template for fast scan.
13
+ *
14
+ * This header is included once per SIMD TU with THE_LEVEL_TO_DISPATCH
15
+ * set to the desired SIMDLevel. It provides:
16
+ * - ScannerMixIn: wraps a handler + calls kernel at the TU's SIMD level
17
+ * - make_fast_scan_scanner_impl<SL>: factory specialization
18
+ *
19
+ * Usage (in a per-SIMD .cpp file):
20
+ * #define THE_LEVEL_TO_DISPATCH SIMDLevel::AVX2
21
+ * #include <faiss/impl/fast_scan/dispatching.h>
22
+ *
23
+ * Kernel helpers come from accumulate_loops.h (search_1 multi-BB path
24
+ * and QBS 256-bit path) and accumulate_loops_512.h (QBS 512-bit path,
25
+ * AVX512 TU only).
26
+ */
27
+
28
+ #ifndef THE_LEVEL_TO_DISPATCH
29
+ #error "Define THE_LEVEL_TO_DISPATCH before including this header"
30
+ #endif
31
+
32
+ #include <memory>
33
+
34
+ #include <faiss/impl/fast_scan/accumulate_loops.h>
35
+ #include <faiss/impl/fast_scan/fast_scan.h>
36
+
37
+ #if defined(COMPILE_SIMD_AVX512) && defined(__AVX512F__)
38
+ #include <faiss/impl/fast_scan/accumulate_loops_512.h>
39
+ #endif
40
+
41
+ namespace faiss {
42
+
43
+ using namespace simd_result_handlers;
44
+
45
+ /***************************************************************
46
+ * ScannerMixIn: wraps a concrete handler + calls accumulation
47
+ * kernels. Lives behind the virtual FastScanCodeScanner interface
48
+ * so callers don't need to know the handler type.
49
+ ***************************************************************/
50
+
51
+ template <class Handler>
52
+ struct ScannerMixIn : FastScanCodeScanner {
53
+ Handler handler_;
54
+
55
+ template <typename... Args>
56
+ explicit ScannerMixIn(Args&&... args)
57
+ : handler_(std::forward<Args>(args)...) {}
58
+
59
+ SIMDResultHandlerToFloat* handler() override {
60
+ return &handler_;
61
+ }
62
+
63
+ void accumulate_loop(
64
+ int nq,
65
+ size_t nb,
66
+ int bbs,
67
+ int nsq,
68
+ const uint8_t* codes,
69
+ const uint8_t* LUT,
70
+ int pq2x4_scale,
71
+ size_t block_stride) override {
72
+ if (pq2x4_scale) {
73
+ NormTableScaler<THE_LEVEL_TO_DISPATCH> scaler(pq2x4_scale);
74
+ pq4_accumulate_loop_fixed_scaler<THE_LEVEL_TO_DISPATCH>(
75
+ nq,
76
+ nb,
77
+ bbs,
78
+ nsq,
79
+ codes,
80
+ LUT,
81
+ handler_,
82
+ scaler,
83
+ block_stride);
84
+ } else {
85
+ DummyScaler<THE_LEVEL_TO_DISPATCH> dummy;
86
+ pq4_accumulate_loop_fixed_scaler<THE_LEVEL_TO_DISPATCH>(
87
+ nq,
88
+ nb,
89
+ bbs,
90
+ nsq,
91
+ codes,
92
+ LUT,
93
+ handler_,
94
+ dummy,
95
+ block_stride);
96
+ }
97
+ }
98
+
99
+ void accumulate_loop_qbs(
100
+ int qbs,
101
+ size_t nb,
102
+ int nsq,
103
+ const uint8_t* codes,
104
+ const uint8_t* LUT,
105
+ int pq2x4_scale,
106
+ size_t block_stride) override {
107
+ #if defined(COMPILE_SIMD_AVX512) && defined(__AVX512F__)
108
+ constexpr bool use_avx512_qbs =
109
+ (THE_LEVEL_TO_DISPATCH == SIMDLevel::AVX512 ||
110
+ THE_LEVEL_TO_DISPATCH == SIMDLevel::AVX512_SPR);
111
+ #else
112
+ constexpr bool use_avx512_qbs = false;
113
+ #endif
114
+ if constexpr (use_avx512_qbs) {
115
+ // Use 512-bit QBS kernels with properly-leveled scalers.
116
+ if (pq2x4_scale) {
117
+ NormTableScaler<THE_LEVEL_TO_DISPATCH> scaler(pq2x4_scale);
118
+ pq4_accumulate_loop_qbs_fixed_scaler_512(
119
+ qbs,
120
+ nb,
121
+ nsq,
122
+ codes,
123
+ LUT,
124
+ handler_,
125
+ scaler,
126
+ block_stride);
127
+ } else {
128
+ DummyScaler<THE_LEVEL_TO_DISPATCH> dummy;
129
+ pq4_accumulate_loop_qbs_fixed_scaler_512(
130
+ qbs,
131
+ nb,
132
+ nsq,
133
+ codes,
134
+ LUT,
135
+ handler_,
136
+ dummy,
137
+ block_stride);
138
+ }
139
+ } else {
140
+ if (pq2x4_scale) {
141
+ NormTableScaler<THE_LEVEL_TO_DISPATCH> scaler(pq2x4_scale);
142
+ pq4_accumulate_loop_qbs_fixed_scaler_256<THE_LEVEL_TO_DISPATCH>(
143
+ qbs,
144
+ nb,
145
+ nsq,
146
+ codes,
147
+ LUT,
148
+ handler_,
149
+ scaler,
150
+ block_stride);
151
+ } else {
152
+ DummyScaler<THE_LEVEL_TO_DISPATCH> dummy;
153
+ pq4_accumulate_loop_qbs_fixed_scaler_256<THE_LEVEL_TO_DISPATCH>(
154
+ qbs,
155
+ nb,
156
+ nsq,
157
+ codes,
158
+ LUT,
159
+ handler_,
160
+ dummy,
161
+ block_stride);
162
+ }
163
+ }
164
+ }
165
+ };
166
+
167
+ /***************************************************************
168
+ * Factory specialization for this SIMD level.
169
+ *
170
+ * Combinatorial dispatch: is_max × with_id_map × handler type
171
+ * k == 1: SingleResultHandler
172
+ * impl even: HeapHandler
173
+ * impl odd: ReservoirHandler (capacity = 2*k)
174
+ ***************************************************************/
175
+
176
+ template <>
177
+ std::unique_ptr<FastScanCodeScanner> make_fast_scan_scanner_impl<
178
+ THE_LEVEL_TO_DISPATCH>(
179
+ bool is_max,
180
+ int impl,
181
+ size_t nq,
182
+ size_t ntotal,
183
+ int64_t k,
184
+ float* distances,
185
+ int64_t* ids,
186
+ const IDSelector* sel,
187
+ bool with_id_map) {
188
+ // Helper lambda: given comparator C and with_id_map W, select handler
189
+ auto make = [&]<class C, bool W>() -> std::unique_ptr<FastScanCodeScanner> {
190
+ if (k == 1) {
191
+ using H = SingleResultHandler<C, W, THE_LEVEL_TO_DISPATCH>;
192
+ return std::make_unique<ScannerMixIn<H>>(
193
+ nq, ntotal, distances, ids, sel);
194
+ } else if (impl % 2 == 0) {
195
+ using H = HeapHandler<C, W, THE_LEVEL_TO_DISPATCH>;
196
+ return std::make_unique<ScannerMixIn<H>>(
197
+ nq, ntotal, k, distances, ids, sel);
198
+ } else {
199
+ using H = ReservoirHandler<C, W, THE_LEVEL_TO_DISPATCH>;
200
+ return std::make_unique<ScannerMixIn<H>>(
201
+ nq, ntotal, size_t(k), size_t(2 * k), distances, ids, sel);
202
+ }
203
+ };
204
+
205
+ if (is_max) {
206
+ if (with_id_map) {
207
+ return make.template operator()<CMax<uint16_t, int64_t>, true>();
208
+ } else {
209
+ return make.template operator()<CMax<uint16_t, int>, false>();
210
+ }
211
+ } else {
212
+ if (with_id_map) {
213
+ return make.template operator()<CMin<uint16_t, int64_t>, true>();
214
+ } else {
215
+ return make.template operator()<CMin<uint16_t, int>, false>();
216
+ }
217
+ }
218
+ }
219
+
220
+ /***************************************************************
221
+ * Range search scanner factories.
222
+ ***************************************************************/
223
+
224
+ template <>
225
+ std::unique_ptr<FastScanCodeScanner> make_range_scanner_impl<
226
+ THE_LEVEL_TO_DISPATCH>(
227
+ bool is_max,
228
+ RangeSearchResult& rres,
229
+ float radius,
230
+ size_t ntotal,
231
+ const IDSelector* sel) {
232
+ if (is_max) {
233
+ using C = CMax<uint16_t, int64_t>;
234
+ return std::make_unique<
235
+ ScannerMixIn<RangeHandler<C, true, THE_LEVEL_TO_DISPATCH>>>(
236
+ rres, radius, ntotal, sel);
237
+ } else {
238
+ using C = CMin<uint16_t, int64_t>;
239
+ return std::make_unique<
240
+ ScannerMixIn<RangeHandler<C, true, THE_LEVEL_TO_DISPATCH>>>(
241
+ rres, radius, ntotal, sel);
242
+ }
243
+ }
244
+
245
+ template <>
246
+ std::unique_ptr<FastScanCodeScanner> make_partial_range_scanner_impl<
247
+ THE_LEVEL_TO_DISPATCH>(
248
+ bool is_max,
249
+ RangeSearchPartialResult& pres,
250
+ float radius,
251
+ size_t ntotal,
252
+ size_t q0,
253
+ size_t q1,
254
+ const IDSelector* sel) {
255
+ if (is_max) {
256
+ using C = CMax<uint16_t, int64_t>;
257
+ return std::make_unique<ScannerMixIn<
258
+ PartialRangeHandler<C, true, THE_LEVEL_TO_DISPATCH>>>(
259
+ pres, radius, ntotal, q0, q1, sel);
260
+ } else {
261
+ using C = CMin<uint16_t, int64_t>;
262
+ return std::make_unique<ScannerMixIn<
263
+ PartialRangeHandler<C, true, THE_LEVEL_TO_DISPATCH>>>(
264
+ pres, radius, ntotal, q0, q1, sel);
265
+ }
266
+ }
267
+
268
+ } // namespace faiss
@@ -6,8 +6,11 @@
6
6
  */
7
7
 
8
8
  #include <faiss/impl/FaissAssert.h>
9
- #include <faiss/impl/pq4_fast_scan.h>
10
- #include <faiss/impl/simd_result_handlers.h>
9
+ #include <faiss/impl/fast_scan/LookupTableScaler.h>
10
+ #include <faiss/impl/fast_scan/decompose_qbs.h>
11
+ #include <faiss/impl/fast_scan/fast_scan.h>
12
+ #include <faiss/impl/fast_scan/simd_result_handlers.h>
13
+ #include <faiss/impl/simd_dispatch.h>
11
14
 
12
15
  #include <array>
13
16
 
@@ -111,7 +114,8 @@ void pq4_pack_codes_range(
111
114
  size_t bbs,
112
115
  size_t nsq,
113
116
  uint8_t* blocks,
114
- size_t code_stride) {
117
+ size_t code_stride,
118
+ size_t block_stride) {
115
119
  // Determine stride: use custom if provided, otherwise use legacy
116
120
  // calculation
117
121
  size_t actual_stride = (code_stride == 0) ? (M + 1) / 2 : code_stride;
@@ -136,7 +140,7 @@ void pq4_pack_codes_range(
136
140
  size_t block1 = ((i1 - 1) / bbs) + 1;
137
141
 
138
142
  for (size_t b = block0; b < block1; b++) {
139
- uint8_t* codes2 = blocks + b * bbs * nsq / 2;
143
+ uint8_t* codes2 = blocks + b * block_stride;
140
144
  int64_t i_base = b * bbs - i0;
141
145
  for (int sq = 0; sq < nsq; sq += 2) {
142
146
  for (size_t i = 0; i < bbs; i += 32) {
@@ -272,6 +276,10 @@ void CodePackerPQ4::unpack_1(
272
276
  }
273
277
  }
274
278
 
279
+ CodePacker* CodePackerPQ4::clone() const {
280
+ return new CodePackerPQ4(*this);
281
+ }
282
+
275
283
  /***************************************************************
276
284
  * Packing functions for Look-Up Tables (LUT)
277
285
  ***************************************************************/
@@ -345,4 +353,168 @@ int pq4_pack_LUT_qbs_q_map(
345
353
  return i0;
346
354
  }
347
355
 
356
+ int pq4_qbs_to_nq(int qbs) {
357
+ int i0 = 0;
358
+ int qi = qbs;
359
+ while (qi) {
360
+ int nq = qi & 15;
361
+ qi >>= 4;
362
+ i0 += nq;
363
+ }
364
+ return i0;
365
+ }
366
+
367
+ int pq4_preferred_qbs(int n) {
368
+ // from timings in P141901742, P141902828
369
+ static int map[12] = {
370
+ 0, 1, 2, 3, 0x13, 0x23, 0x33, 0x223, 0x233, 0x333, 0x2233, 0x2333};
371
+ if (n <= 11) {
372
+ return map[n];
373
+ } else if (n <= 24) {
374
+ // override qbs: all first stages with 3 steps
375
+ // then 1 stage with the rest
376
+ int nbit = 4 * (n / 3); // nbits with only 3s
377
+ int qbs = 0x33333333 & ((1 << nbit) - 1);
378
+ qbs |= (n % 3) << nbit;
379
+ return qbs;
380
+ } else {
381
+ FAISS_THROW_FMT("number of queries %d too large", n);
382
+ }
383
+ }
384
+
385
+ } // namespace faiss
386
+
387
+ /***************************************************************
388
+ * FastScanCodeScanner: NONE specialization + dispatch wrapper.
389
+ *
390
+ * The NONE specialization provides the scalar fallback.
391
+ * Per-SIMD specializations (AVX2, AVX512, ARM_NEON) are in
392
+ * impl-avx2.cpp, impl-avx512.cpp, impl-neon.cpp respectively.
393
+ ***************************************************************/
394
+
395
+ #define THE_LEVEL_TO_DISPATCH SIMDLevel::NONE
396
+ #include <faiss/impl/fast_scan/dispatching.h> // IWYU pragma: keep
397
+ #include <faiss/impl/fast_scan/rabitq_dispatching.h> // IWYU pragma: keep
398
+ #undef THE_LEVEL_TO_DISPATCH
399
+
400
+ namespace faiss {
401
+
402
+ using namespace simd_result_handlers;
403
+
404
+ /***************************************************************
405
+ * accumulate_to_mem: NONE specialization + runtime dispatch.
406
+ ***************************************************************/
407
+
408
+ template <>
409
+ void accumulate_to_mem_impl<SIMDLevel::NONE>(
410
+ int nq,
411
+ size_t ntotal2,
412
+ int nsq,
413
+ const uint8_t* codes,
414
+ const uint8_t* LUT,
415
+ uint16_t* accu) {
416
+ StoreResultHandler<SIMDLevel::NONE> handler(accu, ntotal2);
417
+ DummyScaler<SIMDLevel::NONE> scaler;
418
+ accumulate<SIMDLevel::NONE>(
419
+ nq, ntotal2, nsq, codes, LUT, handler, scaler, 32 * nsq / 2);
420
+ }
421
+
422
+ void accumulate_to_mem(
423
+ int nq,
424
+ size_t ntotal2,
425
+ int nsq,
426
+ const uint8_t* codes,
427
+ const uint8_t* LUT,
428
+ uint16_t* accu) {
429
+ FAISS_THROW_IF_NOT(ntotal2 % 32 == 0);
430
+ with_simd_level([&]<SIMDLevel SL>() {
431
+ accumulate_to_mem_impl<SL>(nq, ntotal2, nsq, codes, LUT, accu);
432
+ });
433
+ }
434
+
435
+ } // namespace faiss
436
+
437
+ namespace faiss {
438
+
439
+ std::unique_ptr<FastScanCodeScanner> make_fast_scan_knn_scanner(
440
+ bool is_max,
441
+ int impl,
442
+ size_t nq,
443
+ size_t ntotal,
444
+ int64_t k,
445
+ float* distances,
446
+ int64_t* ids,
447
+ const IDSelector* sel,
448
+ bool with_id_map) {
449
+ return with_simd_level([&]<SIMDLevel SL>() {
450
+ return make_fast_scan_scanner_impl<SL>(
451
+ is_max, impl, nq, ntotal, k, distances, ids, sel, with_id_map);
452
+ });
453
+ }
454
+
455
+ std::unique_ptr<FastScanCodeScanner> make_range_scanner(
456
+ bool is_max,
457
+ RangeSearchResult& rres,
458
+ float radius,
459
+ size_t ntotal,
460
+ const IDSelector* sel) {
461
+ return with_simd_level([&]<SIMDLevel SL>() {
462
+ return make_range_scanner_impl<SL>(is_max, rres, radius, ntotal, sel);
463
+ });
464
+ }
465
+
466
+ std::unique_ptr<FastScanCodeScanner> make_partial_range_scanner(
467
+ bool is_max,
468
+ RangeSearchPartialResult& pres,
469
+ float radius,
470
+ size_t ntotal,
471
+ size_t q0,
472
+ size_t q1,
473
+ const IDSelector* sel) {
474
+ return with_simd_level([&]<SIMDLevel SL>() {
475
+ return make_partial_range_scanner_impl<SL>(
476
+ is_max, pres, radius, ntotal, q0, q1, sel);
477
+ });
478
+ }
479
+
480
+ std::unique_ptr<FastScanCodeScanner> rabitq_make_knn_scanner(
481
+ const IndexRaBitQFastScan* index,
482
+ bool is_max,
483
+ size_t nq,
484
+ int64_t k,
485
+ float* distances,
486
+ int64_t* ids,
487
+ const IDSelector* sel,
488
+ const FastScanDistancePostProcessing& context,
489
+ bool is_multi_bit) {
490
+ return with_simd_level([&]<SIMDLevel SL>() {
491
+ return rabitq_make_knn_scanner_impl<SL>(
492
+ index,
493
+ is_max,
494
+ nq,
495
+ k,
496
+ distances,
497
+ ids,
498
+ sel,
499
+ context,
500
+ is_multi_bit);
501
+ });
502
+ }
503
+
504
+ std::unique_ptr<FastScanCodeScanner> rabitq_ivf_make_knn_scanner(
505
+ bool is_max,
506
+ const IndexIVFRaBitQFastScan* index,
507
+ size_t nq,
508
+ size_t k,
509
+ float* distances,
510
+ int64_t* ids,
511
+ const IDSelector* sel,
512
+ const FastScanDistancePostProcessing* context,
513
+ bool multi_bit) {
514
+ return with_simd_level([&]<SIMDLevel SL>() {
515
+ return rabitq_ivf_make_knn_scanner_impl<SL>(
516
+ is_max, index, nq, k, distances, ids, sel, context, multi_bit);
517
+ });
518
+ }
519
+
348
520
  } // namespace faiss