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
@@ -0,0 +1,244 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #include <faiss/impl/ClusteringHelpers.h>
9
+
10
+ #include <cassert>
11
+ #include <chrono>
12
+ #include <cinttypes>
13
+ #include <cstdint>
14
+ #include <cstdio>
15
+ #include <cstring>
16
+ #include <limits>
17
+ #include <vector>
18
+
19
+ #include <omp.h>
20
+
21
+ #include <faiss/Index.h>
22
+ #include <faiss/impl/FaissAssert.h>
23
+ #include <faiss/utils/random.h>
24
+
25
+ namespace faiss {
26
+ namespace detail {
27
+
28
+ uint64_t get_actual_rng_seed(const int seed) {
29
+ return (seed >= 0)
30
+ ? seed
31
+ : static_cast<uint64_t>(std::chrono::high_resolution_clock::now()
32
+ .time_since_epoch()
33
+ .count());
34
+ }
35
+
36
+ idx_t subsample_training_set(
37
+ const Clustering& clus,
38
+ idx_t nx,
39
+ const uint8_t* x,
40
+ size_t line_size,
41
+ const float* weights,
42
+ uint8_t** x_out,
43
+ float** weights_out) {
44
+ FAISS_THROW_IF_NOT(clus.k > 0 && clus.max_points_per_centroid > 0);
45
+ if (clus.verbose) {
46
+ printf("Sampling a subset of %zd / %" PRId64 " for training\n",
47
+ clus.k * clus.max_points_per_centroid,
48
+ nx);
49
+ }
50
+
51
+ const uint64_t actual_seed = get_actual_rng_seed(clus.seed);
52
+
53
+ std::vector<idx_t> perm;
54
+ if (clus.use_faster_subsampling) {
55
+ SplitMix64RandomGenerator rng(actual_seed);
56
+
57
+ const idx_t new_nx = clus.k * clus.max_points_per_centroid;
58
+ perm.resize(new_nx);
59
+ assert(!perm.empty());
60
+ for (idx_t i = 0; i < new_nx; i++) {
61
+ perm[i] = rng.rand_int64() % nx;
62
+ }
63
+ } else {
64
+ FAISS_THROW_IF_NOT_FMT(
65
+ nx <= static_cast<idx_t>(std::numeric_limits<int>::max()),
66
+ "Dataset too large (%" PRId64
67
+ ") for standard subsampling; "
68
+ "set use_faster_subsampling=true",
69
+ nx);
70
+ std::vector<int> int_perm(nx);
71
+ rand_perm(int_perm.data(), nx, actual_seed);
72
+ perm.assign(int_perm.begin(), int_perm.end());
73
+ }
74
+
75
+ nx = clus.k * clus.max_points_per_centroid;
76
+ FAISS_THROW_IF_NOT_FMT(
77
+ perm.size() >= static_cast<size_t>(nx),
78
+ "subsample_training_set: perm size %zu < required nx %" PRId64,
79
+ perm.size(),
80
+ nx);
81
+ assert(!perm.empty());
82
+
83
+ uint8_t* x_new = new uint8_t[nx * line_size];
84
+ *x_out = x_new;
85
+
86
+ for (idx_t i = 0; i < nx; i++) {
87
+ memcpy(x_new + i * line_size, x + perm[i] * line_size, line_size);
88
+ }
89
+ if (weights) {
90
+ float* weights_new = new float[nx];
91
+ for (idx_t i = 0; i < nx; i++) {
92
+ weights_new[i] = weights[perm[i]];
93
+ }
94
+ *weights_out = weights_new;
95
+ } else {
96
+ *weights_out = nullptr;
97
+ }
98
+ return nx;
99
+ }
100
+
101
+ void compute_centroids(
102
+ size_t d,
103
+ size_t k,
104
+ size_t n,
105
+ size_t k_frozen,
106
+ const uint8_t* x,
107
+ const Index* codec,
108
+ const int64_t* assign,
109
+ const float* weights,
110
+ float* hassign,
111
+ float* centroids) {
112
+ k -= k_frozen;
113
+ centroids += k_frozen * d;
114
+
115
+ memset(centroids, 0, sizeof(*centroids) * d * k);
116
+
117
+ size_t line_size = codec ? codec->sa_code_size() : d * sizeof(float);
118
+
119
+ #pragma omp parallel
120
+ {
121
+ int nt = omp_get_num_threads();
122
+ int rank = omp_get_thread_num();
123
+
124
+ // this thread is taking care of centroids c0:c1
125
+ size_t c0 = (k * rank) / nt;
126
+ size_t c1 = (k * (rank + 1)) / nt;
127
+ std::vector<float> decode_buffer(d);
128
+
129
+ for (size_t i = 0; i < n; i++) {
130
+ int64_t ci = assign[i];
131
+ FAISS_THROW_IF_NOT_MSG(
132
+ ci >= 0 && ci < k + k_frozen, "invalid cluster assignment");
133
+ ci -= k_frozen;
134
+ if (ci >= static_cast<int64_t>(c0) &&
135
+ ci < static_cast<int64_t>(c1)) {
136
+ float* c = centroids + ci * d;
137
+ const float* xi;
138
+ if (!codec) {
139
+ xi = reinterpret_cast<const float*>(x + i * line_size);
140
+ } else {
141
+ float* xif = decode_buffer.data();
142
+ codec->sa_decode(1, x + i * line_size, xif);
143
+ xi = xif;
144
+ }
145
+ if (weights) {
146
+ float w = weights[i];
147
+ hassign[ci] += w;
148
+ for (size_t j = 0; j < d; j++) {
149
+ c[j] += xi[j] * w;
150
+ }
151
+ } else {
152
+ hassign[ci] += 1.0;
153
+ for (size_t j = 0; j < d; j++) {
154
+ c[j] += xi[j];
155
+ }
156
+ }
157
+ }
158
+ }
159
+ }
160
+
161
+ #pragma omp parallel for
162
+ for (idx_t ci = 0; ci < static_cast<idx_t>(k); ci++) {
163
+ if (hassign[ci] == 0) {
164
+ continue;
165
+ }
166
+ float norm = 1 / hassign[ci];
167
+ float* c = centroids + ci * d;
168
+ for (size_t j = 0; j < d; j++) {
169
+ c[j] *= norm;
170
+ }
171
+ }
172
+ }
173
+
174
+ // a bit above machine epsilon for float16
175
+ static constexpr float EPS = 1.f / 1024.f;
176
+
177
+ int split_clusters(
178
+ size_t d,
179
+ size_t k,
180
+ size_t n,
181
+ size_t k_frozen,
182
+ float* hassign,
183
+ float* centroids) {
184
+ k -= k_frozen;
185
+ centroids += k_frozen * d;
186
+ FAISS_THROW_IF_NOT_MSG(
187
+ n > k,
188
+ "split_clusters: n must exceed k to find a non-empty donor centroid");
189
+
190
+ size_t nsplit = 0;
191
+ RandomGenerator rng(1234);
192
+ for (size_t ci = 0; ci < k; ci++) {
193
+ if (hassign[ci] == 0) {
194
+ // Probabilistic donor pick weighted by hassign; deterministic
195
+ // fallback to the largest cluster if too many iterations pass.
196
+ size_t cj;
197
+ size_t max_tries = 10 * k;
198
+ size_t n_tries = 0;
199
+ bool found = false;
200
+ for (cj = 0; n_tries < max_tries; cj = (cj + 1) % k) {
201
+ float p = (hassign[cj] - 1.0) / (float)(n - k);
202
+ float r = rng.rand_float();
203
+ if (r < p) {
204
+ found = true;
205
+ break;
206
+ }
207
+ n_tries++;
208
+ }
209
+ if (!found) {
210
+ // Deterministic fallback: split the largest cluster.
211
+ cj = 0;
212
+ for (size_t j = 1; j < k; j++) {
213
+ if (hassign[j] > hassign[cj]) {
214
+ cj = j;
215
+ }
216
+ }
217
+ }
218
+ memcpy(centroids + ci * d,
219
+ centroids + cj * d,
220
+ sizeof(*centroids) * d);
221
+
222
+ /* small symmetric perturbation */
223
+ for (size_t j = 0; j < d; j++) {
224
+ if (j % 2 == 0) {
225
+ centroids[ci * d + j] *= 1 + EPS;
226
+ centroids[cj * d + j] *= 1 - EPS;
227
+ } else {
228
+ centroids[ci * d + j] *= 1 - EPS;
229
+ centroids[cj * d + j] *= 1 + EPS;
230
+ }
231
+ }
232
+
233
+ /* assume even split of the cluster */
234
+ hassign[ci] = hassign[cj] / 2;
235
+ hassign[cj] -= hassign[ci];
236
+ nsplit++;
237
+ }
238
+ }
239
+
240
+ return static_cast<int>(nsplit);
241
+ }
242
+
243
+ } // namespace detail
244
+ } // namespace faiss
@@ -0,0 +1,94 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include <cstddef>
11
+ #include <cstdint>
12
+
13
+ #include <faiss/Clustering.h>
14
+ #include <faiss/Index.h>
15
+
16
+ namespace faiss {
17
+ namespace detail {
18
+
19
+ /** Resolve the actual RNG seed for clustering helpers.
20
+ *
21
+ * If `seed >= 0`, returns `seed`. Otherwise returns a high-resolution
22
+ * timestamp so that callers get a non-deterministic seed.
23
+ *
24
+ * @param seed user-provided seed; negative values request a time-based seed
25
+ * @return the resolved seed
26
+ */
27
+ uint64_t get_actual_rng_seed(const int seed);
28
+
29
+ /** Subsample a training set down to `clus.k * clus.max_points_per_centroid`
30
+ * rows.
31
+ *
32
+ * Allocates `*x_out` (and `*weights_out` when `weights` is non-null) with
33
+ * `new[]`; ownership is transferred to the caller.
34
+ *
35
+ * @param clus clustering parameters (reads `k`,
36
+ * `max_points_per_centroid`, `use_faster_subsampling`, `seed`, `verbose`)
37
+ * @param nx number of input training rows
38
+ * @param x input training data, row-major, `nx * line_size` bytes
39
+ * @param line_size bytes per training row
40
+ * @param weights optional per-row weights (length `nx`), or null
41
+ * @param x_out output: newly allocated subsampled rows
42
+ * @param weights_out output: newly allocated subsampled weights, or null
43
+ * @return number of rows in the subsampled set
44
+ */
45
+ idx_t subsample_training_set(
46
+ const Clustering& clus,
47
+ idx_t nx,
48
+ const uint8_t* x,
49
+ size_t line_size,
50
+ const float* weights,
51
+ uint8_t** x_out,
52
+ float** weights_out);
53
+
54
+ /** compute centroids as (weighted) sum of training points
55
+ *
56
+ * @param x training vectors, size n * code_size (from codec)
57
+ * @param codec how to decode the vectors (if NULL then cast to float*)
58
+ * @param weights per-training vector weight, size n (or NULL)
59
+ * @param assign nearest centroid for each training vector, size n
60
+ * @param k_frozen do not update the k_frozen first centroids
61
+ * @param centroids centroid vectors (output only), size k * d
62
+ * @param hassign histogram of assignments per centroid (size k),
63
+ * should be 0 on input
64
+ *
65
+ */
66
+ void compute_centroids(
67
+ size_t d,
68
+ size_t k,
69
+ size_t n,
70
+ size_t k_frozen,
71
+ const uint8_t* x,
72
+ const Index* codec,
73
+ const int64_t* assign,
74
+ const float* weights,
75
+ float* hassign,
76
+ float* centroids);
77
+
78
+ /** Handle empty clusters by splitting larger ones.
79
+ *
80
+ * It works by slightly changing the centroids to make 2 clusters from
81
+ * a single one. Takes the same arguments as compute_centroids.
82
+ *
83
+ * @return nb of splitting operations (larger is worse)
84
+ */
85
+ int split_clusters(
86
+ size_t d,
87
+ size_t k,
88
+ size_t n,
89
+ size_t k_frozen,
90
+ float* hassign,
91
+ float* centroids);
92
+
93
+ } // namespace detail
94
+ } // namespace faiss
@@ -142,8 +142,8 @@ size_t sample_from_cumsum(
142
142
 
143
143
  } // namespace
