faiss 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/ext/faiss/extconf.rb +2 -1
  4. data/ext/faiss/{index_rb.cpp → index.cpp} +1 -1
  5. data/ext/faiss/index_binary.cpp +1 -1
  6. data/ext/faiss/kmeans.cpp +1 -1
  7. data/ext/faiss/pca_matrix.cpp +1 -1
  8. data/ext/faiss/product_quantizer.cpp +1 -1
  9. data/ext/faiss/{utils_rb.cpp → utils.cpp} +1 -1
  10. data/lib/faiss/version.rb +1 -1
  11. data/vendor/faiss/faiss/AutoTune.cpp +93 -80
  12. data/vendor/faiss/faiss/Clustering.cpp +39 -240
  13. data/vendor/faiss/faiss/Clustering.h +6 -0
  14. data/vendor/faiss/faiss/IVFlib.cpp +41 -21
  15. data/vendor/faiss/faiss/Index.cpp +6 -5
  16. data/vendor/faiss/faiss/Index.h +5 -5
  17. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  18. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +49 -37
  19. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  21. data/vendor/faiss/faiss/IndexBinary.cpp +5 -3
  22. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  23. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  24. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  25. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  26. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +88 -97
  27. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  28. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  29. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  30. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +89 -417
  31. data/vendor/faiss/faiss/IndexFastScan.cpp +72 -109
  32. data/vendor/faiss/faiss/IndexFastScan.h +25 -23
  33. data/vendor/faiss/faiss/IndexFlat.cpp +27 -20
  34. data/vendor/faiss/faiss/IndexFlat.h +21 -18
  35. data/vendor/faiss/faiss/IndexFlatCodes.cpp +42 -19
  36. data/vendor/faiss/faiss/IndexHNSW.cpp +374 -206
  37. data/vendor/faiss/faiss/IndexHNSW.h +16 -2
  38. data/vendor/faiss/faiss/IndexIDMap.cpp +25 -21
  39. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  40. data/vendor/faiss/faiss/IndexIVF.cpp +467 -364
  41. data/vendor/faiss/faiss/IndexIVF.h +33 -12
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +79 -76
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +96 -93
  44. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -1
  45. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +357 -238
  46. data/vendor/faiss/faiss/IndexIVFFastScan.h +42 -41
  47. data/vendor/faiss/faiss/IndexIVFFlat.cpp +39 -69
  48. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  49. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +56 -33
  50. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  51. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  52. data/vendor/faiss/faiss/IndexIVFPQ.cpp +73 -846
  53. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
  54. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  55. data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -20
  56. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +30 -52
  57. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +2 -1
  58. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +475 -476
  59. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +248 -93
  60. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  61. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  62. data/vendor/faiss/faiss/IndexLSH.cpp +36 -19
  63. data/vendor/faiss/faiss/IndexLattice.cpp +13 -13
  64. data/vendor/faiss/faiss/IndexNNDescent.cpp +36 -21
  65. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  66. data/vendor/faiss/faiss/IndexNSG.cpp +38 -23
  67. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +31 -11
  68. data/vendor/faiss/faiss/IndexPQ.cpp +128 -221
  69. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  70. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  71. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  72. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  73. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  74. data/vendor/faiss/faiss/IndexRaBitQ.cpp +11 -36
  75. data/vendor/faiss/faiss/IndexRaBitQ.h +2 -1
  76. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +41 -277
  77. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +183 -27
  78. data/vendor/faiss/faiss/IndexRefine.cpp +30 -25
  79. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  80. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  81. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  82. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  83. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +150 -20
  84. data/vendor/faiss/faiss/IndexScalarQuantizer.h +10 -0
  85. data/vendor/faiss/faiss/IndexShards.cpp +10 -9
  86. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  87. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  88. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  89. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  90. data/vendor/faiss/faiss/MetricType.h +14 -7
  91. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  92. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  93. data/vendor/faiss/faiss/VectorTransform.cpp +237 -149
  94. data/vendor/faiss/faiss/VectorTransform.h +16 -16
  95. data/vendor/faiss/faiss/build.cpp +23 -0
  96. data/vendor/faiss/faiss/build.h +15 -0
  97. data/vendor/faiss/faiss/clone_index.cpp +48 -47
  98. data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +1 -1
  99. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  100. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  101. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +902 -12
  102. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  103. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  104. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +702 -10
  105. data/vendor/faiss/faiss/factory_tools.cpp +9 -0
  106. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  107. data/vendor/faiss/faiss/gpu/GpuResources.h +3 -2
  108. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +15 -16
  109. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +5 -4
  110. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  111. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  112. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  113. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  114. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  115. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  116. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  117. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  118. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  119. data/vendor/faiss/faiss/gpu_metal/MetalDistance.h +87 -0
  120. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  121. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +58 -0
  122. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  123. data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h +181 -0
  124. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +111 -0
  125. data/vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h +45 -0
  126. data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
  127. data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
  128. data/vendor/faiss/faiss/gpu_metal/impl/MetalIVFFlat.h +193 -0
  129. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  130. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  131. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +29 -25
  132. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  133. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  134. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -0
  135. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  136. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  137. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +16 -16
  138. data/vendor/faiss/faiss/impl/CodePacker.cpp +3 -3
  139. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +1 -1
  140. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  141. data/vendor/faiss/faiss/impl/FaissAssert.h +6 -3
  142. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  143. data/vendor/faiss/faiss/impl/HNSW.cpp +639 -507
  144. data/vendor/faiss/faiss/impl/HNSW.h +61 -44
  145. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  146. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  147. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  148. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +82 -77
  149. data/vendor/faiss/faiss/impl/NNDescent.cpp +62 -25
  150. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  151. data/vendor/faiss/faiss/impl/NSG.cpp +53 -32
  152. data/vendor/faiss/faiss/impl/NSG.h +4 -4
  153. data/vendor/faiss/faiss/impl/Panorama.cpp +23 -6
  154. data/vendor/faiss/faiss/impl/Panorama.h +269 -87
  155. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  156. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  157. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +46 -32
  158. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  159. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  160. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  161. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +55 -25
  162. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  163. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +55 -49
  164. data/vendor/faiss/faiss/impl/RaBitQUtils.h +65 -0
  165. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +302 -283
  166. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +26 -23
  167. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  168. data/vendor/faiss/faiss/impl/ResultHandler.h +100 -75
  169. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +318 -7
  170. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +77 -1
  171. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  172. data/vendor/faiss/faiss/impl/VisitedTable.cpp +10 -10
  173. data/vendor/faiss/faiss/impl/VisitedTable.h +70 -28
  174. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  175. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  176. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  177. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  178. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  179. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  180. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  181. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  182. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  183. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  184. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  185. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  186. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  187. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  188. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  189. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  190. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  191. data/vendor/faiss/faiss/impl/expanded_scanners.h +8 -3
  192. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  193. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  194. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  195. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  196. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  197. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +270 -0
  198. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +169 -2
  199. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  200. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  201. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  202. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  203. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  204. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  205. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -356
  206. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  207. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  208. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +282 -134
  209. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  210. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  211. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +83 -0
  212. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +113 -0
  213. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +150 -0
  214. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +142 -0
  215. data/vendor/faiss/faiss/impl/index_read.cpp +1227 -79
  216. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
  217. data/vendor/faiss/faiss/impl/index_write.cpp +96 -13
  218. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  219. data/vendor/faiss/faiss/impl/io_macros.h +58 -16
  220. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  221. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +37 -23
  222. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  223. data/vendor/faiss/faiss/impl/mapped_io.cpp +6 -6
  224. data/vendor/faiss/faiss/impl/platform_macros.h +15 -4
  225. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  226. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  227. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  228. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  229. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +23 -0
  230. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +23 -0
  231. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +23 -0
  232. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx2.cpp → pq_code_distance-avx2.h} +9 -13
  233. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx512.cpp → pq_code_distance-avx512.h} +9 -57
  234. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +45 -107
  235. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  236. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +274 -5
  237. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +10 -7
  238. data/vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h +105 -0
  239. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +70 -0
  240. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +311 -477
  241. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  242. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +1 -1
  243. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +9 -2
  244. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +419 -19
  245. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +27 -1
  246. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +3 -3
  247. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +387 -2
  248. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h +553 -0
  249. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp +559 -0
  250. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +341 -2
  251. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +425 -3
  252. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +290 -2
  253. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +337 -0
  254. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +192 -8
  255. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +12 -0
  256. data/vendor/faiss/faiss/impl/simd_dispatch.h +157 -66
  257. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  258. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +264 -172
  259. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  260. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  261. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  262. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +270 -218
  263. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  264. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  265. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  266. data/vendor/faiss/faiss/index_factory.cpp +90 -18
  267. data/vendor/faiss/faiss/index_io.h +40 -0
  268. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
  269. data/vendor/faiss/faiss/invlists/DirectMap.cpp +28 -15
  270. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  271. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +170 -86
  272. data/vendor/faiss/faiss/invlists/InvertedLists.h +88 -25
  273. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  274. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +13 -13
  275. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  276. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +1 -1
  277. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  278. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  279. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  280. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  281. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  282. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  283. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  284. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +142 -21
  285. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +33 -7
  286. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.cpp +3 -2
  287. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +2 -1
  288. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +77 -27
  289. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +10 -4
  290. data/vendor/faiss/faiss/utils/Heap.cpp +10 -10
  291. data/vendor/faiss/faiss/utils/NeuralNet.cpp +47 -36
  292. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  293. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  294. data/vendor/faiss/faiss/utils/bf16.h +34 -0
  295. data/vendor/faiss/faiss/utils/distances.cpp +390 -560
  296. data/vendor/faiss/faiss/utils/distances.h +20 -1
  297. data/vendor/faiss/faiss/utils/distances_dispatch.h +117 -37
  298. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  299. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  300. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  301. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  302. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  303. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  304. data/vendor/faiss/faiss/utils/distances_simd.cpp +5 -178
  305. data/vendor/faiss/faiss/utils/extra_distances.cpp +9 -8
  306. data/vendor/faiss/faiss/utils/extra_distances.h +32 -6
  307. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  308. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  309. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  310. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  311. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +16 -0
  312. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  313. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_spr.cpp +15 -0
  314. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  315. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +210 -0
  316. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_spr.h +171 -0
  317. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
  318. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
  319. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
  320. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
  321. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
  322. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
  323. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
  324. data/vendor/faiss/faiss/utils/partitioning.cpp +66 -989
  325. data/vendor/faiss/faiss/utils/partitioning.h +31 -0
  326. data/vendor/faiss/faiss/utils/popcount.h +29 -0
  327. data/vendor/faiss/faiss/utils/pq_code_distance.h +2 -2
  328. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  329. data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
  330. data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
  331. data/vendor/faiss/faiss/utils/rabitq_simd.h +57 -536
  332. data/vendor/faiss/faiss/utils/random.cpp +6 -6
  333. data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
  334. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +5 -1
  335. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +213 -4
  336. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +163 -10
  337. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +250 -4
  338. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +7 -4
  339. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
  340. data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
  341. data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +2 -1
  342. data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
  343. data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
  344. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
  345. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
  346. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1031 -0
  347. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
  348. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
  349. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512_spr.cpp +343 -0
  350. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  351. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  352. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  353. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  354. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  355. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  356. data/vendor/faiss/faiss/utils/simd_levels.cpp +29 -7
  357. data/vendor/faiss/faiss/utils/simd_levels.h +93 -1
  358. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  359. data/vendor/faiss/faiss/utils/utils.cpp +5 -5
  360. data/vendor/faiss/faiss/utils/utils.h +3 -3
  361. metadata +129 -34
  362. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  363. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  364. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -224
  365. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -230
  366. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  367. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  368. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  369. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  370. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -235
  371. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  372. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  373. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -449
  374. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  375. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  376. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  377. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -365
  378. /data/ext/faiss/{utils_rb.h → utils.h} +0 -0
