scipy 1.15.3__cp312-cp312-win_amd64.whl → 1.16.0rc2__cp312-cp312-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.cp312-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp312-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.cp312-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp312-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.cp312-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp312-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp312-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp312-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp312-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp312-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp312-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp312-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp312-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp312-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.cp312-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp312-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.cp312-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp312-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp312-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp312-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.cp312-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp312-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.cp312-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp312-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.cp312-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp312-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp312-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp312-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp312-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp312-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp312-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp312-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.cp312-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp312-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp312-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp312-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp312-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp312-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.cp312-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp312-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp312-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp312-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp312-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp312-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.cp312-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp312-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.cp312-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp312-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp312-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp312-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.cp312-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp312-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.cp312-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp312-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.cp312-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp312-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp312-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp312-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp312-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp312-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.cp312-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp312-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.cp312-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp312-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.cp312-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp312-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.cp312-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp312-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp312-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp312-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp312-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp312-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp312-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp312-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp312-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp312-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp312-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp312-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.cp312-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp312-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp312-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp312-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.cp312-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp312-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp312-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp312-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.cp312-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp312-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp312-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp312-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp312-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp312-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.cp312-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp312-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp312-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp312-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.cp312-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp312-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.cp312-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp312-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp312-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp312-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp312-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp312-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp312-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp312-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.cp312-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp312-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.cp312-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp312-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.cp312-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp312-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp312-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp312-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.cp312-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp312-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.cp312-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp312-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp312-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp312-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.cp312-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp312-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp312-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp312-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.cp312-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp312-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp312-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp312-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.cp312-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp312-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp312-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp312-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp312-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp312-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.cp312-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp312-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.cp312-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp312-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.cp312-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp312-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.cp312-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp312-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp312-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp312-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp312-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp312-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp312-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp312-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp312-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp312-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.cp312-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp312-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.cp312-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-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.cp312-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp312-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp312-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp312-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.cp312-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp312-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp312-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp312-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp312-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp312-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp312-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp312-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp312-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp312-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp312-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp312-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.cp312-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp312-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp312-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp312-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.cp312-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp312-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp312-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp312-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp312-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp312-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp312-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp312-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp312-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp312-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.cp312-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp312-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp312-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp312-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp312-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp312-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.cp312-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp312-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.cp312-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp312-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp312-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp312-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.cp312-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp312-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.cp312-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp312-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp312-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp312-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp312-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp312-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp312-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp312-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp312-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp312-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.cp312-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp312-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp312-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp312-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.cp312-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp312-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp312-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp312-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp312-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp312-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp312-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp312-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.cp312-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp312-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp312-cp312-win_amd64.whl → /scipy-1.16.0rc2-cp312-cp312-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
scipy/linalg/_matfuncs.py CHANGED
@@ -8,14 +8,17 @@ import numpy as np
8
8
  from numpy import (dot, diag, prod, logical_not, ravel, transpose,
9
9
  conjugate, absolute, amax, sign, isfinite, triu)
10
10
 
11
+ from scipy._lib._util import _apply_over_batch
12
+ from scipy._lib.deprecation import _NoValue
13
+
11
14
  # Local imports
12
- from scipy.linalg import LinAlgError, bandwidth
15
+ from scipy.linalg import LinAlgError, bandwidth, LinAlgWarning
13
16
  from ._misc import norm
14
17
  from ._basic import solve, inv
15
18
  from ._decomp_svd import svd
16
19
  from ._decomp_schur import schur, rsf2csf
17
20
  from ._expm_frechet import expm_frechet, expm_cond
18
- from ._matfuncs_sqrtm import sqrtm
21
+ from ._matfuncs_schur_sqrtm import recursive_schur_sqrtm
19
22
  from ._matfuncs_expm import pick_pade_structure, pade_UV_calc
20
23
  from ._linalg_pythran import _funm_loops # type: ignore[import-not-found]
21
24
 
@@ -95,6 +98,7 @@ def _maybe_real(A, B, tol=None):
95
98
  # Matrix functions.
96
99
 
97
100
 
101
+ @_apply_over_batch(('A', 2))
98
102
  def fractional_matrix_power(A, t):
