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
@@ -7,16 +7,16 @@
7
7
 
8
8
  #pragma once
9
9
 
10
+ #include <memory>
10
11
  #include <vector>
11
12
 
12
13
  #include <faiss/IndexFastScan.h>
13
14
  #include <faiss/IndexRaBitQ.h>
14
- #include <faiss/impl/RaBitQStats.h>
15
15
  #include <faiss/impl/RaBitQUtils.h>
16
16
  #include <faiss/impl/RaBitQuantizer.h>
17
- #include <faiss/impl/simd_result_handlers.h>
17
+ #include <faiss/impl/fast_scan/simd_result_handlers.h>
18
+ #include <faiss/impl/simdlib/simdlib_dispatch.h>
18
19
  #include <faiss/utils/Heap.h>
19
- #include <faiss/utils/simdlib.h>
20
20
 
21
21
  namespace faiss {
22
22
 
@@ -43,17 +43,6 @@ struct IndexRaBitQFastScan : IndexFastScan {
43
43
  /// Center of all points (same as IndexRaBitQ)
44
44
  std::vector<float> center;
45
45
 
46
- /// Per-vector auxiliary data (1-bit codes stored separately in `codes`)
47
- ///
48
- /// 1-bit codes (sign bits) are stored in the inherited `codes` array from
49
- /// IndexFastScan in packed FastScan format for SIMD processing.
50
- ///
51
- /// This flat_storage holds per-vector factors and refinement-bit codes:
52
- /// Layout for 1-bit: [SignBitFactors (8 bytes)]
53
- /// Layout for multi-bit: [SignBitFactorsWithError
54
- /// (12B)][ref_codes][ExtraBitsFactors (8B)]
55
- std::vector<uint8_t> flat_storage;
56
-
57
46
  /// Default number of bits to quantize a query with
58
47
  uint8_t qb = 8;
59
48
 
@@ -77,7 +66,7 @@ struct IndexRaBitQFastScan : IndexFastScan {
77
66
 
78
67
  void compute_codes(uint8_t* codes, idx_t n, const float* x) const override;
79
68
 
80
- /// Compute storage size per vector in flat_storage
69
+ /// Compute per-vector auxiliary data size in block aux region
81
70
  size_t compute_per_vector_storage_size() const;
82
71
 
83
72
  void compute_float_LUT(
@@ -88,6 +77,16 @@ struct IndexRaBitQFastScan : IndexFastScan {
88
77
 
89
78
  void sa_decode(idx_t n, const uint8_t* bytes, float* x) const override;
90
79
 
80
+ /// Packed code size: (d + 7) / 8 bytes (1-bit-per-dimension sign bits,
81
+ /// excluding factors)
82
+ size_t fast_scan_code_size() const override;
83
+
84
+ /// Return CodePackerRaBitQ with enlarged block size
85
+ CodePacker* get_CodePacker() const override;
86
+
87
+ /// Remove vectors and compact both PQ4 codes and auxiliary data
88
+ size_t remove_ids(const IDSelector& sel) override;
89
+
91
90
  void search(
92
91
  idx_t n,
93
92
  const float* x,
@@ -96,17 +95,17 @@ struct IndexRaBitQFastScan : IndexFastScan {
96
95
  idx_t* labels,
97
96
  const SearchParameters* params = nullptr) const override;
98
97
 
99
- /// Override to create RaBitQ-specific handlers
100
- SIMDResultHandlerToFloat* make_knn_handler(
98
+ /// RaBitQ scanner wired through rabitq_make_knn_scanner
99
+ std::unique_ptr<FastScanCodeScanner> make_knn_scanner(
101
100
  bool is_max,
102
- int /*impl*/,
103
101
  idx_t n,
104
102
  idx_t k,
105
- size_t /*ntotal*/,
103
+ size_t ntotal,
106
104
  float* distances,
107
105
  idx_t* labels,
108
106
  const IDSelector* sel,
109
- const FastScanDistancePostProcessing& context) const override;
107
+ int impl = 0,
108
+ const FastScanDistancePostProcessing& context = {}) const override;
110
109
  };
111
110
 
112
111
  /** SIMD result handler for RaBitQ FastScan that applies distance corrections
@@ -126,21 +125,33 @@ struct IndexRaBitQFastScan : IndexFastScan {
126
125
  *
127
126
  * @tparam C Comparator type (CMin/CMax) for heap operations
128
127
  * @tparam with_id_map Whether to use id mapping (similar to HeapHandler)
128
+ * @tparam SL SIMD level for per-TU template instantiation
129
129
  */
130
- template <class C, bool with_id_map = false>
130
+ template <
131
+ class C,
132
+ bool with_id_map = false,
133
+ SIMDLevel SL = SINGLE_SIMD_LEVEL_256>
131
134
  struct RaBitQHeapHandler
132
- : simd_result_handlers::ResultHandlerCompare<C, with_id_map> {
133
- using RHC = simd_result_handlers::ResultHandlerCompare<C, with_id_map>;
135
+ : simd_result_handlers::ResultHandlerCompare<C, with_id_map, SL> {
136
+ using RHC = simd_result_handlers::ResultHandlerCompare<C, with_id_map, SL>;
134
137
  using RHC::normalizers;
138
+ static constexpr SIMDLevel SL256 = simd256_level_selector<SL>::value;
139
+ using simd16uint16 = simd16uint16_tpl<SL256>;
135
140
 
136
141
  const IndexRaBitQFastScan* rabitq_index;
137
142
  float* heap_distances; // [nq * k]
138
143
  int64_t* heap_labels; // [nq * k]
139
144
  const size_t nq, k;
140
- const FastScanDistancePostProcessing&
145
+ const FastScanDistancePostProcessing*
141
146
  context; // Processing context with query offset
142
147
  const bool is_multi_bit; // Runtime flag for multi-bit mode
143
148
 
149
+ // Cached block-layout constants (invariant for handler lifetime)
150
+ const size_t storage_size;
151
+ const size_t packed_block_size;
152
+ const size_t full_block_size;
153
+ std::vector<uint8_t> unpack_buf; // sign bits scratch buffer
154
+
144
155
  // Use float-based comparator for heap operations
145
156
  using Cfloat = typename std::conditional<
146
157
  C::is_max,
@@ -154,22 +165,169 @@ struct RaBitQHeapHandler
154
165
  float* distances,
155
166
  int64_t* labels,
156
167
  const IDSelector* sel_in,
157
- const FastScanDistancePostProcessing& context,
158
- bool multi_bit);
168
+ const FastScanDistancePostProcessing* ctx,
169
+ bool multi_bit)
170
+ : RHC(nq_val, index->ntotal, sel_in),
171
+ rabitq_index(index),
172
+ heap_distances(distances),
173
+ heap_labels(labels),
174
+ nq(nq_val),
175
+ k(k_val),
176
+ context(ctx),
177
+ is_multi_bit(multi_bit),
178
+ storage_size(index->compute_per_vector_storage_size()),
179
+ packed_block_size(((index->M2 + 1) / 2) * index->bbs),
180
+ full_block_size(index->get_block_stride()),
181
+ unpack_buf((index->d + 7) / 8) {
182
+ #pragma omp parallel for if (nq > 100)
183
+ for (int64_t q = 0; q < static_cast<int64_t>(nq); q++) {
184
+ float* heap_dis = heap_distances + q * k;
185
+ int64_t* heap_ids = heap_labels + q * k;
186
+ heap_heapify<Cfloat>(k, heap_dis, heap_ids);
187
+ }
188
+ }
189
+
190
+ void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) final {
191
+ ALIGNED(32) uint16_t d32tab[32];
192
+ d0.store(d32tab);
193
+ d1.store(d32tab + 16);
194
+
195
+ float* const heap_dis = heap_distances + q * k;
196
+ int64_t* const heap_ids = heap_labels + q * k;
197
+
198
+ rabitq_utils::QueryFactorsData query_factors_data = {};
199
+ if (context && context->query_factors != nullptr) {
200
+ query_factors_data = context->query_factors[q];
201
+ }
202
+
203
+ const float one_a = normalizers ? (1.0f / normalizers[2 * q]) : 1.0f;
204
+ const float bias = normalizers ? normalizers[2 * q + 1] : 0.0f;
205
+
206
+ const size_t base_db_idx = this->j0 + b * 32;
207
+ const size_t max_vectors = (base_db_idx < rabitq_index->ntotal)
208
+ ? std::min<size_t>(32, rabitq_index->ntotal - base_db_idx)
209
+ : 0;
210
+
211
+ const size_t block_idx = base_db_idx / rabitq_index->bbs;
212
+ const uint8_t* aux_base = rabitq_index->codes.get() +
213
+ block_idx * full_block_size + packed_block_size;
159
214
 
160
- void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) override;
215
+ for (size_t i = 0; i < max_vectors; i++) {
216
+ const size_t db_idx = base_db_idx + i;
217
+ const float normalized_distance = d32tab[i] * one_a + bias;
218
+ const uint8_t* base_ptr = aux_base + i * storage_size;
161
219
 
162
- void begin(const float* norms);
220
+ if (is_multi_bit) {
221
+ const SignBitFactorsWithError& full_factors =
222
+ *reinterpret_cast<const SignBitFactorsWithError*>(
223
+ base_ptr);
163
224
 
164
- void end();
225
+ float dist_1bit = rabitq_utils::compute_1bit_adjusted_distance(
226
+ normalized_distance,
227
+ full_factors,
228
+ query_factors_data,
229
+ rabitq_index->centered,
230
+ rabitq_index->qb,
231
+ rabitq_index->d);
232
+
233
+ const bool is_similarity = rabitq_index->metric_type ==
234
+ MetricType::METRIC_INNER_PRODUCT;
235
+ bool should_refine = rabitq_utils::should_refine_candidate(
236
+ dist_1bit,
237
+ full_factors.f_error,
238
+ context && context->query_factors
239
+ ? context->query_factors[q].g_error
240
+ : 0.0f,
241
+ heap_dis[0],
242
+ is_similarity);
243
+
244
+ if (should_refine) {
245
+ float dist_full = compute_full_multibit_distance(db_idx, q);
246
+
247
+ if (Cfloat::cmp(heap_dis[0], dist_full)) {
248
+ heap_replace_top<Cfloat>(
249
+ k, heap_dis, heap_ids, dist_full, db_idx);
250
+ }
251
+ }
252
+ } else {
253
+ const rabitq_utils::SignBitFactors& db_factors =
254
+ *reinterpret_cast<const rabitq_utils::SignBitFactors*>(
255
+ base_ptr);
256
+
257
+ float adjusted_distance =
258
+ rabitq_utils::compute_1bit_adjusted_distance(
259
+ normalized_distance,
260
+ db_factors,
261
+ query_factors_data,
262
+ rabitq_index->centered,
263
+ rabitq_index->qb,
264
+ rabitq_index->d);
265
+
266
+ if (Cfloat::cmp(heap_dis[0], adjusted_distance)) {
267
+ heap_replace_top<Cfloat>(
268
+ k, heap_dis, heap_ids, adjusted_distance, db_idx);
269
+ }
270
+ }
271
+ }
272
+ }
273
+
274
+ void begin(const float* norms) override {
275
+ normalizers = norms;
276
+ }
277
+
278
+ void end() override {
279
+ #pragma omp parallel for if (nq > 100)
280
+ for (int64_t q = 0; q < static_cast<int64_t>(nq); q++) {
281
+ float* heap_dis = heap_distances + q * k;
282
+ int64_t* heap_ids = heap_labels + q * k;
283
+ heap_reorder<Cfloat>(k, heap_dis, heap_ids);
284
+ }
285
+ }
165
286
 
166
287
  private:
167
- /// Compute full multi-bit distance for a candidate vector (multi-bit only)
168
- float compute_full_multibit_distance(size_t db_idx, size_t q) const;
288
+ float compute_full_multibit_distance(size_t db_idx, size_t q) {
289
+ const size_t ex_bits = rabitq_index->rabitq.nb_bits - 1;
290
+ const size_t dim = rabitq_index->d;
291
+
292
+ const uint8_t* base_ptr = rabitq_utils::get_block_aux_ptr(
293
+ rabitq_index->codes.get(),
294
+ db_idx,
295
+ rabitq_index->bbs,
296
+ packed_block_size,
297
+ full_block_size,
298
+ storage_size);
299
+
300
+ const size_t ex_code_size = (dim * ex_bits + 7) / 8;
301
+ const uint8_t* ex_code = base_ptr + sizeof(SignBitFactorsWithError);
302
+ const ExtraBitsFactors& ex_fac =
303
+ *reinterpret_cast<const ExtraBitsFactors*>(
304
+ base_ptr + sizeof(SignBitFactorsWithError) +
305
+ ex_code_size);
306
+
307
+ const rabitq_utils::QueryFactorsData& query_factors =
308
+ context->query_factors[q];
309
+
310
+ rabitq_utils::unpack_sign_bits_from_packed(
311
+ rabitq_index->codes.get(),
312
+ rabitq_index->bbs,
313
+ rabitq_index->M2,
314
+ db_idx,
315
+ full_block_size,
316
+ unpack_buf.data());
317
+ const uint8_t* sign_bits = unpack_buf.data();
169
318
 
170
- /// Compute lower bound using 1-bit distance and error bound (multi-bit
171
- /// only)
172
- float compute_lower_bound(float dist_1bit, size_t db_idx, size_t q) const;
319
+ return rabitq_utils::compute_full_multibit_distance(
320
+ sign_bits,
321
+ ex_code,
322
+ ex_fac,
323
+ query_factors.rotated_q.data(),
324
+ (rabitq_index->metric_type == MetricType::METRIC_INNER_PRODUCT)
325
+ ? query_factors.q_dot_c
326
+ : query_factors.qr_to_c_L2sqr,
327
+ dim,
328
+ ex_bits,
329
+ rabitq_index->metric_type);
330
+ }
173
331
  };
174
332
 
175
333
  } // namespace faiss
@@ -18,10 +18,10 @@ namespace faiss {
18
18
  * IndexRefine
19
19
  ***************************************************/
20
20
 
21
- IndexRefine::IndexRefine(Index* base_index, Index* refine_index)
22
- : Index(base_index->d, base_index->metric_type),
23
- base_index(base_index),
24
- refine_index(refine_index) {
21
+ IndexRefine::IndexRefine(Index* base_index_in, Index* refine_index_in)
22
+ : Index(base_index_in->d, base_index_in->metric_type),
23
+ base_index(base_index_in),
24
+ refine_index(refine_index_in) {
25
25
  own_fields = own_refine_index = false;
26
26
  if (refine_index != nullptr) {
27
27
  FAISS_THROW_IF_NOT(base_index->d == refine_index->d);
@@ -58,36 +58,6 @@ void IndexRefine::reset() {
58
58
  ntotal = 0;
59
59
  }
60
60
 
61
- namespace {
62
-
63
- using idx_t = faiss::idx_t;
64
-
65
- template <class C>
66
- static void reorder_2_heaps(
67
- idx_t n,
68
- idx_t k,
69
- idx_t* __restrict labels,
70
- float* __restrict distances,
71
- idx_t k_base,
72
- const idx_t* __restrict base_labels,
73
- const float* __restrict base_distances) {
74
- #pragma omp parallel for if (n > 1)
75
- for (idx_t i = 0; i < n; i++) {
76
- idx_t* idxo = labels + i * k;
77
- float* diso = distances + i * k;
78
- const idx_t* idxi = base_labels + i * k_base;
79
- const float* disi = base_distances + i * k_base;
80
-
81
- heap_heapify<C>(k, diso, idxo, disi, idxi, k);
82
- if (k_base != k) { // add remaining elements
83
- heap_addn<C>(k, diso, idxo, disi + k, idxi + k, k_base - k);
84
- }
85
- heap_reorder<C>(k, diso, idxo);
86
- }
87
- }
88
-
89
- } // anonymous namespace
90
-
91
61
  void IndexRefine::search(
92
62
  idx_t n,
93
63
  const float* x,
@@ -114,6 +84,8 @@ void IndexRefine::search(
114
84
 
115
85
  FAISS_THROW_IF_NOT(k > 0);
116
86
  FAISS_THROW_IF_NOT(is_trained);
87
+ FAISS_THROW_IF_NOT_MSG(
88
+ n <= INT64_MAX / k_base, "n * k_base would overflow int64");
117
89
  idx_t* base_labels = labels;
118
90
  float* base_distances = distances;
119
91
  std::unique_ptr<idx_t[]> del1;
@@ -129,8 +101,8 @@ void IndexRefine::search(
129
101
  base_index->search(
130
102
  n, x, k_base, base_distances, base_labels, base_index_params);
131
103
 
132
- for (int i = 0; i < n * k_base; i++) {
133
- assert(base_labels[i] >= -1 && base_labels[i] < ntotal);
104
+ for (idx_t i = 0; i < n * k_base; i++) {
105
+ FAISS_THROW_IF_NOT(base_labels[i] >= -1 && base_labels[i] < ntotal);
134
106
  }
135
107
 
136
108
  // parallelize over queries
@@ -155,12 +127,12 @@ void IndexRefine::search(
155
127
 
156
128
  // sort and store result
157
129
  if (metric_type == METRIC_L2) {
158
- typedef CMax<float, idx_t> C;
130
+ using C = CMax<float, idx_t>;
159
131
  reorder_2_heaps<C>(
160
132
  n, k, labels, distances, k_base, base_labels, base_distances);
161
133
 
162
134
  } else if (metric_type == METRIC_INNER_PRODUCT) {
163
- typedef CMin<float, idx_t> C;
135
+ using C = CMin<float, idx_t>;
164
136
  reorder_2_heaps<C>(
165
137
  n, k, labels, distances, k_base, base_labels, base_distances);
166
138
  } else {
@@ -221,7 +193,7 @@ void IndexRefine::sa_encode(idx_t n, const float* x, uint8_t* bytes) const {
221
193
  base_index->sa_encode(n, x, tmp1.get());
222
194
  std::unique_ptr<uint8_t[]> tmp2(new uint8_t[n * cs2]);
223
195
  refine_index->sa_encode(n, x, tmp2.get());
224
- for (size_t i = 0; i < n; i++) {
196
+ for (idx_t i = 0; i < n; i++) {
225
197
  uint8_t* b = bytes + i * (cs1 + cs2);
226
198
  memcpy(b, tmp1.get() + cs1 * i, cs1);
227
199
  memcpy(b + cs1, tmp2.get() + cs2 * i, cs2);
@@ -230,10 +202,9 @@ void IndexRefine::sa_encode(idx_t n, const float* x, uint8_t* bytes) const {
230
202
 
231
203
  void IndexRefine::sa_decode(idx_t n, const uint8_t* bytes, float* x) const {
232
204
  size_t cs1 = base_index->sa_code_size(), cs2 = refine_index->sa_code_size();
233
- std::unique_ptr<uint8_t[]> tmp2(
234
- new uint8_t[n * refine_index->sa_code_size()]);
235
- for (size_t i = 0; i < n; i++) {
236
- memcpy(tmp2.get() + i * cs2, bytes + i * (cs1 + cs2), cs2);
205
+ std::unique_ptr<uint8_t[]> tmp2(new uint8_t[n * cs2]);
206
+ for (idx_t i = 0; i < n; i++) {
207
+ memcpy(tmp2.get() + i * cs2, bytes + i * (cs1 + cs2) + cs1, cs2);
237
208
  }
238
209
 
239
210
  refine_index->sa_decode(n, tmp2.get(), x);
@@ -252,10 +223,10 @@ IndexRefine::~IndexRefine() {
252
223
  * IndexRefineFlat
253
224
  ***************************************************/
254
225
 
255
- IndexRefineFlat::IndexRefineFlat(Index* base_index)
226
+ IndexRefineFlat::IndexRefineFlat(Index* base_index_in)
256
227
  : IndexRefine(
257
- base_index,
258
- new IndexFlat(base_index->d, base_index->metric_type)) {
228
+ base_index_in,
229
+ new IndexFlat(base_index_in->d, base_index_in->metric_type)) {
259
230
  is_trained = base_index->is_trained;
260
231
  own_refine_index = true;
261
232
  FAISS_THROW_IF_NOT_MSG(
@@ -263,8 +234,8 @@ IndexRefineFlat::IndexRefineFlat(Index* base_index)
263
234
  "base_index should be empty in the beginning");
264
235
  }
265
236
 
266
- IndexRefineFlat::IndexRefineFlat(Index* base_index, const float* xb)
267
- : IndexRefine(base_index, nullptr) {
237
+ IndexRefineFlat::IndexRefineFlat(Index* base_index_in, const float* xb)
238
+ : IndexRefine(base_index_in, nullptr) {
268
239
  is_trained = base_index->is_trained;
269
240
  refine_index = new IndexFlat(base_index->d, base_index->metric_type);
270
241
  own_refine_index = true;
@@ -301,6 +272,8 @@ void IndexRefineFlat::search(
301
272
 
302
273
  FAISS_THROW_IF_NOT(k > 0);
303
274
  FAISS_THROW_IF_NOT(is_trained);
275
+ FAISS_THROW_IF_NOT_MSG(
276
+ n <= INT64_MAX / k_base, "n * k_base would overflow int64");
304
277
  idx_t* base_labels = labels;
305
278
  float* base_distances = distances;
306
279
  std::unique_ptr<idx_t[]> del1;
@@ -316,8 +289,8 @@ void IndexRefineFlat::search(
316
289
  base_index->search(
317
290
  n, x, k_base, base_distances, base_labels, base_index_params);
318
291
 
319
- for (int i = 0; i < n * k_base; i++) {
320
- assert(base_labels[i] >= -1 && base_labels[i] < ntotal);
292
+ for (idx_t i = 0; i < n * k_base; i++) {
293
+ FAISS_THROW_IF_NOT(base_labels[i] >= -1 && base_labels[i] < ntotal);
321
294
  }
322
295
 
323
296
  // compute refined distances
@@ -328,12 +301,12 @@ void IndexRefineFlat::search(
328
301
 
329
302
  // sort and store result
330
303
  if (metric_type == METRIC_L2) {
331
- typedef CMax<float, idx_t> C;
304
+ using C = CMax<float, idx_t>;
332
305
  reorder_2_heaps<C>(
333
306
  n, k, labels, distances, k_base, base_labels, base_distances);
334
307
 
335
308
  } else if (metric_type == METRIC_INNER_PRODUCT) {
336
- typedef CMin<float, idx_t> C;
309
+ using C = CMin<float, idx_t>;
337
310
  reorder_2_heaps<C>(
338
311
  n, k, labels, distances, k_base, base_labels, base_distances);
339
312
  } else {
@@ -356,7 +329,7 @@ void IndexRefinePanorama::search(
356
329
  if (params_in) {
357
330
  params = dynamic_cast<const IndexRefineSearchParameters*>(params_in);
358
331
  FAISS_THROW_IF_NOT_MSG(
359
- params, "IndexRefineFlat params have incorrect type");
332
+ params, "IndexRefinePanorama params have incorrect type");
360
333
  }
361
334
 
362
335
  idx_t k_base = (params != nullptr) ? idx_t(k * params->k_factor)
@@ -371,6 +344,8 @@ void IndexRefinePanorama::search(
371
344
 
372
345
  FAISS_THROW_IF_NOT(k > 0);
373
346
  FAISS_THROW_IF_NOT(is_trained);
347
+ FAISS_THROW_IF_NOT_MSG(
348
+ n <= INT64_MAX / k_base, "n * k_base would overflow int64");
374
349
 
375
350
  std::unique_ptr<idx_t[]> del1;
376
351
  std::unique_ptr<float[]> del2;
@@ -382,8 +357,8 @@ void IndexRefinePanorama::search(
382
357
  base_index->search(
383
358
  n, x, k_base, base_distances, base_labels, base_index_params);
384
359
 
385
- for (int i = 0; i < n * k_base; i++) {
386
- assert(base_labels[i] >= -1 && base_labels[i] < ntotal);
360
+ for (idx_t i = 0; i < n * k_base; i++) {
361
+ FAISS_THROW_IF_NOT(base_labels[i] >= -1 && base_labels[i] < ntotal);
387
362
  }
388
363
 
389
364
  refine_index->search_subset(
@@ -28,8 +28,8 @@ struct IndexRefine : Index {
28
28
  /// refinement index
29
29
  Index* refine_index;
30
30
 
31
- bool own_fields; ///< should the base index be deallocated?
32
- bool own_refine_index; ///< same with the refinement index
31
+ bool own_fields = false; ///< should the base index be deallocated?
32
+ bool own_refine_index = false; ///< same with the refinement index
33
33
 
34
34
  /// factor between k requested in search and the k requested from
35
35
  /// the base_index (should be >= 1)
@@ -98,8 +98,8 @@ struct IndexRefineFlat : IndexRefine {
98
98
  /** Version where the search calls search_subset, allowing for Panorama
99
99
  * refinement. */
100
100
  struct IndexRefinePanorama : IndexRefine {
101
- explicit IndexRefinePanorama(Index* base_index, Index* refine_index)
102
- : IndexRefine(base_index, refine_index) {}
101
+ explicit IndexRefinePanorama(Index* base_index_in, Index* refine_index_in)
102
+ : IndexRefine(base_index_in, refine_index_in) {}
103
103
 
104
104
  IndexRefinePanorama() : IndexRefine() {}
105
105
 
@@ -16,7 +16,7 @@ namespace {
16
16
 
17
17
  // IndexBinary needs to update the code_size when d is set...
18
18
 
19
- void sync_d(Index* index) {}
19
+ void sync_d(Index* /*index*/) {}
20
20
 
21
21
  void sync_d(IndexBinary* index) {
22
22
  FAISS_THROW_IF_NOT(index->d % 8 == 0);
@@ -30,14 +30,14 @@ IndexReplicasTemplate<IndexT>::IndexReplicasTemplate(bool threaded)
30
30
  : ThreadedIndex<IndexT>(threaded) {}
31
31
 
32
32
  template <typename IndexT>
33
- IndexReplicasTemplate<IndexT>::IndexReplicasTemplate(idx_t d, bool threaded)
34
- : ThreadedIndex<IndexT>(d, threaded) {
33
+ IndexReplicasTemplate<IndexT>::IndexReplicasTemplate(idx_t d_in, bool threaded)
34
+ : ThreadedIndex<IndexT>(static_cast<int>(d_in), threaded) {
35
35
  sync_d(this);
36
36
  }
37
37
 
38
38
  template <typename IndexT>
39
- IndexReplicasTemplate<IndexT>::IndexReplicasTemplate(int d, bool threaded)
40
- : ThreadedIndex<IndexT>(d, threaded) {
39
+ IndexReplicasTemplate<IndexT>::IndexReplicasTemplate(int d_in, bool threaded)
40
+ : ThreadedIndex<IndexT>(d_in, threaded) {
41
41
  sync_d(this);
42
42
  }
43
43
 
@@ -71,7 +71,7 @@ void IndexReplicasTemplate<IndexT>::onAfterAddIndex(IndexT* index) {
71
71
  }
72
72
 
73
73
  template <typename IndexT>
74
- void IndexReplicasTemplate<IndexT>::onAfterRemoveIndex(IndexT* index) {
74
+ void IndexReplicasTemplate<IndexT>::onAfterRemoveIndex(IndexT* /*index*/) {
75
75
  syncWithSubIndexes();
76
76
  }
77
77
 
@@ -162,10 +162,10 @@ void sa_decode_impl(
162
162
 
163
163
  // allocate tmp buffers
164
164
  std::vector<uint8_t> tmp(
165
- (chunk_size < n_input ? chunk_size : n_input) * old_code_size);
166
- std::vector<StorageMinMaxFP16> minmax(
167
- (chunk_size < n_input ? chunk_size : n_input));
168
-
165
+ (chunk_size < static_cast<size_t>(n_input)
166
+ ? chunk_size
167
+ : static_cast<size_t>(n_input)) *
168
+ old_code_size);
169
169
  // all the elements to process
170
170
  size_t n_left = n_input;
171
171
 
@@ -226,7 +226,7 @@ void train_inplace_impl(
226
226
  std::vector<StorageMinMaxT> minmax(n);
227
227
 
228
228
  // normalize
229
- #pragma omp for
229
+ #pragma omp parallel for
230
230
  for (idx_t i = 0; i < n; i++) {
231
231
  // compute min & max values
232
232
  float minv = std::numeric_limits<float>::max();
@@ -264,6 +264,7 @@ void train_inplace_impl(
264
264
  sub_index->train(n, x);
265
265
 
266
266
  // rescale data back
267
+ #pragma omp parallel for
267
268
  for (idx_t i = 0; i < n; i++) {
268
269
  float scaler = 0;
269
270
  float minv = 0;
@@ -289,7 +290,7 @@ void train_impl(IndexRowwiseMinMaxBase* const index, idx_t n, const float* x) {
289
290
  // temp buffer
290
291
  std::vector<float> tmp(n * d);
291
292
 
292
- #pragma omp for
293
+ #pragma omp parallel for
293
294
  for (idx_t i = 0; i < n; i++) {
294
295
  // compute min & max values
295
296
  float minv = std::numeric_limits<float>::max();
@@ -304,7 +305,7 @@ void train_impl(IndexRowwiseMinMaxBase* const index, idx_t n, const float* x) {
304
305
  const float scaler = maxv - minv;
305
306
 
306
307
  // save the coefficients
307
- StorageMinMaxT storage;
308
+ StorageMinMaxT storage = {};
308
309
  storage.from_floats(scaler, minv);
309
310
 
310
311
  // and load them back, because the coefficients might
@@ -339,9 +340,9 @@ int rowwise_minmax_sa_decode_bs = 16384;
339
340
  * IndexRowwiseMinMaxBase implementation
340
341
  ********************************************************/
341
342
 
342
- IndexRowwiseMinMaxBase::IndexRowwiseMinMaxBase(Index* index)
343
- : Index(index->d, index->metric_type),
344
- index{index},
343
+ IndexRowwiseMinMaxBase::IndexRowwiseMinMaxBase(Index* index_in)
344
+ : Index(index_in->d, index_in->metric_type),
345
+ index{index_in},
345
346
  own_fields{false} {}
346
347
 
347
348
  IndexRowwiseMinMaxBase::IndexRowwiseMinMaxBase()
@@ -376,8 +377,8 @@ void IndexRowwiseMinMaxBase::reset() {
376
377
  * IndexRowwiseMinMaxFP16 implementation
377
378
  ********************************************************/
378
379
 
379
- IndexRowwiseMinMaxFP16::IndexRowwiseMinMaxFP16(Index* index)
380
- : IndexRowwiseMinMaxBase(index) {}
380
+ IndexRowwiseMinMaxFP16::IndexRowwiseMinMaxFP16(Index* index_in)
381
+ : IndexRowwiseMinMaxBase(index_in) {}
381
382
 
382
383
  IndexRowwiseMinMaxFP16::IndexRowwiseMinMaxFP16() : IndexRowwiseMinMaxBase() {}
383
384
 
@@ -411,8 +412,8 @@ void IndexRowwiseMinMaxFP16::train_inplace(idx_t n, float* x) {
411
412
  * IndexRowwiseMinMax implementation
412
413
  ********************************************************/
413
414
 
414
- IndexRowwiseMinMax::IndexRowwiseMinMax(Index* index)
415
- : IndexRowwiseMinMaxBase(index) {}
415
+ IndexRowwiseMinMax::IndexRowwiseMinMax(Index* index_in)
416
+ : IndexRowwiseMinMaxBase(index_in) {}
416
417
 
417
418
  IndexRowwiseMinMax::IndexRowwiseMinMax() : IndexRowwiseMinMaxBase() {}
418
419
 
@@ -43,7 +43,7 @@ struct IndexRowwiseMinMaxBase : Index {
43
43
  Index* index;
44
44
 
45
45
  /// whether the subindex needs to be freed in the destructor.
46
- bool own_fields;
46
+ bool own_fields = false;
47
47
 
48
48
  explicit IndexRowwiseMinMaxBase(Index* index);
49
49