faiss 0.5.3 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/ext/faiss/ext.cpp +1 -1
  4. data/ext/faiss/extconf.rb +4 -4
  5. data/ext/faiss/index.cpp +63 -45
  6. data/ext/faiss/index_binary.cpp +37 -27
  7. data/ext/faiss/kmeans.cpp +9 -8
  8. data/ext/faiss/pca_matrix.cpp +9 -7
  9. data/ext/faiss/product_quantizer.cpp +13 -11
  10. data/ext/faiss/utils.cpp +4 -2
  11. data/ext/faiss/utils.h +4 -0
  12. data/lib/faiss/version.rb +1 -1
  13. data/lib/faiss.rb +1 -1
  14. data/vendor/faiss/faiss/AutoTune.cpp +214 -82
  15. data/vendor/faiss/faiss/AutoTune.h +14 -1
  16. data/vendor/faiss/faiss/Clustering.cpp +97 -249
  17. data/vendor/faiss/faiss/Clustering.h +18 -0
  18. data/vendor/faiss/faiss/IVFlib.cpp +67 -44
  19. data/vendor/faiss/faiss/Index.cpp +25 -12
  20. data/vendor/faiss/faiss/Index.h +26 -4
  21. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  22. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +68 -61
  23. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  24. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  25. data/vendor/faiss/faiss/IndexBinary.cpp +6 -3
  26. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  27. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  28. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  29. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  30. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +92 -95
  31. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  32. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  33. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  34. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +120 -414
  35. data/vendor/faiss/faiss/IndexFastScan.cpp +105 -129
  36. data/vendor/faiss/faiss/IndexFastScan.h +35 -24
  37. data/vendor/faiss/faiss/IndexFlat.cpp +216 -152
  38. data/vendor/faiss/faiss/IndexFlat.h +32 -14
  39. data/vendor/faiss/faiss/IndexFlatCodes.cpp +88 -41
  40. data/vendor/faiss/faiss/IndexFlatCodes.h +7 -1
  41. data/vendor/faiss/faiss/IndexHNSW.cpp +299 -187
  42. data/vendor/faiss/faiss/IndexHNSW.h +30 -14
  43. data/vendor/faiss/faiss/IndexIDMap.cpp +26 -22
  44. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  45. data/vendor/faiss/faiss/IndexIVF.cpp +535 -405
  46. data/vendor/faiss/faiss/IndexIVF.h +47 -16
  47. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
  48. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +105 -99
  49. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +6 -3
  50. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +379 -249
  51. data/vendor/faiss/faiss/IndexIVFFastScan.h +65 -60
  52. data/vendor/faiss/faiss/IndexIVFFlat.cpp +41 -124
  53. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  54. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +89 -138
  55. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  56. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  57. data/vendor/faiss/faiss/IndexIVFPQ.cpp +77 -907
  58. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +184 -122
  59. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  60. data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -18
  61. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +59 -60
  62. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +4 -3
  63. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +564 -416
  64. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +269 -111
  65. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  66. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  67. data/vendor/faiss/faiss/IndexLSH.cpp +44 -25
  68. data/vendor/faiss/faiss/IndexLattice.cpp +41 -36
  69. data/vendor/faiss/faiss/IndexNNDescent.cpp +37 -21
  70. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  71. data/vendor/faiss/faiss/IndexNSG.cpp +40 -23
  72. data/vendor/faiss/faiss/IndexNSG.h +0 -2
  73. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +32 -12
  74. data/vendor/faiss/faiss/IndexPQ.cpp +129 -213
  75. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  76. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  77. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  78. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  79. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  80. data/vendor/faiss/faiss/IndexRaBitQ.cpp +31 -43
  81. data/vendor/faiss/faiss/IndexRaBitQ.h +4 -3
  82. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +135 -317
  83. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +192 -34
  84. data/vendor/faiss/faiss/IndexRefine.cpp +30 -55
  85. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  86. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  87. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  88. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  89. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
  90. data/vendor/faiss/faiss/IndexShards.cpp +13 -13
  91. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  92. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  93. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  94. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  95. data/vendor/faiss/faiss/MetricType.h +29 -6
  96. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  97. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  98. data/vendor/faiss/faiss/VectorTransform.cpp +349 -141
  99. data/vendor/faiss/faiss/VectorTransform.h +39 -16
  100. data/vendor/faiss/faiss/build.cpp +23 -0
  101. data/vendor/faiss/faiss/build.h +15 -0
  102. data/vendor/faiss/faiss/clone_index.cpp +55 -51
  103. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  104. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  105. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  106. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  107. data/vendor/faiss/faiss/{cppcontrib/factory_tools.cpp → factory_tools.cpp} +6 -1
  108. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +1 -1
  109. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  110. data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
  111. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
  112. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
  113. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  114. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  115. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  116. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  117. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  118. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  119. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  120. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  121. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  122. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  123. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
  124. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  125. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
  126. data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
  127. data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
  128. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  129. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  130. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +64 -34
  131. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  132. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  133. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -28
  134. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  135. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  136. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +367 -0
  137. data/vendor/faiss/faiss/impl/ClusteringInitialization.h +107 -0
  138. data/vendor/faiss/faiss/impl/CodePacker.cpp +7 -3
  139. data/vendor/faiss/faiss/impl/CodePacker.h +11 -3
  140. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +83 -0
  141. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.h +47 -0
  142. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  143. data/vendor/faiss/faiss/impl/FaissAssert.h +64 -3
  144. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  145. data/vendor/faiss/faiss/impl/HNSW.cpp +117 -351
  146. data/vendor/faiss/faiss/impl/HNSW.h +21 -40
  147. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  148. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  149. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  150. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +114 -102
  151. data/vendor/faiss/faiss/impl/NNDescent.cpp +63 -26
  152. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  153. data/vendor/faiss/faiss/impl/NSG.cpp +44 -26
  154. data/vendor/faiss/faiss/impl/NSG.h +20 -10
  155. data/vendor/faiss/faiss/impl/Panorama.cpp +76 -52
  156. data/vendor/faiss/faiss/impl/Panorama.h +265 -78
  157. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  158. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  159. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +62 -37
  160. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  161. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  162. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  163. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +99 -80
  164. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  165. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +135 -37
  166. data/vendor/faiss/faiss/impl/RaBitQUtils.h +148 -21
  167. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +298 -301
  168. data/vendor/faiss/faiss/impl/RaBitQuantizer.h +3 -10
  169. data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +15 -41
  170. data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.h +0 -4
  171. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +40 -32
  172. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  173. data/vendor/faiss/faiss/impl/ResultHandler.h +218 -113
  174. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +119 -2362
  175. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -3
  176. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  177. data/vendor/faiss/faiss/impl/VisitedTable.cpp +42 -0
  178. data/vendor/faiss/faiss/impl/VisitedTable.h +76 -0
  179. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  180. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  181. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  182. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  183. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  184. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  185. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  186. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  187. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  188. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  189. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  190. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  191. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  192. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  193. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  194. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  195. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  196. data/vendor/faiss/faiss/impl/expanded_scanners.h +163 -0
  197. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  198. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  199. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  200. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  201. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  202. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
  203. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +176 -4
  204. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  205. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  206. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  207. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  208. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  209. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  210. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -348
  211. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  212. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  213. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +290 -142
  214. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  215. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  216. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
  217. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
  218. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
  219. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
  220. data/vendor/faiss/faiss/impl/index_read.cpp +1950 -505
  221. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -2
  222. data/vendor/faiss/faiss/impl/index_write.cpp +112 -21
  223. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  224. data/vendor/faiss/faiss/impl/io_macros.h +33 -16
  225. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  226. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +81 -40
  227. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  228. data/vendor/faiss/faiss/impl/mapped_io.cpp +15 -8
  229. data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
  230. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  231. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  232. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  233. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  234. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
  235. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
  236. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
  237. data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx2.h → pq_code_distance/pq_code_distance-avx2.h} +43 -220
  238. data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx512.h → pq_code_distance/pq_code_distance-avx512.h} +25 -112
  239. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +59 -0
  240. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  241. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +256 -0
  242. data/vendor/faiss/faiss/impl/{code_distance/code_distance-sve.h → pq_code_distance/pq_code_distance-sve.cpp} +57 -146
  243. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
  244. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +320 -483
  245. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  246. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +121 -0
  247. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +137 -0
  248. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +371 -0
  249. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +190 -0
  250. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +94 -0
  251. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +603 -0
  252. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +597 -0
  253. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +388 -0
  254. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +630 -0
  255. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
  256. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +387 -0
  257. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +54 -0
  258. data/vendor/faiss/faiss/impl/simd_dispatch.h +173 -0
  259. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  260. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +274 -171
  261. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  262. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  263. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  264. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +275 -217
  265. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  266. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  267. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  268. data/vendor/faiss/faiss/index_factory.cpp +115 -28
  269. data/vendor/faiss/faiss/index_io.h +53 -3
  270. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +73 -20
  271. data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
  272. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  273. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
  274. data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
  275. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  276. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +14 -14
  277. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  278. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +9 -19
  279. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  280. data/vendor/faiss/faiss/svs/IndexSVSFlat.h +2 -0
  281. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  282. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  283. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  284. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  285. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  286. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  287. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
  288. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +19 -2
  289. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
  290. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +19 -2
  291. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +14 -0
  292. data/vendor/faiss/faiss/utils/Heap.cpp +56 -10
  293. data/vendor/faiss/faiss/utils/Heap.h +21 -0
  294. data/vendor/faiss/faiss/utils/NeuralNet.cpp +54 -40
  295. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  296. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  297. data/vendor/faiss/faiss/utils/distances.cpp +507 -559
  298. data/vendor/faiss/faiss/utils/distances.h +118 -1
  299. data/vendor/faiss/faiss/utils/distances_dispatch.h +250 -0
  300. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  301. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  302. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  303. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  304. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  305. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  306. data/vendor/faiss/faiss/utils/distances_simd.cpp +72 -3681
  307. data/vendor/faiss/faiss/utils/extra_distances.cpp +60 -102
  308. data/vendor/faiss/faiss/utils/extra_distances.h +79 -7
  309. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  310. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  311. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  312. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  313. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
  314. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  315. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  316. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
  317. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
  318. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
  319. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
  320. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
  321. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
  322. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
  323. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
  324. data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
  325. data/vendor/faiss/faiss/utils/partitioning.h +31 -0
  326. data/vendor/faiss/faiss/utils/popcount.h +29 -0
  327. data/vendor/faiss/faiss/utils/pq_code_distance.h +251 -0
  328. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  329. data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
  330. data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
  331. data/vendor/faiss/faiss/utils/rabitq_simd.h +124 -343
  332. data/vendor/faiss/faiss/utils/random.cpp +6 -6
  333. data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
  334. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +154 -0
  335. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +777 -0
  336. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +306 -0
  337. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +1431 -0
  338. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +1095 -0
  339. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
  340. data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
  341. data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +392 -0
  342. data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
  343. data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
  344. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
  345. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
  346. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
  347. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
  348. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
  349. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  350. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  351. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  352. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  353. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  354. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  355. data/vendor/faiss/faiss/utils/simd_levels.cpp +334 -0
  356. data/vendor/faiss/faiss/utils/simd_levels.h +183 -0
  357. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  358. data/vendor/faiss/faiss/utils/utils.cpp +21 -14
  359. data/vendor/faiss/faiss/utils/utils.h +3 -3
  360. metadata +156 -42
  361. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  362. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  363. data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +0 -81
  364. data/vendor/faiss/faiss/impl/code_distance/code_distance.h +0 -186
  365. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -216
  366. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -224
  367. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  368. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  369. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  370. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  371. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -228
  372. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  373. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  374. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -450
  375. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  376. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  377. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  378. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -296
  379. /data/vendor/faiss/faiss/{cppcontrib/factory_tools.h → factory_tools.h} +0 -0
