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,26 @@
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
+ #ifdef COMPILE_SIMD_AVX2
9
+
10
+ #define THE_SIMD_LEVEL SIMDLevel::AVX2
11
+
12
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
13
+ #include <faiss/utils/hamming_distance/hamming_computer-avx2.h>
14
+
15
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
16
+ #include <faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h>
17
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
18
+ #include <faiss/impl/binary_hamming/IndexBinaryHash_impl.h>
19
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
20
+ #include <faiss/impl/binary_hamming/IndexBinaryIVF_impl.h>
21
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
22
+ #include <faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h>
23
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
24
+ #include <faiss/impl/binary_hamming/IndexPQ_impl.h>
25
+
26
+ #endif // COMPILE_SIMD_AVX2
@@ -0,0 +1,26 @@
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
+ #ifdef COMPILE_SIMD_AVX512
9
+
10
+ #define THE_SIMD_LEVEL SIMDLevel::AVX512
11
+
12
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
13
+ #include <faiss/utils/hamming_distance/hamming_computer-avx512.h>
14
+
15
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
16
+ #include <faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h>
17
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
18
+ #include <faiss/impl/binary_hamming/IndexBinaryHash_impl.h>
19
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
20
+ #include <faiss/impl/binary_hamming/IndexBinaryIVF_impl.h>
21
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
22
+ #include <faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h>
23
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
24
+ #include <faiss/impl/binary_hamming/IndexPQ_impl.h>
25
+
26
+ #endif // COMPILE_SIMD_AVX512
@@ -0,0 +1,143 @@
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 <faiss/utils/simd_levels.h>
11
+
12
+ #include <cstddef>
13
+ #include <cstdint>
14
+
15
+ namespace faiss {
16
+
17
+ // Forward declarations
18
+ struct DistanceComputer;
19
+ struct InvertedListScanner;
20
+ struct BinaryInvertedListScanner;
21
+ struct IndexBinaryFlat;
22
+ struct IndexBinaryHash;
23
+ struct IndexBinaryMultiHash;
24
+ struct IndexBinaryIVF;
25
+ struct IndexIVFSpectralHash;
26
+ struct IndexPQ;
27
+ struct SearchParametersIVF;
28
+ using IVFSearchParameters = SearchParametersIVF;
29
+ struct RangeQueryResult;
30
+ using idx_t = int64_t;
31
+
32
+ /** @name IndexBinaryHNSW dispatch
33
+ * @{ */
34
+ template <SIMDLevel SL>
35
+ DistanceComputer* make_binary_hnsw_distance_computer_fixSL(
36
+ int code_size,
37
+ IndexBinaryFlat* flat_storage);
38
+ /** @} */
39
+
40
+ /** @name IndexBinaryIVF dispatch
41
+ * @{ */
42
+ template <SIMDLevel SL>
43
+ BinaryInvertedListScanner* make_binary_ivf_scanner_fixSL(
44
+ size_t code_size,
45
+ bool store_pairs);
46
+
47
+ template <SIMDLevel SL>
48
+ void search_knn_hamming_per_invlist_fixSL(
49
+ int code_size,
50
+ const IndexBinaryIVF* ivf,
51
+ size_t n,
52
+ const uint8_t* x,
53
+ idx_t k,
54
+ const idx_t* keys_in,
55
+ const int32_t* coarse_dis,
56
+ int32_t* distances,
57
+ idx_t* labels,
58
+ bool store_pairs,
59
+ const IVFSearchParameters* params);
60
+
61
+ template <SIMDLevel SL>
62
+ void search_knn_hamming_count_fixSL(
63
+ int code_size,
64
+ bool store_pairs,
65
+ const IndexBinaryIVF* ivf,
66
+ size_t nx,
67
+ const uint8_t* x,
68
+ const idx_t* keys,
69
+ int k,
70
+ int32_t* distances,
71
+ idx_t* labels,
72
+ const IVFSearchParameters* params);
73
+ /** @} */
74
+
75
+ /** @name IndexBinaryHash dispatch
76
+ * @{ */
77
+ template <SIMDLevel SL>
78
+ void binary_hash_knn_search_fixSL(
79
+ const IndexBinaryHash& index,
80
+ const uint8_t* q,
81
+ idx_t k,
82
+ int32_t* heap_sim,
83
+ idx_t* heap_ids,
84
+ size_t& n0,
85
+ size_t& nlist,
86
+ size_t& ndis);
87
+
88
+ template <SIMDLevel SL>
89
+ void binary_hash_range_search_fixSL(
90
+ const IndexBinaryHash& index,
91
+ const uint8_t* q,
92
+ int radius,
93
+ RangeQueryResult& qres,
94
+ size_t& n0,
95
+ size_t& nlist,
96
+ size_t& ndis);
97
+
98
+ template <SIMDLevel SL>
99
+ void binary_multihash_knn_search_fixSL(
100
+ const IndexBinaryMultiHash& index,
101
+ const uint8_t* q,
102
+ idx_t k,
103
+ int32_t* heap_sim,
104
+ idx_t* heap_ids,
105
+ size_t& n0,
106
+ size_t& nlist,
107
+ size_t& ndis);
108
+
109
+ template <SIMDLevel SL>
110
+ void binary_multihash_range_search_fixSL(
111
+ const IndexBinaryMultiHash& index,
112
+ const uint8_t* q,
113
+ int radius,
114
+ RangeQueryResult& qres,
115
+ size_t& n0,
116
+ size_t& nlist,
117
+ size_t& ndis);
118
+ /** @} */
119
+
120
+ /** @name IndexIVFSpectralHash dispatch
121
+ * @{ */
122
+ template <SIMDLevel SL>
123
+ InvertedListScanner* make_spectral_hash_scanner_fixSL(
124
+ int code_size,
125
+ const IndexIVFSpectralHash* index,
126
+ bool store_pairs);
127
+ /** @} */
128
+
129
+ /** @name IndexPQ polysemous dispatch
130
+ * @{ */
131
+ template <SIMDLevel SL>
132
+ size_t polysemous_inner_loop_fixSL(
133
+ int code_size,
134
+ const IndexPQ* index,
135
+ const float* dis_table_qi,
136
+ const uint8_t* q_code,
137
+ size_t k,
138
+ float* heap_dis,
139
+ int64_t* heap_ids,
140
+ int ht);
141
+ /** @} */
142
+
143
+ } // namespace faiss
@@ -0,0 +1,26 @@
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
+ #ifdef COMPILE_SIMD_ARM_NEON
9
+
10
+ #define THE_SIMD_LEVEL SIMDLevel::ARM_NEON
11
+
12
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
13
+ #include <faiss/utils/hamming_distance/hamming_computer-neon.h>
14
+
15
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
16
+ #include <faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h>
17
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
18
+ #include <faiss/impl/binary_hamming/IndexBinaryHash_impl.h>
19
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
20
+ #include <faiss/impl/binary_hamming/IndexBinaryIVF_impl.h>
21
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
22
+ #include <faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h>
23
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
24
+ #include <faiss/impl/binary_hamming/IndexPQ_impl.h>
25
+
26
+ #endif // COMPILE_SIMD_ARM_NEON
@@ -0,0 +1,26 @@
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
+ #ifdef COMPILE_SIMD_RISCV_RVV
9
+
10
+ #define THE_SIMD_LEVEL SIMDLevel::RISCV_RVV
11
+
12
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
13
+ #include <faiss/utils/hamming_distance/hamming_computer-rvv.h>
14
+
15
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
16
+ #include <faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h>
17
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
18
+ #include <faiss/impl/binary_hamming/IndexBinaryHash_impl.h>
19
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
20
+ #include <faiss/impl/binary_hamming/IndexBinaryIVF_impl.h>
21
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
22
+ #include <faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h>
23
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
24
+ #include <faiss/impl/binary_hamming/IndexPQ_impl.h>
25
+
26
+ #endif // COMPILE_SIMD_RISCV_RVV
@@ -0,0 +1,163 @@
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 <cstdio>
11
+
12
+ #include <faiss/IndexIVF.h>
13
+ #include <faiss/impl/InvertedListScannerStats.h>
14
+ #include <faiss/impl/ResultHandler.h>
15
+
16
+ /* This is the inner loop of the inverted list scanners. The default version
17
+ * that is defined in IndexIVF.cpp works fine but it cannot inline the distance
18
+ * computation code by calling one or another of the run_scan_codes_* variants
19
+ * with the exact ScannerType and by setting distance_to_code to be a final
20
+ * function, the code can be inlined. The speed difference matters for very
21
+ * small distance computations (eg. SQ or Flat) */
22
+
23
+ namespace faiss {
24
+
25
+ namespace {
26
+
27
+ template <class ScannerType, typename C, bool store_pairs, bool use_sel>
28
+ size_t run_scan_codes1(
29
+ const ScannerType& scanner,
30
+ size_t list_size,
31
+ const uint8_t* codes,
32
+ const idx_t* ids,
33
+ ResultHandler& handler) {
34
+ size_t nup = 0;
35
+ size_t list_no = scanner.list_no;
36
+ size_t code_size = scanner.code_size;
37
+ const IDSelector* sel = scanner.sel;
38
+ float threshold = handler.threshold;
39
+ for (size_t j = 0; j < list_size; j++) {
40
+ if (use_sel) {
41
+ int64_t id = store_pairs ? lo_build(list_no, j) : ids[j];
42
+ // skip code without computing distance
43
+ if (!sel->is_member(id)) {
44
+ codes += code_size;
45
+ continue;
46
+ }
47
+ }
48
+
49
+ // post-IDSelector: distance is about to be computed for this code.
50
+ handler.stats.scan_cnt++;
51
+ float dis = scanner.distance_to_code(codes); // will be inlined if final
52
+ if (C::cmp(threshold, dis)) {
53
+ int64_t id = store_pairs ? lo_build(list_no, j) : ids[j];
54
+ if (handler.add_result(dis, id)) {
55
+ handler.stats.nheap_updates++;
56
+ nup++;
57
+ threshold = handler.threshold;
58
+ }
59
+ }
60
+ codes += code_size;
61
+ }
62
+
63
+ return nup;
64
+ }
65
+
66
+ /*****************************************************************************
67
+ * The following functions dispatch runtime parameters to templates, with
68
+ * possibly some already-fixed templates.
69
+ */
70
+
71
+ template <bool store_pairs, bool use_sel, class ScannerType>
72
+ size_t run_scan_codes_fix_store_pairs_fix_use_sel(
73
+ const ScannerType& scanner,
74
+ size_t list_size,
75
+ const uint8_t* codes,
76
+ const idx_t* ids,
77
+ ResultHandler& handler) {
78
+ if (scanner.keep_max) {
79
+ return run_scan_codes1<
80
+ ScannerType,
81
+ CMin<float, idx_t>,
82
+ store_pairs,
83
+ use_sel>(scanner, list_size, codes, ids, handler);
84
+ } else {
85
+ return run_scan_codes1<
86
+ ScannerType,
87
+ CMax<float, idx_t>,
88
+ store_pairs,
89
+ use_sel>(scanner, list_size, codes, ids, handler);
90
+ }
91
+ }
92
+
93
+ template <class C, bool use_sel, class ScannerType>
94
+ size_t run_scan_codes_fix_C_fix_use_sel(
95
+ const ScannerType& scanner,
96
+ size_t list_size,
97
+ const uint8_t* codes,
98
+ const idx_t* ids,
99
+ ResultHandler& handler) {
100
+ if (scanner.store_pairs) {
101
+ return run_scan_codes1<ScannerType, C, true, use_sel>(
102
+ scanner, list_size, codes, ids, handler);
103
+ } else {
104
+ return run_scan_codes1<ScannerType, C, false, use_sel>(
105
+ scanner, list_size, codes, ids, handler);
106
+ }
107
+ }
108
+
109
+ template <class C, class ScannerType>
110
+ size_t run_scan_codes_fix_C(
111
+ const ScannerType& scanner,
112
+ size_t list_size,
113
+ const uint8_t* codes,
114
+ const idx_t* ids,
115
+ ResultHandler& handler) {
116
+ if (scanner.sel) {
117
+ if (scanner.store_pairs) {
118
+ return run_scan_codes1<ScannerType, C, true, true>(
119
+ scanner, list_size, codes, ids, handler);
120
+ } else {
121
+ return run_scan_codes1<ScannerType, C, false, true>(
122
+ scanner, list_size, codes, ids, handler);
123
+ }
124
+ } else {
125
+ if (scanner.store_pairs) {
126
+ return run_scan_codes1<ScannerType, C, true, false>(
127
+ scanner, list_size, codes, ids, handler);
128
+ } else {
129
+ return run_scan_codes1<ScannerType, C, false, false>(
130
+ scanner, list_size, codes, ids, handler);
131
+ }
132
+ }
133
+ }
134
+
135
+ template <class ScannerType>
136
+ size_t run_scan_codes(
137
+ const ScannerType& scanner,
138
+ size_t list_size,
139
+ const uint8_t* codes,
140
+ const idx_t* ids,
141
+ ResultHandler& handler) {
142
+ if (scanner.sel == nullptr) {
143
+ if (scanner.store_pairs) {
144
+ return run_scan_codes_fix_store_pairs_fix_use_sel<true, false>(
145
+ scanner, list_size, codes, ids, handler);
146
+ } else {
147
+ return run_scan_codes_fix_store_pairs_fix_use_sel<false, false>(
148
+ scanner, list_size, codes, ids, handler);
149
+ }
150
+ } else {
151
+ if (scanner.store_pairs) {
152
+ return run_scan_codes_fix_store_pairs_fix_use_sel<true, true>(
153
+ scanner, list_size, codes, ids, handler);
154
+ } else {
155
+ return run_scan_codes_fix_store_pairs_fix_use_sel<false, true>(
156
+ scanner, list_size, codes, ids, handler);
157
+ }
158
+ }
159
+ }
160
+
161
+ } // anonymous namespace
162
+
163
+ } // namespace faiss
@@ -11,9 +11,6 @@
11
11
 
