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
@@ -5,115 +5,20 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- #include <faiss/impl/pq4_fast_scan.h>
8
+ #pragma once
9
9
 
10
- #include <faiss/impl/FaissAssert.h>
11
- #include <faiss/impl/LookupTableScaler.h>
12
- #include <faiss/impl/simd_result_handlers.h>
10
+ #include <faiss/impl/platform_macros.h>
11
+ #include <faiss/impl/simdlib/simdlib_dispatch.h>
13
12
 
14
- namespace faiss {
15
-
16
- // declared in simd_result_handlers.h
17
- bool simd_result_handlers_accept_virtual = true;
18
-
19
- using namespace simd_result_handlers;
20
-
21
- /************************************************************
22
- * Accumulation functions
23
- ************************************************************/
24
-
25
- namespace {
26
-
27
- /*
28
- * The computation kernel
29
- * It accumulates results for NQ queries and 2 * 16 database elements
30
- * writes results in a ResultHandler
31
- */
32
-
33
- #ifndef __AVX512F__
34
-
35
- template <int NQ, class ResultHandler, class Scaler>
36
- void kernel_accumulate_block(
37
- int nsq,
38
- const uint8_t* codes,
39
- const uint8_t* LUT,
40
- ResultHandler& res,
41
- const Scaler& scaler) {
42
- // dummy alloc to keep the windows compiler happy
43
- constexpr int NQA = NQ > 0 ? NQ : 1;
44
- // distance accumulators
45
- // layout: accu[q][b]: distance accumulator for vectors 8*b..8*b+7
46
- simd16uint16 accu[NQA][4];
47
-
48
- for (int q = 0; q < NQ; q++) {
49
- for (int b = 0; b < 4; b++) {
50
- accu[q][b].clear();
51
- }
52
- }
13
+ #ifdef __AVX512F__
53
14
 
54
- // _mm_prefetch(codes + 768, 0);
55
- for (int sq = 0; sq < nsq - scaler.nscale; sq += 2) {
56
- simd32uint8 c;
57
- c.loadu(codes);
58
- codes += 32;
59
-
60
- simd32uint8 mask(0xf);
61
- // shift op does not exist for int8...
62
- simd32uint8 chi = simd32uint8(simd16uint16(c) >> 4) & mask;
63
- simd32uint8 clo = c & mask;
64
-
65
- for (int q = 0; q < NQ; q++) {
66
- // load LUTs for 2 quantizers
67
- simd32uint8 lut(LUT);
68
- LUT += 32;
69
-
70
- simd32uint8 res0 = lut.lookup_2_lanes(clo);
71
- simd32uint8 res1 = lut.lookup_2_lanes(chi);
72
-
73
- accu[q][0] += simd16uint16(res0);
74
- accu[q][1] += simd16uint16(res0) >> 8;
75
-
76
- accu[q][2] += simd16uint16(res1);
77
- accu[q][3] += simd16uint16(res1) >> 8;
78
- }
79
- }
80
-
81
- for (int sq = 0; sq < scaler.nscale; sq += 2) {
82
- simd32uint8 c;
83
- c.loadu(codes);
84
- codes += 32;
85
-
86
- simd32uint8 mask(0xf);
87
- // shift op does not exist for int8...
88
- simd32uint8 chi = simd32uint8(simd16uint16(c) >> 4) & mask;
89
- simd32uint8 clo = c & mask;
90
-
91
- for (int q = 0; q < NQ; q++) {
92
- // load LUTs for 2 quantizers
93
- simd32uint8 lut(LUT);
94
- LUT += 32;
95
-
96
- simd32uint8 res0 = scaler.lookup(lut, clo);
97
- accu[q][0] += scaler.scale_lo(res0); // handle vectors 0..7
98
- accu[q][1] += scaler.scale_hi(res0); // handle vectors 8..15
99
-
100
- simd32uint8 res1 = scaler.lookup(lut, chi);
101
- accu[q][2] += scaler.scale_lo(res1); // handle vectors 16..23
102
- accu[q][3] += scaler.scale_hi(res1); // handle vectors 24..31
103
- }
104
- }
105
-
106
- for (int q = 0; q < NQ; q++) {
107
- accu[q][0] -= accu[q][1] << 8;
108
- simd16uint16 dis0 = combine2x2(accu[q][0], accu[q][1]);
109
- accu[q][2] -= accu[q][3] << 8;
110
- simd16uint16 dis1 = combine2x2(accu[q][2], accu[q][3]);
111
- res.handle(q, 0, dis0, dis1);
112
- }
113
- }
15
+ namespace faiss {
114
16
 
115
- #else
17
+ // Explicit SIMD-level aliases for this file (no global bare aliases).
18
+ using simd32uint16 = simd32uint16_tpl<SINGLE_SIMD_LEVEL_512>;
19
+ using simd64uint8 = simd64uint8_tpl<SINGLE_SIMD_LEVEL_512>;
116
20
 
21
+ // NQ=1 specialization: processes 512-bit chunks aggressively.
117
22
  // a special version for NQ=1.
118
23
  // Despite the function being large in the text form, it compiles to a very
119
24
  // compact assembler code.
@@ -125,6 +30,13 @@ void kernel_accumulate_block_avx512_nq1(
125
30
  const uint8_t* LUT,
126
31
  ResultHandler& res,
127
32
  const Scaler& scaler) {
33
+ // Explicit SIMD levels for DD mode where bare aliases resolve to NONE
34
+ // (512-bit NONE types don't exist — empty primary templates).
35
+ using simd32uint16 = simd32uint16_tpl<SIMDLevel::AVX512>;
36
+ using simd64uint8 = simd64uint8_tpl<SIMDLevel::AVX512>;
37
+ using simd16uint16 = simd16uint16_tpl<SIMDLevel::AVX2>;
38
+ using simd32uint8 = simd32uint8_tpl<SIMDLevel::AVX2>;
39
+
128
40
  // NQ is kept in order to match the similarity to baseline function
129
41
  constexpr int NQ = 1;
130
42
  // distance accumulators. We can accept more for NQ=1
@@ -386,6 +298,12 @@ void kernel_accumulate_block_avx512_nqx(
386
298
  const uint8_t* LUT,
387
299
  ResultHandler& res,
388
300
  const Scaler& scaler) {
301
+ // Explicit SIMD levels for DD mode (see nq1 variant for explanation).
302
+ using simd32uint16 = simd32uint16_tpl<SIMDLevel::AVX512>;
303
+ using simd64uint8 = simd64uint8_tpl<SIMDLevel::AVX512>;
304
+ using simd16uint16 = simd16uint16_tpl<SIMDLevel::AVX2>;
305
+ using simd32uint8 = simd32uint8_tpl<SIMDLevel::AVX2>;
306
+
389
307
  // dummy alloc to keep the windows compiler happy
390
308
  constexpr int NQA = NQ > 0 ? NQ : 1;
391
309
  // distance accumulators
@@ -539,8 +457,9 @@ void kernel_accumulate_block_avx512_nqx(
539
457
  }
540
458
  }
541
459
 
460
+ // Dispatcher: selects NQ=1 vs general case.
542
461
  template <int NQ, class ResultHandler, class Scaler>
543
- void kernel_accumulate_block(
462
+ void pq4_kernel_qbs_512(
544
463
  int nsq,
545
464
  const uint8_t* codes,
546
465
  const uint8_t* LUT,
@@ -555,255 +474,6 @@ void kernel_accumulate_block(
555
474
  }
556
475
  }
557
476
 
558
- #endif
559
-
560
- // handle at most 4 blocks of queries
561
- template <int QBS, class ResultHandler, class Scaler>
562
- void accumulate_q_4step(
563
- size_t ntotal2,
564
- int nsq,
565
- const uint8_t* codes,
566
- const uint8_t* LUT0,
567
- ResultHandler& res,
568
- const Scaler& scaler,
569
- size_t block_stride) {
570
- constexpr int Q1 = QBS & 15;
571
- constexpr int Q2 = (QBS >> 4) & 15;
572
- constexpr int Q3 = (QBS >> 8) & 15;
573
- constexpr int Q4 = (QBS >> 12) & 15;
574
- constexpr int SQ = Q1 + Q2 + Q3 + Q4;
575
-
576
- for (size_t j0 = 0; j0 < ntotal2; j0 += 32) {
577
- FixedStorageHandler<SQ, 2> res2;
578
- const uint8_t* LUT = LUT0;
579
- kernel_accumulate_block<Q1>(nsq, codes, LUT, res2, scaler);
580
- LUT += Q1 * nsq * 16;
581
- if (Q2 > 0) {
582
- res2.set_block_origin(Q1, 0);
583
- kernel_accumulate_block<Q2>(nsq, codes, LUT, res2, scaler);
584
- LUT += Q2 * nsq * 16;
585
- }
586
- if (Q3 > 0) {
587
- res2.set_block_origin(Q1 + Q2, 0);
588
- kernel_accumulate_block<Q3>(nsq, codes, LUT, res2, scaler);
589
- LUT += Q3 * nsq * 16;
590
- }
591
- if (Q4 > 0) {
592
- res2.set_block_origin(Q1 + Q2 + Q3, 0);
593
- kernel_accumulate_block<Q4>(nsq, codes, LUT, res2, scaler);
594
- }
595
- res.set_block_origin(0, j0);
596
- res2.to_other_handler(res);
597
- codes += block_stride;
598
- }
599
- }
600
-
601
- template <int NQ, class ResultHandler, class Scaler>
602
- void kernel_accumulate_block_loop(
603
- size_t ntotal2,
604
- int nsq,
605
- const uint8_t* codes,
606
- const uint8_t* LUT,
607
- ResultHandler& res,
608
- const Scaler& scaler,
609
- size_t block_stride) {
610
- for (size_t j0 = 0; j0 < ntotal2; j0 += 32) {
611
- res.set_block_origin(0, j0);
612
- kernel_accumulate_block<NQ, ResultHandler>(
613
- nsq, codes, LUT, res, scaler);
614
- codes += block_stride;
615
- }
616
- }
617
-
618
- // non-template version of accumulate kernel -- dispatches dynamically
619
- template <class ResultHandler, class Scaler>
620
- void accumulate(
621
- int nq,
622
- size_t ntotal2,
623
- int nsq,
624
- const uint8_t* codes,
625
- const uint8_t* LUT,
626
- ResultHandler& res,
627
- const Scaler& scaler,
628
- size_t block_stride) {
629
- assert(nsq % 2 == 0);
630
- assert(is_aligned_pointer(LUT));
631
-
632
- #define DISPATCH(NQ) \
633
- case NQ: \
634
- kernel_accumulate_block_loop<NQ, ResultHandler>( \
635
- ntotal2, nsq, codes, LUT, res, scaler, block_stride); \
636
- return
637
-
638
- switch (nq) {
639
- DISPATCH(1);
640
- DISPATCH(2);
641
- DISPATCH(3);
642
- DISPATCH(4);
643
- }
644
- FAISS_THROW_FMT("accumulate nq=%d not instantiated", nq);
645
-
646
- #undef DISPATCH
647
- }
648
-
649
- template <class ResultHandler, class Scaler>
650
- void pq4_accumulate_loop_qbs_fixed_scaler(
651
- int qbs,
652
- size_t ntotal2,
653
- int nsq,
654
- const uint8_t* codes,
655
- const uint8_t* LUT0,
656
- ResultHandler& res,
657
- const Scaler& scaler,
658
- size_t block_stride = 0) {
659
- assert(nsq % 2 == 0);
660
- assert(is_aligned_pointer(codes));
661
- assert(is_aligned_pointer(LUT0));
662
-
663
- // try out optimized versions
664
- switch (qbs) {
665
- #define DISPATCH(QBS) \
666
- case QBS: \
667
- accumulate_q_4step<QBS>( \
668
- ntotal2, nsq, codes, LUT0, res, scaler, block_stride); \
669
- return;
670
- DISPATCH(0x3333); // 12
671
- DISPATCH(0x2333); // 11
672
- DISPATCH(0x2233); // 10
673
- DISPATCH(0x333); // 9
674
- DISPATCH(0x2223); // 9
675
- DISPATCH(0x233); // 8
676
- DISPATCH(0x1223); // 8
677
- DISPATCH(0x223); // 7
678
- DISPATCH(0x34); // 7
679
- DISPATCH(0x133); // 7
680
- DISPATCH(0x6); // 6
681
- DISPATCH(0x33); // 6
682
- DISPATCH(0x123); // 6
683
- DISPATCH(0x222); // 6
684
- DISPATCH(0x23); // 5
685
- DISPATCH(0x5); // 5
686
- DISPATCH(0x13); // 4
687
- DISPATCH(0x22); // 4
688
- DISPATCH(0x4); // 4
689
- DISPATCH(0x3); // 3
690
- DISPATCH(0x21); // 3
691
- DISPATCH(0x2); // 2
692
- DISPATCH(0x1); // 1
693
- #undef DISPATCH
694
- }
695
-
696
- // default implementation where qbs is not known at compile time
697
- for (size_t j0 = 0; j0 < ntotal2; j0 += 32) {
698
- const uint8_t* LUT = LUT0;
699
- int qi = qbs;
700
- int i0 = 0;
701
- while (qi) {
702
- int nq = qi & 15;
703
- qi >>= 4;
704
- res.set_block_origin(i0, j0);
705
- #define DISPATCH(NQ) \
706
- case NQ: \
707
- kernel_accumulate_block<NQ, ResultHandler>( \
708
- nsq, codes, LUT, res, scaler); \
709
- break
710
- switch (nq) {
711
- DISPATCH(1);
712
- DISPATCH(2);
713
- DISPATCH(3);
714
- DISPATCH(4);
715
- #undef DISPATCH
716
- default:
717
- FAISS_THROW_FMT("accumulate nq=%d not instantiated", nq);
718
- }
719
- i0 += nq;
720
- LUT += nq * nsq * 16;
721
- }
722
- codes += block_stride;
723
- }
724
- }
725
-
726
- struct Run_pq4_accumulate_loop_qbs {
727
- template <class ResultHandler>
728
- void f(ResultHandler& res,
729
- int qbs,
730
- size_t nb,
731
- int nsq,
732
- const uint8_t* codes,
733
- const uint8_t* LUT,
734
- const NormTableScaler* scaler,
735
- size_t block_stride) {
736
- if (scaler) {
737
- pq4_accumulate_loop_qbs_fixed_scaler(
738
- qbs, nb, nsq, codes, LUT, res, *scaler, block_stride);
739
- } else {
740
- DummyScaler dummy;
741
- pq4_accumulate_loop_qbs_fixed_scaler(
742
- qbs, nb, nsq, codes, LUT, res, dummy, block_stride);
743
- }
744
- }
745
- };
746
-
747
- } // namespace
748
-
749
- void pq4_accumulate_loop_qbs(
750
- int qbs,
751
- size_t nb,
752
- int nsq,
753
- const uint8_t* codes,
754
- const uint8_t* LUT,
755
- SIMDResultHandler& res,
756
- const NormTableScaler* scaler,
757
- size_t block_stride) {
758
- Run_pq4_accumulate_loop_qbs consumer;
759
- dispatch_SIMDResultHandler(
760
- res, consumer, qbs, nb, nsq, codes, LUT, scaler, block_stride);
761
- }
762
-
763
- /***************************************************************
764
- * Packing functions
765
- ***************************************************************/
766
-
767
- int pq4_qbs_to_nq(int qbs) {
768
- int i0 = 0;
769
- int qi = qbs;
770
- while (qi) {
771
- int nq = qi & 15;
772
- qi >>= 4;
773
- i0 += nq;
774
- }
775
- return i0;
776
- }
777
-
778
- void accumulate_to_mem(
779
- int nq,
780
- size_t ntotal2,
781
- int nsq,
782
- const uint8_t* codes,
783
- const uint8_t* LUT,
784
- uint16_t* accu) {
785
- FAISS_THROW_IF_NOT(ntotal2 % 32 == 0);
786
- StoreResultHandler handler(accu, ntotal2);
787
- DummyScaler scaler;
788
- accumulate(nq, ntotal2, nsq, codes, LUT, handler, scaler, 32 * nsq / 2);
789
- }
790
-
791
- int pq4_preferred_qbs(int n) {
792
- // from timings in P141901742, P141902828
793
- static int map[12] = {
794
- 0, 1, 2, 3, 0x13, 0x23, 0x33, 0x223, 0x233, 0x333, 0x2233, 0x2333};
795
- if (n <= 11) {
796
- return map[n];
797
- } else if (n <= 24) {
798
- // override qbs: all first stages with 3 steps
799
- // then 1 stage with the rest
800
- int nbit = 4 * (n / 3); // nbits with only 3s
801
- int qbs = 0x33333333 & ((1 << nbit) - 1);
802
- qbs |= (n % 3) << nbit;
803
- return qbs;
804
- } else {
805
- FAISS_THROW_FMT("number of queries %d too large", n);
806
- }
807
- }
808
-
809
477
  } // namespace faiss
478
+
479
+ #endif // __AVX512F__
@@ -0,0 +1,90 @@
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 rabitq_dispatching.h
12
+ * @brief Per-SIMD TU dispatch for RaBitQ flat scanner.
13
+ *
14
+ * Included after dispatching.h in each per-SIMD TU, so that
15
+ * ScannerMixIn from dispatching.h is visible (same TU).
16
+ *
17
+ * Provides the rabitq_make_knn_scanner_impl<SL> specialization
18
+ * that wraps RaBitQHeapHandler in ScannerMixIn.
19
+ */
20
+
21
+ #ifndef THE_LEVEL_TO_DISPATCH
22
+ #error "Define THE_LEVEL_TO_DISPATCH before including this header"
23
+ #endif
24
+
25
+ #include <faiss/IndexIVFRaBitQFastScan.h>
26
+ #include <faiss/IndexRaBitQFastScan.h>
27
+ #include <faiss/impl/fast_scan/fast_scan.h>
28
+
29
+ // ScannerMixIn is visible from dispatching.h (same TU)
30
+
31
+ namespace faiss {
32
+
33
+ template <>
34
+ std::unique_ptr<FastScanCodeScanner> rabitq_make_knn_scanner_impl<
35
+ THE_LEVEL_TO_DISPATCH>(
36
+ const IndexRaBitQFastScan* index,
37
+ bool is_max,
38
+ size_t nq,
39
+ int64_t k,
40
+ float* distances,
41
+ int64_t* ids,
42
+ const IDSelector* sel,
43
+ const FastScanDistancePostProcessing& context,
44
+ bool is_multi_bit) {
45
+ if (is_max) {
46
+ using H = RaBitQHeapHandler<
47
+ CMax<uint16_t, int>,
48
+ false,
49
+ THE_LEVEL_TO_DISPATCH>;
50
+ return std::make_unique<ScannerMixIn<H>>(
51
+ index, nq, k, distances, ids, sel, &context, is_multi_bit);
52
+ } else {
53
+ using H = RaBitQHeapHandler<
54
+ CMin<uint16_t, int>,
55
+ false,
56
+ THE_LEVEL_TO_DISPATCH>;
57
+ return std::make_unique<ScannerMixIn<H>>(
58
+ index, nq, k, distances, ids, sel, &context, is_multi_bit);
59
+ }
60
+ }
61
+
62
+ // IVF RaBitQ scanner factory
63
+ template <>
64
+ std::unique_ptr<FastScanCodeScanner> rabitq_ivf_make_knn_scanner_impl<
65
+ THE_LEVEL_TO_DISPATCH>(
66
+ bool is_max,
67
+ const IndexIVFRaBitQFastScan* index,
68
+ size_t nq,
69
+ size_t k,
70
+ float* distances,
71
+ int64_t* ids,
72
+ const IDSelector* sel,
73
+ const FastScanDistancePostProcessing* context,
74
+ bool multi_bit) {
75
+ if (is_max) {
76
+ using C = CMax<uint16_t, int64_t>;
77
+ using H = simd_result_handlers::
78
+ IVFRaBitQHeapHandler<C, THE_LEVEL_TO_DISPATCH>;
79
+ return std::make_unique<ScannerMixIn<H>>(
80
+ index, nq, k, distances, ids, sel, context, multi_bit);
81
+ } else {
82
+ using C = CMin<uint16_t, int64_t>;
83
+ using H = simd_result_handlers::
84
+ IVFRaBitQHeapHandler<C, THE_LEVEL_TO_DISPATCH>;
85
+ return std::make_unique<ScannerMixIn<H>>(
86
+ index, nq, k, distances, ids, sel, context, multi_bit);
87
+ }
88
+ }
89
+
90
+ } // namespace faiss
@@ -0,0 +1,108 @@
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
+ #include <memory>
11
+ #include <vector>
12
+
13
+ #include <faiss/impl/FaissAssert.h>
14
+ #include <faiss/impl/RaBitQUtils.h>
15
+ #include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
16
+ #include <faiss/impl/fast_scan/simd_result_handlers.h>
17
+ #include <faiss/invlists/InvertedLists.h>
18
+ #include <faiss/utils/Heap.h>
19
+
20
+ namespace faiss {
21
+
22
+ // Forward declaration — full definition in IndexIVFRaBitQFastScan.h
23
+ struct IndexIVFRaBitQFastScan;
24
+
25
+ namespace simd_result_handlers {
26
+
27
+ // Import shared utilities from RaBitQUtils
28
+ using rabitq_utils::ExtraBitsFactors;
29
+ using rabitq_utils::SignBitFactors;
30
+ using rabitq_utils::SignBitFactorsWithError;
31
+
32
+ /** SIMD result handler for IndexIVFRaBitQFastScan that applies
33
+ * RaBitQ-specific distance corrections during batch processing.
34
+ *
35
+ * @tparam C Comparator type (CMin/CMax) for heap operations
36
+ * @tparam SL SIMD level for dynamic dispatch
37
+ */
38
+ template <class C, SIMDLevel SL = SINGLE_SIMD_LEVEL_256>
39
+ struct IVFRaBitQHeapHandler : ResultHandlerCompare<C, true, SL> {
40
+ using RHC = ResultHandlerCompare<C, true, SL>;
41
+ using typename RHC::simd16uint16;
42
+
43
+ const IndexIVFRaBitQFastScan* index;
44
+ float* heap_distances; // [nq * k]
45
+ int64_t* heap_labels; // [nq * k]
46
+ const size_t nq, k;
47
+ size_t current_list_no = 0;
48
+ std::vector<int>
49
+ probe_indices; // probe index for each query in current batch
50
+ const FastScanDistancePostProcessing*
51
+ context; // Processing context with query factors
52
+ const bool is_multibit; // Whether to use multi-bit two-stage search
53
+ size_t nup = 0; // Number of heap updates
54
+
55
+ // Cached block-layout constants (invariant for handler lifetime)
56
+ const size_t storage_size;
57
+ const size_t packed_block_size;
58
+ const size_t full_block_size;
59
+ std::vector<uint8_t> unpack_buf; // sign bits scratch buffer
60
+
61
+ // Cached per-list values (set in set_list_context, avoid recomputing in
62
+ // handle)
63
+ size_t cached_nprobe = 0;
64
+ bool is_similarity = false; // metric == INNER_PRODUCT
65
+
66
+ // Use float-based comparator for heap operations
67
+ using Cfloat = typename std::conditional<
68
+ C::is_max,
69
+ CMax<float, int64_t>,
70
+ CMin<float, int64_t>>::type;
71
+
72
+ // Constructor and method bodies are defined at the bottom of
73
+ // IndexIVFRaBitQFastScan.h (after the full struct definition is
74
+ // available) to break the circular header dependency.
75
+ IVFRaBitQHeapHandler(
76
+ const IndexIVFRaBitQFastScan* idx,
77
+ size_t nq_val,
78
+ size_t k_val,
79
+ float* distances,
80
+ int64_t* labels,
81
+ const IDSelector* sel,
82
+ const FastScanDistancePostProcessing* ctx = nullptr,
83
+ bool multibit = false);
84
+
85
+ void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) final;
86
+
87
+ void set_list_context(size_t list_no, const std::vector<int>& probe_map)
88
+ override;
89
+
90
+ void begin(const float* norms) override;
91
+
92
+ void end() override;
93
+
94
+ size_t num_updates() override {
95
+ return nup;
96
+ }
97
+
98
+ private:
99
+ float compute_full_multibit_distance(
100
+ size_t local_q,
101
+ size_t global_q,
102
+ size_t local_offset,
103
+ const uint8_t* aux_ptr);
104
+ };
105
+
106
+ } // namespace simd_result_handlers
107
+
108
+ } // namespace faiss