scipy 1.15.3__cp312-cp312-macosx_12_0_arm64.whl → 1.16.0rc2__cp312-cp312-macosx_12_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. scipy/.dylibs/libscipy_openblas.dylib +0 -0
  2. scipy/__config__.py +8 -8
  3. scipy/__init__.py +3 -6
  4. scipy/_cyutility.cpython-312-darwin.so +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cpython-312-darwin.so +0 -0
  9. scipy/_lib/_docscrape.py +1 -1
  10. scipy/_lib/_elementwise_iterative_method.py +15 -26
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_deprecation_call.cpython-312-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_def.cpython-312-darwin.so +0 -0
  14. scipy/_lib/_testutils.py +6 -2
  15. scipy/_lib/_util.py +222 -125
  16. scipy/_lib/array_api_compat/__init__.py +4 -4
  17. scipy/_lib/array_api_compat/_internal.py +19 -6
  18. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  19. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  20. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  21. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  22. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  23. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  24. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  25. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  26. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  27. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  28. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  29. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  30. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  31. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  32. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  33. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  34. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  35. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  36. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  37. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  38. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  39. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  40. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  41. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  42. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  43. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  44. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  45. scipy/_lib/array_api_extra/__init__.py +26 -3
  46. scipy/_lib/array_api_extra/_delegation.py +171 -0
  47. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  48. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  49. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  50. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  51. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  52. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  59. scipy/_lib/array_api_extra/testing.py +359 -0
  60. scipy/_lib/decorator.py +2 -2
  61. scipy/_lib/doccer.py +1 -7
  62. scipy/_lib/messagestream.cpython-312-darwin.so +0 -0
  63. scipy/_lib/pyprima/__init__.py +212 -0
  64. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  65. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  66. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  67. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  68. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  69. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  70. scipy/_lib/pyprima/cobyla/update.py +289 -0
  71. scipy/_lib/pyprima/common/__init__.py +0 -0
  72. scipy/_lib/pyprima/common/_bounds.py +34 -0
  73. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  74. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  75. scipy/_lib/pyprima/common/_project.py +173 -0
  76. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  77. scipy/_lib/pyprima/common/consts.py +47 -0
  78. scipy/_lib/pyprima/common/evaluate.py +99 -0
  79. scipy/_lib/pyprima/common/history.py +38 -0
  80. scipy/_lib/pyprima/common/infos.py +30 -0
  81. scipy/_lib/pyprima/common/linalg.py +435 -0
  82. scipy/_lib/pyprima/common/message.py +290 -0
  83. scipy/_lib/pyprima/common/powalg.py +131 -0
  84. scipy/_lib/pyprima/common/preproc.py +277 -0
  85. scipy/_lib/pyprima/common/present.py +5 -0
  86. scipy/_lib/pyprima/common/ratio.py +54 -0
  87. scipy/_lib/pyprima/common/redrho.py +47 -0
  88. scipy/_lib/pyprima/common/selectx.py +296 -0
  89. scipy/_lib/tests/test__util.py +105 -121
  90. scipy/_lib/tests/test_array_api.py +166 -35
  91. scipy/_lib/tests/test_bunch.py +7 -0
  92. scipy/_lib/tests/test_ccallback.py +2 -10
  93. scipy/_lib/tests/test_public_api.py +13 -0
  94. scipy/cluster/_hierarchy.cpython-312-darwin.so +0 -0
  95. scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
  96. scipy/cluster/_vq.cpython-312-darwin.so +0 -0
  97. scipy/cluster/hierarchy.py +393 -223
  98. scipy/cluster/tests/test_hierarchy.py +273 -335
  99. scipy/cluster/tests/test_vq.py +45 -61
  100. scipy/cluster/vq.py +39 -35
  101. scipy/conftest.py +263 -157
  102. scipy/constants/_constants.py +4 -1
  103. scipy/constants/tests/test_codata.py +2 -2
  104. scipy/constants/tests/test_constants.py +11 -18
  105. scipy/datasets/_download_all.py +15 -1
  106. scipy/datasets/_fetchers.py +7 -1
  107. scipy/datasets/_utils.py +1 -1
  108. scipy/differentiate/_differentiate.py +25 -25
  109. scipy/differentiate/tests/test_differentiate.py +24 -25
  110. scipy/fft/_basic.py +20 -0
  111. scipy/fft/_helper.py +3 -34
  112. scipy/fft/_pocketfft/helper.py +29 -1
  113. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  114. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  115. scipy/fft/_realtransforms.py +13 -0
  116. scipy/fft/tests/test_basic.py +27 -25
  117. scipy/fft/tests/test_fftlog.py +16 -7
  118. scipy/fft/tests/test_helper.py +18 -34
  119. scipy/fft/tests/test_real_transforms.py +8 -10
  120. scipy/fftpack/convolve.cpython-312-darwin.so +0 -0
  121. scipy/fftpack/tests/test_basic.py +2 -4
  122. scipy/fftpack/tests/test_real_transforms.py +8 -9
  123. scipy/integrate/_bvp.py +9 -3
  124. scipy/integrate/_cubature.py +3 -2
  125. scipy/integrate/_dop.cpython-312-darwin.so +0 -0
  126. scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
  127. scipy/integrate/_ode.py +9 -2
  128. scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
  129. scipy/integrate/_quad_vec.py +21 -29
  130. scipy/integrate/_quadpack.cpython-312-darwin.so +0 -0
  131. scipy/integrate/_quadpack_py.py +11 -7
  132. scipy/integrate/_quadrature.py +3 -3
  133. scipy/integrate/_rules/_base.py +2 -2
  134. scipy/integrate/_tanhsinh.py +48 -47
  135. scipy/integrate/_test_odeint_banded.cpython-312-darwin.so +0 -0
  136. scipy/integrate/_vode.cpython-312-darwin.so +0 -0
  137. scipy/integrate/tests/test__quad_vec.py +0 -6
  138. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  139. scipy/integrate/tests/test_cubature.py +21 -35
  140. scipy/integrate/tests/test_quadrature.py +6 -8
  141. scipy/integrate/tests/test_tanhsinh.py +56 -48
  142. scipy/interpolate/__init__.py +70 -58
  143. scipy/interpolate/_bary_rational.py +22 -22
  144. scipy/interpolate/_bsplines.py +119 -66
  145. scipy/interpolate/_cubic.py +65 -50
  146. scipy/interpolate/_dfitpack.cpython-312-darwin.so +0 -0
  147. scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
  148. scipy/interpolate/_fitpack.cpython-312-darwin.so +0 -0
  149. scipy/interpolate/_fitpack2.py +9 -6
  150. scipy/interpolate/_fitpack_impl.py +32 -26
  151. scipy/interpolate/_fitpack_repro.py +23 -19
  152. scipy/interpolate/_interpnd.cpython-312-darwin.so +0 -0
  153. scipy/interpolate/_interpolate.py +30 -12
  154. scipy/interpolate/_ndbspline.py +13 -18
  155. scipy/interpolate/_ndgriddata.py +5 -8
  156. scipy/interpolate/_polyint.py +95 -31
  157. scipy/interpolate/_ppoly.cpython-312-darwin.so +0 -0
  158. scipy/interpolate/_rbf.py +2 -2
  159. scipy/interpolate/_rbfinterp.py +1 -1
  160. scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
  161. scipy/interpolate/_rgi.py +31 -26
  162. scipy/interpolate/_rgi_cython.cpython-312-darwin.so +0 -0
  163. scipy/interpolate/dfitpack.py +0 -20
  164. scipy/interpolate/interpnd.py +1 -2
  165. scipy/interpolate/tests/test_bary_rational.py +2 -2
  166. scipy/interpolate/tests/test_bsplines.py +97 -1
  167. scipy/interpolate/tests/test_fitpack2.py +39 -1
  168. scipy/interpolate/tests/test_interpnd.py +32 -20
  169. scipy/interpolate/tests/test_interpolate.py +48 -4
  170. scipy/interpolate/tests/test_rgi.py +2 -1
  171. scipy/io/_fast_matrix_market/__init__.py +2 -0
  172. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  173. scipy/io/_harwell_boeing/hb.py +7 -11
  174. scipy/io/_idl.py +5 -7
  175. scipy/io/_netcdf.py +15 -5
  176. scipy/io/_test_fortran.cpython-312-darwin.so +0 -0
  177. scipy/io/arff/tests/test_arffread.py +3 -3
  178. scipy/io/matlab/__init__.py +5 -3
  179. scipy/io/matlab/_mio.py +4 -1
  180. scipy/io/matlab/_mio5.py +19 -13
  181. scipy/io/matlab/_mio5_utils.cpython-312-darwin.so +0 -0
  182. scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
  183. scipy/io/matlab/_miobase.py +4 -1
  184. scipy/io/matlab/_streams.cpython-312-darwin.so +0 -0
  185. scipy/io/matlab/tests/test_mio.py +46 -18
  186. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  187. scipy/io/tests/test_mmio.py +7 -1
  188. scipy/io/tests/test_wavfile.py +41 -0
  189. scipy/io/wavfile.py +57 -10
  190. scipy/linalg/_basic.py +113 -86
  191. scipy/linalg/_cythonized_array_utils.cpython-312-darwin.so +0 -0
  192. scipy/linalg/_decomp.py +22 -9
  193. scipy/linalg/_decomp_cholesky.py +28 -13
  194. scipy/linalg/_decomp_cossin.py +45 -30
  195. scipy/linalg/_decomp_interpolative.cpython-312-darwin.so +0 -0
  196. scipy/linalg/_decomp_ldl.py +4 -1
  197. scipy/linalg/_decomp_lu.py +18 -6
  198. scipy/linalg/_decomp_lu_cython.cpython-312-darwin.so +0 -0
  199. scipy/linalg/_decomp_polar.py +2 -0
  200. scipy/linalg/_decomp_qr.py +6 -2
  201. scipy/linalg/_decomp_qz.py +3 -0
  202. scipy/linalg/_decomp_schur.py +3 -1
  203. scipy/linalg/_decomp_svd.py +13 -2
  204. scipy/linalg/_decomp_update.cpython-312-darwin.so +0 -0
  205. scipy/linalg/_expm_frechet.py +4 -0
  206. scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
  207. scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
  208. scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
  209. scipy/linalg/_matfuncs.py +187 -4
  210. scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
  211. scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
  212. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  213. scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
  214. scipy/linalg/_procrustes.py +2 -0
  215. scipy/linalg/_sketches.py +17 -6
  216. scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
  217. scipy/linalg/_solvers.py +7 -2
  218. scipy/linalg/_special_matrices.py +26 -36
  219. scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
  220. scipy/linalg/cython_lapack.cpython-312-darwin.so +0 -0
  221. scipy/linalg/lapack.py +22 -2
  222. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  223. scipy/linalg/tests/test_basic.py +31 -16
  224. scipy/linalg/tests/test_batch.py +588 -0
  225. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  226. scipy/linalg/tests/test_decomp.py +40 -3
  227. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  228. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  229. scipy/linalg/tests/test_lapack.py +115 -7
  230. scipy/linalg/tests/test_matfuncs.py +157 -102
  231. scipy/linalg/tests/test_procrustes.py +0 -7
  232. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  233. scipy/linalg/tests/test_special_matrices.py +1 -5
  234. scipy/ndimage/__init__.py +1 -0
  235. scipy/ndimage/_cytest.cpython-312-darwin.so +0 -0
  236. scipy/ndimage/_delegators.py +8 -2
  237. scipy/ndimage/_filters.py +453 -5
  238. scipy/ndimage/_interpolation.py +36 -6
  239. scipy/ndimage/_measurements.py +4 -2
  240. scipy/ndimage/_morphology.py +5 -0
  241. scipy/ndimage/_nd_image.cpython-312-darwin.so +0 -0
  242. scipy/ndimage/_ni_docstrings.py +5 -1
  243. scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
  244. scipy/ndimage/_ni_support.py +1 -5
  245. scipy/ndimage/_rank_filter_1d.cpython-312-darwin.so +0 -0
  246. scipy/ndimage/_support_alternative_backends.py +18 -6
  247. scipy/ndimage/tests/test_filters.py +370 -259
  248. scipy/ndimage/tests/test_fourier.py +7 -9
  249. scipy/ndimage/tests/test_interpolation.py +68 -61
  250. scipy/ndimage/tests/test_measurements.py +18 -35
  251. scipy/ndimage/tests/test_morphology.py +143 -131
  252. scipy/ndimage/tests/test_splines.py +1 -3
  253. scipy/odr/__odrpack.cpython-312-darwin.so +0 -0
  254. scipy/optimize/_basinhopping.py +13 -7
  255. scipy/optimize/_bglu_dense.cpython-312-darwin.so +0 -0
  256. scipy/optimize/_bracket.py +17 -24
  257. scipy/optimize/_chandrupatla.py +9 -10
  258. scipy/optimize/_cobyla_py.py +104 -123
  259. scipy/optimize/_constraints.py +14 -10
  260. scipy/optimize/_differentiable_functions.py +371 -230
  261. scipy/optimize/_differentialevolution.py +4 -3
  262. scipy/optimize/_direct.cpython-312-darwin.so +0 -0
  263. scipy/optimize/_dual_annealing.py +1 -1
  264. scipy/optimize/_elementwise.py +1 -4
  265. scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
  266. scipy/optimize/_lbfgsb.cpython-312-darwin.so +0 -0
  267. scipy/optimize/_lbfgsb_py.py +57 -16
  268. scipy/optimize/_linprog_doc.py +2 -2
  269. scipy/optimize/_linprog_highs.py +2 -2
  270. scipy/optimize/_linprog_ip.py +25 -10
  271. scipy/optimize/_linprog_util.py +14 -16
  272. scipy/optimize/_lsap.cpython-312-darwin.so +0 -0
  273. scipy/optimize/_lsq/common.py +3 -3
  274. scipy/optimize/_lsq/dogbox.py +16 -2
  275. scipy/optimize/_lsq/givens_elimination.cpython-312-darwin.so +0 -0
  276. scipy/optimize/_lsq/least_squares.py +198 -126
  277. scipy/optimize/_lsq/lsq_linear.py +6 -6
  278. scipy/optimize/_lsq/trf.py +35 -8
  279. scipy/optimize/_milp.py +3 -1
  280. scipy/optimize/_minimize.py +105 -36
  281. scipy/optimize/_minpack.cpython-312-darwin.so +0 -0
  282. scipy/optimize/_minpack_py.py +21 -14
  283. scipy/optimize/_moduleTNC.cpython-312-darwin.so +0 -0
  284. scipy/optimize/_nnls.py +20 -21
  285. scipy/optimize/_nonlin.py +34 -3
  286. scipy/optimize/_numdiff.py +288 -110
  287. scipy/optimize/_optimize.py +86 -48
  288. scipy/optimize/_pava_pybind.cpython-312-darwin.so +0 -0
  289. scipy/optimize/_remove_redundancy.py +5 -5
  290. scipy/optimize/_root_scalar.py +1 -1
  291. scipy/optimize/_shgo.py +6 -0
  292. scipy/optimize/_shgo_lib/_complex.py +1 -1
  293. scipy/optimize/_slsqp_py.py +216 -124
  294. scipy/optimize/_slsqplib.cpython-312-darwin.so +0 -0
  295. scipy/optimize/_spectral.py +1 -1
  296. scipy/optimize/_tnc.py +8 -1
  297. scipy/optimize/_trlib/_trlib.cpython-312-darwin.so +0 -0
  298. scipy/optimize/_trustregion.py +20 -6
  299. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  300. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  301. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  302. scipy/optimize/_trustregion_constr/projections.py +12 -8
  303. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  304. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  305. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  306. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  307. scipy/optimize/_trustregion_exact.py +0 -1
  308. scipy/optimize/_zeros.cpython-312-darwin.so +0 -0
  309. scipy/optimize/_zeros_py.py +97 -17
  310. scipy/optimize/cython_optimize/_zeros.cpython-312-darwin.so +0 -0
  311. scipy/optimize/slsqp.py +0 -1
  312. scipy/optimize/tests/test__basinhopping.py +1 -1
  313. scipy/optimize/tests/test__differential_evolution.py +4 -4
  314. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  315. scipy/optimize/tests/test__numdiff.py +66 -22
  316. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  317. scipy/optimize/tests/test__shgo.py +9 -1
  318. scipy/optimize/tests/test_bracket.py +36 -46
  319. scipy/optimize/tests/test_chandrupatla.py +133 -135
  320. scipy/optimize/tests/test_cobyla.py +74 -45
  321. scipy/optimize/tests/test_constraints.py +1 -1
  322. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  323. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  324. scipy/optimize/tests/test_least_squares.py +125 -13
  325. scipy/optimize/tests/test_linear_assignment.py +3 -3
  326. scipy/optimize/tests/test_linprog.py +3 -3
  327. scipy/optimize/tests/test_lsq_linear.py +6 -6
  328. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  329. scipy/optimize/tests/test_minpack.py +4 -4
  330. scipy/optimize/tests/test_nnls.py +43 -3
  331. scipy/optimize/tests/test_nonlin.py +36 -0
  332. scipy/optimize/tests/test_optimize.py +95 -17
  333. scipy/optimize/tests/test_slsqp.py +36 -4
  334. scipy/optimize/tests/test_zeros.py +34 -1
  335. scipy/signal/__init__.py +12 -23
  336. scipy/signal/_delegators.py +568 -0
  337. scipy/signal/_filter_design.py +459 -241
  338. scipy/signal/_fir_filter_design.py +262 -90
  339. scipy/signal/_lti_conversion.py +3 -2
  340. scipy/signal/_ltisys.py +118 -91
  341. scipy/signal/_max_len_seq_inner.cpython-312-darwin.so +0 -0
  342. scipy/signal/_peak_finding_utils.cpython-312-darwin.so +0 -0
  343. scipy/signal/_polyutils.py +172 -0
  344. scipy/signal/_short_time_fft.py +519 -70
  345. scipy/signal/_signal_api.py +30 -0
  346. scipy/signal/_signaltools.py +719 -399
  347. scipy/signal/_sigtools.cpython-312-darwin.so +0 -0
  348. scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
  349. scipy/signal/_spectral_py.py +230 -50
  350. scipy/signal/_spline.cpython-312-darwin.so +0 -0
  351. scipy/signal/_spline_filters.py +108 -68
  352. scipy/signal/_support_alternative_backends.py +73 -0
  353. scipy/signal/_upfirdn.py +4 -1
  354. scipy/signal/_upfirdn_apply.cpython-312-darwin.so +0 -0
  355. scipy/signal/_waveforms.py +2 -11
  356. scipy/signal/_wavelets.py +1 -1
  357. scipy/signal/fir_filter_design.py +1 -0
  358. scipy/signal/spline.py +4 -11
  359. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  360. scipy/signal/tests/test_bsplines.py +114 -79
  361. scipy/signal/tests/test_cont2discrete.py +9 -2
  362. scipy/signal/tests/test_filter_design.py +721 -481
  363. scipy/signal/tests/test_fir_filter_design.py +332 -140
  364. scipy/signal/tests/test_savitzky_golay.py +4 -3
  365. scipy/signal/tests/test_short_time_fft.py +221 -3
  366. scipy/signal/tests/test_signaltools.py +2144 -1348
  367. scipy/signal/tests/test_spectral.py +50 -6
  368. scipy/signal/tests/test_splines.py +161 -96
  369. scipy/signal/tests/test_upfirdn.py +84 -50
  370. scipy/signal/tests/test_waveforms.py +20 -0
  371. scipy/signal/tests/test_windows.py +607 -466
  372. scipy/signal/windows/_windows.py +287 -148
  373. scipy/sparse/__init__.py +23 -4
  374. scipy/sparse/_base.py +270 -108
  375. scipy/sparse/_bsr.py +7 -4
  376. scipy/sparse/_compressed.py +59 -231
  377. scipy/sparse/_construct.py +90 -38
  378. scipy/sparse/_coo.py +115 -181
  379. scipy/sparse/_csc.py +4 -4
  380. scipy/sparse/_csparsetools.cpython-312-darwin.so +0 -0
  381. scipy/sparse/_csr.py +2 -2
  382. scipy/sparse/_data.py +48 -48
  383. scipy/sparse/_dia.py +105 -18
  384. scipy/sparse/_dok.py +0 -23
  385. scipy/sparse/_index.py +4 -4
  386. scipy/sparse/_matrix.py +23 -0
  387. scipy/sparse/_sparsetools.cpython-312-darwin.so +0 -0
  388. scipy/sparse/_sputils.py +37 -22
  389. scipy/sparse/base.py +0 -9
  390. scipy/sparse/bsr.py +0 -14
  391. scipy/sparse/compressed.py +0 -23
  392. scipy/sparse/construct.py +0 -6
  393. scipy/sparse/coo.py +0 -14
  394. scipy/sparse/csc.py +0 -3
  395. scipy/sparse/csgraph/_flow.cpython-312-darwin.so +0 -0
  396. scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
  397. scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
  398. scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
  399. scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
  400. scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
  401. scipy/sparse/csgraph/_traversal.cpython-312-darwin.so +0 -0
  402. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  403. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  404. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  405. scipy/sparse/csr.py +0 -5
  406. scipy/sparse/data.py +1 -6
  407. scipy/sparse/dia.py +0 -7
  408. scipy/sparse/dok.py +0 -10
  409. scipy/sparse/linalg/_dsolve/_superlu.cpython-312-darwin.so +0 -0
  410. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  411. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  412. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-darwin.so +0 -0
  413. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  414. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  415. scipy/sparse/linalg/_interface.py +17 -18
  416. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  417. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  418. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  419. scipy/sparse/linalg/_isolve/minres.py +5 -5
  420. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  421. scipy/sparse/linalg/_isolve/utils.py +2 -8
  422. scipy/sparse/linalg/_matfuncs.py +1 -1
  423. scipy/sparse/linalg/_norm.py +1 -1
  424. scipy/sparse/linalg/_propack/_cpropack.cpython-312-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
  427. scipy/sparse/linalg/_propack/_zpropack.cpython-312-darwin.so +0 -0
  428. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  429. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  430. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  431. scipy/sparse/tests/test_base.py +214 -42
  432. scipy/sparse/tests/test_common1d.py +7 -7
  433. scipy/sparse/tests/test_construct.py +1 -1
  434. scipy/sparse/tests/test_coo.py +272 -4
  435. scipy/sparse/tests/test_sparsetools.py +5 -0
  436. scipy/sparse/tests/test_sputils.py +36 -7
  437. scipy/spatial/_ckdtree.cpython-312-darwin.so +0 -0
  438. scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
  439. scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
  440. scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
  441. scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
  442. scipy/spatial/_voronoi.cpython-312-darwin.so +0 -0
  443. scipy/spatial/distance.py +49 -42
  444. scipy/spatial/tests/test_distance.py +15 -1
  445. scipy/spatial/tests/test_kdtree.py +1 -0
  446. scipy/spatial/tests/test_qhull.py +7 -2
  447. scipy/spatial/transform/__init__.py +5 -3
  448. scipy/spatial/transform/_rigid_transform.cpython-312-darwin.so +0 -0
  449. scipy/spatial/transform/_rotation.cpython-312-darwin.so +0 -0
  450. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  451. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  452. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  453. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  454. scipy/special/__init__.py +1 -47
  455. scipy/special/_add_newdocs.py +34 -772
  456. scipy/special/_basic.py +22 -25
  457. scipy/special/_comb.cpython-312-darwin.so +0 -0
  458. scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
  459. scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
  460. scipy/special/_logsumexp.py +67 -58
  461. scipy/special/_orthogonal.pyi +1 -1
  462. scipy/special/_specfun.cpython-312-darwin.so +0 -0
  463. scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
  464. scipy/special/_spherical_bessel.py +4 -4
  465. scipy/special/_support_alternative_backends.py +212 -119
  466. scipy/special/_test_internal.cpython-312-darwin.so +0 -0
  467. scipy/special/_testutils.py +4 -4
  468. scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
  469. scipy/special/_ufuncs.pyi +1 -0
  470. scipy/special/_ufuncs.pyx +215 -1400
  471. scipy/special/_ufuncs_cxx.cpython-312-darwin.so +0 -0
  472. scipy/special/_ufuncs_cxx.pxd +2 -15
  473. scipy/special/_ufuncs_cxx.pyx +5 -44
  474. scipy/special/_ufuncs_cxx_defs.h +2 -16
  475. scipy/special/_ufuncs_defs.h +0 -8
  476. scipy/special/cython_special.cpython-312-darwin.so +0 -0
  477. scipy/special/cython_special.pxd +1 -1
  478. scipy/special/tests/_cython_examples/meson.build +10 -1
  479. scipy/special/tests/test_basic.py +153 -20
  480. scipy/special/tests/test_boost_ufuncs.py +3 -0
  481. scipy/special/tests/test_cdflib.py +35 -11
  482. scipy/special/tests/test_gammainc.py +16 -0
  483. scipy/special/tests/test_hyp2f1.py +2 -2
  484. scipy/special/tests/test_log1mexp.py +85 -0
  485. scipy/special/tests/test_logsumexp.py +206 -64
  486. scipy/special/tests/test_mpmath.py +1 -0
  487. scipy/special/tests/test_nan_inputs.py +1 -1
  488. scipy/special/tests/test_orthogonal.py +17 -18
  489. scipy/special/tests/test_sf_error.py +3 -2
  490. scipy/special/tests/test_sph_harm.py +6 -7
  491. scipy/special/tests/test_support_alternative_backends.py +211 -76
  492. scipy/stats/__init__.py +4 -1
  493. scipy/stats/_ansari_swilk_statistics.cpython-312-darwin.so +0 -0
  494. scipy/stats/_axis_nan_policy.py +5 -12
  495. scipy/stats/_biasedurn.cpython-312-darwin.so +0 -0
  496. scipy/stats/_continued_fraction.py +387 -0
  497. scipy/stats/_continuous_distns.py +277 -310
  498. scipy/stats/_correlation.py +1 -1
  499. scipy/stats/_covariance.py +6 -3
  500. scipy/stats/_discrete_distns.py +39 -32
  501. scipy/stats/_distn_infrastructure.py +39 -12
  502. scipy/stats/_distribution_infrastructure.py +900 -238
  503. scipy/stats/_entropy.py +9 -10
  504. scipy/{_lib → stats}/_finite_differences.py +1 -1
  505. scipy/stats/_hypotests.py +83 -50
  506. scipy/stats/_kde.py +53 -49
  507. scipy/stats/_ksstats.py +1 -1
  508. scipy/stats/_levy_stable/__init__.py +7 -15
  509. scipy/stats/_levy_stable/levyst.cpython-312-darwin.so +0 -0
  510. scipy/stats/_morestats.py +118 -73
  511. scipy/stats/_mstats_basic.py +13 -17
  512. scipy/stats/_mstats_extras.py +8 -8
  513. scipy/stats/_multivariate.py +89 -113
  514. scipy/stats/_new_distributions.py +97 -20
  515. scipy/stats/_page_trend_test.py +12 -5
  516. scipy/stats/_probability_distribution.py +265 -43
  517. scipy/stats/_qmc.py +14 -9
  518. scipy/stats/_qmc_cy.cpython-312-darwin.so +0 -0
  519. scipy/stats/_qmvnt.py +16 -95
  520. scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
  521. scipy/stats/_quantile.py +335 -0
  522. scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
  523. scipy/stats/_resampling.py +4 -29
  524. scipy/stats/_sampling.py +1 -1
  525. scipy/stats/_sobol.cpython-312-darwin.so +0 -0
  526. scipy/stats/_stats.cpython-312-darwin.so +0 -0
  527. scipy/stats/_stats_mstats_common.py +21 -2
  528. scipy/stats/_stats_py.py +550 -476
  529. scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
  530. scipy/stats/_unuran/unuran_wrapper.cpython-312-darwin.so +0 -0
  531. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  532. scipy/stats/_variation.py +6 -8
  533. scipy/stats/_wilcoxon.py +13 -7
  534. scipy/stats/tests/common_tests.py +6 -4
  535. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  536. scipy/stats/tests/test_continued_fraction.py +173 -0
  537. scipy/stats/tests/test_continuous.py +379 -60
  538. scipy/stats/tests/test_continuous_basic.py +18 -12
  539. scipy/stats/tests/test_discrete_basic.py +14 -8
  540. scipy/stats/tests/test_discrete_distns.py +16 -16
  541. scipy/stats/tests/test_distributions.py +95 -75
  542. scipy/stats/tests/test_entropy.py +40 -48
  543. scipy/stats/tests/test_fit.py +4 -3
  544. scipy/stats/tests/test_hypotests.py +153 -24
  545. scipy/stats/tests/test_kdeoth.py +109 -41
  546. scipy/stats/tests/test_marray.py +289 -0
  547. scipy/stats/tests/test_morestats.py +79 -47
  548. scipy/stats/tests/test_mstats_basic.py +3 -3
  549. scipy/stats/tests/test_multivariate.py +434 -83
  550. scipy/stats/tests/test_qmc.py +13 -10
  551. scipy/stats/tests/test_quantile.py +199 -0
  552. scipy/stats/tests/test_rank.py +119 -112
  553. scipy/stats/tests/test_resampling.py +47 -56
  554. scipy/stats/tests/test_sampling.py +9 -4
  555. scipy/stats/tests/test_stats.py +799 -939
  556. scipy/stats/tests/test_variation.py +8 -6
  557. scipy/version.py +2 -2
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  559. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  560. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +561 -568
  561. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  562. scipy/_lib/array_api_extra/_funcs.py +0 -484
  563. scipy/_lib/array_api_extra/_typing.py +0 -8
  564. scipy/interpolate/_bspl.cpython-312-darwin.so +0 -0
  565. scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
  566. scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
  567. scipy/optimize/_slsqp.cpython-312-darwin.so +0 -0
  568. scipy/spatial/qhull_src/COPYING.txt +0 -38
  569. scipy/special/libsf_error_state.dylib +0 -0
  570. scipy/special/tests/test_log_softmax.py +0 -109
  571. scipy/special/tests/test_xsf_cuda.py +0 -114
  572. scipy/special/xsf/binom.h +0 -89
  573. scipy/special/xsf/cdflib.h +0 -100
  574. scipy/special/xsf/cephes/airy.h +0 -307
  575. scipy/special/xsf/cephes/besselpoly.h +0 -51
  576. scipy/special/xsf/cephes/beta.h +0 -257
  577. scipy/special/xsf/cephes/cbrt.h +0 -131
  578. scipy/special/xsf/cephes/chbevl.h +0 -85
  579. scipy/special/xsf/cephes/chdtr.h +0 -193
  580. scipy/special/xsf/cephes/const.h +0 -87
  581. scipy/special/xsf/cephes/ellie.h +0 -293
  582. scipy/special/xsf/cephes/ellik.h +0 -251
  583. scipy/special/xsf/cephes/ellpe.h +0 -107
  584. scipy/special/xsf/cephes/ellpk.h +0 -117
  585. scipy/special/xsf/cephes/expn.h +0 -260
  586. scipy/special/xsf/cephes/gamma.h +0 -398
  587. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  588. scipy/special/xsf/cephes/hyperg.h +0 -361
  589. scipy/special/xsf/cephes/i0.h +0 -149
  590. scipy/special/xsf/cephes/i1.h +0 -158
  591. scipy/special/xsf/cephes/igam.h +0 -421
  592. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  593. scipy/special/xsf/cephes/igami.h +0 -313
  594. scipy/special/xsf/cephes/j0.h +0 -225
  595. scipy/special/xsf/cephes/j1.h +0 -198
  596. scipy/special/xsf/cephes/jv.h +0 -715
  597. scipy/special/xsf/cephes/k0.h +0 -164
  598. scipy/special/xsf/cephes/k1.h +0 -163
  599. scipy/special/xsf/cephes/kn.h +0 -243
  600. scipy/special/xsf/cephes/lanczos.h +0 -112
  601. scipy/special/xsf/cephes/ndtr.h +0 -275
  602. scipy/special/xsf/cephes/poch.h +0 -85
  603. scipy/special/xsf/cephes/polevl.h +0 -167
  604. scipy/special/xsf/cephes/psi.h +0 -194
  605. scipy/special/xsf/cephes/rgamma.h +0 -111
  606. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  607. scipy/special/xsf/cephes/shichi.h +0 -248
  608. scipy/special/xsf/cephes/sici.h +0 -224
  609. scipy/special/xsf/cephes/sindg.h +0 -221
  610. scipy/special/xsf/cephes/tandg.h +0 -139
  611. scipy/special/xsf/cephes/trig.h +0 -58
  612. scipy/special/xsf/cephes/unity.h +0 -186
  613. scipy/special/xsf/cephes/zeta.h +0 -172
  614. scipy/special/xsf/config.h +0 -304
  615. scipy/special/xsf/digamma.h +0 -205
  616. scipy/special/xsf/error.h +0 -57
  617. scipy/special/xsf/evalpoly.h +0 -47
  618. scipy/special/xsf/expint.h +0 -266
  619. scipy/special/xsf/hyp2f1.h +0 -694
  620. scipy/special/xsf/iv_ratio.h +0 -173
  621. scipy/special/xsf/lambertw.h +0 -150
  622. scipy/special/xsf/loggamma.h +0 -163
  623. scipy/special/xsf/sici.h +0 -200
  624. scipy/special/xsf/tools.h +0 -427
  625. scipy/special/xsf/trig.h +0 -164
  626. scipy/special/xsf/wright_bessel.h +0 -843
  627. scipy/special/xsf/zlog1.h +0 -35
  628. scipy/stats/_mvn.cpython-312-darwin.so +0 -0
  629. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -1,46 +1,31 @@
