faiss 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/ext/faiss/extconf.rb +2 -1
  4. data/ext/faiss/{index_rb.cpp → index.cpp} +1 -1
  5. data/ext/faiss/index_binary.cpp +1 -1
  6. data/ext/faiss/kmeans.cpp +1 -1
  7. data/ext/faiss/pca_matrix.cpp +1 -1
  8. data/ext/faiss/product_quantizer.cpp +1 -1
  9. data/ext/faiss/{utils_rb.cpp → utils.cpp} +1 -1
  10. data/lib/faiss/version.rb +1 -1
  11. data/vendor/faiss/faiss/AutoTune.cpp +93 -80
  12. data/vendor/faiss/faiss/Clustering.cpp +39 -240
  13. data/vendor/faiss/faiss/Clustering.h +6 -0
  14. data/vendor/faiss/faiss/IVFlib.cpp +41 -21
  15. data/vendor/faiss/faiss/Index.cpp +6 -5
  16. data/vendor/faiss/faiss/Index.h +5 -5
  17. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  18. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +49 -37
  19. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  21. data/vendor/faiss/faiss/IndexBinary.cpp +5 -3
  22. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  23. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  24. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  25. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  26. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +84 -92
  27. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  28. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  29. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  30. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +87 -415
  31. data/vendor/faiss/faiss/IndexFastScan.cpp +72 -109
  32. data/vendor/faiss/faiss/IndexFastScan.h +25 -23
  33. data/vendor/faiss/faiss/IndexFlat.cpp +27 -20
  34. data/vendor/faiss/faiss/IndexFlat.h +21 -18
  35. data/vendor/faiss/faiss/IndexFlatCodes.cpp +42 -19
  36. data/vendor/faiss/faiss/IndexHNSW.cpp +283 -145
  37. data/vendor/faiss/faiss/IndexHNSW.h +16 -2
  38. data/vendor/faiss/faiss/IndexIDMap.cpp +25 -21
  39. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  40. data/vendor/faiss/faiss/IndexIVF.cpp +465 -362
  41. data/vendor/faiss/faiss/IndexIVF.h +33 -12
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +96 -93
  44. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -1
  45. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +357 -238
  46. data/vendor/faiss/faiss/IndexIVFFastScan.h +42 -41
  47. data/vendor/faiss/faiss/IndexIVFFlat.cpp +36 -68
  48. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  49. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +53 -30
  50. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  51. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  52. data/vendor/faiss/faiss/IndexIVFPQ.cpp +71 -843
  53. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
  54. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  55. data/vendor/faiss/faiss/IndexIVFPQR.cpp +21 -17
  56. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +26 -39
  57. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +2 -1
  58. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +475 -476
  59. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +248 -93
  60. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  61. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  62. data/vendor/faiss/faiss/IndexLSH.cpp +36 -19
  63. data/vendor/faiss/faiss/IndexLattice.cpp +13 -13
  64. data/vendor/faiss/faiss/IndexNNDescent.cpp +36 -21
  65. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  66. data/vendor/faiss/faiss/IndexNSG.cpp +39 -23
  67. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +31 -11
  68. data/vendor/faiss/faiss/IndexPQ.cpp +128 -221
  69. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  70. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  71. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  72. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  73. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  74. data/vendor/faiss/faiss/IndexRaBitQ.cpp +11 -36
  75. data/vendor/faiss/faiss/IndexRaBitQ.h +2 -1
  76. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +41 -277
  77. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +183 -27
  78. data/vendor/faiss/faiss/IndexRefine.cpp +30 -25
  79. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  80. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  81. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  82. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  83. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
  84. data/vendor/faiss/faiss/IndexShards.cpp +10 -9
  85. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  86. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  87. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  88. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  89. data/vendor/faiss/faiss/MetricType.h +14 -7
  90. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  91. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  92. data/vendor/faiss/faiss/VectorTransform.cpp +237 -149
  93. data/vendor/faiss/faiss/VectorTransform.h +16 -16
  94. data/vendor/faiss/faiss/build.cpp +23 -0
  95. data/vendor/faiss/faiss/build.h +15 -0
  96. data/vendor/faiss/faiss/clone_index.cpp +48 -47
  97. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  98. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  99. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  100. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  101. data/vendor/faiss/faiss/factory_tools.cpp +5 -0
  102. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  103. data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
  104. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
  106. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  107. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  108. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  109. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  110. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  111. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  112. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  113. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  114. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  115. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  116. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
  117. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  118. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
  119. data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
  120. data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
  121. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  122. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  123. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +29 -25
  124. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  125. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  126. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -0
  127. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  128. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  129. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +16 -16
  130. data/vendor/faiss/faiss/impl/CodePacker.cpp +3 -3
  131. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +1 -1
  132. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  133. data/vendor/faiss/faiss/impl/FaissAssert.h +6 -3
  134. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  135. data/vendor/faiss/faiss/impl/HNSW.cpp +92 -317
  136. data/vendor/faiss/faiss/impl/HNSW.h +13 -34
  137. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  138. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  139. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  140. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +82 -77
  141. data/vendor/faiss/faiss/impl/NNDescent.cpp +62 -25
  142. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  143. data/vendor/faiss/faiss/impl/NSG.cpp +38 -21
  144. data/vendor/faiss/faiss/impl/NSG.h +4 -4
  145. data/vendor/faiss/faiss/impl/Panorama.cpp +23 -6
  146. data/vendor/faiss/faiss/impl/Panorama.h +258 -87
  147. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  148. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  149. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +46 -32
  150. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  151. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  152. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  153. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +30 -23
  154. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  155. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +55 -49
  156. data/vendor/faiss/faiss/impl/RaBitQUtils.h +65 -0
  157. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +296 -283
  158. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +26 -23
  159. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  160. data/vendor/faiss/faiss/impl/ResultHandler.h +99 -75
  161. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +52 -4
  162. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -1
  163. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  164. data/vendor/faiss/faiss/impl/VisitedTable.h +7 -0
  165. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  166. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  167. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  168. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  169. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  170. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  171. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  172. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  173. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  174. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  175. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  176. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  177. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  178. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  179. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  180. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  181. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  182. data/vendor/faiss/faiss/impl/expanded_scanners.h +8 -3
  183. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  184. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  185. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  186. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  187. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  188. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
  189. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +169 -2
  190. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  191. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  192. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  193. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  194. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  195. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  196. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -356
  197. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  198. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  199. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +282 -134
  200. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  201. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  202. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
  203. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
  204. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
  205. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
  206. data/vendor/faiss/faiss/impl/index_read.cpp +1132 -45
  207. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
  208. data/vendor/faiss/faiss/impl/index_write.cpp +95 -13
  209. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  210. data/vendor/faiss/faiss/impl/io_macros.h +33 -16
  211. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  212. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +37 -23
  213. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  214. data/vendor/faiss/faiss/impl/mapped_io.cpp +6 -6
  215. data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
  216. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  217. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  218. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  219. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  220. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
  221. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
  222. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
  223. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx2.cpp → pq_code_distance-avx2.h} +9 -13
  224. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx512.cpp → pq_code_distance-avx512.h} +9 -57
  225. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +29 -111
  226. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  227. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +238 -5
  228. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -7
  229. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
  230. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +311 -477
  231. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  232. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +1 -1
  233. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +3 -2
  234. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +102 -11
  235. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +27 -1
  236. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +3 -3
  237. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +148 -0
  238. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +167 -0
  239. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +59 -0
  240. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +163 -0
  241. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
  242. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +192 -8
  243. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +12 -0
  244. data/vendor/faiss/faiss/impl/simd_dispatch.h +100 -66
  245. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  246. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +264 -172
  247. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  248. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  249. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  250. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +270 -218
  251. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  252. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  253. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  254. data/vendor/faiss/faiss/index_factory.cpp +86 -18
  255. data/vendor/faiss/faiss/index_io.h +24 -0
  256. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
  257. data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
  258. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  259. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
  260. data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
  261. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  262. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +13 -13
  263. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  264. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +1 -1
  265. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  266. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  267. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  268. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  269. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  270. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  271. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  272. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
  273. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +18 -2
  274. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
  275. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +12 -3
  276. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +7 -2
  277. data/vendor/faiss/faiss/utils/Heap.cpp +10 -10
  278. data/vendor/faiss/faiss/utils/NeuralNet.cpp +47 -36
  279. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  280. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  281. data/vendor/faiss/faiss/utils/distances.cpp +390 -560
  282. data/vendor/faiss/faiss/utils/distances.h +20 -1
  283. data/vendor/faiss/faiss/utils/distances_dispatch.h +117 -37
  284. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  285. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  286. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  287. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  288. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  289. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  290. data/vendor/faiss/faiss/utils/distances_simd.cpp +5 -177
  291. data/vendor/faiss/faiss/utils/extra_distances.cpp +9 -8
  292. data/vendor/faiss/faiss/utils/extra_distances.h +32 -6
  293. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  294. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  295. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  296. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  297. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
  298. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  299. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  300. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
  301. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
  302. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
  303. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
  304. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
  305. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
  306. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
  307. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
  308. data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
  309. data/vendor/faiss/faiss/utils/partitioning.h +31 -0
  310. data/vendor/faiss/faiss/utils/popcount.h +29 -0
  311. data/vendor/faiss/faiss/utils/pq_code_distance.h +2 -2
  312. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  313. data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
  314. data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
  315. data/vendor/faiss/faiss/utils/rabitq_simd.h +57 -536
  316. data/vendor/faiss/faiss/utils/random.cpp +6 -6
  317. data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
  318. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +5 -1
  319. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +213 -4
  320. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +163 -10
  321. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +250 -4
  322. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +7 -4
  323. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
  324. data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
  325. data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +2 -1
  326. data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
  327. data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
  328. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
  329. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
  330. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
  331. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
  332. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
  333. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  334. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  335. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  336. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  337. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  338. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  339. data/vendor/faiss/faiss/utils/simd_levels.cpp +17 -5
  340. data/vendor/faiss/faiss/utils/simd_levels.h +93 -1
  341. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  342. data/vendor/faiss/faiss/utils/utils.cpp +5 -5
  343. data/vendor/faiss/faiss/utils/utils.h +3 -3
  344. metadata +119 -34
  345. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  346. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  347. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -224
  348. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -230
  349. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  350. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  351. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  352. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  353. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -235
  354. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  355. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  356. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -449
  357. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  358. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  359. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  360. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -365
  361. /data/ext/faiss/{utils_rb.h → utils.h} +0 -0
