faiss 0.6.0 → 0.6.2

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 (378) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/ext/faiss/extconf.rb +2 -1
  4. data/ext/faiss/{index_rb.cpp → index.cpp} +1 -1
  5. data/ext/faiss/index_binary.cpp +1 -1
  6. data/ext/faiss/kmeans.cpp +1 -1
  7. data/ext/faiss/pca_matrix.cpp +1 -1
  8. data/ext/faiss/product_quantizer.cpp +1 -1
  9. data/ext/faiss/{utils_rb.cpp → utils.cpp} +1 -1
  10. data/lib/faiss/version.rb +1 -1
  11. data/vendor/faiss/faiss/AutoTune.cpp +93 -80
  12. data/vendor/faiss/faiss/Clustering.cpp +39 -240
  13. data/vendor/faiss/faiss/Clustering.h +6 -0
  14. data/vendor/faiss/faiss/IVFlib.cpp +41 -21
  15. data/vendor/faiss/faiss/Index.cpp +6 -5
  16. data/vendor/faiss/faiss/Index.h +5 -5
  17. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  18. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +49 -37
  19. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  21. data/vendor/faiss/faiss/IndexBinary.cpp +5 -3
  22. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  23. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  24. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  25. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  26. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +88 -97
  27. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  28. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  29. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  30. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +89 -417
  31. data/vendor/faiss/faiss/IndexFastScan.cpp +72 -109
  32. data/vendor/faiss/faiss/IndexFastScan.h +25 -23
  33. data/vendor/faiss/faiss/IndexFlat.cpp +27 -20
  34. data/vendor/faiss/faiss/IndexFlat.h +21 -18
  35. data/vendor/faiss/faiss/IndexFlatCodes.cpp +42 -19
  36. data/vendor/faiss/faiss/IndexHNSW.cpp +374 -206
  37. data/vendor/faiss/faiss/IndexHNSW.h +16 -2
  38. data/vendor/faiss/faiss/IndexIDMap.cpp +25 -21
  39. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  40. data/vendor/faiss/faiss/IndexIVF.cpp +467 -364
  41. data/vendor/faiss/faiss/IndexIVF.h +33 -12
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +79 -76
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +96 -93
  44. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -1
  45. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +357 -238
  46. data/vendor/faiss/faiss/IndexIVFFastScan.h +42 -41
  47. data/vendor/faiss/faiss/IndexIVFFlat.cpp +39 -69
  48. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  49. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +56 -33
  50. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  51. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  52. data/vendor/faiss/faiss/IndexIVFPQ.cpp +73 -846
  53. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
  54. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  55. data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -20
  56. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +30 -52
  57. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +2 -1
  58. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +475 -476
  59. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +248 -93
  60. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  61. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  62. data/vendor/faiss/faiss/IndexLSH.cpp +36 -19
  63. data/vendor/faiss/faiss/IndexLattice.cpp +13 -13
  64. data/vendor/faiss/faiss/IndexNNDescent.cpp +36 -21
  65. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  66. data/vendor/faiss/faiss/IndexNSG.cpp +38 -23
  67. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +31 -11
  68. data/vendor/faiss/faiss/IndexPQ.cpp +128 -221
  69. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  70. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  71. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  72. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  73. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  74. data/vendor/faiss/faiss/IndexRaBitQ.cpp +11 -36
  75. data/vendor/faiss/faiss/IndexRaBitQ.h +2 -1
  76. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +41 -277
  77. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +183 -27
  78. data/vendor/faiss/faiss/IndexRefine.cpp +30 -25
  79. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  80. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  81. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  82. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  83. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +150 -20
  84. data/vendor/faiss/faiss/IndexScalarQuantizer.h +10 -0
  85. data/vendor/faiss/faiss/IndexShards.cpp +10 -9
  86. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  87. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  88. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  89. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  90. data/vendor/faiss/faiss/MetricType.h +14 -7
  91. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  92. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  93. data/vendor/faiss/faiss/VectorTransform.cpp +237 -149
  94. data/vendor/faiss/faiss/VectorTransform.h +16 -16
  95. data/vendor/faiss/faiss/build.cpp +23 -0
  96. data/vendor/faiss/faiss/build.h +15 -0
  97. data/vendor/faiss/faiss/clone_index.cpp +48 -47
  98. data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +1 -1
  99. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  100. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  101. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +902 -12
  102. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  103. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  104. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +702 -10
  105. data/vendor/faiss/faiss/factory_tools.cpp +9 -0
  106. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  107. data/vendor/faiss/faiss/gpu/GpuResources.h +3 -2
  108. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +15 -16
  109. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +5 -4
  110. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  111. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  112. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  113. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  114. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  115. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  116. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  117. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  118. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  119. data/vendor/faiss/faiss/gpu_metal/MetalDistance.h +87 -0
  120. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  121. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +58 -0
  122. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  123. data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h +181 -0
  124. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +111 -0
  125. data/vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h +45 -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/gpu_metal/impl/MetalIVFFlat.h +193 -0
  129. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  130. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  131. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +29 -25
  132. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  133. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  134. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -0
  135. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  136. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  137. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +16 -16
  138. data/vendor/faiss/faiss/impl/CodePacker.cpp +3 -3
  139. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +1 -1
  140. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  141. data/vendor/faiss/faiss/impl/FaissAssert.h +6 -3
  142. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  143. data/vendor/faiss/faiss/impl/HNSW.cpp +639 -507
  144. data/vendor/faiss/faiss/impl/HNSW.h +61 -44
  145. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  146. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  147. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  148. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +82 -77
  149. data/vendor/faiss/faiss/impl/NNDescent.cpp +62 -25
  150. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  151. data/vendor/faiss/faiss/impl/NSG.cpp +53 -32
  152. data/vendor/faiss/faiss/impl/NSG.h +4 -4
  153. data/vendor/faiss/faiss/impl/Panorama.cpp +23 -6
  154. data/vendor/faiss/faiss/impl/Panorama.h +269 -87
  155. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  156. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  157. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +46 -32
  158. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  159. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  160. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  161. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +55 -25
  162. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  163. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +55 -49
  164. data/vendor/faiss/faiss/impl/RaBitQUtils.h +65 -0
  165. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +302 -283
  166. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +26 -23
  167. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  168. data/vendor/faiss/faiss/impl/ResultHandler.h +100 -75
  169. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +318 -7
  170. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +77 -1
  171. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  172. data/vendor/faiss/faiss/impl/VisitedTable.cpp +10 -10
  173. data/vendor/faiss/faiss/impl/VisitedTable.h +70 -28
  174. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  175. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  176. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  177. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  178. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  179. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  180. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  181. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  182. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  183. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  184. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  185. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  186. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  187. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  188. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  189. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  190. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  191. data/vendor/faiss/faiss/impl/expanded_scanners.h +8 -3
  192. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  193. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  194. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  195. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  196. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  197. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +270 -0
  198. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +169 -2
  199. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  200. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  201. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  202. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  203. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  204. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  205. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -356
  206. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  207. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  208. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +282 -134
  209. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  210. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  211. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +83 -0
  212. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +113 -0
  213. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +150 -0
  214. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +142 -0
  215. data/vendor/faiss/faiss/impl/index_read.cpp +1227 -79
  216. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
  217. data/vendor/faiss/faiss/impl/index_write.cpp +96 -13
  218. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  219. data/vendor/faiss/faiss/impl/io_macros.h +58 -16
  220. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  221. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +37 -23
  222. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  223. data/vendor/faiss/faiss/impl/mapped_io.cpp +6 -6
  224. data/vendor/faiss/faiss/impl/platform_macros.h +15 -4
  225. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  226. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  227. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  228. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  229. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +23 -0
  230. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +23 -0
  231. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +23 -0
  232. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx2.cpp → pq_code_distance-avx2.h} +9 -13
  233. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx512.cpp → pq_code_distance-avx512.h} +9 -57
  234. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +45 -107
  235. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  236. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +274 -5
  237. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +10 -7
  238. data/vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h +105 -0
  239. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +70 -0
  240. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +311 -477
  241. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  242. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +1 -1
  243. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +9 -2
  244. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +419 -19
  245. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +27 -1
  246. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +3 -3
  247. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +387 -2
  248. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h +553 -0
  249. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp +559 -0
  250. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +341 -2
  251. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +425 -3
  252. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +290 -2
  253. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +337 -0
  254. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +192 -8
  255. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +12 -0
  256. data/vendor/faiss/faiss/impl/simd_dispatch.h +157 -66
  257. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  258. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +264 -172
  259. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  260. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  261. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  262. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +270 -218
  263. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  264. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  265. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  266. data/vendor/faiss/faiss/index_factory.cpp +90 -18
  267. data/vendor/faiss/faiss/index_io.h +40 -0
  268. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
  269. data/vendor/faiss/faiss/invlists/DirectMap.cpp +28 -15
  270. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  271. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +170 -86
  272. data/vendor/faiss/faiss/invlists/InvertedLists.h +88 -25
  273. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  274. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +13 -13
  275. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  276. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +1 -1
  277. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  278. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  279. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  280. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  281. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  282. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  283. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  284. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +142 -21
  285. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +33 -7
  286. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.cpp +3 -2
  287. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +2 -1
  288. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +77 -27
  289. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +10 -4
  290. data/vendor/faiss/faiss/utils/Heap.cpp +10 -10
  291. data/vendor/faiss/faiss/utils/NeuralNet.cpp +47 -36
  292. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  293. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  294. data/vendor/faiss/faiss/utils/bf16.h +34 -0
  295. data/vendor/faiss/faiss/utils/distances.cpp +390 -560
  296. data/vendor/faiss/faiss/utils/distances.h +20 -1
  297. data/vendor/faiss/faiss/utils/distances_dispatch.h +117 -37
  298. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  299. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  300. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  301. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  302. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  303. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  304. data/vendor/faiss/faiss/utils/distances_simd.cpp +5 -178
  305. data/vendor/faiss/faiss/utils/extra_distances.cpp +9 -8
  306. data/vendor/faiss/faiss/utils/extra_distances.h +32 -6
  307. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  308. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  309. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  310. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  311. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +16 -0
  312. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  313. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_spr.cpp +15 -0
  314. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  315. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +210 -0
  316. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_spr.h +171 -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 -989
  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 +2 -2
  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 +57 -536
  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 +5 -1
  335. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +213 -4
  336. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +163 -10
  337. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +250 -4
  338. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +7 -4
  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 +2 -1
  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 +1031 -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_avx512_spr.cpp +343 -0
  350. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  351. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  352. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  353. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  354. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  355. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  356. data/vendor/faiss/faiss/utils/simd_levels.cpp +29 -7
  357. data/vendor/faiss/faiss/utils/simd_levels.h +93 -1
  358. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  359. data/vendor/faiss/faiss/utils/utils.cpp +5 -5
  360. data/vendor/faiss/faiss/utils/utils.h +3 -3
  361. metadata +129 -34
  362. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  363. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  364. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -224
  365. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -230
  366. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  367. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  368. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  369. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  370. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -235
  371. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  372. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  373. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -449
  374. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  375. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  376. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  377. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -365
  378. /data/ext/faiss/{utils_rb.h → utils.h} +0 -0
