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
@@ -26,10 +26,10 @@ namespace faiss {
26
26
  ********************************************************************/
27
27
 
28
28
  IndexScalarQuantizer::IndexScalarQuantizer(
29
- int d,
29
+ int d_in,
30
30
  ScalarQuantizer::QuantizerType qtype,
31
31
  MetricType metric)
32
- : IndexFlatCodes(0, d, metric), sq(d, qtype) {
32
+ : IndexFlatCodes(0, d_in, metric), sq(d_in, qtype) {
33
33
  is_trained = qtype == ScalarQuantizer::QT_fp16 ||
34
34
  qtype == ScalarQuantizer::QT_8bit_direct ||
35
35
  qtype == ScalarQuantizer::QT_bf16 ||
@@ -117,21 +117,26 @@ void IndexScalarQuantizer::sa_decode(idx_t n, const uint8_t* bytes, float* x)
117
117
  ********************************************************************/
118
118
 
119
119
  IndexIVFScalarQuantizer::IndexIVFScalarQuantizer(
120
- Index* quantizer,
121
- size_t d,
122
- size_t nlist,
120
+ Index* quantizer_,
121
+ size_t d_,
122
+ size_t nlist_,
123
123
  ScalarQuantizer::QuantizerType qtype,
124
124
  MetricType metric,
125
- bool by_residual,
126
- bool own_invlists)
127
- : IndexIVF(quantizer, d, nlist, 0, metric, own_invlists), sq(d, qtype) {
125
+ bool by_residual_,
126
+ bool own_invlists_)
127
+ : IndexIVF(quantizer_, d_, nlist_, 0, metric, own_invlists_),
128
+ sq(d_, qtype) {
128
129
  code_size = sq.code_size;
129
- this->by_residual = by_residual;
130
+ this->by_residual = by_residual_;
130
131
  if (invlists) {
131
132
  // was not known at construction time
132
133
  invlists->code_size = code_size;
133
134
  }
134
135
  is_trained = false;
136
+ if (qtype == ScalarQuantizer::QT_0bit) {
137
+ by_residual = false;
138
+ is_trained = true; // no training needed
139
+ }
135
140
  }
136
141
 
137
142
  IndexIVFScalarQuantizer::IndexIVFScalarQuantizer() : IndexIVF() {
@@ -141,7 +146,7 @@ IndexIVFScalarQuantizer::IndexIVFScalarQuantizer() : IndexIVF() {
141
146
  void IndexIVFScalarQuantizer::train_encoder(
142
147
  idx_t n,
143
148
  const float* x,
144
- const idx_t* assign) {
149
+ const idx_t* /*assign*/) {
145
150
  sq.train(n, x);
146
151
  }
147
152
 
@@ -155,6 +160,19 @@ void IndexIVFScalarQuantizer::encode_vectors(
155
160
  const idx_t* list_nos,
156
161
  uint8_t* codes,
157
162
  bool include_listnos) const {
163
+ if (sq.code_size == 0) {
164
+ // QT_0bit: nothing to encode, but handle coarse codes if needed
165
+ if (include_listnos) {
166
+ size_t coarse_size = coarse_code_size();
167
+ for (idx_t i = 0; i < n; i++) {
168
+ int64_t list_no = list_nos[i];
169
+ if (list_no >= 0) {
170
+ encode_listno(list_no, codes + i * coarse_size);
171
+ }
172
+ }
173
+ }
174
+ return;
175
+ }
158
176
  std::unique_ptr<ScalarQuantizer::SQuantizer> squant(sq.select_quantizer());
159
177
  size_t coarse_size = include_listnos ? coarse_code_size() : 0;
160
178
  memset(codes, 0, (code_size + coarse_size) * n);
@@ -185,14 +203,42 @@ void IndexIVFScalarQuantizer::encode_vectors(
185
203
  void IndexIVFScalarQuantizer::decode_vectors(
186
204
  idx_t n,
187
205
  const uint8_t* codes,
188
- const idx_t*,
206
+ const idx_t* list_nos,
189
207
  float* x) const {
208
+ if (sq.code_size == 0 && list_nos) {
209
+ // QT_0bit: reconstruct centroids if list_nos provided
210
+ for (idx_t i = 0; i < n; i++) {
211
+ quantizer->reconstruct(list_nos[i], x + i * d);
212
+ }
213
+ return;
214
+ }
190
215
  FAISS_THROW_IF_NOT(is_trained);
191
- return sq.decode(codes, x, n);
216
+ sq.decode(codes, x, n);
217
+ if (by_residual) {
218
+ FAISS_THROW_IF_NOT_MSG(
219
+ list_nos, "decode_vectors with by_residual requires list_nos");
220
+ #pragma omp parallel for if (n > 1000)
221
+ for (idx_t i = 0; i < n; i++) {
222
+ std::vector<float> centroid(d);
223
+ quantizer->reconstruct(list_nos[i], centroid.data());
224
+ for (size_t j = 0; j < static_cast<size_t>(d); j++) {
225
+ x[i * d + j] += centroid[j];
226
+ }
227
+ }
228
+ }
192
229
  }
193
230
 
194
231
  void IndexIVFScalarQuantizer::sa_decode(idx_t n, const uint8_t* codes, float* x)
195
232
  const {
233
+ if (sq.code_size == 0) {
234
+ size_t coarse_size = coarse_code_size();
235
+ for (idx_t i = 0; i < n; i++) {
236
+ const uint8_t* code = codes + i * coarse_size;
237
+ int64_t list_no = decode_listno(code);
238
+ quantizer->reconstruct(list_no, x + i * d);
239
+ }
240
+ return;
241
+ }
196
242
  std::unique_ptr<ScalarQuantizer::SQuantizer> squant(sq.select_quantizer());
197
243
  size_t coarse_size = coarse_code_size();
198
244
 
@@ -208,7 +254,7 @@ void IndexIVFScalarQuantizer::sa_decode(idx_t n, const uint8_t* codes, float* x)
208
254
  squant->decode_vector(code + coarse_size, xi);
209
255
  if (by_residual) {
210
256
  quantizer->reconstruct(list_no, residual.data());
211
- for (size_t j = 0; j < d; j++) {
257
+ for (size_t j = 0; j < static_cast<size_t>(d); j++) {
212
258
  xi[j] += residual[j];
213
259
  }
214
260
  }
@@ -223,6 +269,23 @@ void IndexIVFScalarQuantizer::add_core(
223
269
  const idx_t* coarse_idx,
224
270
  void* inverted_list_context) {
225
271
  FAISS_THROW_IF_NOT(is_trained);
272
+ if (sq.code_size == 0) {
273
+ // QT_0bit: just add IDs with empty codes
274
+ uint8_t dummy_code = 0;
275
+ DirectMapAdd dm_add(direct_map, n, xids);
276
+ for (idx_t i = 0; i < n; i++) {
277
+ int64_t list_no = coarse_idx[i];
278
+ if (list_no >= 0) {
279
+ int64_t id = xids ? xids[i] : ntotal + i;
280
+ size_t ofs = invlists->add_entry(list_no, id, &dummy_code);
281
+ dm_add.add(i, list_no, ofs);
282
+ } else {
283
+ dm_add.add(i, -1, 0);
284
+ }
285
+ }
286
+ ntotal += n;
287
+ return;
288
+ }
226
289
 
227
290
  std::unique_ptr<ScalarQuantizer::SQuantizer> squant(sq.select_quantizer());
228
291
 
@@ -236,7 +299,7 @@ void IndexIVFScalarQuantizer::add_core(
236
299
  int rank = omp_get_thread_num();
237
300
 
238
301
  // each thread takes care of a subset of lists
239
- for (size_t i = 0; i < n; i++) {
302
+ for (idx_t i = 0; i < n; i++) {
240
303
  int64_t list_no = coarse_idx[i];
241
304
  if (list_no >= 0 && list_no % nt == rank) {
242
305
  int64_t id = xids ? xids[i] : ntotal + i;
@@ -276,6 +339,11 @@ void IndexIVFScalarQuantizer::reconstruct_from_offset(
276
339
  int64_t list_no,
277
340
  int64_t offset,
278
341
  float* recons) const {
342
+ if (sq.code_size == 0) {
343
+ // QT_0bit: reconstruct from centroid
344
+ quantizer->reconstruct(list_no, recons);
345
+ return;
346
+ }
279
347
  const uint8_t* code = invlists->get_single_code(list_no, offset);
280
348
 
281
349
  if (by_residual) {
@@ -22,7 +22,7 @@ namespace {
22
22
 
23
23
  // IndexBinary needs to update the code_size when d is set...
24
24
 
25
- void sync_d(Index* index) {}
25
+ void sync_d(Index* /*index*/) {}
26
26
 
27
27
  void sync_d(IndexBinary* index) {
28
28
  FAISS_THROW_IF_NOT(index->d % 8 == 0);
@@ -46,38 +46,38 @@ void translate_labels(int64_t n, idx_t* labels, int64_t translation) {
46
46
 
47
47
  template <typename IndexT>
48
48
  IndexShardsTemplate<IndexT>::IndexShardsTemplate(
49
- idx_t d,
49
+ idx_t d_,
50
50
  bool threaded,
51
- bool successive_ids)
52
- : ThreadedIndex<IndexT>(d, threaded), successive_ids(successive_ids) {
51
+ bool successive_ids_)
52
+ : ThreadedIndex<IndexT>(static_cast<int>(d_), threaded),
53
+ successive_ids(successive_ids_) {
53
54
  sync_d(this);
54
55
  }
55
56
 
56
57
  template <typename IndexT>
57
58
  IndexShardsTemplate<IndexT>::IndexShardsTemplate(
58
- int d,
59
+ int d_,
59
60
  bool threaded,
60
- bool successive_ids)
61
- : ThreadedIndex<IndexT>(d, threaded), successive_ids(successive_ids) {
61
+ bool successive_ids_)
62
+ : ThreadedIndex<IndexT>(d_, threaded), successive_ids(successive_ids_) {
62
63
  sync_d(this);
63
64
  }
64
65
 
65
66
  template <typename IndexT>
66
67
  IndexShardsTemplate<IndexT>::IndexShardsTemplate(
67
68
  bool threaded,
68
- bool successive_ids)
69
- : ThreadedIndex<IndexT>(threaded), successive_ids(successive_ids) {
69
+ bool successive_ids_)
70
+ : ThreadedIndex<IndexT>(threaded), successive_ids(successive_ids_) {
70
71
  sync_d(this);
71
72
  }
72
73
 
73
74
  template <typename IndexT>
74
- void IndexShardsTemplate<IndexT>::onAfterAddIndex(IndexT* index /* unused */) {
75
+ void IndexShardsTemplate<IndexT>::onAfterAddIndex(IndexT* /*index*/) {
75
76
  syncWithSubIndexes();
76
77
  }
77
78
 
78
79
  template <typename IndexT>
79
- void IndexShardsTemplate<IndexT>::onAfterRemoveIndex(
80
- IndexT* index /* unused */) {
80
+ void IndexShardsTemplate<IndexT>::onAfterRemoveIndex(IndexT* /*index*/) {
81
81
  syncWithSubIndexes();
82
82
  }
83
83
 
@@ -203,7 +203,7 @@ void IndexShardsTemplate<IndexT>::search(
203
203
  const SearchParameters* params) const {
204
204
  FAISS_THROW_IF_NOT(k > 0);
205
205
 
206
- int64_t nshard = this->count();
206
+ int nshard = this->count();
207
207
 
208
208
  std::vector<distance_t> all_distances(nshard * k * n);
209
209
  std::vector<idx_t> all_labels(nshard * k * n);
@@ -43,13 +43,14 @@ void translate_labels(int64_t n, idx_t* labels, int64_t translation) {
43
43
  ************************************************************/
44
44
 
45
45
  IndexShardsIVF::IndexShardsIVF(
46
- Index* quantizer,
47
- size_t nlist,
46
+ Index* quantizer_,
47
+ size_t nlist_,
48
48
  bool threaded,
49
- bool successive_ids)
50
- : IndexShardsTemplate<Index>(quantizer->d, threaded, successive_ids),
51
- Level1Quantizer(quantizer, nlist) {
52
- is_trained = quantizer->is_trained && quantizer->ntotal == nlist;
49
+ bool successive_ids_)
50
+ : IndexShardsTemplate<Index>(quantizer_->d, threaded, successive_ids_),
51
+ Level1Quantizer(quantizer_, nlist_) {
52
+ is_trained = quantizer_->is_trained &&
53
+ quantizer_->ntotal == static_cast<idx_t>(nlist_);
53
54
  }
54
55
 
55
56
  void IndexShardsIVF::addIndex(Index* index) {
@@ -73,11 +74,11 @@ void IndexShardsIVF::train(idx_t n, const component_t* x) {
73
74
  for (size_t i = 0; i < indices_.size(); i++) {
74
75
  Index* index = indices_[i].first;
75
76
  auto index_ivf = dynamic_cast<IndexIVFInterface*>(index);
76
- Index* quantizer = index_ivf->quantizer;
77
- if (!quantizer->is_trained) {
78
- quantizer->train(nlist, centroids.data());
77
+ Index* sub_quantizer = index_ivf->quantizer;
78
+ if (!sub_quantizer->is_trained) {
79
+ sub_quantizer->train(nlist, centroids.data());
79
80
  }
80
- quantizer->add(nlist, centroids.data());
81
+ sub_quantizer->add(nlist, centroids.data());
81
82
  // finish training
82
83
  index->train(n, x);
83
84
  }
@@ -132,9 +133,9 @@ void IndexShardsIVF::add_with_ids(
132
133
  }
133
134
  ids = aids.data();
134
135
  }
135
- idx_t d = this->d;
136
+ idx_t cur_d = this->d;
136
137
 
137
- auto fn = [n, ids, x, nshard, d, Iq](int no, Index* index) {
138
+ auto fn = [n, ids, x, nshard, cur_d, Iq](int no, Index* index) {
138
139
  idx_t i0 = (idx_t)no * n / nshard;
139
140
  idx_t i1 = ((idx_t)no + 1) * n / nshard;
140
141
  auto index_ivf = dynamic_cast<IndexIVF*>(index);
@@ -144,7 +145,10 @@ void IndexShardsIVF::add_with_ids(
144
145
  }
145
146
 
146
147
  index_ivf->add_core(
147
- i1 - i0, x + i0 * d, ids ? ids + i0 : nullptr, Iq.data() + i0);
148
+ i1 - i0,
149
+ x + i0 * cur_d,
150
+ ids ? ids + i0 : nullptr,
151
+ Iq.data() + i0);
148
152
 
149
153
  if (index->verbose) {
150
154
  printf("end add shard %d on %" PRId64 " points\n", no, i1 - i0);
@@ -179,7 +183,7 @@ void IndexShardsIVF::search(
179
183
 
180
184
  quantizer->search(n, x, nprobe, Dq.data(), Iq.data());
181
185
 
182
- int64_t nshard = this->count();
186
+ int nshard = this->count();
183
187
 
184
188
  std::vector<distance_t> all_distances(nshard * k * n);
185
189
  std::vector<idx_t> all_labels(nshard * k * n);
@@ -199,7 +203,9 @@ void IndexShardsIVF::search(
199
203
 
200
204
  auto index = dynamic_cast<const IndexIVFInterface*>(indexIn);
201
205
 
202
- FAISS_THROW_IF_NOT_MSG(index->nprobe == nprobe, "inconsistent nprobe");
206
+ FAISS_THROW_IF_NOT_MSG(
207
+ index->nprobe == static_cast<size_t>(nprobe),
208
+ "inconsistent nprobe");
203
209
 
204
210
  index->search_preassigned(
205
211
  n,
@@ -52,7 +52,7 @@ void MatrixStats::PerDimStats::compute_mean_std() {
52
52
  if (var < 0) {
53
53
  var = 0;
54
54
  }
55
- stddev = sqrt(var);
55
+ stddev = std::sqrt(var);
56
56
  }
57
57
 
58
58
  void MatrixStats::do_comment(const char* fmt, ...) {
@@ -67,7 +67,8 @@ void MatrixStats::do_comment(const char* fmt, ...) {
67
67
  buf += size;
68
68
  }
69
69
 
70
- MatrixStats::MatrixStats(size_t n, size_t d, const float* x) : n(n), d(d) {
70
+ MatrixStats::MatrixStats(size_t n_in, size_t d_in, const float* x)
71
+ : n(n_in), d(d_in) {
71
72
  std::vector<char> comment_buf(10000);
72
73
  buf = comment_buf.data();
73
74
  nbuf = comment_buf.size();
@@ -162,8 +163,8 @@ MatrixStats::MatrixStats(size_t n, size_t d, const float* x) : n(n), d(d) {
162
163
  }
163
164
 
164
165
  { // norm stats
165
- min_norm2 = sqrt(min_norm2);
166
- max_norm2 = sqrt(max_norm2);
166
+ min_norm2 = std::sqrt(min_norm2);
167
+ max_norm2 = std::sqrt(max_norm2);
167
168
  do_comment(
168
169
  "range of L2 norms=[%g, %g] (%zd null vectors)\n",
169
170
  min_norm2,
@@ -27,8 +27,8 @@ namespace faiss {
27
27
  * IndexSplitVectors implementation
28
28
  *******************************************************/
29
29
 
30
- IndexSplitVectors::IndexSplitVectors(idx_t d, bool threaded)
31
- : Index(d), own_fields(false), threaded(threaded), sum_d(0) {}
30
+ IndexSplitVectors::IndexSplitVectors(idx_t d_in, bool threaded_in)
31
+ : Index(d_in), own_fields(false), threaded(threaded_in), sum_d(0) {}
32
32
 
33
33
  void IndexSplitVectors::add_sub_index(Index* index) {
34
34
  sub_indexes.push_back(index);
@@ -44,7 +44,7 @@ void IndexSplitVectors::sync_with_sub_indexes() {
44
44
  metric_type = index0->metric_type;
45
45
  is_trained = index0->is_trained;
46
46
  ntotal = index0->ntotal;
47
- for (int i = 1; i < sub_indexes.size(); i++) {
47
+ for (size_t i = 1; i < sub_indexes.size(); i++) {
48
48
  Index* index = sub_indexes[i];
49
49
  FAISS_THROW_IF_NOT(metric_type == index->metric_type);
50
50
  FAISS_THROW_IF_NOT(ntotal == index->ntotal);
@@ -88,7 +88,7 @@ void IndexSplitVectors::search(
88
88
  n);
89
89
  }
90
90
  const Index* sub_index = index->sub_indexes[no];
91
- int64_t sub_d = sub_index->d, d = index->d;
91
+ int64_t sub_d = sub_index->d;
92
92
  idx_t ofs = 0;
93
93
  for (int i = 0; i < no; i++) {
94
94
  ofs += index->sub_indexes[i]->d;
@@ -107,17 +107,18 @@ void IndexSplitVectors::search(
107
107
  };
108
108
 
109
109
  if (!threaded) {
110
- for (int i = 0; i < nshard; i++) {
111
- query_func(i);
110
+ for (int64_t i = 0; i < nshard; i++) {
111
+ query_func(static_cast<int>(i));
112
112
  }
113
113
  } else {
114
114
  std::vector<std::unique_ptr<WorkerThread>> threads;
115
115
  std::vector<std::future<bool>> v;
116
116
 
117
- for (int i = 0; i < nshard; i++) {
117
+ for (int64_t i = 0; i < nshard; i++) {
118
118
  threads.emplace_back(new WorkerThread());
119
119
  WorkerThread* wt = threads.back().get();
120
- v.emplace_back(wt->add([i, query_func]() { query_func(i); }));
120
+ v.emplace_back(wt->add(
121
+ [i, query_func]() { query_func(static_cast<int>(i)); }));
121
122
  }
122
123
 
123
124
  // Blocking wait for completion
@@ -155,7 +156,7 @@ void IndexSplitVectors::reset() {
155
156
 
156
157
  IndexSplitVectors::~IndexSplitVectors() {
157
158
  if (own_fields) {
158
- for (int s = 0; s < sub_indexes.size(); s++) {
159
+ for (size_t s = 0; s < sub_indexes.size(); s++) {
159
160
  delete sub_indexes[s];
160
161
  }
161
162
  }
@@ -166,12 +167,12 @@ IndexSplitVectors::~IndexSplitVectors() {
166
167
  */
167
168
 
168
169
  IndexRandom::IndexRandom(
169
- idx_t d,
170
- idx_t ntotal,
171
- int64_t seed,
172
- MetricType metric_type)
173
- : Index(d, metric_type), seed(seed) {
174
- this->ntotal = ntotal;
170
+ idx_t d_in,
171
+ idx_t ntotal_in,
172
+ int64_t seed_in,
173
+ MetricType metric_type_in)
174
+ : Index(d_in, metric_type_in), seed(seed_in) {
175
+ this->ntotal = ntotal_in;
175
176
  is_trained = true;
176
177
  }
177
178
 
@@ -216,7 +217,8 @@ void IndexRandom::search(
216
217
  perm[j] = j;
217
218
  }
218
219
  for (int j = 0; j < k; j++) {
219
- std::swap(perm[j], perm[rng.rand_int(ntotal)]);
220
+ std::swap(
221
+ perm[j], perm[rng.rand_int(static_cast<int>(ntotal))]);
220
222
  I[j] = perm[j];
221
223
  }
222
224
  }
@@ -234,7 +236,7 @@ void IndexRandom::search(
234
236
 
235
237
  void IndexRandom::reconstruct(idx_t key, float* recons) const {
236
238
  RandomGenerator rng(seed + 123332 + key);
237
- for (size_t i = 0; i < d; i++) {
239
+ for (int i = 0; i < d; i++) {
238
240
  recons[i] = rng.rand_float();
239
241
  }
240
242
  }
@@ -22,7 +22,7 @@ namespace faiss {
22
22
  * used to distribute a MultiIndexQuantizer
23
23
  */
24
24
  struct IndexSplitVectors : Index {
25
- bool own_fields;
25
+ bool own_fields = false;
26
26
  bool threaded;
27
27
  std::vector<Index*> sub_indexes;
28
28
  idx_t sum_d; /// sum of dimensions seen so far
@@ -12,6 +12,9 @@
12
12
 
13
13
  #include <cstdint>
14
14
  #include <cstdio>
15
+ #include <cstdlib>
16
+
17
+ #include <faiss/impl/FaissAssert.h>
15
18
 
16
19
  namespace faiss {
17
20
 
@@ -20,13 +23,16 @@ namespace faiss {
20
23
  /// Most algorithms support both inner product and L2, with the flat
21
24
  /// (brute-force) indices supporting additional metric types for vector
22
25
  /// comparison.
26
+ ///
27
+ /// NOTE: when adding or removing values, update metric_type_from_int()
28
+ /// and metric_type_count() below.
23
29
  enum MetricType {
24
- METRIC_INNER_PRODUCT = 0, ///< maximum inner product search
25
- METRIC_L2 = 1, ///< squared L2 search
26
- METRIC_L1, ///< L1 (aka cityblock)
27
- METRIC_Linf, ///< infinity distance
28
- METRIC_Lp, ///< L_p distance, p is given by a faiss::Index
29
- /// metric_arg
30
+ METRIC_INNER_PRODUCT, ///< maximum inner product search
31
+ METRIC_L2, ///< squared L2 search
32
+ METRIC_L1, ///< L1 (aka cityblock)
33
+ METRIC_Linf, ///< infinity distance
34
+ METRIC_Lp, ///< L_p distance, p is given by a faiss::Index
35
+ /// metric_arg
30
36
 
31
37
  /// some additional metrics defined in scipy.spatial.distance
32
38
  METRIC_Canberra = 20,
@@ -52,6 +58,23 @@ constexpr bool is_similarity_metric(MetricType metric_type) {
52
58
  (metric_type == METRIC_Jaccard));
53
59
  }
54
60
 
61
+ /// Convert an integer to MetricType with range validation.
62
+ /// Throws FaissException if the value is not a valid MetricType.
63
+ inline MetricType metric_type_from_int(int x) {
64
+ FAISS_THROW_IF_NOT_FMT(
65
+ (x >= METRIC_INNER_PRODUCT && x <= METRIC_Lp) ||
66
+ (x >= METRIC_Canberra && x <= METRIC_GOWER),
67
+ "invalid metric type %d",
68
+ x);
69
+ return static_cast<MetricType>(x);
70
+ }
71
+
72
+ /// Count of entries in the MetricType enum.
73
+ constexpr size_t metric_type_count() {
74
+ return (METRIC_Lp - METRIC_INNER_PRODUCT) + 1 +
75
+ (METRIC_GOWER - METRIC_Canberra) + 1;
76
+ }
77
+
55
78
  } // namespace faiss
56
79
 
57
80
  #endif