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
@@ -12,16 +12,46 @@
12
12
  #pragma once
13
13
 
14
14
  #include <faiss/impl/AuxIndexStructures.h>
15
+ #include <faiss/impl/FaissAssert.h>
15
16
  #include <faiss/impl/FaissException.h>
16
17
  #include <faiss/impl/IDSelector.h>
18
+ #include <faiss/impl/InvertedListScannerStats.h>
17
19
  #include <faiss/utils/Heap.h>
18
20
  #include <faiss/utils/partitioning.h>
19
-
20
21
  #include <algorithm>
21
22
  #include <iostream>
22
23
 
23
24
  namespace faiss {
24
25
 
26
+ /* result handlers for a single query */
27
+
28
+ template <typename T, typename TI>
29
+ struct ResultHandlerUnordered {
30
+ // if not better than threshold, then not necessary to call add_result
31
+ T threshold{};
32
+
33
+ // per-list scan statistics populated by inverted-list scanners
34
+ InvertedListScannerStats stats;
35
+
36
+ // return whether threshold was updated
37
+ virtual bool add_result(T dis, TI idx) = 0;
38
+
39
+ virtual ~ResultHandlerUnordered() {}
40
+ };
41
+
42
+ // handler for a single query
43
+ template <class C>
44
+ struct ResultHandlerT : ResultHandlerUnordered<typename C::T, typename C::TI> {
45
+ ResultHandlerT() {
46
+ this->threshold = C::neutral();
47
+ }
48
+
49
+ virtual ~ResultHandlerT() {}
50
+ };
51
+
52
+ // generic handler for searching in float indexes
53
+ using ResultHandler = ResultHandlerUnordered<float, idx_t>;
54
+
25
55
  /*****************************************************************
26
56
  * The classes below are intended to be used as template arguments
27
57
  * they handle results for batches of queries (size nq).
@@ -40,8 +70,8 @@ struct BlockResultHandler {
40
70
  size_t nq; // number of queries for which we search
41
71
  const IDSelector* sel;
42
72
 
43
- explicit BlockResultHandler(size_t nq, const IDSelector* sel = nullptr)
44
- : nq(nq), sel(sel) {
73
+ explicit BlockResultHandler(size_t nq_, const IDSelector* sel_ = nullptr)
74
+ : nq(nq_), sel(sel_) {
45
75
  assert(!use_sel || sel);
46
76
  }
47
77
 
@@ -67,16 +97,44 @@ struct BlockResultHandler {
67
97
  }
68
98
  };
69
99
 
70
- // handler for a single query
71
- template <class C>
72
- struct ResultHandler {
73
- // if not better than threshold, then not necessary to call add_result
74
- typename C::T threshold = C::neutral();
100
+ /*****************************************************************
101
+ * Convenience classes for float Indexes
102
+ *****************************************************************/
75
103
 
76
- // return whether threshold was updated
77
- virtual bool add_result(typename C::T dis, typename C::TI idx) = 0;
104
+ // fake BlockResultHandler for a single query
105
+ template <class C, bool use_sel>
106
+ struct SingleQueryBlockResultHandler : BlockResultHandler<C, use_sel> {
107
+ using T = typename C::T;
108
+ using TI = typename C::TI;
109
+ using BlockResultHandler<C, use_sel>::i0;
110
+ using BlockResultHandler<C, use_sel>::i1;
111
+
112
+ ResultHandler& the_handler;
113
+
114
+ explicit SingleQueryBlockResultHandler(
115
+ ResultHandler& the_handler_in,
116
+ const IDSelector* sel_in = nullptr)
117
+ : BlockResultHandler<C, use_sel>(1, sel_in),
118
+ the_handler(the_handler_in) {}
119
+
120
+ struct SingleResultHandler : ResultHandlerT<C> {
121
+ ResultHandler& the_handler;
122
+ using ResultHandlerT<C>::threshold;
123
+
124
+ explicit SingleResultHandler(SingleQueryBlockResultHandler& hr)
125
+ : the_handler(hr.the_handler) {}
126
+
127
+ /// begin results for query # i
128
+ void begin(const size_t /* qid */) {}
129
+
130
+ /// add one result for query i
131
+ bool add_result(T dis, TI idx) final {
132
+ return the_handler.add_result(dis, idx);
133
+ }
78
134
 
79
- virtual ~ResultHandler() {}
135
+ /// series of results for query i is done
136
+ void end() {}
137
+ };
80
138
  };
81
139
 
82
140
  /*****************************************************************
@@ -93,15 +151,15 @@ struct TopkBlockResultHandler : BlockResultHandler<C, use_sel> {
93
151
  int64_t k; // number of results to keep
94
152
 
95
153
  TopkBlockResultHandler(
96
- size_t nq,
97
- T* dis_tab,
98
- TI* ids_tab,
99
- size_t k,
100
- const IDSelector* sel = nullptr)
101
- : BlockResultHandler<C, use_sel>(nq, sel),
102
- dis_tab(dis_tab),
103
- ids_tab(ids_tab),
104
- k(k) {}
154
+ size_t nq_,
155
+ T* dis_tab_,
156
+ TI* ids_tab_,
157
+ size_t k_,
158
+ const IDSelector* sel_ = nullptr)
159
+ : BlockResultHandler<C, use_sel>(nq_, sel_),
160
+ dis_tab(dis_tab_),
161
+ ids_tab(ids_tab_),
162
+ k(k_) {}
105
163
 
106
164
  ~TopkBlockResultHandler() {}
107
165
  };
@@ -120,21 +178,25 @@ struct Top1BlockResultHandler : TopkBlockResultHandler<C, use_sel> {
120
178
  using BlockResultHandler<C, use_sel>::i1;
121
179
 
122
180
  Top1BlockResultHandler(
123
- size_t nq,
124
- T* dis_tab,
125
- TI* ids_tab,
126
- const IDSelector* sel = nullptr)
127
- : TopkBlockResultHandler<C, use_sel>(nq, dis_tab, ids_tab, 1, sel) {
128
- }
129
-
130
- struct SingleResultHandler : ResultHandler<C> {
181
+ size_t nq_,
182
+ T* dis_tab_,
183
+ TI* ids_tab_,
184
+ const IDSelector* sel_ = nullptr)
185
+ : TopkBlockResultHandler<C, use_sel>(
186
+ nq_,
187
+ dis_tab_,
188
+ ids_tab_,
189
+ 1,
190
+ sel_) {}
191
+
192
+ struct SingleResultHandler : ResultHandlerT<C> {
131
193
  Top1BlockResultHandler& hr;
132
- using ResultHandler<C>::threshold;
194
+ using ResultHandlerT<C>::threshold;
133
195
 
134
196
  TI min_idx;
135
197
  size_t current_idx = 0;
136
198
 
137
- explicit SingleResultHandler(Top1BlockResultHandler& hr) : hr(hr) {}
199
+ explicit SingleResultHandler(Top1BlockResultHandler& hr_) : hr(hr_) {}
138
200
 
139
201
  /// begin results for query # i
140
202
  void begin(const size_t current_idx_2) {
@@ -161,9 +223,9 @@ struct Top1BlockResultHandler : TopkBlockResultHandler<C, use_sel> {
161
223
  };
162
224
 
163
225
  /// begin
164
- void begin_multiple(size_t i0, size_t i1) final {
165
- this->i0 = i0;
166
- this->i1 = i1;
226
+ void begin_multiple(size_t i0_in, size_t i1_in) final {
227
+ this->i0 = i0_in;
228
+ this->i1 = i1_in;
167
229
 
168
230
  for (size_t i = i0; i < i1; i++) {
169
231
  this->dis_tab[i] = C::neutral();
@@ -172,7 +234,7 @@ struct Top1BlockResultHandler : TopkBlockResultHandler<C, use_sel> {
172
234
 
173
235
  /// add results for query i0..i1 and j0..j1
174
236
  void add_results(size_t j0, size_t j1, const T* dis_tab_2) final {
175
- for (int64_t i = i0; i < i1; i++) {
237
+ for (size_t i = i0; i < i1; i++) {
176
238
  const T* dis_tab_i = dis_tab_2 + (j1 - j0) * (i - i0) - j0;
177
239
 
178
240
  auto& min_distance = this->dis_tab[i];
@@ -204,6 +266,34 @@ struct Top1BlockResultHandler : TopkBlockResultHandler<C, use_sel> {
204
266
  * Heap based result handler
205
267
  *****************************************************************/
206
268
 
269
+ template <class C, bool use_sel = false>
270
+ struct HeapResultHandler : ResultHandlerT<C> {
271
+ using T = typename C::T;
272
+ using TI = typename C::TI;
273
+ using ResultHandlerT<C>::threshold;
274
+ size_t k;
275
+
276
+ T* heap_dis;
277
+ TI* heap_ids;
278
+
279
+ HeapResultHandler(size_t k_, T* heap_dis_, TI* heap_ids_)
280
+ : k(k_), heap_dis(heap_dis_), heap_ids(heap_ids_) {
281
+ if (heap_dis) {
282
+ this->threshold = heap_dis[0];
283
+ }
284
+ }
285
+
286
+ /// add one result for query i
287
+ bool add_result(T dis, TI idx) final {
288
+ if (C::cmp(threshold, dis)) {
289
+ heap_replace_top<C>(k, heap_dis, heap_ids, dis, idx);
290
+ threshold = heap_dis[0];
291
+ return true;
292
+ }
293
+ return false;
294
+ }
295
+ };
296
+
207
297
  template <class C, bool use_sel = false>
208
298
  struct HeapBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
209
299
  using T = typename C::T;
@@ -213,50 +303,41 @@ struct HeapBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
213
303
  using TopkBlockResultHandler<C, use_sel>::k;
214
304
 
215
305
  HeapBlockResultHandler(
216
- size_t nq,
217
- T* dis_tab,
218
- TI* ids_tab,
219
- size_t k,
220
- const IDSelector* sel = nullptr)
221
- : TopkBlockResultHandler<C, use_sel>(nq, dis_tab, ids_tab, k, sel) {
222
- }
306
+ size_t nq_,
307
+ T* dis_tab_,
308
+ TI* ids_tab_,
309
+ size_t k_,
310
+ const IDSelector* sel_ = nullptr)
311
+ : TopkBlockResultHandler<C, use_sel>(
312
+ nq_,
313
+ dis_tab_,
314
+ ids_tab_,
315
+ k_,
316
+ sel_) {}
317
+
223
318
  /******************************************************
224
319
  * API for 1 result at a time (each SingleResultHandler is
225
320
  * called from 1 thread)
226
321
  */