99
103
  """
100
104
  Compute the fractional power of a matrix.
@@ -141,7 +145,8 @@ def fractional_matrix_power(A, t):
141
145
  return scipy.linalg._matfuncs_inv_ssq._fractional_matrix_power(A, t)
142
146
 
143
147
 
144
- def logm(A, disp=True):
148
+ @_apply_over_batch(('A', 2))
149
+ def logm(A, disp=_NoValue):
145
150
  """
146
151
  Compute matrix logarithm.
147
152
 
@@ -156,6 +161,11 @@ def logm(A, disp=True):
156
161
  Emit warning if error in the result is estimated large
157
162
  instead of returning estimated error. (Default: True)
158
163
 
164
+ .. deprecated:: 1.16.0
165
+ The `disp` argument is deprecated and will be
166
+ removed in SciPy 1.18.0. The previously returned error estimate
167
+ can be computed as ``norm(expm(logm(A)) - A, 1) / norm(A, 1)``.
168
+
159
169
  Returns
160
170
  -------
161
171
  logm : (N, N) ndarray
@@ -196,6 +206,12 @@ def logm(A, disp=True):
196
206
  [ 1., 4.]])
197
207
 
198
208
  """
209
+ if disp is _NoValue:
210
+ disp = True
211
+ else:
212
+ warnings.warn("The `disp` argument is deprecated "
213
+ "and will be removed in SciPy 1.18.0.",
214
+ DeprecationWarning, stacklevel=2)
199
215
  A = np.asarray(A) # squareness checked in `_logm`
200
216
  # Avoid circular import ... this is OK, right?
201
217
  import scipy.linalg._matfuncs_inv_ssq
@@ -391,6 +407,153 @@ def _exp_sinch(x):
391
407
  return lexp_diff
392
408
 
393
409
 
410
+ def sqrtm(A, disp=_NoValue, blocksize=_NoValue):
411
+ """
412
+ Compute, if exists, the matrix square root.
413
+
414
+ The matrix square root of ``A`` is a matrix ``X`` such that ``X @ X = A``.
415
+ Every square matrix is not guaranteed to have a matrix square root, for
416
+ example, the array ``[[0, 1], [0, 0]]`` does not have a square root.
417
+
418
+ Moreover, not every real matrix has a real square root. Hence, for
419
+ real-valued matrices the return type can be complex if, numerically, there
420
+ is an eigenvalue on the negative real axis.
421
+
422
+ Parameters
423
+ ----------
424
+ A : ndarray
425
+ Input with last two dimensions are square ``(..., n, n)``.
426
+ disp : bool, optional
427
+ Print warning if error in the result is estimated large
428
+ instead of returning estimated error. (Default: True)
429
+
430
+ .. deprecated:: 1.16.0
431
+ The `disp` argument is deprecated and will be
432
+ removed in SciPy 1.18.0. The previously returned error estimate
433
+ can be computed as ``norm(X @ X - A, 'fro')**2 / norm(A, 'fro')``
434
+
435
+ blocksize : integer, optional
436
+
437
+ .. deprecated:: 1.16.0
438
+ The `blocksize` argument is deprecated as it is unused by the algorithm
439
+ and will be removed in SciPy 1.18.0.
440
+
441
+ Returns
442
+ -------
443
+ sqrtm : ndarray
444
+ Computed matrix squareroot of `A` with same size ``(..., n, n)``.
445
+
446
+ errest : float
447
+ Frobenius norm of the estimated error, ||err||_F / ||A||_F. Only
448
+ returned, if ``disp`` is set to ``False``. This return argument will be
449
+ removed in version 1.20.0 and only the sqrtm result will be returned.
450
+
451
+ .. deprecated:: 1.16.0
452
+
453
+ Notes
454
+ -----
455
+ This function uses the Schur decomposition method to compute the matrix
456
+ square root following [1]_ and for real matrices [2]_. Moreover, note
457
+ that, there exist matrices that have square roots that are not polynomials
458
+ in ``A``. For a classical example from [2]_, the matrix satisfies::
459
+
460
+ [ a, a**2 + 1]**2 [-1, 0]
461
+ [-1, -a] = [ 0, -1]
462
+
463
+ for any scalar ``a`` but it is not a polynomial in ``-I``. Thus, they will
464
+ not be found by this function.
465
+
466
+ References
467
+ ----------
468
+ .. [1] Edvin Deadman, Nicholas J. Higham, Rui Ralha (2013)
469
+ "Blocked Schur Algorithms for Computing the Matrix Square Root,
470
+ Lecture Notes in Computer Science, 7782. pp. 171-182.
471
+ :doi:`10.1016/0024-3795(87)90118-2`
472
+ .. [2] Nicholas J. Higham (1987) "Computing real square roots of a real
473
+ matrix", Linear Algebra and its Applications, 88/89:405-430.
474
+ :doi:`10.1016/0024-3795(87)90118-2`
475
+
476
+ Examples
477
+ --------
478
+ >>> import numpy as np
479
+ >>> from scipy.linalg import sqrtm
480
+ >>> a = np.array([[1.0, 3.0], [1.0, 4.0]])
481
+ >>> r = sqrtm(a)
482
+ >>> r
483
+ array([[ 0.75592895, 1.13389342],
484
+ [ 0.37796447, 1.88982237]])
485
+ >>> r.dot(r)
486
+ array([[ 1., 3.],
487
+ [ 1., 4.]])
488
+
489
+ """
490
+ if disp is _NoValue:
491
+ disp = True
492
+ else:
493
+ warnings.warn("The `disp` argument is deprecated and will be removed in SciPy "
494
+ "1.18.0.",
495
+ DeprecationWarning, stacklevel=2)
496
+ if blocksize is not _NoValue:
497
+ warnings.warn("The `blocksize` argument is deprecated and will be removed in "
498
+ "SciPy 1.18.0.",
499
+ DeprecationWarning, stacklevel=2)
500
+
501
+ a = np.asarray(A)
502
+ if a.size == 1 and a.ndim < 2:
503
+ return np.array([[np.exp(a.item())]])
504
+
505
+ if a.ndim < 2:
506
+ raise LinAlgError('The input array must be at least two-dimensional')
507
+ if a.shape[-1] != a.shape[-2]:
508
+ raise LinAlgError('Last 2 dimensions of the array must be square')
509
+
510
+ # Empty array
511
+ if min(*a.shape) == 0:
512
+ dtype = sqrtm(np.eye(2, dtype=a.dtype)).dtype
513
+ return np.empty_like(a, dtype=dtype)
514
+
515
+ # Scalar case
516
+ if a.shape[-2:] == (1, 1):
517
+ return np.emath.sqrt(a)
518
+
519
+ if not np.issubdtype(a.dtype, np.inexact):
520
+ a = a.astype(np.float64)
521
+ elif a.dtype == np.float16:
522
+ a = a.astype(np.float32)
523
+ elif a.dtype.char in 'G':
524
+ a = a.astype(np.complex128)
525
+ elif a.dtype.char in 'g':
526
+ a = a.astype(np.float64)
527
+
528
+ if a.dtype.char not in 'fdFD':
529
+ raise TypeError("scipy.linalg.sqrtm is not supported for the data type"
530
+ f" {a.dtype}")
531
+
532
+ res, isIllconditioned, isSingular, info = recursive_schur_sqrtm(a)
533
+ if info < 0:
534
+ raise LinAlgError(f"Internal error in scipy.linalg.sqrtm: {info}")
535
+
536
+ if isSingular or isIllconditioned:
537
+ if isSingular:
538
+ msg = ("Matrix is singular. The result might be inaccurate or the"
539
+ " array might not have a square root.")
540
+ else:
541
+ msg = ("Matrix is ill-conditioned. The result might be inaccurate"
542
+ " or the array might not have a square root.")
543
+ warnings.warn(msg, LinAlgWarning, stacklevel=2)
544
+
545
+ if disp is False:
546
+ try:
547
+ arg2 = norm(res @ res - A, 'fro')**2 / norm(A, 'fro')
548
+ except ValueError:
549
+ # NaNs in matrix
550
+ arg2 = np.inf
551
+ return res, arg2
552
+ else:
553
+ return res
554
+
555
+
556
+ @_apply_over_batch(('A', 2))
394
557
  def cosm(A):
395
558
  """
