scipy 1.15.3__cp313-cp313-win_amd64.whl → 1.16.0rc2__cp313-cp313-win_amd64.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 (759) hide show
  1. scipy/__config__.py +8 -8
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cp313-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp313-win_amd64.pyd +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.cp313-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp313-win_amd64.pyd +0 -0
  10. scipy/_lib/_docscrape.py +1 -1
  11. scipy/_lib/_elementwise_iterative_method.py +15 -26
  12. scipy/_lib/_fpumode.cp313-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp313-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp313-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp313-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp313-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp313-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp313-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp313-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp313-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp313-win_amd64.pyd +0 -0
  24. scipy/_lib/_util.py +222 -125
  25. scipy/_lib/array_api_compat/__init__.py +4 -4
  26. scipy/_lib/array_api_compat/_internal.py +19 -6
  27. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  28. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  29. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  30. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  31. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  32. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  33. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  34. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  35. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  36. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  37. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  38. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  39. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  40. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  41. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  42. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  43. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  44. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  45. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  46. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  47. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  48. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  49. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  50. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  51. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  52. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  53. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  54. scipy/_lib/array_api_extra/__init__.py +26 -3
  55. scipy/_lib/array_api_extra/_delegation.py +171 -0
  56. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  57. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  58. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  59. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  60. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  61. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  62. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  63. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  64. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  65. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  66. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  67. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  68. scipy/_lib/array_api_extra/testing.py +359 -0
  69. scipy/_lib/decorator.py +2 -2
  70. scipy/_lib/doccer.py +1 -7
  71. scipy/_lib/messagestream.cp313-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp313-win_amd64.pyd +0 -0
  73. scipy/_lib/pyprima/__init__.py +212 -0
  74. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  75. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  76. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  77. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  78. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  79. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  80. scipy/_lib/pyprima/cobyla/update.py +289 -0
  81. scipy/_lib/pyprima/common/__init__.py +0 -0
  82. scipy/_lib/pyprima/common/_bounds.py +34 -0
  83. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  84. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  85. scipy/_lib/pyprima/common/_project.py +173 -0
  86. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  87. scipy/_lib/pyprima/common/consts.py +47 -0
  88. scipy/_lib/pyprima/common/evaluate.py +99 -0
  89. scipy/_lib/pyprima/common/history.py +38 -0
  90. scipy/_lib/pyprima/common/infos.py +30 -0
  91. scipy/_lib/pyprima/common/linalg.py +435 -0
  92. scipy/_lib/pyprima/common/message.py +290 -0
  93. scipy/_lib/pyprima/common/powalg.py +131 -0
  94. scipy/_lib/pyprima/common/preproc.py +277 -0
  95. scipy/_lib/pyprima/common/present.py +5 -0
  96. scipy/_lib/pyprima/common/ratio.py +54 -0
  97. scipy/_lib/pyprima/common/redrho.py +47 -0
  98. scipy/_lib/pyprima/common/selectx.py +296 -0
  99. scipy/_lib/tests/test__util.py +105 -121
  100. scipy/_lib/tests/test_array_api.py +166 -35
  101. scipy/_lib/tests/test_bunch.py +7 -0
  102. scipy/_lib/tests/test_ccallback.py +2 -10
  103. scipy/_lib/tests/test_public_api.py +13 -0
  104. scipy/cluster/_hierarchy.cp313-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp313-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp313-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp313-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp313-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp313-win_amd64.pyd +0 -0
  110. scipy/cluster/hierarchy.py +393 -223
  111. scipy/cluster/tests/test_hierarchy.py +273 -335
  112. scipy/cluster/tests/test_vq.py +45 -61
  113. scipy/cluster/vq.py +39 -35
  114. scipy/conftest.py +263 -157
  115. scipy/constants/_constants.py +4 -1
  116. scipy/constants/tests/test_codata.py +2 -2
  117. scipy/constants/tests/test_constants.py +11 -18
  118. scipy/datasets/_download_all.py +15 -1
  119. scipy/datasets/_fetchers.py +7 -1
  120. scipy/datasets/_utils.py +1 -1
  121. scipy/differentiate/_differentiate.py +25 -25
  122. scipy/differentiate/tests/test_differentiate.py +24 -25
  123. scipy/fft/_basic.py +20 -0
  124. scipy/fft/_helper.py +3 -34
  125. scipy/fft/_pocketfft/helper.py +29 -1
  126. scipy/fft/_pocketfft/pypocketfft.cp313-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp313-win_amd64.pyd +0 -0
  128. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  129. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  130. scipy/fft/_realtransforms.py +13 -0
  131. scipy/fft/tests/test_basic.py +27 -25
  132. scipy/fft/tests/test_fftlog.py +16 -7
  133. scipy/fft/tests/test_helper.py +18 -34
  134. scipy/fft/tests/test_real_transforms.py +8 -10
  135. scipy/fftpack/convolve.cp313-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp313-win_amd64.pyd +0 -0
  137. scipy/fftpack/tests/test_basic.py +2 -4
  138. scipy/fftpack/tests/test_real_transforms.py +8 -9
  139. scipy/integrate/_bvp.py +9 -3
  140. scipy/integrate/_cubature.py +3 -2
  141. scipy/integrate/_dop.cp313-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp313-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp313-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp313-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp313-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp313-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp313-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp313-win_amd64.pyd +0 -0
  151. scipy/integrate/_quadpack_py.py +11 -7
  152. scipy/integrate/_quadrature.py +3 -3
  153. scipy/integrate/_rules/_base.py +2 -2
  154. scipy/integrate/_tanhsinh.py +48 -47
  155. scipy/integrate/_test_multivariate.cp313-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp313-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp313-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp313-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp313-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp313-win_amd64.pyd +0 -0
  161. scipy/integrate/tests/test__quad_vec.py +0 -6
  162. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  163. scipy/integrate/tests/test_cubature.py +21 -35
  164. scipy/integrate/tests/test_quadrature.py +6 -8
  165. scipy/integrate/tests/test_tanhsinh.py +56 -48
  166. scipy/interpolate/__init__.py +70 -58
  167. scipy/interpolate/_bary_rational.py +22 -22
  168. scipy/interpolate/_bsplines.py +119 -66
  169. scipy/interpolate/_cubic.py +65 -50
  170. scipy/interpolate/_dfitpack.cp313-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp313-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp313-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp313-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp313-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp313-win_amd64.pyd +0 -0
  176. scipy/interpolate/_fitpack2.py +9 -6
  177. scipy/interpolate/_fitpack_impl.py +32 -26
  178. scipy/interpolate/_fitpack_repro.py +23 -19
  179. scipy/interpolate/_interpnd.cp313-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp313-win_amd64.pyd +0 -0
  181. scipy/interpolate/_interpolate.py +30 -12
  182. scipy/interpolate/_ndbspline.py +13 -18
  183. scipy/interpolate/_ndgriddata.py +5 -8
  184. scipy/interpolate/_polyint.py +95 -31
  185. scipy/interpolate/_ppoly.cp313-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp313-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp313-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp313-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp313-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp313-win_amd64.pyd +0 -0
  194. scipy/interpolate/dfitpack.py +0 -20
  195. scipy/interpolate/interpnd.py +1 -2
  196. scipy/interpolate/tests/test_bary_rational.py +2 -2
  197. scipy/interpolate/tests/test_bsplines.py +97 -1
  198. scipy/interpolate/tests/test_fitpack2.py +39 -1
  199. scipy/interpolate/tests/test_interpnd.py +32 -20
  200. scipy/interpolate/tests/test_interpolate.py +48 -4
  201. scipy/interpolate/tests/test_rgi.py +2 -1
  202. scipy/io/_fast_matrix_market/__init__.py +2 -0
  203. scipy/io/_fast_matrix_market/_fmm_core.cp313-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp313-win_amd64.pyd +0 -0
  205. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  206. scipy/io/_harwell_boeing/hb.py +7 -11
  207. scipy/io/_idl.py +5 -7
  208. scipy/io/_netcdf.py +15 -5
  209. scipy/io/_test_fortran.cp313-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp313-win_amd64.pyd +0 -0
  211. scipy/io/arff/tests/test_arffread.py +3 -3
  212. scipy/io/matlab/__init__.py +5 -3
  213. scipy/io/matlab/_mio.py +4 -1
  214. scipy/io/matlab/_mio5.py +19 -13
  215. scipy/io/matlab/_mio5_utils.cp313-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp313-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp313-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp313-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp313-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp313-win_amd64.pyd +0 -0
  222. scipy/io/matlab/tests/test_mio.py +46 -18
  223. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  224. scipy/io/tests/test_mmio.py +7 -1
  225. scipy/io/tests/test_wavfile.py +41 -0
  226. scipy/io/wavfile.py +57 -10
  227. scipy/linalg/_basic.py +113 -86
  228. scipy/linalg/_cythonized_array_utils.cp313-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp313-win_amd64.pyd +0 -0
  230. scipy/linalg/_decomp.py +22 -9
  231. scipy/linalg/_decomp_cholesky.py +28 -13
  232. scipy/linalg/_decomp_cossin.py +45 -30
  233. scipy/linalg/_decomp_interpolative.cp313-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp313-win_amd64.pyd +0 -0
  235. scipy/linalg/_decomp_ldl.py +4 -1
  236. scipy/linalg/_decomp_lu.py +18 -6
  237. scipy/linalg/_decomp_lu_cython.cp313-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp313-win_amd64.pyd +0 -0
  239. scipy/linalg/_decomp_polar.py +2 -0
  240. scipy/linalg/_decomp_qr.py +6 -2
  241. scipy/linalg/_decomp_qz.py +3 -0
  242. scipy/linalg/_decomp_schur.py +3 -1
  243. scipy/linalg/_decomp_svd.py +13 -2
  244. scipy/linalg/_decomp_update.cp313-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp313-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp313-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp313-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp313-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp313-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp313-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp313-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp313-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp313-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp313-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp313-win_amd64.pyd +0 -0
  265. scipy/linalg/_solvers.py +7 -2
  266. scipy/linalg/_special_matrices.py +26 -36
  267. scipy/linalg/cython_blas.cp313-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp313-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp313-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp313-win_amd64.pyd +0 -0
  271. scipy/linalg/lapack.py +22 -2
  272. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  273. scipy/linalg/tests/test_basic.py +31 -16
  274. scipy/linalg/tests/test_batch.py +588 -0
  275. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  276. scipy/linalg/tests/test_decomp.py +40 -3
  277. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  278. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  279. scipy/linalg/tests/test_lapack.py +115 -7
  280. scipy/linalg/tests/test_matfuncs.py +157 -102
  281. scipy/linalg/tests/test_procrustes.py +0 -7
  282. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  283. scipy/linalg/tests/test_special_matrices.py +1 -5
  284. scipy/ndimage/__init__.py +1 -0
  285. scipy/ndimage/_ctest.cp313-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp313-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp313-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp313-win_amd64.pyd +0 -0
  289. scipy/ndimage/_delegators.py +8 -2
  290. scipy/ndimage/_filters.py +453 -5
  291. scipy/ndimage/_interpolation.py +36 -6
  292. scipy/ndimage/_measurements.py +4 -2
  293. scipy/ndimage/_morphology.py +5 -0
  294. scipy/ndimage/_nd_image.cp313-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp313-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp313-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp313-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp313-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp313-win_amd64.pyd +0 -0
  302. scipy/ndimage/_support_alternative_backends.py +18 -6
  303. scipy/ndimage/tests/test_filters.py +370 -259
  304. scipy/ndimage/tests/test_fourier.py +7 -9
  305. scipy/ndimage/tests/test_interpolation.py +68 -61
  306. scipy/ndimage/tests/test_measurements.py +18 -35
  307. scipy/ndimage/tests/test_morphology.py +143 -131
  308. scipy/ndimage/tests/test_splines.py +1 -3
  309. scipy/odr/__odrpack.cp313-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp313-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp313-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp313-win_amd64.pyd +0 -0
  314. scipy/optimize/_bracket.py +17 -24
  315. scipy/optimize/_chandrupatla.py +9 -10
  316. scipy/optimize/_cobyla_py.py +104 -123
  317. scipy/optimize/_constraints.py +14 -10
  318. scipy/optimize/_differentiable_functions.py +371 -230
  319. scipy/optimize/_differentialevolution.py +4 -3
  320. scipy/optimize/_direct.cp313-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp313-win_amd64.pyd +0 -0
  322. scipy/optimize/_dual_annealing.py +1 -1
  323. scipy/optimize/_elementwise.py +1 -4
  324. scipy/optimize/_group_columns.cp313-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp313-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp313-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp313-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp313-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp313-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp313-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp313-win_amd64.pyd +0 -0
  332. scipy/optimize/_lbfgsb_py.py +57 -16
  333. scipy/optimize/_linprog_doc.py +2 -2
  334. scipy/optimize/_linprog_highs.py +2 -2
  335. scipy/optimize/_linprog_ip.py +25 -10
  336. scipy/optimize/_linprog_util.py +14 -16
  337. scipy/optimize/_lsap.cp313-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp313-win_amd64.pyd +0 -0
  339. scipy/optimize/_lsq/common.py +3 -3
  340. scipy/optimize/_lsq/dogbox.py +16 -2
  341. scipy/optimize/_lsq/givens_elimination.cp313-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp313-win_amd64.pyd +0 -0
  343. scipy/optimize/_lsq/least_squares.py +198 -126
  344. scipy/optimize/_lsq/lsq_linear.py +6 -6
  345. scipy/optimize/_lsq/trf.py +35 -8
  346. scipy/optimize/_milp.py +3 -1
  347. scipy/optimize/_minimize.py +105 -36
  348. scipy/optimize/_minpack.cp313-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp313-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp313-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp313-win_amd64.pyd +0 -0
  353. scipy/optimize/_nnls.py +20 -21
  354. scipy/optimize/_nonlin.py +34 -3
  355. scipy/optimize/_numdiff.py +288 -110
  356. scipy/optimize/_optimize.py +86 -48
  357. scipy/optimize/_pava_pybind.cp313-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp313-win_amd64.pyd +0 -0
  359. scipy/optimize/_remove_redundancy.py +5 -5
  360. scipy/optimize/_root_scalar.py +1 -1
  361. scipy/optimize/_shgo.py +6 -0
  362. scipy/optimize/_shgo_lib/_complex.py +1 -1
  363. scipy/optimize/_slsqp_py.py +216 -124
  364. scipy/optimize/_slsqplib.cp313-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp313-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp313-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp313-win_amd64.pyd +0 -0
  370. scipy/optimize/_trustregion.py +20 -6
  371. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  372. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  373. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  374. scipy/optimize/_trustregion_constr/projections.py +12 -8
  375. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  376. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  377. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  378. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  379. scipy/optimize/_trustregion_exact.py +0 -1
  380. scipy/optimize/_zeros.cp313-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp313-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp313-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp313-win_amd64.pyd +0 -0
  385. scipy/optimize/slsqp.py +0 -1
  386. scipy/optimize/tests/test__basinhopping.py +1 -1
  387. scipy/optimize/tests/test__differential_evolution.py +4 -4
  388. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  389. scipy/optimize/tests/test__numdiff.py +66 -22
  390. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  391. scipy/optimize/tests/test__shgo.py +9 -1
  392. scipy/optimize/tests/test_bracket.py +36 -46
  393. scipy/optimize/tests/test_chandrupatla.py +133 -135
  394. scipy/optimize/tests/test_cobyla.py +74 -45
  395. scipy/optimize/tests/test_constraints.py +1 -1
  396. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  397. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  398. scipy/optimize/tests/test_least_squares.py +125 -13
  399. scipy/optimize/tests/test_linear_assignment.py +3 -3
  400. scipy/optimize/tests/test_linprog.py +3 -3
  401. scipy/optimize/tests/test_lsq_linear.py +6 -6
  402. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  403. scipy/optimize/tests/test_minpack.py +4 -4
  404. scipy/optimize/tests/test_nnls.py +43 -3
  405. scipy/optimize/tests/test_nonlin.py +36 -0
  406. scipy/optimize/tests/test_optimize.py +95 -17
  407. scipy/optimize/tests/test_slsqp.py +36 -4
  408. scipy/optimize/tests/test_zeros.py +34 -1
  409. scipy/signal/__init__.py +12 -23
  410. scipy/signal/_delegators.py +568 -0
  411. scipy/signal/_filter_design.py +459 -241
  412. scipy/signal/_fir_filter_design.py +262 -90
  413. scipy/signal/_lti_conversion.py +3 -2
  414. scipy/signal/_ltisys.py +118 -91
  415. scipy/signal/_max_len_seq_inner.cp313-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp313-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp313-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp313-win_amd64.pyd +0 -0
  419. scipy/signal/_polyutils.py +172 -0
  420. scipy/signal/_short_time_fft.py +519 -70
  421. scipy/signal/_signal_api.py +30 -0
  422. scipy/signal/_signaltools.py +719 -399
  423. scipy/signal/_sigtools.cp313-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp313-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp313-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp313-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp313-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp313-win_amd64.pyd +0 -0
  430. scipy/signal/_spline_filters.py +108 -68
  431. scipy/signal/_support_alternative_backends.py +73 -0
  432. scipy/signal/_upfirdn.py +4 -1
  433. scipy/signal/_upfirdn_apply.cp313-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp313-win_amd64.pyd +0 -0
  435. scipy/signal/_waveforms.py +2 -11
  436. scipy/signal/_wavelets.py +1 -1
  437. scipy/signal/fir_filter_design.py +1 -0
  438. scipy/signal/spline.py +4 -11
  439. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  440. scipy/signal/tests/test_bsplines.py +114 -79
  441. scipy/signal/tests/test_cont2discrete.py +9 -2
  442. scipy/signal/tests/test_filter_design.py +721 -481
  443. scipy/signal/tests/test_fir_filter_design.py +332 -140
  444. scipy/signal/tests/test_savitzky_golay.py +4 -3
  445. scipy/signal/tests/test_short_time_fft.py +221 -3
  446. scipy/signal/tests/test_signaltools.py +2144 -1348
  447. scipy/signal/tests/test_spectral.py +50 -6
  448. scipy/signal/tests/test_splines.py +161 -96
  449. scipy/signal/tests/test_upfirdn.py +84 -50
  450. scipy/signal/tests/test_waveforms.py +20 -0
  451. scipy/signal/tests/test_windows.py +607 -466
  452. scipy/signal/windows/_windows.py +287 -148
  453. scipy/sparse/__init__.py +23 -4
  454. scipy/sparse/_base.py +270 -108
  455. scipy/sparse/_bsr.py +7 -4
  456. scipy/sparse/_compressed.py +59 -231
  457. scipy/sparse/_construct.py +90 -38
  458. scipy/sparse/_coo.py +115 -181
  459. scipy/sparse/_csc.py +4 -4
  460. scipy/sparse/_csparsetools.cp313-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp313-win_amd64.pyd +0 -0
  462. scipy/sparse/_csr.py +2 -2
  463. scipy/sparse/_data.py +48 -48
  464. scipy/sparse/_dia.py +105 -18
  465. scipy/sparse/_dok.py +0 -23
  466. scipy/sparse/_index.py +4 -4
  467. scipy/sparse/_matrix.py +23 -0
  468. scipy/sparse/_sparsetools.cp313-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp313-win_amd64.pyd +0 -0
  470. scipy/sparse/_sputils.py +37 -22
  471. scipy/sparse/base.py +0 -9
  472. scipy/sparse/bsr.py +0 -14
  473. scipy/sparse/compressed.py +0 -23
  474. scipy/sparse/construct.py +0 -6
  475. scipy/sparse/coo.py +0 -14
  476. scipy/sparse/csc.py +0 -3
  477. scipy/sparse/csgraph/_flow.cp313-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp313-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp313-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp313-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp313-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp313-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp313-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp313-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp313-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp313-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp313-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp313-win_amd64.pyd +0 -0
  491. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  492. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  493. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  494. scipy/sparse/csr.py +0 -5
  495. scipy/sparse/data.py +1 -6
  496. scipy/sparse/dia.py +0 -7
  497. scipy/sparse/dok.py +0 -10
  498. scipy/sparse/linalg/_dsolve/_superlu.cp313-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp313-win_amd64.pyd +0 -0
  500. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  501. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  502. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-win_amd64.pyd +0 -0
  504. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  505. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  506. scipy/sparse/linalg/_interface.py +17 -18
  507. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  508. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  509. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  510. scipy/sparse/linalg/_isolve/minres.py +5 -5
  511. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  512. scipy/sparse/linalg/_isolve/utils.py +2 -8
  513. scipy/sparse/linalg/_matfuncs.py +1 -1
  514. scipy/sparse/linalg/_norm.py +1 -1
  515. scipy/sparse/linalg/_propack/_cpropack.cp313-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp313-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp313-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp313-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp313-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp313-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp313-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp313-win_amd64.pyd +0 -0
  523. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  524. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  525. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  526. scipy/sparse/tests/test_base.py +214 -42
  527. scipy/sparse/tests/test_common1d.py +7 -7
  528. scipy/sparse/tests/test_construct.py +1 -1
  529. scipy/sparse/tests/test_coo.py +272 -4
  530. scipy/sparse/tests/test_sparsetools.py +5 -0
  531. scipy/sparse/tests/test_sputils.py +36 -7
  532. scipy/spatial/_ckdtree.cp313-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp313-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp313-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp313-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp313-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp313-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp313-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp313-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp313-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp313-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp313-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp313-win_amd64.pyd +0 -0
  544. scipy/spatial/distance.py +49 -42
  545. scipy/spatial/tests/test_distance.py +15 -1
  546. scipy/spatial/tests/test_kdtree.py +1 -0
  547. scipy/spatial/tests/test_qhull.py +7 -2
  548. scipy/spatial/transform/__init__.py +5 -3
  549. scipy/spatial/transform/_rigid_transform.cp313-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp313-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp313-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp313-win_amd64.pyd +0 -0
  553. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  554. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  555. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  556. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  557. scipy/special/__init__.py +1 -47
  558. scipy/special/_add_newdocs.py +34 -772
  559. scipy/special/_basic.py +22 -25
  560. scipy/special/_comb.cp313-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp313-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp313-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp313-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp313-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp313-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp313-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp313-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp313-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp313-win_amd64.pyd +0 -0
  572. scipy/special/_spherical_bessel.py +4 -4
  573. scipy/special/_support_alternative_backends.py +212 -119
  574. scipy/special/_test_internal.cp313-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp313-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp313-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp313-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp313-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp313-win_amd64.pyd +0 -0
  583. scipy/special/_ufuncs_cxx.pxd +2 -15
  584. scipy/special/_ufuncs_cxx.pyx +5 -44
  585. scipy/special/_ufuncs_cxx_defs.h +2 -16
  586. scipy/special/_ufuncs_defs.h +0 -8
  587. scipy/special/cython_special.cp313-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp313-win_amd64.pyd +0 -0
  589. scipy/special/cython_special.pxd +1 -1
  590. scipy/special/tests/_cython_examples/meson.build +10 -1
  591. scipy/special/tests/test_basic.py +153 -20
  592. scipy/special/tests/test_boost_ufuncs.py +3 -0
  593. scipy/special/tests/test_cdflib.py +35 -11
  594. scipy/special/tests/test_gammainc.py +16 -0
  595. scipy/special/tests/test_hyp2f1.py +2 -2
  596. scipy/special/tests/test_log1mexp.py +85 -0
  597. scipy/special/tests/test_logsumexp.py +206 -64
  598. scipy/special/tests/test_mpmath.py +1 -0
  599. scipy/special/tests/test_nan_inputs.py +1 -1
  600. scipy/special/tests/test_orthogonal.py +17 -18
  601. scipy/special/tests/test_sf_error.py +3 -2
  602. scipy/special/tests/test_sph_harm.py +6 -7
  603. scipy/special/tests/test_support_alternative_backends.py +211 -76
  604. scipy/stats/__init__.py +4 -1
  605. scipy/stats/_ansari_swilk_statistics.cp313-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp313-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp313-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp313-win_amd64.pyd +0 -0
  610. scipy/stats/_continued_fraction.py +387 -0
  611. scipy/stats/_continuous_distns.py +277 -310
  612. scipy/stats/_correlation.py +1 -1
  613. scipy/stats/_covariance.py +6 -3
  614. scipy/stats/_discrete_distns.py +39 -32
  615. scipy/stats/_distn_infrastructure.py +39 -12
  616. scipy/stats/_distribution_infrastructure.py +900 -238
  617. scipy/stats/_entropy.py +9 -10
  618. scipy/{_lib → stats}/_finite_differences.py +1 -1
  619. scipy/stats/_hypotests.py +83 -50
  620. scipy/stats/_kde.py +53 -49
  621. scipy/stats/_ksstats.py +1 -1
  622. scipy/stats/_levy_stable/__init__.py +7 -15
  623. scipy/stats/_levy_stable/levyst.cp313-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp313-win_amd64.pyd +0 -0
  625. scipy/stats/_morestats.py +118 -73
  626. scipy/stats/_mstats_basic.py +13 -17
  627. scipy/stats/_mstats_extras.py +8 -8
  628. scipy/stats/_multivariate.py +89 -113
  629. scipy/stats/_new_distributions.py +97 -20
  630. scipy/stats/_page_trend_test.py +12 -5
  631. scipy/stats/_probability_distribution.py +265 -43
  632. scipy/stats/_qmc.py +14 -9
  633. scipy/stats/_qmc_cy.cp313-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp313-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp313-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp313-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp313-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp313-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp313-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp313-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp313-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp313-win_amd64.pyd +0 -0
  647. scipy/stats/_stats_mstats_common.py +21 -2
  648. scipy/stats/_stats_py.py +550 -476
  649. scipy/stats/_stats_pythran.cp313-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp313-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp313-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp313-win_amd64.pyd +0 -0
  653. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  654. scipy/stats/_variation.py +6 -8
  655. scipy/stats/_wilcoxon.py +13 -7
  656. scipy/stats/tests/common_tests.py +6 -4
  657. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  658. scipy/stats/tests/test_continued_fraction.py +173 -0
  659. scipy/stats/tests/test_continuous.py +379 -60
  660. scipy/stats/tests/test_continuous_basic.py +18 -12
  661. scipy/stats/tests/test_discrete_basic.py +14 -8
  662. scipy/stats/tests/test_discrete_distns.py +16 -16
  663. scipy/stats/tests/test_distributions.py +95 -75
  664. scipy/stats/tests/test_entropy.py +40 -48
  665. scipy/stats/tests/test_fit.py +4 -3
  666. scipy/stats/tests/test_hypotests.py +153 -24
  667. scipy/stats/tests/test_kdeoth.py +109 -41
  668. scipy/stats/tests/test_marray.py +289 -0
  669. scipy/stats/tests/test_morestats.py +79 -47
  670. scipy/stats/tests/test_mstats_basic.py +3 -3
  671. scipy/stats/tests/test_multivariate.py +434 -83
  672. scipy/stats/tests/test_qmc.py +13 -10
  673. scipy/stats/tests/test_quantile.py +199 -0
  674. scipy/stats/tests/test_rank.py +119 -112
  675. scipy/stats/tests/test_resampling.py +47 -56
  676. scipy/stats/tests/test_sampling.py +9 -4
  677. scipy/stats/tests/test_stats.py +799 -939
  678. scipy/stats/tests/test_variation.py +8 -6
  679. scipy/version.py +2 -2
  680. scipy-1.16.0rc2.dist-info/DELVEWHEEL +2 -0
  681. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  682. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  683. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +685 -693
  684. scipy/_lib/array_api_extra/_funcs.py +0 -484
  685. scipy/_lib/array_api_extra/_typing.py +0 -8
  686. scipy/interpolate/_bspl.cp313-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp313-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp313-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp313-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp313-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp313-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp313-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp313-win_amd64.pyd +0 -0
  694. scipy/spatial/qhull_src/COPYING.txt +0 -38
  695. scipy/special/libsf_error_state.dll +0 -0
  696. scipy/special/libsf_error_state.dll.a +0 -0
  697. scipy/special/tests/test_log_softmax.py +0 -109
  698. scipy/special/tests/test_xsf_cuda.py +0 -114
  699. scipy/special/xsf/binom.h +0 -89
  700. scipy/special/xsf/cdflib.h +0 -100
  701. scipy/special/xsf/cephes/airy.h +0 -307
  702. scipy/special/xsf/cephes/besselpoly.h +0 -51
  703. scipy/special/xsf/cephes/beta.h +0 -257
  704. scipy/special/xsf/cephes/cbrt.h +0 -131
  705. scipy/special/xsf/cephes/chbevl.h +0 -85
  706. scipy/special/xsf/cephes/chdtr.h +0 -193
  707. scipy/special/xsf/cephes/const.h +0 -87
  708. scipy/special/xsf/cephes/ellie.h +0 -293
  709. scipy/special/xsf/cephes/ellik.h +0 -251
  710. scipy/special/xsf/cephes/ellpe.h +0 -107
  711. scipy/special/xsf/cephes/ellpk.h +0 -117
  712. scipy/special/xsf/cephes/expn.h +0 -260
  713. scipy/special/xsf/cephes/gamma.h +0 -398
  714. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  715. scipy/special/xsf/cephes/hyperg.h +0 -361
  716. scipy/special/xsf/cephes/i0.h +0 -149
  717. scipy/special/xsf/cephes/i1.h +0 -158
  718. scipy/special/xsf/cephes/igam.h +0 -421
  719. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  720. scipy/special/xsf/cephes/igami.h +0 -313
  721. scipy/special/xsf/cephes/j0.h +0 -225
  722. scipy/special/xsf/cephes/j1.h +0 -198
  723. scipy/special/xsf/cephes/jv.h +0 -715
  724. scipy/special/xsf/cephes/k0.h +0 -164
  725. scipy/special/xsf/cephes/k1.h +0 -163
  726. scipy/special/xsf/cephes/kn.h +0 -243
  727. scipy/special/xsf/cephes/lanczos.h +0 -112
  728. scipy/special/xsf/cephes/ndtr.h +0 -275
  729. scipy/special/xsf/cephes/poch.h +0 -85
  730. scipy/special/xsf/cephes/polevl.h +0 -167
  731. scipy/special/xsf/cephes/psi.h +0 -194
  732. scipy/special/xsf/cephes/rgamma.h +0 -111
  733. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  734. scipy/special/xsf/cephes/shichi.h +0 -248
  735. scipy/special/xsf/cephes/sici.h +0 -224
  736. scipy/special/xsf/cephes/sindg.h +0 -221
  737. scipy/special/xsf/cephes/tandg.h +0 -139
  738. scipy/special/xsf/cephes/trig.h +0 -58
  739. scipy/special/xsf/cephes/unity.h +0 -186
  740. scipy/special/xsf/cephes/zeta.h +0 -172
  741. scipy/special/xsf/config.h +0 -304
  742. scipy/special/xsf/digamma.h +0 -205
  743. scipy/special/xsf/error.h +0 -57
  744. scipy/special/xsf/evalpoly.h +0 -47
  745. scipy/special/xsf/expint.h +0 -266
  746. scipy/special/xsf/hyp2f1.h +0 -694
  747. scipy/special/xsf/iv_ratio.h +0 -173
  748. scipy/special/xsf/lambertw.h +0 -150
  749. scipy/special/xsf/loggamma.h +0 -163
  750. scipy/special/xsf/sici.h +0 -200
  751. scipy/special/xsf/tools.h +0 -427
  752. scipy/special/xsf/trig.h +0 -164
  753. scipy/special/xsf/wright_bessel.h +0 -843
  754. scipy/special/xsf/zlog1.h +0 -35
  755. scipy/stats/_mvn.cp313-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp313-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp313-cp313-win_amd64.whl → /scipy-1.16.0rc2-cp313-cp313-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -7,25 +7,51 @@ https://data-apis.org/array-api/latest/API_specification/inspection.html for