1
1
  from __future__ import annotations
2
2
 
3
- __all__ = [
4
- "ndarray",
5
- "Device",
6
- "Dtype",
7
- ]
3
+ __all__ = ["Array", "DType", "Device"]
4
+ _all_ignore = ["cp"]
8
5
 
9
- import sys
10
- from typing import (
11
- Union,
12
- TYPE_CHECKING,
13
- )
14
-
15
- from cupy import (
16
- ndarray,
17
- dtype,
18
- int8,
19
- int16,
20
- int32,
21
- int64,
22
- uint8,
23
- uint16,
24
- uint32,
25
- uint64,
26
- float32,
27
- float64,
28
- )
6
+ from typing import TYPE_CHECKING
29
7
 
8
+ import cupy as cp
9
+ from cupy import ndarray as Array
30
10
  from cupy.cuda.device import Device
31
11
 
32
- if TYPE_CHECKING or sys.version_info >= (3, 9):
33
- Dtype = dtype[Union[
34
- int8,
35
- int16,
36
- int32,
37
- int64,
38
- uint8,
39
- uint16,
40
- uint32,
41
- uint64,
42
- float32,
43
- float64,
44
- ]]
12
+ if TYPE_CHECKING:
13
+ # NumPy 1.x on Python 3.10 fails to parse np.dtype[]
14
+ DType = cp.dtype[
15
+ cp.intp
16
+ | cp.int8
17
+ | cp.int16
18
+ | cp.int32
19
+ | cp.int64
20
+ | cp.uint8
21
+ | cp.uint16
22
+ | cp.uint32
23
+ | cp.uint64
24
+ | cp.float32
25
+ | cp.float64
26
+ | cp.complex64
27
+ | cp.complex128
28
+ | cp.bool_
29
+ ]
45
30
  else:
46
- Dtype = dtype
31
+ DType = cp.dtype
@@ -1,9 +1,12 @@
1
- from dask.array import * # noqa: F403
1
+ from typing import Final
2
+
3
+ from dask.array import * # noqa: F403
2
4
 
3
5
  # These imports may overwrite names from the import * above.
4
- from ._aliases import * # noqa: F403
6
+ from ._aliases import * # noqa: F403
5
7
 
6
- __array_api_version__ = '2023.12'
8
+ __array_api_version__: Final = "2024.12"
7
9
 
10
+ # See the comment in the numpy __init__.py
8
11
  __import__(__package__ + '.linalg')
9
12
  __import__(__package__ + '.fft')
@@ -1,66 +1,102 @@
1
- from __future__ import annotations
1
+ # pyright: reportPrivateUsage=false
2
+ # pyright: reportUnknownArgumentType=false
3
+ # pyright: reportUnknownMemberType=false
4
+ # pyright: reportUnknownVariableType=false
2
5
 
3
- from ...common import _aliases
4
- from ...common._helpers import _check_device
6
+ from __future__ import annotations
5
7
 
6
- from ..._internal import get_xp
8
+ from builtins import bool as py_bool
9
+ from collections.abc import Callable
10
+ from typing import TYPE_CHECKING, Any
7
11
 
