scipy 1.15.3__cp311-cp311-win_amd64.whl → 1.16.0rc2__cp311-cp311-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.cp311-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp311-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.cp311-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp311-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.cp311-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp311-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp311-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp311-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp311-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp311-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp311-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp311-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp311-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp311-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.cp311-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp311-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.cp311-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp311-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp311-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp311-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp311-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp311-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.cp311-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp311-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.cp311-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp311-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.cp311-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp311-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp311-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp311-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp311-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp311-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp311-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp311-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.cp311-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp311-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp311-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp311-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp311-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp311-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.cp311-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp311-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp311-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp311-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp311-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp311-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.cp311-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp311-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.cp311-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp311-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp311-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp311-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp311-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp311-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.cp311-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp311-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.cp311-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp311-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.cp311-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp311-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp311-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp311-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp311-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp311-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.cp311-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp311-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.cp311-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp311-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.cp311-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp311-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.cp311-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp311-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp311-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp311-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp311-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp311-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp311-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp311-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp311-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp311-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp311-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp311-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp311-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp311-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp311-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp311-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.cp311-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp311-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp311-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp311-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.cp311-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp311-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp311-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp311-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.cp311-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp311-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp311-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp311-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp311-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp311-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.cp311-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp311-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp311-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp311-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.cp311-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp311-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.cp311-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp311-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp311-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp311-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp311-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp311-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp311-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp311-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.cp311-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp311-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.cp311-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp311-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.cp311-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp311-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp311-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp311-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.cp311-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp311-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.cp311-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp311-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp311-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp311-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.cp311-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp311-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp311-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp311-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.cp311-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp311-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp311-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp311-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.cp311-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp311-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp311-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp311-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp311-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp311-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.cp311-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp311-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.cp311-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp311-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.cp311-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp311-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.cp311-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp311-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp311-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp311-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp311-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp311-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp311-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp311-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp311-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp311-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp311-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp311-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.cp311-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp311-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.cp311-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp311-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.cp311-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp311-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp311-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp311-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp311-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp311-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp311-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp311-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.cp311-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp311-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp311-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp311-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp311-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp311-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp311-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp311-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp311-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp311-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp311-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp311-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.cp311-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp311-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp311-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp311-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.cp311-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp311-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp311-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp311-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp311-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp311-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp311-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp311-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp311-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp311-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.cp311-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp311-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp311-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp311-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp311-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp311-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.cp311-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp311-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.cp311-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp311-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp311-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp311-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.cp311-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp311-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.cp311-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp311-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp311-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp311-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp311-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp311-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp311-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp311-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp311-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp311-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.cp311-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp311-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp311-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp311-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.cp311-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp311-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp311-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp311-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp311-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp311-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp311-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp311-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.cp311-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp311-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp311-cp311-win_amd64.whl → /scipy-1.16.0rc2-cp311-cp311-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -1,27 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
- from functools import wraps as _wraps
3
+ from functools import reduce as _reduce, wraps as _wraps
4
4
  from builtins import all as _builtin_all, any as _builtin_any
5
-
6
- from ..common._aliases import (matrix_transpose as _aliases_matrix_transpose,
7
- vecdot as _aliases_vecdot,
8
- clip as _aliases_clip,
9
- unstack as _aliases_unstack,
10
- cumulative_sum as _aliases_cumulative_sum,
11
- )
12
- from .._internal import get_xp
13
-
14
- from ._info import __array_namespace_info__
5
+ from typing import Any, List, Optional, Sequence, Tuple, Union, Literal
15
6
 
16
7
  import torch
17
8
 
18
- from typing import TYPE_CHECKING
19
- if TYPE_CHECKING:
20
- from typing import List, Optional, Sequence, Tuple, Union
21
- from ..common._typing import Device
22
- from torch import dtype as Dtype
23
-
24
- array = torch.Tensor
9
+ from .._internal import get_xp
10
+ from ..common import _aliases
11
+ from ..common._typing import NestedSequence, SupportsBufferProtocol
12
+ from ._info import __array_namespace_info__
13
+ from ._typing import Array, Device, DType
25
14
 