@@ -7,6 +7,10 @@
7
7
 
8
8
  #ifdef COMPILE_SIMD_AVX512
9
9
 
10
+ #include <faiss/impl/simdlib/simdlib_avx512.h>
11
+
12
+ #include <cstring>
13
+
10
14
  #include <faiss/impl/scalar_quantizer/codecs.h>
11
15
  #include <faiss/impl/scalar_quantizer/distance_computers.h>
12
16
  #include <faiss/impl/scalar_quantizer/quantizers.h>
@@ -17,6 +21,83 @@ namespace faiss {
17
21
 
18
22
  namespace scalar_quantizer {
19
23
 
24
+ using simd16float32 = faiss::simd16float32_tpl<SIMDLevel::AVX512>;
25
+
26
+ namespace {
27
+
28
+ FAISS_ALWAYS_INLINE uint16_t load_u16(const uint8_t* ptr) {
29
+ uint16_t value;
30
+ std::memcpy(&value, ptr, sizeof(value));
31
+ return value;
32
+ }
33
+
34
+ FAISS_ALWAYS_INLINE uint32_t load_u32(const uint8_t* ptr) {
35
+ uint32_t value;
36
+ std::memcpy(&value, ptr, sizeof(value));
37
+ return value;
38
+ }
39
+
40
+ FAISS_ALWAYS_INLINE uint64_t load_u64(const uint8_t* ptr) {
41
+ uint64_t value;
42
+ std::memcpy(&value, ptr, sizeof(value));
43
+ return value;
44
+ }
45
+
46
+ FAISS_ALWAYS_INLINE uint32_t load_u24(const uint8_t* ptr) {
47
+ return static_cast<uint32_t>(ptr[0]) |
48
+ (static_cast<uint32_t>(ptr[1]) << 8) |
49
+ (static_cast<uint32_t>(ptr[2]) << 16);
50
+ }
51
+
52
+ FAISS_ALWAYS_INLINE __m256i unpack_8x3bit_to_u32(uint32_t packed) {
53
+ const __m256i shifts = _mm256_setr_epi32(0, 3, 6, 9, 12, 15, 18, 21);
54
+ const __m256i indices =
55
+ _mm256_srlv_epi32(_mm256_set1_epi32(packed), shifts);
56
+ return _mm256_and_si256(indices, _mm256_set1_epi32(0x7));
57
+ }
58
+
59
+ FAISS_ALWAYS_INLINE __m512i unpack_16x1bit_to_u32(const uint8_t* code, int i) {
60
+ const uint32_t packed = load_u16(code + (static_cast<size_t>(i) >> 3));
61
+ const __m512i shifts = _mm512_setr_epi32(
62
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
63
+ const __m512i indices =
64
+ _mm512_srlv_epi32(_mm512_set1_epi32(packed), shifts);
65
+ return _mm512_and_si512(indices, _mm512_set1_epi32(0x1));
66
+ }
67
+
68
+ FAISS_ALWAYS_INLINE __m512i unpack_16x2bit_to_u32(const uint8_t* code, int i) {
69
+ const uint32_t packed = load_u32(code + (static_cast<size_t>(i) >> 2));
70
+ const __m512i shifts = _mm512_setr_epi32(
71
+ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30);
72
+ const __m512i indices =
73
+ _mm512_srlv_epi32(_mm512_set1_epi32(packed), shifts);
74
+ return _mm512_and_si512(indices, _mm512_set1_epi32(0x3));
75
+ }
76
+
77
+ FAISS_ALWAYS_INLINE __m512i unpack_16x3bit_to_u32(const uint8_t* code, int i) {
78
+ const size_t byte_offset = (static_cast<size_t>(i) >> 4) * 6;
79
+ const __m256i low = unpack_8x3bit_to_u32(load_u24(code + byte_offset));
80
+ const __m256i high = unpack_8x3bit_to_u32(load_u24(code + byte_offset + 3));
81
+ __m512i indices = _mm512_castsi256_si512(low);
82
+ return _mm512_inserti32x8(indices, high, 1);
83
+ }
84
+
85
+ FAISS_ALWAYS_INLINE __m512i unpack_16x4bit_to_u32(const uint8_t* code, int i) {
86
+ const uint64_t packed = load_u64(code + (static_cast<size_t>(i) >> 1));
87
+ const __m256i shifts = _mm256_setr_epi32(0, 4, 8, 12, 16, 20, 24, 28);
88
+ const __m256i low = _mm256_and_si256(
89
+ _mm256_srlv_epi32(_mm256_set1_epi32((uint32_t)packed), shifts),
90
+ _mm256_set1_epi32(0xf));
91
+ const __m256i high = _mm256_and_si256(
92
+ _mm256_srlv_epi32(
93
+ _mm256_set1_epi32((uint32_t)(packed >> 32)), shifts),
94
+ _mm256_set1_epi32(0xf));
95
+ __m512i indices = _mm512_castsi256_si512(low);
96
+ return _mm512_inserti32x8(indices, high, 1);
97
+ }
98
+
99
+ } // namespace
100
+
20
101
  /**********************************************************
21
102
  * Codecs
22
103
  **********************************************************/
@@ -133,6 +214,12 @@ struct QuantizerTemplate<
133
214
  return simd16float32(_mm512_fmadd_ps(
134
215
  xi, _mm512_set1_ps(this->vdiff), _mm512_set1_ps(this->vmin)));
135
216
  }
217
+
218
+ /// Raw codec decode without denormalization
219
+ FAISS_ALWAYS_INLINE simd16float32
220
+ decode_16_raw(const uint8_t* code, int i) const {
221
+ return Codec::decode_16_components(code, i);
222
+ }
136
223
  };
137
224
 
138
225
  template <class Codec>
@@ -162,6 +249,110 @@ struct QuantizerTemplate<
162
249
  }
