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
@@ -22,18 +22,22 @@ namespace faiss {
22
22
  * IndexLSH
23
23
  ***************************************************************/
24
24
 
25
- IndexLSH::IndexLSH(idx_t d, int nbits, bool rotate_data, bool train_thresholds)
26
- : IndexFlatCodes((nbits + 7) / 8, d),
27
- nbits(nbits),
28
- rotate_data(rotate_data),
29
- train_thresholds(train_thresholds),
30
- rrot(d, nbits) {
31
- is_trained = !train_thresholds;
32
-
33
- if (rotate_data) {
25
+ IndexLSH::IndexLSH(
26
+ idx_t d_in,
27
+ int nbits_in,
28
+ bool rotate_data_in,
29
+ bool train_thresholds_in)
30
+ : IndexFlatCodes((nbits_in + 7) / 8, d_in),
31
+ nbits(nbits_in),
32
+ rotate_data(rotate_data_in),
33
+ train_thresholds(train_thresholds_in),
34
+ rrot(static_cast<int>(d_in), nbits_in) {
35
+ is_trained = !train_thresholds_in;
36
+
37
+ if (rotate_data_in) {
34
38
  rrot.init(5);
35
39
  } else {
36
- FAISS_THROW_IF_NOT(d >= nbits);
40
+ FAISS_THROW_IF_NOT(d_in >= nbits_in);
37
41
  }
38
42
  }
39
43
 
@@ -45,13 +49,18 @@ const float* IndexLSH::apply_preprocess(idx_t n, const float* x) const {
45
49
  // also applies bias if exists
46
50
  xt = rrot.apply(n, x);
47
51
  } else if (d != nbits) {
48
- assert(nbits < d);
52
+ FAISS_THROW_IF_NOT_FMT(
53
+ nbits < d,
54
+ "nbits (%d) must be less than d (%d)",
55
+ nbits,
56
+ (int)d);
49
57
  xt = new float[nbits * n];
50
58
  float* xp = xt;
51
59
  for (idx_t i = 0; i < n; i++) {
52
60
  const float* xl = x + i * d;
53
- for (int j = 0; j < nbits; j++)
61
+ for (int j = 0; j < nbits; j++) {
54
62
  *xp++ = xl[j];
63
+ }
55
64
  }
56
65
  }
57
66
 
@@ -62,9 +71,11 @@ const float* IndexLSH::apply_preprocess(idx_t n, const float* x) const {
62
71
  }
63
72
 
64
73
  float* xp = xt;
65
- for (idx_t i = 0; i < n; i++)
66
- for (int j = 0; j < nbits; j++)
74
+ for (idx_t i = 0; i < n; i++) {
75
+ for (int j = 0; j < nbits; j++) {
67
76
  *xp++ -= thresholds[j];
77
+ }
78
+ }
68
79
  }
69
80
 
70
81
  return xt ? xt : x;
@@ -80,18 +91,22 @@ void IndexLSH::train(idx_t n, const float* x) {
80
91
 
81
92
  std::unique_ptr<float[]> transposed_x(new float[n * nbits]);
82
93
 
83
- for (idx_t i = 0; i < n; i++)
84
- for (idx_t j = 0; j < nbits; j++)
94
+ for (idx_t i = 0; i < n; i++) {
95
+ for (idx_t j = 0; j < nbits; j++) {
85
96
  transposed_x[j * n + i] = xt[i * nbits + j];
97
+ }
98
+ }
86
99
 
87
100
  for (idx_t i = 0; i < nbits; i++) {
88
101
  float* xi = transposed_x.get() + i * n;
89
- // std::nth_element
90
- std::sort(xi, xi + n);
91
- if (n % 2 == 1)
92
- thresholds[i] = xi[n / 2];
93
- else
94
- thresholds[i] = (xi[n / 2 - 1] + xi[n / 2]) / 2;
102
+ // Use nth_element (O(n)) instead of sort (O(n log n))
103
+ std::nth_element(xi, xi + n / 2, xi + n);
104
+ float median = xi[n / 2];
105
+ if (n % 2 == 0) {
106
+ std::nth_element(xi, xi + n / 2 - 1, xi + n);
107
+ median = (median + xi[n / 2 - 1]) / 2;
108
+ }
109
+ thresholds[i] = median;
95
110
  }
96
111
  }
97
112
  is_trained = true;
@@ -122,20 +137,24 @@ void IndexLSH::search(
122
137
  hammings_knn_hc(&res, qcodes.get(), codes.data(), ntotal, code_size, true);
123
138
 
124
139
  // convert distances to floats
125
- for (int i = 0; i < k * n; i++)
140
+ for (int i = 0; i < k * n; i++) {
126
141
  distances[i] = idistances[i];
142
+ }
127
143
  }
128
144
 
129
145
  void IndexLSH::transfer_thresholds(LinearTransform* vt) {
130
- if (!train_thresholds)
146
+ if (!train_thresholds) {
131
147
  return;
148
+ }
132
149
  FAISS_THROW_IF_NOT(nbits == vt->d_out);
133
150
  if (!vt->have_bias) {
134
151
  vt->b.resize(nbits, 0);
135
152
  vt->have_bias = true;
136
153
  }
137
- for (int i = 0; i < nbits; i++)
154
+ FAISS_THROW_IF_NOT(!vt->b.empty());
155
+ for (int i = 0; i < nbits; i++) {
138
156
  vt->b[i] -= thresholds[i];
157
+ }
139
158
  train_thresholds = false;
140
159
  thresholds.clear();
141
160
  }
@@ -9,25 +9,26 @@
9
9
 
10
10
  #include <faiss/IndexLattice.h>
11
11
  #include <faiss/impl/FaissAssert.h>
12
+ #include <faiss/impl/simd_dispatch.h>
12
13
  #include <faiss/utils/distances.h>
13
14
  #include <faiss/utils/hamming.h> // for the bitstring routines
14
15
 
15
16
  namespace faiss {
16
17
 
17
- IndexLattice::IndexLattice(idx_t d, int nsq, int scale_nbit, int r2)
18
- : IndexFlatCodes(0, d, METRIC_L2),
19
- nsq(nsq),
20
- dsq(d / nsq),
21
- zn_sphere_codec(dsq, r2),
22
- scale_nbit(scale_nbit) {
23
- FAISS_THROW_IF_NOT(d % nsq == 0);
18
+ IndexLattice::IndexLattice(idx_t d_in, int nsq_in, int scale_nbit_in, int r2)
19
+ : IndexFlatCodes(0, d_in, METRIC_L2),
20
+ nsq(nsq_in),
21
+ dsq(d_in / nsq_in),
22
+ zn_sphere_codec(static_cast<int>(dsq), r2),
23
+ scale_nbit(scale_nbit_in) {
24
+ FAISS_THROW_IF_NOT(d_in % nsq_in == 0);
24
25
 
25
26
  lattice_nbit = 0;
26
27
  while (!(((uint64_t)1 << lattice_nbit) >= zn_sphere_codec.nv)) {
27
28
  lattice_nbit++;
28
29
  }
29
30
 
30
- int total_nbit = (lattice_nbit + scale_nbit) * nsq;
31
+ int total_nbit = (lattice_nbit + scale_nbit_in) * nsq_in;
31
32
 
32
33
  code_size = (total_nbit + 7) / 8;
33
34
 
@@ -44,17 +45,19 @@ void IndexLattice::train(idx_t n, const float* x) {
44
45
  maxs[sq] = -1;
45
46
  }
46
47
 
47
- for (idx_t i = 0; i < n; i++) {
48
- for (int sq = 0; sq < nsq; sq++) {
49
- float norm2 = fvec_norm_L2sqr(x + i * d + sq * dsq, dsq);
50
- if (norm2 > maxs[sq]) {
51
- maxs[sq] = norm2;
52
- }
53
- if (norm2 < mins[sq]) {
54
- mins[sq] = norm2;
48
+ with_simd_level([&]<SIMDLevel SL>() {
49
+ for (idx_t i = 0; i < n; i++) {
50
+ for (int sq = 0; sq < nsq; sq++) {
51
+ float norm2 = fvec_norm_L2sqr<SL>(x + i * d + sq * dsq, dsq);
52
+ if (norm2 > maxs[sq]) {
53
+ maxs[sq] = norm2;
54
+ }
55
+ if (norm2 < mins[sq]) {
56
+ mins[sq] = norm2;
57
+ }
55
58
  }
56
59
  }
57
- }
60
+ });
58
61
 
59
62
  for (int sq = 0; sq < nsq; sq++) {
60
63
  mins[sq] = sqrtf(mins[sq]);
@@ -69,32 +72,34 @@ size_t IndexLattice::sa_code_size() const {
69
72
  return code_size;
70
73
  }
71
74
 
72
- void IndexLattice::sa_encode(idx_t n, const float* x, uint8_t* codes) const {
75
+ void IndexLattice::sa_encode(idx_t n, const float* x, uint8_t* bytes) const {
73
76
  const float* mins = trained.data();
74
77
  const float* maxs = mins + nsq;
75
78
  int64_t sc = int64_t(1) << scale_nbit;
76
79
 
80
+ with_simd_level([&]<SIMDLevel SL>() {
77
81
  #pragma omp parallel for
78
- for (idx_t i = 0; i < n; i++) {
79
- BitstringWriter wr(codes + i * code_size, code_size);
80
- const float* xi = x + i * d;
81
- for (int j = 0; j < nsq; j++) {
82
- float nj = (sqrtf(fvec_norm_L2sqr(xi, dsq)) - mins[j]) * sc /
83
- (maxs[j] - mins[j]);
84
- if (nj < 0) {
85
- nj = 0;
86
- }
87
- if (nj >= sc) {
88
- nj = sc - 1;
82
+ for (idx_t i = 0; i < n; i++) {
83
+ BitstringWriter wr(bytes + i * code_size, code_size);
84
+ const float* xi = x + i * d;
85
+ for (int j = 0; j < nsq; j++) {
86
+ float nj = (sqrtf(fvec_norm_L2sqr<SL>(xi, dsq)) - mins[j]) *
87
+ sc / (maxs[j] - mins[j]);
88
+ if (nj < 0) {
89
+ nj = 0;
90
+ }
91
+ if (nj >= sc) {
92
+ nj = sc - 1;
93
+ }
94
+ wr.write((int64_t)nj, scale_nbit);
95
+ wr.write(zn_sphere_codec.encode(xi), lattice_nbit);
96
+ xi += dsq;
89
97
  }
90
- wr.write((int64_t)nj, scale_nbit);
91
- wr.write(zn_sphere_codec.encode(xi), lattice_nbit);
92
- xi += dsq;
93
98
  }
94
- }
99
+ });
95
100
  }
96
101
 
97
- void IndexLattice::sa_decode(idx_t n, const uint8_t* codes, float* x) const {
102
+ void IndexLattice::sa_decode(idx_t n, const uint8_t* bytes, float* x) const {
98
103
  const float* mins = trained.data();
99
104
  const float* maxs = mins + nsq;
100
105
  float sc = int64_t(1) << scale_nbit;
@@ -102,7 +107,7 @@ void IndexLattice::sa_decode(idx_t n, const uint8_t* codes, float* x) const {
102
107
 
103
108
  #pragma omp parallel for
104
109
  for (idx_t i = 0; i < n; i++) {
105
- BitstringReader rd(codes + i * code_size, code_size);
110
+ BitstringReader rd(bytes + i * code_size, code_size);
106
111
  float* xi = x + i * d;
107
112
  for (int j = 0; j < nsq; j++) {
108
113
  float norm =
@@ -110,7 +115,7 @@ void IndexLattice::sa_decode(idx_t n, const uint8_t* codes, float* x) const {
110
115
  mins[j];
111
116
  norm /= r;
112
117
  zn_sphere_codec.decode(rd.read(lattice_nbit), xi);
113
- for (int l = 0; l < dsq; l++) {
118
+ for (size_t l = 0; l < dsq; l++) {
114
119
  xi[l] *= norm;
115
120
  }
116
121
  xi += dsq;
@@ -9,6 +9,7 @@
9
9
 
10
10
  #include <faiss/IndexNNDescent.h>
11
11
 
12
+ #include <atomic>
12
13
  #include <cinttypes>
13
14
  #include <cstdio>
14
15
  #include <cstdlib>
@@ -19,7 +20,7 @@
19
20
  #include <faiss/IndexFlat.h>
20
21
  #include <faiss/impl/AuxIndexStructures.h>
21
22
  #include <faiss/impl/FaissAssert.h>
22
- #include <faiss/utils/distances.h>
23
+ #include <faiss/impl/VisitedTable.h>
23
24
 
24
25
  extern "C" {
25
26
 
@@ -65,17 +66,17 @@ DistanceComputer* storage_distance_computer(const Index* storage) {
65
66
  * IndexNNDescent implementation
66
67
  **************************************************************/
67
68
 
68
- IndexNNDescent::IndexNNDescent(int d, int K, MetricType metric)
69
- : Index(d, metric),
70
- nndescent(d, K),
69
+ IndexNNDescent::IndexNNDescent(int d_in, int K, MetricType metric)
70
+ : Index(d_in, metric),
71
+ nndescent(d_in, K),
71
72
  own_fields(false),
72
73
  storage(nullptr) {}
73
74
 
74
- IndexNNDescent::IndexNNDescent(Index* storage, int K)
75
- : Index(storage->d, storage->metric_type),
76
- nndescent(storage->d, K),
75
+ IndexNNDescent::IndexNNDescent(Index* storage_in, int K)
76
+ : Index(storage_in->d, storage_in->metric_type),
77
+ nndescent(storage_in->d, K),
77
78
  own_fields(false),
78
- storage(storage) {}
79
+ storage(storage_in) {}
79
80
 
80
81
  IndexNNDescent::~IndexNNDescent() {
81
82
  if (own_fields) {
@@ -118,28 +119,43 @@ void IndexNNDescent::search(
118
119
  for (idx_t i0 = 0; i0 < n; i0 += check_period) {
119
120
  idx_t i1 = std::min(i0 + check_period, n);
120
121
 
122
+ std::exception_ptr ex;
123
+ std::atomic<bool> interrupt{false};
121
124
  #pragma omp parallel
122
125
  {
123
- VisitedTable vt(ntotal);
124
-
125
- std::unique_ptr<DistanceComputer> dis(
126
- storage_distance_computer(storage));
126
+ std::unique_ptr<DistanceComputer> dis;
127
+ std::unique_ptr<VisitedTable> vt;
128
+ try {
129
+ vt = std::make_unique<VisitedTable>(ntotal);
130
+ dis.reset(storage_distance_computer(storage));
131
+ } catch (...) {
132
+ omp_capture_exception(ex, [&] { interrupt = true; });
133
+ }
127
134
 
128
135
  #pragma omp for
129
136
  for (idx_t i = i0; i < i1; i++) {
130
- idx_t* idxi = labels + i * k;
131
- float* simi = distances + i * k;
132
- dis->set_query(x + i * d);
133
-
134
- nndescent.search(*dis, k, idxi, simi, vt);
137
+ if (interrupt.load(std::memory_order_relaxed)) {
138
+ continue;
139
+ }
140
+ try {
141
+ idx_t* idxi = labels + i * k;
142
+ float* simi = distances + i * k;
143
+ dis->set_query(x + i * d);
144
+
145
+ nndescent.search(
146
+ *dis, static_cast<int>(k), idxi, simi, *vt);
147
+ } catch (...) {
148
+ omp_capture_exception(ex, [&] { interrupt = true; });
149
+ }
135
150
  }
136
151
  }
152
+ omp_rethrow_if_exception(ex);
137
153
  InterruptCallback::check();
138
154
  }
139
155
 
140
156
  if (metric_type == METRIC_INNER_PRODUCT) {
141
157
  // we need to revert the negated distances
142
- for (size_t i = 0; i < k * n; i++) {
158
+ for (idx_t i = 0; i < k * n; i++) {
143
159
  distances[i] = -distances[i];
144
160
  }
145
161
  }
@@ -162,7 +178,7 @@ void IndexNNDescent::add(idx_t n, const float* x) {
162
178
  ntotal = storage->ntotal;
163
179
 
164
180
  std::unique_ptr<DistanceComputer> dis(storage_distance_computer(storage));
165
- nndescent.build(*dis, ntotal, verbose);
181
+ nndescent.build(*dis, static_cast<int>(ntotal), verbose);
166
182
  }
167
183
 
168
184
  void IndexNNDescent::reset() {
@@ -183,8 +199,8 @@ IndexNNDescentFlat::IndexNNDescentFlat() {
183
199
  is_trained = true;
184
200
  }
185
201
 
186
- IndexNNDescentFlat::IndexNNDescentFlat(int d, int M, MetricType metric)
187
- : IndexNNDescent(new IndexFlat(d, metric), M) {
202
+ IndexNNDescentFlat::IndexNNDescentFlat(int d_in, int M, MetricType metric)
203
+ : IndexNNDescent(new IndexFlat(d_in, metric), M) {
188
204
  own_fields = true;
189
205
  is_trained = true;
190
206
  }
@@ -30,8 +30,8 @@ struct IndexNNDescent : Index {
30
30
  NNDescent nndescent;
31
31
 
32
32
  // the sequential storage
33
- bool own_fields;
34
- Index* storage;
33
+ bool own_fields = false;
34
+ Index* storage = nullptr;
35
35
 
36
36
  explicit IndexNNDescent(
37
37
  int d = 0,
@@ -9,6 +9,7 @@
9
9
 
10
10
  #include <faiss/IndexNSG.h>
11
11
 
12
+ #include <atomic>
12
13
  #include <cinttypes>
13
14
  #include <memory>
14
15
 
@@ -16,7 +17,7 @@
16
17
  #include <faiss/IndexNNDescent.h>
17
18
  #include <faiss/impl/AuxIndexStructures.h>
18
19
  #include <faiss/impl/FaissAssert.h>
19
- #include <faiss/utils/distances.h>
20
+ #include <faiss/impl/VisitedTable.h>
20
21
 
21
22
  namespace faiss {
22
23
 
@@ -26,14 +27,15 @@ using namespace nsg;
26
27
  * IndexNSG implementation
27
28
  **************************************************************/
28
29
 
29
- IndexNSG::IndexNSG(int d, int R, MetricType metric) : Index(d, metric), nsg(R) {
30
+ IndexNSG::IndexNSG(int d_in, int R, MetricType metric)
31
+ : Index(d_in, metric), nsg(R) {
30
32
  nndescent_L = GK + 50;
31
33
  }
32
34
 
33
- IndexNSG::IndexNSG(Index* storage, int R)
34
- : Index(storage->d, storage->metric_type),
35
+ IndexNSG::IndexNSG(Index* storage_in, int R)
36
+ : Index(storage_in->d, storage_in->metric_type),
35
37
  nsg(R),
36
- storage(storage),
38
+ storage(storage_in),
37
39
  build_type(1) {
38
40
  nndescent_L = GK + 50;
39
41
  }
@@ -72,30 +74,45 @@ void IndexNSG::search(
72
74
  for (idx_t i0 = 0; i0 < n; i0 += check_period) {
73
75
  idx_t i1 = std::min(i0 + check_period, n);
74
76
 
77
+ std::exception_ptr ex;
78
+ std::atomic<bool> interrupt{false};
75
79
  #pragma omp parallel
76
80
  {
77
- VisitedTable vt(ntotal);
78
-
79
- std::unique_ptr<DistanceComputer> dis(
80
- storage_distance_computer(storage));
81
+ std::unique_ptr<DistanceComputer> dis;
82
+ std::unique_ptr<VisitedTable> vt;
83
+ try {
84
+ vt = std::make_unique<VisitedTable>(
85
+ ntotal, nsg.use_visited_hashset);
86
+ dis.reset(storage_distance_computer(storage));
87
+ } catch (...) {
88
+ omp_capture_exception(ex, [&] { interrupt = true; });
89
+ }
81
90
 
82
91
  #pragma omp for
83
92
  for (idx_t i = i0; i < i1; i++) {
84
- idx_t* idxi = labels + i * k;
85
- float* simi = distances + i * k;
86
- dis->set_query(x + i * d);
93
+ if (interrupt.load(std::memory_order_relaxed)) {
94
+ continue;
95
+ }
96
+ try {
97
+ idx_t* idxi = labels + i * k;
98
+ float* simi = distances + i * k;
99
+ dis->set_query(x + i * d);
87
100
 
88
- nsg.search(*dis, k, idxi, simi, vt);
101
+ nsg.search(*dis, static_cast<int>(k), idxi, simi, *vt);
89
102
 
90
- vt.advance();
103
+ vt->advance();
104
+ } catch (...) {
105
+ omp_capture_exception(ex, [&] { interrupt = true; });
106
+ }
91
107
  }
92
108
  }
109
+ omp_rethrow_if_exception(ex);
93
110
  InterruptCallback::check();
94
111
  }
95
112
 
96
113
  if (is_similarity_metric(metric_type)) {
97
114
  // we need to revert the negated distances
98
- for (size_t i = 0; i < k * n; i++) {
115
+ for (idx_t i = 0; i < k * n; i++) {
99
116
  distances[i] = -distances[i];
100
117
  }
101
118
  }
@@ -114,7 +131,7 @@ void IndexNSG::build(idx_t n, const float* x, idx_t* knn_graph, int gk) {
114
131
  // check the knn graph
115
132
  check_knn_graph(knn_graph, n, gk);
116
133
 
117
- const nsg::Graph<idx_t> knng(knn_graph, n, gk);
134
+ const nsg::Graph<idx_t> knng(knn_graph, static_cast<int>(n), gk);
118
135
  nsg.build(storage, n, knng, verbose);
119
136
  is_built = true;
120
137
  }
@@ -222,7 +239,7 @@ void IndexNSG::add(idx_t n, const float* x) {
222
239
  printf(" nsg building\n");
223
240
  }
224
241
 
225
- const nsg::Graph<idx_t> knn_graph(knng.data(), n, GK);
242
+ const nsg::Graph<idx_t> knn_graph(knng.data(), static_cast<int>(n), GK);
226
243
  nsg.build(storage, n, knn_graph, verbose);
227
244
  is_built = true;
228
245
  }
@@ -273,8 +290,8 @@ IndexNSGFlat::IndexNSGFlat() {
273
290
  is_trained = true;
274
291
  }
275
292
 
276
- IndexNSGFlat::IndexNSGFlat(int d, int R, MetricType metric)
277
- : IndexNSG(new IndexFlat(d, metric), R) {
293
+ IndexNSGFlat::IndexNSGFlat(int d_in, int R, MetricType metric)
294
+ : IndexNSG(new IndexFlat(d_in, metric), R) {
278
295
  own_fields = true;
279
296
  is_trained = true;
280
297
  }
@@ -285,8 +302,8 @@ IndexNSGFlat::IndexNSGFlat(int d, int R, MetricType metric)
285
302
 
286
303
  IndexNSGPQ::IndexNSGPQ() = default;
287
304
 
288
- IndexNSGPQ::IndexNSGPQ(int d, int pq_m, int M, int pq_nbits)
289
- : IndexNSG(new IndexPQ(d, pq_m, pq_nbits), M) {
305
+ IndexNSGPQ::IndexNSGPQ(int d_in, int pq_m, int M, int pq_nbits)
306
+ : IndexNSG(new IndexPQ(d_in, pq_m, pq_nbits), M) {
290
307
  own_fields = true;
291
308
  is_trained = false;
292
309
  }
@@ -301,11 +318,11 @@ void IndexNSGPQ::train(idx_t n, const float* x) {
301
318
  **************************************************************/
302
319
 
303
320
  IndexNSGSQ::IndexNSGSQ(
304
- int d,
321
+ int d_in,
305
322
  ScalarQuantizer::QuantizerType qtype,
306
323
  int M,
307
324
  MetricType metric)
308
- : IndexNSG(new IndexScalarQuantizer(d, qtype, metric), M) {
325
+ : IndexNSG(new IndexScalarQuantizer(d_in, qtype, metric), M) {
309
326
  is_trained = this->storage->is_trained;
310
327
  own_fields = true;
311
328
  }
@@ -9,8 +9,6 @@
9
9
 
10
10
  #pragma once
11
11
 
12
- #include <vector>
13
-
14
12
  #include <faiss/IndexFlat.h>
15
13
  #include <faiss/IndexNNDescent.h>
16
14
  #include <faiss/IndexPQ.h>
@@ -16,29 +16,43 @@ namespace faiss {
16
16
  *********************************************************/
17
17
 
18
18
  IndexNeuralNetCodec::IndexNeuralNetCodec(
19
- int d,
20
- int M,
21
- int nbits,
19
+ int d_in,
20
+ int M_in,
21
+ int nbits_in,
22
22
  MetricType metric)
23
- : IndexFlatCodes((M * nbits + 7) / 8, d, metric), M(M), nbits(nbits) {
23
+ : IndexFlatCodes((M_in * nbits_in + 7) / 8, d_in, metric),
24
+ M(M_in),
25
+ nbits(nbits_in) {
24
26
  is_trained = false;
25
27
  }
26
28
 
27
- void IndexNeuralNetCodec::train(idx_t n, const float* x) {
29
+ void IndexNeuralNetCodec::train(idx_t /*n*/, const float* /*x*/) {
28
30
  FAISS_THROW_MSG("Training not implemented in C++, use Pytorch");
29
31
  }
30
32
 
31
- void IndexNeuralNetCodec::sa_encode(idx_t n, const float* x, uint8_t* codes)
33
+ void IndexNeuralNetCodec::sa_encode(idx_t n, const float* x, uint8_t* bytes)
32
34
  const {
33
35
  nn::Tensor2D x_tensor(n, d, x);
34
36
  nn::Int32Tensor2D codes_tensor = net->encode(x_tensor);
35
- pack_bitstrings(n, M, nbits, codes_tensor.data(), codes, code_size);
37
+ pack_bitstrings(
38
+ n,
39
+ M,
40
+ static_cast<int>(nbits),
41
+ codes_tensor.data(),
42
+ bytes,
43
+ code_size);
36
44
  }
37
45
 
38
- void IndexNeuralNetCodec::sa_decode(idx_t n, const uint8_t* codes, float* x)
46
+ void IndexNeuralNetCodec::sa_decode(idx_t n, const uint8_t* bytes, float* x)
39
47
  const {
40
48
  nn::Int32Tensor2D codes_tensor(n, M);
41
- unpack_bitstrings(n, M, nbits, codes, code_size, codes_tensor.data());
49
+ unpack_bitstrings(
50
+ n,
51
+ M,
52
+ static_cast<int>(nbits),
53
+ bytes,
54
+ code_size,
55
+ codes_tensor.data());
42
56
  nn::Tensor2D x_tensor = net->decode(codes_tensor);
43
57
  memcpy(x, x_tensor.data(), d * n * sizeof(float));
44
58
  }
@@ -47,9 +61,15 @@ void IndexNeuralNetCodec::sa_decode(idx_t n, const uint8_t* codes, float* x)
47
61
  * IndexQINeuralNetCodec implementation
48
62
  *********************************************************/
49
63
 
50
- IndexQINCo::IndexQINCo(int d, int M, int nbits, int L, int h, MetricType metric)
51
- : IndexNeuralNetCodec(d, M, nbits, metric),
52
- qinco(d, 1 << nbits, L, M, h) {
64
+ IndexQINCo::IndexQINCo(
65
+ int d_in,
66
+ int M_in,
67
+ int nbits_in,
68
+ int L,
69
+ int h,
70
+ MetricType metric)
71
+ : IndexNeuralNetCodec(d_in, M_in, nbits_in, metric),
72
+ qinco(d_in, 1 << nbits_in, L, M_in, h) {
53
73
  net = &qinco;
54
74
  }
55
75