7
7
  more details.
8
8
 
9
9
  """
10
+
11
+ # pyright: reportPrivateUsage=false
12
+
13
+ from __future__ import annotations
14
+
15
+ from typing import Literal as L
16
+ from typing import TypeAlias, overload
17
+
18
+ from numpy import bool_ as bool
10
19
  from numpy import (
20
+ complex64,
21
+ complex128,
11
22
  dtype,
12
- bool_ as bool,
13
- intp,
23
+ float32,
24
+ float64,
14
25
  int8,
15
26
  int16,
16
27
  int32,
17
28
  int64,
29
+ intp,
18
30
  uint8,
19
31
  uint16,
20
32
  uint32,
21
33
  uint64,
22
- float32,
23
- float64,
24
- complex64,
25
- complex128,
26
34
  )
27
35
 
28
- from ...common._helpers import _DASK_DEVICE
36
+ from ...common._helpers import _DASK_DEVICE, _dask_device
37
+ from ...common._typing import (
38
+ Capabilities,
39
+ DefaultDTypes,
40
+ DType,
41
+ DTypeKind,
42
+ DTypesAll,
43
+ DTypesAny,
44
+ DTypesBool,
45
+ DTypesComplex,
46
+ DTypesIntegral,
47
+ DTypesNumeric,
48
+ DTypesReal,
49
+ DTypesSigned,
50
+ DTypesUnsigned,
51
+ )
52
+
53
+ _Device: TypeAlias = L["cpu"] | _dask_device
54
+
29
55
 
30
56
  class __array_namespace_info__:
31
57
  """