396
559
  Compute the matrix cosine.
@@ -431,6 +594,7 @@ def cosm(A):
431
594
  return expm(1j*A).real
432
595
 
433
596
 
597
+ @_apply_over_batch(('A', 2))
434
598
  def sinm(A):
435
599
  """
436
600
  Compute the matrix sine.
@@ -471,6 +635,7 @@ def sinm(A):
471
635
  return expm(1j*A).imag
472
636
 
473
637
 
638
+ @_apply_over_batch(('A', 2))
474
639
  def tanm(A):
475
640
  """
476
641
  Compute the matrix tangent.
@@ -510,6 +675,7 @@ def tanm(A):
510
675
  return _maybe_real(A, solve(cosm(A), sinm(A)))
511
676
 
512
677
 
678
+ @_apply_over_batch(('A', 2))
513
679
  def coshm(A):
514
680
  """
515
681
  Compute the hyperbolic matrix cosine.
@@ -549,6 +715,7 @@ def coshm(A):
549
715
  return _maybe_real(A, 0.5 * (expm(A) + expm(-A)))
550
716
 
551
717
 
718
+ @_apply_over_batch(('A', 2))
552
719
  def sinhm(A):
553
720
  """
554
721
  Compute the hyperbolic matrix sine.
@@ -588,6 +755,7 @@ def sinhm(A):
588
755
  return _maybe_real(A, 0.5 * (expm(A) - expm(-A)))
