scipy 1.15.3__cp311-cp311-musllinux_1_2_aarch64.whl → 1.16.0rc1__cp311-cp311-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 (640) hide show
  1. scipy/__config__.py +9 -9
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-311-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-311-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-311-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-311-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-311-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-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_lsoda.cpython-311-aarch64-linux-musl.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-311-aarch64-linux-musl.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-311-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-311-aarch64-linux-musl.so +0 -0
  139. scipy/integrate/_test_odeint_banded.cpython-311-aarch64-linux-musl.so +0 -0
  140. scipy/integrate/_vode.cpython-311-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-311-aarch64-linux-musl.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-311-aarch64-linux-musl.so +0 -0
  152. scipy/interpolate/_fitpack.cpython-311-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-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rgi.py +31 -26
  166. scipy/interpolate/_rgi_cython.cpython-311-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-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  187. scipy/io/matlab/_mio_utils.cpython-311-aarch64-linux-musl.so +0 -0
  188. scipy/io/matlab/_miobase.py +4 -1
  189. scipy/io/matlab/_streams.cpython-311-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-311-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-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  210. scipy/linalg/_expm_frechet.py +4 -0
  211. scipy/linalg/_fblas.cpython-311-aarch64-linux-musl.so +0 -0
  212. scipy/linalg/_flapack.cpython-311-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_linalg_pythran.cpython-311-aarch64-linux-musl.so +0 -0
  214. scipy/linalg/_matfuncs.py +187 -4
  215. scipy/linalg/_matfuncs_expm.cpython-311-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_matfuncs_schur_sqrtm.cpython-311-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  218. scipy/linalg/_matfuncs_sqrtm_triu.cpython-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  225. scipy/linalg/cython_lapack.cpython-311-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-311-aarch64-linux-musl.so +0 -0
  241. scipy/ndimage/_cytest.cpython-311-aarch64-linux-musl.so +0 -0
  242. scipy/ndimage/_delegators.py +8 -2
  243. scipy/ndimage/_filters.py +433 -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-311-aarch64-linux-musl.so +0 -0
  248. scipy/ndimage/_ni_docstrings.py +5 -1
  249. scipy/ndimage/_ni_label.cpython-311-aarch64-linux-musl.so +0 -0
  250. scipy/ndimage/_ni_support.py +1 -5
  251. scipy/ndimage/_rank_filter_1d.cpython-311-aarch64-linux-musl.so +0 -0
  252. scipy/ndimage/_support_alternative_backends.py +18 -6
  253. scipy/ndimage/tests/test_filters.py +337 -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-311-aarch64-linux-musl.so +0 -0
  260. scipy/optimize/_basinhopping.py +13 -7
  261. scipy/optimize/_bglu_dense.cpython-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  272. scipy/optimize/_highspy/_core.cpython-311-aarch64-linux-musl.so +0 -0
  273. scipy/optimize/_highspy/_highs_options.cpython-311-aarch64-linux-musl.so +0 -0
  274. scipy/optimize/_lbfgsb.cpython-311-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-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  290. scipy/optimize/_minpack_py.py +21 -14
  291. scipy/optimize/_moduleTNC.cpython-311-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-311-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-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  317. scipy/optimize/_zeros_py.py +97 -17
  318. scipy/optimize/cython_optimize/_zeros.cpython-311-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 +5 -5
  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-311-aarch64-linux-musl.so +0 -0
  350. scipy/signal/_peak_finding_utils.cpython-311-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-311-aarch64-linux-musl.so +0 -0
  356. scipy/signal/_sosfilt.cpython-311-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_spectral_py.py +221 -50
  358. scipy/signal/_spline.cpython-311-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-311-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 +19 -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-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  404. scipy/sparse/csgraph/_matching.cpython-311-aarch64-linux-musl.so +0 -0
  405. scipy/sparse/csgraph/_min_spanning_tree.cpython-311-aarch64-linux-musl.so +0 -0
  406. scipy/sparse/csgraph/_reordering.cpython-311-aarch64-linux-musl.so +0 -0
  407. scipy/sparse/csgraph/_shortest_path.cpython-311-aarch64-linux-musl.so +0 -0
  408. scipy/sparse/csgraph/_tools.cpython-311-aarch64-linux-musl.so +0 -0
  409. scipy/sparse/csgraph/_traversal.cpython-311-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-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  433. scipy/sparse/linalg/_propack/_dpropack.cpython-311-aarch64-linux-musl.so +0 -0
  434. scipy/sparse/linalg/_propack/_spropack.cpython-311-aarch64-linux-musl.so +0 -0
  435. scipy/sparse/linalg/_propack/_zpropack.cpython-311-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 +207 -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-311-aarch64-linux-musl.so +0 -0
  446. scipy/spatial/_distance_pybind.cpython-311-aarch64-linux-musl.so +0 -0
  447. scipy/spatial/_distance_wrap.cpython-311-aarch64-linux-musl.so +0 -0
  448. scipy/spatial/_hausdorff.cpython-311-aarch64-linux-musl.so +0 -0
  449. scipy/spatial/_qhull.cpython-311-aarch64-linux-musl.so +0 -0
  450. scipy/spatial/_voronoi.cpython-311-aarch64-linux-musl.so +0 -0
  451. scipy/spatial/distance.py +49 -42
  452. scipy/spatial/tests/test_distance.py +3 -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-311-aarch64-linux-musl.so +0 -0
  457. scipy/spatial/transform/_rotation.cpython-311-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-311-aarch64-linux-musl.so +0 -0
  466. scipy/special/_ellip_harm_2.cpython-311-aarch64-linux-musl.so +0 -0
  467. scipy/special/_gufuncs.cpython-311-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-311-aarch64-linux-musl.so +0 -0
  471. scipy/special/_special_ufuncs.cpython-311-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-311-aarch64-linux-musl.so +0 -0
  475. scipy/special/_testutils.py +4 -4
  476. scipy/special/_ufuncs.cpython-311-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-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  502. scipy/stats/_axis_nan_policy.py +4 -3
  503. scipy/stats/_biasedurn.cpython-311-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/_covariance.py +6 -3
  507. scipy/stats/_discrete_distns.py +39 -32
  508. scipy/stats/_distn_infrastructure.py +39 -12
  509. scipy/stats/_distribution_infrastructure.py +900 -238
  510. scipy/stats/_entropy.py +7 -8
  511. scipy/{_lib → stats}/_finite_differences.py +1 -1
  512. scipy/stats/_hypotests.py +82 -49
  513. scipy/stats/_kde.py +53 -49
  514. scipy/stats/_ksstats.py +1 -1
  515. scipy/stats/_levy_stable/__init__.py +7 -15
  516. scipy/stats/_levy_stable/levyst.cpython-311-aarch64-linux-musl.so +0 -0
  517. scipy/stats/_morestats.py +112 -67
  518. scipy/stats/_mstats_basic.py +13 -17
  519. scipy/stats/_mstats_extras.py +8 -8
  520. scipy/stats/_multivariate.py +89 -113
  521. scipy/stats/_new_distributions.py +97 -20
  522. scipy/stats/_page_trend_test.py +12 -5
  523. scipy/stats/_probability_distribution.py +265 -43
  524. scipy/stats/_qmc.py +14 -9
  525. scipy/stats/_qmc_cy.cpython-311-aarch64-linux-musl.so +0 -0
  526. scipy/stats/_qmvnt.py +16 -95
  527. scipy/stats/_qmvnt_cy.cpython-311-aarch64-linux-musl.so +0 -0
  528. scipy/stats/_quantile.py +335 -0
  529. scipy/stats/_rcont/rcont.cpython-311-aarch64-linux-musl.so +0 -0
  530. scipy/stats/_resampling.py +4 -29
  531. scipy/stats/_sampling.py +1 -1
  532. scipy/stats/_sobol.cpython-311-aarch64-linux-musl.so +0 -0
  533. scipy/stats/_stats.cpython-311-aarch64-linux-musl.so +0 -0
  534. scipy/stats/_stats_mstats_common.py +19 -2
  535. scipy/stats/_stats_py.py +534 -460
  536. scipy/stats/_stats_pythran.cpython-311-aarch64-linux-musl.so +0 -0
  537. scipy/stats/_unuran/unuran_wrapper.cpython-311-aarch64-linux-musl.so +0 -0
  538. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  539. scipy/stats/_variation.py +5 -7
  540. scipy/stats/_wilcoxon.py +13 -7
  541. scipy/stats/tests/common_tests.py +6 -4
  542. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  543. scipy/stats/tests/test_continued_fraction.py +173 -0
  544. scipy/stats/tests/test_continuous.py +379 -60
  545. scipy/stats/tests/test_continuous_basic.py +18 -12
  546. scipy/stats/tests/test_discrete_basic.py +14 -8
  547. scipy/stats/tests/test_discrete_distns.py +16 -16
  548. scipy/stats/tests/test_distributions.py +95 -75
  549. scipy/stats/tests/test_entropy.py +40 -48
  550. scipy/stats/tests/test_fit.py +4 -3
  551. scipy/stats/tests/test_hypotests.py +153 -24
  552. scipy/stats/tests/test_kdeoth.py +109 -41
  553. scipy/stats/tests/test_marray.py +289 -0
  554. scipy/stats/tests/test_morestats.py +79 -47
  555. scipy/stats/tests/test_mstats_basic.py +3 -3
  556. scipy/stats/tests/test_multivariate.py +434 -83
  557. scipy/stats/tests/test_qmc.py +13 -10
  558. scipy/stats/tests/test_quantile.py +199 -0
  559. scipy/stats/tests/test_rank.py +119 -112
  560. scipy/stats/tests/test_resampling.py +47 -56
  561. scipy/stats/tests/test_sampling.py +9 -4
  562. scipy/stats/tests/test_stats.py +799 -939
  563. scipy/stats/tests/test_variation.py +8 -6
  564. scipy/version.py +2 -2
  565. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/LICENSE.txt +1 -1
  566. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/METADATA +8 -8
  567. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/RECORD +1262 -1269
  568. scipy.libs/libgcc_s-69c45f16.so.1 +0 -0
  569. scipy.libs/libgfortran-db0b6589.so.5.0.0 +0 -0
  570. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-1f1a71be.so.6.0.33} +0 -0
  571. scipy/_lib/array_api_extra/_funcs.py +0 -484
  572. scipy/_lib/array_api_extra/_typing.py +0 -8
  573. scipy/interpolate/_bspl.cpython-311-aarch64-linux-musl.so +0 -0
  574. scipy/optimize/_cobyla.cpython-311-aarch64-linux-musl.so +0 -0
  575. scipy/optimize/_cython_nnls.cpython-311-aarch64-linux-musl.so +0 -0
  576. scipy/optimize/_slsqp.cpython-311-aarch64-linux-musl.so +0 -0
  577. scipy/spatial/qhull_src/COPYING.txt +0 -38
  578. scipy/special/libsf_error_state.so +0 -0
  579. scipy/special/tests/test_log_softmax.py +0 -109
  580. scipy/special/tests/test_xsf_cuda.py +0 -114
  581. scipy/special/xsf/binom.h +0 -89
  582. scipy/special/xsf/cdflib.h +0 -100
  583. scipy/special/xsf/cephes/airy.h +0 -307
  584. scipy/special/xsf/cephes/besselpoly.h +0 -51
  585. scipy/special/xsf/cephes/beta.h +0 -257
  586. scipy/special/xsf/cephes/cbrt.h +0 -131
  587. scipy/special/xsf/cephes/chbevl.h +0 -85
  588. scipy/special/xsf/cephes/chdtr.h +0 -193
  589. scipy/special/xsf/cephes/const.h +0 -87
  590. scipy/special/xsf/cephes/ellie.h +0 -293
  591. scipy/special/xsf/cephes/ellik.h +0 -251
  592. scipy/special/xsf/cephes/ellpe.h +0 -107
  593. scipy/special/xsf/cephes/ellpk.h +0 -117
  594. scipy/special/xsf/cephes/expn.h +0 -260
  595. scipy/special/xsf/cephes/gamma.h +0 -398
  596. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  597. scipy/special/xsf/cephes/hyperg.h +0 -361
  598. scipy/special/xsf/cephes/i0.h +0 -149
  599. scipy/special/xsf/cephes/i1.h +0 -158
  600. scipy/special/xsf/cephes/igam.h +0 -421
  601. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  602. scipy/special/xsf/cephes/igami.h +0 -313
  603. scipy/special/xsf/cephes/j0.h +0 -225
  604. scipy/special/xsf/cephes/j1.h +0 -198
  605. scipy/special/xsf/cephes/jv.h +0 -715
  606. scipy/special/xsf/cephes/k0.h +0 -164
  607. scipy/special/xsf/cephes/k1.h +0 -163
  608. scipy/special/xsf/cephes/kn.h +0 -243
  609. scipy/special/xsf/cephes/lanczos.h +0 -112
  610. scipy/special/xsf/cephes/ndtr.h +0 -275
  611. scipy/special/xsf/cephes/poch.h +0 -85
  612. scipy/special/xsf/cephes/polevl.h +0 -167
  613. scipy/special/xsf/cephes/psi.h +0 -194
  614. scipy/special/xsf/cephes/rgamma.h +0 -111
  615. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  616. scipy/special/xsf/cephes/shichi.h +0 -248
  617. scipy/special/xsf/cephes/sici.h +0 -224
  618. scipy/special/xsf/cephes/sindg.h +0 -221
  619. scipy/special/xsf/cephes/tandg.h +0 -139
  620. scipy/special/xsf/cephes/trig.h +0 -58
  621. scipy/special/xsf/cephes/unity.h +0 -186
  622. scipy/special/xsf/cephes/zeta.h +0 -172
  623. scipy/special/xsf/config.h +0 -304
  624. scipy/special/xsf/digamma.h +0 -205
  625. scipy/special/xsf/error.h +0 -57
  626. scipy/special/xsf/evalpoly.h +0 -47
  627. scipy/special/xsf/expint.h +0 -266
  628. scipy/special/xsf/hyp2f1.h +0 -694
  629. scipy/special/xsf/iv_ratio.h +0 -173
  630. scipy/special/xsf/lambertw.h +0 -150
  631. scipy/special/xsf/loggamma.h +0 -163
  632. scipy/special/xsf/sici.h +0 -200
  633. scipy/special/xsf/tools.h +0 -427
  634. scipy/special/xsf/trig.h +0 -164
  635. scipy/special/xsf/wright_bessel.h +0 -843
  636. scipy/special/xsf/zlog1.h +0 -35
  637. scipy/stats/_mvn.cpython-311-aarch64-linux-musl.so +0 -0
  638. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  639. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  640. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.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