@@ -50,7 +76,7 @@ class __array_namespace_info__:
50
76
 
51
77
  Examples
52
78
  --------
53
- >>> info = np.__array_namespace_info__()
79
+ >>> info = xp.__array_namespace_info__()
54
80
  >>> info.default_dtypes()
55
81
  {'real floating': dask.float64,
56
82
  'complex floating': dask.complex128,
@@ -59,20 +85,31 @@ class __array_namespace_info__:
59
85
 
60
86
  """
61
87
 
62
- __module__ = 'dask.array'
88
+ __module__ = "dask.array"
63
89
 
64
- def capabilities(self):
90
+ def capabilities(self) -> Capabilities:
65
91
  """
66
92
  Return a dictionary of array API library capabilities.
67
93
 
68
94
  The resulting dictionary has the following keys:
69
95
 
70
96
  - **"boolean indexing"**: boolean indicating whether an array library
71
- supports boolean indexing. Always ``False`` for Dask.
97
+ supports boolean indexing.
98
+
99
+ Dask support boolean indexing as long as both the index
100
+ and the indexed arrays have known shapes.
101
+ Note however that the output .shape and .size properties
102
+ will contain a non-compliant math.nan instead of None.
72
103
 
73
104
  - **"data-dependent shapes"**: boolean indicating whether an array
74
- library supports data-dependent output shapes. Always ``False`` for
75
- Dask.
105
+ library supports data-dependent output shapes.
106
+
107
+ Dask implements unique_values et.al.
108
+ Note however that the output .shape and .size properties
109
+ will contain a non-compliant math.nan instead of None.
110
+
111
+ - **"max dimensions"**: integer indicating the maximum number of
112
+ dimensions supported by the array library.
76
113
 
77
114
  See
78
115
  https://data-apis.org/array-api/latest/API_specification/generated/array_api.info.capabilities.html
@@ -92,20 +129,20 @@ class __array_namespace_info__:
92
129
 
93
130
  Examples
94
131
  --------
95
- >>> info = np.__array_namespace_info__()
132
+ >>> info = xp.__array_namespace_info__()
96
133
  >>> info.capabilities()
97
134
  {'boolean indexing': True,
98
- 'data-dependent shapes': True}
135
+ 'data-dependent shapes': True,
136
+ 'max dimensions': 64}
99
137
 