@@ -11,6 +11,8 @@
11
11
  #include <stdio.h>
12
12
 
13
13
  #include <faiss/impl/platform_macros.h>
14
+ #include <faiss/utils/ordered_key_value.h>
15
+ #include <faiss/utils/simd_levels.h>
14
16
 
15
17
  namespace faiss {
16
18
 
@@ -58,6 +60,35 @@ void simd_histogram_16(
58
60
  int shift,
59
61
  int* hist);
60
62
 
63
+ /** SIMD-dispatched partition for aligned uint16_t arrays.
64
+ * Specializations live in per-ISA TUs (partitioning_avx2.cpp, etc.). */
65
+ template <SIMDLevel SL, class C>
66
+ typename C::T partition_fuzzy_simd(
67
+ uint16_t* vals,
68
+ typename C::TI* ids,
69
+ size_t n,
70
+ size_t q_min,
71
+ size_t q_max,
72
+ size_t* q_out);
73
+
74
+ /** SIMD-dispatched histogram functions.
75
+ * Specializations live in per-ISA TUs. */
76
+ template <SIMDLevel SL>
77
+ void simd_histogram_8(
78
+ const uint16_t* data,
79
+ int n,
80
+ uint16_t min,
81
+ int shift,
82
+ int* hist);
83
+
84
+ template <SIMDLevel SL>
85
+ void simd_histogram_16(
86
+ const uint16_t* data,
87
+ int n,
88
+ uint16_t min,
89
+ int shift,
90
+ int* hist);
91
+
61
92
  struct PartitionStats {
62
93
  uint64_t bisect_cycles;
63
94
  uint64_t compress_cycles;
@@ -0,0 +1,29 @@
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 <cstdint>
11
+
12
+ // popcount = count number of 1s in the binary representation of a number
13
+
14
+ #ifdef _MSC_VER
15
+ #include <intrin.h>
16
+ inline int popcount32(uint32_t x) {
17
+ return __popcnt(x);
18
+ }
19
+ inline int popcount64(uint64_t x) {
20
+ return static_cast<int>(__popcnt64(x));
21
+ }
22
+ #else
23
+ inline int popcount32(uint32_t x) {
24
+ return __builtin_popcount(x);
25
+ }
26
+ inline int popcount64(uint64_t x) {
27
+ return __builtin_popcountll(x);
28
+ }
29
+ #endif
@@ -29,7 +29,7 @@ namespace pq_code_distance {
29
29
  *
30
30
  * PQCodeDistance<PQDecoderT, SL> computes PQ code distances at a given
31
31
  * SIMD level. The dispatch site (IndexIVFPQ.cpp, IndexPQ.cpp) uses
32
- * DISPATCH_SIMDLevel to select SL at runtime, which instantiates
32
+ * with_simd_level to select SL at runtime, which instantiates
33
33
  * PQCodeDistance for ALL decoder types (PQDecoder8, PQDecoder16,
34
34
  * PQDecoderGeneric) at the chosen level.
35
35
  *
@@ -211,7 +211,7 @@ struct PQCodeDistance {
211
211
  * Non-templated PQ code distance dispatch (PQDecoder8 only).
212
212
  *
213
213
  * These follow the same pattern as distances.h: the caller does not
214
- * name a SIMDLevel. Internally they dispatch via DISPATCH_SIMDLevel
214
+ * name a SIMDLevel. Internally they dispatch via with_simd_level
215
215
  * to the best available SIMD implementation (DD: runtime detection,
216
216
  * static: compile-time selection). Definitions are in
217
217
  * pq_code_distance-generic.cpp.
@@ -9,9 +9,9 @@
9
9
 
10
10
  // prefetches
11
11
 
12
- #ifdef __AVX__
12
+ #if defined(__x86_64__) || defined(_M_X64)
13
13
 
14
- // AVX
14
+ // x86_64
15
15
 
16
16
  #include <xmmintrin.h>
17
17
 
@@ -27,7 +27,7 @@ namespace {
27
27
  // there can be NaNs in tables, they should be ignored
28
28
  float tab_min(const float* tab, size_t n) {
29
29
  float min = HUGE_VAL;
30
- for (int i = 0; i < n; i++) {
30
+ for (size_t i = 0; i < n; i++) {
31
31
  if (tab[i] < min) {
32
32
  min = tab[i];
33
33
  }
@@ -37,7 +37,7 @@ float tab_min(const float* tab, size_t n) {
37
37
 
38
38
  float tab_max(const float* tab, size_t n) {
39
39
  float max = -HUGE_VAL;
40
- for (int i = 0; i < n; i++) {
40
+ for (size_t i = 0; i < n; i++) {
41
41
  if (tab[i] > max) {
42
42
  max = tab[i];
43
43
  }
@@ -46,14 +46,14 @@ float tab_max(const float* tab, size_t n) {
46
46
  }
47
47
 
48
48
  void round_tab(float* tab, size_t n, float a, float bi) {
49
- for (int i = 0; i < n; i++) {
49
+ for (size_t i = 0; i < n; i++) {
50
50
  tab[i] = floorf((tab[i] - bi) * a + 0.5);
51
51
  }
52
52
  }
53
53
 
54
54
  template <typename T>
55
55
  void round_tab(const float* tab, size_t n, float a, float bi, T* tab_out) {
56
- for (int i = 0; i < n; i++) {
56
+ for (size_t i = 0; i < n; i++) {
57
57
  tab_out[i] = (T)floorf((tab[i] - bi) * a + 0.5);
58
58
  }
59
59
  }
@@ -68,7 +68,7 @@ void round_uint8_per_column(
68
68
  float* b_out) {
69
69
  float max_span = 0;
70
70
  std::vector<float> mins(n);
71
- for (int i = 0; i < n; i++) {
71
+ for (size_t i = 0; i < n; i++) {
72
72
  mins[i] = tab_min(tab + i * d, d);
73
73
  float span = tab_max(tab + i * d, d) - mins[i];
74
74
  if (span > max_span) {
@@ -77,7 +77,7 @@ void round_uint8_per_column(
77
77
  }
78
78
  float a = 255 / max_span;
79
79
  float b = 0;
80
- for (int i = 0; i < n; i++) {
80
+ for (size_t i = 0; i < n; i++) {
81
81
  b += mins[i];
82
82
  round_tab(tab + i * d, d, a, mins[i]);
83
83
  }
@@ -98,10 +98,10 @@ void round_uint8_per_column_multi(
98
98
  float* b_out) {
99
99
  float max_span = 0;
100
100
  std::vector<float> mins(n);
101
- for (int i = 0; i < n; i++) {
101
+ for (size_t i = 0; i < n; i++) {
102
102
  float min_i = HUGE_VAL;
103
103
  float max_i = -HUGE_VAL;
104
- for (int j = 0; j < m; j++) {
104
+ for (size_t j = 0; j < m; j++) {
105
105
  min_i = std::min(min_i, tab_min(tab + (j * n + i) * d, d));
106
106
  max_i = std::max(max_i, tab_max(tab + (j * n + i) * d, d));
107
107
  }
@@ -113,9 +113,9 @@ void round_uint8_per_column_multi(
113
113
  }
114
114
  float a = 255 / max_span;
115
115
  float b = 0;
116
- for (int i = 0; i < n; i++) {
116
+ for (size_t i = 0; i < n; i++) {
117
117
  b += mins[i];
118
- for (int j = 0; j < m; j++) {
118
+ for (size_t j = 0; j < m; j++) {
119
119
  round_tab(tab + (j * n + i) * d, d, a, mins[i]);
120
120
  }
121
121
  }
@@ -147,7 +147,7 @@ void quantize_LUT_and_bias(
147
147
  std::vector<float> mins(M);
148
148
  float max_span_LUT = -HUGE_VAL, max_span_dis = 0;
149
149
  b = 0;
150
- for (int i = 0; i < M; i++) {
150
+ for (size_t i = 0; i < M; i++) {
151
151
  mins[i] = tab_min(LUT + i * ksub, ksub);
152
152
  float span = tab_max(LUT + i * ksub, ksub) - mins[i];
153
153
  max_span_LUT = std::max(max_span_LUT, span);
@@ -156,7 +156,7 @@ void quantize_LUT_and_bias(
156
156
  }
157
157
  a = std::min(255 / max_span_LUT, 65535 / max_span_dis);
158
158
 
159
- for (int i = 0; i < M; i++) {
159
+ for (size_t i = 0; i < M; i++) {
160
160
  round_tab(LUT + i * ksub, ksub, a, mins[i], LUTq + i * ksub);
161
161
  }
162
162
  memset(LUTq + M * ksub, 0, ksub * (M2 - M));
@@ -167,7 +167,7 @@ void quantize_LUT_and_bias(
167
167
  float bias_max = tab_max(bias, nprobe);
168
168
  max_span_dis = bias_max - bias_min;
169
169
  b = 0;
170
- for (int i = 0; i < M; i++) {
170
+ for (size_t i = 0; i < M; i++) {
171
171
  mins[i] = tab_min(LUT + i * ksub, ksub);
172
172
  float span = tab_max(LUT + i * ksub, ksub) - mins[i];
173
173
  max_span_LUT = std::max(max_span_LUT, span);
@@ -177,7 +177,7 @@ void quantize_LUT_and_bias(
177
177
  a = std::min(255 / max_span_LUT, 65535 / max_span_dis);
178
178
  b += bias_min;
179
179
 
180
- for (int i = 0; i < M; i++) {
180
+ for (size_t i = 0; i < M; i++) {
181
181
  round_tab(LUT + i * ksub, ksub, a, mins[i], LUTq + i * ksub);
182
182
  }
183
183
  memset(LUTq + M * ksub, 0, ksub * (M2 - M));
@@ -192,10 +192,10 @@ void quantize_LUT_and_bias(
192
192
 
193
193
  b = HUGE_VAL;
194
194
  size_t ij = 0;
195
- for (int j = 0; j < nprobe; j++) {
195
+ for (size_t j = 0; j < nprobe; j++) {
196
196
  float max_span_dis_j = bias[j] - bias_min;
197
197
  float b2j = bias[j];
198
- for (int i = 0; i < M; i++) {
198
+ for (size_t i = 0; i < M; i++) {
199
199
  mins[ij] = tab_min(LUT + ij * ksub, ksub);
200
200
  float span = tab_max(LUT + ij * ksub, ksub) - mins[ij];
201
201
  max_span_LUT = std::max(max_span_LUT, span);
@@ -212,8 +212,8 @@ void quantize_LUT_and_bias(
212
212
 
213
213
  ij = 0;
214
214
  size_t ij_2 = 0;
215
- for (int j = 0; j < nprobe; j++) {
216
- for (int i = 0; i < M; i++) {
215
+ for (size_t j = 0; j < nprobe; j++) {
216
+ for (size_t i = 0; i < M; i++) {
217
217
  round_tab(
218
218
  LUT + ij * ksub, ksub, a, mins[ij], LUTq + ij_2 * ksub);
219
219
  ij++;
@@ -230,10 +230,10 @@ void quantize_LUT_and_bias(
230
230
  std::vector<float> LUT2_storage(nprobe * M * ksub);
231
231
  float* LUT2 = LUT2_storage.data();
232
232
  size_t ijc = 0;
233
- for (int j = 0; j < nprobe; j++) {
233
+ for (size_t j = 0; j < nprobe; j++) {
234
234
  float bias_j = bias[j] / M;
235
- for (int i = 0; i < M; i++) {
236
- for (int c = 0; c < ksub; c++) {
235
+ for (size_t i = 0; i < M; i++) {
236
+ for (size_t c = 0; c < ksub; c++) {
237
237
  LUT2[ijc] = LUT[ijc] + bias_j;
238
238
  ijc++;
239
239
  }
@@ -241,8 +241,8 @@ void quantize_LUT_and_bias(
241
241
  }
242
242
  std::vector<float> mins(M, HUGE_VAL), maxs(M, -HUGE_VAL);
243
243
  size_t ij = 0;
244
- for (int j = 0; j < nprobe; j++) {
245
- for (int i = 0; i < M; i++) {
244
+ for (size_t j = 0; j < nprobe; j++) {
245
+ for (size_t i = 0; i < M; i++) {
246
246
  mins[i] = std::min(mins[i], tab_min(LUT2 + ij * ksub, ksub));
247
247
  maxs[i] = std::max(maxs[i], tab_max(LUT2 + ij * ksub, ksub));
248
248
  ij++;
@@ -251,7 +251,7 @@ void quantize_LUT_and_bias(
251
251
 
252
252
  float max_span = -HUGE_VAL;
253
253
  b = 0;
254
- for (int i = 0; i < M; i++) {
254
+ for (size_t i = 0; i < M; i++) {
255
255
  float span = maxs[i] - mins[i];
256
256
  max_span = std::max(max_span, span);
257
257
  b += mins[i];
@@ -259,8 +259,8 @@ void quantize_LUT_and_bias(
259
259
  a = 255 / max_span;
260
260
  ij = 0;
261
261
  size_t ij_2 = 0;
262
- for (int j = 0; j < nprobe; j++) {
263
- for (int i = 0; i < M; i++) {
262
+ for (size_t j = 0; j < nprobe; j++) {
263
+ for (size_t i = 0; i < M; i++) {
264
264
  round_tab(
265
265
  LUT2 + ij * ksub, ksub, a, mins[i], LUTq + ij_2 * ksub);
266
266
  ij++;
@@ -298,7 +298,7 @@ void aq_quantize_LUT_and_bias(
298
298
  float bias_max = tab_max(bias, nprobe);
299
299
  max_span_dis = bias_max - bias_min;
300
300
  b = 0;
301
- for (int i = 0; i < M; i++) {
301
+ for (size_t i = 0; i < M; i++) {
302
302
  mins[i] = tab_min(LUT + i * ksub, ksub);
303
303
  float span = tab_max(LUT + i * ksub, ksub) - mins[i];
304
304
  max_span_LUT = std::max(max_span_LUT, span);
@@ -308,7 +308,7 @@ void aq_quantize_LUT_and_bias(
308
308
  a = std::min(255 / max_span_LUT, 65535 / max_span_dis);
309
309
  b += bias_min;
310
310
 
311
- for (int i = 0; i < M; i++) {
311
+ for (size_t i = 0; i < M; i++) {
312
312
  round_tab(LUT + i * ksub, ksub, a, mins[i], LUTq + i * ksub);
313
313
  }
314
314
  memset(LUTq + M * ksub, 0, ksub * (M2 - M));
@@ -324,14 +324,14 @@ float aq_estimate_norm_scale(
324
324
  size_t M_norm,
325
325
  const float* LUT) {
326
326
  float max_span_LUT = -HUGE_VAL;
327
- for (int i = 0; i < M - M_norm; i++) {
327
+ for (size_t i = 0; i < M - M_norm; i++) {
328
328
  float min = tab_min(LUT + i * ksub, ksub);
329
329
  float span = tab_max(LUT + i * ksub, ksub) - min;
330
330
  max_span_LUT = std::max(max_span_LUT, span);
331
331
  }
332
332
 
333
333
  float max_span_LUT_norm = -HUGE_VAL;
334
- for (int i = M - M_norm; i < M; i++) {
334
+ for (size_t i = M - M_norm; i < M; i++) {
335
335
  float min = tab_min(LUT + i * ksub, ksub);
336
336
  float span = tab_max(LUT + i * ksub, ksub) - min;
337
337
  max_span_LUT_norm = std::max(max_span_LUT_norm, span);
@@ -50,7 +50,7 @@ void round_uint8_per_column_multi(
50
50
 
51
51
  /** LUT quantization to uint8 and bias to uint16.
52
52
  *
53
- * (nprobe, M, ksub, lut_is_3d) determine the size of the the LUT
53
+ * (nprobe, M, ksub, lut_is_3d) determine the size of the LUT
54
54
  *
55
55
  * LUT input:
56
56
  * - 2D size (M, ksub): single matrix per probe (lut_is_3d=false)