163
250
  };
164
251
 
252
+ /**********************************************************
253
+ * TurboQuant MSE quantizer
254
+ **********************************************************/
255
+
256
+ // 1-bit MSE AVX512: 16 comparisons → 2 bytes via mask compare.
257
+ template <>
258
+ struct QuantizerTurboQuantMSE<1, SIMDLevel::AVX512>
259
+ : QuantizerTurboQuantMSE<1, SIMDLevel::NONE> {
260
+ using Base = QuantizerTurboQuantMSE<1, SIMDLevel::NONE>;
261
+
262
+ QuantizerTurboQuantMSE(size_t d, const std::vector<float>& trained)
263
+ : Base(d, trained) {
264
+ assert(d % 16 == 0);
265
+ }
266
+
267
+ FAISS_ALWAYS_INLINE simd16float32
268
+ reconstruct_16_components(const uint8_t* code, int i) const {
269
+ return simd16float32(_mm512_i32gather_ps(
270
+ unpack_16x1bit_to_u32(code, i),
271
+ this->centroids,
272
+ sizeof(float)));
273
+ }
274
+
275
+ void encode_vector(const float* x, uint8_t* code) const final {
276
+ __m512 boundary = _mm512_set1_ps(this->boundaries[0]);
277
+ for (size_t i = 0; i < this->d; i += 16) {
278
+ __m512 vals = _mm512_loadu_ps(x + i);
279
+ __mmask16 mask = _mm512_cmp_ps_mask(vals, boundary, _CMP_GT_OQ);
280
+ uint16_t bits = _cvtmask16_u32(mask);
281
+ memcpy(code + i / 8, &bits, sizeof(uint16_t));
282
+ }
283
+ }
284
+
285
+ void decode_vector(const uint8_t* code, float* x) const final {
286
+ for (size_t i = 0; i < this->d; i += 16) {
287
+ simd16float32 xi =
288
+ reconstruct_16_components(code, static_cast<int>(i));
289
+ _mm512_storeu_ps(x + i, xi.f);
290
+ }
291
+ }
292
+ };
293
+
294
+ // 2-4 bit MSE AVX512: decode via gather, encode stays scalar.
295
+ #define DEFINE_TQMSE_AVX512_MULTIBIT(NBITS, UNPACK_EXPR) \
296
+ template <> \
297
+ struct QuantizerTurboQuantMSE<NBITS, SIMDLevel::AVX512> \
298
+ : QuantizerTurboQuantMSE<NBITS, SIMDLevel::NONE> { \
299
+ using Base = QuantizerTurboQuantMSE<NBITS, SIMDLevel::NONE>; \
300
+ \
301
+ QuantizerTurboQuantMSE(size_t d, const std::vector<float>& trained) \
302
+ : Base(d, trained) { \
303
+ assert(d % 16 == 0); \
304
+ } \
305
+ \
306
+ FAISS_ALWAYS_INLINE simd16float32 \
307
+ reconstruct_16_components(const uint8_t* code, int i) const { \
308
+ return simd16float32(_mm512_i32gather_ps( \
309
+ (UNPACK_EXPR), this->centroids, sizeof(float))); \
310
+ } \
311
+ \
312
+ void decode_vector(const uint8_t* code, float* x) const final { \
313
+ for (size_t i = 0; i < this->d; i += 16) { \
314
+ simd16float32 xi = \
315
+ reconstruct_16_components(code, static_cast<int>(i)); \
316
+ _mm512_storeu_ps(x + i, xi.f); \
317
+ } \
318
+ } \
319
+ }
320
+
321
+ DEFINE_TQMSE_AVX512_MULTIBIT(2, unpack_16x2bit_to_u32(code, i));
322
+ DEFINE_TQMSE_AVX512_MULTIBIT(3, unpack_16x3bit_to_u32(code, i));
323
+ DEFINE_TQMSE_AVX512_MULTIBIT(4, unpack_16x4bit_to_u32(code, i));
324
+
325
+ #undef DEFINE_TQMSE_AVX512_MULTIBIT
326
+
327
+ // 8-bit MSE AVX512
328
+ template <>
329
+ struct QuantizerTurboQuantMSE<8, SIMDLevel::AVX512>
330
+ : QuantizerTurboQuantMSE<8, SIMDLevel::NONE> {
331
+ using Base = QuantizerTurboQuantMSE<8, SIMDLevel::NONE>;
332
+
333
+ QuantizerTurboQuantMSE(size_t d, const std::vector<float>& trained)
334
+ : Base(d, trained) {
335
+ assert(d % 16 == 0);
336
+ }
337
+
338
+ FAISS_ALWAYS_INLINE simd16float32
339
+ reconstruct_16_components(const uint8_t* code, int i) const {
340
+ const __m128i packed = _mm_loadu_si128(
341
+ (const __m128i*)(code + static_cast<size_t>(i)));
342
+ const __m512i indices = _mm512_cvtepu8_epi32(packed);
343
+ return simd16float32(
344
+ _mm512_i32gather_ps(indices, this->centroids, sizeof(float)));
345
+ }
346
+
347
+ void decode_vector(const uint8_t* code, float* x) const final {
348
+ for (size_t i = 0; i < this->d; i += 16) {
349
+ simd16float32 xi =
350
+ reconstruct_16_components(code, static_cast<int>(i));
351
+ _mm512_storeu_ps(x + i, xi.f);
352
+ }
353
+ }
354
+ };
355
+
165
356
  /**********************************************************
166
357
  * FP16 Quantizer
167
358
  **********************************************************/