@@ -14,6 +14,9 @@
14
14
 
15
15
  #include <omp.h>
16
16
 
17
+ #include <faiss/impl/ResultHandler.h>
18
+ #include <faiss/impl/expanded_scanners.h>
19
+
17
20
  #include <faiss/impl/FaissAssert.h>
18
21
  #include <faiss/impl/IDSelector.h>
19
22
  #include <faiss/impl/ScalarQuantizer.h>
@@ -26,10 +29,10 @@ namespace faiss {
26
29
  ********************************************************************/
27
30
 
28
31
  IndexScalarQuantizer::IndexScalarQuantizer(
29
- int d,
32
+ int d_in,
30
33
  ScalarQuantizer::QuantizerType qtype,
31
34
  MetricType metric)
32
- : IndexFlatCodes(0, d, metric), sq(d, qtype) {
35
+ : IndexFlatCodes(0, d_in, metric), sq(d_in, qtype) {
33
36
  is_trained = qtype == ScalarQuantizer::QT_fp16 ||
34
37
  qtype == ScalarQuantizer::QT_8bit_direct ||
35
38
  qtype == ScalarQuantizer::QT_bf16 ||
@@ -117,21 +120,29 @@ void IndexScalarQuantizer::sa_decode(idx_t n, const uint8_t* bytes, float* x)
117
120
  ********************************************************************/
118
121
 
119
122
  IndexIVFScalarQuantizer::IndexIVFScalarQuantizer(
120
- Index* quantizer,
121
- size_t d,
122
- size_t nlist,
123
+ Index* quantizer_,
124
+ size_t d_,
125
+ size_t nlist_,
123
126
  ScalarQuantizer::QuantizerType qtype,
124
127
  MetricType metric,
125
- bool by_residual,
126
- bool own_invlists)
127
- : IndexIVF(quantizer, d, nlist, 0, metric, own_invlists), sq(d, qtype) {
128
+ bool by_residual_,
129
+ bool own_invlists_)
130
+ : IndexIVF(quantizer_, d_, nlist_, 0, metric, own_invlists_),
131
+ sq(d_, qtype) {
128
132
  code_size = sq.code_size;
129
- this->by_residual = by_residual;
133
+ this->by_residual = by_residual_;
130
134
  if (invlists) {
131
135
  // was not known at construction time
132
136
  invlists->code_size = code_size;
133
137
  }
134
138
  is_trained = false;
139
+ if (qtype == ScalarQuantizer::QT_0bit) {
140
+ by_residual = false;
141
+ is_trained = true; // no training needed
142
+ }
143
+ if (ScalarQuantizer::TurboQuantRefine::is_turboq_full(qtype)) {
144
+ by_residual = false;
145
+ }
135
146
  }
136
147
 
137
148
  IndexIVFScalarQuantizer::IndexIVFScalarQuantizer() : IndexIVF() {
@@ -141,7 +152,7 @@ IndexIVFScalarQuantizer::IndexIVFScalarQuantizer() : IndexIVF() {
141
152
  void IndexIVFScalarQuantizer::train_encoder(
142
153
  idx_t n,
143
154
  const float* x,
144
- const idx_t* assign) {
155
+ const idx_t* /*assign*/) {
145
156
  sq.train(n, x);
146
157
  }
147
158
 
@@ -155,6 +166,19 @@ void IndexIVFScalarQuantizer::encode_vectors(
155
166
  const idx_t* list_nos,
156
167
  uint8_t* codes,
157
168
  bool include_listnos) const {
169
+ if (sq.code_size == 0) {
170
+ // QT_0bit: nothing to encode, but handle coarse codes if needed
171
+ if (include_listnos) {
172
+ size_t coarse_size = coarse_code_size();
173
+ for (idx_t i = 0; i < n; i++) {
174
+ int64_t list_no = list_nos[i];
175
+ if (list_no >= 0) {
176
+ encode_listno(list_no, codes + i * coarse_size);
177
+ }
178
+ }
179
+ }
180
+ return;
181
+ }
158
182
  std::unique_ptr<ScalarQuantizer::SQuantizer> squant(sq.select_quantizer());
159
183
  size_t coarse_size = include_listnos ? coarse_code_size() : 0;
160
184
  memset(codes, 0, (code_size + coarse_size) * n);
@@ -185,14 +209,42 @@ void IndexIVFScalarQuantizer::encode_vectors(
185
209
  void IndexIVFScalarQuantizer::decode_vectors(
186
210
  idx_t n,
187
211
  const uint8_t* codes,
188
- const idx_t*,
212
+ const idx_t* list_nos,
189
213
  float* x) const {
214
+ if (sq.code_size == 0 && list_nos) {
215
+ // QT_0bit: reconstruct centroids if list_nos provided
216
+ for (idx_t i = 0; i < n; i++) {
217
+ quantizer->reconstruct(list_nos[i], x + i * d);
218
+ }
219
+ return;
220
+ }
190
221
  FAISS_THROW_IF_NOT(is_trained);
191
- return sq.decode(codes, x, n);
222
+ sq.decode(codes, x, n);
223
+ if (by_residual) {
224
+ FAISS_THROW_IF_NOT_MSG(
225
+ list_nos, "decode_vectors with by_residual requires list_nos");
226
+ #pragma omp parallel for if (n > 1000)
227
+ for (idx_t i = 0; i < n; i++) {
228
+ std::vector<float> centroid(d);
229
+ quantizer->reconstruct(list_nos[i], centroid.data());
230
+ for (size_t j = 0; j < static_cast<size_t>(d); j++) {
231
+ x[i * d + j] += centroid[j];
232
+ }
233
+ }
234
+ }
192
235
  }
193
236
 
194
237
  void IndexIVFScalarQuantizer::sa_decode(idx_t n, const uint8_t* codes, float* x)
195
238
  const {
239
+ if (sq.code_size == 0) {
240
+ size_t coarse_size = coarse_code_size();
241
+ for (idx_t i = 0; i < n; i++) {
242
+ const uint8_t* code = codes + i * coarse_size;
243
+ int64_t list_no = decode_listno(code);
244
+ quantizer->reconstruct(list_no, x + i * d);
245
+ }
246
+ return;
247
+ }
196
248
  std::unique_ptr<ScalarQuantizer::SQuantizer> squant(sq.select_quantizer());
197
249
  size_t coarse_size = coarse_code_size();
198
250
 
@@ -208,7 +260,7 @@ void IndexIVFScalarQuantizer::sa_decode(idx_t n, const uint8_t* codes, float* x)
208
260
  squant->decode_vector(code + coarse_size, xi);
209
261
  if (by_residual) {
210
262
  quantizer->reconstruct(list_no, residual.data());
211
- for (size_t j = 0; j < d; j++) {
263
+ for (size_t j = 0; j < static_cast<size_t>(d); j++) {
212
264
  xi[j] += residual[j];
213
265
  }
214
266
  }
@@ -223,6 +275,23 @@ void IndexIVFScalarQuantizer::add_core(
223
275
  const idx_t* coarse_idx,
224
276
  void* inverted_list_context) {
225
277
  FAISS_THROW_IF_NOT(is_trained);
278
+ if (sq.code_size == 0) {
279
+ // QT_0bit: just add IDs with empty codes
280
+ uint8_t dummy_code = 0;
281
+ DirectMapAdd dm_add(direct_map, n, xids);
282
+ for (idx_t i = 0; i < n; i++) {
283
+ int64_t list_no = coarse_idx[i];
284
+ if (list_no >= 0) {
285
+ int64_t id = xids ? xids[i] : ntotal + i;
286
+ size_t ofs = invlists->add_entry(list_no, id, &dummy_code);
287
+ dm_add.add(i, list_no, ofs);
288
+ } else {
289
+ dm_add.add(i, -1, 0);
290
+ }
291
+ }
292
+ ntotal += n;
293
+ return;
294
+ }
226
295
 
227
296
  std::unique_ptr<ScalarQuantizer::SQuantizer> squant(sq.select_quantizer());
228
297
 
@@ -236,7 +305,7 @@ void IndexIVFScalarQuantizer::add_core(
236
305
  int rank = omp_get_thread_num();
237
306
 
238
307
  // each thread takes care of a subset of lists
239
- for (size_t i = 0; i < n; i++) {
308
+ for (idx_t i = 0; i < n; i++) {
240
309
  int64_t list_no = coarse_idx[i];
241
310
  if (list_no >= 0 && list_no % nt == rank) {
242
311
  int64_t id = xids ? xids[i] : ntotal + i;
@@ -267,27 +336,88 @@ void IndexIVFScalarQuantizer::add_core(
267
336
  InvertedListScanner* IndexIVFScalarQuantizer::get_InvertedListScanner(
268
337
  bool store_pairs,
269
338
  const IDSelector* sel,
270
- const IVFSearchParameters*) const {
271
- return sq.select_InvertedListScanner(
272
- metric_type, quantizer, store_pairs, sel, by_residual);
339
+ const IVFSearchParameters* search_params) const {
340
+ if (!ScalarQuantizer::TurboQuantRefine::is_turboq_full(sq.qtype)) {
341
+ return sq.select_InvertedListScanner(
342
+ metric_type, quantizer, store_pairs, sel, by_residual);
343
+ }
344
+
345
+ // TurboQ full types: create a TQ-specific scanner that supports
346
+ // search params (qb, int_qjl) and pre-screening.
347
+ uint8_t tq_qb = 0;
348
+ bool tq_int_qjl = false;
349
+ if (auto* tp = dynamic_cast<const IVFSQTurboQSearchParameters*>(
350
+ search_params)) {
351
+ tq_qb = tp->qb;
352
+ tq_int_qjl = tp->int_qjl;
353
+ }
354
+ using TurboQDC = ScalarQuantizer::TurboQuantRefine::DistanceComputer;
355
+ auto* dc = static_cast<TurboQDC*>(sq.get_distance_computer(metric_type));
356
+ dc->configure(tq_qb, tq_int_qjl);
357
+
358
+ struct TQScanner : InvertedListScanner {
359
+ std::unique_ptr<TurboQDC> dc;
360
+
361
+ explicit TQScanner(
362
+ TurboQDC* dc_in,
363
+ bool store_pairs_in,
364
+ const IDSelector* sel_in,
365
+ bool keep_max_in)
366
+ : InvertedListScanner(store_pairs_in, sel_in), dc(dc_in) {
367
+ this->keep_max = keep_max_in;
368
+ }
369
+
370
+ void set_query(const float* query) override {
371
+ dc->set_query(query);
372
+ }
373
+
374
+ void set_list(idx_t list_no_in, float) override {
375
+ this->list_no = list_no_in;
376
+ }
377
+
378
+ float distance_to_code(const uint8_t* code) const final {
379
+ return dc->distance_to_code(code);
380
+ }
381
+
382
+ size_t scan_codes(
383
+ size_t list_size,
384
+ const uint8_t* codes,
385
+ const idx_t* ids,
386
+ ResultHandler& handler) const override {
387
+ dc->set_prescreen_threshold(&handler.threshold, !keep_max);
388
+ size_t nup = run_scan_codes(*this, list_size, codes, ids, handler);
389
+ dc->clear_prescreen_threshold();
390
+ return nup;
391
+ }
392
+ };
393
+
394
+ auto* scanner = new TQScanner(
395
+ dc, store_pairs, sel, is_similarity_metric(metric_type));
396
+ scanner->code_size = code_size;
397
+ return scanner;
273
398
  }
274
399
 
275
400
  void IndexIVFScalarQuantizer::reconstruct_from_offset(
276
401
  int64_t list_no,
277
402
  int64_t offset,
278
403
  float* recons) const {
279
- const uint8_t* code = invlists->get_single_code(list_no, offset);
404
+ if (sq.code_size == 0) {
405
+ // QT_0bit: reconstruct from centroid
406
+ quantizer->reconstruct(list_no, recons);
407
+ return;
408
+ }
409
+ InvertedLists::ScopedCodes sc(invlists, list_no, offset);
280
410
 
281
411
  if (by_residual) {
282
412
  std::vector<float> centroid(d);
283
413
  quantizer->reconstruct(list_no, centroid.data());
284
414
 
285
- sq.decode(code, recons, 1);
415
+ sq.decode(sc.get(), recons, 1);
286
416
  for (int i = 0; i < d; ++i) {
287
417
  recons[i] += centroid[i];
288
418
  }
289
419
  } else {
290
- sq.decode(code, recons, 1);
420
+ sq.decode(sc.get(), recons, 1);
291
421
  }
292
422
  }
293
423
 
@@ -63,6 +63,16 @@ struct IndexScalarQuantizer : IndexFlatCodes {
63
63
  * distances are computed.
64
64
  */
65
65
 
66
+ /// Search parameters for TurboQuant full types (QT_*_tq).
67
+ struct IVFSQTurboQSearchParameters : IVFSearchParameters {
68
+ /// Query quantization bits for integer MSE pre-screening.
69
+ /// 0 = float path (default), 1-8 = integer popcount path.
70
+ uint8_t qb = 0;
71
+
72
+ /// Also use integer popcount for QJL stage (requires qb > 0).
73
+ bool int_qjl = false;
74
+ };
75
+
66
76
  struct IndexIVFScalarQuantizer : IndexIVF {
67
77
  ScalarQuantizer sq;
68
78
 
@@ -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