589
756
 
590
757
 
758
+ @_apply_over_batch(('A', 2))
591
759
  def tanhm(A):
592
760
  """
593
761
  Compute the hyperbolic matrix tangent.
@@ -627,6 +795,7 @@ def tanhm(A):
627
795
  return _maybe_real(A, solve(coshm(A), sinhm(A)))
628
796
 
629
797
 
798
+ @_apply_over_batch(('A', 2))
630
799
  def funm(A, func, disp=True):
631
800
  """
632
801
  Evaluate a matrix function specified by a callable.
@@ -721,7 +890,8 @@ def funm(A, func, disp=True):
721
890
  return F, err
722
891
 
723
892
 
724
- def signm(A, disp=True):
893
+ @_apply_over_batch(('A', 2))
894
+ def signm(A, disp=_NoValue):
725
895
  """
726
896
  Matrix sign function.
727
897
 
@@ -735,6 +905,11 @@ def signm(A, disp=True):
735
905
  Print warning if error in the result is estimated large
736
906
  instead of returning estimated error. (Default: True)
737
907
 
908
+ .. deprecated:: 1.16.0
909
+ The `disp` argument is deprecated and will be
910
+ removed in SciPy 1.18.0. The previously returned error estimate
911
+ can be computed as ``norm(signm @ signm - signm, 1)``.
912
+
738
913
  Returns
739
914
  -------
740
915
  signm : (N, N) ndarray
@@ -754,6 +929,13 @@ def signm(A, disp=True):
754
929
  array([-1.+0.j, 1.+0.j, 1.+0.j])
755
930
 
756
931
  """
932
+ if disp is _NoValue:
933
+ disp = True
934
+ else:
935
+ warnings.warn("The `disp` argument is deprecated "
936
+ "and will be removed in SciPy 1.18.0.",
937
+ DeprecationWarning, stacklevel=2)
938
+
757
939
  A = _asarray_square(A)
758
940
 
759
941
  def rounded_sign(x):
@@ -801,6 +983,7 @@ def signm(A, disp=True):
801
983
  return S0, errest
802
984
 
803
985
 
986
+ @_apply_over_batch(('a', 2), ('b', 2))
804
987
  def khatri_rao(a, b):
805
988
  r"""
806
989
  Khatri-rao product
@@ -4,24 +4,16 @@ Matrix square root for general matrices and for upper triangular matrices.
4
4
  This module exists to avoid cyclic imports.
5
5
 
6
6
  """
7
- __all__ = ['sqrtm']
7
+ __all__ = []
8
8
 
9
9
  import numpy as np
10
10
 
11
- from scipy._lib._util import _asarray_validated
12
-
13
11
  # Local imports
