scipy 1.15.3__cp311-cp311-win_amd64.whl → 1.16.0rc1__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 (758) hide show
  1. scipy/__config__.py +7 -7
  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 +433 -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 +337 -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 +5 -5
  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 +221 -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 +19 -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 +207 -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 +3 -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 +4 -3
  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/_covariance.py +6 -3
  613. scipy/stats/_discrete_distns.py +39 -32
  614. scipy/stats/_distn_infrastructure.py +39 -12
  615. scipy/stats/_distribution_infrastructure.py +900 -238
  616. scipy/stats/_entropy.py +7 -8
  617. scipy/{_lib → stats}/_finite_differences.py +1 -1
  618. scipy/stats/_hypotests.py +82 -49
  619. scipy/stats/_kde.py +53 -49
  620. scipy/stats/_ksstats.py +1 -1
  621. scipy/stats/_levy_stable/__init__.py +7 -15
  622. scipy/stats/_levy_stable/levyst.cp311-win_amd64.dll.a +0 -0
  623. scipy/stats/_levy_stable/levyst.cp311-win_amd64.pyd +0 -0
  624. scipy/stats/_morestats.py +112 -67
  625. scipy/stats/_mstats_basic.py +13 -17
  626. scipy/stats/_mstats_extras.py +8 -8
  627. scipy/stats/_multivariate.py +89 -113
  628. scipy/stats/_new_distributions.py +97 -20
  629. scipy/stats/_page_trend_test.py +12 -5
  630. scipy/stats/_probability_distribution.py +265 -43
  631. scipy/stats/_qmc.py +14 -9
  632. scipy/stats/_qmc_cy.cp311-win_amd64.dll.a +0 -0
  633. scipy/stats/_qmc_cy.cp311-win_amd64.pyd +0 -0
  634. scipy/stats/_qmvnt.py +16 -95
  635. scipy/stats/_qmvnt_cy.cp311-win_amd64.dll.a +0 -0
  636. scipy/stats/_qmvnt_cy.cp311-win_amd64.pyd +0 -0
  637. scipy/stats/_quantile.py +335 -0
  638. scipy/stats/_rcont/rcont.cp311-win_amd64.dll.a +0 -0
  639. scipy/stats/_rcont/rcont.cp311-win_amd64.pyd +0 -0
  640. scipy/stats/_resampling.py +4 -29
  641. scipy/stats/_sampling.py +1 -1
  642. scipy/stats/_sobol.cp311-win_amd64.dll.a +0 -0
  643. scipy/stats/_sobol.cp311-win_amd64.pyd +0 -0
  644. scipy/stats/_stats.cp311-win_amd64.dll.a +0 -0
  645. scipy/stats/_stats.cp311-win_amd64.pyd +0 -0
  646. scipy/stats/_stats_mstats_common.py +19 -2
  647. scipy/stats/_stats_py.py +534 -460
  648. scipy/stats/_stats_pythran.cp311-win_amd64.dll.a +0 -0
  649. scipy/stats/_stats_pythran.cp311-win_amd64.pyd +0 -0
  650. scipy/stats/_unuran/unuran_wrapper.cp311-win_amd64.dll.a +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp311-win_amd64.pyd +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  653. scipy/stats/_variation.py +5 -7
  654. scipy/stats/_wilcoxon.py +13 -7
  655. scipy/stats/tests/common_tests.py +6 -4
  656. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  657. scipy/stats/tests/test_continued_fraction.py +173 -0
  658. scipy/stats/tests/test_continuous.py +379 -60
  659. scipy/stats/tests/test_continuous_basic.py +18 -12
  660. scipy/stats/tests/test_discrete_basic.py +14 -8
  661. scipy/stats/tests/test_discrete_distns.py +16 -16
  662. scipy/stats/tests/test_distributions.py +95 -75
  663. scipy/stats/tests/test_entropy.py +40 -48
  664. scipy/stats/tests/test_fit.py +4 -3
  665. scipy/stats/tests/test_hypotests.py +153 -24
  666. scipy/stats/tests/test_kdeoth.py +109 -41
  667. scipy/stats/tests/test_marray.py +289 -0
  668. scipy/stats/tests/test_morestats.py +79 -47
  669. scipy/stats/tests/test_mstats_basic.py +3 -3
  670. scipy/stats/tests/test_multivariate.py +434 -83
  671. scipy/stats/tests/test_qmc.py +13 -10
  672. scipy/stats/tests/test_quantile.py +199 -0
  673. scipy/stats/tests/test_rank.py +119 -112
  674. scipy/stats/tests/test_resampling.py +47 -56
  675. scipy/stats/tests/test_sampling.py +9 -4
  676. scipy/stats/tests/test_stats.py +799 -939
  677. scipy/stats/tests/test_variation.py +8 -6
  678. scipy/version.py +2 -2
  679. scipy-1.16.0rc1.dist-info/DELVEWHEEL +2 -0
  680. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/LICENSE.txt +1 -1
  681. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/METADATA +8 -8
  682. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/RECORD +684 -692
  683. scipy/_lib/array_api_extra/_funcs.py +0 -484
  684. scipy/_lib/array_api_extra/_typing.py +0 -8
  685. scipy/interpolate/_bspl.cp311-win_amd64.dll.a +0 -0
  686. scipy/interpolate/_bspl.cp311-win_amd64.pyd +0 -0
  687. scipy/optimize/_cobyla.cp311-win_amd64.dll.a +0 -0
  688. scipy/optimize/_cobyla.cp311-win_amd64.pyd +0 -0
  689. scipy/optimize/_cython_nnls.cp311-win_amd64.dll.a +0 -0
  690. scipy/optimize/_cython_nnls.cp311-win_amd64.pyd +0 -0
  691. scipy/optimize/_slsqp.cp311-win_amd64.dll.a +0 -0
  692. scipy/optimize/_slsqp.cp311-win_amd64.pyd +0 -0
  693. scipy/spatial/qhull_src/COPYING.txt +0 -38
  694. scipy/special/libsf_error_state.dll +0 -0
  695. scipy/special/libsf_error_state.dll.a +0 -0
  696. scipy/special/tests/test_log_softmax.py +0 -109
  697. scipy/special/tests/test_xsf_cuda.py +0 -114
  698. scipy/special/xsf/binom.h +0 -89
  699. scipy/special/xsf/cdflib.h +0 -100
  700. scipy/special/xsf/cephes/airy.h +0 -307
  701. scipy/special/xsf/cephes/besselpoly.h +0 -51
  702. scipy/special/xsf/cephes/beta.h +0 -257
  703. scipy/special/xsf/cephes/cbrt.h +0 -131
  704. scipy/special/xsf/cephes/chbevl.h +0 -85
  705. scipy/special/xsf/cephes/chdtr.h +0 -193
  706. scipy/special/xsf/cephes/const.h +0 -87
  707. scipy/special/xsf/cephes/ellie.h +0 -293
  708. scipy/special/xsf/cephes/ellik.h +0 -251
  709. scipy/special/xsf/cephes/ellpe.h +0 -107
  710. scipy/special/xsf/cephes/ellpk.h +0 -117
  711. scipy/special/xsf/cephes/expn.h +0 -260
  712. scipy/special/xsf/cephes/gamma.h +0 -398
  713. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  714. scipy/special/xsf/cephes/hyperg.h +0 -361
  715. scipy/special/xsf/cephes/i0.h +0 -149
  716. scipy/special/xsf/cephes/i1.h +0 -158
  717. scipy/special/xsf/cephes/igam.h +0 -421
  718. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  719. scipy/special/xsf/cephes/igami.h +0 -313
  720. scipy/special/xsf/cephes/j0.h +0 -225
  721. scipy/special/xsf/cephes/j1.h +0 -198
  722. scipy/special/xsf/cephes/jv.h +0 -715
  723. scipy/special/xsf/cephes/k0.h +0 -164
  724. scipy/special/xsf/cephes/k1.h +0 -163
  725. scipy/special/xsf/cephes/kn.h +0 -243
  726. scipy/special/xsf/cephes/lanczos.h +0 -112
  727. scipy/special/xsf/cephes/ndtr.h +0 -275
  728. scipy/special/xsf/cephes/poch.h +0 -85
  729. scipy/special/xsf/cephes/polevl.h +0 -167
  730. scipy/special/xsf/cephes/psi.h +0 -194
  731. scipy/special/xsf/cephes/rgamma.h +0 -111
  732. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  733. scipy/special/xsf/cephes/shichi.h +0 -248
  734. scipy/special/xsf/cephes/sici.h +0 -224
  735. scipy/special/xsf/cephes/sindg.h +0 -221
  736. scipy/special/xsf/cephes/tandg.h +0 -139
  737. scipy/special/xsf/cephes/trig.h +0 -58
  738. scipy/special/xsf/cephes/unity.h +0 -186
  739. scipy/special/xsf/cephes/zeta.h +0 -172
  740. scipy/special/xsf/config.h +0 -304
  741. scipy/special/xsf/digamma.h +0 -205
  742. scipy/special/xsf/error.h +0 -57
  743. scipy/special/xsf/evalpoly.h +0 -47
  744. scipy/special/xsf/expint.h +0 -266
  745. scipy/special/xsf/hyp2f1.h +0 -694
  746. scipy/special/xsf/iv_ratio.h +0 -173
  747. scipy/special/xsf/lambertw.h +0 -150
  748. scipy/special/xsf/loggamma.h +0 -163
  749. scipy/special/xsf/sici.h +0 -200
  750. scipy/special/xsf/tools.h +0 -427
  751. scipy/special/xsf/trig.h +0 -164
  752. scipy/special/xsf/wright_bessel.h +0 -843
  753. scipy/special/xsf/zlog1.h +0 -35
  754. scipy/stats/_mvn.cp311-win_amd64.dll.a +0 -0
  755. scipy/stats/_mvn.cp311-win_amd64.pyd +0 -0
  756. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  757. /scipy-1.15.3-cp311-cp311-win_amd64.whl → /scipy-1.16.0rc1-cp311-cp311-win_amd64.whl +0 -0
  758. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/WHEEL +0 -0
