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,388 @@
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/impl/scalar_quantizer/codecs.h>
11
+ #include <faiss/impl/scalar_quantizer/distance_computers.h>
12
+ #include <faiss/impl/scalar_quantizer/quantizers.h>
13
+ #include <faiss/impl/scalar_quantizer/scanners.h>
14
+ #include <faiss/impl/scalar_quantizer/similarities.h>
15
+
16
+ #ifndef THE_LEVEL_TO_DISPATCH
17
+ #error "THE_LEVEL_TO_DISPATCH should be set on input to this header"
18
+ #endif
19
+
20
+ namespace faiss {
21
+
22
+ namespace scalar_quantizer {
23
+
24
+ // Define SL as alias for THE_LEVEL_TO_DISPATCH for use in this file
25
+ constexpr SIMDLevel SL = THE_LEVEL_TO_DISPATCH;
26
+
27
+ // Returns true if dimension d is compatible with the given SIMD level
28
+ template <SIMDLevel SL2>
29
+ constexpr bool is_dimension_compatible(size_t d) {
30
+ if constexpr (SL2 == SIMDLevel::AVX512) {
31
+ return d % 16 == 0;
32
+ } else if constexpr (SL2 == SIMDLevel::AVX2 || SL2 == SIMDLevel::ARM_NEON) {
33
+ return d % 8 == 0;
34
+ } else {
35
+ return true; // SIMDLevel::NONE has no alignment requirements
36
+ }
37
+ }
38
+
39
+ /*******************************************************************
40
+ * sq_select_quantizer: the big switch returning SQuantizer*
41
+ *******************************************************************/
42
+
43
+ template <>
44
+ ScalarQuantizer::SQuantizer* sq_select_quantizer<THE_LEVEL_TO_DISPATCH>(
45
+ QuantizerType qtype,
46
+ size_t d,
47
+ const std::vector<float>& trained) {
48
+ // Return nullptr for incompatible dimensions in SIMD cases
49
+ if constexpr (SL != SIMDLevel::NONE) {
50
+ if (!is_dimension_compatible<SL>(d)) {
51
+ return nullptr;
52
+ }
53
+ }
54
+ switch (qtype) {
55
+ case ScalarQuantizer::QT_8bit:
56
+ return new QuantizerTemplate<
57
+ Codec8bit<SL>,
58
+ QuantizerTemplateScaling::NON_UNIFORM,
59
+ SL>(d, trained);
60
+ case ScalarQuantizer::QT_6bit:
61
+ return new QuantizerTemplate<
62
+ Codec6bit<SL>,
63
+ QuantizerTemplateScaling::NON_UNIFORM,
64
+ SL>(d, trained);
65
+ case ScalarQuantizer::QT_4bit:
66
+ return new QuantizerTemplate<
67
+ Codec4bit<SL>,
68
+ QuantizerTemplateScaling::NON_UNIFORM,
69
+ SL>(d, trained);
70
+ case ScalarQuantizer::QT_8bit_uniform:
71
+ return new QuantizerTemplate<
72
+ Codec8bit<SL>,
73
+ QuantizerTemplateScaling::UNIFORM,
74
+ SL>(d, trained);
75
+ case ScalarQuantizer::QT_4bit_uniform:
76
+ return new QuantizerTemplate<
77
+ Codec4bit<SL>,
78
+ QuantizerTemplateScaling::UNIFORM,
79
+ SL>(d, trained);
80
+ case ScalarQuantizer::QT_fp16:
81
+ return new QuantizerFP16<SL>(d, trained);
82
+ case ScalarQuantizer::QT_bf16:
83
+ return new QuantizerBF16<SL>(d, trained);
84
+ case ScalarQuantizer::QT_8bit_direct:
85
+ return new Quantizer8bitDirect<SL>(d, trained);
86
+ case ScalarQuantizer::QT_8bit_direct_signed:
87
+ return new Quantizer8bitDirectSigned<SL>(d, trained);
88
+ case ScalarQuantizer::QT_0bit:
89
+ FAISS_THROW_MSG(
90
+ "QT_0bit does not support standalone quantization, use IndexIVFScalarQuantizer");
91
+ case ScalarQuantizer::QT_1bit_tqmse:
92
+ return new QuantizerTurboQuantMSE<1, SL>(d, trained);
93
+ case ScalarQuantizer::QT_2bit_tqmse:
94
+ return new QuantizerTurboQuantMSE<2, SL>(d, trained);
95
+ case ScalarQuantizer::QT_3bit_tqmse:
96
+ return new QuantizerTurboQuantMSE<3, SL>(d, trained);
97
+ case ScalarQuantizer::QT_4bit_tqmse:
98
+ return new QuantizerTurboQuantMSE<4, SL>(d, trained);
99
+ case ScalarQuantizer::QT_8bit_tqmse:
100
+ return new QuantizerTurboQuantMSE<8, SL>(d, trained);
101
+ default:
102
+ FAISS_THROW_MSG("unknown qtype");
103
+ }
104
+ }
105
+
106
+ /*******************************************************************
107
+ * select_distance_computer_body: helper for sq_select_distance_computer
108
+ *******************************************************************/
109
+
110
+ template <class Sim, SIMDLevel SL2>
111
+ SQDistanceComputer* select_distance_computer_body(
112
+ ScalarQuantizer::QuantizerType qtype,
113
+ size_t d,
114
+ const std::vector<float>& trained) {
115
+ // Return nullptr for incompatible dimensions in SIMD cases
116
+ if constexpr (SL2 != SIMDLevel::NONE) {
117
+ if (!is_dimension_compatible<SL2>(d)) {
118
+ return nullptr;
119
+ }
120
+ }
121
+ switch (qtype) {
122
+ case ScalarQuantizer::QT_8bit_uniform:
123
+ return new DCTemplate<
124
+ QuantizerTemplate<
125
+ Codec8bit<SL2>,
126
+ QuantizerTemplateScaling::UNIFORM,
127
+ SL2>,
128
+ Sim,
129
+ SL2>(d, trained);
130
+
131
+ case ScalarQuantizer::QT_4bit_uniform:
132
+ return new DCTemplate<
133
+ QuantizerTemplate<
134
+ Codec4bit<SL2>,
135
+ QuantizerTemplateScaling::UNIFORM,
136
+ SL2>,
137
+ Sim,
138
+ SL2>(d, trained);
139
+
140
+ case ScalarQuantizer::QT_8bit:
141
+ return new DCTemplate<
142
+ QuantizerTemplate<
143
+ Codec8bit<SL2>,
144
+ QuantizerTemplateScaling::NON_UNIFORM,
145
+ SL2>,
146
+ Sim,
147
+ SL2>(d, trained);
148
+
149
+ case ScalarQuantizer::QT_6bit:
150
+ return new DCTemplate<
151
+ QuantizerTemplate<
152
+ Codec6bit<SL2>,
153
+ QuantizerTemplateScaling::NON_UNIFORM,
154
+ SL2>,
155
+ Sim,
156
+ SL2>(d, trained);
157
+
158
+ case ScalarQuantizer::QT_4bit:
159
+ return new DCTemplate<
160
+ QuantizerTemplate<
161
+ Codec4bit<SL2>,
162
+ QuantizerTemplateScaling::NON_UNIFORM,
163
+ SL2>,
164
+ Sim,
165
+ SL2>(d, trained);
166
+
167
+ case ScalarQuantizer::QT_fp16:
168
+ return new DCTemplate<QuantizerFP16<SL2>, Sim, SL2>(d, trained);
169
+
170
+ case ScalarQuantizer::QT_bf16:
171
+ return new DCTemplate<QuantizerBF16<SL2>, Sim, SL2>(d, trained);
172
+
173
+ case ScalarQuantizer::QT_8bit_direct:
174
+ if constexpr (SL2 == SIMDLevel::AVX512) {
175
+ if (d % 32 == 0) {
176
+ return new DistanceComputerByte<Sim, SL2>(
177
+ static_cast<int>(d), trained);
178
+ }
179
+ } else if constexpr (SL2 == SIMDLevel::AVX2) {
180
+ if (d % 16 == 0) {
181
+ return new DistanceComputerByte<Sim, SL2>(
182
+ static_cast<int>(d), trained);
183
+ }
184
+ }
185
+ return new DCTemplate<Quantizer8bitDirect<SL2>, Sim, SL2>(
186
+ d, trained);
187
+
188
+ case ScalarQuantizer::QT_8bit_direct_signed:
189
+ return new DCTemplate<Quantizer8bitDirectSigned<SL2>, Sim, SL2>(
190
+ d, trained);
191
+ case ScalarQuantizer::QT_0bit:
192
+ FAISS_THROW_MSG(
193
+ "QT_0bit does not support standalone distance computation, use IndexIVFScalarQuantizer");
194
+ case ScalarQuantizer::QT_1bit_tqmse:
195
+ return new DCTemplate<QuantizerTurboQuantMSE<1, SL2>, Sim, SL2>(
196
+ d, trained);
197
+ case ScalarQuantizer::QT_2bit_tqmse:
198
+ return new DCTemplate<QuantizerTurboQuantMSE<2, SL2>, Sim, SL2>(
199
+ d, trained);
200
+ case ScalarQuantizer::QT_3bit_tqmse:
201
+ return new DCTemplate<QuantizerTurboQuantMSE<3, SL2>, Sim, SL2>(
202
+ d, trained);
203
+ case ScalarQuantizer::QT_4bit_tqmse:
204
+ return new DCTemplate<QuantizerTurboQuantMSE<4, SL2>, Sim, SL2>(
205
+ d, trained);
206
+ case ScalarQuantizer::QT_8bit_tqmse:
207
+ return new DCTemplate<QuantizerTurboQuantMSE<8, SL2>, Sim, SL2>(
208
+ d, trained);
209
+ default:
210
+ FAISS_THROW_MSG("unknown qtype");
211
+ }
212
+ }
213
+
214
+ /*******************************************************************
215
+ * sq_select_distance_computer: returns SQDistanceComputer*
216
+ *******************************************************************/
217
+
218
+ template <>
219
+ SQDistanceComputer* sq_select_distance_computer<THE_LEVEL_TO_DISPATCH>(
220
+ MetricType metric,
221
+ ScalarQuantizer::QuantizerType qtype,
222
+ size_t d,
223
+ const std::vector<float>& trained) {
224
+ if (metric == METRIC_L2) {
225
+ return select_distance_computer_body<SimilarityL2<SL>, SL>(
226
+ qtype, d, trained);
227
+ } else {
228
+ return select_distance_computer_body<SimilarityIP<SL>, SL>(
229
+ qtype, d, trained);
230
+ }
231
+ }
232
+
233
+ /*******************************************************************
234
+ * sq_select_InvertedListScanner: returns InvertedListScanner*
235
+ *******************************************************************/
236
+
237
+ template <>
238
+ InvertedListScanner* sq_select_InvertedListScanner<THE_LEVEL_TO_DISPATCH>(
239
+ QuantizerType qtype,
240
+ MetricType mt,
241
+ size_t d,
242
+ size_t code_size,
243
+ const std::vector<float>& trained,
244
+ const Index* quantizer,
245
+ bool store_pairs,
246
+ const IDSelector* sel,
247
+ bool by_residual) {
248
+ auto scan = [&]<class DCClass>() -> InvertedListScanner* {
249
+ if constexpr (DCClass::Sim::metric_type == METRIC_L2) {
250
+ return new IVFSQScannerL2<DCClass>(
251
+ int(d),
252
+ trained,
253
+ code_size,
254
+ quantizer,
255
+ store_pairs,
256
+ sel,
257
+ by_residual);
258
+ } else if constexpr (
259
+ DCClass::Sim::metric_type == METRIC_INNER_PRODUCT) {
260
+ return new IVFSQScannerIP<DCClass>(
261
+ int(d), trained, code_size, store_pairs, sel, by_residual);
262
+ } else {
263
+ FAISS_THROW_MSG("unsupported metric type");
264
+ }
265
+ };
266
+
267
+ auto select_by_simd_and_metric =
268
+ [&]<SIMDLevel SL2, class Similarity>() -> InvertedListScanner* {
269
+ // Return nullptr for incompatible dimensions in SIMD cases
270
+ if constexpr (SL2 != SIMDLevel::NONE) {
271
+ if (!is_dimension_compatible<SL2>(d)) {
272
+ return nullptr;
273
+ }
274
+ }
275
+ switch (qtype) {
276
+ case ScalarQuantizer::QT_8bit_uniform:
277
+ return scan.template operator()<DCTemplate<
278
+ QuantizerTemplate<
279
+ Codec8bit<SL2>,
280
+ QuantizerTemplateScaling::UNIFORM,
281
+ SL2>,
282
+ Similarity,
283
+ SL2>>();
284
+ case ScalarQuantizer::QT_4bit_uniform:
285
+ return scan.template operator()<DCTemplate<
286
+ QuantizerTemplate<
287
+ Codec4bit<SL2>,
288
+ QuantizerTemplateScaling::UNIFORM,
289
+ SL2>,
290
+ Similarity,
291
+ SL2>>();
292
+ case ScalarQuantizer::QT_8bit:
293
+ return scan.template operator()<DCTemplate<
294
+ QuantizerTemplate<
295
+ Codec8bit<SL2>,
296
+ QuantizerTemplateScaling::NON_UNIFORM,
297
+ SL2>,
298
+ Similarity,
299
+ SL2>>();
300
+ case ScalarQuantizer::QT_4bit:
301
+ return scan.template operator()<DCTemplate<
302
+ QuantizerTemplate<
303
+ Codec4bit<SL2>,
304
+ QuantizerTemplateScaling::NON_UNIFORM,
305
+ SL2>,
306
+ Similarity,
307
+ SL2>>();
308
+ case ScalarQuantizer::QT_6bit:
309
+ return scan.template operator()<DCTemplate<
310
+ QuantizerTemplate<
311
+ Codec6bit<SL2>,
312
+ QuantizerTemplateScaling::NON_UNIFORM,
313
+ SL2>,
314
+ Similarity,
315
+ SL2>>();
316
+ case ScalarQuantizer::QT_fp16:
317
+ return scan.template
318
+ operator()<DCTemplate<QuantizerFP16<SL2>, Similarity, SL2>>();
319
+ case ScalarQuantizer::QT_bf16:
320
+ return scan.template
321
+ operator()<DCTemplate<QuantizerBF16<SL2>, Similarity, SL2>>();
322
+ case ScalarQuantizer::QT_8bit_direct:
323
+ if constexpr (SL2 == SIMDLevel::AVX512) {
324
+ if (d % 32 == 0) {
325
+ return scan.template
326
+ operator()<DistanceComputerByte<Similarity, SL2>>();
327
+ }
328
+ } else if constexpr (SL2 == SIMDLevel::AVX2) {
329
+ if (d % 16 == 0) {
330
+ return scan.template
331
+ operator()<DistanceComputerByte<Similarity, SL2>>();
332
+ }
333
+ }
334
+ return scan.template operator()<DCTemplate<
335
+ Quantizer8bitDirect<SL2>,
336
+ Similarity,
337
+ SL2>>();
338
+ case ScalarQuantizer::QT_8bit_direct_signed:
339
+ return scan.template operator()<DCTemplate<
340
+ Quantizer8bitDirectSigned<SL2>,
341
+ Similarity,
342
+ SL2>>();
343
+ case ScalarQuantizer::QT_0bit:
344
+ return new IVFCoarseDistanceScanner(
345
+ Similarity::metric_type != METRIC_L2, store_pairs, sel);
346
+ case ScalarQuantizer::QT_1bit_tqmse:
347
+ return scan.template operator()<DCTemplate<
348
+ QuantizerTurboQuantMSE<1, SL2>,
349
+ Similarity,
350
+ SL2>>();
351
+ case ScalarQuantizer::QT_2bit_tqmse:
352
+ return scan.template operator()<DCTemplate<
353
+ QuantizerTurboQuantMSE<2, SL2>,
354
+ Similarity,
355
+ SL2>>();
356
+ case ScalarQuantizer::QT_3bit_tqmse:
357
+ return scan.template operator()<DCTemplate<
358
+ QuantizerTurboQuantMSE<3, SL2>,
359
+ Similarity,
360
+ SL2>>();
361
+ case ScalarQuantizer::QT_4bit_tqmse:
362
+ return scan.template operator()<DCTemplate<
363
+ QuantizerTurboQuantMSE<4, SL2>,
364
+ Similarity,
365
+ SL2>>();
366
+ case ScalarQuantizer::QT_8bit_tqmse:
367
+ return scan.template operator()<DCTemplate<
368
+ QuantizerTurboQuantMSE<8, SL2>,
369
+ Similarity,
370
+ SL2>>();
371
+ default:
372
+ FAISS_THROW_MSG("unknown qtype");
373
+ }
374
+ };
375
+
376
+ if (mt == METRIC_L2) {
377
+ return select_by_simd_and_metric
378
+ .template operator()<SL, SimilarityL2<SL>>();
379
+ } else if (mt == METRIC_INNER_PRODUCT) {
380
+ return select_by_simd_and_metric
381
+ .template operator()<SL, SimilarityIP<SL>>();
382
+ }
383
+ FAISS_THROW_MSG("unsupported metric type");
384
+ }
385
+
386
+ } // namespace scalar_quantizer
387
+
388
+ } // namespace faiss