14
- from ._misc import norm
15
12
  from .lapack import ztrsyl, dtrsyl
16
- from ._decomp_schur import schur, rsf2csf
17
- from ._basic import _ensure_dtype_cdsz
18
-
19
-
20
13
 
21
14
  class SqrtmError(np.linalg.LinAlgError):
22
15
  pass
23
16
 
24
-
25
17
  from ._matfuncs_sqrtm_triu import within_block_loop # noqa: E402
26
18
 
27
19
 
@@ -113,93 +105,3 @@ def _sqrtm_triu(T, blocksize=64):
113
105
 
114
106
  # Return the matrix square root.
115
107
  return R
116
-
117
-
118
- def sqrtm(A, disp=True, blocksize=64):
119
- """
120
- Matrix square root.
121
-
122
- Parameters
123
- ----------
124
- A : (N, N) array_like
125
- Matrix whose square root to evaluate
126
- disp : bool, optional
127
- Print warning if error in the result is estimated large
128
- instead of returning estimated error. (Default: True)
129
- blocksize : integer, optional
130
- If the blocksize is not degenerate with respect to the
131
- size of the input array, then use a blocked algorithm. (Default: 64)
132
-
133
- Returns
134
- -------
135
- sqrtm : (N, N) ndarray
136
- Value of the sqrt function at `A`. The dtype is float or complex.
137
- The precision (data size) is determined based on the precision of
138
- input `A`.
139
-
140
- errest : float
141
- (if disp == False)
142
-
143
- Frobenius norm of the estimated error, ||err||_F / ||A||_F
144
-
145
- References
146
- ----------
147
- .. [1] Edvin Deadman, Nicholas J. Higham, Rui Ralha (2013)
148
- "Blocked Schur Algorithms for Computing the Matrix Square Root,
149
- Lecture Notes in Computer Science, 7782. pp. 171-182.
150
-
151
- Examples
152
- --------
153
- >>> import numpy as np
154
- >>> from scipy.linalg import sqrtm
155
- >>> a = np.array([[1.0, 3.0], [1.0, 4.0]])
156
- >>> r = sqrtm(a)
157
- >>> r
158
- array([[ 0.75592895, 1.13389342],
159
- [ 0.37796447, 1.88982237]])
160
- >>> r.dot(r)
161
- array([[ 1., 3.],
162
- [ 1., 4.]])
163
-
164
- """
165
- A = _asarray_validated(A, check_finite=True, as_inexact=True)
166
- if len(A.shape) != 2:
167
- raise ValueError("Non-matrix input to matrix function.")
168
- if blocksize < 1:
169
- raise ValueError("The blocksize should be at least 1.")
170
- A, = _ensure_dtype_cdsz(A)
171
- keep_it_real = np.isrealobj(A)
172
- if keep_it_real:
173
- T, Z = schur(A)
174
- d0 = np.diagonal(T)
175
- d1 = np.diagonal(T, -1)
176
- eps = np.finfo(T.dtype).eps
177
- needs_conversion = abs(d1) > eps * (abs(d0[1:]) + abs(d0[:-1]))
178
- if needs_conversion.any():
179
- T, Z = rsf2csf(T, Z)
180
- else:
181
- T, Z = schur(A, output='complex')
182
- failflag = False
183
- try:
184
- R = _sqrtm_triu(T, blocksize=blocksize)
185
- ZH = np.conjugate(Z).T
186
- X = Z.dot(R).dot(ZH)
187
- dtype = np.result_type(A.dtype, 1j if np.iscomplexobj(X) else 1)
188
- X = X.astype(dtype, copy=False)
189
- except SqrtmError:
190
- failflag = True
191
- X = np.empty_like(A)
192
- X.fill(np.nan)
193
-
194
- if disp:
195
- if failflag:
196
- print("Failed to find a square root.")
197
- return X
198
- else:
199
- try:
200
- arg2 = norm(X.dot(X) - A, 'fro')**2 / norm(A, 'fro')
201
- except ValueError:
202
- # NaNs in matrix
203
- arg2 = np.inf
204
-
205
- return X, arg2
@@ -3,12 +3,14 @@ Solve the orthogonal Procrustes problem.
3
3
 