8
- from ._info import __array_namespace_info__
12
+ if TYPE_CHECKING:
13
+ from typing_extensions import TypeIs
9
14
 
15
+ import dask.array as da
10
16
  import numpy as np
17
+ from numpy import bool_ as bool
11
18
  from numpy import (
12
- # Dtypes
13
- iinfo,
14
- finfo,
15
- bool_ as bool,
19
+ can_cast,
20
+ complex64,
21
+ complex128,
16
22
  float32,
17
23
  float64,
18
24
  int8,
19
25
  int16,
20
26
  int32,
21
27
  int64,
28
+ result_type,
22
29
  uint8,
23
30
  uint16,
24
31
  uint32,
25
32
  uint64,
26
- complex64,
27
- complex128,
28
- can_cast,
29
- result_type,
30
33
  )
31
34
 
32
- from typing import TYPE_CHECKING
33
- if TYPE_CHECKING:
34
- from typing import Optional, Union
35
-
36
- from ...common._typing import Device, Dtype, Array, NestedSequence, SupportsBufferProtocol
37
-
38
- import dask.array as da
35
+ from ..._internal import get_xp
36
+ from ...common import _aliases, _helpers, array_namespace
37
+ from ...common._typing import (
38
+ Array,
39
+ Device,
40
+ DType,
41
+ NestedSequence,
42
+ SupportsBufferProtocol,
43
+ )
44
+ from ._info import __array_namespace_info__
39
45
 