100
138
  """
101
139
  return {
102
- "boolean indexing": False,
103
- "data-dependent shapes": False,
104
- # 'max rank' will be part of the 2024.12 standard
105
- # "max rank": 64,
140
+ "boolean indexing": True,
141
+ "data-dependent shapes": True,
142
+ "max dimensions": 64,
106
143
  }
107
144
 
108
- def default_device(self):
145
+ def default_device(self) -> L["cpu"]:
109
146
  """
110
147
  The default device used for new Dask arrays.
111
148
 
@@ -120,19 +157,19 @@ class __array_namespace_info__:
120
157
 
121
158
  Returns
122
159
  -------
123
- device : str
160
+ device : Device
124
161
  The default device used for new Dask arrays.
125
162
 
126
163
  Examples
127
164
  --------
128
- >>> info = np.__array_namespace_info__()
165
+ >>> info = xp.__array_namespace_info__()
129
166
  >>> info.default_device()
130
167
  'cpu'
131
168
 
132
169
  """
133
170
  return "cpu"
134
171
 
135
- def default_dtypes(self, *, device=None):
172
+ def default_dtypes(self, /, *, device: _Device | None = None) -> DefaultDTypes:
136
173
  """
137
174
  The default data types used for new Dask arrays.
138
175
 
@@ -163,7 +200,7 @@ class __array_namespace_info__:
163
200
 