227
322
 
228
- struct SingleResultHandler : ResultHandler<C> {
323
+ struct SingleResultHandler : HeapResultHandler<C, use_sel> {
229
324
  HeapBlockResultHandler& hr;
230
- using ResultHandler<C>::threshold;
231
- size_t k;
232
-
233
- T* heap_dis;
234
- TI* heap_ids;
235
325
 
236
- explicit SingleResultHandler(HeapBlockResultHandler& hr)
237
- : hr(hr), k(hr.k) {}
326
+ explicit SingleResultHandler(HeapBlockResultHandler& hr_)
327
+ : HeapResultHandler<C, use_sel>(hr_.k, nullptr, nullptr),
328
+ hr(hr_) {}
238
329
 
239
330
  /// begin results for query # i
240
331
  void begin(size_t i) {
241
- heap_dis = hr.dis_tab + i * k;
242
- heap_ids = hr.ids_tab + i * k;
243
- heap_heapify<C>(k, heap_dis, heap_ids);
244
- threshold = heap_dis[0];
245
- }
246
-
247
- /// add one result for query i
248
- bool add_result(T dis, TI idx) final {
249
- if (C::cmp(threshold, dis)) {
250
- heap_replace_top<C>(k, heap_dis, heap_ids, dis, idx);
251
- threshold = heap_dis[0];
252
- return true;
253
- }
254
- return false;
332
+ this->heap_dis = hr.dis_tab + i * this->k;
333
+ this->heap_ids = hr.ids_tab + i * this->k;
334
+ heap_heapify<C>(this->k, this->heap_dis, this->heap_ids);
335
+ this->threshold = this->heap_dis[0];
255
336
  }
256
337
 
257
338
  /// series of results for query i is done
258
339
  void end() {
259
- heap_reorder<C>(k, heap_dis, heap_ids);
340
+ heap_reorder<C>(this->k, this->heap_dis, this->heap_ids);
260
341
  }
261
342
  };
262
343
 
@@ -275,12 +356,14 @@ struct HeapBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
275
356
  }