12
12
  namespace faiss {
13
13
 
14
- // Forward declarations
15
- struct NormTableScaler;
16
-
17
14
  namespace rabitq_utils {
18
15
  struct QueryFactorsData;
19
16
  }
@@ -22,8 +19,10 @@ struct QueryFactorsData;
22
19
  * Simple context object that holds processors for FastScan operations.
23
20
  * */
24
21
  struct FastScanDistancePostProcessing {
25
- /// Norm scaling processor for Additive Quantizers (nullptr if not needed)
26
- const NormTableScaler* norm_scaler = nullptr;
22
+ /// Norm scaling processor for Additive Quantizers.
23
+ /// The scale is encoded in a 2x4 bit PQ table, then scaled by this int.
24
+ /// Set to 0 if unused.
25
+ int pq2x4_scale = 0;
27
26
 
28
27
  /// Query factors data pointer for RaBitQ (nullptr if not needed)
29
28
  /// This pointer should point to the beginning of the relevant
@@ -36,12 +35,20 @@ struct FastScanDistancePostProcessing {
36
35
  /// Set to 0 to use index->nprobe as fallback.
37
36
  size_t nprobe = 0;
38
37
 
38
+ /// RaBitQ query quantization bits override.
39
+ /// Set to 0 to use the index default (index->qb).
40
+ uint8_t qb = 0;
41
+
42
+ /// RaBitQ centered scalar quantizer override.
43
+ /// Only used when qb > 0 (i.e., when params are overridden).
44
+ bool centered = false;
45
+
39
46
  /// Default constructor - no processing
40
47
  FastScanDistancePostProcessing() = default;
41
48
 
42
49
  /// Check if norm scaling is enabled
43
50
  bool has_norm_scaling() const {
44
- return norm_scaler != nullptr;
51
+ return pq2x4_scale != 0;
45
52
  }
46
53
 
47
54
  /// Check if query factors processing is enabled
@@ -10,7 +10,7 @@
10
10
  #include <cstdint>
11
11
  #include <cstdlib>
12
12
 
13
- #include <faiss/utils/simdlib.h>
13
+ #include <faiss/impl/simdlib/simdlib_dispatch.h>
14
14
 
15
15
  /*******************************************
16
16
  * The Scaler objects are used to specialize the handling of the
@@ -20,8 +20,15 @@
20
20
  namespace faiss {
21
21
 
22
22
  /// no-op handler
23
+ template <SIMDLevel SL = SINGLE_SIMD_LEVEL>
23
24
  struct DummyScaler {
24
25
  static constexpr int nscale = 0;
26
+ static constexpr SIMDLevel SL256 = simd256_level_selector<SL>::value;
27
+ static constexpr SIMDLevel SL512 = simd512_level_selector<SL>::value;
28
+ using simd32uint8 = simd32uint8_tpl<SL256>;
29
+ using simd16uint16 = simd16uint16_tpl<SL256>;
30
+ using simd64uint8 = simd64uint8_tpl<SL512>;
31
+ using simd32uint16 = simd32uint16_tpl<SL512>;
25
32
 
26
33
  inline simd32uint8 lookup(const simd32uint8&, const simd32uint8&) const {
27
34
  FAISS_THROW_MSG("DummyScaler::lookup should not be called.");
@@ -38,7 +45,6 @@ struct DummyScaler {
38
45
  return simd16uint16(0);
39
46
  }
40
47
 
41
- #ifdef __AVX512F__
42
48
  inline simd64uint8 lookup(const simd64uint8&, const simd64uint8&) const {
43
49
  FAISS_THROW_MSG("DummyScaler::lookup should not be called.");
44
50
  return simd64uint8(0);
@@ -53,7 +59,6 @@ struct DummyScaler {
53
59
  FAISS_THROW_MSG("DummyScaler::scale_hi should not be called.");
54
60
  return simd32uint16(0);
55
61
  }
56
- #endif
57
62
 
58
63
  template <class dist_t>
59
64
  inline dist_t scale_one(const dist_t&) const {
@@ -64,8 +69,16 @@ struct DummyScaler {
64
69
 
65
70
  /// consumes 2x4 bits to encode a norm as a scalar additive quantizer
66
71
  /// the norm is scaled because its range is larger than other components
72
+ template <SIMDLevel SL = SINGLE_SIMD_LEVEL>
67
73
  struct NormTableScaler {
68
74
  static constexpr int nscale = 2;
75
+ static constexpr SIMDLevel SL256 = simd256_level_selector<SL>::value;
76
+ static constexpr SIMDLevel SL512 = simd512_level_selector<SL>::value;
77
+ using simd32uint8 = simd32uint8_tpl<SL256>;
78
+ using simd16uint16 = simd16uint16_tpl<SL256>;
79
+ using simd64uint8 = simd64uint8_tpl<SL512>;
80
+ using simd32uint16 = simd32uint16_tpl<SL512>;
81
+
69
82
  int scale_int;
70
83
  simd16uint16 scale_simd;
71
84
 
@@ -84,7 +97,6 @@ struct NormTableScaler {
84
97
  return (simd16uint16(res) >> 8) * scale_simd;
85
98
  }
86
99
 
87
- #ifdef __AVX512F__
88
100
  inline simd64uint8 lookup(const simd64uint8& lut, const simd64uint8& c)
89
101
  const {
90
102
  return lut.lookup_4_lanes(c);
@@ -99,7 +111,6 @@ struct NormTableScaler {
99
111
  auto scale_simd_wide = simd32uint16(scale_simd, scale_simd);
100
112
  return (simd32uint16(res) >> 8) * scale_simd_wide;
101
113
  }
102
- #endif
103
114
 
104
115
  // for non-SIMD implem 2, 3, 4
105
116
  template <class dist_t>