4
4
  """
5
5
  import numpy as np
6
+ from scipy._lib._util import _apply_over_batch
6
7
  from ._decomp_svd import svd
7
8
 
8
9
 
9
10
  __all__ = ['orthogonal_procrustes']
10
11
 
11
12
 
13
+ @_apply_over_batch(('A', 2), ('B', 2))
12
14
  def orthogonal_procrustes(A, B, check_finite=True):
13
15
  """
14
16
  Compute the matrix solution of the orthogonal (or unitary) Procrustes problem.
scipy/linalg/_sketches.py CHANGED
@@ -6,8 +6,8 @@
6
6
  import numpy as np
7
7
 
8
8
  from scipy._lib._util import (check_random_state, rng_integers,
9
- _transition_to_rng)
10
- from scipy.sparse import csc_matrix
9
+ _transition_to_rng, _apply_over_batch)
10
+ from scipy.sparse import csc_matrix, issparse
11
11
 
12
12
  __all__ = ['clarkson_woodruff_transform']
13
13
 
@@ -68,8 +68,8 @@ def clarkson_woodruff_transform(input_matrix, sketch_size, rng=None):
68
68
 
69
69
  Parameters
70
70
  ----------
71
- input_matrix : array_like
72
- Input matrix, of shape ``(n, d)``.
71
+ input_matrix : array_like, shape (..., n, d)
72
+ Input matrix.
73
73
  sketch_size : int
74
74
  Number of rows for the sketch.
75
75
  rng : `numpy.random.Generator`, optional
@@ -174,5 +174,16 @@ def clarkson_woodruff_transform(input_matrix, sketch_size, rng=None):
174
174
  166.58473879945151
175
175
 
176
176
  """
177
- S = cwt_matrix(sketch_size, input_matrix.shape[0], rng=rng)
178
- return S.dot(input_matrix)
177
+ if issparse(input_matrix) and input_matrix.ndim > 2:
178
+ message = "Batch support for sparse arrays is not available."
179
+ raise NotImplementedError(message)
180
+
181
+ S = cwt_matrix(sketch_size, input_matrix.shape[-2], rng=rng)
182
+ # Despite argument order (required by decorator), this is S @ input_matrix
183
+ # Can avoid _batch_dot when gh-22153 is resolved.
184
+ return S @ input_matrix if input_matrix.ndim <= 2 else _batch_dot(input_matrix, S)
185
+
186
+
187
+ @_apply_over_batch(('input_matrix', 2))
188
+ def _batch_dot(input_matrix, S):
189
+ return S @ input_matrix
scipy/linalg/_solvers.py CHANGED
@@ -12,6 +12,7 @@ import warnings
12
12
  import numpy as np
13
13
  from numpy.linalg import inv, LinAlgError, norm, cond, svd
14
14
 
15
+ from scipy._lib._util import _apply_over_batch
15
16
  from ._basic import solve, solve_triangular, matrix_balance
16
17
  from .lapack import get_lapack_funcs
17
18
  from ._decomp_schur import schur
@@ -27,6 +28,7 @@ __all__ = ['solve_sylvester',
27
28
  'solve_continuous_are', 'solve_discrete_are']
28
29
 
29
30
 
31
+ @_apply_over_batch(('a', 2), ('b', 2), ('q', 2))
30
32
  def solve_sylvester(a, b, q):
31
33
  """
32
34
  Computes a solution (X) to the Sylvester equation :math:`AX + XB = Q`.
@@ -106,12 +108,12 @@ def solve_sylvester(a, b, q):
106
108
  y = scale*y
107
109
 
108
110
  if info < 0:
109
- raise LinAlgError("Illegal value encountered in "
110
- "the %d term" % (-info,))
111
+ raise LinAlgError(f"Illegal value encountered in the {-info} term")
111
112
 
112
113
  return np.dot(np.dot(u, y), v.conj().transpose())
113
114
 
114
115
 
116
+ @_apply_over_batch(('a', 2), ('q', 2))
115
117
  def solve_continuous_lyapunov(a, q):