40
46
  isdtype = get_xp(np)(_aliases.isdtype)
41
47
  unstack = get_xp(da)(_aliases.unstack)
42
- astype = _aliases.astype
48
+
49
+
50
+ # da.astype doesn't respect copy=True
51
+ def astype(
52
+ x: Array,
53
+ dtype: DType,
54
+ /,
55
+ *,
56
+ copy: py_bool = True,
57
+ device: Device | None = None,
58
+ ) -> Array:
59
+ """
60
+ Array API compatibility wrapper for astype().
61
+
62
+ See the corresponding documentation in the array library and/or the array API
63
+ specification for more details.
64
+ """
65
+ # TODO: respect device keyword?
66
+ _helpers._check_device(da, device)
67
+
68
+ if not copy and dtype == x.dtype:
69
+ return x
70
+ x = x.astype(dtype)
71
+ return x.copy() if copy else x
72
+
43
73
 
44
74
  # Common aliases
45
75
 
76
+
46
77
  # This arange func is modified from the common one to
47
78
  # not pass stop/step as keyword arguments, which will cause
48
79
  # an error with dask
49
-
50
- # TODO: delete the xp stuff, it shouldn't be necessary
51
- def _dask_arange(
52
- start: Union[int, float],
80
+ def arange(
81
+ start: float,
53
82
  /,
54
- stop: Optional[Union[int, float]] = None,
55
- step: Union[int, float] = 1,
83
+ stop: float | None = None,
84
+ step: float = 1,
56
85
  *,
57
- xp,
58
- dtype: Optional[Dtype] = None,
59
- device: Optional[Device] = None,
60
- **kwargs,
86
+ dtype: DType | None = None,
87
+ device: Device | None = None,
88
+ **kwargs: object,
61
89
  ) -> Array:
62
- _check_device(xp, device)
63
- args = [start]
90
+ """
91
+ Array API compatibility wrapper for arange().
92
+
93
+ See the corresponding documentation in the array library and/or the array API
94
+ specification for more details.
95
+ """
96
+ # TODO: respect device keyword?
97
+ _helpers._check_device(da, device)
98
+
99
+ args: list[Any] = [start]
64
100
  if stop is not None:
65
101
  args.append(stop)
66
102
  else:
@@ -68,13 +104,12 @@ def _dask_arange(
68
104
  # prepend the default value for start which is 0
69
105
  args.insert(0, 0)
70
106
  args.append(step)
71
- return xp.arange(*args, dtype=dtype, **kwargs)
72
107
 
73
- arange = get_xp(da)(_dask_arange)
74
- eye = get_xp(da)(_aliases.eye)
108
+ return da.arange(*args, dtype=dtype, **kwargs)
109
+
75
110
 
76
- linspace = get_xp(da)(_aliases.linspace)
77
111
  eye = get_xp(da)(_aliases.eye)
112
+ linspace = get_xp(da)(_aliases.linspace)
78
113
  UniqueAllResult = get_xp(da)(_aliases.UniqueAllResult)
79
114
  UniqueCountsResult = get_xp(da)(_aliases.UniqueCountsResult)
80
115
  UniqueInverseResult = get_xp(da)(_aliases.UniqueInverseResult)
@@ -86,6 +121,7 @@ permute_dims = get_xp(da)(_aliases.permute_dims)
86
121
  std = get_xp(da)(_aliases.std)
87
122
  var = get_xp(da)(_aliases.var)
88
123
  cumulative_sum = get_xp(da)(_aliases.cumulative_sum)
124
+ cumulative_prod = get_xp(da)(_aliases.cumulative_prod)
89
125
  empty = get_xp(da)(_aliases.empty)
90
126
  empty_like = get_xp(da)(_aliases.empty_like)
91
127
  full = get_xp(da)(_aliases.full)
@@ -97,7 +133,6 @@ zeros_like = get_xp(da)(_aliases.zeros_like)
97
133
  reshape = get_xp(da)(_aliases.reshape)
98
134
  matrix_transpose = get_xp(da)(_aliases.matrix_transpose)
99
135
  vecdot = get_xp(da)(_aliases.vecdot)
100
-
101
136
  nonzero = get_xp(da)(_aliases.nonzero)
102
137
  ceil = get_xp(np)(_aliases.ceil)
103
138
  floor = get_xp(np)(_aliases.floor)
@@ -105,23 +140,19 @@ trunc = get_xp(np)(_aliases.trunc)
105
140
  matmul = get_xp(np)(_aliases.matmul)
106
141
  tensordot = get_xp(np)(_aliases.tensordot)
107
142
  sign = get_xp(np)(_aliases.sign)
143
+ finfo = get_xp(np)(_aliases.finfo)
144
+ iinfo = get_xp(np)(_aliases.iinfo)
145
+
108
146
 
109
147
  # asarray also adds the copy keyword, which is not present in numpy 1.0.
110
148
  def asarray(
111
- obj: Union[
112
- Array,
113
- bool,
114
- int,
115
- float,
116
- NestedSequence[bool | int | float],
117
- SupportsBufferProtocol,
118
- ],
149
+ obj: complex | NestedSequence[complex] | Array | SupportsBufferProtocol,
119
150
  /,
120
151
  *,
121
- dtype: Optional[Dtype] = None,
122
- device: Optional[Device] = None,
123
- copy: "Optional[Union[bool, np._CopyMode]]" = None,
124
- **kwargs,
152
+ dtype: DType | None = None,
153
+ device: Device | None = None,
154
+ copy: py_bool | None = None,
155
+ **kwargs: object,
125
156
  ) -> Array:
126
157
  """
127
158
  Array API compatibility wrapper for asarray().
@@ -129,89 +160,217 @@ def asarray(
129
160
  See the corresponding documentation in the array library and/or the array API
130
161
  specification for more details.
131
162
  """
163
+ # TODO: respect device keyword?
164
+ _helpers._check_device(da, device)
165
+
166
+ if isinstance(obj, da.Array):
167
+ if dtype is not None and dtype != obj.dtype:
168
+ if copy is False:
169
+ raise ValueError("Unable to avoid copy when changing dtype")
170
+ obj = obj.astype(dtype)
171
+ return obj.copy() if copy else obj # pyright: ignore[reportAttributeAccessIssue]
172
+
132
173
  if copy is False:
133
- # copy=False is not yet implemented in dask
134
- raise NotImplementedError("copy=False is not yet implemented")
135
- elif copy is True:
136
- if isinstance(obj, da.Array) and dtype is None:
137
- return obj.copy()
138
- # Go through numpy, since dask copy is no-op by default
139
- obj = np.array(obj, dtype=dtype, copy=True)
140
- return da.array(obj, dtype=dtype)
141
- else:
142
- if not isinstance(obj, da.Array) or dtype is not None and obj.dtype != dtype:
143
- obj = np.asarray(obj, dtype=dtype)
144
- return da.from_array(obj)
145
- return obj
146
-
147
- return da.asarray(obj, dtype=dtype, **kwargs)
148
-
149
- from dask.array import (
150
- # Element wise aliases
151
- arccos as acos,
152
- arccosh as acosh,
153
- arcsin as asin,
154
- arcsinh as asinh,
155
- arctan as atan,
156
- arctan2 as atan2,
157
- arctanh as atanh,
158
- left_shift as bitwise_left_shift,
159
- right_shift as bitwise_right_shift,
160
- invert as bitwise_invert,
161
- power as pow,
162
- # Other
163
- concatenate as concat,
164
- )
174
+ raise ValueError(
175
+ "Unable to avoid copy when converting a non-dask object to dask"
176
+ )
177
+
178
+ # copy=None to be uniform across dask < 2024.12 and >= 2024.12
179
+ # see https://github.com/dask/dask/pull/11524/
180
+ obj = np.array(obj, dtype=dtype, copy=True)
181
+ return da.from_array(obj)
182
+
183
+
184
+ # Element wise aliases
185
+ from dask.array import arccos as acos
186
+ from dask.array import arccosh as acosh
187
+ from dask.array import arcsin as asin
188
+ from dask.array import arcsinh as asinh
189
+ from dask.array import arctan as atan
190
+ from dask.array import arctan2 as atan2
191
+ from dask.array import arctanh as atanh
192
+
193
+ # Other
194
+ from dask.array import concatenate as concat
195
+ from dask.array import invert as bitwise_invert
196
+ from dask.array import left_shift as bitwise_left_shift
197
+ from dask.array import power as pow
198
+ from dask.array import right_shift as bitwise_right_shift
199
+
165
200
 
166
201
  # dask.array.clip does not work unless all three arguments are provided.
167
202
  # Furthermore, the masking workaround in common._aliases.clip cannot work with
168
203
  # dask (meaning uint64 promoting to float64 is going to just be unfixed for
169
204
  # now).
170
- @get_xp(da)
171
205
  def clip(
172
206
  x: Array,
173
207
  /,
174
- min: Optional[Union[int, float, Array]] = None,
175
- max: Optional[Union[int, float, Array]] = None,
176
- *,
177
- xp,
208
+ min: float | Array | None = None,
209
+ max: float | Array | None = None,
178
210
  ) -> Array:
179
- def _isscalar(a):
180
- return isinstance(a, (int, float, type(None)))
211
+ """
212
+ Array API compatibility wrapper for clip().
213
+
214
+ See the corresponding documentation in the array library and/or the array API
215
+ specification for more details.
216
+ """
217
+
218
+ def _isscalar(a: float | Array | None, /) -> TypeIs[float | None]:
219
+ return a is None or isinstance(a, (int, float))
220
+
181
221
  min_shape = () if _isscalar(min) else min.shape
182
222
  max_shape = () if _isscalar(max) else max.shape
183
223
 
184
224
  # TODO: This won't handle dask unknown shapes
185
- import numpy as np
186
225
  result_shape = np.broadcast_shapes(x.shape, min_shape, max_shape)
187
226
 
188
227
  if min is not None:
189
- min = xp.broadcast_to(xp.asarray(min), result_shape)
228
+ min = da.broadcast_to(da.asarray(min), result_shape)
190
229
  if max is not None:
191
- max = xp.broadcast_to(xp.asarray(max), result_shape)
230
+ max = da.broadcast_to(da.asarray(max), result_shape)
192
231
 
193
232
  if min is None and max is None:
194
- return xp.positive(x)
233
+ return da.positive(x)
195
234
 
196
235
  if min is None:
197
- return astype(xp.minimum(x, max), x.dtype)
236
+ return astype(da.minimum(x, max), x.dtype)
198
237
  if max is None:
199
- return astype(xp.maximum(x, min), x.dtype)
238
+ return astype(da.maximum(x, min), x.dtype)
239
+
240
+ return astype(da.minimum(da.maximum(x, min), max), x.dtype)
241
+
242
+
243
+ def _ensure_single_chunk(x: Array, axis: int) -> tuple[Array, Callable[[Array], Array]]:
244
+ """
245
+ Make sure that Array is not broken into multiple chunks along axis.
246
+
247
+ Returns
248
+ -------
249
+ x : Array
250
+ The input Array with a single chunk along axis.
251
+ restore : Callable[Array, Array]
252
+ function to apply to the output to rechunk it back into reasonable chunks
253
+ """
254
+ if axis < 0:
255
+ axis += x.ndim
256
+ if x.numblocks[axis] < 2:
257
+ return x, lambda x: x
258
+
259
+ # Break chunks on other axes in an attempt to keep chunk size low
260
+ x = x.rechunk({i: -1 if i == axis else "auto" for i in range(x.ndim)})
261
+
262
+ # Rather than reconstructing the original chunks, which can be a
263
+ # very expensive affair, just break down oversized chunks without
264
+ # incurring in any transfers over the network.
265
+ # This has the downside of a risk of overchunking if the array is
266
+ # then used in operations against other arrays that match the
267
+ # original chunking pattern.
268
+ return x, lambda x: x.rechunk()
269
+
270
+
271
+ def sort(
272
+ x: Array,
273
+ /,
274
+ *,
275
+ axis: int = -1,
276
+ descending: py_bool = False,
277
+ stable: py_bool = True,
278
+ ) -> Array:
279
+ """
280
+ Array API compatibility layer around the lack of sort() in Dask.
281
+
282
+ Warnings
283
+ --------
284
+ This function temporarily rechunks the array along `axis` to a single chunk.
285
+ This can be extremely inefficient and can lead to out-of-memory errors.
286
+
287
+ See the corresponding documentation in the array library and/or the array API
288
+ specification for more details.
289
+ """
290
+ x, restore = _ensure_single_chunk(x, axis)
291
+
292
+ meta_xp = array_namespace(x._meta)
293
+ x = da.map_blocks(
294
+ meta_xp.sort,
295
+ x,
296
+ axis=axis,
297
+ meta=x._meta,
298
+ dtype=x.dtype,
299
+ descending=descending,
300
+ stable=stable,
301
+ )
302
+
303
+ return restore(x)
304
+
305
+
306
+ def argsort(
307
+ x: Array,
308
+ /,
309
+ *,
310
+ axis: int = -1,
311
+ descending: py_bool = False,
312
+ stable: py_bool = True,
313
+ ) -> Array:
314
+ """
315
+ Array API compatibility layer around the lack of argsort() in Dask.
200
316
 
201
- return astype(xp.minimum(xp.maximum(x, min), max), x.dtype)
317
+ See the corresponding documentation in the array library and/or the array API
318
+ specification for more details.
319
+
320
+ Warnings
321
+ --------
322
+ This function temporarily rechunks the array along `axis` into a single chunk.
323
+ This can be extremely inefficient and can lead to out-of-memory errors.
324
+ """
325
+ x, restore = _ensure_single_chunk(x, axis)
326
+
327
+ meta_xp = array_namespace(x._meta)
328
+ dtype = meta_xp.argsort(x._meta).dtype
329
+ meta = meta_xp.astype(x._meta, dtype)
330
+ x = da.map_blocks(
331
+ meta_xp.argsort,
332
+ x,
333
+ axis=axis,
334
+ meta=meta,
335
+ dtype=dtype,
336
+ descending=descending,
337
+ stable=stable,
338
+ )
339
+
340
+ return restore(x)
341
+
342
+
343
+ # dask.array.count_nonzero does not have keepdims
344
+ def count_nonzero(
345
+ x: Array,
346
+ axis: int | None = None,
347
+ keepdims: py_bool = False,
348
+ ) -> Array:
349
+ result = da.count_nonzero(x, axis)
350
+ if keepdims:
351
+ if axis is None:
352
+ return da.reshape(result, [1] * x.ndim)
353
+ return da.expand_dims(result, axis)
354
+ return result
202
355
 
203
- # exclude these from all since dask.array has no sorting functions
204
- _da_unsupported = ['sort', 'argsort']
205
356
 
206
- _common_aliases = [alias for alias in _aliases.__all__ if alias not in _da_unsupported]
357
+ __all__ = [
358
+ "__array_namespace_info__",
359
+ "count_nonzero",
360
+ "bool",
361
+ "int8", "int16", "int32", "int64",
362
+ "uint8", "uint16", "uint32", "uint64",
363
+ "float32", "float64",
364
+ "complex64", "complex128",
365
+ "asarray", "astype", "can_cast", "result_type",
366
+ "pow",
367
+ "concat",
368
+ "acos", "acosh", "asin", "asinh", "atan", "atan2", "atanh",
369
+ "bitwise_left_shift", "bitwise_right_shift", "bitwise_invert",
370
+ ] # fmt: skip
371
+ __all__ += _aliases.__all__
372
+ _all_ignore = ["array_namespace", "get_xp", "da", "np"]
207
373
 
208
- __all__ = _common_aliases + ['__array_namespace_info__', 'asarray', 'acos',
209
- 'acosh', 'asin', 'asinh', 'atan', 'atan2',
210
- 'atanh', 'bitwise_left_shift', 'bitwise_invert',
211
- 'bitwise_right_shift', 'concat', 'pow', 'iinfo', 'finfo', 'can_cast',
212
- 'result_type', 'bool', 'float32', 'float64', 'int8', 'int16', 'int32', 'int64',
213
- 'uint8', 'uint16', 'uint32', 'uint64',
214
- 'complex64', 'complex128', 'iinfo', 'finfo',
215
- 'can_cast', 'result_type']
216
374
 
217
- _all_ignore = ["get_xp", "da", "np"]
375
+ def __dir__() -> list[str]:
376
+ return __all__