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
@@ -8,12 +8,12 @@
8
8
  #pragma once
9
9
 
10
10
  #include <faiss/IndexIVF.h>
11
- #include <faiss/impl/FastScanDistancePostProcessing.h>
11
+ #include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
12
+ #include <faiss/impl/fast_scan/fast_scan.h>
12
13
  #include <faiss/utils/AlignedTable.h>
13
14
 
14
15
  namespace faiss {
15
16
 
16
- struct NormTableScaler;
17
17
  struct SIMDResultHandlerToFloat;
18
18
  struct Quantizer;
19
19
 
@@ -41,14 +41,14 @@ struct Quantizer;
41
41
 
42
42
  struct IndexIVFFastScan : IndexIVF {
43
43
  // size of the kernel
44
- int bbs; // set at build time
44
+ int bbs = 0; // set at build time
45
45
 
46
- size_t M;
47
- size_t nbits;
48
- size_t ksub;
46
+ size_t M = 0;
47
+ size_t nbits = 0;
48
+ size_t ksub = 0;
49
49
 
50
50
  // M rounded up to a multiple of 2
51
- size_t M2;
51
+ size_t M2 = 0;
52
52
 
53
53
  // search-time implementation
54
54
  int implem = 0;
@@ -156,7 +156,7 @@ struct IndexIVFFastScan : IndexIVF {
156
156
  * @param context processing context containing query factors
157
157
  * processor
158
158
  */
159
- void compute_LUT_uint8(
159
+ virtual void compute_LUT_uint8(
160
160
  size_t n,
161
161
  const float* x,
162
162
  const CoarseQuantized& cq,
@@ -222,45 +222,31 @@ struct IndexIVFFastScan : IndexIVF {
222
222
  RangeSearchResult* result,
223
223
  const SearchParameters* params = nullptr) const override;
224
224
 
225
- /** Create a KNN handler for this index type
225
+ /** Create a SIMD-dispatched scanner for knn search (IVF variant).
226
226
  *
227
- * This method can be overridden by derived classes to provide
228
- * specialized handlers (e.g., IVFRaBitQHeapHandler for RaBitQ indexes).
229
- * Base implementation creates standard handlers based on k and impl.
227
+ * Returns a FastScanCodeScanner that bundles handler + accumulation
228
+ * kernel behind the SIMD dispatch boundary. ntotal is not passed
229
+ * because IVF sets it per-list via handler->ntotal.
230
+ * Derived classes override this to provide custom handlers
231
+ * (e.g. RaBitQ).
230
232
  *
231
- * @param is_max true for max-heap (inner product), false for
232
- * min-heap (L2 distance)
233
- * @param impl implementation number:
234
- * - even (10, 12, 14): use heap for top-k
235
- * - odd (11, 13, 15): use reservoir sampling
236
- * @param n number of queries
237
- * @param k number of neighbors to find per query
238
- * @param distances output array for distances (n * k), will be
239
- * populated by handler
240
- * @param labels output array for result IDs (n * k), will be
241
- * populated by handler
242
- * @param sel optional ID selector to filter results (nullptr =
243
- * no filtering)
244
- * @param context processing context containing additional data
245
- * @param normalizers optional array of size 2*n for converting quantized
246
- * uint16 distances to float.
247
- *
248
- * @return Allocated result handler (caller owns and must delete).
249
- * Handler processes SIMD batches and populates distances/labels.
250
- *
251
- * @note The returned handler must be deleted by caller after use.
252
- * Typical usage: handler->begin() → process batches → handler->end()
233
+ * @param is_max whether to use CMax comparator (true) or CMin
234
+ * @param n number of queries
235
+ * @param k number of neighbors to find
236
+ * @param distances output distances array
237
+ * @param labels output labels array
238
+ * @param sel optional ID selector
239
+ * @return scanner
253
240
  */
254
- virtual SIMDResultHandlerToFloat* make_knn_handler(
241
+ virtual std::unique_ptr<FastScanCodeScanner> make_knn_scanner(
255
242
  bool is_max,
256
- int impl,
257
243
  idx_t n,
258
244
  idx_t k,
259
245
  float* distances,
260
246
  idx_t* labels,
261
247
  const IDSelector* sel,
262
- const FastScanDistancePostProcessing& context,
263
- const float* normalizers = nullptr) const;
248
+ int impl = 0,
249
+ const FastScanDistancePostProcessing& context = {}) const;
264
250
 
265
251
  // dispatch to implementations and parallelize
266
252
  void search_dispatch_implem(
@@ -306,16 +292,18 @@ struct IndexIVFFastScan : IndexIVF {
306
292
  const IVFSearchParameters* params = nullptr) const;
307
293
 
308
294
  // implem 10 and 12 are not multithreaded internally, so
309
- // export search stats
295
+ // export search stats. k is required for ensure_topk_full support.
310
296
  void search_implem_10(
311
297
  idx_t n,
312
298
  const float* x,
299
+ idx_t k,
313
300
  SIMDResultHandlerToFloat& handler,
314
301
  const CoarseQuantized& cq,
315
302
  size_t* ndis_out,
316
303
  size_t* nlist_out,
317
304
  const FastScanDistancePostProcessing& context,
318
- const IVFSearchParameters* params = nullptr) const;
305
+ const IVFSearchParameters* params,
306
+ FastScanCodeScanner& scanner) const;
319
307
 
320
308
  void search_implem_12(
321
309
  idx_t n,
@@ -325,7 +313,8 @@ struct IndexIVFFastScan : IndexIVF {
325
313
  size_t* ndis_out,
326
314
  size_t* nlist_out,
327
315
  const FastScanDistancePostProcessing& context,
328
- const IVFSearchParameters* params = nullptr) const;
316
+ const IVFSearchParameters* params,
317
+ FastScanCodeScanner& scanner) const;
329
318
 
330
319
  // implem 14 is multithreaded internally across nprobes and queries
331
320
  void search_implem_14(
@@ -359,29 +348,19 @@ struct IndexIVFFastScan : IndexIVF {
359
348
  */
360
349
  void sa_decode(idx_t n, const uint8_t* bytes, float* x) const override;
361
350
 
362
- protected:
363
- /** Preprocess metadata from encoded vectors before packing.
364
- *
365
- * Called during add_with_ids after encode_vectors but before codes
366
- * are packed into SIMD-friendly blocks. Subclasses can override to
367
- * extract and store metadata embedded in codes or perform other
368
- * pre-packing operations.
369
- *
370
- * Default implementation: no-op
351
+ /** Get the size of the code portion packed by pq4_pack_codes.
371
352
  *
372
- * Example use case:
373
- * - IndexIVFRaBitQFastScan extracts factor data from codes for use
374
- * during search-time distance corrections
353
+ * Returns the number of bytes per vector that are interleaved into
354
+ * SIMD blocks by pq4_pack_codes, excluding any embedded metadata
355
+ * (e.g., RaBitQ factors). The meaning of these bytes depends on the
356
+ * quantizer: for PQ/AQ they are 4-bit sub-quantizer nibbles, for
357
+ * RaBitQ they are 1-bit-per-dimension sign bits packed into nibbles.
375
358
  *
376
- * @param n number of vectors encoded
377
- * @param flat_codes encoded vectors (n * code_size bytes)
378
- * @param start_global_idx starting global index (ntotal before add)
359
+ * Must be implemented by all derived classes.
379
360
  */
380
- virtual void preprocess_code_metadata(
381
- idx_t n,
382
- const uint8_t* flat_codes,
383
- idx_t start_global_idx);
361
+ virtual size_t fast_scan_code_size() const = 0;
384
362
 
363
+ protected:
385
364
  /** Get stride for interpreting codes during SIMD packing.
386
365
  *
387
366
  * The stride determines how to read codes when packing them into
@@ -399,6 +378,32 @@ struct IndexIVFFastScan : IndexIVF {
399
378
  * - >0: use custom stride (e.g., code_size for embedded metadata)
400
379
  */
401
380
  virtual size_t code_packing_stride() const;
381
+
382
+ public:
383
+ /** Get stride in bytes between consecutive SIMD blocks.
384
+ *
385
+ * Derived from get_CodePacker()->block_size so that there is a
386
+ * single source of truth for the block layout.
387
+ *
388
+ * @return stride in bytes
389
+ */
390
+ size_t get_block_stride() const;
391
+
392
+ /** Post-process packed codes after pq4_pack_codes_range.
393
+ *
394
+ * Called during add_with_ids after codes have been packed into
395
+ * SIMD-friendly blocks.
396
+ *
397
+ * @param list_no inverted list number
398
+ * @param list_offset starting offset within the list (pre-existing size)
399
+ * @param n_added number of vectors added in this batch
400
+ * @param flat_codes encoded vectors for this batch (n_added * code_size)
401
+ */
402
+ virtual void postprocess_packed_codes(
403
+ idx_t list_no,
404
+ size_t list_offset,
405
+ size_t n_added,
406
+ const uint8_t* flat_codes);
402
407
  };
403
408
 
404
409
  struct IVFFastScanStats {
@@ -13,7 +13,6 @@
13
13
 
14
14
  #include <cinttypes>
15
15
  #include <cstdio>
16
- #include <numeric>
17
16
 
18
17
  #include <faiss/IndexFlat.h>
19
18
 
@@ -21,8 +20,14 @@
21
20
  #include <faiss/impl/IDSelector.h>
22
21
 
23
22
  #include <faiss/impl/FaissAssert.h>
24
- #include <faiss/utils/distances.h>
23
+ #include <faiss/impl/expanded_scanners.h>
24
+ #include <faiss/utils/distances_dispatch.h>
25
25
  #include <faiss/utils/extra_distances.h>
26
+
27
+ #define THE_SIMD_LEVEL SIMDLevel::NONE
28
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
29
+ #include <faiss/utils/simd_impl/IVFFlatScanner-inl.h>
30
+
26
31
  #include <faiss/utils/utils.h>
27
32
 
28
33
  namespace faiss {
@@ -32,18 +37,18 @@ namespace faiss {
32
37
  ******************************************/
33
38
 
34
39
  IndexIVFFlat::IndexIVFFlat(
35
- Index* quantizer,
36
- size_t d,
37
- size_t nlist,
40
+ Index* quantizer_in,
41
+ size_t d_in,
42
+ size_t nlist_in,
38
43
  MetricType metric,
39
- bool own_invlists)
44
+ bool own_invlists_in)
40
45
  : IndexIVF(
41
- quantizer,
42
- d,
43
- nlist,
44
- sizeof(float) * d,
46
+ quantizer_in,
47
+ d_in,
48
+ nlist_in,
49
+ sizeof(float) * d_in,
45
50
  metric,
46
- own_invlists) {
51
+ own_invlists_in) {
47
52
  code_size = sizeof(float) * d;
48
53
  by_residual = false;
49
54
  }
@@ -61,7 +66,7 @@ void IndexIVFFlat::add_core(
61
66
  FAISS_THROW_IF_NOT(is_trained);
62
67
  FAISS_THROW_IF_NOT(coarse_idx);
63
68
  FAISS_THROW_IF_NOT(!by_residual);
64
- assert(invlists);
69
+ FAISS_THROW_IF_NOT_MSG(invlists, "invlists not initialized");
65
70
  direct_map.check_can_add(xids);
66
71
 
67
72
  int64_t n_add = 0;
@@ -74,7 +79,7 @@ void IndexIVFFlat::add_core(
74
79
  int rank = omp_get_thread_num();
75
80
 
76
81
  // each thread takes care of a subset of lists
77
- for (size_t i = 0; i < n; i++) {
82
+ for (idx_t i = 0; i < n; i++) {
78
83
  idx_t list_no = coarse_idx[i];
79
84
 
80
85
  if (list_no >= 0 && list_no % nt == rank) {
@@ -110,7 +115,7 @@ void IndexIVFFlat::encode_vectors(
110
115
  memcpy(codes, x, code_size * n);
111
116
  } else {
112
117
  size_t coarse_size = coarse_code_size();
113
- for (size_t i = 0; i < n; i++) {
118
+ for (idx_t i = 0; i < n; i++) {
114
119
  int64_t list_no = list_nos[i];
115
120
  uint8_t* code = codes + i * (code_size + coarse_size);
116
121
  const float* xi = x + i * d;
@@ -129,7 +134,7 @@ void IndexIVFFlat::decode_vectors(
129
134
  const uint8_t* codes,
130
135
  const idx_t* /*listnos*/,
131
136
  float* x) const {
132
- for (size_t i = 0; i < n; i++) {
137
+ for (idx_t i = 0; i < n; i++) {
133
138
  const uint8_t* code = codes + i * code_size;
134
139
  float* xi = x + i * d;
135
140
  memcpy(xi, code, code_size);
@@ -138,114 +143,21 @@ void IndexIVFFlat::decode_vectors(
138
143
 
139
144
  void IndexIVFFlat::sa_decode(idx_t n, const uint8_t* bytes, float* x) const {
140
145
  size_t coarse_size = coarse_code_size();
141
- for (size_t i = 0; i < n; i++) {
146
+ for (idx_t i = 0; i < n; i++) {
142
147
  const uint8_t* code = bytes + i * (code_size + coarse_size);
143
148
  float* xi = x + i * d;
144
149
  memcpy(xi, code + coarse_size, code_size);
145
150
  }
146
151
  }
147
152
 
148
- namespace {
149
-
150
- template <typename VectorDistance, bool use_sel>
151
- struct IVFFlatScanner : InvertedListScanner {
152
- VectorDistance vd;
153
- using C = typename VectorDistance::C;
154
-
155
- IVFFlatScanner(
156
- const VectorDistance& vd,
157
- bool store_pairs,
158
- const IDSelector* sel)
159
- : InvertedListScanner(store_pairs, sel), vd(vd) {
160
- keep_max = vd.is_similarity;
161
- code_size = vd.d * sizeof(float);
162
- }
163
-
164
- const float* xi;
165
- void set_query(const float* query) override {
166
- this->xi = query;
167
- }
168
-
169
- void set_list(idx_t list_no, float /* coarse_dis */) override {
170
- this->list_no = list_no;
171
- }
172
-
173
- float distance_to_code(const uint8_t* code) const override {
174
- const float* yj = (float*)code;
175
- return vd(xi, yj);
176
- }
177
-
178
- size_t scan_codes(
179
- size_t list_size,
180
- const uint8_t* codes,
181
- const idx_t* ids,
182
- float* simi,
183
- idx_t* idxi,
184
- size_t k) const override {
185
- const float* list_vecs = (const float*)codes;
186
- size_t nup = 0;
187
- for (size_t j = 0; j < list_size; j++) {
188
- const float* yj = list_vecs + vd.d * j;
189
- if (use_sel && !sel->is_member(ids[j])) {
190
- continue;
191
- }
192
- float dis = vd(xi, yj);
193
- if (C::cmp(simi[0], dis)) {
194
- int64_t id = store_pairs ? lo_build(list_no, j) : ids[j];
195
- heap_replace_top<C>(k, simi, idxi, dis, id);
196
- nup++;
197
- }
198
- }
199
- return nup;
200
- }
201
-
202
- void scan_codes_range(
203
- size_t list_size,
204
- const uint8_t* codes,
205
- const idx_t* ids,
206
- float radius,
207
- RangeQueryResult& res) const override {
208
- const float* list_vecs = (const float*)codes;
209
- for (size_t j = 0; j < list_size; j++) {
210
- const float* yj = list_vecs + vd.d * j;
211
- if (use_sel && !sel->is_member(ids[j])) {
212
- continue;
213
- }
214
- float dis = vd(xi, yj);
215
- if (C::cmp(radius, dis)) {
216
- int64_t id = store_pairs ? lo_build(list_no, j) : ids[j];
217
- res.add(dis, id);
218
- }
219
- }
220
- }
221
- };
222
-
223
- struct Run_get_InvertedListScanner {
224
- using T = InvertedListScanner*;
225
-
226
- template <class VD>
227
- InvertedListScanner* f(
228
- VD& vd,
229
- const IndexIVFFlat* ivf,
230
- bool store_pairs,
231
- const IDSelector* sel) {
232
- if (sel) {
233
- return new IVFFlatScanner<VD, true>(vd, store_pairs, sel);
234
- } else {
235
- return new IVFFlatScanner<VD, false>(vd, store_pairs, sel);
236
- }
237
- }
238
- };
239
-
240
- } // anonymous namespace
241
-
242
153
  InvertedListScanner* IndexIVFFlat::get_InvertedListScanner(
243
154
  bool store_pairs,
244
155
  const IDSelector* sel,
245
156
  const IVFSearchParameters*) const {
246
- Run_get_InvertedListScanner run;
247
- return dispatch_VectorDistance(
248
- d, metric_type, metric_arg, run, this, store_pairs, sel);
157
+ return with_VectorDistance(
158
+ d, metric_type, metric_arg, [&](auto vd) -> InvertedListScanner* {
159
+ return new IVFFlatScanner<decltype(vd)>(vd, store_pairs, sel);
160
+ });
249
161
  }
250
162
 
251
163
  void IndexIVFFlat::reconstruct_from_offset(
@@ -260,12 +172,17 @@ void IndexIVFFlat::reconstruct_from_offset(
260
172
  ******************************************/
261
173
 
262
174
  IndexIVFFlatDedup::IndexIVFFlatDedup(
263
- Index* quantizer,
264
- size_t d,
265
- size_t nlist_,
266
- MetricType metric_type,
267
- bool own_invlists)
268
- : IndexIVFFlat(quantizer, d, nlist_, metric_type, own_invlists) {}
175
+ Index* quantizer_in,
176
+ size_t d_in,
177
+ size_t nlist_in,
178
+ MetricType metric_type_in,
179
+ bool own_invlists_in)
180
+ : IndexIVFFlat(
181
+ quantizer_in,
182
+ d_in,
183
+ nlist_in,
184
+ metric_type_in,
185
+ own_invlists_in) {}
269
186
 
270
187
  void IndexIVFFlatDedup::train(idx_t n, const float* x) {
271
188
  std::unordered_map<uint64_t, idx_t> map;
@@ -298,7 +215,7 @@ void IndexIVFFlatDedup::add_with_ids(
298
215
  const float* x,
299
216
  const idx_t* xids) {
300
217
  FAISS_THROW_IF_NOT(is_trained);
301
- assert(invlists);
218
+ FAISS_THROW_IF_NOT_MSG(invlists, "invlists not initialized");
302
219
  FAISS_THROW_IF_NOT_MSG(
303
220
  direct_map.no(), "IVFFlatDedup not implemented with direct_map");
304
221
  std::unique_ptr<int64_t[]> idx(new int64_t[na]);
@@ -312,7 +229,7 @@ void IndexIVFFlatDedup::add_with_ids(
312
229
  int rank = omp_get_thread_num();
313
230
 
314
231
  // each thread takes care of a subset of lists
315
- for (size_t i = 0; i < na; i++) {
232
+ for (idx_t i = 0; i < na; i++) {
316
233
  int64_t list_no = idx[i];
317
234
 
318
235
  if (list_no < 0 || list_no % nt != rank) {
@@ -371,7 +288,7 @@ void IndexIVFFlatDedup::search_preassigned(
371
288
  idx_t* labels,
372
289
  bool store_pairs,
373
290
  const IVFSearchParameters* params,
374
- IndexIVFStats* stats) const {
291
+ IndexIVFStats* /*stats*/) const {
375
292
  FAISS_THROW_IF_NOT_MSG(
376
293
  !store_pairs, "store_pairs not supported in IVFDedup");
377
294
 
@@ -452,7 +369,7 @@ size_t IndexIVFFlatDedup::remove_ids(const IDSelector& sel) {
452
369
  std::vector<int64_t> toremove(nlist);
453
370
 
454
371
  #pragma omp parallel for
455
- for (int64_t i = 0; i < nlist; i++) {
372
+ for (idx_t i = 0; i < static_cast<idx_t>(nlist); i++) {
456
373
  int64_t l0 = invlists->list_size(i), l = l0, j = 0;
457
374
  InvertedLists::ScopedIds idsi(invlists, i);
458
375
  while (j < l) {
@@ -480,7 +397,7 @@ size_t IndexIVFFlatDedup::remove_ids(const IDSelector& sel) {
480
397
  }
481
398
  // this will not run well in parallel on ondisk because of possible shrinks
482
399
  int64_t nremove = 0;
483
- for (int64_t i = 0; i < nlist; i++) {
400
+ for (idx_t i = 0; i < static_cast<idx_t>(nlist); i++) {
484
401
  if (toremove[i] > 0) {
485
402
  nremove += toremove[i];
486
403
  invlists->resize(i, invlists->list_size(i) - toremove[i]);
@@ -62,6 +62,38 @@ struct IndexIVFFlat : IndexIVF {
62
62
  IndexIVFFlat();
63
63
  };
64
64
 
65
+ template <typename VectorDistance>
66
+ struct IVFFlatScanner : InvertedListScanner {
67
+ VectorDistance vd;
68
+ using C = typename VectorDistance::C;
69
+
70
+ IVFFlatScanner(
71
+ const VectorDistance& vd,
72
+ bool store_pairs,
73
+ const IDSelector* sel)
74
+ : InvertedListScanner(store_pairs, sel), vd(vd) {
75
+ keep_max = vd.is_similarity;
76
+ code_size = vd.d * sizeof(float);
77
+ }
78
+
79
+ const float* xi = nullptr;
80
+ void set_query(const float* query) override {
81
+ this->xi = query;
82
+ }
83
+
84
+ void set_list(idx_t list_no, float /* coarse_dis */) override {
85
+ this->list_no = list_no;
86
+ }
87
+
88
+ float distance_to_code(const uint8_t* code) const final;
89
+
90
+ size_t scan_codes(
91
+ size_t list_size,
92
+ const uint8_t* codes,
93
+ const idx_t* ids,
94
+ ResultHandler& handler) const override;
95
+ };
96
+
65
97
  struct IndexIVFFlatDedup : IndexIVFFlat {
66
98
  /** Maps ids stored in the index to the ids of vectors that are
67
99
  * the same. When a vector is unique, it does not appear in the