faiss 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/ext/faiss/extconf.rb +2 -1
  4. data/ext/faiss/{index_rb.cpp → index.cpp} +1 -1
  5. data/ext/faiss/index_binary.cpp +1 -1
  6. data/ext/faiss/kmeans.cpp +1 -1
  7. data/ext/faiss/pca_matrix.cpp +1 -1
  8. data/ext/faiss/product_quantizer.cpp +1 -1
  9. data/ext/faiss/{utils_rb.cpp → utils.cpp} +1 -1
  10. data/lib/faiss/version.rb +1 -1
  11. data/vendor/faiss/faiss/AutoTune.cpp +93 -80
  12. data/vendor/faiss/faiss/Clustering.cpp +39 -240
  13. data/vendor/faiss/faiss/Clustering.h +6 -0
  14. data/vendor/faiss/faiss/IVFlib.cpp +41 -21
  15. data/vendor/faiss/faiss/Index.cpp +6 -5
  16. data/vendor/faiss/faiss/Index.h +5 -5
  17. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  18. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +49 -37
  19. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  21. data/vendor/faiss/faiss/IndexBinary.cpp +5 -3
  22. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  23. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  24. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  25. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  26. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +84 -92
  27. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  28. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  29. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  30. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +87 -415
  31. data/vendor/faiss/faiss/IndexFastScan.cpp +72 -109
  32. data/vendor/faiss/faiss/IndexFastScan.h +25 -23
  33. data/vendor/faiss/faiss/IndexFlat.cpp +27 -20
  34. data/vendor/faiss/faiss/IndexFlat.h +21 -18
  35. data/vendor/faiss/faiss/IndexFlatCodes.cpp +42 -19
  36. data/vendor/faiss/faiss/IndexHNSW.cpp +283 -145
  37. data/vendor/faiss/faiss/IndexHNSW.h +16 -2
  38. data/vendor/faiss/faiss/IndexIDMap.cpp +25 -21
  39. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  40. data/vendor/faiss/faiss/IndexIVF.cpp +465 -362
  41. data/vendor/faiss/faiss/IndexIVF.h +33 -12
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +96 -93
  44. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -1
  45. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +357 -238
  46. data/vendor/faiss/faiss/IndexIVFFastScan.h +42 -41
  47. data/vendor/faiss/faiss/IndexIVFFlat.cpp +36 -68
  48. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  49. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +53 -30
  50. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  51. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  52. data/vendor/faiss/faiss/IndexIVFPQ.cpp +71 -843
  53. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
  54. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  55. data/vendor/faiss/faiss/IndexIVFPQR.cpp +21 -17
  56. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +26 -39
  57. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +2 -1
  58. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +475 -476
  59. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +248 -93
  60. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  61. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  62. data/vendor/faiss/faiss/IndexLSH.cpp +36 -19
  63. data/vendor/faiss/faiss/IndexLattice.cpp +13 -13
  64. data/vendor/faiss/faiss/IndexNNDescent.cpp +36 -21
  65. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  66. data/vendor/faiss/faiss/IndexNSG.cpp +39 -23
  67. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +31 -11
  68. data/vendor/faiss/faiss/IndexPQ.cpp +128 -221
  69. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  70. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  71. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  72. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  73. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  74. data/vendor/faiss/faiss/IndexRaBitQ.cpp +11 -36
  75. data/vendor/faiss/faiss/IndexRaBitQ.h +2 -1
  76. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +41 -277
  77. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +183 -27
  78. data/vendor/faiss/faiss/IndexRefine.cpp +30 -25
  79. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  80. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  81. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  82. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  83. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
  84. data/vendor/faiss/faiss/IndexShards.cpp +10 -9
  85. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  86. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  87. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  88. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  89. data/vendor/faiss/faiss/MetricType.h +14 -7
  90. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  91. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  92. data/vendor/faiss/faiss/VectorTransform.cpp +237 -149
  93. data/vendor/faiss/faiss/VectorTransform.h +16 -16
  94. data/vendor/faiss/faiss/build.cpp +23 -0
  95. data/vendor/faiss/faiss/build.h +15 -0
  96. data/vendor/faiss/faiss/clone_index.cpp +48 -47
  97. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  98. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  99. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  100. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  101. data/vendor/faiss/faiss/factory_tools.cpp +5 -0
  102. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  103. data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
  104. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
  106. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  107. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  108. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  109. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  110. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  111. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  112. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  113. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  114. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  115. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  116. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
  117. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  118. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
  119. data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
  120. data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
  121. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  122. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  123. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +29 -25
  124. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  125. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  126. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -0
  127. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  128. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  129. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +16 -16
  130. data/vendor/faiss/faiss/impl/CodePacker.cpp +3 -3
  131. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +1 -1
  132. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  133. data/vendor/faiss/faiss/impl/FaissAssert.h +6 -3
  134. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  135. data/vendor/faiss/faiss/impl/HNSW.cpp +92 -317
  136. data/vendor/faiss/faiss/impl/HNSW.h +13 -34
  137. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  138. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  139. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  140. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +82 -77
  141. data/vendor/faiss/faiss/impl/NNDescent.cpp +62 -25
  142. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  143. data/vendor/faiss/faiss/impl/NSG.cpp +38 -21
  144. data/vendor/faiss/faiss/impl/NSG.h +4 -4
  145. data/vendor/faiss/faiss/impl/Panorama.cpp +23 -6
  146. data/vendor/faiss/faiss/impl/Panorama.h +258 -87
  147. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  148. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  149. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +46 -32
  150. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  151. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  152. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  153. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +30 -23
  154. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  155. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +55 -49
  156. data/vendor/faiss/faiss/impl/RaBitQUtils.h +65 -0
  157. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +296 -283
  158. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +26 -23
  159. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  160. data/vendor/faiss/faiss/impl/ResultHandler.h +99 -75
  161. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +52 -4
  162. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -1
  163. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  164. data/vendor/faiss/faiss/impl/VisitedTable.h +7 -0
  165. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  166. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  167. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  168. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  169. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  170. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  171. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  172. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  173. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  174. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  175. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  176. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  177. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  178. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  179. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  180. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  181. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  182. data/vendor/faiss/faiss/impl/expanded_scanners.h +8 -3
  183. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  184. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  185. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  186. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  187. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  188. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
  189. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +169 -2
  190. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  191. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  192. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  193. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  194. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  195. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  196. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -356
  197. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  198. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  199. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +282 -134
  200. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  201. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  202. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
  203. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
  204. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
  205. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
  206. data/vendor/faiss/faiss/impl/index_read.cpp +1132 -45
  207. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
  208. data/vendor/faiss/faiss/impl/index_write.cpp +95 -13
  209. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  210. data/vendor/faiss/faiss/impl/io_macros.h +33 -16
  211. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  212. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +37 -23
  213. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  214. data/vendor/faiss/faiss/impl/mapped_io.cpp +6 -6
  215. data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
  216. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  217. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  218. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  219. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  220. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
  221. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
  222. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
  223. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx2.cpp → pq_code_distance-avx2.h} +9 -13
  224. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx512.cpp → pq_code_distance-avx512.h} +9 -57
  225. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +29 -111
  226. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  227. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +238 -5
  228. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -7
  229. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
  230. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +311 -477
  231. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  232. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +1 -1
  233. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +3 -2
  234. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +102 -11
  235. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +27 -1
  236. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +3 -3
  237. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +148 -0
  238. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +167 -0
  239. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +59 -0
  240. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +163 -0
  241. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
  242. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +192 -8
  243. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +12 -0
  244. data/vendor/faiss/faiss/impl/simd_dispatch.h +100 -66
  245. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  246. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +264 -172
  247. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  248. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  249. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  250. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +270 -218
  251. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  252. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  253. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  254. data/vendor/faiss/faiss/index_factory.cpp +86 -18
  255. data/vendor/faiss/faiss/index_io.h +24 -0
  256. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
  257. data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
  258. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  259. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
  260. data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
  261. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  262. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +13 -13
  263. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  264. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +1 -1
  265. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  266. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  267. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  268. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  269. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  270. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  271. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  272. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
  273. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +18 -2
  274. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
  275. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +12 -3
  276. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +7 -2
  277. data/vendor/faiss/faiss/utils/Heap.cpp +10 -10
  278. data/vendor/faiss/faiss/utils/NeuralNet.cpp +47 -36
  279. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  280. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  281. data/vendor/faiss/faiss/utils/distances.cpp +390 -560
  282. data/vendor/faiss/faiss/utils/distances.h +20 -1
  283. data/vendor/faiss/faiss/utils/distances_dispatch.h +117 -37
  284. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  285. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  286. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  287. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  288. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  289. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  290. data/vendor/faiss/faiss/utils/distances_simd.cpp +5 -177
  291. data/vendor/faiss/faiss/utils/extra_distances.cpp +9 -8
  292. data/vendor/faiss/faiss/utils/extra_distances.h +32 -6
  293. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  294. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  295. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  296. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  297. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
  298. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  299. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  300. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
  301. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
  302. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
  303. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
  304. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
  305. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
  306. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
  307. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
  308. data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
  309. data/vendor/faiss/faiss/utils/partitioning.h +31 -0
  310. data/vendor/faiss/faiss/utils/popcount.h +29 -0
  311. data/vendor/faiss/faiss/utils/pq_code_distance.h +2 -2
  312. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  313. data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
  314. data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
  315. data/vendor/faiss/faiss/utils/rabitq_simd.h +57 -536
  316. data/vendor/faiss/faiss/utils/random.cpp +6 -6
  317. data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
  318. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +5 -1
  319. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +213 -4
  320. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +163 -10
  321. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +250 -4
  322. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +7 -4
  323. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
  324. data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
  325. data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +2 -1
  326. data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
  327. data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
  328. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
  329. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
  330. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
  331. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
  332. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
  333. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  334. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  335. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  336. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  337. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  338. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  339. data/vendor/faiss/faiss/utils/simd_levels.cpp +17 -5
  340. data/vendor/faiss/faiss/utils/simd_levels.h +93 -1
  341. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  342. data/vendor/faiss/faiss/utils/utils.cpp +5 -5
  343. data/vendor/faiss/faiss/utils/utils.h +3 -3
  344. metadata +119 -34
  345. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  346. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  347. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -224
  348. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -230
  349. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  350. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  351. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  352. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  353. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -235
  354. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  355. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  356. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -449
  357. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  358. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  359. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  360. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -365
  361. /data/ext/faiss/{utils_rb.h → utils.h} +0 -0