@@ -280,6 +471,22 @@ struct SimilarityL2<SIMDLevel::AVX512> {
280
471
  FAISS_ALWAYS_INLINE float result_16() {
281
472
  return horizontal_add(accu16);
282
473
  }
474
+
475
+ static void adjust_query_for_raw_decode(
476
+ const float* x,
477
+ float* q_adj,
478
+ size_t d,
479
+ float vmin,
480
+ float vdiff,
481
+ float& scale_factor,
482
+ float& bias) {
483
+ float inv_vdiff = (vdiff != 0) ? 1.0f / vdiff : 0.0f;
484
+ for (size_t i = 0; i < d; i++) {
485
+ q_adj[i] = (x[i] - vmin) * inv_vdiff;
486
+ }
487
+ scale_factor = vdiff * vdiff;
488
+ bias = 0;
489
+ }
283
490
  };
284
491
 
285
492
  template <>
@@ -314,6 +521,23 @@ struct SimilarityIP<SIMDLevel::AVX512> {
314
521
  FAISS_ALWAYS_INLINE float result_16() {
315
522
  return horizontal_add(accu16);
316
523
  }
524
+
525
+ static void adjust_query_for_raw_decode(
526
+ const float* x,
527
+ float* q_adj,
528
+ size_t d,
529
+ float vmin,
530
+ float vdiff,
531
+ float& scale_factor,
532
+ float& bias) {
533
+ float sum_q = 0;
534
+ for (size_t i = 0; i < d; i++) {
535
+ q_adj[i] = x[i];
536
+ sum_q += x[i];
537
+ }
538
+ scale_factor = vdiff;
539
+ bias = vmin * sum_q;
540
+ }
317
541
  };