26
15
  _int_dtypes = {
27
16
  torch.uint8,
@@ -30,6 +19,12 @@ _int_dtypes = {
30
19
  torch.int32,
31
20
  torch.int64,
32
21
  }
22
+ try:
23
+ # torch >=2.3
24
+ _int_dtypes |= {torch.uint16, torch.uint32, torch.uint64}
25
+ except AttributeError:
26
+ pass
27
+
33
28
 
34
29
  _array_api_dtypes = {
35
30
  torch.bool,
@@ -40,47 +35,23 @@ _array_api_dtypes = {
40
35
  torch.complex128,
41
36
  }
42
37
 
43
- _promotion_table = {
44
- # bool
45
- (torch.bool, torch.bool): torch.bool,
38
+ _promotion_table = {
46
39
  # ints
47
- (torch.int8, torch.int8): torch.int8,
48
40
  (torch.int8, torch.int16): torch.int16,
49
41
  (torch.int8, torch.int32): torch.int32,
50
42
  (torch.int8, torch.int64): torch.int64,
51
- (torch.int16, torch.int8): torch.int16,
52
- (torch.int16, torch.int16): torch.int16,
53
43
  (torch.int16, torch.int32): torch.int32,
54
44
  (torch.int16, torch.int64): torch.int64,
55
- (torch.int32, torch.int8): torch.int32,
56
- (torch.int32, torch.int16): torch.int32,
57
- (torch.int32, torch.int32): torch.int32,
58
45
  (torch.int32, torch.int64): torch.int64,
59
- (torch.int64, torch.int8): torch.int64,
60
- (torch.int64, torch.int16): torch.int64,
61
- (torch.int64, torch.int32): torch.int64,
62
- (torch.int64, torch.int64): torch.int64,
63
- # uints
64
- (torch.uint8, torch.uint8): torch.uint8,
65
46
  # ints and uints (mixed sign)
66
- (torch.int8, torch.uint8): torch.int16,
67
- (torch.int16, torch.uint8): torch.int16,
68
- (torch.int32, torch.uint8): torch.int32,
69
- (torch.int64, torch.uint8): torch.int64,
70
47
  (torch.uint8, torch.int8): torch.int16,
71
48
  (torch.uint8, torch.int16): torch.int16,
72
49
  (torch.uint8, torch.int32): torch.int32,
73
50
  (torch.uint8, torch.int64): torch.int64,
74
51
  # floats
75
- (torch.float32, torch.float32): torch.float32,
76
52
  (torch.float32, torch.float64): torch.float64,
77
- (torch.float64, torch.float32): torch.float64,
78
- (torch.float64, torch.float64): torch.float64,
79
53
  # complexes
80
- (torch.complex64, torch.complex64): torch.complex64,
81
54
  (torch.complex64, torch.complex128): torch.complex128,
82
- (torch.complex128, torch.complex64): torch.complex128,
83
- (torch.complex128, torch.complex128): torch.complex128,
84
55
  # Mixed float and complex
85
56
  (torch.float32, torch.complex64): torch.complex64,
86
57
  (torch.float32, torch.complex128): torch.complex128,
@@ -88,6 +59,9 @@ _promotion_table = {
88
59
  (torch.float64, torch.complex128): torch.complex128,
89
60
  }
90
61
 
62
+ _promotion_table.update({(b, a): c for (a, b), c in _promotion_table.items()})
63
+ _promotion_table.update({(a, a): a for a in _array_api_dtypes})
64
+
91
65
 
92
66
  def _two_arg(f):
93
67
  @_wraps(f)
@@ -118,23 +92,55 @@ def _fix_promotion(x1, x2, only_scalar=True):
118
92
  x1 = x1.to(dtype)
119
93
  return x1, x2
120
94
 
121
- def result_type(*arrays_and_dtypes: Union[array, Dtype]) -> Dtype:
122
- if len(arrays_and_dtypes) == 0:
123
- raise TypeError("At least one array or dtype must be provided")
124
- if len(arrays_and_dtypes) == 1:
95
+
96
+ _py_scalars = (bool, int, float, complex)
97
+
98
+
99
+ def result_type(
100
+ *arrays_and_dtypes: Array | DType | bool | int | float | complex
101
+ ) -> DType:
102
+ num = len(arrays_and_dtypes)
103
+
104
+ if num == 0:
105
+ raise ValueError("At least one array or dtype must be provided")
106
+
107
+ elif num == 1:
125
108
  x = arrays_and_dtypes[0]
126
109
  if isinstance(x, torch.dtype):
127
110
  return x
128
111
  return x.dtype
129
- if len(arrays_and_dtypes) > 2:
130
- return result_type(arrays_and_dtypes[0], result_type(*arrays_and_dtypes[1:]))
131
112
 
132
- x, y = arrays_and_dtypes
133
- xdt = x.dtype if not isinstance(x, torch.dtype) else x
134
- ydt = y.dtype if not isinstance(y, torch.dtype) else y
113
+ if num == 2:
114
+ x, y = arrays_and_dtypes
115
+ return _result_type(x, y)
135
116
 
136
- if (xdt, ydt) in _promotion_table:
137
- return _promotion_table[xdt, ydt]
117
+ else:
118
+ # sort scalars so that they are treated last
119
+ scalars, others = [], []
120
+ for x in arrays_and_dtypes:
121
+ if isinstance(x, _py_scalars):
122
+ scalars.append(x)
123
+ else:
124
+ others.append(x)
125
+ if not others:
126
+ raise ValueError("At least one array or dtype must be provided")
127
+
128
+ # combine left-to-right
129
+ return _reduce(_result_type, others + scalars)
130
+
131
+
132
+ def _result_type(
133
+ x: Array | DType | bool | int | float | complex,
134
+ y: Array | DType | bool | int | float | complex,
135
+ ) -> DType:
136
+ if not (isinstance(x, _py_scalars) or isinstance(y, _py_scalars)):
137
+ xdt = x if isinstance(x, torch.dtype) else x.dtype
138
+ ydt = y if isinstance(y, torch.dtype) else y.dtype
139
+
140
+ try:
141
+ return _promotion_table[xdt, ydt]
142
+ except KeyError:
143
+ pass
138
144
 
139
145
  # This doesn't result_type(dtype, dtype) for non-array API dtypes
140
146
  # because torch.result_type only accepts tensors. This does however, allow
@@ -143,7 +149,8 @@ def result_type(*arrays_and_dtypes: Union[array, Dtype]) -> Dtype:
143
149
  y = torch.tensor([], dtype=y) if isinstance(y, torch.dtype) else y
144
150
  return torch.result_type(x, y)
145
151
 
146
- def can_cast(from_: Union[Dtype, array], to: Dtype, /) -> bool:
152
+
153
+ def can_cast(from_: Union[DType, Array], to: DType, /) -> bool:
147
154
  if not isinstance(from_, torch.dtype):
148
155
  from_ = from_.dtype
149
156
  return torch.can_cast(from_, to)
@@ -185,29 +192,55 @@ pow = _two_arg(torch.pow)
185
192
  remainder = _two_arg(torch.remainder)
186
193
  subtract = _two_arg(torch.subtract)
187
194
 
195
+
196
+ def asarray(
197
+ obj: (
198
+ Array
199
+ | bool | int | float | complex
200
+ | NestedSequence[bool | int | float | complex]
201
+ | SupportsBufferProtocol
202
+ ),
203
+ /,
204
+ *,
205
+ dtype: DType | None = None,
206
+ device: Device | None = None,
207
+ copy: bool | None = None,
208
+ **kwargs: Any,
209
+ ) -> Array:
210
+ # torch.asarray does not respect input->output device propagation
211
+ # https://github.com/pytorch/pytorch/issues/150199
212
+ if device is None and isinstance(obj, torch.Tensor):
213
+ device = obj.device
214
+ return torch.asarray(obj, dtype=dtype, device=device, copy=copy, **kwargs)
215
+
216
+
188
217
  # These wrappers are mostly based on the fact that pytorch uses 'dim' instead
189
218
  # of 'axis'.
190
219
 
191
220
  # torch.min and torch.max return a tuple and don't support multiple axes https://github.com/pytorch/pytorch/issues/58745
192
- def max(x: array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False) -> array:
221
+ def max(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False) -> Array:
193
222
  # https://github.com/pytorch/pytorch/issues/29137
194
223
  if axis == ():
195
224
  return torch.clone(x)
196
225
  return torch.amax(x, axis, keepdims=keepdims)
197
226
 
198
- def min(x: array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False) -> array:
227
+ def min(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False) -> Array:
199
228
  # https://github.com/pytorch/pytorch/issues/29137
200
229
  if axis == ():
201
230
  return torch.clone(x)
202
231
  return torch.amin(x, axis, keepdims=keepdims)
203
232
 
204
- clip = get_xp(torch)(_aliases_clip)
205
- unstack = get_xp(torch)(_aliases_unstack)
206
- cumulative_sum = get_xp(torch)(_aliases_cumulative_sum)
233
+ clip = get_xp(torch)(_aliases.clip)
234
+ unstack = get_xp(torch)(_aliases.unstack)
235
+ cumulative_sum = get_xp(torch)(_aliases.cumulative_sum)
236
+ cumulative_prod = get_xp(torch)(_aliases.cumulative_prod)
237
+ finfo = get_xp(torch)(_aliases.finfo)
238
+ iinfo = get_xp(torch)(_aliases.iinfo)
239
+
207
240
 
208
241
  # torch.sort also returns a tuple
209
242
  # https://github.com/pytorch/pytorch/issues/70921
210
- def sort(x: array, /, *, axis: int = -1, descending: bool = False, stable: bool = True, **kwargs) -> array:
243
+ def sort(x: Array, /, *, axis: int = -1, descending: bool = False, stable: bool = True, **kwargs) -> Array:
211
244
  return torch.sort(x, dim=axis, descending=descending, stable=stable, **kwargs).values
212
245
 
213
246
  def _normalize_axes(axis, ndim):
@@ -252,28 +285,35 @@ def _reduce_multiple_axes(f, x, axis, keepdims=False, **kwargs):
252
285
  out = torch.unsqueeze(out, a)
253
286
  return out
254
287
 
255
- def prod(x: array,
288
+
289
+ def _sum_prod_no_axis(x: Array, dtype: DType | None) -> Array:
290
+ """
291
+ Implements `sum(..., axis=())` and `prod(..., axis=())`.
292
+
293
+ Works around https://github.com/pytorch/pytorch/issues/29137
294
+ """
295
+ if dtype is not None:
296
+ return x.clone() if dtype == x.dtype else x.to(dtype)
297
+
298
+ # We can't upcast uint8 according to the spec because there is no
299
+ # torch.uint64, so at least upcast to int64 which is what prod does
300
+ # when axis=None.
301
+ if x.dtype in (torch.uint8, torch.int8, torch.int16, torch.int32):
302
+ return x.to(torch.int64)
303
+
304
+ return x.clone()
305
+
306
+
307
+ def prod(x: Array,
256
308
  /,
257
309
  *,
258
310
  axis: Optional[Union[int, Tuple[int, ...]]] = None,
259
- dtype: Optional[Dtype] = None,
311
+ dtype: Optional[DType] = None,
260
312
  keepdims: bool = False,
261
- **kwargs) -> array:
262
- x = torch.asarray(x)
263
- ndim = x.ndim
313
+ **kwargs) -> Array:
264
314
 
265
- # https://github.com/pytorch/pytorch/issues/29137. Separate from the logic
266
- # below because it still needs to upcast.
267
315
  if axis == ():
268
- if dtype is None:
269
- # We can't upcast uint8 according to the spec because there is no
270
- # torch.uint64, so at least upcast to int64 which is what sum does
271
- # when axis=None.
272
- if x.dtype in [torch.int8, torch.int16, torch.int32, torch.uint8]:
273
- return x.to(torch.int64)
274
- return x.clone()
275
- return x.to(dtype)
276
-
316
+ return _sum_prod_no_axis(x, dtype)
277
317
  # torch.prod doesn't support multiple axes
278
318
  # (https://github.com/pytorch/pytorch/issues/56586).
279
319
  if isinstance(axis, tuple):
@@ -282,51 +322,38 @@ def prod(x: array,
282
322
  # torch doesn't support keepdims with axis=None
283
323
  # (https://github.com/pytorch/pytorch/issues/71209)
284
324
  res = torch.prod(x, dtype=dtype, **kwargs)
285
- res = _axis_none_keepdims(res, ndim, keepdims)
325
+ res = _axis_none_keepdims(res, x.ndim, keepdims)
286
326
  return res
287
327
 
288
328
  return torch.prod(x, axis, dtype=dtype, keepdims=keepdims, **kwargs)
289
329
 
290
330
 
291
- def sum(x: array,
331
+ def sum(x: Array,
292
332
  /,
293
333
  *,
294
334
  axis: Optional[Union[int, Tuple[int, ...]]] = None,
295
- dtype: Optional[Dtype] = None,
335
+ dtype: Optional[DType] = None,
296
336
  keepdims: bool = False,
297
- **kwargs) -> array:
298
- x = torch.asarray(x)
299
- ndim = x.ndim
337
+ **kwargs) -> Array:
300
338
 
301
- # https://github.com/pytorch/pytorch/issues/29137.
302
- # Make sure it upcasts.
303
339
  if axis == ():
304
- if dtype is None:
305
- # We can't upcast uint8 according to the spec because there is no
306
- # torch.uint64, so at least upcast to int64 which is what sum does
307
- # when axis=None.
308
- if x.dtype in [torch.int8, torch.int16, torch.int32, torch.uint8]:
309
- return x.to(torch.int64)
310
- return x.clone()
311
- return x.to(dtype)
312
-
340
+ return _sum_prod_no_axis(x, dtype)
313
341
  if axis is None:
314
342
  # torch doesn't support keepdims with axis=None
315
343
  # (https://github.com/pytorch/pytorch/issues/71209)
316
344
  res = torch.sum(x, dtype=dtype, **kwargs)
317
- res = _axis_none_keepdims(res, ndim, keepdims)
345
+ res = _axis_none_keepdims(res, x.ndim, keepdims)
318
346
  return res
319
347
 
320
348
  return torch.sum(x, axis, dtype=dtype, keepdims=keepdims, **kwargs)
321
349
 
322
- def any(x: array,
350
+ def any(x: Array,
323
351
  /,
324
352
  *,
325
353
  axis: Optional[Union[int, Tuple[int, ...]]] = None,
326
354
  keepdims: bool = False,
327
- **kwargs) -> array:
328
- x = torch.asarray(x)
329
- ndim = x.ndim
355
+ **kwargs) -> Array:
356
+
330
357
  if axis == ():
331
358
  return x.to(torch.bool)
332
359
  # torch.any doesn't support multiple axes
@@ -338,20 +365,19 @@ def any(x: array,
338
365
  # torch doesn't support keepdims with axis=None
339
366
  # (https://github.com/pytorch/pytorch/issues/71209)
340
367
  res = torch.any(x, **kwargs)
341
- res = _axis_none_keepdims(res, ndim, keepdims)
368
+ res = _axis_none_keepdims(res, x.ndim, keepdims)
342
369
  return res.to(torch.bool)
343
370
 
344
371
  # torch.any doesn't return bool for uint8
345
372
  return torch.any(x, axis, keepdims=keepdims).to(torch.bool)
346
373
 
347
- def all(x: array,
374
+ def all(x: Array,
348
375
  /,
349
376
  *,
350
377
  axis: Optional[Union[int, Tuple[int, ...]]] = None,
351
378
  keepdims: bool = False,
352
- **kwargs) -> array:
353
- x = torch.asarray(x)
354
- ndim = x.ndim
379
+ **kwargs) -> Array:
380
+
355
381
  if axis == ():
356
382
  return x.to(torch.bool)
357
383
  # torch.all doesn't support multiple axes
@@ -363,18 +389,18 @@ def all(x: array,
363
389
  # torch doesn't support keepdims with axis=None
364
390
  # (https://github.com/pytorch/pytorch/issues/71209)
365
391
  res = torch.all(x, **kwargs)
366
- res = _axis_none_keepdims(res, ndim, keepdims)
392
+ res = _axis_none_keepdims(res, x.ndim, keepdims)
367
393
  return res.to(torch.bool)
368
394
 
369
395
  # torch.all doesn't return bool for uint8
370
396
  return torch.all(x, axis, keepdims=keepdims).to(torch.bool)
371
397
 
372
- def mean(x: array,
398
+ def mean(x: Array,
373
399
  /,
374
400
  *,
375
401
  axis: Optional[Union[int, Tuple[int, ...]]] = None,
376
402
  keepdims: bool = False,
377
- **kwargs) -> array:
403
+ **kwargs) -> Array:
378
404
  # https://github.com/pytorch/pytorch/issues/29137
379
405
  if axis == ():
380
406
  return torch.clone(x)
@@ -386,13 +412,13 @@ def mean(x: array,
386
412
  return res
387
413
  return torch.mean(x, axis, keepdims=keepdims, **kwargs)
388
414
 
389
- def std(x: array,
415
+ def std(x: Array,
390
416
  /,
391
417
  *,
392
418
  axis: Optional[Union[int, Tuple[int, ...]]] = None,
393
419
  correction: Union[int, float] = 0.0,
394
420
  keepdims: bool = False,
395
- **kwargs) -> array:
421
+ **kwargs) -> Array:
396
422
  # Note, float correction is not supported
397
423
  # https://github.com/pytorch/pytorch/issues/61492. We don't try to
398
424
  # implement it here for now.
@@ -417,13 +443,13 @@ def std(x: array,
417
443
  return res
418
444
  return torch.std(x, axis, correction=_correction, keepdims=keepdims, **kwargs)
419
445
 
420
- def var(x: array,
446
+ def var(x: Array,
421
447
  /,
422
448
  *,
423
449
  axis: Optional[Union[int, Tuple[int, ...]]] = None,
424
450
  correction: Union[int, float] = 0.0,
425
451
  keepdims: bool = False,
426
- **kwargs) -> array:
452
+ **kwargs) -> Array:
427
453
  # Note, float correction is not supported
428
454
  # https://github.com/pytorch/pytorch/issues/61492. We don't try to
429
455
  # implement it here for now.
@@ -446,11 +472,11 @@ def var(x: array,
446
472
 
447
473
  # torch.concat doesn't support dim=None
448
474
  # https://github.com/pytorch/pytorch/issues/70925
449
- def concat(arrays: Union[Tuple[array, ...], List[array]],
475
+ def concat(arrays: Union[Tuple[Array, ...], List[Array]],
450
476
  /,
451
477
  *,
452
478
  axis: Optional[int] = 0,
453
- **kwargs) -> array:
479
+ **kwargs) -> Array:
454
480
  if axis is None:
455
481
  arrays = tuple(ar.flatten() for ar in arrays)
456
482
  axis = 0
@@ -459,7 +485,7 @@ def concat(arrays: Union[Tuple[array, ...], List[array]],
459
485
  # torch.squeeze only accepts int dim and doesn't require it
460
486
  # https://github.com/pytorch/pytorch/issues/70924. Support for tuple dim was
461
487
  # added at https://github.com/pytorch/pytorch/pull/89017.
462
- def squeeze(x: array, /, axis: Union[int, Tuple[int, ...]]) -> array:
488
+ def squeeze(x: Array, /, axis: Union[int, Tuple[int, ...]]) -> Array:
463
489
  if isinstance(axis, int):
464
490
  axis = (axis,)
465
491
  for a in axis:
@@ -473,41 +499,88 @@ def squeeze(x: array, /, axis: Union[int, Tuple[int, ...]]) -> array:
473
499
  return x
474
500
 
475
501
  # torch.broadcast_to uses size instead of shape
476
- def broadcast_to(x: array, /, shape: Tuple[int, ...], **kwargs) -> array:
502
+ def broadcast_to(x: Array, /, shape: Tuple[int, ...], **kwargs) -> Array:
477
503
  return torch.broadcast_to(x, shape, **kwargs)
478
504
 
479
505
  # torch.permute uses dims instead of axes
480
- def permute_dims(x: array, /, axes: Tuple[int, ...]) -> array:
506
+ def permute_dims(x: Array, /, axes: Tuple[int, ...]) -> Array:
481
507
  return torch.permute(x, axes)
482
508
 
483
509
  # The axis parameter doesn't work for flip() and roll()
484
510
  # https://github.com/pytorch/pytorch/issues/71210. Also torch.flip() doesn't
485
511
  # accept axis=None
486
- def flip(x: array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, **kwargs) -> array:
512
+ def flip(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, **kwargs) -> Array:
487
513
  if axis is None:
488
514
  axis = tuple(range(x.ndim))
489
515
  # torch.flip doesn't accept dim as an int but the method does
490
516
  # https://github.com/pytorch/pytorch/issues/18095
491
517
  return x.flip(axis, **kwargs)
492
518
 
493
- def roll(x: array, /, shift: Union[int, Tuple[int, ...]], *, axis: Optional[Union[int, Tuple[int, ...]]] = None, **kwargs) -> array:
519
+ def roll(x: Array, /, shift: Union[int, Tuple[int, ...]], *, axis: Optional[Union[int, Tuple[int, ...]]] = None, **kwargs) -> Array:
494
520
  return torch.roll(x, shift, axis, **kwargs)
495
521
 
496
- def nonzero(x: array, /, **kwargs) -> Tuple[array, ...]:
522
+ def nonzero(x: Array, /, **kwargs) -> Tuple[Array, ...]:
497
523
  if x.ndim == 0:
498
524
  raise ValueError("nonzero() does not support zero-dimensional arrays")
499
525
  return torch.nonzero(x, as_tuple=True, **kwargs)
500
526
 
501
- def where(condition: array, x1: array, x2: array, /) -> array:
527
+
528
+ # torch uses `dim` instead of `axis`
529
+ def diff(
530
+ x: Array,
531
+ /,
532
+ *,
533
+ axis: int = -1,
534
+ n: int = 1,
535
+ prepend: Optional[Array] = None,
536
+ append: Optional[Array] = None,
537
+ ) -> Array:
538
+ return torch.diff(x, dim=axis, n=n, prepend=prepend, append=append)
539
+
540
+
541
+ # torch uses `dim` instead of `axis`, does not have keepdims
542
+ def count_nonzero(
543
+ x: Array,
544
+ /,
545
+ *,
546
+ axis: Optional[Union[int, Tuple[int, ...]]] = None,
547
+ keepdims: bool = False,
548
+ ) -> Array:
549
+ result = torch.count_nonzero(x, dim=axis)
550
+ if keepdims:
551
+ if isinstance(axis, int):
552
+ return result.unsqueeze(axis)
553
+ elif isinstance(axis, tuple):
554
+ n_axis = [x.ndim + ax if ax < 0 else ax for ax in axis]
555
+ sh = [1 if i in n_axis else x.shape[i] for i in range(x.ndim)]
556
+ return torch.reshape(result, sh)
557
+ return _axis_none_keepdims(result, x.ndim, keepdims)
558
+ else:
559
+ return result
560
+
561
+
562
+ # "repeat" is torch.repeat_interleave; also the dim argument
563
+ def repeat(x: Array, repeats: int | Array, /, *, axis: int | None = None) -> Array:
564
+ return torch.repeat_interleave(x, repeats, axis)
565
+
566
+
567
+ def where(
568
+ condition: Array,
569
+ x1: Array | bool | int | float | complex,
570
+ x2: Array | bool | int | float | complex,
571
+ /,
572
+ ) -> Array:
502
573
  x1, x2 = _fix_promotion(x1, x2)
503
574
  return torch.where(condition, x1, x2)
504
575
 
576
+
505
577
  # torch.reshape doesn't have the copy keyword
506
- def reshape(x: array,
578
+ def reshape(x: Array,
507
579
  /,
508
580
  shape: Tuple[int, ...],
581
+ *,
509
582
  copy: Optional[bool] = None,
510
- **kwargs) -> array:
583
+ **kwargs) -> Array:
511
584
  if copy is not None:
512
585
  raise NotImplementedError("torch.reshape doesn't yet support the copy keyword")
513
586
  return torch.reshape(x, shape, **kwargs)
@@ -521,9 +594,9 @@ def arange(start: Union[int, float],
521
594
  stop: Optional[Union[int, float]] = None,
522
595
  step: Union[int, float] = 1,
523
596
  *,
524
- dtype: Optional[Dtype] = None,
597
+ dtype: Optional[DType] = None,
525
598
  device: Optional[Device] = None,
526
- **kwargs) -> array:
599
+ **kwargs) -> Array:
527
600
  if stop is None:
528
601
  start, stop = 0, start
529
602
  if step > 0 and stop <= start or step < 0 and stop >= start:
@@ -542,9 +615,9 @@ def eye(n_rows: int,
542
615
  /,
543
616
  *,
544
617
  k: int = 0,
545
- dtype: Optional[Dtype] = None,
618
+ dtype: Optional[DType] = None,
546
619
  device: Optional[Device] = None,
547
- **kwargs) -> array:
620
+ **kwargs) -> Array:
548
621
  if n_cols is None:
549
622
  n_cols = n_rows
550
623
  z = torch.zeros(n_rows, n_cols, dtype=dtype, device=device, **kwargs)
@@ -558,10 +631,10 @@ def linspace(start: Union[int, float],
558
631
  /,
559
632
  num: int,
560
633
  *,
561
- dtype: Optional[Dtype] = None,
634
+ dtype: Optional[DType] = None,
562
635
  device: Optional[Device] = None,
563
636
  endpoint: bool = True,
564
- **kwargs) -> array:
637
+ **kwargs) -> Array:
565
638
  if not endpoint:
566
639
  return torch.linspace(start, stop, num+1, dtype=dtype, device=device, **kwargs)[:-1]
567
640
  return torch.linspace(start, stop, num, dtype=dtype, device=device, **kwargs)
@@ -569,11 +642,11 @@ def linspace(start: Union[int, float],
569
642
  # torch.full does not accept an int size
570
643
  # https://github.com/pytorch/pytorch/issues/70906
571
644
  def full(shape: Union[int, Tuple[int, ...]],
572
- fill_value: Union[bool, int, float, complex],
645
+ fill_value: bool | int | float | complex,
573
646
  *,
574
- dtype: Optional[Dtype] = None,
647
+ dtype: Optional[DType] = None,
575
648
  device: Optional[Device] = None,
576
- **kwargs) -> array:
649
+ **kwargs) -> Array:
577
650
  if isinstance(shape, int):
578
651
  shape = (shape,)
579
652
 
@@ -582,41 +655,52 @@ def full(shape: Union[int, Tuple[int, ...]],
582
655
  # ones, zeros, and empty do not accept shape as a keyword argument
583
656
  def ones(shape: Union[int, Tuple[int, ...]],
584
657
  *,
585
- dtype: Optional[Dtype] = None,
658
+ dtype: Optional[DType] = None,
586
659
  device: Optional[Device] = None,
587
- **kwargs) -> array:
660
+ **kwargs) -> Array:
588
661
  return torch.ones(shape, dtype=dtype, device=device, **kwargs)
589
662
 
590
663
  def zeros(shape: Union[int, Tuple[int, ...]],
591
664
  *,
592
- dtype: Optional[Dtype] = None,
665
+ dtype: Optional[DType] = None,
593
666
  device: Optional[Device] = None,
594
- **kwargs) -> array:
667
+ **kwargs) -> Array:
595
668
  return torch.zeros(shape, dtype=dtype, device=device, **kwargs)
596
669
 
597
670
  def empty(shape: Union[int, Tuple[int, ...]],
598
671
  *,
599
- dtype: Optional[Dtype] = None,
672
+ dtype: Optional[DType] = None,
600
673
  device: Optional[Device] = None,
601
- **kwargs) -> array:
674
+ **kwargs) -> Array:
602
675
  return torch.empty(shape, dtype=dtype, device=device, **kwargs)
603
676
 
604
677
  # tril and triu do not call the keyword argument k
605
678
 
606
- def tril(x: array, /, *, k: int = 0) -> array:
679
+ def tril(x: Array, /, *, k: int = 0) -> Array:
607
680
  return torch.tril(x, k)
608
681
 
609
- def triu(x: array, /, *, k: int = 0) -> array:
682
+ def triu(x: Array, /, *, k: int = 0) -> Array:
610
683
  return torch.triu(x, k)
611
684
 
612
685
  # Functions that aren't in torch https://github.com/pytorch/pytorch/issues/58742
613
- def expand_dims(x: array, /, *, axis: int = 0) -> array:
686
+ def expand_dims(x: Array, /, *, axis: int = 0) -> Array:
614
687
  return torch.unsqueeze(x, axis)
615
688
 
616
- def astype(x: array, dtype: Dtype, /, *, copy: bool = True) -> array:
617
- return x.to(dtype, copy=copy)
618
689
 
619
- def broadcast_arrays(*arrays: array) -> List[array]:
690
+ def astype(
691
+ x: Array,
692
+ dtype: DType,
693
+ /,
694
+ *,
695
+ copy: bool = True,
696
+ device: Optional[Device] = None,
697
+ ) -> Array:
698
+ if device is not None:
699
+ return x.to(device, dtype=dtype, copy=copy)
700
+ return x.to(dtype=dtype, copy=copy)
701
+
702
+
703
+ def broadcast_arrays(*arrays: Array) -> List[Array]:
620
704
  shape = torch.broadcast_shapes(*[a.shape for a in arrays])
621
705
  return [torch.broadcast_to(a, shape) for a in arrays]
622
706
 
@@ -626,7 +710,7 @@ from ..common._aliases import (UniqueAllResult, UniqueCountsResult,
626
710
  UniqueInverseResult)
627
711
 
628
712
  # https://github.com/pytorch/pytorch/issues/70920
629
- def unique_all(x: array) -> UniqueAllResult:
713
+ def unique_all(x: Array) -> UniqueAllResult:
630
714
  # torch.unique doesn't support returning indices.
631
715
  # https://github.com/pytorch/pytorch/issues/36748. The workaround
632
716
  # suggested in that issue doesn't actually function correctly (it relies
@@ -639,7 +723,7 @@ def unique_all(x: array) -> UniqueAllResult:
639
723
  # counts[torch.isnan(values)] = 1
640
724
  # return UniqueAllResult(values, indices, inverse_indices, counts)
641
725
 
642
- def unique_counts(x: array) -> UniqueCountsResult:
726
+ def unique_counts(x: Array) -> UniqueCountsResult:
643
727
  values, counts = torch.unique(x, return_counts=True)
644
728
 
645
729
  # torch.unique incorrectly gives a 0 count for nan values.
@@ -647,27 +731,34 @@ def unique_counts(x: array) -> UniqueCountsResult:
647
731
  counts[torch.isnan(values)] = 1
648
732
  return UniqueCountsResult(values, counts)
649
733
 
650
- def unique_inverse(x: array) -> UniqueInverseResult:
734
+ def unique_inverse(x: Array) -> UniqueInverseResult:
651
735
  values, inverse = torch.unique(x, return_inverse=True)
652
736
  return UniqueInverseResult(values, inverse)
653
737
 
654
- def unique_values(x: array) -> array:
738
+ def unique_values(x: Array) -> Array:
655
739
  return torch.unique(x)
656
740
 
657
- def matmul(x1: array, x2: array, /, **kwargs) -> array:
741
+ def matmul(x1: Array, x2: Array, /, **kwargs) -> Array:
658
742
  # torch.matmul doesn't type promote (but differently from _fix_promotion)
659
743
  x1, x2 = _fix_promotion(x1, x2, only_scalar=False)
660
744
  return torch.matmul(x1, x2, **kwargs)
661
745
 
662
- matrix_transpose = get_xp(torch)(_aliases_matrix_transpose)
663
- _vecdot = get_xp(torch)(_aliases_vecdot)
746
+ matrix_transpose = get_xp(torch)(_aliases.matrix_transpose)
747
+ _vecdot = get_xp(torch)(_aliases.vecdot)
664
748
 
665
- def vecdot(x1: array, x2: array, /, *, axis: int = -1) -> array:
749
+ def vecdot(x1: Array, x2: Array, /, *, axis: int = -1) -> Array:
666
750
  x1, x2 = _fix_promotion(x1, x2, only_scalar=False)
667
751
  return _vecdot(x1, x2, axis=axis)
668
752
 
669
753
  # torch.tensordot uses dims instead of axes
670
- def tensordot(x1: array, x2: array, /, *, axes: Union[int, Tuple[Sequence[int], Sequence[int]]] = 2, **kwargs) -> array:
754
+ def tensordot(
755
+ x1: Array,
756
+ x2: Array,
757
+ /,
758
+ *,
759
+ axes: Union[int, Tuple[Sequence[int], Sequence[int]]] = 2,
760
+ **kwargs,
761
+ ) -> Array:
671
762
  # Note: torch.tensordot fails with integer dtypes when there is only 1
672
763
  # element in the axis (https://github.com/pytorch/pytorch/issues/84530).
673
764
  x1, x2 = _fix_promotion(x1, x2, only_scalar=False)
@@ -675,7 +766,7 @@ def tensordot(x1: array, x2: array, /, *, axes: Union[int, Tuple[Sequence[int],
675
766
 
676
767
 
677
768
  def isdtype(
678
- dtype: Dtype, kind: Union[Dtype, str, Tuple[Union[Dtype, str], ...]],
769
+ dtype: DType, kind: Union[DType, str, Tuple[Union[DType, str], ...]],
679
770
  *, _tuple=True, # Disallow nested tuples
680
771
  ) -> bool:
681
772
  """
@@ -710,14 +801,19 @@ def isdtype(
710
801
  else:
711
802
  return dtype == kind
712
803
 
713
- def take(x: array, indices: array, /, *, axis: Optional[int] = None, **kwargs) -> array:
804
+ def take(x: Array, indices: Array, /, *, axis: Optional[int] = None, **kwargs) -> Array:
714
805
  if axis is None:
715
806
  if x.ndim != 1:
716
807
  raise ValueError("axis must be specified when ndim > 1")
717
808
  axis = 0
718
809
  return torch.index_select(x, axis, indices, **kwargs)
719
810
 
720
- def sign(x: array, /) -> array:
811
+
812
+ def take_along_axis(x: Array, indices: Array, /, *, axis: int = -1) -> Array:
813
+ return torch.take_along_dim(x, indices, dim=axis)
814
+
815
+
816
+ def sign(x: Array, /) -> Array:
721
817
  # torch sign() does not support complex numbers and does not propagate
722
818
  # nans. See https://github.com/data-apis/array-api-compat/issues/136
723
819
  if x.dtype.is_complex:
@@ -732,14 +828,21 @@ def sign(x: array, /) -> array:
732
828
  return out
733
829
 
734
830
 
735
- __all__ = ['__array_namespace_info__', 'result_type', 'can_cast',
831
+ def meshgrid(*arrays: Array, indexing: Literal['xy', 'ij'] = 'xy') -> List[Array]:
832
+ # enforce the default of 'xy'
833
+ # TODO: is the return type a list or a tuple
834
+ return list(torch.meshgrid(*arrays, indexing='xy'))
835
+
836
+
837
+ __all__ = ['__array_namespace_info__', 'asarray', 'result_type', 'can_cast',
736
838
  'permute_dims', 'bitwise_invert', 'newaxis', 'conj', 'add',
737
839
  'atan2', 'bitwise_and', 'bitwise_left_shift', 'bitwise_or',
738
- 'bitwise_right_shift', 'bitwise_xor', 'copysign', 'divide',
840
+ 'bitwise_right_shift', 'bitwise_xor', 'copysign', 'count_nonzero',
841
+ 'diff', 'divide',
739
842
  'equal', 'floor_divide', 'greater', 'greater_equal', 'hypot',
740
843
  'less', 'less_equal', 'logaddexp', 'maximum', 'minimum',
741
844
  'multiply', 'not_equal', 'pow', 'remainder', 'subtract', 'max',
742
- 'min', 'clip', 'unstack', 'cumulative_sum', 'sort', 'prod', 'sum',
845
+ 'min', 'clip', 'unstack', 'cumulative_sum', 'cumulative_prod', 'sort', 'prod', 'sum',
743
846
  'any', 'all', 'mean', 'std', 'var', 'concat', 'squeeze',
744
847
  'broadcast_to', 'flip', 'roll', 'nonzero', 'where', 'reshape',
745
848
  'arange', 'eye', 'linspace', 'full', 'ones', 'zeros', 'empty',
@@ -747,6 +850,6 @@ __all__ = ['__array_namespace_info__', 'result_type', 'can_cast',
747
850
  'UniqueAllResult', 'UniqueCountsResult', 'UniqueInverseResult',
748
851
  'unique_all', 'unique_counts', 'unique_inverse', 'unique_values',
749
852
  'matmul', 'matrix_transpose', 'vecdot', 'tensordot', 'isdtype',
750
- 'take', 'sign']
853
+ 'take', 'take_along_axis', 'sign', 'finfo', 'iinfo', 'repeat', 'meshgrid']
751
854
 
752
855
  _all_ignore = ['torch', 'get_xp']