scipy 1.15.3__cp313-cp313-musllinux_1_2_aarch64.whl → 1.16.0rc2__cp313-cp313-musllinux_1_2_aarch64.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 (641) hide show
  1. scipy/__config__.py +10 -10
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313-aarch64-linux-musl.so +0 -0
  4. scipy/_lib/_array_api.py +486 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-313-aarch64-linux-musl.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_fpumode.cpython-313-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-313-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-313-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-313-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-313-aarch64-linux-musl.so +0 -0
  17. scipy/_lib/_util.py +222 -125
  18. scipy/_lib/array_api_compat/__init__.py +4 -4
  19. scipy/_lib/array_api_compat/_internal.py +19 -6
  20. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  21. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  22. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  23. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  24. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  25. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  26. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  27. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  28. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  29. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  30. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  31. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  32. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  33. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  34. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  35. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  36. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  37. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  38. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  39. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  40. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  41. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  42. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  43. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  44. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  45. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  46. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  47. scipy/_lib/array_api_extra/__init__.py +26 -3
  48. scipy/_lib/array_api_extra/_delegation.py +171 -0
  49. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  50. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  51. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  52. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  53. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  54. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  60. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  61. scipy/_lib/array_api_extra/testing.py +359 -0
  62. scipy/_lib/decorator.py +2 -2
  63. scipy/_lib/doccer.py +1 -7
  64. scipy/_lib/messagestream.cpython-313-aarch64-linux-musl.so +0 -0
  65. scipy/_lib/pyprima/__init__.py +212 -0
  66. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  67. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  68. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  69. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  70. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  71. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  72. scipy/_lib/pyprima/cobyla/update.py +289 -0
  73. scipy/_lib/pyprima/common/__init__.py +0 -0
  74. scipy/_lib/pyprima/common/_bounds.py +34 -0
  75. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  76. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  77. scipy/_lib/pyprima/common/_project.py +173 -0
  78. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  79. scipy/_lib/pyprima/common/consts.py +47 -0
  80. scipy/_lib/pyprima/common/evaluate.py +99 -0
  81. scipy/_lib/pyprima/common/history.py +38 -0
  82. scipy/_lib/pyprima/common/infos.py +30 -0
  83. scipy/_lib/pyprima/common/linalg.py +435 -0
  84. scipy/_lib/pyprima/common/message.py +290 -0
  85. scipy/_lib/pyprima/common/powalg.py +131 -0
  86. scipy/_lib/pyprima/common/preproc.py +277 -0
  87. scipy/_lib/pyprima/common/present.py +5 -0
  88. scipy/_lib/pyprima/common/ratio.py +54 -0
  89. scipy/_lib/pyprima/common/redrho.py +47 -0
  90. scipy/_lib/pyprima/common/selectx.py +296 -0
  91. scipy/_lib/tests/test__util.py +105 -121
  92. scipy/_lib/tests/test_array_api.py +166 -35
  93. scipy/_lib/tests/test_bunch.py +7 -0
  94. scipy/_lib/tests/test_ccallback.py +2 -10
  95. scipy/_lib/tests/test_public_api.py +13 -0
  96. scipy/cluster/_hierarchy.cpython-313-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-313-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-313-aarch64-linux-musl.so +0 -0
  99. scipy/cluster/hierarchy.py +393 -223
  100. scipy/cluster/tests/test_hierarchy.py +273 -335
  101. scipy/cluster/tests/test_vq.py +45 -61
  102. scipy/cluster/vq.py +39 -35
  103. scipy/conftest.py +263 -157
  104. scipy/constants/_constants.py +4 -1
  105. scipy/constants/tests/test_codata.py +2 -2
  106. scipy/constants/tests/test_constants.py +11 -18
  107. scipy/datasets/_download_all.py +15 -1
  108. scipy/datasets/_fetchers.py +7 -1
  109. scipy/datasets/_utils.py +1 -1
  110. scipy/differentiate/_differentiate.py +25 -25
  111. scipy/differentiate/tests/test_differentiate.py +24 -25
  112. scipy/fft/_basic.py +20 -0
  113. scipy/fft/_helper.py +3 -34
  114. scipy/fft/_pocketfft/helper.py +29 -1
  115. scipy/fft/_pocketfft/pypocketfft.cpython-313-aarch64-linux-musl.so +0 -0
  116. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  117. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  118. scipy/fft/_realtransforms.py +13 -0
  119. scipy/fft/tests/test_basic.py +27 -25
  120. scipy/fft/tests/test_fftlog.py +16 -7
  121. scipy/fft/tests/test_helper.py +18 -34
  122. scipy/fft/tests/test_real_transforms.py +8 -10
  123. scipy/fftpack/convolve.cpython-313-aarch64-linux-musl.so +0 -0
  124. scipy/fftpack/tests/test_basic.py +2 -4
  125. scipy/fftpack/tests/test_real_transforms.py +8 -9
  126. scipy/integrate/_bvp.py +9 -3
  127. scipy/integrate/_cubature.py +3 -2
  128. scipy/integrate/_dop.cpython-313-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_lsoda.cpython-313-aarch64-linux-musl.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-313-aarch64-linux-musl.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-313-aarch64-linux-musl.so +0 -0
  134. scipy/integrate/_quadpack_py.py +11 -7
  135. scipy/integrate/_quadrature.py +3 -3
  136. scipy/integrate/_rules/_base.py +2 -2
  137. scipy/integrate/_tanhsinh.py +48 -47
  138. scipy/integrate/_test_multivariate.cpython-313-aarch64-linux-musl.so +0 -0
  139. scipy/integrate/_test_odeint_banded.cpython-313-aarch64-linux-musl.so +0 -0
  140. scipy/integrate/_vode.cpython-313-aarch64-linux-musl.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 +56 -48
  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-aarch64-linux-musl.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-313-aarch64-linux-musl.so +0 -0
  152. scipy/interpolate/_fitpack.cpython-313-aarch64-linux-musl.so +0 -0
  153. scipy/interpolate/_fitpack2.py +9 -6
  154. scipy/interpolate/_fitpack_impl.py +32 -26
  155. scipy/interpolate/_fitpack_repro.py +23 -19
  156. scipy/interpolate/_interpnd.cpython-313-aarch64-linux-musl.so +0 -0
  157. scipy/interpolate/_interpolate.py +30 -12
  158. scipy/interpolate/_ndbspline.py +13 -18
  159. scipy/interpolate/_ndgriddata.py +5 -8
  160. scipy/interpolate/_polyint.py +95 -31
  161. scipy/interpolate/_ppoly.cpython-313-aarch64-linux-musl.so +0 -0
  162. scipy/interpolate/_rbf.py +2 -2
  163. scipy/interpolate/_rbfinterp.py +1 -1
  164. scipy/interpolate/_rbfinterp_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rgi.py +31 -26
  166. scipy/interpolate/_rgi_cython.cpython-313-aarch64-linux-musl.so +0 -0
  167. scipy/interpolate/dfitpack.py +0 -20
  168. scipy/interpolate/interpnd.py +1 -2
  169. scipy/interpolate/tests/test_bary_rational.py +2 -2
  170. scipy/interpolate/tests/test_bsplines.py +97 -1
  171. scipy/interpolate/tests/test_fitpack2.py +39 -1
  172. scipy/interpolate/tests/test_interpnd.py +32 -20
  173. scipy/interpolate/tests/test_interpolate.py +48 -4
  174. scipy/interpolate/tests/test_rgi.py +2 -1
  175. scipy/io/_fast_matrix_market/__init__.py +2 -0
  176. scipy/io/_fast_matrix_market/_fmm_core.cpython-313-aarch64-linux-musl.so +0 -0
  177. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  178. scipy/io/_harwell_boeing/hb.py +7 -11
  179. scipy/io/_idl.py +5 -7
  180. scipy/io/_netcdf.py +15 -5
  181. scipy/io/_test_fortran.cpython-313-aarch64-linux-musl.so +0 -0
  182. scipy/io/arff/tests/test_arffread.py +3 -3
  183. scipy/io/matlab/__init__.py +5 -3
  184. scipy/io/matlab/_mio.py +4 -1
  185. scipy/io/matlab/_mio5.py +19 -13
  186. scipy/io/matlab/_mio5_utils.cpython-313-aarch64-linux-musl.so +0 -0
  187. scipy/io/matlab/_mio_utils.cpython-313-aarch64-linux-musl.so +0 -0
  188. scipy/io/matlab/_miobase.py +4 -1
  189. scipy/io/matlab/_streams.cpython-313-aarch64-linux-musl.so +0 -0
  190. scipy/io/matlab/tests/test_mio.py +46 -18
  191. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  192. scipy/io/tests/test_mmio.py +7 -1
  193. scipy/io/tests/test_wavfile.py +41 -0
  194. scipy/io/wavfile.py +57 -10
  195. scipy/linalg/_basic.py +113 -86
  196. scipy/linalg/_cythonized_array_utils.cpython-313-aarch64-linux-musl.so +0 -0
  197. scipy/linalg/_decomp.py +22 -9
  198. scipy/linalg/_decomp_cholesky.py +28 -13
  199. scipy/linalg/_decomp_cossin.py +45 -30
  200. scipy/linalg/_decomp_interpolative.cpython-313-aarch64-linux-musl.so +0 -0
  201. scipy/linalg/_decomp_ldl.py +4 -1
  202. scipy/linalg/_decomp_lu.py +18 -6
  203. scipy/linalg/_decomp_lu_cython.cpython-313-aarch64-linux-musl.so +0 -0
  204. scipy/linalg/_decomp_polar.py +2 -0
  205. scipy/linalg/_decomp_qr.py +6 -2
  206. scipy/linalg/_decomp_qz.py +3 -0
  207. scipy/linalg/_decomp_schur.py +3 -1
  208. scipy/linalg/_decomp_svd.py +13 -2
  209. scipy/linalg/_decomp_update.cpython-313-aarch64-linux-musl.so +0 -0
  210. scipy/linalg/_expm_frechet.py +4 -0
  211. scipy/linalg/_fblas.cpython-313-aarch64-linux-musl.so +0 -0
  212. scipy/linalg/_flapack.cpython-313-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_linalg_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  214. scipy/linalg/_matfuncs.py +187 -4
  215. scipy/linalg/_matfuncs_expm.cpython-313-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  218. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-aarch64-linux-musl.so +0 -0
  219. scipy/linalg/_procrustes.py +2 -0
  220. scipy/linalg/_sketches.py +17 -6
  221. scipy/linalg/_solve_toeplitz.cpython-313-aarch64-linux-musl.so +0 -0
  222. scipy/linalg/_solvers.py +7 -2
  223. scipy/linalg/_special_matrices.py +26 -36
  224. scipy/linalg/cython_blas.cpython-313-aarch64-linux-musl.so +0 -0
  225. scipy/linalg/cython_lapack.cpython-313-aarch64-linux-musl.so +0 -0
  226. scipy/linalg/lapack.py +22 -2
  227. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  228. scipy/linalg/tests/test_basic.py +31 -16
  229. scipy/linalg/tests/test_batch.py +588 -0
  230. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  231. scipy/linalg/tests/test_decomp.py +40 -3
  232. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  233. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  234. scipy/linalg/tests/test_lapack.py +115 -7
  235. scipy/linalg/tests/test_matfuncs.py +157 -102
  236. scipy/linalg/tests/test_procrustes.py +0 -7
  237. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  238. scipy/linalg/tests/test_special_matrices.py +1 -5
  239. scipy/ndimage/__init__.py +1 -0
  240. scipy/ndimage/_ctest.cpython-313-aarch64-linux-musl.so +0 -0
  241. scipy/ndimage/_cytest.cpython-313-aarch64-linux-musl.so +0 -0
  242. scipy/ndimage/_delegators.py +8 -2
  243. scipy/ndimage/_filters.py +453 -5
  244. scipy/ndimage/_interpolation.py +36 -6
  245. scipy/ndimage/_measurements.py +4 -2
  246. scipy/ndimage/_morphology.py +5 -0
  247. scipy/ndimage/_nd_image.cpython-313-aarch64-linux-musl.so +0 -0
  248. scipy/ndimage/_ni_docstrings.py +5 -1
  249. scipy/ndimage/_ni_label.cpython-313-aarch64-linux-musl.so +0 -0
  250. scipy/ndimage/_ni_support.py +1 -5
  251. scipy/ndimage/_rank_filter_1d.cpython-313-aarch64-linux-musl.so +0 -0
  252. scipy/ndimage/_support_alternative_backends.py +18 -6
  253. scipy/ndimage/tests/test_filters.py +370 -259
  254. scipy/ndimage/tests/test_fourier.py +7 -9
  255. scipy/ndimage/tests/test_interpolation.py +68 -61
  256. scipy/ndimage/tests/test_measurements.py +18 -35
  257. scipy/ndimage/tests/test_morphology.py +143 -131
  258. scipy/ndimage/tests/test_splines.py +1 -3
  259. scipy/odr/__odrpack.cpython-313-aarch64-linux-musl.so +0 -0
  260. scipy/optimize/_basinhopping.py +13 -7
  261. scipy/optimize/_bglu_dense.cpython-313-aarch64-linux-musl.so +0 -0
  262. scipy/optimize/_bracket.py +17 -24
  263. scipy/optimize/_chandrupatla.py +9 -10
  264. scipy/optimize/_cobyla_py.py +104 -123
  265. scipy/optimize/_constraints.py +14 -10
  266. scipy/optimize/_differentiable_functions.py +371 -230
  267. scipy/optimize/_differentialevolution.py +4 -3
  268. scipy/optimize/_direct.cpython-313-aarch64-linux-musl.so +0 -0
  269. scipy/optimize/_dual_annealing.py +1 -1
  270. scipy/optimize/_elementwise.py +1 -4
  271. scipy/optimize/_group_columns.cpython-313-aarch64-linux-musl.so +0 -0
  272. scipy/optimize/_highspy/_core.cpython-313-aarch64-linux-musl.so +0 -0
  273. scipy/optimize/_highspy/_highs_options.cpython-313-aarch64-linux-musl.so +0 -0
  274. scipy/optimize/_lbfgsb.cpython-313-aarch64-linux-musl.so +0 -0
  275. scipy/optimize/_lbfgsb_py.py +57 -16
  276. scipy/optimize/_linprog_doc.py +2 -2
  277. scipy/optimize/_linprog_highs.py +2 -2
  278. scipy/optimize/_linprog_ip.py +25 -10
  279. scipy/optimize/_linprog_util.py +14 -16
  280. scipy/optimize/_lsap.cpython-313-aarch64-linux-musl.so +0 -0
  281. scipy/optimize/_lsq/common.py +3 -3
  282. scipy/optimize/_lsq/dogbox.py +16 -2
  283. scipy/optimize/_lsq/givens_elimination.cpython-313-aarch64-linux-musl.so +0 -0
  284. scipy/optimize/_lsq/least_squares.py +198 -126
  285. scipy/optimize/_lsq/lsq_linear.py +6 -6
  286. scipy/optimize/_lsq/trf.py +35 -8
  287. scipy/optimize/_milp.py +3 -1
  288. scipy/optimize/_minimize.py +105 -36
  289. scipy/optimize/_minpack.cpython-313-aarch64-linux-musl.so +0 -0
  290. scipy/optimize/_minpack_py.py +21 -14
  291. scipy/optimize/_moduleTNC.cpython-313-aarch64-linux-musl.so +0 -0
  292. scipy/optimize/_nnls.py +20 -21
  293. scipy/optimize/_nonlin.py +34 -3
  294. scipy/optimize/_numdiff.py +288 -110
  295. scipy/optimize/_optimize.py +86 -48
  296. scipy/optimize/_pava_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  297. scipy/optimize/_remove_redundancy.py +5 -5
  298. scipy/optimize/_root_scalar.py +1 -1
  299. scipy/optimize/_shgo.py +6 -0
  300. scipy/optimize/_shgo_lib/_complex.py +1 -1
  301. scipy/optimize/_slsqp_py.py +216 -124
  302. scipy/optimize/_slsqplib.cpython-313-aarch64-linux-musl.so +0 -0
  303. scipy/optimize/_spectral.py +1 -1
  304. scipy/optimize/_tnc.py +8 -1
  305. scipy/optimize/_trlib/_trlib.cpython-313-aarch64-linux-musl.so +0 -0
  306. scipy/optimize/_trustregion.py +20 -6
  307. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  308. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  309. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  310. scipy/optimize/_trustregion_constr/projections.py +12 -8
  311. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  312. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  313. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  314. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  315. scipy/optimize/_trustregion_exact.py +0 -1
  316. scipy/optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  317. scipy/optimize/_zeros_py.py +97 -17
  318. scipy/optimize/cython_optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  319. scipy/optimize/slsqp.py +0 -1
  320. scipy/optimize/tests/test__basinhopping.py +1 -1
  321. scipy/optimize/tests/test__differential_evolution.py +4 -4
  322. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  323. scipy/optimize/tests/test__numdiff.py +66 -22
  324. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  325. scipy/optimize/tests/test__shgo.py +9 -1
  326. scipy/optimize/tests/test_bracket.py +36 -46
  327. scipy/optimize/tests/test_chandrupatla.py +133 -135
  328. scipy/optimize/tests/test_cobyla.py +74 -45
  329. scipy/optimize/tests/test_constraints.py +1 -1
  330. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  331. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  332. scipy/optimize/tests/test_least_squares.py +125 -13
  333. scipy/optimize/tests/test_linear_assignment.py +3 -3
  334. scipy/optimize/tests/test_linprog.py +3 -3
  335. scipy/optimize/tests/test_lsq_linear.py +6 -6
  336. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  337. scipy/optimize/tests/test_minpack.py +4 -4
  338. scipy/optimize/tests/test_nnls.py +43 -3
  339. scipy/optimize/tests/test_nonlin.py +36 -0
  340. scipy/optimize/tests/test_optimize.py +95 -17
  341. scipy/optimize/tests/test_slsqp.py +36 -4
  342. scipy/optimize/tests/test_zeros.py +34 -1
  343. scipy/signal/__init__.py +12 -23
  344. scipy/signal/_delegators.py +568 -0
  345. scipy/signal/_filter_design.py +459 -241
  346. scipy/signal/_fir_filter_design.py +262 -90
  347. scipy/signal/_lti_conversion.py +3 -2
  348. scipy/signal/_ltisys.py +118 -91
  349. scipy/signal/_max_len_seq_inner.cpython-313-aarch64-linux-musl.so +0 -0
  350. scipy/signal/_peak_finding_utils.cpython-313-aarch64-linux-musl.so +0 -0
  351. scipy/signal/_polyutils.py +172 -0
  352. scipy/signal/_short_time_fft.py +519 -70
  353. scipy/signal/_signal_api.py +30 -0
  354. scipy/signal/_signaltools.py +719 -399
  355. scipy/signal/_sigtools.cpython-313-aarch64-linux-musl.so +0 -0
  356. scipy/signal/_sosfilt.cpython-313-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_spectral_py.py +230 -50
  358. scipy/signal/_spline.cpython-313-aarch64-linux-musl.so +0 -0
  359. scipy/signal/_spline_filters.py +108 -68
  360. scipy/signal/_support_alternative_backends.py +73 -0
  361. scipy/signal/_upfirdn.py +4 -1
  362. scipy/signal/_upfirdn_apply.cpython-313-aarch64-linux-musl.so +0 -0
  363. scipy/signal/_waveforms.py +2 -11
  364. scipy/signal/_wavelets.py +1 -1
  365. scipy/signal/fir_filter_design.py +1 -0
  366. scipy/signal/spline.py +4 -11
  367. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  368. scipy/signal/tests/test_bsplines.py +114 -79
  369. scipy/signal/tests/test_cont2discrete.py +9 -2
  370. scipy/signal/tests/test_filter_design.py +721 -481
  371. scipy/signal/tests/test_fir_filter_design.py +332 -140
  372. scipy/signal/tests/test_savitzky_golay.py +4 -3
  373. scipy/signal/tests/test_short_time_fft.py +221 -3
  374. scipy/signal/tests/test_signaltools.py +2144 -1348
  375. scipy/signal/tests/test_spectral.py +50 -6
  376. scipy/signal/tests/test_splines.py +161 -96
  377. scipy/signal/tests/test_upfirdn.py +84 -50
  378. scipy/signal/tests/test_waveforms.py +20 -0
  379. scipy/signal/tests/test_windows.py +607 -466
  380. scipy/signal/windows/_windows.py +287 -148
  381. scipy/sparse/__init__.py +23 -4
  382. scipy/sparse/_base.py +270 -108
  383. scipy/sparse/_bsr.py +7 -4
  384. scipy/sparse/_compressed.py +59 -231
  385. scipy/sparse/_construct.py +90 -38
  386. scipy/sparse/_coo.py +115 -181
  387. scipy/sparse/_csc.py +4 -4
  388. scipy/sparse/_csparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  389. scipy/sparse/_csr.py +2 -2
  390. scipy/sparse/_data.py +48 -48
  391. scipy/sparse/_dia.py +105 -18
  392. scipy/sparse/_dok.py +0 -23
  393. scipy/sparse/_index.py +4 -4
  394. scipy/sparse/_matrix.py +23 -0
  395. scipy/sparse/_sparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  396. scipy/sparse/_sputils.py +37 -22
  397. scipy/sparse/base.py +0 -9
  398. scipy/sparse/bsr.py +0 -14
  399. scipy/sparse/compressed.py +0 -23
  400. scipy/sparse/construct.py +0 -6
  401. scipy/sparse/coo.py +0 -14
  402. scipy/sparse/csc.py +0 -3
  403. scipy/sparse/csgraph/_flow.cpython-313-aarch64-linux-musl.so +0 -0
  404. scipy/sparse/csgraph/_matching.cpython-313-aarch64-linux-musl.so +0 -0
  405. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-aarch64-linux-musl.so +0 -0
  406. scipy/sparse/csgraph/_reordering.cpython-313-aarch64-linux-musl.so +0 -0
  407. scipy/sparse/csgraph/_shortest_path.cpython-313-aarch64-linux-musl.so +0 -0
  408. scipy/sparse/csgraph/_tools.cpython-313-aarch64-linux-musl.so +0 -0
  409. scipy/sparse/csgraph/_traversal.cpython-313-aarch64-linux-musl.so +0 -0
  410. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  411. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  412. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  413. scipy/sparse/csr.py +0 -5
  414. scipy/sparse/data.py +1 -6
  415. scipy/sparse/dia.py +0 -7
  416. scipy/sparse/dok.py +0 -10
  417. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-aarch64-linux-musl.so +0 -0
  418. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  419. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  420. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-aarch64-linux-musl.so +0 -0
  421. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  422. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  423. scipy/sparse/linalg/_interface.py +17 -18
  424. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  425. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  426. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  427. scipy/sparse/linalg/_isolve/minres.py +5 -5
  428. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  429. scipy/sparse/linalg/_isolve/utils.py +2 -8
  430. scipy/sparse/linalg/_matfuncs.py +1 -1
  431. scipy/sparse/linalg/_norm.py +1 -1
  432. scipy/sparse/linalg/_propack/_cpropack.cpython-313-aarch64-linux-musl.so +0 -0
  433. scipy/sparse/linalg/_propack/_dpropack.cpython-313-aarch64-linux-musl.so +0 -0
  434. scipy/sparse/linalg/_propack/_spropack.cpython-313-aarch64-linux-musl.so +0 -0
  435. scipy/sparse/linalg/_propack/_zpropack.cpython-313-aarch64-linux-musl.so +0 -0
  436. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  437. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  438. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  439. scipy/sparse/tests/test_base.py +214 -42
  440. scipy/sparse/tests/test_common1d.py +7 -7
  441. scipy/sparse/tests/test_construct.py +1 -1
  442. scipy/sparse/tests/test_coo.py +272 -4
  443. scipy/sparse/tests/test_sparsetools.py +5 -0
  444. scipy/sparse/tests/test_sputils.py +36 -7
  445. scipy/spatial/_ckdtree.cpython-313-aarch64-linux-musl.so +0 -0
  446. scipy/spatial/_distance_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  447. scipy/spatial/_distance_wrap.cpython-313-aarch64-linux-musl.so +0 -0
  448. scipy/spatial/_hausdorff.cpython-313-aarch64-linux-musl.so +0 -0
  449. scipy/spatial/_qhull.cpython-313-aarch64-linux-musl.so +0 -0
  450. scipy/spatial/_voronoi.cpython-313-aarch64-linux-musl.so +0 -0
  451. scipy/spatial/distance.py +49 -42
  452. scipy/spatial/tests/test_distance.py +15 -1
  453. scipy/spatial/tests/test_kdtree.py +1 -0
  454. scipy/spatial/tests/test_qhull.py +7 -2
  455. scipy/spatial/transform/__init__.py +5 -3
  456. scipy/spatial/transform/_rigid_transform.cpython-313-aarch64-linux-musl.so +0 -0
  457. scipy/spatial/transform/_rotation.cpython-313-aarch64-linux-musl.so +0 -0
  458. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  459. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  460. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  461. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  462. scipy/special/__init__.py +1 -47
  463. scipy/special/_add_newdocs.py +34 -772
  464. scipy/special/_basic.py +22 -25
  465. scipy/special/_comb.cpython-313-aarch64-linux-musl.so +0 -0
  466. scipy/special/_ellip_harm_2.cpython-313-aarch64-linux-musl.so +0 -0
  467. scipy/special/_gufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  468. scipy/special/_logsumexp.py +67 -58
  469. scipy/special/_orthogonal.pyi +1 -1
  470. scipy/special/_specfun.cpython-313-aarch64-linux-musl.so +0 -0
  471. scipy/special/_special_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  472. scipy/special/_spherical_bessel.py +4 -4
  473. scipy/special/_support_alternative_backends.py +212 -119
  474. scipy/special/_test_internal.cpython-313-aarch64-linux-musl.so +0 -0
  475. scipy/special/_testutils.py +4 -4
  476. scipy/special/_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  477. scipy/special/_ufuncs.pyi +1 -0
  478. scipy/special/_ufuncs.pyx +215 -1400
  479. scipy/special/_ufuncs_cxx.cpython-313-aarch64-linux-musl.so +0 -0
  480. scipy/special/_ufuncs_cxx.pxd +2 -15
  481. scipy/special/_ufuncs_cxx.pyx +5 -44
  482. scipy/special/_ufuncs_cxx_defs.h +2 -16
  483. scipy/special/_ufuncs_defs.h +0 -8
  484. scipy/special/cython_special.cpython-313-aarch64-linux-musl.so +0 -0
  485. scipy/special/cython_special.pxd +1 -1
  486. scipy/special/tests/_cython_examples/meson.build +10 -1
  487. scipy/special/tests/test_basic.py +153 -20
  488. scipy/special/tests/test_boost_ufuncs.py +3 -0
  489. scipy/special/tests/test_cdflib.py +35 -11
  490. scipy/special/tests/test_gammainc.py +16 -0
  491. scipy/special/tests/test_hyp2f1.py +2 -2
  492. scipy/special/tests/test_log1mexp.py +85 -0
  493. scipy/special/tests/test_logsumexp.py +206 -64
  494. scipy/special/tests/test_mpmath.py +1 -0
  495. scipy/special/tests/test_nan_inputs.py +1 -1
  496. scipy/special/tests/test_orthogonal.py +17 -18
  497. scipy/special/tests/test_sf_error.py +3 -2
  498. scipy/special/tests/test_sph_harm.py +6 -7
  499. scipy/special/tests/test_support_alternative_backends.py +211 -76
  500. scipy/stats/__init__.py +4 -1
  501. scipy/stats/_ansari_swilk_statistics.cpython-313-aarch64-linux-musl.so +0 -0
  502. scipy/stats/_axis_nan_policy.py +5 -12
  503. scipy/stats/_biasedurn.cpython-313-aarch64-linux-musl.so +0 -0
  504. scipy/stats/_continued_fraction.py +387 -0
  505. scipy/stats/_continuous_distns.py +277 -310
  506. scipy/stats/_correlation.py +1 -1
  507. scipy/stats/_covariance.py +6 -3
  508. scipy/stats/_discrete_distns.py +39 -32
  509. scipy/stats/_distn_infrastructure.py +39 -12
  510. scipy/stats/_distribution_infrastructure.py +900 -238
  511. scipy/stats/_entropy.py +9 -10
  512. scipy/{_lib → stats}/_finite_differences.py +1 -1
  513. scipy/stats/_hypotests.py +83 -50
  514. scipy/stats/_kde.py +53 -49
  515. scipy/stats/_ksstats.py +1 -1
  516. scipy/stats/_levy_stable/__init__.py +7 -15
  517. scipy/stats/_levy_stable/levyst.cpython-313-aarch64-linux-musl.so +0 -0
  518. scipy/stats/_morestats.py +118 -73
  519. scipy/stats/_mstats_basic.py +13 -17
  520. scipy/stats/_mstats_extras.py +8 -8
  521. scipy/stats/_multivariate.py +89 -113
  522. scipy/stats/_new_distributions.py +97 -20
  523. scipy/stats/_page_trend_test.py +12 -5
  524. scipy/stats/_probability_distribution.py +265 -43
  525. scipy/stats/_qmc.py +14 -9
  526. scipy/stats/_qmc_cy.cpython-313-aarch64-linux-musl.so +0 -0
  527. scipy/stats/_qmvnt.py +16 -95
  528. scipy/stats/_qmvnt_cy.cpython-313-aarch64-linux-musl.so +0 -0
  529. scipy/stats/_quantile.py +335 -0
  530. scipy/stats/_rcont/rcont.cpython-313-aarch64-linux-musl.so +0 -0
  531. scipy/stats/_resampling.py +4 -29
  532. scipy/stats/_sampling.py +1 -1
  533. scipy/stats/_sobol.cpython-313-aarch64-linux-musl.so +0 -0
  534. scipy/stats/_stats.cpython-313-aarch64-linux-musl.so +0 -0
  535. scipy/stats/_stats_mstats_common.py +21 -2
  536. scipy/stats/_stats_py.py +550 -476
  537. scipy/stats/_stats_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  538. scipy/stats/_unuran/unuran_wrapper.cpython-313-aarch64-linux-musl.so +0 -0
  539. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  540. scipy/stats/_variation.py +6 -8
  541. scipy/stats/_wilcoxon.py +13 -7
  542. scipy/stats/tests/common_tests.py +6 -4
  543. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  544. scipy/stats/tests/test_continued_fraction.py +173 -0
  545. scipy/stats/tests/test_continuous.py +379 -60
  546. scipy/stats/tests/test_continuous_basic.py +18 -12
  547. scipy/stats/tests/test_discrete_basic.py +14 -8
  548. scipy/stats/tests/test_discrete_distns.py +16 -16
  549. scipy/stats/tests/test_distributions.py +95 -75
  550. scipy/stats/tests/test_entropy.py +40 -48
  551. scipy/stats/tests/test_fit.py +4 -3
  552. scipy/stats/tests/test_hypotests.py +153 -24
  553. scipy/stats/tests/test_kdeoth.py +109 -41
  554. scipy/stats/tests/test_marray.py +289 -0
  555. scipy/stats/tests/test_morestats.py +79 -47
  556. scipy/stats/tests/test_mstats_basic.py +3 -3
  557. scipy/stats/tests/test_multivariate.py +434 -83
  558. scipy/stats/tests/test_qmc.py +13 -10
  559. scipy/stats/tests/test_quantile.py +199 -0
  560. scipy/stats/tests/test_rank.py +119 -112
  561. scipy/stats/tests/test_resampling.py +47 -56
  562. scipy/stats/tests/test_sampling.py +9 -4
  563. scipy/stats/tests/test_stats.py +799 -939
  564. scipy/stats/tests/test_variation.py +8 -6
  565. scipy/version.py +2 -2
  566. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  567. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  568. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +1262 -1269
  569. scipy.libs/libgcc_s-69c45f16.so.1 +0 -0
  570. scipy.libs/libgfortran-db0b6589.so.5.0.0 +0 -0
  571. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-1f1a71be.so.6.0.33} +0 -0
  572. scipy/_lib/array_api_extra/_funcs.py +0 -484
  573. scipy/_lib/array_api_extra/_typing.py +0 -8
  574. scipy/interpolate/_bspl.cpython-313-aarch64-linux-musl.so +0 -0
  575. scipy/optimize/_cobyla.cpython-313-aarch64-linux-musl.so +0 -0
  576. scipy/optimize/_cython_nnls.cpython-313-aarch64-linux-musl.so +0 -0
  577. scipy/optimize/_slsqp.cpython-313-aarch64-linux-musl.so +0 -0
  578. scipy/spatial/qhull_src/COPYING.txt +0 -38
  579. scipy/special/libsf_error_state.so +0 -0
  580. scipy/special/tests/test_log_softmax.py +0 -109
  581. scipy/special/tests/test_xsf_cuda.py +0 -114
  582. scipy/special/xsf/binom.h +0 -89
  583. scipy/special/xsf/cdflib.h +0 -100
  584. scipy/special/xsf/cephes/airy.h +0 -307
  585. scipy/special/xsf/cephes/besselpoly.h +0 -51
  586. scipy/special/xsf/cephes/beta.h +0 -257
  587. scipy/special/xsf/cephes/cbrt.h +0 -131
  588. scipy/special/xsf/cephes/chbevl.h +0 -85
  589. scipy/special/xsf/cephes/chdtr.h +0 -193
  590. scipy/special/xsf/cephes/const.h +0 -87
  591. scipy/special/xsf/cephes/ellie.h +0 -293
  592. scipy/special/xsf/cephes/ellik.h +0 -251
  593. scipy/special/xsf/cephes/ellpe.h +0 -107
  594. scipy/special/xsf/cephes/ellpk.h +0 -117
  595. scipy/special/xsf/cephes/expn.h +0 -260
  596. scipy/special/xsf/cephes/gamma.h +0 -398
  597. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  598. scipy/special/xsf/cephes/hyperg.h +0 -361
  599. scipy/special/xsf/cephes/i0.h +0 -149
  600. scipy/special/xsf/cephes/i1.h +0 -158
  601. scipy/special/xsf/cephes/igam.h +0 -421
  602. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  603. scipy/special/xsf/cephes/igami.h +0 -313
  604. scipy/special/xsf/cephes/j0.h +0 -225
  605. scipy/special/xsf/cephes/j1.h +0 -198
  606. scipy/special/xsf/cephes/jv.h +0 -715
  607. scipy/special/xsf/cephes/k0.h +0 -164
  608. scipy/special/xsf/cephes/k1.h +0 -163
  609. scipy/special/xsf/cephes/kn.h +0 -243
  610. scipy/special/xsf/cephes/lanczos.h +0 -112
  611. scipy/special/xsf/cephes/ndtr.h +0 -275
  612. scipy/special/xsf/cephes/poch.h +0 -85
  613. scipy/special/xsf/cephes/polevl.h +0 -167
  614. scipy/special/xsf/cephes/psi.h +0 -194
  615. scipy/special/xsf/cephes/rgamma.h +0 -111
  616. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  617. scipy/special/xsf/cephes/shichi.h +0 -248
  618. scipy/special/xsf/cephes/sici.h +0 -224
  619. scipy/special/xsf/cephes/sindg.h +0 -221
  620. scipy/special/xsf/cephes/tandg.h +0 -139
  621. scipy/special/xsf/cephes/trig.h +0 -58
  622. scipy/special/xsf/cephes/unity.h +0 -186
  623. scipy/special/xsf/cephes/zeta.h +0 -172
  624. scipy/special/xsf/config.h +0 -304
  625. scipy/special/xsf/digamma.h +0 -205
  626. scipy/special/xsf/error.h +0 -57
  627. scipy/special/xsf/evalpoly.h +0 -47
  628. scipy/special/xsf/expint.h +0 -266
  629. scipy/special/xsf/hyp2f1.h +0 -694
  630. scipy/special/xsf/iv_ratio.h +0 -173
  631. scipy/special/xsf/lambertw.h +0 -150
  632. scipy/special/xsf/loggamma.h +0 -163
  633. scipy/special/xsf/sici.h +0 -200
  634. scipy/special/xsf/tools.h +0 -427
  635. scipy/special/xsf/trig.h +0 -164
  636. scipy/special/xsf/wright_bessel.h +0 -843
  637. scipy/special/xsf/zlog1.h +0 -35
  638. scipy/stats/_mvn.cpython-313-aarch64-linux-musl.so +0 -0
  639. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  640. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  641. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -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