@@ -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) {
@@ -46,27 +46,28 @@ 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
 
@@ -202,7 +203,7 @@ void IndexShardsTemplate<IndexT>::search(
202
203
  const SearchParameters* params) const {
203
204
  FAISS_THROW_IF_NOT(k > 0);
204
205
 
205
- int64_t nshard = this->count();
206
+ int nshard = this->count();
206
207
 
207
208
  std::vector<distance_t> all_distances(nshard * k * n);
208
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
@@ -24,14 +24,15 @@ namespace faiss {
24
24
  /// (brute-force) indices supporting additional metric types for vector
25
25
  /// comparison.
26
26
  ///
27
- /// NOTE: when adding or removing values, update metric_type_from_int() below.
27
+ /// NOTE: when adding or removing values, update metric_type_from_int()
28
+ /// and metric_type_count() below.
28
29
  enum MetricType {
29
- METRIC_INNER_PRODUCT = 0, ///< maximum inner product search
30
- METRIC_L2 = 1, ///< squared L2 search
31
- METRIC_L1, ///< L1 (aka cityblock)
32
- METRIC_Linf, ///< infinity distance
33
- METRIC_Lp, ///< L_p distance, p is given by a faiss::Index
34
- /// 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
35
36
 
36
37
  /// some additional metrics defined in scipy.spatial.distance
37
38
  METRIC_Canberra = 20,
@@ -68,6 +69,12 @@ inline MetricType metric_type_from_int(int x) {
68
69
  return static_cast<MetricType>(x);
69
70
  }
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
+
71
78
  } // namespace faiss
72
79
 
73
80
  #endif