116
118
  """
117
119
  Solves the continuous Lyapunov equation :math:`AX + XA^H = Q`.
@@ -245,6 +247,7 @@ def _solve_discrete_lyapunov_bilinear(a, q):
245
247
  return solve_lyapunov(b.conj().transpose(), -c)
246
248
 
247
249
 
250
+ @_apply_over_batch(('a', 2), ('q', 2))
248
251
  def solve_discrete_lyapunov(a, q, method=None):
249
252
  """
250
253
  Solves the discrete Lyapunov equation :math:`AXA^H - X + Q = 0`.
@@ -336,6 +339,7 @@ def solve_discrete_lyapunov(a, q, method=None):
336
339
  return x
337
340
 
338
341
 
342
+ @_apply_over_batch(('a', 2), ('b', 2), ('q', 2), ('r', 2), ('e', 2), ('s', 2))
339
343
  def solve_continuous_are(a, b, q, r, e=None, s=None, balanced=True):
340
344
  r"""
341
345
  Solves the continuous-time algebraic Riccati equation (CARE).
@@ -541,6 +545,7 @@ def solve_continuous_are(a, b, q, r, e=None, s=None, balanced=True):
541
545
  return (x + x.conj().T)/2
542
546
 
543
547
 
548
+ @_apply_over_batch(('a', 2), ('b', 2), ('q', 2), ('r', 2), ('e', 2), ('s', 2))
544
549
  def solve_discrete_are(a, b, q, r, e=None, s=None, balanced=True):
545
550
  r"""
546
551
  Solves the discrete-time algebraic Riccati equation (DARE).
@@ -3,6 +3,7 @@ import warnings
3
3
 
4
4
  import numpy as np
5
5
  from numpy.lib.stride_tricks import as_strided
6
+ from scipy._lib._util import _apply_over_batch
6
7
 
7
8
 