164
201
  Examples
165
202
  --------
166
- >>> info = np.__array_namespace_info__()
203
+ >>> info = xp.__array_namespace_info__()
167
204
  >>> info.default_dtypes()
168
205
  {'real floating': dask.float64,
169
206
  'complex floating': dask.complex128,
@@ -173,8 +210,8 @@ class __array_namespace_info__:
173
210
  """
174
211
  if device not in ["cpu", _DASK_DEVICE, None]:
175
212
  raise ValueError(
176
- 'Device not understood. Only "cpu" or _DASK_DEVICE is allowed, but received:'
177
- f' {device}'
213
+ f'Device not understood. Only "cpu" or _DASK_DEVICE is allowed, '
214
+ f"but received: {device!r}"
178
215
  )
179
216
  return {
180
217
  "real floating": dtype(float64),
@@ -183,7 +220,41 @@ class __array_namespace_info__:
183
220
  "indexing": dtype(intp),
184
221
  }
185
222
 
186
- def dtypes(self, *, device=None, kind=None):
223
+ @overload
224
+ def dtypes(
225
+ self, /, *, device: _Device | None = None, kind: None = None
226
+ ) -> DTypesAll: ...
227
+ @overload
228
+ def dtypes(
229
+ self, /, *, device: _Device | None = None, kind: L["bool"]
230
+ ) -> DTypesBool: ...
231
+ @overload
232
+ def dtypes(
233
+ self, /, *, device: _Device | None = None, kind: L["signed integer"]
234
+ ) -> DTypesSigned: ...
235
+ @overload
236
+ def dtypes(
237
+ self, /, *, device: _Device | None = None, kind: L["unsigned integer"]
238
+ ) -> DTypesUnsigned: ...
239
+ @overload
240
+ def dtypes(
241
+ self, /, *, device: _Device | None = None, kind: L["integral"]
242
+ ) -> DTypesIntegral: ...
243
+ @overload
244
+ def dtypes(
245
+ self, /, *, device: _Device | None = None, kind: L["real floating"]
246
+ ) -> DTypesReal: ...
247
+ @overload
248
+ def dtypes(
249
+ self, /, *, device: _Device | None = None, kind: L["complex floating"]
250
+ ) -> DTypesComplex: ...
251
+ @overload
252
+ def dtypes(
253
+ self, /, *, device: _Device | None = None, kind: L["numeric"]
254
+ ) -> DTypesNumeric: ...
255
+ def dtypes(
256
+ self, /, *, device: _Device | None = None, kind: DTypeKind | None = None
257
+ ) -> DTypesAny:
187
258
  """
188
259
  The array API data types supported by Dask.
189
260
 
@@ -229,7 +300,7 @@ class __array_namespace_info__:
229
300
 
230
301
  Examples
231
302
  --------
232
- >>> info = np.__array_namespace_info__()
303
+ >>> info = xp.__array_namespace_info__()
233
304
  >>> info.dtypes(kind='signed integer')
234
305
  {'int8': dask.int8,
235
306
  'int16': dask.int16,
@@ -240,7 +311,7 @@ class __array_namespace_info__:
240
311
  if device not in ["cpu", _DASK_DEVICE, None]:
241
312
  raise ValueError(
242
313
  'Device not understood. Only "cpu" or _DASK_DEVICE is allowed, but received:'
243
- f' {device}'
314
+ f" {device}"
244
315
  )
245
316
  if kind is None:
246
317
  return {
@@ -310,14 +381,14 @@ class __array_namespace_info__:
310
381
  "complex64": dtype(complex64),
311
382
  "complex128": dtype(complex128),
312
383
  }
313
- if isinstance(kind, tuple):
314
- res = {}
384
+ if isinstance(kind, tuple): # type: ignore[reportUnnecessaryIsinstanceCall]
385
+ res: dict[str, DType] = {}
315
386
  for k in kind:
316
387
  res.update(self.dtypes(kind=k))
317
388
  return res
318
389
  raise ValueError(f"unsupported kind: {kind!r}")
319
390
 
320
- def devices(self):
391
+ def devices(self) -> list[_Device]:
321
392
  """
322
393
  The devices supported by Dask.
323
394
 
@@ -325,7 +396,7 @@ class __array_namespace_info__:
325
396
 
326
397
  Returns
327
398
  -------
328
- devices : list of str
399
+ devices : list[Device]
329
400
  The devices supported by Dask.
330
401
 
331
402
  See Also
@@ -337,7 +408,7 @@ class __array_namespace_info__:
337
408
 
338
409
  Examples
339
410
  --------
340
- >>> info = np.__array_namespace_info__()
411
+ >>> info = xp.__array_namespace_info__()
341
412
  >>> info.devices()
342
413
  ['cpu', DASK_DEVICE]
343
414
 
@@ -4,9 +4,10 @@ from dask.array.fft import * # noqa: F403
4
4
  # from dask.array.fft import __all__ as linalg_all
5
5
  _n = {}
6
6
  exec('from dask.array.fft import *', _n)
7
- del _n['__builtins__']
7
+ for k in ("__builtins__", "Sequence", "annotations", "warnings"):
8
+ _n.pop(k, None)
8
9
  fft_all = list(_n)
9
- del _n
10
+ del _n, k
10
11
 
11
12
  from ...common import _fft
12
13
  from ..._internal import get_xp
@@ -16,9 +17,5 @@ import dask.array as da
16
17
  fftfreq = get_xp(da)(_fft.fftfreq)
17
18
  rfftfreq = get_xp(da)(_fft.rfftfreq)
18
19
 
19
- __all__ = [elem for elem in fft_all if elem != "annotations"] + ["fftfreq", "rfftfreq"]
20
-
21
- del get_xp
22
- del da
23
- del fft_all
24
- del _fft
20
+ __all__ = fft_all + ["fftfreq", "rfftfreq"]
21
+ _all_ignore = ["da", "fft_all", "get_xp", "warnings"]
@@ -1,33 +1,29 @@
1
1
  from __future__ import annotations
2
2
 
3
- from ...common import _linalg
4
- from ..._internal import get_xp
3
+ from typing import Literal
5
4
 
6
- # Exports
7
- from dask.array.linalg import * # noqa: F403
8
- from dask.array import outer
5
+ import dask.array as da
9
6
 
10
- # These functions are in both the main and linalg namespaces
11
- from dask.array import matmul, tensordot
12
- from ._aliases import matrix_transpose, vecdot
7
+ # The `matmul` and `tensordot` functions are in both the main and linalg namespaces
8
+ from dask.array import matmul, outer, tensordot
13
9
 
14
- import dask.array as da
10
+ # Exports
11
+ from dask.array.linalg import * # noqa: F403
15
12
 
16
- from typing import TYPE_CHECKING
17
- if TYPE_CHECKING:
18
- from ...common._typing import Array
19
- from typing import Literal
13
+ from ..._internal import get_xp
14
+ from ...common import _linalg
15
+ from ...common._typing import Array as _Array
16
+ from ._aliases import matrix_transpose, vecdot
20
17
 
21
18
  # dask.array.linalg doesn't have __all__. If it is added, replace this with
22
19
  #
23
20
  # from dask.array.linalg import __all__ as linalg_all
24
21
  _n = {}
25
22
  exec('from dask.array.linalg import *', _n)
26
- del _n['__builtins__']
27
- if 'annotations' in _n:
28
- del _n['annotations']
23
+ for k in ('__builtins__', 'annotations', 'operator', 'warnings', 'Array'):
24
+ _n.pop(k, None)
29
25
  linalg_all = list(_n)
30
- del _n
26
+ del _n, k
31
27
 
32
28
  EighResult = _linalg.EighResult
33
29
  QRResult = _linalg.QRResult
@@ -37,8 +33,11 @@ SVDResult = _linalg.SVDResult
37
33
  # supports the mode keyword on QR
38
34
  # https://github.com/dask/dask/issues/10388
39
35
  #qr = get_xp(da)(_linalg.qr)
40
- def qr(x: Array, mode: Literal['reduced', 'complete'] = 'reduced',
41
- **kwargs) -> QRResult:
36
+ def qr(
37
+ x: _Array,
38
+ mode: Literal["reduced", "complete"] = "reduced",
39
+ **kwargs: object,
40
+ ) -> QRResult:
42
41
  if mode != "reduced":
43
42
  raise ValueError("dask arrays only support using mode='reduced'")
44
43
  return QRResult(*da.linalg.qr(x, **kwargs))
@@ -51,12 +50,12 @@ matrix_norm = get_xp(da)(_linalg.matrix_norm)
51
50
  # Wrap the svd functions to not pass full_matrices to dask
52
51
  # when full_matrices=False (as that is the default behavior for dask),
53
52
  # and dask doesn't have the full_matrices keyword
54
- def svd(x: Array, full_matrices: bool = True, **kwargs) -> SVDResult:
53
+ def svd(x: _Array, full_matrices: bool = True, **kwargs) -> SVDResult:
55
54
  if full_matrices:
56
55
  raise ValueError("full_matrics=True is not supported by dask.")
57
56
  return da.linalg.svd(x, coerce_signs=False, **kwargs)
58
57
 
59
- def svdvals(x: Array) -> Array:
58
+ def svdvals(x: _Array) -> _Array:
60
59
  # TODO: can't avoid computing U or V for dask
61
60
  _, s, _ = svd(x)
62
61
  return s
@@ -70,4 +69,4 @@ __all__ = linalg_all + ["trace", "outer", "matmul", "tensordot",
70
69
  "cholesky", "matrix_rank", "matrix_norm", "svdvals",
71
70
  "vector_norm", "diagonal"]
72
71
 
73
- _all_ignore = ['get_xp', 'da', 'linalg_all']
72
+ _all_ignore = ['get_xp', 'da', 'linalg_all', 'warnings']
@@ -1,10 +1,16 @@
1
- from numpy import * # noqa: F403
1
+ # ruff: noqa: PLC0414
2
+ from typing import Final
3
+
4
+ from numpy import * # noqa: F403 # pyright: ignore[reportWildcardImportFromLibrary]
2
5
 
3
6
  # from numpy import * doesn't overwrite these builtin names
4
- from numpy import abs, max, min, round # noqa: F401
7
+ from numpy import abs as abs
8
+ from numpy import max as max
9
+ from numpy import min as min
10
+ from numpy import round as round
5
11
 
6
12
  # These imports may overwrite names from the import * above.
7
- from ._aliases import * # noqa: F403
13
+ from ._aliases import * # noqa: F403
8
14
 
9
15
  # Don't know why, but we have to do an absolute import to import linalg. If we
10
16
  # instead do
@@ -13,18 +19,10 @@ from ._aliases import * # noqa: F403
13
19
  #
14
20
  # It doesn't overwrite np.linalg from above. The import is generated
15
21
  # dynamically so that the library can be vendored.
16
- __import__(__package__ + '.linalg')
17
-
18
- __import__(__package__ + '.fft')
19
-
20
- from .linalg import matrix_transpose, vecdot # noqa: F401
22
+ __import__(__package__ + ".linalg")
21
23
 
22
- from ..common._helpers import * # noqa: F403
24
+ __import__(__package__ + ".fft")
23
25
 
24
- try:
25
- # Used in asarray(). Not present in older versions.
26
- from numpy import _CopyMode # noqa: F401
27
- except ImportError:
28
- pass
26
+ from .linalg import matrix_transpose, vecdot # type: ignore[no-redef] # noqa: F401
29
27
 
30
- __array_api_version__ = '2023.12'
28
+ __array_api_version__: Final = "2024.12"
@@ -1,17 +1,24 @@
1
+ # pyright: reportPrivateUsage=false
1
2
  from __future__ import annotations
2
3
 
3
- from ..common import _aliases
4
+ from builtins import bool as py_bool
5
+ from typing import TYPE_CHECKING, Any, Literal, TypeAlias, cast
4
6
 
5
- from .._internal import get_xp
7
+ import numpy as np
6
8
 
9
+ from .._internal import get_xp
10
+ from ..common import _aliases, _helpers
11
+ from ..common._typing import NestedSequence, SupportsBufferProtocol
7
12
  from ._info import __array_namespace_info__
13
+ from ._typing import Array, Device, DType
8
14
 
9
- from typing import TYPE_CHECKING
10
15
  if TYPE_CHECKING:
11
- from typing import Optional, Union
12
- from ._typing import ndarray, Device, Dtype, NestedSequence, SupportsBufferProtocol
16
+ from typing_extensions import Buffer, TypeIs
17
+
18
+ # The values of the `_CopyMode` enum can be either `False`, `True`, or `2`:
19
+ # https://github.com/numpy/numpy/blob/5a8a6a79d9c2fff8f07dcab5d41e14f8508d673f/numpy/_globals.pyi#L7-L10
20
+ _Copy: TypeAlias = py_bool | Literal[2] | np._CopyMode
13
21
 
14
- import numpy as np
15
22
  bool = np.bool_
16
23
 
17
24
  # Basic renames
@@ -46,10 +53,10 @@ unique_all = get_xp(np)(_aliases.unique_all)
46
53
  unique_counts = get_xp(np)(_aliases.unique_counts)
47
54
  unique_inverse = get_xp(np)(_aliases.unique_inverse)
48
55
  unique_values = get_xp(np)(_aliases.unique_values)
49
- astype = _aliases.astype
50
56
  std = get_xp(np)(_aliases.std)
51
57
  var = get_xp(np)(_aliases.var)
52
58
  cumulative_sum = get_xp(np)(_aliases.cumulative_sum)
59
+ cumulative_prod = get_xp(np)(_aliases.cumulative_prod)
53
60
  clip = get_xp(np)(_aliases.clip)
54
61
  permute_dims = get_xp(np)(_aliases.permute_dims)
55
62
  reshape = get_xp(np)(_aliases.reshape)
@@ -63,79 +70,121 @@ matmul = get_xp(np)(_aliases.matmul)
63
70
  matrix_transpose = get_xp(np)(_aliases.matrix_transpose)
64
71
  tensordot = get_xp(np)(_aliases.tensordot)
65
72
  sign = get_xp(np)(_aliases.sign)
73
+ finfo = get_xp(np)(_aliases.finfo)
74
+ iinfo = get_xp(np)(_aliases.iinfo)
66
75
 
67
- def _supports_buffer_protocol(obj):
76
+
77
+ def _supports_buffer_protocol(obj: object) -> TypeIs[Buffer]: # pyright: ignore[reportUnusedFunction]
68
78
  try:
69
- memoryview(obj)
79
+ memoryview(obj) # pyright: ignore[reportArgumentType]
70
80
  except TypeError:
71
81
  return False
72
82
  return True
73
83
 
84
+
74
85
  # asarray also adds the copy keyword, which is not present in numpy 1.0.
75
86
  # asarray() is different enough between numpy, cupy, and dask, the logic
76
87
  # complicated enough that it's easier to define it separately for each module
77
88
  # rather than trying to combine everything into one function in common/
78
89
  def asarray(
79
- obj: Union[
80
- ndarray,
81
- bool,
82
- int,
83
- float,
84
- NestedSequence[bool | int | float],
85
- SupportsBufferProtocol,
86
- ],
90
+ obj: Array | complex | NestedSequence[complex] | SupportsBufferProtocol,
87
91
  /,
88
92
  *,
89
- dtype: Optional[Dtype] = None,
90
- device: Optional[Device] = None,
91
- copy: "Optional[Union[bool, np._CopyMode]]" = None,
92
- **kwargs,
93
- ) -> ndarray:
93
+ dtype: DType | None = None,
94
+ device: Device | None = None,
95
+ copy: _Copy | None = None,
96
+ **kwargs: Any,
97
+ ) -> Array:
94
98
  """
95
99
  Array API compatibility wrapper for asarray().
96
100
 
97
101
  See the corresponding documentation in the array library and/or the array API
98
102
  specification for more details.
99
103
  """
100
- if device not in ["cpu", None]:
101
- raise ValueError(f"Unsupported device for NumPy: {device!r}")
102
-
103
- if hasattr(np, '_CopyMode'):
104
- if copy is None:
105
- copy = np._CopyMode.IF_NEEDED
106
- elif copy is False:
107
- copy = np._CopyMode.NEVER
108
- elif copy is True:
109
- copy = np._CopyMode.ALWAYS
110
- else:
111
- # Not present in older NumPys. In this case, we cannot really support
112
- # copy=False.
113
- if copy is False:
114
- raise NotImplementedError("asarray(copy=False) requires a newer version of NumPy.")
115
-
116
- return np.array(obj, copy=copy, dtype=dtype, **kwargs)
104
+ _helpers._check_device(np, device)
105
+
106
+ if copy is None:
107
+ copy = np._CopyMode.IF_NEEDED
108
+ elif copy is False:
109
+ copy = np._CopyMode.NEVER
110
+ elif copy is True:
111
+ copy = np._CopyMode.ALWAYS
112
+
113
+ return np.array(obj, copy=copy, dtype=dtype, **kwargs) # pyright: ignore
114
+
115
+
116
+ def astype(
117
+ x: Array,
118
+ dtype: DType,
119
+ /,
120
+ *,
121
+ copy: py_bool = True,
122
+ device: Device | None = None,
123
+ ) -> Array:
124
+ _helpers._check_device(np, device)
125
+ return x.astype(dtype=dtype, copy=copy)
126
+
127
+
128
+ # count_nonzero returns a python int for axis=None and keepdims=False
129
+ # https://github.com/numpy/numpy/issues/17562
130
+ def count_nonzero(
131
+ x: Array,
132
+ axis: int | tuple[int, ...] | None = None,
133
+ keepdims: py_bool = False,
134
+ ) -> Array:
135
+ # NOTE: this is currently incorrectly typed in numpy, but will be fixed in
136
+ # numpy 2.2.5 and 2.3.0: https://github.com/numpy/numpy/pull/28750
137
+ result = cast("Any", np.count_nonzero(x, axis=axis, keepdims=keepdims)) # pyright: ignore[reportArgumentType, reportCallIssue]
138
+ if axis is None and not keepdims:
139
+ return np.asarray(result)
140
+ return result
141
+
142
+
143
+ # take_along_axis: axis defaults to -1 but in numpy axis is a required arg
144
+ def take_along_axis(x: Array, indices: Array, /, *, axis: int = -1):
145
+ return np.take_along_axis(x, indices, axis=axis)
146
+
117
147
 
118
148
  # These functions are completely new here. If the library already has them
119
149
  # (i.e., numpy 2.0), use the library version instead of our wrapper.
120
- if hasattr(np, 'vecdot'):
150
+ if hasattr(np, "vecdot"):
121
151
  vecdot = np.vecdot
122
152
  else:
123
153
  vecdot = get_xp(np)(_aliases.vecdot)
124
154
 
125
- if hasattr(np, 'isdtype'):
155
+ if hasattr(np, "isdtype"):
126
156
  isdtype = np.isdtype
127
157
  else:
128
158
  isdtype = get_xp(np)(_aliases.isdtype)
129
159
 
130
- if hasattr(np, 'unstack'):
160
+ if hasattr(np, "unstack"):
131
161
  unstack = np.unstack
132
162
  else:
133
163
  unstack = get_xp(np)(_aliases.unstack)
134
164
 
135
- __all__ = _aliases.__all__ + ['__array_namespace_info__', 'asarray', 'bool',
136
- 'acos', 'acosh', 'asin', 'asinh', 'atan',
137
- 'atan2', 'atanh', 'bitwise_left_shift',
138
- 'bitwise_invert', 'bitwise_right_shift',
139
- 'concat', 'pow']
140
-
141
- _all_ignore = ['np', 'get_xp']
165
+ __all__ = [
166
+ "__array_namespace_info__",
167
+ "asarray",
168
+ "astype",
169
+ "acos",
170
+ "acosh",
171
+ "asin",
172
+ "asinh",
173
+ "atan",
174
+ "atan2",
175
+ "atanh",
176
+ "bitwise_left_shift",
177
+ "bitwise_invert",
178
+ "bitwise_right_shift",
179
+ "bool",
180
+ "concat",
181
+ "count_nonzero",
182
+ "pow",
183
+ "take_along_axis"
184
+ ]
185
+ __all__ += _aliases.__all__
186
+ _all_ignore = ["np", "get_xp"]
187
+
188
+
189
+ def __dir__() -> list[str]:
190
+ return __all__