144
144
 
145
- ClusteringInitialization::ClusteringInitialization(size_t d, size_t k)
146
- : d(d), k(k) {}
145
+ ClusteringInitialization::ClusteringInitialization(size_t d_in, size_t k_in)
146
+ : d(d_in), k(k_in) {}
147
147
 
148
148
  void ClusteringInitialization::init_centroids(
149
149
  size_t n,
@@ -221,27 +221,27 @@ void ClusteringInitialization::init_kmeans_plus_plus(
221
221
  std::vector<double> cumsum(n);
222
222
 
223
223
  // Select remaining centroids using D² sampling
224
- for (size_t c = result.first_new_centroid_idx; c < k; c++) {
225
- // Compute cumulative sum
226
- cumsum[0] = min_distances[0];
227
- for (size_t i = 1; i < n; i++) {
228
- cumsum[i] = cumsum[i - 1] + min_distances[i];
229
- }
224
+ with_simd_level([&]<SIMDLevel SL>() {
225
+ for (size_t c = result.first_new_centroid_idx; c < k; c++) {
226
+ // Compute cumulative sum
227
+ cumsum[0] = min_distances[0];
228
+ for (size_t i = 1; i < n; i++) {
229
+ cumsum[i] = cumsum[i - 1] + min_distances[i];
230
+ }
230
231
 
231
- // Sample using precomputed cumsum
232
- size_t next_idx = sample_from_cumsum(cumsum, rng);
232
+ // Sample using precomputed cumsum
233
+ size_t next_idx = sample_from_cumsum(cumsum, rng);
233
234
 
234
- float* new_centroid = centroids + c * d;
235
- std::memcpy(new_centroid, x + next_idx * d, d * sizeof(float));
235
+ float* new_centroid = centroids + c * d;
236
+ std::memcpy(new_centroid, x + next_idx * d, d * sizeof(float));
236
237
 
237
- // Update min distances incrementally
238
- with_simd_level([&]<SIMDLevel SL>() {
238
+ // Update min distances incrementally
239
239
  for (size_t i = 0; i < n; i++) {
240
240
  double dist = fvec_L2sqr<SL>(x + i * d, new_centroid, d);
241
241
  min_distances[i] = std::min(min_distances[i], dist);
242
242
  }
243
- });
244
- }
243
+ }
244
+ });
245
245
  }
246
246
 
247
247
  void ClusteringInitialization::init_afkmc2(
@@ -33,10 +33,10 @@ void CodePacker::unpack_all(const uint8_t* block, uint8_t* flat_codes) const {
33
33
  * CodePackerFlat
34
34
  */
35
35
 
36
- CodePackerFlat::CodePackerFlat(size_t code_size) {
37
- this->code_size = code_size;
36
+ CodePackerFlat::CodePackerFlat(size_t code_size_in) {
37
+ this->code_size = code_size_in;
38
38
  nvec = 1;
39
- block_size = code_size;
39
+ block_size = code_size_in;
40
40
  }
41
41
 
42
42
  void CodePackerFlat::pack_all(const uint8_t* flat_codes, uint8_t* block) const {
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  #include <faiss/impl/CodePackerRaBitQ.h>
9
- #include <faiss/impl/pq4_fast_scan.h>
9
+ #include <faiss/impl/fast_scan/fast_scan.h>
10
10
 
11
11
  #include <cstring>
12
12
 
@@ -66,8 +66,8 @@ struct NegativeDistanceComputer : DistanceComputer {
66
66
  /// owned by this
67
67
  DistanceComputer* basedis;
68
68
 
69
- explicit NegativeDistanceComputer(DistanceComputer* basedis)
70
- : basedis(basedis) {}
69
+ explicit NegativeDistanceComputer(DistanceComputer* basedis_)
70
+ : basedis(basedis_) {}
71
71
 
72
72
  void set_query(const float* x) override {
73
73
  basedis->set_query(x);
@@ -116,13 +116,13 @@ struct FlatCodesDistanceComputer : DistanceComputer {
116
116
  const float* q = nullptr; // not used in all distance computers
117
117
 
118
118
  FlatCodesDistanceComputer(
119
- const uint8_t* codes,
120
- size_t code_size,
121
- const float* q = nullptr)
122
- : codes(codes), code_size(code_size), q(q) {}
119
+ const uint8_t* codes_,
120
+ size_t code_size_,
121
+ const float* q_ = nullptr)
122
+ : codes(codes_), code_size(code_size_), q(q_) {}
123
123
 
124
- explicit FlatCodesDistanceComputer(const float* q)
125
- : codes(nullptr), code_size(0), q(q) {}
124
+ explicit FlatCodesDistanceComputer(const float* q_)
125
+ : codes(nullptr), code_size(0), q(q_) {}
126
126
 
127
127
  FlatCodesDistanceComputer() : codes(nullptr), code_size(0), q(nullptr) {}
128
128
 
@@ -78,9 +78,12 @@
78
78
  do { \
79
79
  std::string __s; \
80
80
  int __size = snprintf(nullptr, 0, FMT, __VA_ARGS__); \
81
- __s.resize(__size + 1); \
82
- snprintf(&__s[0], __s.size(), FMT, __VA_ARGS__); \
83
- throw ::faiss::FaissException( \
81
+ if (__size > 0) { \
82
+ __s.resize(static_cast<size_t>(__size) + 1); \
83
+ snprintf(&__s[0], __s.size(), FMT, __VA_ARGS__); \
84
+ __s.resize(static_cast<size_t>(__size)); \
85
+ } \
86
+ throw faiss::FaissException( \
84
87
  __s, __PRETTY_FUNCTION__, __FILE__, __LINE__); \
85
88
  } while (false)
86
89
 
@@ -46,9 +46,8 @@ void handleExceptions(
46
46
  struct TransformedVectors {
47
47
  const float* x;
48
48
  bool own_x;
49
- TransformedVectors(const float* x_orig, const float* x) : x(x) {
50
- own_x = x_orig != x;
51
- }
49
+ TransformedVectors(const float* x_orig, const float* x_in)
50
+ : x(x_in), own_x(x_orig != x_in) {}
52
51
 
53
52
  ~TransformedVectors() {
54
53
  if (own_x) {
@@ -60,6 +59,54 @@ struct TransformedVectors {
60
59
  /// make typeids more readable
61
60
  std::string demangle_cpp_symbol(const char* name);
62
61
 
62
+ /// Capture the current exception into `ex` if no prior exception has been
63
+ /// recorded. Call from a catch block inside an OpenMP parallel region.
64
+ /// Uses `#pragma omp critical` to serialize access to `ex`.
65
+ ///
66
+ /// The optional `cleanup` callable runs inside the critical section
67
+ /// alongside the exception capture, so that side-effects visible to
68
+ /// other threads (e.g. setting an interrupt flag) are serialized with
69
+ /// the exception_ptr write.
70
+ ///
71
+ /// Usage:
72
+ /// std::exception_ptr ex;
73
+ /// bool interrupt = false;
74
+ /// #pragma omp parallel
75
+ /// {
76
+ /// try { ... } catch (...) {
77
+ /// omp_capture_exception(ex, [&] { interrupt = true; });
78
+ /// }
79
+ /// }
80
+ /// omp_rethrow_if_exception(ex);
81
+ inline void omp_capture_exception(std::exception_ptr& ex) {
82
+ #pragma omp critical(faiss_omp_exception)
83
+ {
84
+ if (!ex) {
85
+ ex = std::current_exception();
86
+ }
87
+ }
88
+ }
89
+
90
+ /// Overload with cleanup that runs inside the critical section.
91
+ template <typename Cleanup>
92
+ inline void omp_capture_exception(std::exception_ptr& ex, Cleanup&& cleanup) {
93
+ #pragma omp critical(faiss_omp_exception)
94
+ {
95
+ cleanup();
96
+ if (!ex) {
97
+ ex = std::current_exception();
98
+ }
99
+ }
100
+ }
101
+
102
+ /// Rethrow the captured exception, if any. Call on the main thread
103
+ /// after the parallel region completes.
104
+ inline void omp_rethrow_if_exception(std::exception_ptr& ex) {
105
+ if (ex) {
106
+ std::rethrow_exception(ex);
107
+ }
108
+ }
109
+
63
110
  } // namespace faiss
64
111
 
65
112
  #endif