@@ -28,6 +28,9 @@ import random
28
28
  from numpy.testing import (assert_equal, assert_array_equal,
29
29
  assert_array_almost_equal, assert_almost_equal, assert_,
30
30
  assert_allclose, suppress_warnings)
31
+ from numpy.exceptions import ComplexWarning
32
+
33
+ from types import GenericAlias
31
34
 
32
35
  import scipy.linalg
33
36
 
@@ -36,14 +39,13 @@ from scipy.sparse import (csc_matrix, csr_matrix, dok_matrix,
36
39
  coo_matrix, lil_matrix, dia_matrix, bsr_matrix,
37
40
  csc_array, csr_array, dok_array,
38
41
  coo_array, lil_array, dia_array, bsr_array,
39
- eye, issparse, SparseEfficiencyWarning, sparray)
42
+ eye, issparse, SparseEfficiencyWarning, sparray, spmatrix)
40
43
  from scipy.sparse._base import _formats
41
44
  from scipy.sparse._sputils import (supported_dtypes, isscalarlike,
42
45
  get_index_dtype, asmatrix, matrix)
43
46
  from scipy.sparse.linalg import splu, expm, inv
44
47
 
45
48
  from scipy._lib.decorator import decorator
46
- from scipy._lib._util import ComplexWarning
47
49
 