318
542
 
319
543
  /**********************************************************
@@ -327,8 +551,23 @@ struct DCTemplate<Quantizer, Similarity, SIMDLevel::AVX512>
327
551
 
328
552
  Quantizer quant;
329
553
 
554
+ // Pre-adjusted query buffer for uniform quantizers
555
+ std::vector<float> q_adj;
556
+ float scale_factor = 0;
557
+ float bias = 0;
558
+
559
+ static constexpr bool has_decode_raw() {
560
+ return requires(const Quantizer& q, const uint8_t* c, int i) {
561
+ { q.decode_16_raw(c, i) };
562
+ };
563
+ }
564
+
330
565
  DCTemplate(size_t d, const std::vector<float>& trained)
331
- : quant(d, trained) {}
566
+ : quant(d, trained) {
567
+ if constexpr (has_decode_raw()) {
568
+ q_adj.resize(d);
569
+ }
570
+ }
332
571
 
333
572
  float compute_distance(const float* x, const uint8_t* code) const {
334
573
  Similarity sim(x);
@@ -354,6 +593,26 @@ struct DCTemplate<Quantizer, Similarity, SIMDLevel::AVX512>
354
593
 
355
594
  void set_query(const float* x) final {
356
595
  q = x;
596
+ if constexpr (has_decode_raw()) {
597
+ Sim::adjust_query_for_raw_decode(
598
+ x,
599
+ q_adj.data(),
600
+ quant.d,
601
+ quant.vmin,
602
+ quant.vdiff,
603
+ scale_factor,
604
+ bias);
605
+ }
606
+ }
607
+
608
+ float query_to_code_predecoded(const uint8_t* code) const {
609
+ Similarity sim(q_adj.data());
610
+ sim.begin_16();
611
+ for (size_t i = 0; i < quant.d; i += 16) {
612
+ simd16float32 xi = quant.decode_16_raw(code, i);
613
+ sim.add_16_components(xi);
614
+ }
615
+ return bias + scale_factor * sim.result_16();
357
616
  }
358
617
 
359
618
  float symmetric_dis(idx_t i, idx_t j) override {
@@ -362,7 +621,47 @@ struct DCTemplate<Quantizer, Similarity, SIMDLevel::AVX512>
362
621
  }
363
622
 
364
623
  float query_to_code(const uint8_t* code) const final {
365
- return compute_distance(q, code);
624
+ if constexpr (has_decode_raw()) {
625
+ return query_to_code_predecoded(code);
626
+ } else {
627
+ return compute_distance(q, code);
628
+ }
629
+ }
630
+
631
+ void query_to_codes_batch_4(
632
+ const uint8_t* code_0,
633
+ const uint8_t* code_1,
634
+ const uint8_t* code_2,
635
+ const uint8_t* code_3,
636
+ float& dis0,
637
+ float& dis1,
638
+ float& dis2,
639
+ float& dis3) const final {
640
+ Similarity sim0(q);
641
+ Similarity sim1(q);
642
+ Similarity sim2(q);
643
+ Similarity sim3(q);
644
+
645
+ sim0.begin_16();
646
+ sim1.begin_16();
647
+ sim2.begin_16();
648
+ sim3.begin_16();
649
+
650
+ for (size_t i = 0; i < quant.d; i += 16) {
651
+ simd16float32 xi0 = quant.reconstruct_16_components(code_0, i);
652
+ simd16float32 xi1 = quant.reconstruct_16_components(code_1, i);
653
+ simd16float32 xi2 = quant.reconstruct_16_components(code_2, i);
654
+ simd16float32 xi3 = quant.reconstruct_16_components(code_3, i);
655
+ sim0.add_16_components(xi0);
656
+ sim1.add_16_components(xi1);
657
+ sim2.add_16_components(xi2);
658
+ sim3.add_16_components(xi3);
659
+ }
660
+
661
+ dis0 = sim0.result_16();
662
+ dis1 = sim1.result_16();
663
+ dis2 = sim2.result_16();
664
+ dis3 = sim3.result_16();
366
665
  }
367
666
  };
368
667
 
@@ -421,10 +720,50 @@ struct DistanceComputerByte<Similarity, SIMDLevel::AVX512>
421
720
  }
422
721
  };
423
722
 
723
+ /**********************************************************
724
+ * TurboQuant masked_sum AVX512 specialization
725
+ **********************************************************/
726
+
727
+ template <SIMDLevel SL0>
728
+ float turboq_masked_sum(const float* arr, const uint8_t* bits, size_t d);
729
+
730
+ template <>
731
+ float turboq_masked_sum<SIMDLevel::AVX512>(
732
+ const float* arr,
733
+ const uint8_t* bits,
734
+ size_t d) {
735
+ __m512 acc = _mm512_setzero_ps();
736
+ size_t i = 0;
737
+ size_t full_16 = (d / 16) * 16;
738
+ for (; i < full_16; i += 16) {
739
+ uint16_t mask16;
740
+ memcpy(&mask16, bits + i / 8, sizeof(mask16));
741
+ __mmask16 k = _cvtu32_mask16(mask16);
742
+ __m512 vals = _mm512_loadu_ps(arr + i);
743
+ acc = _mm512_mask_add_ps(acc, k, acc, vals);
744
+ }
745
+ float result = _mm512_reduce_add_ps(acc);
746
+ if (i < d) {
747
+ size_t remaining = d - i;
748
+ __mmask16 tail_mask = _cvtu32_mask16((1u << remaining) - 1);
749
+ __m512 tail_vals = _mm512_maskz_loadu_ps(tail_mask, arr + i);
750
+ uint16_t bits_tail = 0;
751
+ size_t bytes_remaining = (remaining + 7) / 8;
752
+ memcpy(&bits_tail, bits + i / 8, bytes_remaining);
753
+ __mmask16 bits_k = _cvtu32_mask16(bits_tail);
754
+ __mmask16 combined = _kand_mask16(tail_mask, bits_k);
755
+ __m512 masked_tail = _mm512_maskz_mov_ps(combined, tail_vals);
756
+ result += _mm512_reduce_add_ps(masked_tail);
757
+ }
758
+ return result;
759
+ }
760
+
424
761
  } // namespace scalar_quantizer
425
762
  } // namespace faiss
426
763
 
764
+ #ifndef SQ_AVX512_SKIP_DISPATCH
427
765
  #define THE_LEVEL_TO_DISPATCH SIMDLevel::AVX512
428
766
  #include <faiss/impl/scalar_quantizer/sq-dispatch.h>
767
+ #endif
429
768
 
430
769
  #endif // COMPILE_SIMD_AVX512