faiss 0.6.0 → 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 (361) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/ext/faiss/extconf.rb +2 -1
  4. data/ext/faiss/{index_rb.cpp → index.cpp} +1 -1
  5. data/ext/faiss/index_binary.cpp +1 -1
  6. data/ext/faiss/kmeans.cpp +1 -1
  7. data/ext/faiss/pca_matrix.cpp +1 -1
  8. data/ext/faiss/product_quantizer.cpp +1 -1
  9. data/ext/faiss/{utils_rb.cpp → utils.cpp} +1 -1
  10. data/lib/faiss/version.rb +1 -1
  11. data/vendor/faiss/faiss/AutoTune.cpp +93 -80
  12. data/vendor/faiss/faiss/Clustering.cpp +39 -240
  13. data/vendor/faiss/faiss/Clustering.h +6 -0
  14. data/vendor/faiss/faiss/IVFlib.cpp +41 -21
  15. data/vendor/faiss/faiss/Index.cpp +6 -5
  16. data/vendor/faiss/faiss/Index.h +5 -5
  17. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  18. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +49 -37
  19. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  21. data/vendor/faiss/faiss/IndexBinary.cpp +5 -3
  22. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  23. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  24. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  25. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  26. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +84 -92
  27. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  28. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  29. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  30. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +87 -415
  31. data/vendor/faiss/faiss/IndexFastScan.cpp +72 -109
  32. data/vendor/faiss/faiss/IndexFastScan.h +25 -23
  33. data/vendor/faiss/faiss/IndexFlat.cpp +27 -20
  34. data/vendor/faiss/faiss/IndexFlat.h +21 -18
  35. data/vendor/faiss/faiss/IndexFlatCodes.cpp +42 -19
  36. data/vendor/faiss/faiss/IndexHNSW.cpp +283 -145
  37. data/vendor/faiss/faiss/IndexHNSW.h +16 -2
  38. data/vendor/faiss/faiss/IndexIDMap.cpp +25 -21
  39. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  40. data/vendor/faiss/faiss/IndexIVF.cpp +465 -362
  41. data/vendor/faiss/faiss/IndexIVF.h +33 -12
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +96 -93
  44. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -1
  45. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +357 -238
  46. data/vendor/faiss/faiss/IndexIVFFastScan.h +42 -41
  47. data/vendor/faiss/faiss/IndexIVFFlat.cpp +36 -68
  48. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  49. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +53 -30
  50. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  51. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  52. data/vendor/faiss/faiss/IndexIVFPQ.cpp +71 -843
  53. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
  54. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  55. data/vendor/faiss/faiss/IndexIVFPQR.cpp +21 -17
  56. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +26 -39
  57. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +2 -1
  58. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +475 -476
  59. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +248 -93
  60. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  61. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  62. data/vendor/faiss/faiss/IndexLSH.cpp +36 -19
  63. data/vendor/faiss/faiss/IndexLattice.cpp +13 -13
  64. data/vendor/faiss/faiss/IndexNNDescent.cpp +36 -21
  65. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  66. data/vendor/faiss/faiss/IndexNSG.cpp +39 -23
  67. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +31 -11
  68. data/vendor/faiss/faiss/IndexPQ.cpp +128 -221
  69. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  70. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  71. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  72. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  73. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  74. data/vendor/faiss/faiss/IndexRaBitQ.cpp +11 -36
  75. data/vendor/faiss/faiss/IndexRaBitQ.h +2 -1
  76. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +41 -277
  77. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +183 -27
  78. data/vendor/faiss/faiss/IndexRefine.cpp +30 -25
  79. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  80. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  81. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  82. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  83. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
  84. data/vendor/faiss/faiss/IndexShards.cpp +10 -9
  85. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  86. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  87. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  88. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  89. data/vendor/faiss/faiss/MetricType.h +14 -7
  90. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  91. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  92. data/vendor/faiss/faiss/VectorTransform.cpp +237 -149
  93. data/vendor/faiss/faiss/VectorTransform.h +16 -16
  94. data/vendor/faiss/faiss/build.cpp +23 -0
  95. data/vendor/faiss/faiss/build.h +15 -0
  96. data/vendor/faiss/faiss/clone_index.cpp +48 -47
  97. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  98. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  99. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  100. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  101. data/vendor/faiss/faiss/factory_tools.cpp +5 -0
  102. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  103. data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
  104. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
  106. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  107. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  108. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  109. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  110. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  111. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  112. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  113. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  114. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  115. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  116. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
  117. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  118. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
  119. data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
  120. data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
  121. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  122. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  123. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +29 -25
  124. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  125. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  126. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -0
  127. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  128. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  129. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +16 -16
  130. data/vendor/faiss/faiss/impl/CodePacker.cpp +3 -3
  131. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +1 -1
  132. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  133. data/vendor/faiss/faiss/impl/FaissAssert.h +6 -3
  134. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  135. data/vendor/faiss/faiss/impl/HNSW.cpp +92 -317
  136. data/vendor/faiss/faiss/impl/HNSW.h +13 -34
  137. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  138. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  139. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  140. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +82 -77
  141. data/vendor/faiss/faiss/impl/NNDescent.cpp +62 -25
  142. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  143. data/vendor/faiss/faiss/impl/NSG.cpp +38 -21
  144. data/vendor/faiss/faiss/impl/NSG.h +4 -4
  145. data/vendor/faiss/faiss/impl/Panorama.cpp +23 -6
  146. data/vendor/faiss/faiss/impl/Panorama.h +258 -87
  147. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  148. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  149. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +46 -32
  150. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  151. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  152. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  153. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +30 -23
  154. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  155. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +55 -49
  156. data/vendor/faiss/faiss/impl/RaBitQUtils.h +65 -0
  157. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +296 -283
  158. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +26 -23
  159. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  160. data/vendor/faiss/faiss/impl/ResultHandler.h +99 -75
  161. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +52 -4
  162. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -1
  163. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  164. data/vendor/faiss/faiss/impl/VisitedTable.h +7 -0
  165. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  166. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  167. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  168. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  169. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  170. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  171. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  172. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  173. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  174. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  175. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  176. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  177. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  178. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  179. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  180. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  181. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  182. data/vendor/faiss/faiss/impl/expanded_scanners.h +8 -3
  183. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  184. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  185. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  186. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  187. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  188. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
  189. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +169 -2
  190. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  191. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  192. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  193. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  194. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  195. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  196. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -356
  197. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  198. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  199. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +282 -134
  200. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  201. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  202. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
  203. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
  204. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
  205. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
  206. data/vendor/faiss/faiss/impl/index_read.cpp +1132 -45
  207. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
  208. data/vendor/faiss/faiss/impl/index_write.cpp +95 -13
  209. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  210. data/vendor/faiss/faiss/impl/io_macros.h +33 -16
  211. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  212. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +37 -23
  213. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  214. data/vendor/faiss/faiss/impl/mapped_io.cpp +6 -6
  215. data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
  216. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  217. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  218. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  219. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  220. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
  221. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
  222. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
  223. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx2.cpp → pq_code_distance-avx2.h} +9 -13
  224. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx512.cpp → pq_code_distance-avx512.h} +9 -57
  225. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +29 -111
  226. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  227. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +238 -5
  228. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -7
  229. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
  230. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +311 -477
  231. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  232. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +1 -1
  233. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +3 -2
  234. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +102 -11
  235. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +27 -1
  236. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +3 -3
  237. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +148 -0
  238. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +167 -0
  239. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +59 -0
  240. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +163 -0
  241. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
  242. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +192 -8
  243. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +12 -0
  244. data/vendor/faiss/faiss/impl/simd_dispatch.h +100 -66
  245. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  246. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +264 -172
  247. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  248. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  249. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  250. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +270 -218
  251. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  252. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  253. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  254. data/vendor/faiss/faiss/index_factory.cpp +86 -18
  255. data/vendor/faiss/faiss/index_io.h +24 -0
  256. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
  257. data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
  258. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  259. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
  260. data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
  261. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  262. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +13 -13
  263. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  264. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +1 -1
  265. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  266. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  267. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  268. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  269. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  270. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  271. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  272. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
  273. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +18 -2
  274. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
  275. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +12 -3
  276. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +7 -2
  277. data/vendor/faiss/faiss/utils/Heap.cpp +10 -10
  278. data/vendor/faiss/faiss/utils/NeuralNet.cpp +47 -36
  279. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  280. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  281. data/vendor/faiss/faiss/utils/distances.cpp +390 -560
  282. data/vendor/faiss/faiss/utils/distances.h +20 -1
  283. data/vendor/faiss/faiss/utils/distances_dispatch.h +117 -37
  284. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  285. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  286. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  287. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  288. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  289. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  290. data/vendor/faiss/faiss/utils/distances_simd.cpp +5 -177
  291. data/vendor/faiss/faiss/utils/extra_distances.cpp +9 -8
  292. data/vendor/faiss/faiss/utils/extra_distances.h +32 -6
  293. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  294. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  295. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  296. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  297. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
  298. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  299. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  300. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
  301. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
  302. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
  303. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
  304. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
  305. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
  306. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
  307. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
  308. data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
  309. data/vendor/faiss/faiss/utils/partitioning.h +31 -0
  310. data/vendor/faiss/faiss/utils/popcount.h +29 -0
  311. data/vendor/faiss/faiss/utils/pq_code_distance.h +2 -2
  312. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  313. data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
  314. data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
  315. data/vendor/faiss/faiss/utils/rabitq_simd.h +57 -536
  316. data/vendor/faiss/faiss/utils/random.cpp +6 -6
  317. data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
  318. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +5 -1
  319. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +213 -4
  320. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +163 -10
  321. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +250 -4
  322. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +7 -4
  323. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
  324. data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
  325. data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +2 -1
  326. data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
  327. data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
  328. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
  329. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
  330. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
  331. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
  332. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
  333. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  334. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  335. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  336. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  337. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  338. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  339. data/vendor/faiss/faiss/utils/simd_levels.cpp +17 -5
  340. data/vendor/faiss/faiss/utils/simd_levels.h +93 -1
  341. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  342. data/vendor/faiss/faiss/utils/utils.cpp +5 -5
  343. data/vendor/faiss/faiss/utils/utils.h +3 -3
  344. metadata +119 -34
  345. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  346. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  347. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -224
  348. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -230
  349. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  350. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  351. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  352. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  353. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -235
  354. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  355. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  356. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -449
  357. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  358. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  359. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  360. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -365
  361. /data/ext/faiss/{utils_rb.h → utils.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,9 +91,11 @@ 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;
@@ -124,20 +137,24 @@ void IndexLSH::search(
124
137
  hammings_knn_hc(&res, qcodes.get(), codes.data(), ntotal, code_size, true);
125
138
 
126
139
  // convert distances to floats
127
- for (int i = 0; i < k * n; i++)
140
+ for (int i = 0; i < k * n; i++) {
128
141
  distances[i] = idistances[i];
142
+ }
129
143
  }
130
144
 
131
145
  void IndexLSH::transfer_thresholds(LinearTransform* vt) {
132
- if (!train_thresholds)
146
+ if (!train_thresholds) {
133
147
  return;
148
+ }
134
149
  FAISS_THROW_IF_NOT(nbits == vt->d_out);
135
150
  if (!vt->have_bias) {
136
151
  vt->b.resize(nbits, 0);
137
152
  vt->have_bias = true;
138
153
  }
139
- for (int i = 0; i < nbits; i++)
154
+ FAISS_THROW_IF_NOT(!vt->b.empty());
155
+ for (int i = 0; i < nbits; i++) {
140
156
  vt->b[i] -= thresholds[i];
157
+ }
141
158
  train_thresholds = false;
142
159
  thresholds.clear();
143
160
  }
@@ -15,20 +15,20 @@
15
15
 
16
16
  namespace faiss {
17
17
 
18
- IndexLattice::IndexLattice(idx_t d, int nsq, int scale_nbit, int r2)
19
- : IndexFlatCodes(0, d, METRIC_L2),
20
- nsq(nsq),
21
- dsq(d / nsq),
22
- zn_sphere_codec(dsq, r2),
23
- scale_nbit(scale_nbit) {
24
- 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);
25
25
 
26
26
  lattice_nbit = 0;
27
27
  while (!(((uint64_t)1 << lattice_nbit) >= zn_sphere_codec.nv)) {
28
28
  lattice_nbit++;
29
29
  }
30
30
 
31
- int total_nbit = (lattice_nbit + scale_nbit) * nsq;
31
+ int total_nbit = (lattice_nbit + scale_nbit_in) * nsq_in;
32
32
 
33
33
  code_size = (total_nbit + 7) / 8;
34
34
 
@@ -72,7 +72,7 @@ size_t IndexLattice::sa_code_size() const {
72
72
  return code_size;
73
73
  }
74
74
 
75
- 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 {
76
76
  const float* mins = trained.data();
77
77
  const float* maxs = mins + nsq;
78
78
  int64_t sc = int64_t(1) << scale_nbit;
@@ -80,7 +80,7 @@ void IndexLattice::sa_encode(idx_t n, const float* x, uint8_t* codes) const {
80
80
  with_simd_level([&]<SIMDLevel SL>() {
81
81
  #pragma omp parallel for
82
82
  for (idx_t i = 0; i < n; i++) {
83
- BitstringWriter wr(codes + i * code_size, code_size);
83
+ BitstringWriter wr(bytes + i * code_size, code_size);
84
84
  const float* xi = x + i * d;
85
85
  for (int j = 0; j < nsq; j++) {
86
86
  float nj = (sqrtf(fvec_norm_L2sqr<SL>(xi, dsq)) - mins[j]) *
@@ -99,7 +99,7 @@ void IndexLattice::sa_encode(idx_t n, const float* x, uint8_t* codes) const {
99
99
  });
100
100
  }
101
101
 
102
- 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 {
103
103
  const float* mins = trained.data();
104
104
  const float* maxs = mins + nsq;
105
105
  float sc = int64_t(1) << scale_nbit;
@@ -107,7 +107,7 @@ void IndexLattice::sa_decode(idx_t n, const uint8_t* codes, float* x) const {
107
107
 
108
108
  #pragma omp parallel for
109
109
  for (idx_t i = 0; i < n; i++) {
110
- BitstringReader rd(codes + i * code_size, code_size);
110
+ BitstringReader rd(bytes + i * code_size, code_size);
111
111
  float* xi = x + i * d;
112
112
  for (int j = 0; j < nsq; j++) {
113
113
  float norm =
@@ -115,7 +115,7 @@ void IndexLattice::sa_decode(idx_t n, const uint8_t* codes, float* x) const {
115
115
  mins[j];
116
116
  norm /= r;
117
117
  zn_sphere_codec.decode(rd.read(lattice_nbit), xi);
118
- for (int l = 0; l < dsq; l++) {
118
+ for (size_t l = 0; l < dsq; l++) {
119
119
  xi[l] *= norm;
120
120
  }
121
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>
@@ -20,7 +21,6 @@
20
21
  #include <faiss/impl/AuxIndexStructures.h>
21
22
  #include <faiss/impl/FaissAssert.h>
22
23
  #include <faiss/impl/VisitedTable.h>
23
- #include <faiss/utils/distances.h>
24
24
 
25
25
  extern "C" {
26
26
 
@@ -66,17 +66,17 @@ DistanceComputer* storage_distance_computer(const Index* storage) {
66
66
  * IndexNNDescent implementation
67
67
  **************************************************************/
68
68
 
69
- IndexNNDescent::IndexNNDescent(int d, int K, MetricType metric)
70
- : Index(d, metric),
71
- nndescent(d, K),
69
+ IndexNNDescent::IndexNNDescent(int d_in, int K, MetricType metric)
70
+ : Index(d_in, metric),
71
+ nndescent(d_in, K),
72
72
  own_fields(false),
73
73
  storage(nullptr) {}
74
74
 
75
- IndexNNDescent::IndexNNDescent(Index* storage, int K)
76
- : Index(storage->d, storage->metric_type),
77
- 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),
78
78
  own_fields(false),
79
- storage(storage) {}
79
+ storage(storage_in) {}
80
80
 
81
81
  IndexNNDescent::~IndexNNDescent() {
82
82
  if (own_fields) {
@@ -119,28 +119,43 @@ void IndexNNDescent::search(
119
119
  for (idx_t i0 = 0; i0 < n; i0 += check_period) {
120
120
  idx_t i1 = std::min(i0 + check_period, n);
121
121
 
122
+ std::exception_ptr ex;
123
+ std::atomic<bool> interrupt{false};
122
124
  #pragma omp parallel
123
125
  {
124
- VisitedTable vt(ntotal);
125
-
126
- std::unique_ptr<DistanceComputer> dis(
127
- 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
+ }
128
134
 
129
135
  #pragma omp for
130
136
  for (idx_t i = i0; i < i1; i++) {
131
- idx_t* idxi = labels + i * k;
132
- float* simi = distances + i * k;
133
- dis->set_query(x + i * d);
134
-
135
- 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
+ }
136
150
  }
137
151
  }
152
+ omp_rethrow_if_exception(ex);
138
153
  InterruptCallback::check();
139
154
  }
140
155
 
141
156
  if (metric_type == METRIC_INNER_PRODUCT) {
142
157
  // we need to revert the negated distances
143
- for (size_t i = 0; i < k * n; i++) {
158
+ for (idx_t i = 0; i < k * n; i++) {
144
159
  distances[i] = -distances[i];
145
160
  }
146
161
  }
@@ -163,7 +178,7 @@ void IndexNNDescent::add(idx_t n, const float* x) {
163
178
  ntotal = storage->ntotal;
164
179
 
165
180
  std::unique_ptr<DistanceComputer> dis(storage_distance_computer(storage));
166
- nndescent.build(*dis, ntotal, verbose);
181
+ nndescent.build(*dis, static_cast<int>(ntotal), verbose);
167
182
  }
168
183
 
169
184
  void IndexNNDescent::reset() {
@@ -184,8 +199,8 @@ IndexNNDescentFlat::IndexNNDescentFlat() {
184
199
  is_trained = true;
185
200
  }
186
201
 
187
- IndexNNDescentFlat::IndexNNDescentFlat(int d, int M, MetricType metric)
188
- : IndexNNDescent(new IndexFlat(d, metric), M) {
202
+ IndexNNDescentFlat::IndexNNDescentFlat(int d_in, int M, MetricType metric)
203
+ : IndexNNDescent(new IndexFlat(d_in, metric), M) {
189
204
  own_fields = true;
190
205
  is_trained = true;
191
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
 
@@ -17,7 +18,6 @@
17
18
  #include <faiss/impl/AuxIndexStructures.h>
18
19
  #include <faiss/impl/FaissAssert.h>
19
20
  #include <faiss/impl/VisitedTable.h>
20
- #include <faiss/utils/distances.h>
21
21
 
22
22
  namespace faiss {
23
23
 
@@ -27,14 +27,15 @@ using namespace nsg;
27
27
  * IndexNSG implementation
28
28
  **************************************************************/
29
29
 
30
- 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) {
31
32
  nndescent_L = GK + 50;
32
33
  }
33
34
 
34
- IndexNSG::IndexNSG(Index* storage, int R)
35
- : Index(storage->d, storage->metric_type),
35
+ IndexNSG::IndexNSG(Index* storage_in, int R)
36
+ : Index(storage_in->d, storage_in->metric_type),
36
37
  nsg(R),
37
- storage(storage),
38
+ storage(storage_in),
38
39
  build_type(1) {
39
40
  nndescent_L = GK + 50;
40
41
  }
@@ -73,30 +74,45 @@ void IndexNSG::search(
73
74
  for (idx_t i0 = 0; i0 < n; i0 += check_period) {
74
75
  idx_t i1 = std::min(i0 + check_period, n);
75
76
 
77
+ std::exception_ptr ex;
78
+ std::atomic<bool> interrupt{false};
76
79
  #pragma omp parallel
77
80
  {
78
- VisitedTable vt(ntotal, nsg.use_visited_hashset);
79
-
80
- std::unique_ptr<DistanceComputer> dis(
81
- 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
+ }
82
90
 
83
91
  #pragma omp for
84
92
  for (idx_t i = i0; i < i1; i++) {
85
- idx_t* idxi = labels + i * k;
86
- float* simi = distances + i * k;
87
- 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);
88
100
 
89
- nsg.search(*dis, k, idxi, simi, vt);
101
+ nsg.search(*dis, static_cast<int>(k), idxi, simi, *vt);
90
102
 
91
- vt.advance();
103
+ vt->advance();
104
+ } catch (...) {
105
+ omp_capture_exception(ex, [&] { interrupt = true; });
106
+ }
92
107
  }
93
108
  }
109
+ omp_rethrow_if_exception(ex);
94
110
  InterruptCallback::check();
95
111
  }
96
112
 
97
113
  if (is_similarity_metric(metric_type)) {
98
114
  // we need to revert the negated distances
99
- for (size_t i = 0; i < k * n; i++) {
115
+ for (idx_t i = 0; i < k * n; i++) {
100
116
  distances[i] = -distances[i];
101
117
  }
102
118
  }
@@ -115,7 +131,7 @@ void IndexNSG::build(idx_t n, const float* x, idx_t* knn_graph, int gk) {
115
131
  // check the knn graph
116
132
  check_knn_graph(knn_graph, n, gk);
117
133
 
118
- const nsg::Graph<idx_t> knng(knn_graph, n, gk);
134
+ const nsg::Graph<idx_t> knng(knn_graph, static_cast<int>(n), gk);
119
135
  nsg.build(storage, n, knng, verbose);
120
136
  is_built = true;
121
137
  }
@@ -223,7 +239,7 @@ void IndexNSG::add(idx_t n, const float* x) {
223
239
  printf(" nsg building\n");
224
240
  }
225
241
 
226
- 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);
227
243
  nsg.build(storage, n, knn_graph, verbose);
228
244
  is_built = true;
229
245
  }
@@ -274,8 +290,8 @@ IndexNSGFlat::IndexNSGFlat() {
274
290
  is_trained = true;
275
291
  }
276
292
 
277
- IndexNSGFlat::IndexNSGFlat(int d, int R, MetricType metric)
278
- : IndexNSG(new IndexFlat(d, metric), R) {
293
+ IndexNSGFlat::IndexNSGFlat(int d_in, int R, MetricType metric)
294
+ : IndexNSG(new IndexFlat(d_in, metric), R) {
279
295
  own_fields = true;
280
296
  is_trained = true;
281
297
  }
@@ -286,8 +302,8 @@ IndexNSGFlat::IndexNSGFlat(int d, int R, MetricType metric)
286
302
 
287
303
  IndexNSGPQ::IndexNSGPQ() = default;
288
304
 
289
- IndexNSGPQ::IndexNSGPQ(int d, int pq_m, int M, int pq_nbits)
290
- : 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) {
291
307
  own_fields = true;
292
308
  is_trained = false;
293
309
  }
@@ -302,11 +318,11 @@ void IndexNSGPQ::train(idx_t n, const float* x) {
302
318
  **************************************************************/
303
319
 
304
320
  IndexNSGSQ::IndexNSGSQ(
305
- int d,
321
+ int d_in,
306
322
  ScalarQuantizer::QuantizerType qtype,
307
323
  int M,
308
324
  MetricType metric)
309
- : IndexNSG(new IndexScalarQuantizer(d, qtype, metric), M) {
325
+ : IndexNSG(new IndexScalarQuantizer(d_in, qtype, metric), M) {
310
326
  is_trained = this->storage->is_trained;
311
327
  own_fields = true;
312
328
  }
@@ -16,11 +16,13 @@ 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
 
@@ -28,17 +30,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