48
50
  IS_COLAB = ('google.colab' in sys.modules)
49
51
 
@@ -1021,10 +1023,8 @@ class _TestCommon:
1021
1023
  assert_array_almost_equal(dat.sum(), datsp.sum())
1022
1024
  assert_equal(dat.sum().dtype, datsp.sum().dtype)
1023
1025
  assert_(np.isscalar(datsp.sum(axis=None)))
1024
- assert_array_almost_equal(dat.sum(axis=None),
1025
- datsp.sum(axis=None))
1026
- assert_equal(dat.sum(axis=None).dtype,
1027
- datsp.sum(axis=None).dtype)
1026
+ assert_array_almost_equal(dat.sum(axis=None), datsp.sum(axis=None))
1027
+ assert_equal(dat.sum(axis=None).dtype, datsp.sum(axis=None).dtype)
1028
1028
  assert_array_almost_equal(dat.sum(axis=0), datsp.sum(axis=0))
1029
1029
  assert_equal(dat.sum(axis=0).dtype, datsp.sum(axis=0).dtype)
1030
1030
  assert_array_almost_equal(dat.sum(axis=1), datsp.sum(axis=1))
@@ -1033,6 +1033,8 @@ class _TestCommon:
1033
1033
  assert_equal(dat.sum(axis=-2).dtype, datsp.sum(axis=-2).dtype)
1034
1034
  assert_array_almost_equal(dat.sum(axis=-1), datsp.sum(axis=-1))
1035
1035
  assert_equal(dat.sum(axis=-1).dtype, datsp.sum(axis=-1).dtype)
1036
+ assert_array_almost_equal(dat.sum(axis=(0, 1)), datsp.sum(axis=(0, 1)))
1037
+ assert_equal(dat.sum(axis=(0, 1)).dtype, datsp.sum(axis=(0, 1)).dtype)
1036
1038
 
1037
1039
  for dtype in self.checked_dtypes:
1038
1040
  for j in range(len(matrices)):
@@ -1045,10 +1047,15 @@ class _TestCommon:
1045
1047
  [-6, 7, 9]])
1046
1048
  datsp = self.spcreator(dat)
1047
1049
 