8
9
  __all__ = ['toeplitz', 'circulant', 'hankel',
@@ -269,6 +270,7 @@ def hadamard(n, dtype=int):
269
270
  return H
270
271
 
271
272
 
273
+ @_apply_over_batch(("f", 1), ("s", 1))
272
274
  def leslie(f, s):
273
275
  """
274
276
  Create a Leslie matrix.
@@ -279,24 +281,22 @@ def leslie(f, s):
279
281
 
280
282
  Parameters
281
283
  ----------
282
- f : (..., N,) array_like
284
+ f : (N,) array_like
283
285
  The "fecundity" coefficients.
284
- s : (..., N-1,) array_like
285
- The "survival" coefficients. The length of each slice of `s` (along the last
286
- axis) must be one less than the length of `f`, and it must be at least 1.
286
+ s : (N-1,) array_like
287
+ The "survival" coefficients. The length of `s` must be one less
288
+ than the length of `f`, and it must be at least 1.
287
289
 
288
290
  Returns
289
291
  -------
290
- L : (..., N, N) ndarray
292
+ L : (N, N) ndarray
291
293
  The array is zero except for the first row,
292
294
  which is `f`, and the first sub-diagonal, which is `s`.
293
- For 1-D input, the data-type of the array will be the data-type of
295
+ The data-type of the array will be the data-type of
294
296
  ``f[0]+s[0]``.
295
297
 
296
298
  Notes
297
299
  -----
298
- .. versionadded:: 0.8.0
299
-
300
300
  The Leslie matrix is used to model discrete-time, age-structured
301
301
  population growth [1]_ [2]_. In a population with `n` age classes, two sets
302
302
  of parameters define a Leslie matrix: the `n` "fecundity coefficients",
@@ -304,11 +304,6 @@ def leslie(f, s):
304
304
  class, and the `n` - 1 "survival coefficients", which give the
305
305
  per-capita survival rate of each age class.
306
306
 
307
- N-dimensional input are treated as a batches of coefficient arrays: each
308
- slice along the last axis of the input arrays is a 1-D coefficient array,
309
- and each slice along the last two dimensions of the output is the
310
- corresponding Leslie matrix.
311
-
312
307
  References
313
308
  ----------
314
309
  .. [1] P. H. Leslie, On the use of matrices in certain population
@@ -337,12 +332,6 @@ def leslie(f, s):
337
332
  raise ValueError("The length of s must be at least 1.")
338
333
 
339
334
  n = f.shape[-1]
340
-
341
- if f.ndim > 1 or s.ndim > 1:
342
- from scipy.stats._resampling import _vectorize_statistic
343
- _leslie_nd = _vectorize_statistic(leslie)
344
- return np.moveaxis(_leslie_nd(f, s, axis=-1), [0, 1], [-2, -1])
345
-
346
335
  tmp = f[0] + s[0]
347
336
  a = np.zeros((n, n), dtype=tmp.dtype)
348
337
  a[0] = f
@@ -406,9 +395,9 @@ def kron(a, b):
406
395
 
407
396
  def block_diag(*arrs):
408
397
  """
409
- Create a block diagonal matrix from provided arrays.
398
+ Create a block diagonal array from provided arrays.
410
399
 
411
- Given the inputs `A`, `B` and `C`, the output will have these
400
+ For example, given 2-D inputs `A`, `B` and `C`, the output will have these
412
401
  arrays arranged on the diagonal::
413
402
 
414
403
  [[A, 0, 0],
@@ -417,15 +406,17 @@ def block_diag(*arrs):
417
406
 
418
407
  Parameters
419
408
  ----------
420
- A, B, C, ... : array_like, up to 2-D
421
- Input arrays. A 1-D array or array_like sequence of length `n` is
422
- treated as a 2-D array with shape ``(1,n)``.
409
+ A, B, C, ... : array_like
410
+ Input arrays. A 1-D array or array_like sequence of length ``n`` is
411
+ treated as a 2-D array with shape ``(1, n)``. Any dimensions before
412
+ the last two are treated as batch dimensions; see :ref:`linalg_batch`.
423
413
 
424
414
  Returns
425
415
  -------
426
416
  D : ndarray
427
- Array with `A`, `B`, `C`, ... on the diagonal. `D` has the
428
- same dtype as `A`.
417
+ Array with `A`, `B`, `C`, ... on the diagonal of the last two
418
+ dimensions. `D` has the same dtype as the result type of the
419
+ inputs.
429
420
 
430
421
  Notes
431
422
  -----
@@ -433,7 +424,8 @@ def block_diag(*arrs):
433
424
  block diagonal matrix.
434
425
 
435
426
  Empty sequences (i.e., array-likes of zero size) will not be ignored.
436
- Noteworthy, both [] and [[]] are treated as matrices with shape ``(1,0)``.
427
+ Noteworthy, both ``[]`` and ``[[]]`` are treated as matrices with shape
428
+ ``(1,0)``.
437
429
 
438
430
  Examples
439
431
  --------
@@ -470,18 +462,16 @@ def block_diag(*arrs):
470
462
  arrs = ([],)
471
463
  arrs = [np.atleast_2d(a) for a in arrs]
472
464
 
473
- bad_args = [k for k in range(len(arrs)) if arrs[k].ndim > 2]
474
- if bad_args:
475
- raise ValueError("arguments in the following positions "
476
- f"have dimension greater than 2: {bad_args}")
477
-
478
- shapes = np.array([a.shape for a in arrs])
465
+ batch_shapes = [a.shape[:-2] for a in arrs]
466
+ batch_shape = np.broadcast_shapes(*batch_shapes)
467
+ arrs = [np.broadcast_to(a, batch_shape + a.shape[-2:]) for a in arrs]
479
468
  out_dtype = np.result_type(*[arr.dtype for arr in arrs])
480
- out = np.zeros(np.sum(shapes, axis=0), dtype=out_dtype)
469
+ block_shapes = np.array([a.shape[-2:] for a in arrs])
470
+ out = np.zeros(batch_shape + tuple(np.sum(block_shapes, axis=0)), dtype=out_dtype)
481
471
 
482
472
  r, c = 0, 0
483
- for i, (rr, cc) in enumerate(shapes):
484
- out[r:r + rr, c:c + cc] = arrs[i]
473
+ for i, (rr, cc) in enumerate(block_shapes):
474
+ out[..., r:r + rr, c:c + cc] = arrs[i]
485
475
  r += rr
486
476
  c += cc
487
477
  return out