276
357
 
277
358
  /// add results for query i0..i1 and j0..j1
278
- void add_results(size_t j0, size_t j1, const T* dis_tab) final {
359
+ void add_results(size_t j0, size_t j1, const T* dis_in) final {
279
360
  #pragma omp parallel for
280
- for (int64_t i = i0; i < i1; i++) {
361
+ for (int64_t i = static_cast<int64_t>(i0); i < static_cast<int64_t>(i1);
362
+ i++) {
281
363
  T* heap_dis = this->dis_tab + i * k;
282
364
  TI* heap_ids = this->ids_tab + i * k;
283
- const T* dis_tab_i = dis_tab + (j1 - j0) * (i - i0) - j0;
365
+ const T* dis_tab_i =
366
+ dis_in + (j1 - j0) * (i - static_cast<int64_t>(i0)) - j0;
284
367
  T thresh = heap_dis[0];
285
368
  for (size_t j = j0; j < j1; j++) {
286
369
  T dis = dis_tab_i[j];
@@ -294,8 +377,9 @@ struct HeapBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
294
377
 
295
378
  /// series of results for queries i0..i1 is done
296
379
  void end_multiple() final {
297
- // maybe parallel for
298
- for (size_t i = i0; i < i1; i++) {
380
+ #pragma omp parallel for schedule(static) if ((i1 - i0) * k >= 1024)
381
+ for (int64_t i = static_cast<int64_t>(i0); i < static_cast<int64_t>(i1);
382
+ i++) {
299
383
  heap_reorder<C>(k, this->dis_tab + i * k, this->ids_tab + i * k);
300
384
  }
301
385
  }
@@ -312,10 +396,10 @@ struct HeapBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
312
396
 
313
397
  /// Reservoir for a single query
314
398
  template <class C>
315
- struct ReservoirTopN : ResultHandler<C> {
399
+ struct ReservoirTopN : ResultHandlerT<C> {
316
400
  using T = typename C::T;
317
401
  using TI = typename C::TI;
318
- using ResultHandler<C>::threshold;
402
+ using ResultHandlerT<C>::threshold;
319
403
 
320
404
  T* vals;
321
405
  TI* ids;
@@ -326,8 +410,8 @@ struct ReservoirTopN : ResultHandler<C> {
326
410
 
327
411
  ReservoirTopN() {}
328
412
 
329
- ReservoirTopN(size_t n, size_t capacity, T* vals, TI* ids)
330
- : vals(vals), ids(ids), i(0), n(n), capacity(capacity) {
413
+ ReservoirTopN(size_t n_, size_t capacity_, T* vals_, TI* ids_)
414
+ : vals(vals_), ids(ids_), i(0), n(n_), capacity(capacity_) {
331
415
  assert(n < capacity);
332
416
  threshold = C::neutral();
333
417
  }
@@ -365,7 +449,7 @@ struct ReservoirTopN : ResultHandler<C> {
365
449
  }
366
450
 
367
451
  void to_result(T* heap_dis, TI* heap_ids) const {
368
- for (int j = 0; j < std::min(i, n); j++) {
452
+ for (size_t j = 0; j < std::min(i, n); j++) {
369
453
  heap_push<C>(j + 1, heap_dis, heap_ids, vals[j], ids[j]);
370
454
  }
371
455
 
@@ -387,16 +471,22 @@ struct ReservoirBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
387
471
  using TI = typename C::TI;
388
472
  using BlockResultHandler<C, use_sel>::i0;
389
473
  using BlockResultHandler<C, use_sel>::i1;
474
+ using TopkBlockResultHandler<C, use_sel>::k;
390
475
 
391
476
  size_t capacity; // capacity of the reservoirs
392
477
 
393
478
  ReservoirBlockResultHandler(
394
- size_t nq,
395
- T* dis_tab,
396
- TI* ids_tab,
397
- size_t k,
398
- const IDSelector* sel = nullptr)
399
- : TopkBlockResultHandler<C, use_sel>(nq, dis_tab, ids_tab, k, sel) {
479
+ size_t nq_,
480
+ T* dis_tab_,
481
+ TI* ids_tab_,
482
+ size_t k_,
483
+ const IDSelector* sel_ = nullptr)
484
+ : TopkBlockResultHandler<C, use_sel>(
485
+ nq_,
486
+ dis_tab_,
487
+ ids_tab_,
488
+ k_,
489
+ sel_) {
400
490
  // double then round up to multiple of 16 (for SIMD alignment)
401
491
  capacity = (2 * k + 15) & ~15;
402
492
  }
@@ -412,9 +502,9 @@ struct ReservoirBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
412
502
  std::vector<T> reservoir_dis;
413
503
  std::vector<TI> reservoir_ids;
414
504
 
415
- explicit SingleResultHandler(ReservoirBlockResultHandler& hr)
416
- : ReservoirTopN<C>(hr.k, hr.capacity, nullptr, nullptr),
417
- hr(hr) {}
505
+ explicit SingleResultHandler(ReservoirBlockResultHandler& hr_)
506
+ : ReservoirTopN<C>(hr_.k, hr_.capacity, nullptr, nullptr),
507
+ hr(hr_) {}
418
508
 
419
509
  size_t qno;
420
510
 
@@ -462,11 +552,14 @@ struct ReservoirBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
462
552
  }
463
553
 
464
554
  /// add results for query i0..i1 and j0..j1
465
- void add_results(size_t j0, size_t j1, const T* dis_tab) {
555
+ void add_results(size_t j0, size_t j1, const T* dis_in) {
466
556
  #pragma omp parallel for
467
- for (int64_t i = i0; i < i1; i++) {
468
- ReservoirTopN<C>& reservoir = reservoirs[i - i0];
469
- const T* dis_tab_i = dis_tab + (j1 - j0) * (i - i0) - j0;
557
+ for (int64_t i = static_cast<int64_t>(i0); i < static_cast<int64_t>(i1);
558
+ i++) {
559
+ ReservoirTopN<C>& reservoir =
560
+ reservoirs[i - static_cast<int64_t>(i0)];
561
+ const T* dis_tab_i =
562
+ dis_in + (j1 - j0) * (i - static_cast<int64_t>(i0)) - j0;
470
563
  for (size_t j = j0; j < j1; j++) {
471
564
  T dis = dis_tab_i[j];
472
565
  reservoir.add_result(dis, j);
@@ -476,9 +569,10 @@ struct ReservoirBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
476
569
 
477
570
  /// series of results for queries i0..i1 is done
478
571
  void end_multiple() final {
479
- // maybe parallel for
480
- for (size_t i = i0; i < i1; i++) {
481
- reservoirs[i - i0].to_result(
572
+ #pragma omp parallel for schedule(static) if ((i1 - i0) * this->k >= 1024)
573
+ for (int64_t i = static_cast<int64_t>(i0); i < static_cast<int64_t>(i1);
574
+ i++) {
575
+ reservoirs[i - static_cast<int64_t>(i0)].to_result(
482
576
  this->dis_tab + i * this->k, this->ids_tab + i * this->k);
483
577
  }
484
578
  }
@@ -488,6 +582,28 @@ struct ReservoirBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
488
582
  * Result handler for range searches
489
583
  *****************************************************************/
490
584
 
585
+ template <class C, bool use_sel = false>
586
+ struct RangeResultHandler : ResultHandlerT<C> {
587
+ using T = typename C::T;
588
+ using TI = typename C::TI;
589
+ using ResultHandlerT<C>::threshold;
590
+
591
+ RangeQueryResult* qr = nullptr;
592
+
593
+ RangeResultHandler(RangeQueryResult* qr_, T threshold_) : qr(qr_) {
594
+ this->threshold = threshold_;
595
+ }
596
+
597
+ /// add one result for query i
598
+ bool add_result(T dis, TI idx) final {
599
+ if (C::cmp(threshold, dis)) {
600
+ qr->add(dis, idx);
601
+ return true;
602
+ }
603
+ return false;
604
+ }
605
+ };
606
+
491
607
  template <class C, bool use_sel = false>
492
608
  struct RangeSearchBlockResultHandler : BlockResultHandler<C, use_sel> {
493
609
  using T = typename C::T;
@@ -499,40 +615,29 @@ struct RangeSearchBlockResultHandler : BlockResultHandler<C, use_sel> {
499
615
  T radius;
500
616
 
501
617
  RangeSearchBlockResultHandler(
502
- RangeSearchResult* res,
503
- float radius,
504
- const IDSelector* sel = nullptr)
505
- : BlockResultHandler<C, use_sel>(res->nq, sel),
506
- res(res),
507
- radius(radius) {}
618
+ RangeSearchResult* res_,
619
+ float radius_,
620
+ const IDSelector* sel_ = nullptr)
621
+ : BlockResultHandler<C, use_sel>(res_->nq, sel_),
622
+ res(res_),
623
+ radius(radius_) {}
508
624
 
509
625
  /******************************************************
510
626
  * API for 1 result at a time (each SingleResultHandler is
511
627
  * called from 1 thread)
512
628
  ******************************************************/
513
629
 
514
- struct SingleResultHandler : ResultHandler<C> {
630
+ struct SingleResultHandler : RangeResultHandler<C> {
515
631
  // almost the same interface as RangeSearchResultHandler
516
- using ResultHandler<C>::threshold;
632
+ using ResultHandlerT<C>::threshold;
517
633
  RangeSearchPartialResult pres;
518
- RangeQueryResult* qr = nullptr;
519
634
 
520
635
  explicit SingleResultHandler(RangeSearchBlockResultHandler& rh)
521
- : pres(rh.res) {
522
- threshold = rh.radius;
523
- }
636
+ : RangeResultHandler<C>(nullptr, rh.radius), pres(rh.res) {}
524
637
 
525
638
  /// begin results for query # i
526
639
  void begin(size_t i) {
527
- qr = &pres.new_result(i);
528
- }
529
-
530
- /// add one result for query i
531
- bool add_result(T dis, TI idx) final {
532
- if (C::cmp(threshold, dis)) {
533
- qr->add(dis, idx);
534
- }
535
- return false;
640
+ this->qr = &pres.new_result(i);
536
641
  }
537
642
 
538
643
  /// series of results for query i is done
@@ -575,7 +680,7 @@ struct RangeSearchBlockResultHandler : BlockResultHandler<C, use_sel> {
575
680
  // it is a bit tricky to find the proper PartialResult structure
576
681
  // because the inner loop is on db not on queries.
577
682
 
578
- if (pr < j0s.size() && j0 == j0s[pr]) {
683
+ if (static_cast<size_t>(pr) < j0s.size() && j0 == j0s[pr]) {
579
684
  pres = partial_results[pr];
580
685
  pr++;
581
686
  } else if (j0 == 0 && j0s.size() > 0) {
@@ -637,7 +742,7 @@ typename Consumer::T dispatch_knn_ResultHandler(
637
742
  if (k == 1) { \
638
743
  Top1BlockResultHandler<C, use_sel> res(nx, vals, ids, sel); \
639
744
  return consumer.template f<>(res, args...); \
640
- } else if (k < distance_compute_min_k_reservoir) { \
745
+ } else if (k < static_cast<size_t>(distance_compute_min_k_reservoir)) { \
641
746
  HeapBlockResultHandler<C, use_sel> res(nx, vals, ids, k, sel); \
642
747
  return consumer.template f<>(res, args...); \
643
748
  } else { \