1048
- assert_raises(ValueError, datsp.sum, axis=3)
1049
- assert_raises(TypeError, datsp.sum, axis=(0, 1))
1050
- assert_raises(TypeError, datsp.sum, axis=1.5)
1051
- assert_raises(ValueError, datsp.sum, axis=1, out=out)
1050
+ with assert_raises(ValueError, match="axis out of range"):
1051
+ datsp.sum(axis=3)
1052
+ with assert_raises(ValueError, match="axis out of range"):
1053
+ datsp.sum(axis=(0, 3))
1054
+ with assert_raises(TypeError, match="axis must be an integer"):
1055
+ datsp.sum(axis=1.5)
1056
+ # error msg varies by sparray (1d result) or spmatrix (2d result)
1057
+ with assert_raises(ValueError, match="do.*n.t match.*shape|wrong.*dimensions"):
1058
+ datsp.mean(axis=1, out=out)
1052
1059
 
1053
1060
  def test_sum_dtype(self):
1054
1061
  dat = array([[0, 1, 2],
@@ -1088,9 +1095,9 @@ class _TestCommon:
1088
1095
  assert_array_almost_equal(dat_out, datsp_out)
1089
1096
 
1090
1097
  # check that wrong shape out parameter raises
1091
- with assert_raises(ValueError, match="output parameter.*wrong.*dimension"):
1098
+ with assert_raises(ValueError, match="output parameter"):
1092
1099
  datsp.sum(out=array([0]))
1093
- with assert_raises(ValueError, match="output parameter.*wrong.*dimension"):
1100
+ with assert_raises(ValueError, match="output parameter"):
1094
1101
  datsp.sum(out=array([[0]] if self.is_array_test else 0))
1095
1102
 
1096
1103
  def test_numpy_sum(self):
@@ -1106,6 +1113,21 @@ class _TestCommon:
1106
1113
  assert_array_almost_equal(dat_sum, datsp_sum)
1107
1114
  assert_equal(dat_sum.dtype, datsp_sum.dtype)
1108
1115
 
1116
+ def test_sum_mean_container_type(self):
1117
+ dat = array([[0, 1, 2],
1118
+ [3, -4, 5],
1119
+ [-6, 7, 9]])
1120
+ datsp = self.spcreator(dat)
1121
+
1122
+ assert isscalarlike(datsp.sum())
1123
+ matrix_or_array = ndarray if self.is_array_test else np.matrix
1124
+ assert isinstance(datsp.sum(axis=0), matrix_or_array)
1125
+ assert isinstance(datsp.sum(axis=1), matrix_or_array)
1126
+
1127
+ assert isscalarlike(datsp.mean())
1128
+ assert isinstance(datsp.mean(axis=0), matrix_or_array)
1129
+ assert isinstance(datsp.mean(axis=1), matrix_or_array)
1130
+
1109
1131
  def test_mean(self):
1110
1132
  keep = not self.is_array_test
1111
1133
  def check(dtype):
@@ -1137,21 +1159,31 @@ class _TestCommon:
1137
1159
  dat.mean(axis=-1, keepdims=keep), datsp.mean(axis=-1)
1138
1160
  )
1139
1161
  assert_equal(dat.mean(axis=-1).dtype, datsp.mean(axis=-1).dtype)
1162
+ assert_array_almost_equal(
1163
+ dat.mean(axis=(0, 1), keepdims=keep), datsp.mean(axis=(0, 1))
1164
+ )
1165
+ assert_equal(dat.mean(axis=(0, 1)).dtype, datsp.mean(axis=(0, 1)).dtype)
1166
+
1140
1167
 
1141
1168
  for dtype in self.checked_dtypes:
1142
1169
  check(dtype)
1143
1170
 
1144
- def test_mean_invalid_params(self):
1171
+ def test_mean_invalid_param(self):
1145
1172
  out = self.asdense(np.zeros((1, 3)))
1146
1173
  dat = array([[0, 1, 2],
1147
1174
  [3, -4, 5],
1148
1175
  [-6, 7, 9]])
1149
1176
  datsp = self.spcreator(dat)
1150
1177
 
1151
- assert_raises(ValueError, datsp.mean, axis=3)
1152
- assert_raises(TypeError, datsp.mean, axis=(0, 1))
1153
- assert_raises(TypeError, datsp.mean, axis=1.5)
1154
- assert_raises(ValueError, datsp.mean, axis=1, out=out)
1178
+ with assert_raises(ValueError, match="axis out of range"):
1179
+ datsp.mean(axis=3)
1180
+ with assert_raises(ValueError, match="axis out of range"):
1181
+ datsp.mean(axis=(0, 3))
1182
+ with assert_raises(TypeError, match="axis must be an integer"):
1183
+ datsp.mean(axis=1.5)
1184
+ # error msg varies by sparray (1d result) or spmatrix (2d result)
1185
+ with assert_raises(ValueError, match="do.*n.t match.*shape|wrong.*dimensions"):
1186
+ datsp.mean(axis=1, out=out)
1155
1187
 
1156
1188
  def test_mean_dtype(self):
1157
1189
  dat = array([[0, 1, 2],
@@ -1649,7 +1681,10 @@ class _TestCommon:
1649
1681
  except ValueError:
1650
1682
  assert_raises(ValueError, i.multiply, j)
1651
1683
  continue
1652
- sp_mult = i.multiply(j)
1684
+ try:
1685
+ sp_mult = i.multiply(j)
1686
+ except ValueError:
1687
+ continue
1653
1688
  if issparse(sp_mult):
1654
1689
  assert_almost_equal(sp_mult.toarray(), dense_mult)
1655
1690
  else:
@@ -1695,13 +1730,7 @@ class _TestCommon:
1695
1730
  B = self.spcreator(A)
1696
1731
 
1697
1732
  if self.is_array_test: # sparrays use element-wise power
1698
- # Todo: Add 1+3j to tested exponent list when np1.24 is no longer supported
1699
- # Complex exponents of 0 (our implicit fill value) change in numpy-1.25
1700
- # from `(nan+nanj)` to `0`. Old value makes array element-wise result
1701
- # dense and is hard to check for without any `isnan` method.
1702
- # So while untested here, element-wise complex exponents work with np>=1.25.
1703
- # for exponent in [1, 2, 2.2, 3, 1+3j]:
1704
- for exponent in [1, 2, 2.2, 3]:
1733
+ for exponent in [1, 2, 2.2, 3, 1+3j]:
1705
1734
  ret_sp = B**exponent
1706
1735
  ret_np = A**exponent
1707
1736
  assert_array_equal(ret_sp.toarray(), ret_np)
@@ -2072,8 +2101,8 @@ class _TestCommon:
2072
2101
 
2073
2102
  with suppress_warnings() as sup:
2074
2103
  sup.filter(SparseEfficiencyWarning,
2075
- "Taking maximum .minimum. with > 0 .< 0. number "
2076
- "results to a dense matrix")
2104
+ "Taking (maximum|minimum) with a (positive|negative) number "
2105
+ "results in a dense matrix")
2077
2106
 
2078
2107
  max_s = A.maximum(B)
2079
2108
  min_s = A.minimum(B)
@@ -2366,20 +2395,14 @@ class _TestInplaceArithmetic:
2366
2395
 
2367
2396
  # Matrix multiply from __rmatmul__
2368
2397
  y = a.copy()
2369
- # skip this test if numpy doesn't support __imatmul__ yet.
2370
- # move out of the try/except once numpy 1.24 is no longer supported.
2371
- try:
2372
- y @= b.T
2373
- except TypeError:
2374
- pass
2375
- else:
2376
- x = a.copy()
2377
- y = a.copy()
2378
- with assert_raises(ValueError, match="dimension mismatch"):
2379
- x @= b
2380
- x = x.dot(a.T)
2381
- y @= b.T
2382
- assert_array_equal(x, y)
2398
+ y @= b.T
2399
+ x = a.copy()
2400
+ y = a.copy()
2401
+ with assert_raises(ValueError, match="dimension mismatch"):
2402
+ x @= b
2403
+ x = x.dot(a.T)
2404
+ y @= b.T
2405
+ assert_array_equal(x, y)
2383
2406
 
2384
2407
  # Floor division is not supported
2385
2408
  with assert_raises(TypeError, match="unsupported operand"):
@@ -3720,9 +3743,11 @@ class _TestMinMax:
3720
3743
  X = self.spcreator(np.arange(1, 10).reshape(3, 3))
3721
3744
  assert_equal(X.min(), 1)
3722
3745
  assert_equal(X.min().dtype, X.dtype)
3746
+ assert_equal(X.min(explicit=True), 1)
3723
3747
 
3724
3748
  X = -X
3725
3749
  assert_equal(X.max(), -1)
3750
+ assert_equal(X.max(explicit=True), -1)
3726
3751
 
3727
3752
  # and a fully sparse matrix
3728
3753
  Z = self.spcreator(np.zeros((1, 1)))
@@ -3797,6 +3822,7 @@ class _TestMinMax:
3797
3822
  assert_array_equal(
3798
3823
  X.min(axis=axis).toarray(), D.min(axis=axis, keepdims=keep)
3799
3824
  )
3825
+ assert_equal(X.max(axis=(0, 1)), D.max(axis=(0, 1), keepdims=keep))
3800
3826
 
3801
3827
  for axis in axes_even:
3802
3828
  expected_max = D[-1, :]
@@ -3844,6 +3870,38 @@ class _TestMinMax:
3844
3870
  assert_equal(X.max(axis=axis, explicit=ex).toarray(), D.max(axis=axis))
3845
3871
  assert_equal(X.min(axis=axis, explicit=ex).toarray(), D.min(axis=axis))
3846
3872
 
3873
+ def test_minmax_container_type(self):
3874
+ dat = array([[0, 1, 2],
3875
+ [3, -4, 5],
3876
+ [-6, 7, 9]])
3877
+ datsp = self.spcreator(dat)
3878
+ matrix_or_array = ndarray if self.is_array_test else np.matrix
3879
+ spmatrix_or_sparray = sparray if self.is_array_test else spmatrix
3880
+
3881
+ assert isscalarlike(datsp.min())
3882
+ assert isinstance(datsp.min(axis=0), spmatrix_or_sparray)
3883
+ assert isinstance(datsp.min(axis=1), spmatrix_or_sparray)
3884
+
3885
+ assert isscalarlike(datsp.max())
3886
+ assert isinstance(datsp.max(axis=0), spmatrix_or_sparray)
3887
+ assert isinstance(datsp.max(axis=1), spmatrix_or_sparray)
3888
+
3889
+ assert isscalarlike(datsp.nanmin())
3890
+ assert isinstance(datsp.nanmin(axis=0), spmatrix_or_sparray)
3891
+ assert isinstance(datsp.nanmin(axis=1), spmatrix_or_sparray)
3892
+
3893
+ assert isscalarlike(datsp.nanmax())
3894
+ assert isinstance(datsp.nanmax(axis=0), spmatrix_or_sparray)
3895
+ assert isinstance(datsp.nanmax(axis=1), spmatrix_or_sparray)
3896
+
3897
+ assert isscalarlike(datsp.argmin())
3898
+ assert isinstance(datsp.argmin(axis=0), matrix_or_array)
3899
+ assert isinstance(datsp.argmin(axis=1), matrix_or_array)
3900
+
3901
+ assert isscalarlike(datsp.argmax())
3902
+ assert isinstance(datsp.argmax(axis=0), matrix_or_array)
3903
+ assert isinstance(datsp.argmax(axis=1), matrix_or_array)
3904
+
3847
3905
  def test_nanminmax(self):
3848
3906
  D = self.asdense(np.arange(50).reshape(5,10), dtype=float)
3849
3907
  D[1, :] = 0
@@ -3862,6 +3920,10 @@ class _TestMinMax:
3862
3920
  assert np.isscalar(X_nan_minimum)
3863
3921
  assert X_nan_minimum == np.nanmin(D)
3864
3922
 
3923
+ X_nan_minimum = X.nanmin(axis=(0, 1))
3924
+ assert np.isscalar(X_nan_minimum)
3925
+ assert X_nan_minimum == np.nanmin(D, axis=(0, 1))
3926
+
3865
3927
  axes = [-2, -1, 0, 1]
3866
3928
  for axis in axes:
3867
3929
  X_nan_maxima = X.nanmax(axis=axis)
@@ -3879,11 +3941,12 @@ class _TestMinMax:
3879
3941
  datsp = self.spcreator(dat)
3880
3942
 
3881
3943
  for fname in ('min', 'max'):
3944
+ datfunc = getattr(dat, fname)
3882
3945
  func = getattr(datsp, fname)
3883
3946
  assert_raises(ValueError, func, axis=3)
3884
- assert_raises(TypeError, func, axis=(0, 1))
3885
3947
  assert_raises(TypeError, func, axis=1.5)
3886
3948
  assert_raises(ValueError, func, axis=1, out=1)
3949
+ assert_equal(func(axis=(0, 1)), datfunc(axis=(0, 1)))
3887
3950
 
3888
3951
  def test_numpy_minmax(self):
3889
3952
  # See gh-5987
@@ -3933,6 +3996,13 @@ class _TestMinMax:
3933
3996
  assert_equal(mat.argmax(axis=1), np.argmax(D, axis=1))
3934
3997
  assert_equal(mat.argmin(axis=1), np.argmin(D, axis=1))
3935
3998
 
3999
+ # full matrix with explicit=True
4000
+ mat = self.spcreator(self.asdense(D5))
4001
+ assert_equal(mat.argmax(explicit=True), 5)
4002
+ assert_equal((-mat).argmax(explicit=True), 2)
4003
+ assert_equal(mat.argmin(explicit=True), 2)
4004
+ assert_equal((-mat).argmin(explicit=True), 5)
4005
+
3936
4006
  # zero-size matrices
3937
4007
  D6 = self.spcreator(np.empty((0, 5)))
3938
4008
  D7 = self.spcreator(np.empty((5, 0)))
@@ -4355,6 +4425,12 @@ class TestCSRMatrix(_MatrixMixin, TestCSR):
4355
4425
  with suppress_warnings() as sup:
4356
4426
  sup.filter(SparseEfficiencyWarning, "Changing the sparsity structure")
4357
4427
  return csr_matrix(*args, **kwargs)
4428
+
4429
+ def test_spmatrix_subscriptable(self):
4430
+ result = csr_matrix[np.int8]
4431
+ assert isinstance(result, GenericAlias)
4432
+ assert result.__origin__ is csr_matrix
4433
+ assert result.__args__ == (np.int8,)
4358
4434
 
4359
4435
 
4360
4436
  TestCSRMatrix.init_class()
@@ -4890,6 +4966,17 @@ class TestCOO(sparse_test_class(getset=False,
4890
4966
  # Using __ne__ and nnz instead
4891
4967
  assert_((mat1.reshape((1001, 3000001), order='C') != mat2).nnz == 0)
4892
4968
  assert_((mat2.reshape((3000001, 1001), order='F') != mat1).nnz == 0)
4969
+
4970
+ def test_sparray_subscriptable(self):
4971
+ result = coo_array[np.int8, tuple[int]]
4972
+ assert isinstance(result, GenericAlias)
4973
+ assert result.__origin__ is coo_array
4974
+ assert result.__args__ == (np.int8, tuple[int])
4975
+
4976
+ result = coo_array[np.int8]
4977
+ assert isinstance(result, GenericAlias)
4978
+ assert result.__origin__ is coo_array
4979
+ assert result.__args__ == (np.int8,)
4893
4980
 
4894
4981
 
4895
4982
  class TestCOOMatrix(_MatrixMixin, TestCOO):
@@ -4962,6 +5049,40 @@ class TestDIA(sparse_test_class(getset=False, slicing=False, slicing_assign=Fals
4962
5049
  csc = dia.tocsc()
4963
5050
  assert csc.indices.dtype == np.int32
4964
5051
 
5052
+ def test_add_sparse(self):
5053
+ # test format and cases not covered by common add tests
5054
+ A = diag([1, 2])
5055
+ B = A + diag([3], 1)
5056
+ Asp = dia_matrix(A)
5057
+ Bsp = dia_matrix(B)
5058
+
5059
+ Csp = Asp + Bsp
5060
+ assert isinstance(Csp, dia_matrix)
5061
+ assert_array_equal(Csp.toarray(), A + B)
5062
+
5063
+ Csp = Bsp + Asp
5064
+ assert isinstance(Csp, dia_matrix)
5065
+ assert_array_equal(Csp.toarray(), B + A)
5066
+
5067
+ def test_sub_sparse(self):
5068
+ # test format and cases not covered by common sub tests
5069
+ A = diag([1, 2])
5070
+ B = A + diag([3], 1)
5071
+ Asp = dia_matrix(A)
5072
+ Bsp = dia_matrix(B)
5073
+
5074
+ Csp = Asp - Bsp
5075
+ assert isinstance(Csp, dia_matrix)
5076
+ assert_array_equal(Csp.toarray(), A - B)
5077
+
5078
+ Csp = Bsp - Asp
5079
+ assert isinstance(Csp, dia_matrix)
5080
+ assert_array_equal(Csp.toarray(), B - A)
5081
+
5082
+ Bsp = Bsp.asformat('csr')
5083
+ assert_array_equal((Asp - Bsp).toarray(), A - B)
5084
+ assert_array_equal((Bsp - Asp).toarray(), B - A)
5085
+
4965
5086
  def test_mul_scalar(self):
4966
5087
  # repro for gh-20434
4967
5088
  m = self.dia_container([[1, 2], [0, 4]])
@@ -4973,6 +5094,50 @@ class TestDIA(sparse_test_class(getset=False, slicing=False, slicing_assign=Fals
4973
5094
  assert isinstance(res2, m.__class__)
4974
5095
  assert_array_equal(res2.toarray(), [[3, 6], [0, 12]])
4975
5096
 
5097
+ def test_matmul_dia(self):
5098
+ # test DIA structure of DIA @ DIA:
5099
+
5100
+ # that all and only needed elements are used and produced
5101
+ A = array([[1, 2, 3],
5102
+ [4, 5, 6]])
5103
+ B = array([[11, 12],
5104
+ [13, 14],
5105
+ [15, 16]])
5106
+ Asp = dia_matrix(A)
5107
+ Bsp = dia_matrix(B)
5108
+ Asp.data[Asp.data == 0] = -1 # poison outside elements
5109
+ Bsp.data[Bsp.data == 0] = -1
5110
+ assert_array_equal(Asp.toarray(), A)
5111
+ assert_array_equal(Bsp.toarray(), B)
5112
+
5113
+ C = A @ B
5114
+ Csp = Asp @ Bsp
5115
+ assert isinstance(Csp, dia_matrix)
5116
+ assert_array_equal(Csp.toarray(), C)
5117
+ assert_array_equal(Csp.offsets, [-1, 0, 1])
5118
+ assert_array_equal(Csp.data, dia_matrix(C).data)
5119
+
5120
+ C = B @ A
5121
+ Csp = Bsp @ Asp
5122
+ assert isinstance(Csp, dia_matrix)
5123
+ assert_array_equal(Csp.toarray(), C)
5124
+ assert_array_equal(Csp.offsets, [-2, -1, 0, 1, 2])
5125
+ assert_array_equal(Csp.data, dia_matrix(C).data)
5126
+
5127
+ # short data and that order of input offsets doesn't matter
5128
+ Asp = dia_matrix(([[0., 1., 2.], [3., 4., 5.]], [1, -2]), (5, 5))
5129
+ Bsp = dia_matrix(([[6., 7., 8.], [0., 0., 9.]], [-1, 2]), (5, 5))
5130
+
5131
+ Csp = Asp @ Bsp
5132
+ assert_array_equal(Csp.offsets, array([-3, 0]))
5133
+ assert_array_equal(Csp.data, [[24., 35., 0.],
5134
+ [6., 14., 27.]])
5135
+
5136
+ Csp = Bsp @ Asp
5137
+ assert_array_equal(Csp.offsets, array([-3, 0]))
5138
+ assert_array_equal(Csp.data, [[24., 0., 0.],
5139
+ [27., 6., 14.]])
5140
+
4976
5141
 
4977
5142
  class TestDIAMatrix(_MatrixMixin, TestDIA):
4978
5143
  spcreator = dia_matrix
@@ -4,13 +4,13 @@ import pytest
4
4
 
5
5
  import numpy as np
6
6
  from numpy.testing import assert_equal, assert_allclose
7
+ from numpy.exceptions import ComplexWarning
7
8
 
8
9
  from scipy.sparse import (
9
10
  bsr_array, csc_array, dia_array, lil_array,
10
11
  coo_array, csr_array, dok_array,
11
12
  )
12
13
  from scipy.sparse._sputils import supported_dtypes, matrix
13
- from scipy._lib._util import ComplexWarning
14
14
 
15
15
 
16
16
  sup_complex = np.testing.suppress_warnings()
@@ -136,10 +136,10 @@ class TestCommon1D:
136
136
  dat = np.array([0, 1, 2])
137
137
  datsp = spcreator(dat)
138
138
 
139
- with pytest.raises(ValueError, match='axis must be None, -1 or 0'):
139
+ with pytest.raises(ValueError, match='axis out of range'):
140
140
  datsp.sum(axis=1)
141
- with pytest.raises(TypeError, match='Tuples are not accepted'):
142
- datsp.sum(axis=(0, 1))
141
+ with pytest.raises(ValueError, match='axis out of range'):
142
+ datsp.sum(axis=(0, 3))
143
143
  with pytest.raises(TypeError, match='axis must be an integer'):
144
144
  datsp.sum(axis=1.5)
145
145
  with pytest.raises(ValueError, match='output parameter.*wrong.*dimension'):
@@ -176,11 +176,11 @@ class TestCommon1D:
176
176
  datsp = spcreator(dat)
177
177
  with pytest.raises(ValueError, match='axis out of range'):
178
178
  datsp.mean(axis=3)
179
- with pytest.raises(TypeError, match='Tuples are not accepted'):
180
- datsp.mean(axis=(0, 1))
179
+ with pytest.raises(ValueError, match='axis out of range'):
180
+ datsp.mean(axis=(0, 3))
181
181
  with pytest.raises(TypeError, match='axis must be an integer'):
182
182
  datsp.mean(axis=1.5)
183
- with pytest.raises(ValueError, match='output parameter.*wrong.*dimension'):
183
+ with pytest.raises(ValueError, match='out.*not match shape'):
184
184
  datsp.mean(axis=1, out=out)
185
185
 
186
186
  def test_sum_dtype(self, spcreator):
@@ -673,7 +673,7 @@ class TestConstructUtils:
673
673
  assert isinstance(bmat([[Gm.tocsc(), Gm]], format="csr"), spmatrix)
674
674
  assert isinstance(bmat([[Gm, Gm]], format="csc"), spmatrix)
675
675
 
676
- @pytest.mark.slow
676
+ @pytest.mark.xslow
677
677
  @pytest.mark.thread_unsafe
678
678
  @pytest.mark.xfail_on_32bit("Can't create large array for test")
679
679
  def test_concatenate_int32_overflow(self):