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
@@ -44,8 +44,9 @@ IndexSVSVamanaLeanVec::IndexSVSVamanaLeanVec(
44
44
  size_t degree,
45
45
  MetricType metric,
46
46
  size_t leanvec_dims,
47
- SVSStorageKind storage_kind)
48
- : IndexSVSVamana(d, degree, metric, storage_kind) {
47
+ SVSStorageKind storage_kind,
48
+ bool is_static)
49
+ : IndexSVSVamana(d, degree, metric, storage_kind, is_static) {
49
50
  is_trained = false;
50
51
  leanvec_d = leanvec_dims == 0 ? d / 2 : leanvec_dims;
51
52
  }
@@ -56,7 +57,7 @@ IndexSVSVamanaLeanVec::~IndexSVSVamanaLeanVec() {
56
57
  FAISS_ASSERT(status.ok());
57
58
  training_data = nullptr;
58
59
  }
59
- IndexSVSVamana::~IndexSVSVamana();
60
+ // Base class destructor handles impl cleanup
60
61
  }
61
62
 
62
63
  void IndexSVSVamanaLeanVec::add(idx_t n, const float* x) {
@@ -66,10 +67,10 @@ void IndexSVSVamanaLeanVec::add(idx_t n, const float* x) {
66
67
  }
67
68
 
68
69
  void IndexSVSVamanaLeanVec::train(idx_t n, const float* x) {
69
- train(n, x, 0, nullptr);
70
+ train_with_queries(n, x, 0, nullptr);
70
71
  }
71
72
 
72
- void IndexSVSVamanaLeanVec::train(
73
+ void IndexSVSVamanaLeanVec::train_with_queries(
73
74
  idx_t n,
74
75
  const float* x,
75
76
  idx_t n_train_q,
@@ -91,6 +92,15 @@ void IndexSVSVamanaLeanVec::train(
91
92
  is_trained = true;
92
93
  }
93
94
 
95
+ void IndexSVSVamanaLeanVec::reset() {
96
+ if (training_data) {
97
+ auto status = svs_runtime::LeanVecTrainingData::destroy(training_data);
98
+ FAISS_ASSERT(status.ok());
99
+ training_data = nullptr;
100
+ }
101
+ IndexSVSVamana::reset();
102
+ }
103
+
94
104
  void IndexSVSVamanaLeanVec::serialize_training_data(std::ostream& out) const {
95
105
  FAISS_THROW_IF_NOT_MSG(
96
106
  training_data, "Cannot serialize: Training data not initialized.");
@@ -111,7 +121,8 @@ void IndexSVSVamanaLeanVec::deserialize_training_data(std::istream& in) {
111
121
  training_data = tdata;
112
122
  }
113
123
 
114
- void IndexSVSVamanaLeanVec::create_impl() {
124
+ void IndexSVSVamanaLeanVec::create_impl(idx_t n, const float* x) {
125
+ FAISS_THROW_IF_NOT(!impl);
115
126
  ntotal = 0;
116
127
  auto svs_metric = to_svs_metric(metric_type);
117
128
  auto svs_storage_kind = to_svs_storage_kind(storage_kind);
@@ -127,29 +138,68 @@ void IndexSVSVamanaLeanVec::create_impl() {
127
138
  .search_window_size = search_window_size,
128
139
  .search_buffer_capacity = search_buffer_capacity,
129
140
  };
141
+
130
142
  auto status = svs_runtime::Status_Ok;
131
- if (training_data) {
132
- status = svs_runtime::DynamicVamanaIndexLeanVec::build(
133
- &impl,
134
- d,
135
- svs_metric,
136
- svs_storage_kind,
137
- training_data,
138
- build_params,
139
- search_params);
143
+ if (is_static) {
144
+ FAISS_THROW_IF_NOT_MSG(
145
+ n > 0 && x != nullptr,
146
+ "Static Vamana LeanVec index requires data at build time.");
147
+ if (training_data) {
148
+ status = svs_runtime::VamanaIndexLeanVec::build(
149
+ &impl,
150
+ d,
151
+ svs_metric,
152
+ svs_storage_kind,
153
+ training_data,
154
+ build_params,
155
+ search_params);
156
+ } else {
157
+ status = svs_runtime::VamanaIndexLeanVec::build(
158
+ &impl,
159
+ d,
160
+ svs_metric,
161
+ svs_storage_kind,
162
+ leanvec_d,
163
+ build_params,
164
+ search_params);
165
+ }
166
+ if (!status.ok()) {
167
+ FAISS_THROW_MSG(status.message());
168
+ }
169
+ FAISS_THROW_IF_NOT(impl);
170
+ // Populate the static index with the full dataset (one-shot add).
171
+ status = impl->add(static_cast<size_t>(n), x);
172
+ if (!status.ok()) {
173
+ auto destroy_status = svs_runtime::VamanaIndex::destroy(impl);
174
+ FAISS_ASSERT(destroy_status.ok());
175
+ impl = nullptr;
176
+ FAISS_THROW_MSG(status.message());
177
+ }
140
178
  } else {
141
- status = svs_runtime::DynamicVamanaIndexLeanVec::build(
142
- &impl,
143
- d,
144
- svs_metric,
145
- svs_storage_kind,
146
- leanvec_d,
147
- build_params,
148
- search_params);
149
- }
150
-
151
- if (!status.ok()) {
152
- FAISS_THROW_MSG(status.message());
179
+ svs_runtime::DynamicVamanaIndex* dyn_impl = nullptr;
180
+ if (training_data) {
181
+ status = svs_runtime::DynamicVamanaIndexLeanVec::build(
182
+ &dyn_impl,
183
+ d,
184
+ svs_metric,
185
+ svs_storage_kind,
186
+ training_data,
187
+ build_params,
188
+ search_params);
189
+ } else {
190
+ status = svs_runtime::DynamicVamanaIndexLeanVec::build(
191
+ &dyn_impl,
192
+ d,
193
+ svs_metric,
194
+ svs_storage_kind,
195
+ leanvec_d,
196
+ build_params,
197
+ search_params);
198
+ }
199
+ if (!status.ok()) {
200
+ FAISS_THROW_MSG(status.message());
201
+ }
202
+ impl = dyn_impl;
153
203
  }
154
204
  FAISS_THROW_IF_NOT(impl);
155
205
  }
@@ -35,7 +35,8 @@ struct IndexSVSVamanaLeanVec : IndexSVSVamana {
35
35
  size_t degree,
36
36
  MetricType metric = METRIC_L2,
37
37
  size_t leanvec_dims = 0,
38
- SVSStorageKind storage = SVSStorageKind::SVS_LeanVec4x4);
38
+ SVSStorageKind storage = SVSStorageKind::SVS_LeanVec4x4,
39
+ bool is_static = false);
39
40
 
40
41
  ~IndexSVSVamanaLeanVec() override;
41
42
 
@@ -49,8 +50,13 @@ struct IndexSVSVamanaLeanVec : IndexSVSVamana {
49
50
  * sampled from different distributions (e.g., cross-modal). More details in
50
51
  * the original publication, arXiv:2312.16335.
51
52
  */
52
- void train(idx_t n, const float* x, idx_t n_train_q, const float* xq_train)
53
- override;
53
+ void train_with_queries(
54
+ idx_t n,
55
+ const float* x,
56
+ idx_t n_train_q,
57
+ const float* xq_train) override;
58
+
59
+ void reset() override;
54
60
 
55
61
  void serialize_training_data(std::ostream& out) const;
56
62
  void deserialize_training_data(std::istream& in);
@@ -61,7 +67,7 @@ struct IndexSVSVamanaLeanVec : IndexSVSVamana {
61
67
  svs_runtime::LeanVecTrainingData* training_data{nullptr};
62
68
 
63
69
  protected:
64
- void create_impl() override;
70
+ void create_impl(idx_t n, const float* x) override;
65
71
  };
66
72
 
67
73
  } // namespace faiss
@@ -17,7 +17,7 @@ namespace faiss {
17
17
  template <typename C>
18
18
  void HeapArray<C>::heapify() {
19
19
  #pragma omp parallel for
20
- for (int64_t j = 0; j < nh; j++) {
20
+ for (int64_t j = 0; j < static_cast<int64_t>(nh); j++) {
21
21
  heap_heapify<C>(k, val + j * k, ids + j * k);
22
22
  }
23
23
  }
@@ -25,7 +25,7 @@ void HeapArray<C>::heapify() {
25
25
  template <typename C>
26
26
  void HeapArray<C>::reorder() {
27
27
  #pragma omp parallel for
28
- for (int64_t j = 0; j < nh; j++) {
28
+ for (int64_t j = 0; j < static_cast<int64_t>(nh); j++) {
29
29
  heap_reorder<C>(k, val + j * k, ids + j * k);
30
30
  }
31
31
  }
@@ -37,7 +37,7 @@ void HeapArray<C>::addn(size_t nj, const T* vin, TI j0, size_t i0, int64_t ni) {
37
37
  }
38
38
  assert(i0 >= 0 && i0 + ni <= nh);
39
39
  #pragma omp parallel for if (ni * nj > 100000)
40
- for (int64_t i = i0; i < i0 + ni; i++) {
40
+ for (int64_t i = i0; i < static_cast<int64_t>(i0) + ni; i++) {
41
41
  T* __restrict simi = get_val(i);
42
42
  TI* __restrict idxi = get_ids(i);
43
43
  const T* ip_line = vin + (i - i0) * nj;
@@ -68,7 +68,7 @@ void HeapArray<C>::addn_with_ids(
68
68
  }
69
69
  assert(i0 >= 0 && i0 + ni <= nh);
70
70
  #pragma omp parallel for if (ni * nj > 100000)
71
- for (int64_t i = i0; i < i0 + ni; i++) {
71
+ for (int64_t i = i0; i < static_cast<int64_t>(i0) + ni; i++) {
72
72
  T* __restrict simi = get_val(i);
73
73
  TI* __restrict idxi = get_ids(i);
74
74
  const T* ip_line = vin + (i - i0) * nj;
@@ -96,7 +96,7 @@ void HeapArray<C>::addn_query_subset_with_ids(
96
96
  id_stride = nj;
97
97
  }
98
98
  #pragma omp parallel for if (nsubset * nj > 100000)
99
- for (int64_t si = 0; si < nsubset; si++) {
99
+ for (int64_t si = 0; si < static_cast<int64_t>(nsubset); si++) {
100
100
  TI i = subset[si];
101
101
  T* __restrict simi = get_val(i);
102
102
  TI* __restrict idxi = get_ids(i);
@@ -115,7 +115,7 @@ void HeapArray<C>::addn_query_subset_with_ids(
115
115
  template <typename C>
116
116
  void HeapArray<C>::per_line_extrema(T* out_val, TI* out_ids) const {
117
117
  #pragma omp parallel for if (nh * k > 100000)
118
- for (int64_t j = 0; j < nh; j++) {
118
+ for (int64_t j = 0; j < static_cast<int64_t>(nh); j++) {
119
119
  int64_t imin = -1;
120
120
  typename C::T xval = C::Crev::neutral();
121
121
  const typename C::T* x_ = val + j * k;
@@ -187,7 +187,7 @@ void merge_knn_results(
187
187
  std::vector<distance_t> buf2(nshard);
188
188
  distance_t* heap_vals = buf2.data();
189
189
  #pragma omp for
190
- for (long i = 0; i < n; i++) {
190
+ for (long i = 0; i < static_cast<long>(n); i++) {
191
191
  // the heap maps values to the shard where they are
192
192
  // produced.
193
193
  const distance_t* D_in = all_distances + i * k;
@@ -195,7 +195,7 @@ void merge_knn_results(
195
195
  int heap_size = 0;
196
196
 
197
197
  // push the first element of each shard (if not -1)
198
- for (long s = 0; s < nshard; s++) {
198
+ for (long s = 0; s < static_cast<long>(nshard); s++) {
199
199
  pointer[s] = 0;
200
200
  if (I_in[stride * s] >= 0) {
201
201
  heap_push<C>(
@@ -210,7 +210,7 @@ void merge_knn_results(
210
210
  distance_t* D = distances + i * k;
211
211
  idx_t* I = labels + i * k;
212
212
 
213
- int j;
213
+ size_t j;
214
214
  for (j = 0; j < k && heap_size > 0; j++) {
215
215
  // pop element from best shard
216
216
  int s = shard_ids[0]; // top of heap
@@ -221,7 +221,7 @@ void merge_knn_results(
221
221
  // pop from shard, advance pointer for this shard
222
222
  heap_pop<C>(heap_size--, heap_vals, shard_ids);
223
223
  p++;
224
- if (p < k && I_in[stride * s + p] >= 0) {
224
+ if (static_cast<size_t>(p) < k && I_in[stride * s + p] >= 0) {
225
225
  heap_push<C>(
226
226
  ++heap_size,
227
227
  heap_vals,
@@ -80,12 +80,12 @@ template struct Tensor2DTemplate<int32_t>;
80
80
  * Layers implementation
81
81
  *************************************************************/
82
82
 
83
- Linear::Linear(size_t in_features, size_t out_features, bool bias)
84
- : in_features(in_features),
85
- out_features(out_features),
86
- weight(in_features * out_features) {
87
- if (bias) {
88
- this->bias.resize(out_features);
83
+ Linear::Linear(size_t in_features_in, size_t out_features_in, bool bias_in)
84
+ : in_features(in_features_in),
85
+ out_features(out_features_in),
86
+ weight(in_features_in * out_features_in) {
87
+ if (bias_in) {
88
+ this->bias.resize(out_features_in);
89
89
  }
90
90
  }
91
91
 
@@ -123,9 +123,9 @@ Tensor2D Linear::operator()(const Tensor2D& x) const {
123
123
  return output;
124
124
  }
125
125
 
126
- Embedding::Embedding(size_t num_embeddings, size_t embedding_dim)
127
- : num_embeddings(num_embeddings), embedding_dim(embedding_dim) {
128
- weight.resize(num_embeddings * embedding_dim);
126
+ Embedding::Embedding(size_t num_embeddings_in, size_t embedding_dim_in)
127
+ : num_embeddings(num_embeddings_in), embedding_dim(embedding_dim_in) {
128
+ weight.resize(num_embeddings_in * embedding_dim_in);
129
129
  }
130
130
 
131
131
  Tensor2D Embedding::operator()(const Int32Tensor2D& code) const {
@@ -181,8 +181,13 @@ Tensor2D FFN::operator()(const Tensor2D& x_in) const {
181
181
 
182
182
  using namespace nn;
183
183
 
184
- QINCoStep::QINCoStep(int d, int K, int L, int h)
185
- : d(d), K(K), L(L), h(h), codebook(K, d), MLPconcat(2 * d, d) {
184
+ QINCoStep::QINCoStep(int d_in, int K_in, int L_in, int h_in)
185
+ : d(d_in),
186
+ K(K_in),
187
+ L(L_in),
188
+ h(h_in),
189
+ codebook(K_in, d_in),
190
+ MLPconcat(2 * d_in, d_in) {
186
191
  for (int i = 0; i < L; i++) {
187
192
  residual_blocks.emplace_back(d, h);
188
193
  }
@@ -208,7 +213,8 @@ nn::Int32Tensor2D QINCoStep::encode(
208
213
  nn::Tensor2D* residuals) const {
209
214
  size_t n = xhat.shape[0];
210
215
  FAISS_THROW_IF_NOT(
211
- n == x.shape[0] && xhat.shape[1] == d && x.shape[1] == d);
216
+ n == x.shape[0] && xhat.shape[1] == static_cast<size_t>(d) &&
217
+ x.shape[1] == static_cast<size_t>(d));
212
218
 
213
219
  // repeated codebook
214
220
  Tensor2D zqs_r(n * K, d); // size n, K, d
@@ -226,7 +232,7 @@ nn::Int32Tensor2D QINCoStep::encode(
226
232
 
227
233
  // manual broadcasting
228
234
  for (size_t i = 0; i < n; i++) {
229
- for (size_t j = 0; j < K; j++) {
235
+ for (size_t j = 0; j < static_cast<size_t>(K); j++) {
230
236
  copy_row(zqs_r, i * K + j, 0, codebook.data() + j * d);
231
237
  copy_row(cc, i * K + j, 0, codebook.data() + j * d);
232
238
  copy_row(cc, i * K + j, d, xhat.data() + i * d);
@@ -244,8 +250,8 @@ nn::Int32Tensor2D QINCoStep::encode(
244
250
  for (size_t i = 0; i < n; i++) {
245
251
  float* zqs_r_row = zqs_r.data() + i * K * d;
246
252
  const float* xhat_row = xhat.data() + i * d;
247
- for (size_t l = 0; l < K; l++) {
248
- for (size_t j = 0; j < d; j++) {
253
+ for (size_t l = 0; l < static_cast<size_t>(K); l++) {
254
+ for (size_t j = 0; j < static_cast<size_t>(d); j++) {
249
255
  zqs_r_row[j] += xhat_row[j];
250
256
  }
251
257
  zqs_r_row += d;
@@ -257,17 +263,18 @@ nn::Int32Tensor2D QINCoStep::encode(
257
263
  float* res = nullptr;
258
264
  if (residuals) {
259
265
  FAISS_THROW_IF_NOT(
260
- residuals->shape[0] == n && residuals->shape[1] == d);
266
+ residuals->shape[0] == n &&
267
+ residuals->shape[1] == static_cast<size_t>(d));
261
268
  res = residuals->data();
262
269
  }
263
270
 
264
- for (size_t i = 0; i < n; i++) {
265
- const float* q = x.data() + i * d;
266
- const float* db = zqs_r.data() + i * K * d;
267
- float dis_min = HUGE_VALF;
268
- int64_t idx = -1;
269
- with_simd_level([&]<SIMDLevel SL>() {
270
- for (size_t j = 0; j < K; j++) {
271
+ with_simd_level([&]<SIMDLevel SL>() {
272
+ for (size_t i = 0; i < n; i++) {
273
+ const float* q = x.data() + i * d;
274
+ const float* db = zqs_r.data() + i * K * d;
275
+ float dis_min = HUGE_VALF;
276
+ int64_t idx = -1;
277
+ for (size_t j = 0; j < static_cast<size_t>(K); j++) {
271
278
  float dis = fvec_L2sqr<SL>(q, db, d);
272
279
  if (dis < dis_min) {
273
280
  dis_min = dis;
@@ -275,17 +282,17 @@ nn::Int32Tensor2D QINCoStep::encode(
275
282
  }
276
283
  db += d;
277
284
  }
278
- });
279
- codes.v[i] = idx;
280
- if (res) {
281
- const float* xhat_row = xhat.data() + i * d;
282
- const float* xhat_next_row = zqs_r.data() + (i * K + idx) * d;
283
- for (size_t j = 0; j < d; j++) {
284
- res[j] = xhat_next_row[j] - xhat_row[j];
285
+ codes.v[i] = idx;
286
+ if (res) {
287
+ const float* xhat_row = xhat.data() + i * d;
288
+ const float* xhat_next_row = zqs_r.data() + (i * K + idx) * d;
289
+ for (size_t j = 0; j < static_cast<size_t>(d); j++) {
290
+ res[j] = xhat_next_row[j] - xhat_row[j];
291
+ }
292
+ res += d;
285
293
  }
286
- res += d;
287
294
  }
288
- }
295
+ });
289
296
  return codes;
290
297
  }
291
298
 
@@ -293,15 +300,19 @@ nn::Int32Tensor2D QINCoStep::encode(
293
300
  * QINCo implementation
294
301
  *************************************************************/
295
302
 
296
- QINCo::QINCo(int d, int K, int L, int M, int h)
297
- : NeuralNetCodec(d, M), K(K), L(L), h(h), codebook0(K, d) {
303
+ QINCo::QINCo(int d_in, int K_in, int L_in, int M_in, int h_in)
304
+ : NeuralNetCodec(d_in, M_in),
305
+ K(K_in),
306
+ L(L_in),
307
+ h(h_in),
308
+ codebook0(K_in, d_in) {
298
309
  for (int i = 1; i < M; i++) {
299
310
  steps.emplace_back(d, K, L, h);
300
311
  }
301
312
  }
302
313
 
303
314
  nn::Tensor2D QINCo::decode(const nn::Int32Tensor2D& codes) const {
304
- FAISS_THROW_IF_NOT(codes.shape[1] == M);
315
+ FAISS_THROW_IF_NOT(codes.shape[1] == static_cast<size_t>(M));
305
316
  Tensor2D xhat = codebook0(codes.column(0));
306
317
  for (int i = 1; i < M; i++) {
307
318
  xhat += steps[i - 1].decode(xhat, codes.column(i));
@@ -310,7 +321,7 @@ nn::Tensor2D QINCo::decode(const nn::Int32Tensor2D& codes) const {
310
321
  }
311
322
 
312
323
  nn::Int32Tensor2D QINCo::encode(const nn::Tensor2D& x) const {
313
- FAISS_THROW_IF_NOT(x.shape[1] == d);
324
+ FAISS_THROW_IF_NOT(x.shape[1] == static_cast<size_t>(d));
314
325
  size_t n = x.shape[0];
315
326
  Int32Tensor2D codes(n, M);
316
327
  Tensor2D xhat(n, d);
@@ -118,7 +118,7 @@ struct QINCoStep {
118
118
  struct NeuralNetCodec {
119
119
  int d, M;
120
120
 
121
- NeuralNetCodec(int d, int M) : d(d), M(M) {}
121
+ NeuralNetCodec(int d_in, int M_in) : d(d_in), M(M_in) {}
122
122
 
123
123
  virtual nn::Tensor2D decode(const nn::Int32Tensor2D& codes) const = 0;
124
124
  virtual nn::Int32Tensor2D encode(const nn::Tensor2D& x) const = 0;
@@ -11,12 +11,17 @@
11
11
  #include <limits>
12
12
  #include <utility>
13
13
 
14
+ #include <faiss/impl/simdlib/simdlib_dispatch.h>
14
15
  #include <faiss/utils/Heap.h>
15
- #include <faiss/utils/simdlib.h>
16
16
 
17
17
  namespace faiss {
18
18
 
19
- // HeapWithBucketsForHamming32 uses simd8uint32 under the hood.
19
+ // Explicit SIMD-level aliases for this file (no global bare aliases).
20
+ using simd8uint32 = simd8uint32_tpl<SINGLE_SIMD_LEVEL_256>;
21
+ using simd16uint16 = simd16uint16_tpl<SINGLE_SIMD_LEVEL_256>;
22
+
23
+ // HeapWithBucketsForHamming32 uses simd8uint32 under the
24
+ // hood.
20
25
 
21
26
  template <typename C, uint32_t NBUCKETS, uint32_t N, typename HammingComputerT>
22
27
  struct HeapWithBucketsForHamming32 {
@@ -197,8 +202,9 @@ struct HeapWithBucketsForHamming32<
197
202
  }
198
203
  };
199
204
 
200
- // HeapWithBucketsForHamming16 uses simd16uint16 under the hood.
201
- // Less registers needed in total, so higher values of NBUCKETS/N can be used,
205
+ // HeapWithBucketsForHamming16 uses simd16uint16 under
206
+ // the hood. Less registers needed in total, so higher values of NBUCKETS/N can
207
+ // be used,
202
208
  // but somewhat slower.
203
209
  // No more than 32K elements currently, but it can be reorganized a bit
204
210
  // to be limited to 32K elements per beam.
@@ -7,8 +7,13 @@
7
7
 
8
8
  #pragma once
9
9
 
10
+ #include <cstddef>
10
11
  #include <cstdint>
11
12
 
13
+ #if defined(__AVX512F__) || defined(__AVX512BF16__)
14
+ #include <immintrin.h>
15
+ #endif
16
+
12
17
  namespace faiss {
13
18
 
14
19
  namespace {
@@ -33,4 +38,33 @@ inline float decode_bf16(const uint16_t v) {
33
38
  return fp.as_f32;
34
39
  }
35
40
 
41
+ inline void encode_bf16_simd(const float* src, uint16_t* dst, size_t n) {
42
+ size_t i = 0;
43
+ #ifdef __AVX512BF16__
44
+ for (; i + 16 <= n; i += 16) {
45
+ __m512 v = _mm512_loadu_ps(src + i);
46
+ __m256bh encoded = _mm512_cvtneps_pbh(v);
47
+ _mm256_storeu_epi16(dst + i, (__m256i)encoded);
48
+ }
49
+ #endif
50
+ for (; i < n; i++) {
51
+ dst[i] = encode_bf16(src[i]);
52
+ }
53
+ }
54
+
55
+ inline void decode_bf16_simd(const uint16_t* src, float* dst, size_t n) {
56
+ size_t i = 0;
57
+ #if defined(__AVX512F__)
58
+ for (; i + 16 <= n; i += 16) {
59
+ __m256i v = _mm256_loadu_si256((const __m256i*)(src + i));
60
+ __m512i w = _mm512_cvtepu16_epi32(v);
61
+ w = _mm512_slli_epi32(w, 16);
62
+ _mm512_storeu_ps(dst + i, _mm512_castsi512_ps(w));
63
+ }
64
+ #endif
65
+ for (; i < n; i++) {
66
+ dst[i] = decode_bf16(src[i]);
67
+ }
68
+ }
69
+
36
70
  } // namespace faiss