@@ -134,9 +134,9 @@ void fvec_argsort(size_t n, const float* vals, size_t* perm) {
134
134
  }
135
135
 
136
136
  void fvec_argsort_parallel(size_t n, const float* vals, size_t* perm) {
137
- size_t* perm2 = new size_t[n];
137
+ std::vector<size_t> perm2(n);
138
138
  // 2 result tables, during merging, flip between them
139
- size_t *permB = perm2, *permA = perm;
139
+ size_t *permB = perm2.data(), *permA = perm;
140
140
 
141
141
  int nt = omp_get_max_threads();
142
142
  { // prepare correct permutation so that the result ends in perm
@@ -148,8 +148,8 @@ void fvec_argsort_parallel(size_t n, const float* vals, size_t* perm) {
148
148
  }
149
149
  }
150
150
 
151
- #pragma omp parallel
152
- for (size_t i = 0; i < n; i++) {
151
+ #pragma omp parallel for
152
+ for (int64_t i = 0; i < static_cast<int64_t>(n); i++) {
153
153
  permA[i] = i;
154
154
  }
155
155
 
@@ -184,7 +184,6 @@ void fvec_argsort_parallel(size_t n, const float* vals, size_t* perm) {
184
184
  } else {
185
185
  int t0 = s * sub_nt / sub_nseg1;
186
186
  int t1 = (s + 1) * sub_nt / sub_nseg1;
187
- printf("merge %d %d, %d threads\n", s, s + 1, t1 - t0);
188
187
  parallel_merge(
189
188
  permA, permB, segs[s], segs[s + 1], t1 - t0, comp);
190
189
  }
@@ -197,7 +196,6 @@ void fvec_argsort_parallel(size_t n, const float* vals, size_t* perm) {
197
196
  }
198
197
  assert(permA == perm);
199
198
  omp_set_nested(prev_nested);
200
- delete[] perm2;
201
199
  }
202
200
 
203
201
  /*****************************************************************************
@@ -226,7 +224,7 @@ void bucket_sort_ref(
226
224
  for (size_t i = 0; i < vmax; i++) {
227
225
  lims[i + 1] += lims[i];
228
226
  }
229
- FAISS_THROW_IF_NOT(lims[vmax] == nval);
227
+ FAISS_THROW_IF_NOT(static_cast<size_t>(lims[vmax]) == nval);
230
228
  double t2 = getmillisecs();
231
229
  // populate buckets
232
230
  for (size_t i = 0; i < nval; i++) {
@@ -286,7 +284,7 @@ void bucket_sort_parallel(
286
284
  for (size_t i = 0; i < vmax; i++) {
287
285
  lims[i + 1] += lims[i];
288
286
  }
289
- FAISS_THROW_IF_NOT(lims[vmax] == nval);
287
+ FAISS_THROW_IF_NOT(static_cast<size_t>(lims[vmax]) == nval);
290
288
  }
291
289
  #pragma omp barrier
292
290
 
@@ -341,7 +339,8 @@ void bucket_sort_inplace_ref(
341
339
  double t0 = getmillisecs();
342
340
  size_t nval = nrow * ncol;
343
341
  FAISS_THROW_IF_NOT(
344
- nbucket < nval); // unclear what would happen in this case...
342
+ static_cast<size_t>(nbucket) <
343
+ nval); // unclear what would happen in this case...
345
344
 
346
345
  memset(lims, 0, sizeof(*lims) * (nbucket + 1));
347
346
  for (size_t i = 0; i < nval; i++) {
@@ -350,14 +349,14 @@ void bucket_sort_inplace_ref(
350
349
  }
351
350
  double t1 = getmillisecs();
352
351
  // compute cumulative sum
353
- for (size_t i = 0; i < nbucket; i++) {
352
+ for (size_t i = 0; i < static_cast<size_t>(nbucket); i++) {
354
353
  lims[i + 1] += lims[i];
355
354
  }
356
- FAISS_THROW_IF_NOT(lims[nbucket] == nval);
355
+ FAISS_THROW_IF_NOT(static_cast<size_t>(lims[nbucket]) == nval);
357
356
  double t2 = getmillisecs();
358
357
 
359
358
  std::vector<size_t> ptrs(nbucket);
360
- for (size_t i = 0; i < nbucket; i++) {
359
+ for (size_t i = 0; i < static_cast<size_t>(nbucket); i++) {
361
360
  ptrs[i] = lims[i];
362
361
  }
363
362
 
@@ -378,7 +377,8 @@ void bucket_sort_inplace_ref(
378
377
  } else {
379
378
  // start new loop
380
379
  for (; init_bucket_no < nbucket; init_bucket_no++) {
381
- if (ptrs[init_bucket_no] < lims[init_bucket_no + 1]) {
380
+ if (ptrs[init_bucket_no] <
381
+ static_cast<size_t>(lims[init_bucket_no + 1])) {
382
382
  break;
383
383
  }
384
384
  }
@@ -390,7 +390,7 @@ void bucket_sort_inplace_ref(
390
390
  }
391
391
  }
392
392
 
393
- for (size_t i = 0; i < nbucket; i++) {
393
+ for (size_t i = 0; i < static_cast<size_t>(nbucket); i++) {
394
394
  assert(ptrs[i] == lims[i + 1]);
395
395
  }
396
396
  double t3 = getmillisecs();
@@ -407,8 +407,8 @@ struct ToWrite {
407
407
  std::vector<TI> rows;
408
408
  std::vector<size_t> lims;
409
409
 
410
- explicit ToWrite(TI nbucket) : nbucket(nbucket) {
411
- lims.resize(nbucket + 1);
410
+ explicit ToWrite(TI nbucket_in) : nbucket(nbucket_in) {
411
+ lims.resize(nbucket_in + 1);
412
412
  }
413
413
 
414
414
  /// add one element (row) to write in bucket b
@@ -428,7 +428,7 @@ struct ToWrite {
428
428
  lims[buckets[i] + 1]++;
429
429
  }
430
430
  // compute cumulative sum
431
- for (size_t i = 0; i < nbucket; i++) {
431
+ for (size_t i = 0; i < static_cast<size_t>(nbucket); i++) {
432
432
  lims[i + 1] += lims[i];
433
433
  }
434
434
  FAISS_THROW_IF_NOT(lims[nbucket] == buckets.size());
@@ -466,7 +466,8 @@ void bucket_sort_inplace_parallel(
466
466
  std::vector<ToWrite<TI>> all_to_write;
467
467
  size_t nval = nrow * ncol;
468
468
  FAISS_THROW_IF_NOT(
469
- nbucket < nval); // unclear what would happen in this case...
469
+ static_cast<size_t>(nbucket) <
470
+ nval); // unclear what would happen in this case...
470
471
 
471
472
  // try to keep size of all_to_write < 5GiB
472
473
  // but we need at least one element per bucket
@@ -498,7 +499,7 @@ void bucket_sort_inplace_parallel(
498
499
  }
499
500
  #pragma omp critical
500
501
  { // accumulate histograms (not shifted indices to prepare cumsum)
501
- for (size_t i = 0; i < nbucket; i++) {
502
+ for (size_t i = 0; i < static_cast<size_t>(nbucket); i++) {
502
503
  lims[i + 1] += local_lims[i];
503
504
  }
504
505
  all_to_write.push_back(ToWrite<TI>(nbucket));
@@ -511,10 +512,10 @@ void bucket_sort_inplace_parallel(
511
512
  #pragma omp master
512
513
  {
513
514
  // compute cumulative sum
514
- for (size_t i = 0; i < nbucket; i++) {
515
+ for (size_t i = 0; i < static_cast<size_t>(nbucket); i++) {
515
516
  lims[i + 1] += lims[i];
516
517
  }
517
- FAISS_THROW_IF_NOT(lims[nbucket] == nval);
518
+ FAISS_THROW_IF_NOT(static_cast<size_t>(lims[nbucket]) == nval);
518
519
  // at this point lims is final (read only!)
519
520
 
520
521
  memcpy(ptrs.data(), lims, sizeof(lims[0]) * nbucket);
@@ -559,19 +560,22 @@ void bucket_sort_inplace_parallel(
559
560
  printf("ROUND %d n_to_write=%zd\n", round, n_to_write);
560
561
  }
561
562
  if (verbose > 2) {
562
- for (size_t b = 0; b < nbucket; b++) {
563
+ for (size_t b = 0; b < static_cast<size_t>(nbucket); b++) {
563
564
  printf(" b=%zd [", b);
564
- for (size_t i = lims[b]; i < lims[b + 1]; i++) {
565
+ for (size_t i = static_cast<size_t>(lims[b]);
566
+ i < static_cast<size_t>(lims[b + 1]);
567
+ i++) {
565
568
  printf(" %s%d",
566
569
  ptrs[b] == i ? ">" : "",
567
570
  int(vals[i]));
568
571
  }
569
572
  printf(" %s] %s\n",
570
- ptrs[b] == lims[b + 1] ? ">" : "",
573
+ ptrs[b] == static_cast<size_t>(lims[b + 1]) ? ">"
574
+ : "",
571
575
  did_wrap[b] ? "w" : "");
572
576
  }
573
577
  printf("To write\n");
574
- for (size_t b = 0; b < nbucket; b++) {
578
+ for (size_t b = 0; b < static_cast<size_t>(nbucket); b++) {
575
579
  printf(" b=%zd ", b);
576
580
  const char* sep = "[";
577
581
  for (const ToWrite<TI>& to_write_2 : all_to_write) {
@@ -609,7 +613,7 @@ void bucket_sort_inplace_parallel(
609
613
  rank,
610
614
  idx);
611
615
  }
612
- if (idx < lims[b + 1]) {
616
+ if (idx < static_cast<size_t>(lims[b + 1])) {
613
617
  ptrs[b]++;
614
618
  } else {
615
619
  // wrapping around
@@ -709,7 +713,7 @@ inline int64_t hash_function(int64_t x) {
709
713
  void hashtable_int64_to_int64_init(int log2_capacity, int64_t* tab) {
710
714
  size_t capacity = (size_t)1 << log2_capacity;
711
715
  #pragma omp parallel for
712
- for (int64_t i = 0; i < capacity; i++) {
716
+ for (int64_t i = 0; i < static_cast<int64_t>(capacity); i++) {
713
717
  tab[2 * i] = -1;
714
718
  tab[2 * i + 1] = -1;
715
719
  }
@@ -729,7 +733,7 @@ void hashtable_int64_to_int64_add(
729
733
  size_t nbucket = (size_t)1 << log2_nbucket;
730
734
 
731
735
  #pragma omp parallel for
732
- for (int64_t i = 0; i < n; i++) {
736
+ for (int64_t i = 0; i < static_cast<int64_t>(n); i++) {
733
737
  hk[i] = hash_function(keys[i]) & mask;
734
738
  bucket_no[i] = hk[i] >> (log2_capacity - log2_nbucket);
735
739
  }
@@ -746,11 +750,13 @@ void hashtable_int64_to_int64_add(
746
750
 
747
751
  int num_errors = 0;
748
752
  #pragma omp parallel for reduction(+ : num_errors)
749
- for (int64_t bucket = 0; bucket < nbucket; bucket++) {
753
+ for (int64_t bucket = 0; bucket < static_cast<int64_t>(nbucket); bucket++) {
750
754
  size_t k0 = bucket << (log2_capacity - log2_nbucket);
751
755
  size_t k1 = (bucket + 1) << (log2_capacity - log2_nbucket);
752
756
 
753
- for (size_t i = lims[bucket]; i < lims[bucket + 1]; i++) {
757
+ for (size_t i = static_cast<size_t>(lims[bucket]);
758
+ i < static_cast<size_t>(lims[bucket + 1]);
759
+ i++) {
754
760
  int64_t j = perm[i];
755
761
  assert(bucket_no[j] == bucket);
756
762
  assert(hk[j] >= k0 && hk[j] < k1);
@@ -768,7 +774,8 @@ void hashtable_int64_to_int64_add(
768
774
  if (slot == k1) {
769
775
  slot = k0;
770
776
  }
771
- if (slot == hk[j]) { // no free slot left in bucket
777
+ if (slot ==
778
+ static_cast<size_t>(hk[j])) { // no free slot left in bucket
772
779
  num_errors++;
773
780
  break;
774
781
  }
@@ -793,20 +800,24 @@ void hashtable_int64_to_int64_lookup(
793
800
  int log2_nbucket = log2_capacity_to_log2_nbucket(log2_capacity);
794
801
 
795
802
  #pragma omp parallel for
796
- for (int64_t i = 0; i < n; i++) {
803
+ for (int64_t i = 0; i < static_cast<int64_t>(n); i++) {
797
804
  int64_t k = keys[i];
798
- int64_t hk = hash_function(k) & mask;
799
- size_t slot = hk;
805
+ int64_t hk_i = hash_function(k) & mask;
806
+ size_t slot = hk_i;
800
807
 
801
808
  if (tab[2 * slot] == -1) { // not in table
802
809
  vals[i] = -1;
803
810
  } else if (tab[2 * slot] == k) { // found!
804
811
  vals[i] = tab[2 * slot + 1];
805
812
  } else { // need to search in [k0, k1)
806
- size_t bucket = hk >> (log2_capacity - log2_nbucket);
813
+ size_t bucket = hk_i >> (log2_capacity - log2_nbucket);
807
814
  size_t k0 = bucket << (log2_capacity - log2_nbucket);
808
815
  size_t k1 = (bucket + 1) << (log2_capacity - log2_nbucket);
809
816
  for (;;) {
817
+ if (tab[slot * 2] == -1) { // empty slot, key not in table
818
+ vals[i] = -1;
819
+ break;
820
+ }
810
821
  if (tab[slot * 2] == k) { // found!
811
822
  vals[i] = tab[2 * slot + 1];
812
823
  break;
@@ -815,7 +826,8 @@ void hashtable_int64_to_int64_lookup(
815
826
  if (slot == k1) {
816
827
  slot = k0;
817
828
  }
818
- if (slot == hk) { // bucket is full and not found
829
+ if (slot ==
830
+ static_cast<size_t>(hk_i)) { // bucket is full and not found
819
831
  vals[i] = -1;
820
832
  break;
821
833
  }
@@ -8,6 +8,7 @@
8
8
  // -*- c++ -*-
9
9
 
10
10
  #include <faiss/Index.h>
11
+ #include <faiss/utils/simd_levels.h>
11
12
  #include <faiss/utils/utils.h>
12
13
 
13
14
  #include <cassert>
@@ -115,16 +116,22 @@ std::string get_compile_options() {
115
116
  options += "OPTIMIZE ";
116
117
  #endif
117
118
 
118
- #ifdef __AVX512F__
119
- options += "AVX512 ";
120
- #elif defined(__AVX2__)
121
- options += "AVX2 ";
122
- #elif defined(__ARM_FEATURE_SVE)
123
- options += "SVE NEON ";
124
- #elif defined(__aarch64__)
125
- options += "NEON ";
119
+ #ifdef FAISS_ENABLE_DD
120
+ // Dynamic Dispatch mode: report DD and all available SIMD levels
121
+ options += "DD ";
122
+ int supported = SIMDConfig::supported_simd_levels;
123
+ for (int i = 0; i < static_cast<int>(SIMDLevel::COUNT); ++i) {
124
+ auto level = static_cast<SIMDLevel>(i);
125
+ if ((supported & (1 << i)) && level != SIMDLevel::NONE) {
126
+ options += to_string(level) + " ";
127
+ }
128
+ }
126
129
  #else
127
- options += "GENERIC ";
130
+ // Static mode: report the compiled-in SIMD level
131
+ SIMDLevel level = SIMDConfig::get_level();
132
+ if (level != SIMDLevel::NONE) {
133
+ options += to_string(level) + " ";
134
+ }
128
135
  #endif
129
136
 
130
137
  #ifdef FAISS_ENABLE_SVS
@@ -180,7 +187,7 @@ size_t get_mem_usage_kb() {
180
187
  char buf[256];
181
188
  if (!fgets(buf, 256, f))
182
189
  break;
183
- if (sscanf(buf, "VmRSS: %ld kB", &sz) == 1)
190
+ if (sscanf(buf, "VmRSS: %zu kB", &sz) == 1)
184
191
  break;
185
192
  }
186
193
  fclose(f);
@@ -300,7 +307,7 @@ size_t merge_result_table_with(
300
307
  std::vector<float> tmpD(k);
301
308
 
302
309
  #pragma omp for
303
- for (int64_t i = 0; i < n; i++) {
310
+ for (int64_t i = 0; i < static_cast<int64_t>(n); i++) {
304
311
  int64_t* lI0 = I0 + i * k;
305
312
  float* lD0 = D0 + i * k;
306
313
  const int64_t* lI1 = I1 + i * k;
@@ -430,10 +437,10 @@ void bincode_hist(size_t n, size_t nbits, const uint8_t* codes, int* hist) {
430
437
  std::vector<int> accu(d * 256);
431
438
  const uint8_t* c = codes;
432
439
  for (size_t i = 0; i < n; i++)
433
- for (int j = 0; j < d; j++)
440
+ for (size_t j = 0; j < d; j++)
434
441
  accu[j * 256 + *c++]++;
435
442
  memset(hist, 0, sizeof(*hist) * nbits);
436
- for (int i = 0; i < d; i++) {
443
+ for (size_t i = 0; i < d; i++) {
437
444
  const int* ai = accu.data() + i * 256;
438
445
  int* hi = hist + i * 8;
439
446
  for (int j = 0; j < 256; j++)
@@ -493,7 +500,7 @@ const float* fvecs_maybe_subsample(
493
500
  std::vector<int> subset(*n);
494
501
  rand_perm(subset.data(), *n, seed);
495
502
  float* x_subset = new float[n2 * d];
496
- for (int64_t i = 0; i < n2; i++)
503
+ for (int64_t i = 0; i < static_cast<int64_t>(n2); i++)
497
504
  memcpy(&x_subset[i * d], &x[subset[i] * size_t(d)], sizeof(x[0]) * d);
498
505
  *n = n2;
499
506
  return x_subset;
@@ -172,8 +172,8 @@ struct CombinerRangeKNN {
172
172
  T r2; /// range search radius
173
173
  bool keep_max; /// whether to keep max values instead of min.
174
174
 
175
- CombinerRangeKNN(int64_t nq, size_t k, T r2, bool keep_max)
176
- : nq(nq), k(k), r2(r2), keep_max(keep_max) {}
175
+ CombinerRangeKNN(int64_t nq_in, size_t k_in, T r2_in, bool keep_max_in)
176
+ : nq(nq_in), k(k_in), r2(r2_in), keep_max(keep_max_in) {}
177
177
 
178
178
  /// Knn search results
179
179
  const int64_t* I = nullptr; /// size nq * k
@@ -200,7 +200,7 @@ struct CodeSet {
200
200
  size_t d;
201
201
  std::set<std::vector<uint8_t>> s;
202
202
 
203
- explicit CodeSet(size_t d) : d(d) {}
203
+ explicit CodeSet(size_t d_in) : d(d_in) {}
204
204
  void insert(size_t n, const uint8_t* codes, bool* inserted);
205
205
  };
206
206