scipy 1.15.2__cp313-cp313-macosx_12_0_arm64.whl → 1.16.0rc1__cp313-cp313-macosx_12_0_arm64.whl

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 (626) hide show
  1. scipy/.dylibs/libscipy_openblas.dylib +0 -0
  2. scipy/__config__.py +7 -7
  3. scipy/__init__.py +3 -6
  4. scipy/_cyutility.cpython-313-darwin.so +0 -0
  5. scipy/_lib/_array_api.py +497 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cpython-313-darwin.so +0 -0
  9. scipy/_lib/_docscrape.py +1 -1
  10. scipy/_lib/_elementwise_iterative_method.py +15 -26
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-313-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-313-darwin.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-313-darwin.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_util.py +222 -125
  17. scipy/_lib/array_api_compat/__init__.py +4 -4
  18. scipy/_lib/array_api_compat/_internal.py +19 -6
  19. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  20. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  21. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  22. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  23. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  24. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  25. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  26. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  27. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  28. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  29. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  30. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  31. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  32. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  33. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  34. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  35. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  36. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  37. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  38. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  39. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  40. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  41. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  42. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  43. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  44. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  45. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  46. scipy/_lib/array_api_extra/__init__.py +26 -3
  47. scipy/_lib/array_api_extra/_delegation.py +171 -0
  48. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  49. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  50. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  51. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  52. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  53. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  60. scipy/_lib/array_api_extra/testing.py +359 -0
  61. scipy/_lib/decorator.py +2 -2
  62. scipy/_lib/doccer.py +1 -7
  63. scipy/_lib/messagestream.cpython-313-darwin.so +0 -0
  64. scipy/_lib/pyprima/__init__.py +212 -0
  65. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  66. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  67. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  68. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  69. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  70. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  71. scipy/_lib/pyprima/cobyla/update.py +289 -0
  72. scipy/_lib/pyprima/common/__init__.py +0 -0
  73. scipy/_lib/pyprima/common/_bounds.py +34 -0
  74. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  75. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  76. scipy/_lib/pyprima/common/_project.py +173 -0
  77. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  78. scipy/_lib/pyprima/common/consts.py +47 -0
  79. scipy/_lib/pyprima/common/evaluate.py +99 -0
  80. scipy/_lib/pyprima/common/history.py +38 -0
  81. scipy/_lib/pyprima/common/infos.py +30 -0
  82. scipy/_lib/pyprima/common/linalg.py +435 -0
  83. scipy/_lib/pyprima/common/message.py +290 -0
  84. scipy/_lib/pyprima/common/powalg.py +131 -0
  85. scipy/_lib/pyprima/common/preproc.py +277 -0
  86. scipy/_lib/pyprima/common/present.py +5 -0
  87. scipy/_lib/pyprima/common/ratio.py +54 -0
  88. scipy/_lib/pyprima/common/redrho.py +47 -0
  89. scipy/_lib/pyprima/common/selectx.py +296 -0
  90. scipy/_lib/tests/test__util.py +105 -121
  91. scipy/_lib/tests/test_array_api.py +169 -34
  92. scipy/_lib/tests/test_bunch.py +7 -0
  93. scipy/_lib/tests/test_ccallback.py +2 -10
  94. scipy/_lib/tests/test_public_api.py +13 -0
  95. scipy/cluster/_hierarchy.cpython-313-darwin.so +0 -0
  96. scipy/cluster/_optimal_leaf_ordering.cpython-313-darwin.so +0 -0
  97. scipy/cluster/_vq.cpython-313-darwin.so +0 -0
  98. scipy/cluster/hierarchy.py +393 -223
  99. scipy/cluster/tests/test_hierarchy.py +273 -335
  100. scipy/cluster/tests/test_vq.py +45 -61
  101. scipy/cluster/vq.py +39 -35
  102. scipy/conftest.py +263 -157
  103. scipy/constants/_constants.py +4 -1
  104. scipy/constants/tests/test_codata.py +2 -2
  105. scipy/constants/tests/test_constants.py +11 -18
  106. scipy/datasets/_download_all.py +15 -1
  107. scipy/datasets/_fetchers.py +7 -1
  108. scipy/datasets/_utils.py +1 -1
  109. scipy/differentiate/_differentiate.py +25 -25
  110. scipy/differentiate/tests/test_differentiate.py +24 -25
  111. scipy/fft/_basic.py +20 -0
  112. scipy/fft/_helper.py +3 -34
  113. scipy/fft/_pocketfft/helper.py +29 -1
  114. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  115. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  116. scipy/fft/_realtransforms.py +13 -0
  117. scipy/fft/tests/test_basic.py +27 -25
  118. scipy/fft/tests/test_fftlog.py +16 -7
  119. scipy/fft/tests/test_helper.py +18 -34
  120. scipy/fft/tests/test_real_transforms.py +8 -10
  121. scipy/fftpack/convolve.cpython-313-darwin.so +0 -0
  122. scipy/fftpack/tests/test_basic.py +2 -4
  123. scipy/fftpack/tests/test_real_transforms.py +8 -9
  124. scipy/integrate/_bvp.py +9 -3
  125. scipy/integrate/_cubature.py +3 -2
  126. scipy/integrate/_dop.cpython-313-darwin.so +0 -0
  127. scipy/integrate/_ivp/common.py +3 -3
  128. scipy/integrate/_ivp/ivp.py +9 -2
  129. scipy/integrate/_ivp/tests/test_ivp.py +19 -0
  130. scipy/integrate/_lsoda.cpython-313-darwin.so +0 -0
  131. scipy/integrate/_ode.py +9 -2
  132. scipy/integrate/_odepack.cpython-313-darwin.so +0 -0
  133. scipy/integrate/_quad_vec.py +21 -29
  134. scipy/integrate/_quadpack.cpython-313-darwin.so +0 -0
  135. scipy/integrate/_quadpack_py.py +11 -7
  136. scipy/integrate/_quadrature.py +3 -3
  137. scipy/integrate/_rules/_base.py +2 -2
  138. scipy/integrate/_tanhsinh.py +57 -54
  139. scipy/integrate/_test_odeint_banded.cpython-313-darwin.so +0 -0
  140. scipy/integrate/_vode.cpython-313-darwin.so +0 -0
  141. scipy/integrate/tests/test__quad_vec.py +0 -6
  142. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  143. scipy/integrate/tests/test_cubature.py +21 -35
  144. scipy/integrate/tests/test_quadrature.py +6 -8
  145. scipy/integrate/tests/test_tanhsinh.py +61 -43
  146. scipy/interpolate/__init__.py +70 -58
  147. scipy/interpolate/_bary_rational.py +22 -22
  148. scipy/interpolate/_bsplines.py +119 -66
  149. scipy/interpolate/_cubic.py +65 -50
  150. scipy/interpolate/_dfitpack.cpython-313-darwin.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-313-darwin.so +0 -0
  152. scipy/interpolate/_fitpack2.py +9 -6
  153. scipy/interpolate/_fitpack_impl.py +32 -26
  154. scipy/interpolate/_fitpack_repro.py +23 -19
  155. scipy/interpolate/_interpnd.cpython-313-darwin.so +0 -0
  156. scipy/interpolate/_interpolate.py +30 -12
  157. scipy/interpolate/_ndbspline.py +13 -18
  158. scipy/interpolate/_ndgriddata.py +5 -8
  159. scipy/interpolate/_polyint.py +95 -31
  160. scipy/interpolate/_ppoly.cpython-313-darwin.so +0 -0
  161. scipy/interpolate/_rbf.py +2 -2
  162. scipy/interpolate/_rbfinterp.py +1 -1
  163. scipy/interpolate/_rgi.py +31 -26
  164. scipy/interpolate/_rgi_cython.cpython-313-darwin.so +0 -0
  165. scipy/interpolate/dfitpack.py +0 -20
  166. scipy/interpolate/interpnd.py +1 -2
  167. scipy/interpolate/tests/test_bary_rational.py +2 -2
  168. scipy/interpolate/tests/test_bsplines.py +97 -1
  169. scipy/interpolate/tests/test_fitpack2.py +39 -1
  170. scipy/interpolate/tests/test_interpnd.py +32 -20
  171. scipy/interpolate/tests/test_interpolate.py +48 -4
  172. scipy/interpolate/tests/test_rgi.py +2 -1
  173. scipy/io/_fast_matrix_market/__init__.py +2 -0
  174. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  175. scipy/io/_harwell_boeing/hb.py +7 -11
  176. scipy/io/_idl.py +5 -7
  177. scipy/io/_netcdf.py +15 -5
  178. scipy/io/_test_fortran.cpython-313-darwin.so +0 -0
  179. scipy/io/arff/tests/test_arffread.py +3 -3
  180. scipy/io/matlab/__init__.py +5 -3
  181. scipy/io/matlab/_mio.py +4 -1
  182. scipy/io/matlab/_mio5.py +19 -13
  183. scipy/io/matlab/_mio5_utils.cpython-313-darwin.so +0 -0
  184. scipy/io/matlab/_mio_utils.cpython-313-darwin.so +0 -0
  185. scipy/io/matlab/_miobase.py +4 -1
  186. scipy/io/matlab/_streams.cpython-313-darwin.so +0 -0
  187. scipy/io/matlab/tests/test_mio.py +46 -18
  188. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  189. scipy/io/tests/test_mmio.py +7 -1
  190. scipy/io/tests/test_wavfile.py +41 -0
  191. scipy/io/wavfile.py +57 -10
  192. scipy/linalg/_basic.py +113 -86
  193. scipy/linalg/_cythonized_array_utils.cpython-313-darwin.so +0 -0
  194. scipy/linalg/_decomp.py +22 -9
  195. scipy/linalg/_decomp_cholesky.py +28 -13
  196. scipy/linalg/_decomp_cossin.py +45 -30
  197. scipy/linalg/_decomp_interpolative.cpython-313-darwin.so +0 -0
  198. scipy/linalg/_decomp_ldl.py +4 -1
  199. scipy/linalg/_decomp_lu.py +18 -6
  200. scipy/linalg/_decomp_lu_cython.cpython-313-darwin.so +0 -0
  201. scipy/linalg/_decomp_polar.py +2 -0
  202. scipy/linalg/_decomp_qr.py +6 -2
  203. scipy/linalg/_decomp_qz.py +3 -0
  204. scipy/linalg/_decomp_schur.py +3 -1
  205. scipy/linalg/_decomp_svd.py +13 -2
  206. scipy/linalg/_decomp_update.cpython-313-darwin.so +0 -0
  207. scipy/linalg/_expm_frechet.py +4 -0
  208. scipy/linalg/_fblas.cpython-313-darwin.so +0 -0
  209. scipy/linalg/_flapack.cpython-313-darwin.so +0 -0
  210. scipy/linalg/_matfuncs.py +187 -4
  211. scipy/linalg/_matfuncs_expm.cpython-313-darwin.so +0 -0
  212. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-darwin.so +0 -0
  213. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  214. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-darwin.so +0 -0
  215. scipy/linalg/_procrustes.py +2 -0
  216. scipy/linalg/_sketches.py +17 -6
  217. scipy/linalg/_solve_toeplitz.cpython-313-darwin.so +0 -0
  218. scipy/linalg/_solvers.py +7 -2
  219. scipy/linalg/_special_matrices.py +26 -36
  220. scipy/linalg/cython_blas.cpython-313-darwin.so +0 -0
  221. scipy/linalg/cython_lapack.cpython-313-darwin.so +0 -0
  222. scipy/linalg/lapack.py +22 -2
  223. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  224. scipy/linalg/tests/test_basic.py +31 -16
  225. scipy/linalg/tests/test_batch.py +588 -0
  226. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  227. scipy/linalg/tests/test_decomp.py +40 -3
  228. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  229. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  230. scipy/linalg/tests/test_interpolative.py +17 -0
  231. scipy/linalg/tests/test_lapack.py +115 -7
  232. scipy/linalg/tests/test_matfuncs.py +157 -102
  233. scipy/linalg/tests/test_procrustes.py +0 -7
  234. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  235. scipy/linalg/tests/test_special_matrices.py +1 -5
  236. scipy/ndimage/__init__.py +1 -0
  237. scipy/ndimage/_cytest.cpython-313-darwin.so +0 -0
  238. scipy/ndimage/_delegators.py +8 -2
  239. scipy/ndimage/_filters.py +433 -5
  240. scipy/ndimage/_interpolation.py +36 -6
  241. scipy/ndimage/_measurements.py +4 -2
  242. scipy/ndimage/_morphology.py +5 -0
  243. scipy/ndimage/_nd_image.cpython-313-darwin.so +0 -0
  244. scipy/ndimage/_ndimage_api.py +2 -1
  245. scipy/ndimage/_ni_docstrings.py +5 -1
  246. scipy/ndimage/_ni_label.cpython-313-darwin.so +0 -0
  247. scipy/ndimage/_ni_support.py +1 -5
  248. scipy/ndimage/_rank_filter_1d.cpython-313-darwin.so +0 -0
  249. scipy/ndimage/_support_alternative_backends.py +18 -6
  250. scipy/ndimage/tests/test_filters.py +351 -259
  251. scipy/ndimage/tests/test_fourier.py +7 -9
  252. scipy/ndimage/tests/test_interpolation.py +68 -61
  253. scipy/ndimage/tests/test_measurements.py +18 -35
  254. scipy/ndimage/tests/test_morphology.py +143 -131
  255. scipy/ndimage/tests/test_splines.py +1 -3
  256. scipy/odr/__odrpack.cpython-313-darwin.so +0 -0
  257. scipy/optimize/_basinhopping.py +13 -7
  258. scipy/optimize/_bglu_dense.cpython-313-darwin.so +0 -0
  259. scipy/optimize/_bracket.py +46 -26
  260. scipy/optimize/_chandrupatla.py +9 -10
  261. scipy/optimize/_cobyla_py.py +104 -123
  262. scipy/optimize/_constraints.py +14 -10
  263. scipy/optimize/_differentiable_functions.py +371 -230
  264. scipy/optimize/_differentialevolution.py +4 -3
  265. scipy/optimize/_dual_annealing.py +1 -1
  266. scipy/optimize/_elementwise.py +1 -4
  267. scipy/optimize/_highspy/_highs_wrapper.py +6 -4
  268. scipy/optimize/_lbfgsb.cpython-313-darwin.so +0 -0
  269. scipy/optimize/_lbfgsb_py.py +57 -16
  270. scipy/optimize/_linprog_doc.py +2 -2
  271. scipy/optimize/_linprog_highs.py +11 -11
  272. scipy/optimize/_linprog_ip.py +25 -10
  273. scipy/optimize/_linprog_util.py +18 -19
  274. scipy/optimize/_lsq/common.py +3 -3
  275. scipy/optimize/_lsq/dogbox.py +16 -2
  276. scipy/optimize/_lsq/givens_elimination.cpython-313-darwin.so +0 -0
  277. scipy/optimize/_lsq/least_squares.py +198 -126
  278. scipy/optimize/_lsq/lsq_linear.py +6 -6
  279. scipy/optimize/_lsq/trf.py +35 -8
  280. scipy/optimize/_milp.py +3 -1
  281. scipy/optimize/_minimize.py +105 -36
  282. scipy/optimize/_minpack.cpython-313-darwin.so +0 -0
  283. scipy/optimize/_minpack_py.py +21 -14
  284. scipy/optimize/_moduleTNC.cpython-313-darwin.so +0 -0
  285. scipy/optimize/_nnls.py +20 -21
  286. scipy/optimize/_nonlin.py +34 -3
  287. scipy/optimize/_numdiff.py +288 -110
  288. scipy/optimize/_optimize.py +86 -48
  289. scipy/optimize/_remove_redundancy.py +5 -5
  290. scipy/optimize/_root_scalar.py +1 -1
  291. scipy/optimize/_shgo.py +6 -0
  292. scipy/optimize/_shgo_lib/_complex.py +1 -1
  293. scipy/optimize/_slsqp_py.py +216 -124
  294. scipy/optimize/_slsqplib.cpython-313-darwin.so +0 -0
  295. scipy/optimize/_spectral.py +1 -1
  296. scipy/optimize/_tnc.py +8 -1
  297. scipy/optimize/_trlib/_trlib.cpython-313-darwin.so +0 -0
  298. scipy/optimize/_trustregion.py +20 -6
  299. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  300. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  301. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  302. scipy/optimize/_trustregion_constr/projections.py +12 -8
  303. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  304. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  305. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  306. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  307. scipy/optimize/_trustregion_exact.py +0 -1
  308. scipy/optimize/_zeros.cpython-313-darwin.so +0 -0
  309. scipy/optimize/_zeros_py.py +97 -17
  310. scipy/optimize/cython_optimize/_zeros.cpython-313-darwin.so +0 -0
  311. scipy/optimize/slsqp.py +0 -1
  312. scipy/optimize/tests/test__basinhopping.py +1 -1
  313. scipy/optimize/tests/test__differential_evolution.py +4 -4
  314. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  315. scipy/optimize/tests/test__numdiff.py +66 -22
  316. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  317. scipy/optimize/tests/test__shgo.py +9 -1
  318. scipy/optimize/tests/test_bracket.py +71 -46
  319. scipy/optimize/tests/test_chandrupatla.py +133 -135
  320. scipy/optimize/tests/test_cobyla.py +74 -45
  321. scipy/optimize/tests/test_constraints.py +1 -1
  322. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  323. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  324. scipy/optimize/tests/test_least_squares.py +125 -13
  325. scipy/optimize/tests/test_linear_assignment.py +3 -3
  326. scipy/optimize/tests/test_linprog.py +3 -3
  327. scipy/optimize/tests/test_lsq_linear.py +5 -5
  328. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  329. scipy/optimize/tests/test_minpack.py +4 -4
  330. scipy/optimize/tests/test_nnls.py +43 -3
  331. scipy/optimize/tests/test_nonlin.py +36 -0
  332. scipy/optimize/tests/test_optimize.py +95 -17
  333. scipy/optimize/tests/test_slsqp.py +36 -4
  334. scipy/optimize/tests/test_zeros.py +34 -1
  335. scipy/signal/__init__.py +12 -23
  336. scipy/signal/_delegators.py +568 -0
  337. scipy/signal/_filter_design.py +459 -241
  338. scipy/signal/_fir_filter_design.py +262 -90
  339. scipy/signal/_lti_conversion.py +3 -2
  340. scipy/signal/_ltisys.py +118 -91
  341. scipy/signal/_peak_finding_utils.cpython-313-darwin.so +0 -0
  342. scipy/signal/_polyutils.py +172 -0
  343. scipy/signal/_short_time_fft.py +553 -76
  344. scipy/signal/_signal_api.py +30 -0
  345. scipy/signal/_signaltools.py +719 -396
  346. scipy/signal/_sigtools.cpython-313-darwin.so +0 -0
  347. scipy/signal/_sosfilt.cpython-313-darwin.so +0 -0
  348. scipy/signal/_spectral_py.py +221 -50
  349. scipy/signal/_spline_filters.py +108 -68
  350. scipy/signal/_support_alternative_backends.py +73 -0
  351. scipy/signal/_upfirdn.py +4 -1
  352. scipy/signal/_upfirdn_apply.cpython-313-darwin.so +0 -0
  353. scipy/signal/_waveforms.py +2 -11
  354. scipy/signal/_wavelets.py +1 -1
  355. scipy/signal/fir_filter_design.py +1 -0
  356. scipy/signal/spline.py +4 -11
  357. scipy/signal/tests/_scipy_spectral_test_shim.py +5 -182
  358. scipy/signal/tests/test_bsplines.py +114 -79
  359. scipy/signal/tests/test_cont2discrete.py +9 -2
  360. scipy/signal/tests/test_filter_design.py +721 -481
  361. scipy/signal/tests/test_fir_filter_design.py +332 -140
  362. scipy/signal/tests/test_savitzky_golay.py +4 -3
  363. scipy/signal/tests/test_short_time_fft.py +231 -5
  364. scipy/signal/tests/test_signaltools.py +2149 -1348
  365. scipy/signal/tests/test_spectral.py +19 -6
  366. scipy/signal/tests/test_splines.py +161 -96
  367. scipy/signal/tests/test_upfirdn.py +84 -50
  368. scipy/signal/tests/test_waveforms.py +20 -0
  369. scipy/signal/tests/test_windows.py +607 -466
  370. scipy/signal/windows/_windows.py +287 -148
  371. scipy/sparse/__init__.py +23 -4
  372. scipy/sparse/_base.py +269 -120
  373. scipy/sparse/_bsr.py +7 -4
  374. scipy/sparse/_compressed.py +59 -234
  375. scipy/sparse/_construct.py +90 -38
  376. scipy/sparse/_coo.py +115 -181
  377. scipy/sparse/_csc.py +4 -4
  378. scipy/sparse/_csparsetools.cpython-313-darwin.so +0 -0
  379. scipy/sparse/_csr.py +2 -2
  380. scipy/sparse/_data.py +48 -48
  381. scipy/sparse/_dia.py +105 -21
  382. scipy/sparse/_dok.py +0 -23
  383. scipy/sparse/_index.py +4 -4
  384. scipy/sparse/_matrix.py +23 -0
  385. scipy/sparse/_sparsetools.cpython-313-darwin.so +0 -0
  386. scipy/sparse/_sputils.py +37 -22
  387. scipy/sparse/base.py +0 -9
  388. scipy/sparse/bsr.py +0 -14
  389. scipy/sparse/compressed.py +0 -23
  390. scipy/sparse/construct.py +0 -6
  391. scipy/sparse/coo.py +0 -14
  392. scipy/sparse/csc.py +0 -3
  393. scipy/sparse/csgraph/_flow.cpython-313-darwin.so +0 -0
  394. scipy/sparse/csgraph/_matching.cpython-313-darwin.so +0 -0
  395. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-darwin.so +0 -0
  396. scipy/sparse/csgraph/_reordering.cpython-313-darwin.so +0 -0
  397. scipy/sparse/csgraph/_shortest_path.cpython-313-darwin.so +0 -0
  398. scipy/sparse/csgraph/_tools.cpython-313-darwin.so +0 -0
  399. scipy/sparse/csgraph/_traversal.cpython-313-darwin.so +0 -0
  400. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  401. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  402. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  403. scipy/sparse/csr.py +0 -5
  404. scipy/sparse/data.py +1 -6
  405. scipy/sparse/dia.py +0 -7
  406. scipy/sparse/dok.py +0 -10
  407. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-darwin.so +0 -0
  408. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  409. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  410. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-darwin.so +0 -0
  411. scipy/sparse/linalg/_eigen/arpack/arpack.py +28 -20
  412. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  413. scipy/sparse/linalg/_expm_multiply.py +8 -3
  414. scipy/sparse/linalg/_interface.py +29 -26
  415. scipy/sparse/linalg/_isolve/_gcrotmk.py +6 -5
  416. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  417. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  418. scipy/sparse/linalg/_isolve/minres.py +5 -5
  419. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  420. scipy/sparse/linalg/_isolve/utils.py +2 -8
  421. scipy/sparse/linalg/_matfuncs.py +1 -1
  422. scipy/sparse/linalg/_norm.py +1 -1
  423. scipy/sparse/linalg/_propack/_cpropack.cpython-313-darwin.so +0 -0
  424. scipy/sparse/linalg/_propack/_dpropack.cpython-313-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_spropack.cpython-313-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_zpropack.cpython-313-darwin.so +0 -0
  427. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  428. scipy/sparse/linalg/tests/test_expm_multiply.py +10 -0
  429. scipy/sparse/linalg/tests/test_interface.py +35 -0
  430. scipy/sparse/linalg/tests/test_pydata_sparse.py +18 -0
  431. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  432. scipy/sparse/tests/test_base.py +217 -40
  433. scipy/sparse/tests/test_common1d.py +17 -12
  434. scipy/sparse/tests/test_construct.py +1 -1
  435. scipy/sparse/tests/test_coo.py +272 -4
  436. scipy/sparse/tests/test_sparsetools.py +5 -0
  437. scipy/sparse/tests/test_sputils.py +36 -7
  438. scipy/spatial/_ckdtree.cpython-313-darwin.so +0 -0
  439. scipy/spatial/_hausdorff.cpython-313-darwin.so +0 -0
  440. scipy/spatial/_qhull.cpython-313-darwin.so +0 -0
  441. scipy/spatial/_voronoi.cpython-313-darwin.so +0 -0
  442. scipy/spatial/distance.py +49 -42
  443. scipy/spatial/tests/test_distance.py +3 -1
  444. scipy/spatial/tests/test_kdtree.py +1 -0
  445. scipy/spatial/tests/test_qhull.py +106 -2
  446. scipy/spatial/transform/__init__.py +5 -3
  447. scipy/spatial/transform/_rigid_transform.cpython-313-darwin.so +0 -0
  448. scipy/spatial/transform/_rotation.cpython-313-darwin.so +0 -0
  449. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  450. scipy/spatial/transform/tests/test_rotation.py +1342 -790
  451. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  452. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  453. scipy/special/__init__.py +1 -47
  454. scipy/special/_add_newdocs.py +34 -772
  455. scipy/special/_basic.py +22 -25
  456. scipy/special/_comb.cpython-313-darwin.so +0 -0
  457. scipy/special/_ellip_harm_2.cpython-313-darwin.so +0 -0
  458. scipy/special/_gufuncs.cpython-313-darwin.so +0 -0
  459. scipy/special/_logsumexp.py +83 -69
  460. scipy/special/_orthogonal.pyi +1 -1
  461. scipy/special/_specfun.cpython-313-darwin.so +0 -0
  462. scipy/special/_special_ufuncs.cpython-313-darwin.so +0 -0
  463. scipy/special/_spherical_bessel.py +4 -4
  464. scipy/special/_support_alternative_backends.py +212 -119
  465. scipy/special/_test_internal.cpython-313-darwin.so +0 -0
  466. scipy/special/_testutils.py +4 -4
  467. scipy/special/_ufuncs.cpython-313-darwin.so +0 -0
  468. scipy/special/_ufuncs.pyi +1 -0
  469. scipy/special/_ufuncs.pyx +215 -1400
  470. scipy/special/_ufuncs_cxx.cpython-313-darwin.so +0 -0
  471. scipy/special/_ufuncs_cxx.pxd +2 -15
  472. scipy/special/_ufuncs_cxx.pyx +5 -44
  473. scipy/special/_ufuncs_cxx_defs.h +2 -16
  474. scipy/special/_ufuncs_defs.h +0 -8
  475. scipy/special/cython_special.cpython-313-darwin.so +0 -0
  476. scipy/special/cython_special.pxd +1 -1
  477. scipy/special/tests/_cython_examples/meson.build +10 -1
  478. scipy/special/tests/test_basic.py +153 -20
  479. scipy/special/tests/test_boost_ufuncs.py +3 -0
  480. scipy/special/tests/test_cdflib.py +35 -11
  481. scipy/special/tests/test_gammainc.py +16 -0
  482. scipy/special/tests/test_hyp2f1.py +23 -2
  483. scipy/special/tests/test_log1mexp.py +85 -0
  484. scipy/special/tests/test_logsumexp.py +220 -64
  485. scipy/special/tests/test_mpmath.py +1 -0
  486. scipy/special/tests/test_nan_inputs.py +1 -1
  487. scipy/special/tests/test_orthogonal.py +17 -18
  488. scipy/special/tests/test_sf_error.py +3 -2
  489. scipy/special/tests/test_sph_harm.py +6 -7
  490. scipy/special/tests/test_support_alternative_backends.py +211 -76
  491. scipy/stats/__init__.py +4 -1
  492. scipy/stats/_ansari_swilk_statistics.cpython-313-darwin.so +0 -0
  493. scipy/stats/_axis_nan_policy.py +4 -3
  494. scipy/stats/_biasedurn.cpython-313-darwin.so +0 -0
  495. scipy/stats/_continued_fraction.py +387 -0
  496. scipy/stats/_continuous_distns.py +296 -319
  497. scipy/stats/_covariance.py +6 -3
  498. scipy/stats/_discrete_distns.py +39 -32
  499. scipy/stats/_distn_infrastructure.py +39 -12
  500. scipy/stats/_distribution_infrastructure.py +900 -238
  501. scipy/stats/_entropy.py +7 -8
  502. scipy/{_lib → stats}/_finite_differences.py +1 -1
  503. scipy/stats/_hypotests.py +82 -49
  504. scipy/stats/_kde.py +53 -49
  505. scipy/stats/_ksstats.py +1 -1
  506. scipy/stats/_levy_stable/__init__.py +7 -15
  507. scipy/stats/_levy_stable/levyst.cpython-313-darwin.so +0 -0
  508. scipy/stats/_morestats.py +112 -67
  509. scipy/stats/_mstats_basic.py +13 -17
  510. scipy/stats/_mstats_extras.py +8 -8
  511. scipy/stats/_multivariate.py +89 -113
  512. scipy/stats/_new_distributions.py +97 -20
  513. scipy/stats/_page_trend_test.py +12 -5
  514. scipy/stats/_probability_distribution.py +265 -43
  515. scipy/stats/_qmc.py +14 -9
  516. scipy/stats/_qmc_cy.cpython-313-darwin.so +0 -0
  517. scipy/stats/_qmvnt.py +16 -95
  518. scipy/stats/_qmvnt_cy.cpython-313-darwin.so +0 -0
  519. scipy/stats/_quantile.py +335 -0
  520. scipy/stats/_rcont/rcont.cpython-313-darwin.so +0 -0
  521. scipy/stats/_resampling.py +4 -29
  522. scipy/stats/_sampling.py +1 -1
  523. scipy/stats/_sobol.cpython-313-darwin.so +0 -0
  524. scipy/stats/_stats.cpython-313-darwin.so +0 -0
  525. scipy/stats/_stats_mstats_common.py +19 -2
  526. scipy/stats/_stats_py.py +534 -460
  527. scipy/stats/_unuran/unuran_wrapper.cpython-313-darwin.so +0 -0
  528. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  529. scipy/stats/_variation.py +5 -7
  530. scipy/stats/_wilcoxon.py +13 -7
  531. scipy/stats/tests/common_tests.py +6 -4
  532. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  533. scipy/stats/tests/test_continued_fraction.py +173 -0
  534. scipy/stats/tests/test_continuous.py +379 -60
  535. scipy/stats/tests/test_continuous_basic.py +18 -12
  536. scipy/stats/tests/test_discrete_basic.py +14 -8
  537. scipy/stats/tests/test_discrete_distns.py +16 -16
  538. scipy/stats/tests/test_distributions.py +117 -75
  539. scipy/stats/tests/test_entropy.py +40 -48
  540. scipy/stats/tests/test_fit.py +4 -3
  541. scipy/stats/tests/test_hypotests.py +153 -24
  542. scipy/stats/tests/test_kdeoth.py +109 -41
  543. scipy/stats/tests/test_marray.py +289 -0
  544. scipy/stats/tests/test_morestats.py +79 -47
  545. scipy/stats/tests/test_mstats_basic.py +3 -3
  546. scipy/stats/tests/test_multivariate.py +434 -83
  547. scipy/stats/tests/test_qmc.py +13 -10
  548. scipy/stats/tests/test_quantile.py +199 -0
  549. scipy/stats/tests/test_rank.py +119 -112
  550. scipy/stats/tests/test_resampling.py +47 -56
  551. scipy/stats/tests/test_sampling.py +9 -4
  552. scipy/stats/tests/test_stats.py +799 -939
  553. scipy/stats/tests/test_variation.py +8 -6
  554. scipy/version.py +2 -2
  555. {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/LICENSE.txt +1 -1
  556. {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/METADATA +9 -9
  557. {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/RECORD +558 -565
  558. scipy-1.16.0rc1.dist-info/WHEEL +6 -0
  559. scipy/_lib/array_api_extra/_funcs.py +0 -484
  560. scipy/_lib/array_api_extra/_typing.py +0 -8
  561. scipy/interpolate/_bspl.cpython-313-darwin.so +0 -0
  562. scipy/optimize/_cobyla.cpython-313-darwin.so +0 -0
  563. scipy/optimize/_cython_nnls.cpython-313-darwin.so +0 -0
  564. scipy/optimize/_slsqp.cpython-313-darwin.so +0 -0
  565. scipy/spatial/qhull_src/COPYING.txt +0 -38
  566. scipy/special/libsf_error_state.dylib +0 -0
  567. scipy/special/tests/test_log_softmax.py +0 -109
  568. scipy/special/tests/test_xsf_cuda.py +0 -114
  569. scipy/special/xsf/binom.h +0 -89
  570. scipy/special/xsf/cdflib.h +0 -100
  571. scipy/special/xsf/cephes/airy.h +0 -307
  572. scipy/special/xsf/cephes/besselpoly.h +0 -51
  573. scipy/special/xsf/cephes/beta.h +0 -257
  574. scipy/special/xsf/cephes/cbrt.h +0 -131
  575. scipy/special/xsf/cephes/chbevl.h +0 -85
  576. scipy/special/xsf/cephes/chdtr.h +0 -193
  577. scipy/special/xsf/cephes/const.h +0 -87
  578. scipy/special/xsf/cephes/ellie.h +0 -293
  579. scipy/special/xsf/cephes/ellik.h +0 -251
  580. scipy/special/xsf/cephes/ellpe.h +0 -107
  581. scipy/special/xsf/cephes/ellpk.h +0 -117
  582. scipy/special/xsf/cephes/expn.h +0 -260
  583. scipy/special/xsf/cephes/gamma.h +0 -398
  584. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  585. scipy/special/xsf/cephes/hyperg.h +0 -361
  586. scipy/special/xsf/cephes/i0.h +0 -149
  587. scipy/special/xsf/cephes/i1.h +0 -158
  588. scipy/special/xsf/cephes/igam.h +0 -421
  589. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  590. scipy/special/xsf/cephes/igami.h +0 -313
  591. scipy/special/xsf/cephes/j0.h +0 -225
  592. scipy/special/xsf/cephes/j1.h +0 -198
  593. scipy/special/xsf/cephes/jv.h +0 -715
  594. scipy/special/xsf/cephes/k0.h +0 -164
  595. scipy/special/xsf/cephes/k1.h +0 -163
  596. scipy/special/xsf/cephes/kn.h +0 -243
  597. scipy/special/xsf/cephes/lanczos.h +0 -112
  598. scipy/special/xsf/cephes/ndtr.h +0 -275
  599. scipy/special/xsf/cephes/poch.h +0 -85
  600. scipy/special/xsf/cephes/polevl.h +0 -167
  601. scipy/special/xsf/cephes/psi.h +0 -194
  602. scipy/special/xsf/cephes/rgamma.h +0 -111
  603. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  604. scipy/special/xsf/cephes/shichi.h +0 -248
  605. scipy/special/xsf/cephes/sici.h +0 -224
  606. scipy/special/xsf/cephes/sindg.h +0 -221
  607. scipy/special/xsf/cephes/tandg.h +0 -139
  608. scipy/special/xsf/cephes/trig.h +0 -58
  609. scipy/special/xsf/cephes/unity.h +0 -186
  610. scipy/special/xsf/cephes/zeta.h +0 -172
  611. scipy/special/xsf/config.h +0 -304
  612. scipy/special/xsf/digamma.h +0 -205
  613. scipy/special/xsf/error.h +0 -57
  614. scipy/special/xsf/evalpoly.h +0 -47
  615. scipy/special/xsf/expint.h +0 -266
  616. scipy/special/xsf/hyp2f1.h +0 -694
  617. scipy/special/xsf/iv_ratio.h +0 -173
  618. scipy/special/xsf/lambertw.h +0 -150
  619. scipy/special/xsf/loggamma.h +0 -163
  620. scipy/special/xsf/sici.h +0 -200
  621. scipy/special/xsf/tools.h +0 -427
  622. scipy/special/xsf/trig.h +0 -164
  623. scipy/special/xsf/wright_bessel.h +0 -843
  624. scipy/special/xsf/zlog1.h +0 -35
  625. scipy/stats/_mvn.cpython-313-darwin.so +0 -0
  626. scipy-1.15.2.dist-info/WHEEL +0 -4
@@ -1,85 +1,114 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, NamedTuple
4
- if TYPE_CHECKING:
5
- from typing import Literal, Optional, Tuple, Union
6
- from ._typing import ndarray
7
-
8
3
  import math
4
+ from typing import Literal, NamedTuple, cast
9
5
 
10
6
  import numpy as np
7
+
11
8
  if np.__version__[0] == "2":
12
9
  from numpy.lib.array_utils import normalize_axis_tuple
13
10
  else:
14
11
  from numpy.core.numeric import normalize_axis_tuple
15
12
 
16
- from ._aliases import matmul, matrix_transpose, tensordot, vecdot, isdtype
17
13
  from .._internal import get_xp
14
+ from ._aliases import isdtype, matmul, matrix_transpose, tensordot, vecdot
15
+ from ._typing import Array, DType, JustFloat, JustInt, Namespace
16
+
18
17
 
19
18
  # These are in the main NumPy namespace but not in numpy.linalg
20
- def cross(x1: ndarray, x2: ndarray, /, xp, *, axis: int = -1, **kwargs) -> ndarray:
19
+ def cross(
20
+ x1: Array,
21
+ x2: Array,
22
+ /,
23
+ xp: Namespace,
24
+ *,
25
+ axis: int = -1,
26
+ **kwargs: object,
27
+ ) -> Array:
21
28
  return xp.cross(x1, x2, axis=axis, **kwargs)
22
29
 
23
- def outer(x1: ndarray, x2: ndarray, /, xp, **kwargs) -> ndarray:
30
+ def outer(x1: Array, x2: Array, /, xp: Namespace, **kwargs: object) -> Array:
24
31
  return xp.outer(x1, x2, **kwargs)
25
32
 
26
33
  class EighResult(NamedTuple):
27
- eigenvalues: ndarray
28
- eigenvectors: ndarray
34
+ eigenvalues: Array
35
+ eigenvectors: Array
29
36
 
30
37
  class QRResult(NamedTuple):
31
- Q: ndarray
32
- R: ndarray
38
+ Q: Array
39
+ R: Array
33
40
 
34
41
  class SlogdetResult(NamedTuple):
35
- sign: ndarray
36
- logabsdet: ndarray
42
+ sign: Array
43
+ logabsdet: Array
37
44
 
38
45
  class SVDResult(NamedTuple):
39
- U: ndarray
40
- S: ndarray
41
- Vh: ndarray
46
+ U: Array
47
+ S: Array
48
+ Vh: Array
42
49
 
43
50
  # These functions are the same as their NumPy counterparts except they return
44
51
  # a namedtuple.
45
- def eigh(x: ndarray, /, xp, **kwargs) -> EighResult:
52
+ def eigh(x: Array, /, xp: Namespace, **kwargs: object) -> EighResult:
46
53
  return EighResult(*xp.linalg.eigh(x, **kwargs))
47
54
 
48
- def qr(x: ndarray, /, xp, *, mode: Literal['reduced', 'complete'] = 'reduced',
49
- **kwargs) -> QRResult:
55
+ def qr(
56
+ x: Array,
57
+ /,
58
+ xp: Namespace,
59
+ *,
60
+ mode: Literal["reduced", "complete"] = "reduced",
61
+ **kwargs: object,
62
+ ) -> QRResult:
50
63
  return QRResult(*xp.linalg.qr(x, mode=mode, **kwargs))
51
64
 
52
- def slogdet(x: ndarray, /, xp, **kwargs) -> SlogdetResult:
65
+ def slogdet(x: Array, /, xp: Namespace, **kwargs: object) -> SlogdetResult:
53
66
  return SlogdetResult(*xp.linalg.slogdet(x, **kwargs))
54
67
 
55
- def svd(x: ndarray, /, xp, *, full_matrices: bool = True, **kwargs) -> SVDResult:
68
+ def svd(
69
+ x: Array,
70
+ /,
71
+ xp: Namespace,
72
+ *,
73
+ full_matrices: bool = True,
74
+ **kwargs: object,
75
+ ) -> SVDResult:
56
76
  return SVDResult(*xp.linalg.svd(x, full_matrices=full_matrices, **kwargs))
57
77
 
58
78
  # These functions have additional keyword arguments
59
79
 
60
80
  # The upper keyword argument is new from NumPy
61
- def cholesky(x: ndarray, /, xp, *, upper: bool = False, **kwargs) -> ndarray:
81
+ def cholesky(
82
+ x: Array,
83
+ /,
84
+ xp: Namespace,
85
+ *,
86
+ upper: bool = False,
87
+ **kwargs: object,
88
+ ) -> Array:
62
89
  L = xp.linalg.cholesky(x, **kwargs)
63
90
  if upper:
64
91
  U = get_xp(xp)(matrix_transpose)(L)
65
92
  if get_xp(xp)(isdtype)(U.dtype, 'complex floating'):
66
- U = xp.conj(U)
93
+ U = xp.conj(U) # pyright: ignore[reportConstantRedefinition]
67
94
  return U
68
95
  return L
69
96
 
70
97
  # The rtol keyword argument of matrix_rank() and pinv() is new from NumPy.
71
98
  # Note that it has a different semantic meaning from tol and rcond.
72
- def matrix_rank(x: ndarray,
73
- /,
74
- xp,
75
- *,
76
- rtol: Optional[Union[float, ndarray]] = None,
77
- **kwargs) -> ndarray:
99
+ def matrix_rank(
100
+ x: Array,
101
+ /,
102
+ xp: Namespace,
103
+ *,
104
+ rtol: float | Array | None = None,
105
+ **kwargs: object,
106
+ ) -> Array:
78
107
  # this is different from xp.linalg.matrix_rank, which supports 1
79
108
  # dimensional arrays.
80
109
  if x.ndim < 2:
81
110
  raise xp.linalg.LinAlgError("1-dimensional array given. Array must be at least two-dimensional")
82
- S = get_xp(xp)(svdvals)(x, **kwargs)
111
+ S: Array = get_xp(xp)(svdvals)(x, **kwargs)
83
112
  if rtol is None:
84
113
  tol = S.max(axis=-1, keepdims=True) * max(x.shape[-2:]) * xp.finfo(S.dtype).eps
85
114
  else:
@@ -88,7 +117,14 @@ def matrix_rank(x: ndarray,
88
117
  tol = S.max(axis=-1, keepdims=True)*xp.asarray(rtol)[..., xp.newaxis]
89
118
  return xp.count_nonzero(S > tol, axis=-1)
90
119
 
91
- def pinv(x: ndarray, /, xp, *, rtol: Optional[Union[float, ndarray]] = None, **kwargs) -> ndarray:
120
+ def pinv(
121
+ x: Array,
122
+ /,
123
+ xp: Namespace,
124
+ *,
125
+ rtol: float | Array | None = None,
126
+ **kwargs: object,
127
+ ) -> Array:
92
128
  # this is different from xp.linalg.pinv, which does not multiply the
93
129
  # default tolerance by max(M, N).
94
130
  if rtol is None:
@@ -97,15 +133,30 @@ def pinv(x: ndarray, /, xp, *, rtol: Optional[Union[float, ndarray]] = None, **k
97
133
 
98
134
  # These functions are new in the array API spec
99
135
 
100
- def matrix_norm(x: ndarray, /, xp, *, keepdims: bool = False, ord: Optional[Union[int, float, Literal['fro', 'nuc']]] = 'fro') -> ndarray:
136
+ def matrix_norm(
137
+ x: Array,
138
+ /,
139
+ xp: Namespace,
140
+ *,
141
+ keepdims: bool = False,
142
+ ord: Literal[1, 2, -1, -2] | JustFloat | Literal["fro", "nuc"] | None = "fro",
143
+ ) -> Array:
101
144
  return xp.linalg.norm(x, axis=(-2, -1), keepdims=keepdims, ord=ord)
102
145
 
103
146
  # svdvals is not in NumPy (but it is in SciPy). It is equivalent to
104
147
  # xp.linalg.svd(compute_uv=False).
105
- def svdvals(x: ndarray, /, xp) -> Union[ndarray, Tuple[ndarray, ...]]:
148
+ def svdvals(x: Array, /, xp: Namespace) -> Array | tuple[Array, ...]:
106
149
  return xp.linalg.svd(x, compute_uv=False)
107
150
 
108
- def vector_norm(x: ndarray, /, xp, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False, ord: Optional[Union[int, float]] = 2) -> ndarray:
151
+ def vector_norm(
152
+ x: Array,
153
+ /,
154
+ xp: Namespace,
155
+ *,
156
+ axis: int | tuple[int, ...] | None = None,
157
+ keepdims: bool = False,
158
+ ord: JustInt | JustFloat = 2,
159
+ ) -> Array:
109
160
  # xp.linalg.norm tries to do a matrix norm whenever axis is a 2-tuple or
110
161
  # when axis=None and the input is 2-D, so to force a vector norm, we make
111
162
  # it so the input is 1-D (for axis=None), or reshape so that norm is done
@@ -117,7 +168,10 @@ def vector_norm(x: ndarray, /, xp, *, axis: Optional[Union[int, Tuple[int, ...]]
117
168
  elif isinstance(axis, tuple):
118
169
  # Note: The axis argument supports any number of axes, whereas
119
170
  # xp.linalg.norm() only supports a single axis for vector norm.
120
- normalized_axis = normalize_axis_tuple(axis, x.ndim)
171
+ normalized_axis = cast(
172
+ "tuple[int, ...]",
173
+ normalize_axis_tuple(axis, x.ndim), # pyright: ignore[reportCallIssue]
174
+ )
121
175
  rest = tuple(i for i in range(x.ndim) if i not in normalized_axis)
122
176
  newshape = axis + rest
123
177
  _x = xp.transpose(x, newshape).reshape(
@@ -133,7 +187,13 @@ def vector_norm(x: ndarray, /, xp, *, axis: Optional[Union[int, Tuple[int, ...]]
133
187
  # We can't reuse xp.linalg.norm(keepdims) because of the reshape hacks
134
188
  # above to avoid matrix norm logic.
135
189
  shape = list(x.shape)
136
- _axis = normalize_axis_tuple(range(x.ndim) if axis is None else axis, x.ndim)
190
+ _axis = cast(
191
+ "tuple[int, ...]",
192
+ normalize_axis_tuple( # pyright: ignore[reportCallIssue]
193
+ range(x.ndim) if axis is None else axis,
194
+ x.ndim,
195
+ ),
196
+ )
137
197
  for i in _axis:
138
198
  shape[i] = 1
139
199
  res = xp.reshape(res, tuple(shape))
@@ -143,14 +203,30 @@ def vector_norm(x: ndarray, /, xp, *, axis: Optional[Union[int, Tuple[int, ...]]
143
203
  # xp.diagonal and xp.trace operate on the first two axes whereas these
144
204
  # operates on the last two
145
205
 
146
- def diagonal(x: ndarray, /, xp, *, offset: int = 0, **kwargs) -> ndarray:
206
+ def diagonal(x: Array, /, xp: Namespace, *, offset: int = 0, **kwargs: object) -> Array:
147
207
  return xp.diagonal(x, offset=offset, axis1=-2, axis2=-1, **kwargs)
148
208
 
149
- def trace(x: ndarray, /, xp, *, offset: int = 0, dtype=None, **kwargs) -> ndarray:
150
- return xp.asarray(xp.trace(x, offset=offset, dtype=dtype, axis1=-2, axis2=-1, **kwargs))
209
+ def trace(
210
+ x: Array,
211
+ /,
212
+ xp: Namespace,
213
+ *,
214
+ offset: int = 0,
215
+ dtype: DType | None = None,
216
+ **kwargs: object,
217
+ ) -> Array:
218
+ return xp.asarray(
219
+ xp.trace(x, offset=offset, dtype=dtype, axis1=-2, axis2=-1, **kwargs)
220
+ )
151
221
 
152
222
  __all__ = ['cross', 'matmul', 'outer', 'tensordot', 'EighResult',
153
223
  'QRResult', 'SlogdetResult', 'SVDResult', 'eigh', 'qr', 'slogdet',
154
224
  'svd', 'cholesky', 'matrix_rank', 'pinv', 'matrix_norm',
155
225
  'matrix_transpose', 'svdvals', 'vecdot', 'vector_norm', 'diagonal',
156
226
  'trace']
227
+
228
+ _all_ignore = ['math', 'normalize_axis_tuple', 'get_xp', 'np', 'isdtype']
229
+
230
+
231
+ def __dir__() -> list[str]:
232
+ return __all__
@@ -1,23 +1,192 @@
1
1
  from __future__ import annotations
2
2
 
3
- __all__ = [
4
- "NestedSequence",
5
- "SupportsBufferProtocol",
6
- ]
7
-
3
+ from collections.abc import Mapping
4
+ from types import ModuleType as Namespace
8
5
  from typing import (
9
- Any,
10
- TypeVar,
6
+ TYPE_CHECKING,
7
+ Literal,
11
8
  Protocol,
9
+ TypeAlias,
10
+ TypedDict,
11
+ TypeVar,
12
+ final,
12
13
  )
13
14
 
15
+ if TYPE_CHECKING:
16
+ from _typeshed import Incomplete
17
+
18
+ SupportsBufferProtocol: TypeAlias = Incomplete
19
+ Array: TypeAlias = Incomplete
20
+ Device: TypeAlias = Incomplete
21
+ DType: TypeAlias = Incomplete
22
+ else:
23
+ SupportsBufferProtocol = object
24
+ Array = object
25
+ Device = object
26
+ DType = object
27
+
28
+
14
29
  _T_co = TypeVar("_T_co", covariant=True)
15
30
 
31
+
32
+ # These "Just" types are equivalent to the `Just` type from the `optype` library,
33
+ # apart from them not being `@runtime_checkable`.
34
+ # - docs: https://github.com/jorenham/optype/blob/master/README.md#just
35
+ # - code: https://github.com/jorenham/optype/blob/master/optype/_core/_just.py
36
+ @final
37
+ class JustInt(Protocol):
38
+ @property
39
+ def __class__(self, /) -> type[int]: ...
40
+ @__class__.setter
41
+ def __class__(self, value: type[int], /) -> None: ... # pyright: ignore[reportIncompatibleMethodOverride]
42
+
43
+
44
+ @final
45
+ class JustFloat(Protocol):
46
+ @property
47
+ def __class__(self, /) -> type[float]: ...
48
+ @__class__.setter
49
+ def __class__(self, value: type[float], /) -> None: ... # pyright: ignore[reportIncompatibleMethodOverride]
50
+
51
+
52
+ @final
53
+ class JustComplex(Protocol):
54
+ @property
55
+ def __class__(self, /) -> type[complex]: ...
56
+ @__class__.setter
57
+ def __class__(self, value: type[complex], /) -> None: ... # pyright: ignore[reportIncompatibleMethodOverride]
58
+
59
+
60
+ #
61
+
62
+
16
63
  class NestedSequence(Protocol[_T_co]):
17
64
  def __getitem__(self, key: int, /) -> _T_co | NestedSequence[_T_co]: ...
18
65
  def __len__(self, /) -> int: ...
19
66
 
20
- SupportsBufferProtocol = Any
21
67
 
22
- Array = Any
23
- Device = Any
68
+ class SupportsArrayNamespace(Protocol[_T_co]):
69
+ def __array_namespace__(self, /, *, api_version: str | None) -> _T_co: ...
70
+
71
+
72
+ class HasShape(Protocol[_T_co]):
73
+ @property
74
+ def shape(self, /) -> _T_co: ...
75
+
76
+
77
+ # Return type of `__array_namespace_info__.default_dtypes`
78
+ Capabilities = TypedDict(
79
+ "Capabilities",
80
+ {
81
+ "boolean indexing": bool,
82
+ "data-dependent shapes": bool,
83
+ "max dimensions": int,
84
+ },
85
+ )
86
+
87
+ # Return type of `__array_namespace_info__.default_dtypes`
88
+ DefaultDTypes = TypedDict(
89
+ "DefaultDTypes",
90
+ {
91
+ "real floating": DType,
92
+ "complex floating": DType,
93
+ "integral": DType,
94
+ "indexing": DType,
95
+ },
96
+ )
97
+
98
+
99
+ _DTypeKind: TypeAlias = Literal[
100
+ "bool",
101
+ "signed integer",
102
+ "unsigned integer",
103
+ "integral",
104
+ "real floating",
105
+ "complex floating",
106
+ "numeric",
107
+ ]
108
+ # Type of the `kind` parameter in `__array_namespace_info__.dtypes`
109
+ DTypeKind: TypeAlias = _DTypeKind | tuple[_DTypeKind, ...]
110
+
111
+
112
+ # `__array_namespace_info__.dtypes(kind="bool")`
113
+ class DTypesBool(TypedDict):
114
+ bool: DType
115
+
116
+
117
+ # `__array_namespace_info__.dtypes(kind="signed integer")`
118
+ class DTypesSigned(TypedDict):
119
+ int8: DType
120
+ int16: DType
121
+ int32: DType
122
+ int64: DType
123
+
124
+
125
+ # `__array_namespace_info__.dtypes(kind="unsigned integer")`
126
+ class DTypesUnsigned(TypedDict):
127
+ uint8: DType
128
+ uint16: DType
129
+ uint32: DType
130
+ uint64: DType
131
+
132
+
133
+ # `__array_namespace_info__.dtypes(kind="integral")`
134
+ class DTypesIntegral(DTypesSigned, DTypesUnsigned):
135
+ pass
136
+
137
+
138
+ # `__array_namespace_info__.dtypes(kind="real floating")`
139
+ class DTypesReal(TypedDict):
140
+ float32: DType
141
+ float64: DType
142
+
143
+
144
+ # `__array_namespace_info__.dtypes(kind="complex floating")`
145
+ class DTypesComplex(TypedDict):
146
+ complex64: DType
147
+ complex128: DType
148
+
149
+
150
+ # `__array_namespace_info__.dtypes(kind="numeric")`
151
+ class DTypesNumeric(DTypesIntegral, DTypesReal, DTypesComplex):
152
+ pass
153
+
154
+
155
+ # `__array_namespace_info__.dtypes(kind=None)` (default)
156
+ class DTypesAll(DTypesBool, DTypesNumeric):
157
+ pass
158
+
159
+
160
+ # `__array_namespace_info__.dtypes(kind=?)` (fallback)
161
+ DTypesAny: TypeAlias = Mapping[str, DType]
162
+
163
+
164
+ __all__ = [
165
+ "Array",
166
+ "Capabilities",
167
+ "DType",
168
+ "DTypeKind",
169
+ "DTypesAny",
170
+ "DTypesAll",
171
+ "DTypesBool",
172
+ "DTypesNumeric",
173
+ "DTypesIntegral",
174
+ "DTypesSigned",
175
+ "DTypesUnsigned",
176
+ "DTypesReal",
177
+ "DTypesComplex",
178
+ "DefaultDTypes",
179
+ "Device",
180
+ "HasShape",
181
+ "Namespace",
182
+ "JustInt",
183
+ "JustFloat",
184
+ "JustComplex",
185
+ "NestedSequence",
186
+ "SupportsArrayNamespace",
187
+ "SupportsBufferProtocol",
188
+ ]
189
+
190
+
191
+ def __dir__() -> list[str]:
192
+ return __all__
@@ -8,9 +8,6 @@ from ._aliases import * # noqa: F403
8
8
 
9
9
  # See the comment in the numpy __init__.py
10
10
  __import__(__package__ + '.linalg')
11
-
12
11
  __import__(__package__ + '.fft')
13
12
 
14
- from ..common._helpers import * # noqa: F401,F403
15
-
16
- __array_api_version__ = '2023.12'
13
+ __array_api_version__ = '2024.12'
@@ -1,16 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from typing import Optional
4
+
3
5
  import cupy as cp
4
6
 
5
- from ..common import _aliases
7
+ from ..common import _aliases, _helpers
8
+ from ..common._typing import NestedSequence, SupportsBufferProtocol
6
9
  from .._internal import get_xp
7
-
8
10
  from ._info import __array_namespace_info__
9
-
10
- from typing import TYPE_CHECKING
11
- if TYPE_CHECKING:
12
- from typing import Optional, Union
13
- from ._typing import ndarray, Device, Dtype, NestedSequence, SupportsBufferProtocol
11
+ from ._typing import Array, Device, DType
14
12
 
15
13
  bool = cp.bool_
16
14
 
@@ -46,10 +44,10 @@ unique_all = get_xp(cp)(_aliases.unique_all)
46
44
  unique_counts = get_xp(cp)(_aliases.unique_counts)
47
45
  unique_inverse = get_xp(cp)(_aliases.unique_inverse)
48
46
  unique_values = get_xp(cp)(_aliases.unique_values)
49
- astype = _aliases.astype
50
47
  std = get_xp(cp)(_aliases.std)
51
48
  var = get_xp(cp)(_aliases.var)
52
49
  cumulative_sum = get_xp(cp)(_aliases.cumulative_sum)
50
+ cumulative_prod = get_xp(cp)(_aliases.cumulative_prod)
53
51
  clip = get_xp(cp)(_aliases.clip)
54
52
  permute_dims = get_xp(cp)(_aliases.permute_dims)
55
53
  reshape = get_xp(cp)(_aliases.reshape)
@@ -63,26 +61,25 @@ matmul = get_xp(cp)(_aliases.matmul)
63
61
  matrix_transpose = get_xp(cp)(_aliases.matrix_transpose)
64
62
  tensordot = get_xp(cp)(_aliases.tensordot)
65
63
  sign = get_xp(cp)(_aliases.sign)
64
+ finfo = get_xp(cp)(_aliases.finfo)
65
+ iinfo = get_xp(cp)(_aliases.iinfo)
66
66
 
67
- _copy_default = object()
68
67
 
69
68
  # asarray also adds the copy keyword, which is not present in numpy 1.0.
70
69
  def asarray(
71
- obj: Union[
72
- ndarray,
73
- bool,
74
- int,
75
- float,
76
- NestedSequence[bool | int | float],
77
- SupportsBufferProtocol,
78
- ],
70
+ obj: (
71
+ Array
72
+ | bool | int | float | complex
73
+ | NestedSequence[bool | int | float | complex]
74
+ | SupportsBufferProtocol
75
+ ),
79
76
  /,
80
77
  *,
81
- dtype: Optional[Dtype] = None,
78
+ dtype: Optional[DType] = None,
82
79
  device: Optional[Device] = None,
83
- copy: Optional[bool] = _copy_default,
80
+ copy: Optional[bool] = None,
84
81
  **kwargs,
85
- ) -> ndarray:
82
+ ) -> Array:
86
83
  """
87
84
  Array API compatibility wrapper for asarray().
88
85
 
@@ -90,25 +87,47 @@ def asarray(
90
87
  specification for more details.
91
88
  """
92
89
  with cp.cuda.Device(device):
93
- # cupy is like NumPy 1.26 (except without _CopyMode). See the comments
94
- # in asarray in numpy/_aliases.py.
95
- if copy is not _copy_default:
96
- # A future version of CuPy will change the meaning of copy=False
97
- # to mean no-copy. We don't know for certain what version it will
98
- # be yet, so to avoid breaking that version, we use a different
99
- # default value for copy so asarray(obj) with no copy kwarg will
100
- # always do the copy-if-needed behavior.
101
-
102
- # This will still need to be updated to remove the
103
- # NotImplementedError for copy=False, but at least this won't
104
- # break the default or existing behavior.
105
- if copy is None:
106
- copy = False
107
- elif copy is False:
108
- raise NotImplementedError("asarray(copy=False) is not yet supported in cupy")
109
- kwargs['copy'] = copy
110
-
111
- return cp.array(obj, dtype=dtype, **kwargs)
90
+ if copy is None:
91
+ return cp.asarray(obj, dtype=dtype, **kwargs)
92
+ else:
93
+ res = cp.array(obj, dtype=dtype, copy=copy, **kwargs)
94
+ if not copy and res is not obj:
95
+ raise ValueError("Unable to avoid copy while creating an array as requested")
96
+ return res
97
+
98
+
99
+ def astype(
100
+ x: Array,
101
+ dtype: DType,
102
+ /,
103
+ *,
104
+ copy: bool = True,
105
+ device: Optional[Device] = None,
106
+ ) -> Array:
107
+ if device is None:
108
+ return x.astype(dtype=dtype, copy=copy)
109
+ out = _helpers.to_device(x.astype(dtype=dtype, copy=False), device)
110
+ return out.copy() if copy and out is x else out
111
+
112
+
113
+ # cupy.count_nonzero does not have keepdims
114
+ def count_nonzero(
115
+ x: Array,
116
+ axis=None,
117
+ keepdims=False
118
+ ) -> Array:
119
+ result = cp.count_nonzero(x, axis)
120
+ if keepdims:
121
+ if axis is None:
122
+ return cp.reshape(result, [1]*x.ndim)
123
+ return cp.expand_dims(result, axis)
124
+ return result
125
+
126
+
127
+ # take_along_axis: axis defaults to -1 but in cupy (and numpy) axis is a required arg
128
+ def take_along_axis(x: Array, indices: Array, /, *, axis: int = -1):
129
+ return cp.take_along_axis(x, indices, axis=axis)
130
+
112
131
 
113
132
  # These functions are completely new here. If the library already has them
114
133
  # (i.e., numpy 2.0), use the library version instead of our wrapper.
@@ -127,10 +146,11 @@ if hasattr(cp, 'unstack'):
127
146
  else:
128
147
  unstack = get_xp(cp)(_aliases.unstack)
129
148
 
130
- __all__ = _aliases.__all__ + ['__array_namespace_info__', 'asarray', 'bool',
149
+ __all__ = _aliases.__all__ + ['__array_namespace_info__', 'asarray', 'astype',
131
150
  'acos', 'acosh', 'asin', 'asinh', 'atan',
132
151
  'atan2', 'atanh', 'bitwise_left_shift',
133
152
  'bitwise_invert', 'bitwise_right_shift',
134
- 'concat', 'pow', 'sign']
153
+ 'bool', 'concat', 'count_nonzero', 'pow', 'sign',
154
+ 'take_along_axis']
135
155
 
136
156
  _all_ignore = ['cp', 'get_xp']
@@ -26,6 +26,7 @@ from cupy import (
26
26
  complex128,
27
27
  )
28
28
 
29
+
29
30
  class __array_namespace_info__:
30
31
  """
31
32
  Get the array API inspection namespace for CuPy.
@@ -49,7 +50,7 @@ class __array_namespace_info__:
49
50
 
50
51
  Examples
51
52
  --------
52
- >>> info = np.__array_namespace_info__()
53
+ >>> info = xp.__array_namespace_info__()
53
54
  >>> info.default_dtypes()
54
55
  {'real floating': cupy.float64,
55
56
  'complex floating': cupy.complex128,
@@ -94,14 +95,14 @@ class __array_namespace_info__:
94
95
  >>> info = xp.__array_namespace_info__()
95
96
  >>> info.capabilities()
96
97
  {'boolean indexing': True,
97
- 'data-dependent shapes': True}
98
+ 'data-dependent shapes': True,
99
+ 'max dimensions': 64}
98
100
 
99
101
  """
100
102
  return {
101
103
  "boolean indexing": True,
102
104
  "data-dependent shapes": True,
103
- # 'max rank' will be part of the 2024.12 standard
104
- # "max rank": 64,
105
+ "max dimensions": 64,
105
106
  }
106
107
 
107
108
  def default_device(self):
@@ -117,7 +118,7 @@ class __array_namespace_info__:
117
118
 
118
119
  Returns
119
120
  -------
120
- device : str
121
+ device : Device
121
122
  The default device used for new CuPy arrays.
122
123
 
123
124
  Examples
@@ -126,6 +127,15 @@ class __array_namespace_info__:
126
127
  >>> info.default_device()
127
128
  Device(0)
128
129
 
130
+ Notes
131
+ -----
132
+ This method returns the static default device when CuPy is initialized.
133
+ However, the *current* device used by creation functions (``empty`` etc.)
134
+ can be changed globally or with a context manager.
135
+
136
+ See Also
137
+ --------
138
+ https://github.com/data-apis/array-api/issues/835
129
139
  """
130
140
  return cuda.Device(0)
131
141
 
@@ -312,7 +322,7 @@ class __array_namespace_info__:
312
322
 
313
323
  Returns
314
324
  -------
315
- devices : list of str
325
+ devices : list[Device]
316
326
  The devices supported by CuPy.
317
327
 
318
328
  See Also