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
@@ -11,7 +11,7 @@
11
11
  #include <vector>
12
12
 
13
13
  #include <faiss/Index.h>
14
- #include <faiss/utils/approx_topk/mode.h>
14
+ #include <faiss/impl/approx_topk/approx_topk.h>
15
15
 
16
16
  namespace faiss {
17
17
 
@@ -0,0 +1,121 @@
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/ScalarQuantizer.h>
11
+ #include <faiss/impl/simdlib/simdlib_dispatch.h>
12
+ #include <faiss/utils/simd_levels.h>
13
+
14
+ namespace faiss {
15
+
16
+ namespace scalar_quantizer {
17
+
18
+ /*******************************************************************
19
+ * Codec: converts between values in [0, 1] and an index in a code
20
+ * array. The "i" parameter is the vector component index (not byte
21
+ * index).
22
+ */
23
+
24
+ template <SIMDLevel SL>
25
+ struct Codec8bit {};
26
+
27
+ template <>
28
+ struct Codec8bit<SIMDLevel::NONE> {
29
+ static FAISS_ALWAYS_INLINE void encode_component(
30
+ float x,
31
+ uint8_t* code,
32
+ size_t i) {
33
+ code[i] = (int)(255 * x);
34
+ }
35
+
36
+ static FAISS_ALWAYS_INLINE float decode_component(
37
+ const uint8_t* code,
38
+ size_t i) {
39
+ return (code[i] + 0.5f) / 255.0f;
40
+ }
41
+ };
42
+
43
+ template <SIMDLevel SL>
44
+ struct Codec4bit {};
45
+
46
+ template <>
47
+ struct Codec4bit<SIMDLevel::NONE> {
48
+ static FAISS_ALWAYS_INLINE void encode_component(
49
+ float x,
50
+ uint8_t* code,
51
+ size_t i) {
52
+ code[i / 2] |= (int)(x * 15.0) << ((i & 1) << 2);
53
+ }
54
+
55
+ static FAISS_ALWAYS_INLINE float decode_component(
56
+ const uint8_t* code,
57
+ size_t i) {
58
+ return (((code[i / 2] >> ((i & 1) << 2)) & 0xf) + 0.5f) / 15.0f;
59
+ }
60
+ };
61
+
62
+ template <SIMDLevel SL>
63
+ struct Codec6bit {};
64
+
65
+ template <>
66
+ struct Codec6bit<SIMDLevel::NONE> {
67
+ static FAISS_ALWAYS_INLINE void encode_component(
68
+ float x,
69
+ uint8_t* code,
70
+ size_t i) {
71
+ int bits = (int)(x * 63.0);
72
+ code += (i >> 2) * 3;
73
+ switch (i & 3) {
74
+ case 0:
75
+ code[0] |= bits;
76
+ break;
77
+ case 1:
78
+ code[0] |= bits << 6;
79
+ code[1] |= bits >> 2;
80
+ break;
81
+ case 2:
82
+ code[1] |= bits << 4;
83
+ code[2] |= bits >> 4;
84
+ break;
85
+ case 3:
86
+ code[2] |= bits << 2;
87
+ break;
88
+ default:
89
+ break;
90
+ }
91
+ }
92
+
93
+ static FAISS_ALWAYS_INLINE float decode_component(
94
+ const uint8_t* code,
95
+ size_t i) {
96
+ uint8_t bits = 0;
97
+ code += (i >> 2) * 3;
98
+ switch (i & 3) {
99
+ case 0:
100
+ bits = code[0] & 0x3f;
101
+ break;
102
+ case 1:
103
+ bits = code[0] >> 6;
104
+ bits |= (code[1] & 0xf) << 2;
105
+ break;
106
+ case 2:
107
+ bits = code[1] >> 4;
108
+ bits |= (code[2] & 3) << 4;
109
+ break;
110
+ case 3:
111
+ bits = code[2] >> 2;
112
+ break;
113
+ default:
114
+ break;
115
+ }
116
+ return (bits + 0.5f) / 63.0f;
117
+ }
118
+ };
119
+
120
+ } // namespace scalar_quantizer
121
+ } // namespace faiss
@@ -0,0 +1,137 @@
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/ScalarQuantizer.h>
11
+ #include <faiss/impl/simdlib/simdlib_dispatch.h>
12
+ #include <faiss/utils/simd_levels.h>
13
+
14
+ namespace faiss {
15
+
16
+ namespace scalar_quantizer {
17
+
18
+ using SQDistanceComputer = ScalarQuantizer::SQDistanceComputer;
19
+
20
+ /*******************************************************************
21
+ * DistanceComputer: combines a similarity and a quantizer to do
22
+ * code-to-vector or code-to-code comparisons
23
+ *******************************************************************/
24
+
25
+ template <class Quantizer, class Similarity, SIMDLevel SL>
26
+ struct DCTemplate : SQDistanceComputer {};
27
+
28
+ template <class Quantizer, class Similarity>
29
+ struct DCTemplate<Quantizer, Similarity, SIMDLevel::NONE> : SQDistanceComputer {
30
+ using Sim = Similarity;
31
+
32
+ Quantizer quant;
33
+
34
+ DCTemplate(size_t d, const std::vector<float>& trained)
35
+ : quant(d, trained) {}
36
+
37
+ float compute_distance(const float* x, const uint8_t* code) const {
38
+ Similarity sim(x);
39
+ sim.begin();
40
+ for (size_t i = 0; i < quant.d; i++) {
41
+ float xi = quant.reconstruct_component(code, i);
42
+ sim.add_component(xi);
43
+ }
44
+ return sim.result();
45
+ }
46
+
47
+ float compute_code_distance(const uint8_t* code1, const uint8_t* code2)
48
+ const {
49
+ Similarity sim(nullptr);
50
+ sim.begin();
51
+ for (size_t i = 0; i < quant.d; i++) {
52
+ float x1 = quant.reconstruct_component(code1, i);
53
+ float x2 = quant.reconstruct_component(code2, i);
54
+ sim.add_component_2(x1, x2);
55
+ }
56
+ return sim.result();
57
+ }
58
+
59
+ void set_query(const float* x) final {
60
+ q = x;
61
+ }
62
+
63
+ float symmetric_dis(idx_t i, idx_t j) override {
64
+ return compute_code_distance(
65
+ codes + i * code_size, codes + j * code_size);
66
+ }
67
+
68
+ float query_to_code(const uint8_t* code) const final {
69
+ return compute_distance(q, code);
70
+ }
71
+ };
72
+
73
+ /*******************************************************************
74
+ * DistanceComputerByte: computes distances in the integer domain
75
+ *******************************************************************/
76
+
77
+ template <class Similarity, SIMDLevel SL>
78
+ struct DistanceComputerByte : SQDistanceComputer {};
79
+
80
+ template <class Similarity>
81
+ struct DistanceComputerByte<Similarity, SIMDLevel::NONE> : SQDistanceComputer {
82
+ using Sim = Similarity;
83
+
84
+ int d;
85
+ std::vector<uint8_t> tmp;
86
+
87
+ DistanceComputerByte(int d_in, const std::vector<float>&)
88
+ : d(d_in), tmp(d_in) {}
89
+
90
+ int compute_code_distance(const uint8_t* code1, const uint8_t* code2)
91
+ const {
92
+ int accu = 0;
93
+ for (int i = 0; i < d; i++) {
94
+ if (Sim::metric_type == METRIC_INNER_PRODUCT) {
95
+ accu += int(code1[i]) * code2[i];
96
+ } else {
97
+ int diff = int(code1[i]) - code2[i];
98
+ accu += diff * diff;
99
+ }
100
+ }
101
+ return accu;
102
+ }
103
+
104
+ void set_query(const float* x) final {
105
+ for (int i = 0; i < d; i++) {
106
+ tmp[i] = int(x[i]);
107
+ }
108
+ }
109
+
110
+ int compute_distance(const float* x, const uint8_t* code) {
111
+ set_query(x);
112
+ return compute_code_distance(tmp.data(), code);
113
+ }
114
+
115
+ float symmetric_dis(idx_t i, idx_t j) override {
116
+ return compute_code_distance(
117
+ codes + i * code_size, codes + j * code_size);
118
+ }
119
+
120
+ float query_to_code(const uint8_t* code) const final {
121
+ return compute_code_distance(tmp.data(), code);
122
+ }
123
+ };
124
+
125
+ /*******************************************************************
126
+ * Selection function
127
+ *******************************************************************/
128
+
129
+ template <SIMDLevel SL>
130
+ SQDistanceComputer* sq_select_distance_computer(
131
+ MetricType metric,
132
+ ScalarQuantizer::QuantizerType qtype,
133
+ size_t d,
134
+ const std::vector<float>& trained);
135
+
136
+ } // namespace scalar_quantizer
137
+ } // namespace faiss
@@ -0,0 +1,371 @@
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 <algorithm>
11
+
12
+ #include <faiss/impl/FaissAssert.h>
13
+ #include <faiss/impl/ScalarQuantizer.h>
14
+ #include <faiss/impl/simdlib/simdlib_dispatch.h>
15
+ #include <faiss/utils/bf16.h>
16
+ #include <faiss/utils/fp16.h>
17
+ #include <faiss/utils/simd_levels.h>
18
+
19
+ namespace faiss {
20
+
21
+ namespace scalar_quantizer {
22
+
23
+ using QuantizerType = ScalarQuantizer::QuantizerType;
24
+
25
+ /*******************************************************************
26
+ * Quantizer: normalizes scalar vector components, then passes them
27
+ * through a codec
28
+ *******************************************************************/
29
+
30
+ enum class QuantizerTemplateScaling { UNIFORM = 0, NON_UNIFORM = 1 };
31
+
32
+ template <class Codec, QuantizerTemplateScaling SCALING, SIMDLevel SL>
33
+ struct QuantizerTemplate {};
34
+
35
+ template <class Codec>
36
+ struct QuantizerTemplate<
37
+ Codec,
38
+ QuantizerTemplateScaling::UNIFORM,
39
+ SIMDLevel::NONE> : ScalarQuantizer::SQuantizer {
40
+ const size_t d;
41
+ const float vmin, vdiff;
42
+
43
+ QuantizerTemplate(size_t d_in, const std::vector<float>& trained)
44
+ : d(d_in), vmin(trained[0]), vdiff(trained[1]) {}
45
+
46
+ void encode_vector(const float* x, uint8_t* code) const final {
47
+ for (size_t i = 0; i < d; i++) {
48
+ float xi = 0;
49
+ if (vdiff != 0) {
50
+ xi = (x[i] - vmin) / vdiff;
51
+ if (xi < 0) {
52
+ xi = 0;
53
+ }
54
+ if (xi > 1.0) {
55
+ xi = 1.0;
56
+ }
57
+ }
58
+ Codec::encode_component(xi, code, i);
59
+ }
60
+ }
61
+
62
+ void decode_vector(const uint8_t* code, float* x) const final {
63
+ for (size_t i = 0; i < d; i++) {
64
+ float xi = Codec::decode_component(code, i);
65
+ x[i] = vmin + xi * vdiff;
66
+ }
67
+ }
68
+
69
+ FAISS_ALWAYS_INLINE float reconstruct_component(
70
+ const uint8_t* code,
71
+ size_t i) const {
72
+ float xi = Codec::decode_component(code, i);
73
+ return vmin + xi * vdiff;
74
+ }
75
+ };
76
+
77
+ template <class Codec>
78
+ struct QuantizerTemplate<
79
+ Codec,
80
+ QuantizerTemplateScaling::NON_UNIFORM,
81
+ SIMDLevel::NONE> : ScalarQuantizer::SQuantizer {
82
+ const size_t d;
83
+ const float *vmin, *vdiff;
84
+
85
+ QuantizerTemplate(size_t d_in, const std::vector<float>& trained)
86
+ : d(d_in), vmin(trained.data()), vdiff(trained.data() + d_in) {}
87
+
88
+ void encode_vector(const float* x, uint8_t* code) const final {
89
+ for (size_t i = 0; i < d; i++) {
90
+ float xi = 0;
91
+ if (vdiff[i] != 0) {
92
+ xi = (x[i] - vmin[i]) / vdiff[i];
93
+ if (xi < 0) {
94
+ xi = 0;
95
+ }
96
+ if (xi > 1.0) {
97
+ xi = 1.0;
98
+ }
99
+ }
100
+ Codec::encode_component(xi, code, i);
101
+ }
102
+ }
103
+
104
+ void decode_vector(const uint8_t* code, float* x) const final {
105
+ for (size_t i = 0; i < d; i++) {
106
+ float xi = Codec::decode_component(code, i);
107
+ x[i] = vmin[i] + xi * vdiff[i];
108
+ }
109
+ }
110
+
111
+ FAISS_ALWAYS_INLINE float reconstruct_component(
112
+ const uint8_t* code,
113
+ size_t i) const {
114
+ float xi = Codec::decode_component(code, i);
115
+ return vmin[i] + xi * vdiff[i];
116
+ }
117
+ };
118
+
119
+ /*******************************************************************
120
+ * TurboQuant MSE quantizer
121
+ *******************************************************************/
122
+ template <int NBits, SIMDLevel SL>
123
+ struct QuantizerTurboQuantMSE;
124
+
125
+ template <int NBits>
126
+ struct QuantizerTurboQuantMSE<NBits, SIMDLevel::NONE>
127
+ : ScalarQuantizer::SQuantizer {
128
+ static_assert(NBits >= 1 && NBits <= 8);
129
+
130
+ static constexpr size_t kCentroidsCount = size_t(1) << NBits;
131
+ static constexpr uint16_t kIndexMask =
132
+ static_cast<uint16_t>((1u << NBits) - 1);
133
+
134
+ const size_t d;
135
+ const float* centroids;
136
+ const float* boundaries;
137
+
138
+ QuantizerTurboQuantMSE(size_t d_in, const std::vector<float>& trained)
139
+ : d(d_in), centroids(nullptr), boundaries(nullptr) {
140
+ FAISS_THROW_IF_NOT(trained.size() == 2 * kCentroidsCount - 1);
141
+ centroids = trained.data();
142
+ boundaries = trained.data() + kCentroidsCount;
143
+ }
144
+
145
+ FAISS_ALWAYS_INLINE uint8_t select_index(float x) const {
146
+ return static_cast<uint8_t>(
147
+ std::upper_bound(
148
+ boundaries, boundaries + (kCentroidsCount - 1), x) -
149
+ boundaries);
150
+ }
151
+
152
+ FAISS_ALWAYS_INLINE void encode_index(uint8_t idx, uint8_t* code, size_t i)
153
+ const {
154
+ const size_t bit_offset = i * NBits;
155
+ const size_t byte_offset = bit_offset >> 3;
156
+ const size_t bit_shift = bit_offset & 7;
157
+ const uint16_t packed = static_cast<uint16_t>(idx & kIndexMask)
158
+ << bit_shift;
159
+ code[byte_offset] |= packed & 0xff;
160
+ if (bit_shift + NBits > 8) {
161
+ code[byte_offset + 1] |= packed >> 8;
162
+ }
163
+ }
164
+
165
+ FAISS_ALWAYS_INLINE uint8_t
166
+ decode_index(const uint8_t* code, size_t i) const {
167
+ const size_t bit_offset = i * NBits;
168
+ const size_t byte_offset = bit_offset >> 3;
169
+ const size_t bit_shift = bit_offset & 7;
170
+
171
+ uint16_t packed = code[byte_offset];
172
+ if (bit_shift + NBits > 8) {
173
+ packed |= static_cast<uint16_t>(code[byte_offset + 1]) << 8;
174
+ }
175
+ return static_cast<uint8_t>((packed >> bit_shift) & kIndexMask);
176
+ }
177
+
178
+ void encode_vector(const float* x, uint8_t* code) const final {
179
+ for (size_t i = 0; i < d; i++) {
180
+ encode_index(select_index(x[i]), code, i);
181
+ }
182
+ }
183
+
184
+ void decode_vector(const uint8_t* code, float* x) const final {
185
+ for (size_t i = 0; i < d; i++) {
186
+ x[i] = centroids[decode_index(code, i)];
187
+ }
188
+ }
189
+
190
+ FAISS_ALWAYS_INLINE float reconstruct_component(
191
+ const uint8_t* code,
192
+ size_t i) const {
193
+ return centroids[decode_index(code, i)];
194
+ }
195
+ };
196
+
197
+ template <int NBits, SIMDLevel SL>
198
+ struct QuantizerTurboQuantMSE : QuantizerTurboQuantMSE<NBits, SIMDLevel::NONE> {
199
+ using QuantizerTurboQuantMSE<NBits, SIMDLevel::NONE>::
200
+ QuantizerTurboQuantMSE;
201
+ };
202
+
203
+ /*******************************************************************
204
+ * FP16 quantizer
205
+ *******************************************************************/
206
+
207
+ template <SIMDLevel SL>
208
+ struct QuantizerFP16;
209
+
210
+ template <>
211
+ struct QuantizerFP16<SIMDLevel::NONE> : ScalarQuantizer::SQuantizer {
212
+ const size_t d;
213
+
214
+ QuantizerFP16(size_t d_in, const std::vector<float>& /* unused */)
215
+ : d(d_in) {}
216
+
217
+ void encode_vector(const float* x, uint8_t* code) const final {
218
+ for (size_t i = 0; i < d; i++) {
219
+ ((uint16_t*)code)[i] = encode_fp16(x[i]);
220
+ }
221
+ }
222
+
223
+ void decode_vector(const uint8_t* code, float* x) const final {
224
+ for (size_t i = 0; i < d; i++) {
225
+ x[i] = decode_fp16(((uint16_t*)code)[i]);
226
+ }
227
+ }
228
+
229
+ FAISS_ALWAYS_INLINE float reconstruct_component(
230
+ const uint8_t* code,
231
+ size_t i) const {
232
+ return decode_fp16(((uint16_t*)code)[i]);
233
+ }
234
+ };
235
+
236
+ template <SIMDLevel SL>
237
+ struct QuantizerFP16 : QuantizerFP16<SIMDLevel::NONE> {
238
+ using QuantizerFP16<SIMDLevel::NONE>::QuantizerFP16;
239
+ };
240
+
241
+ /*******************************************************************
242
+ * BF16 quantizer
243
+ *******************************************************************/
244
+
245
+ template <SIMDLevel SL>
246
+ struct QuantizerBF16;
247
+
248
+ template <>
249
+ struct QuantizerBF16<SIMDLevel::NONE> : ScalarQuantizer::SQuantizer {
250
+ const size_t d;
251
+
252
+ QuantizerBF16(size_t d_in, const std::vector<float>& /* unused */)
253
+ : d(d_in) {}
254
+
255
+ void encode_vector(const float* x, uint8_t* code) const final {
256
+ for (size_t i = 0; i < d; i++) {
257
+ ((uint16_t*)code)[i] = encode_bf16(x[i]);
258
+ }
259
+ }
260
+
261
+ void decode_vector(const uint8_t* code, float* x) const final {
262
+ for (size_t i = 0; i < d; i++) {
263
+ x[i] = decode_bf16(((uint16_t*)code)[i]);
264
+ }
265
+ }
266
+
267
+ FAISS_ALWAYS_INLINE float reconstruct_component(
268
+ const uint8_t* code,
269
+ size_t i) const {
270
+ return decode_bf16(((uint16_t*)code)[i]);
271
+ }
272
+ };
273
+
274
+ template <SIMDLevel SL>
275
+ struct QuantizerBF16 : QuantizerBF16<SIMDLevel::NONE> {
276
+ using QuantizerBF16<SIMDLevel::NONE>::QuantizerBF16;
277
+ };
278
+
279
+ /*******************************************************************
280
+ * 8bit_direct quantizer
281
+ *******************************************************************/
282
+
283
+ template <SIMDLevel SL>
284
+ struct Quantizer8bitDirect;
285
+
286
+ template <>
287
+ struct Quantizer8bitDirect<SIMDLevel::NONE> : ScalarQuantizer::SQuantizer {
288
+ const size_t d;
289
+
290
+ Quantizer8bitDirect(size_t d_in, const std::vector<float>& /* unused */)
291
+ : d(d_in) {}
292
+
293
+ void encode_vector(const float* x, uint8_t* code) const final {
294
+ for (size_t i = 0; i < d; i++) {
295
+ code[i] = (uint8_t)x[i];
296
+ }
297
+ }
298
+
299
+ void decode_vector(const uint8_t* code, float* x) const final {
300
+ for (size_t i = 0; i < d; i++) {
301
+ x[i] = code[i];
302
+ }
303
+ }
304
+
305
+ FAISS_ALWAYS_INLINE float reconstruct_component(
306
+ const uint8_t* code,
307
+ size_t i) const {
308
+ return code[i];
309
+ }
310
+ };
311
+
312
+ template <SIMDLevel SL>
313
+ struct Quantizer8bitDirect : Quantizer8bitDirect<SIMDLevel::NONE> {
314
+ using Quantizer8bitDirect<SIMDLevel::NONE>::Quantizer8bitDirect;
315
+ };
316
+
317
+ /*******************************************************************
318
+ * 8bit_direct_signed quantizer
319
+ *******************************************************************/
320
+
321
+ template <SIMDLevel SL>
322
+ struct Quantizer8bitDirectSigned;
323
+
324
+ template <>
325
+ struct Quantizer8bitDirectSigned<SIMDLevel::NONE>
326
+ : ScalarQuantizer::SQuantizer {
327
+ const size_t d;
328
+
329
+ Quantizer8bitDirectSigned(
330
+ size_t d_in,
331
+ const std::vector<float>& /* unused */)
332
+ : d(d_in) {}
333
+
334
+ void encode_vector(const float* x, uint8_t* code) const final {
335
+ for (size_t i = 0; i < d; i++) {
336
+ code[i] = (uint8_t)(x[i] + 128);
337
+ }
338
+ }
339
+
340
+ void decode_vector(const uint8_t* code, float* x) const final {
341
+ for (size_t i = 0; i < d; i++) {
342
+ x[i] = code[i] - 128;
343
+ }
344
+ }
345
+
346
+ FAISS_ALWAYS_INLINE float reconstruct_component(
347
+ const uint8_t* code,
348
+ size_t i) const {
349
+ return code[i] - 128;
350
+ }
351
+ };
352
+
353
+ template <SIMDLevel SL>
354
+ struct Quantizer8bitDirectSigned : Quantizer8bitDirectSigned<SIMDLevel::NONE> {
355
+ using Quantizer8bitDirectSigned<SIMDLevel::NONE>::Quantizer8bitDirectSigned;
356
+ };
357
+
358
+ /*******************************************************************
359
+ * Selection function
360
+ *******************************************************************/
361
+
362
+ // declare for all levels
363
+ template <SIMDLevel SL>
364
+ ScalarQuantizer::SQuantizer* sq_select_quantizer(
365
+ QuantizerType qtype,
366
+ size_t d,
367
+ const std::vector<float>& trained);
368
+
369
+ } // namespace scalar_quantizer
370
+
371
+ } // namespace faiss