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/_basic.py CHANGED
@@ -9,6 +9,7 @@ from warnings import warn
9
9
  from itertools import product
10
10
  import numpy as np
11
11
  from numpy import atleast_1d, atleast_2d
12
+ from scipy._lib._util import _apply_over_batch
12
13
  from .lapack import get_lapack_funcs, _compute_lwork
13
14
  from ._misc import LinAlgError, _datacopied, LinAlgWarning
14
15
  from ._decomp import _asarray_validated
@@ -38,13 +39,13 @@ def _solve_check(n, info, lamch=None, rcond=None):
38
39
  """ Check arguments during the different steps of the solution phase """
39
40
  if info < 0:
40
41
  raise ValueError(f'LAPACK reported an illegal value in {-info}-th argument.')
41
- elif 0 < info:
42
+ elif 0 < info or rcond == 0:
42
43
  raise LinAlgError('Matrix is singular.')
43
44
 
44
45
  if lamch is None:
45
46
  return
46
47
  E = lamch('E')
47
- if rcond < E:
48
+ if not (rcond >= E): # `rcond < E` doesn't handle NaN
48
49
  warn(f'Ill-conditioned matrix (rcond={rcond:.6g}): '
49
50
  'result may not be accurate.',
50
51
  LinAlgWarning, stacklevel=3)
@@ -72,28 +73,29 @@ def _find_matrix_structure(a):
72
73
  return kind, n_below, n_above
73
74
 
74
75
 
76
+ @_apply_over_batch(('a', 2), ('b', '1|2'))
75
77
  def solve(a, b, lower=False, overwrite_a=False,
76
78
  overwrite_b=False, check_finite=True, assume_a=None,
77
79
  transposed=False):
78
80
  """
79
- Solves the linear equation set ``a @ x == b`` for the unknown ``x``
80
- for square `a` matrix.
81
+ Solve the equation ``a @ x = b`` for ``x``,
82
+ where `a` is a square matrix.
81
83
 
82
84
  If the data matrix is known to be a particular type then supplying the
83
85
  corresponding string to ``assume_a`` key chooses the dedicated solver.
84
86
  The available options are
85
87
 
86
- =================== ================================
87
- diagonal 'diagonal'
88
- tridiagonal 'tridiagonal'
89
- banded 'banded'
90
- upper triangular 'upper triangular'
91
- lower triangular 'lower triangular'
92
- symmetric 'symmetric' (or 'sym')
93
- hermitian 'hermitian' (or 'her')
94
- positive definite 'positive definite' (or 'pos')
95
- general 'general' (or 'gen')
96
- =================== ================================
88
+ ============================= ================================
89
+ diagonal 'diagonal'
90
+ tridiagonal 'tridiagonal'
91
+ banded 'banded'
92
+ upper triangular 'upper triangular'
93
+ lower triangular 'lower triangular'
94
+ symmetric 'symmetric' (or 'sym')
95
+ hermitian 'hermitian' (or 'her')
96
+ symmetric positive definite 'positive definite' (or 'pos')
97
+ general 'general' (or 'gen')
98
+ ============================= ================================
97
99
 
98
100
  Parameters
99
101
  ----------
@@ -133,7 +135,7 @@ def solve(a, b, lower=False, overwrite_a=False,
133
135
  ValueError
134
136
  If size mismatches detected or input a is not square.
135
137
  LinAlgError
136
- If the matrix is singular.
138
+ If the computation fails because of matrix singularity.
137
139
  LinAlgWarning
138
140
  If an ill-conditioned input a is detected.
139
141
  NotImplementedError
@@ -226,17 +228,6 @@ def solve(a, b, lower=False, overwrite_a=False,
226
228
  else:
227
229
  lamch = get_lapack_funcs('lamch', dtype='d')
228
230
 
229
- # Currently we do not have the other forms of the norm calculators
230
- # lansy, lanpo, lanhe.
231
- # However, in any case they only reduce computations slightly...
232
- if assume_a == 'diagonal':
233
- _matrix_norm = _matrix_norm_diagonal
234
- elif assume_a == 'tridiagonal':
235
- _matrix_norm = _matrix_norm_tridiagonal
236
- elif assume_a in {'lower triangular', 'upper triangular'}:
237
- _matrix_norm = _matrix_norm_triangular(assume_a)
238
- else:
239
- _matrix_norm = _matrix_norm_general
240
231
 
241
232
  # Since the I-norm and 1-norm are the same for symmetric matrices
242
233
  # we can collect them all in this one call
@@ -253,7 +244,23 @@ def solve(a, b, lower=False, overwrite_a=False,
253
244
  trans = 0
254
245
  norm = '1'
255
246
 
256
- anorm = _matrix_norm(norm, a1, check_finite)
247
+ # Currently we do not have the other forms of the norm calculators
248
+ # lansy, lanpo, lanhe.
249
+ # However, in any case they only reduce computations slightly...
250
+ if assume_a == 'diagonal':
251
+ anorm = _matrix_norm_diagonal(a1, check_finite)
252
+ elif assume_a == 'tridiagonal':
253
+ anorm = _matrix_norm_tridiagonal(norm, a1, check_finite)
254
+ elif assume_a == 'banded':
255
+ n_below, n_above = bandwidth(a1) if n_below is None else (n_below, n_above)
256
+ a2, n_below, n_above = ((a1.T, n_above, n_below) if transposed
257
+ else (a1, n_below, n_above))
258
+ ab = _to_banded(n_below, n_above, a2)
259
+ anorm = _matrix_norm_banded(n_below, n_above, norm, ab, check_finite)
260
+ elif assume_a in {'lower triangular', 'upper triangular'}:
261
+ anorm = _matrix_norm_triangular(assume_a, norm, a1, check_finite)
262
+ else:
263
+ anorm = _matrix_norm_general(norm, a1, check_finite)
257
264
 
258
265
  info, rcond = 0, np.inf
259
266
 
@@ -277,7 +284,7 @@ def solve(a, b, lower=False, overwrite_a=False,
277
284
  overwrite_a=overwrite_a,
278
285
  overwrite_b=overwrite_b)
279
286
  _solve_check(n, info)
280
- rcond, info = hecon(lu, ipvt, anorm)
287
+ rcond, info = hecon(lu, ipvt, anorm, lower=lower)
281
288
  # Symmetric case 'sysv'
282
289
  elif assume_a in {'symmetric', 'sym'}:
283
290
  sycon, sysv, sysv_lw = get_lapack_funcs(('sycon', 'sysv',
@@ -288,13 +295,14 @@ def solve(a, b, lower=False, overwrite_a=False,
288
295
  overwrite_a=overwrite_a,
289
296
  overwrite_b=overwrite_b)
290
297
  _solve_check(n, info)
291
- rcond, info = sycon(lu, ipvt, anorm)
298
+ rcond, info = sycon(lu, ipvt, anorm, lower=lower)
292
299
  # Diagonal case
293
300
  elif assume_a == 'diagonal':
294
301
  diag_a = np.diag(a1)
295
302
  x = (b1.T / diag_a).T
296
303
  abs_diag_a = np.abs(diag_a)
297
- rcond = abs_diag_a.min() / abs_diag_a.max()
304
+ diag_min = abs_diag_a.min()
305
+ rcond = diag_min if diag_min == 0 else diag_min / abs_diag_a.max()
298
306
  # Tri-diagonal case
299
307
  elif assume_a == 'tridiagonal':
300
308
  a1 = a1.T if transposed else a1
@@ -307,18 +315,14 @@ def solve(a, b, lower=False, overwrite_a=False,
307
315
  rcond, info = _gtcon(dl, d, du, du2, ipiv, anorm)
308
316
  # Banded case
309
317
  elif assume_a == 'banded':
310
- a1, n_below, n_above = ((a1.T, n_above, n_below) if transposed
311
- else (a1, n_below, n_above))
312
- n_below, n_above = bandwidth(a1) if n_below is None else (n_below, n_above)
313
- ab = _to_banded(n_below, n_above, a1)
314
- gbsv, = get_lapack_funcs(('gbsv',), (a1, b1))
318
+ gbsv, gbcon = get_lapack_funcs(('gbsv', 'gbcon'), (a1, b1))
315
319
  # Next two lines copied from `solve_banded`
316
320
  a2 = np.zeros((2*n_below + n_above + 1, ab.shape[1]), dtype=gbsv.dtype)
317
321
  a2[n_below:, :] = ab
318
- _, _, x, info = gbsv(n_below, n_above, a2, b1,
319
- overwrite_ab=True, overwrite_b=overwrite_b)
322
+ lu, piv, x, info = gbsv(n_below, n_above, a2, b1,
323
+ overwrite_ab=True, overwrite_b=overwrite_b)
320
324
  _solve_check(n, info)
321
- # TODO: wrap gbcon and use to get rcond
325
+ rcond, info = gbcon(n_below, n_above, lu, piv, anorm)
322
326
  # Triangular case
323
327
  elif assume_a in {'lower triangular', 'upper triangular'}:
324
328
  lower = assume_a == 'lower triangular'
@@ -345,7 +349,7 @@ def solve(a, b, lower=False, overwrite_a=False,
345
349
  return x
346
350
 
347
351
 
348
- def _matrix_norm_diagonal(_, a, check_finite):
352
+ def _matrix_norm_diagonal(a, check_finite):
349
353
  # Equivalent of dlange for diagonal matrix, assuming
350
354
  # norm is either 'I' or '1' (really just not the Frobenius norm)
351
355
  d = np.diag(a)
@@ -367,12 +371,16 @@ def _matrix_norm_tridiagonal(norm, a, check_finite):
367
371
  return d.max()
368
372
 
369
373
 
370
- def _matrix_norm_triangular(structure):
371
- def fun(norm, a, check_finite):
372
- a = np.asarray_chkfinite(a) if check_finite else a
373
- lantr = get_lapack_funcs('lantr', (a,))
374
- return lantr(norm, a, 'L' if structure == 'lower triangular' else 'U' )
375
- return fun
374
+ def _matrix_norm_triangular(structure, norm, a, check_finite):
375
+ a = np.asarray_chkfinite(a) if check_finite else a
376
+ lantr = get_lapack_funcs('lantr', (a,))
377
+ return lantr(norm, a, 'L' if structure == 'lower triangular' else 'U' )
378
+
379
+
380
+ def _matrix_norm_banded(kl, ku, norm, ab, check_finite):
381
+ ab = np.asarray_chkfinite(ab) if check_finite else ab
382
+ langb = get_lapack_funcs('langb', (ab,))
383
+ return langb(norm, kl, ku, ab)
376
384
 
377
385
 
378
386
  def _matrix_norm_general(norm, a, check_finite):
@@ -408,10 +416,11 @@ def _ensure_dtype_cdsz(*arrays):
408
416
  return (array.astype(dtype, copy=False) for array in arrays)
409
417
 
410
418
 
419
+ @_apply_over_batch(('a', 2), ('b', '1|2'))
411
420
  def solve_triangular(a, b, trans=0, lower=False, unit_diagonal=False,
412
421
  overwrite_b=False, check_finite=True):
413
422
  """
414
- Solve the equation ``a x = b`` for `x`, assuming a is a triangular matrix.
423
+ Solve the equation ``a @ x = b`` for ``x``, where `a` is a triangular matrix.
415
424
 
416
425
  Parameters
417
426
  ----------
@@ -516,16 +525,15 @@ def _solve_triangular(a1, b1, trans=0, lower=False, unit_diagonal=False,
516
525
  if info == 0:
517
526
  return x, info
518
527
  if info > 0:
519
- raise LinAlgError("singular matrix: resolution failed at diagonal %d" %
520
- (info-1))
521
- raise ValueError('illegal value in %dth argument of internal trtrs' %
522
- (-info))
528
+ raise LinAlgError(f"singular matrix: resolution failed at diagonal {info-1}")
529
+ raise ValueError(f'illegal value in {-info}-th argument of internal trtrs')
523
530
 
524
531
 
525
532
  def solve_banded(l_and_u, ab, b, overwrite_ab=False, overwrite_b=False,
526
533
  check_finite=True):
527
534
  """
528
- Solve the equation a x = b for x, assuming a is banded matrix.
535
+ Solve the equation ``a @ x = b`` for ``x``, where ``a`` is the banded matrix
536
+ defined by `ab`.
529
537
 
530
538
  The matrix a is stored in `ab` using the matrix diagonal ordered form::
531
539
 
@@ -591,7 +599,13 @@ def solve_banded(l_and_u, ab, b, overwrite_ab=False, overwrite_b=False,
591
599
  array([-2.37288136, 3.93220339, -4. , 4.3559322 , -1.3559322 ])
592
600
 
593
601
  """
602
+ (nlower, nupper) = l_and_u
603
+ return _solve_banded(nlower, nupper, ab, b, overwrite_ab=overwrite_ab,
604
+ overwrite_b=overwrite_b, check_finite=check_finite)
605
+
594
606
 
607
+ @_apply_over_batch(('nlower', 0), ('nupper', 0), ('ab', 2), ('b', '1|2'))
608
+ def _solve_banded(nlower, nupper, ab, b, overwrite_ab, overwrite_b, check_finite):
595
609
  a1 = _asarray_validated(ab, check_finite=check_finite, as_inexact=True)
596
610
  b1 = _asarray_validated(b, check_finite=check_finite, as_inexact=True)
597
611
 
@@ -599,11 +613,11 @@ def solve_banded(l_and_u, ab, b, overwrite_ab=False, overwrite_b=False,
599
613
  if a1.shape[-1] != b1.shape[0]:
600
614
  raise ValueError("shapes of ab and b are not compatible.")
601
615
 
602
- (nlower, nupper) = l_and_u
603
616
  if nlower + nupper + 1 != a1.shape[0]:
604
- raise ValueError("invalid values for the number of lower and upper "
605
- "diagonals: l+u+1 (%d) does not equal ab.shape[0] "
606
- "(%d)" % (nlower + nupper + 1, ab.shape[0]))
617
+ raise ValueError(
618
+ f"invalid values for the number of lower and upper diagonals: l+u+1 "
619
+ f"({nlower + nupper + 1}) does not equal ab.shape[0] ({ab.shape[0]})"
620
+ )
607
621
 
608
622
  # accommodate empty arrays
609
623
  if b1.size == 0:
@@ -638,14 +652,15 @@ def solve_banded(l_and_u, ab, b, overwrite_ab=False, overwrite_b=False,
638
652
  return x
639
653
  if info > 0:
640
654
  raise LinAlgError("singular matrix")
641
- raise ValueError('illegal value in %d-th argument of internal '
642
- 'gbsv/gtsv' % -info)
655
+ raise ValueError(f'illegal value in {-info}-th argument of internal gbsv/gtsv')
643
656
 
644
657
 
658
+ @_apply_over_batch(('a', 2), ('b', '1|2'))
645
659
  def solveh_banded(ab, b, overwrite_ab=False, overwrite_b=False, lower=False,
646
660
  check_finite=True):
647
661
  """
648
- Solve equation a x = b. a is Hermitian positive-definite banded matrix.
662
+ Solve the equation ``a @ x = b`` for ``x``, where ``a`` is the
663
+ Hermitian positive-definite banded matrix defined by `ab`.
649
664
 
650
665
  Uses Thomas' Algorithm, which is more efficient than standard LU
651
666
  factorization, but should only be used for Hermitian positive-definite
@@ -775,18 +790,18 @@ def solveh_banded(ab, b, overwrite_ab=False, overwrite_b=False, lower=False,
775
790
  c, x, info = pbsv(a1, b1, lower=lower, overwrite_ab=overwrite_ab,
776
791
  overwrite_b=overwrite_b)
777
792
  if info > 0:
778
- raise LinAlgError("%dth leading minor not positive definite" % info)
793
+ raise LinAlgError(f"{info}th leading minor not positive definite")
779
794
  if info < 0:
780
- raise ValueError('illegal value in %dth argument of internal '
781
- 'pbsv' % -info)
795
+ raise ValueError(f'illegal value in {-info}th argument of internal pbsv')
782
796
  return x
783
797
 
784
798
 
785
799
  def solve_toeplitz(c_or_cr, b, check_finite=True):
786
- r"""Solve a Toeplitz system using Levinson Recursion
800
+ r"""Solve the equation ``T @ x = b`` for ``x``, where ``T`` is a Toeplitz
801
+ matrix defined by `c_or_cr`.
787
802
 
788
- The Toeplitz matrix has constant diagonals, with c as its first column
789
- and r as its first row. If r is not given, ``r == conjugate(c)`` is
803
+ The Toeplitz matrix has constant diagonals, with ``c`` as its first column
804
+ and ``r`` as its first row. If ``r`` is not given, ``r == conjugate(c)`` is
790
805
  assumed.
791
806
 
792
807
  .. warning::
@@ -812,7 +827,7 @@ def solve_toeplitz(c_or_cr, b, check_finite=True):
812
827
  Returns
813
828
  -------
814
829
  x : (M,) or (M, K) ndarray
815
- The solution to the system ``T x = b``. Shape of return matches shape
830
+ The solution to the system ``T @ x = b``. Shape of return matches shape
816
831
  of `b`.
817
832
 
818
833
  See Also
@@ -826,7 +841,7 @@ def solve_toeplitz(c_or_cr, b, check_finite=True):
826
841
 
827
842
  Examples
828
843
  --------
829
- Solve the Toeplitz system T x = b, where::
844
+ Solve the Toeplitz system ``T @ x = b``, where::
830
845
 
831
846
  [ 1 -1 -2 -3] [1]
832
847
  T = [ 3 1 -1 -2] b = [2]
@@ -847,7 +862,7 @@ def solve_toeplitz(c_or_cr, b, check_finite=True):
847
862
  array([ 1.66666667, -1. , -2.66666667, 2.33333333])
848
863
 
849
864
  Check the result by creating the full Toeplitz matrix and
850
- multiplying it by `x`. We should get `b`.
865
+ multiplying it by ``x``. We should get `b`.
851
866
 
852
867
  >>> T = toeplitz(c, r)
853
868
  >>> T.dot(x)
@@ -857,9 +872,15 @@ def solve_toeplitz(c_or_cr, b, check_finite=True):
857
872
  # If numerical stability of this algorithm is a problem, a future
858
873
  # developer might consider implementing other O(N^2) Toeplitz solvers,
859
874
  # such as GKO (https://www.jstor.org/stable/2153371) or Bareiss.
875
+ c, r = c_or_cr if isinstance(c_or_cr, tuple) else (c_or_cr, np.conjugate(c_or_cr))
876
+ return _solve_toeplitz(c, r, b, check_finite)
860
877
 
878
+
879
+ # Can uncomment when `solve_toeplitz` deprecation is done (SciPy 1.17)
880
+ # @_apply_over_batch(('c', 1), ('r', 1), ('b', '1|2'))
881
+ def _solve_toeplitz(c, r, b, check_finite):
861
882
  r, c, b, dtype, b_shape = _validate_args_for_toeplitz_ops(
862
- c_or_cr, b, check_finite, keep_b_shape=True)
883
+ (c, r), b, check_finite, keep_b_shape=True)
863
884
 
864
885
  # accommodate empty arrays
865
886
  if b.size == 0:
@@ -892,7 +913,8 @@ def _get_axis_len(aname, a, axis):
892
913
 
893
914
  def solve_circulant(c, b, singular='raise', tol=None,
894
915
  caxis=-1, baxis=0, outaxis=0):
895
- """Solve C x = b for x, where C is a circulant matrix.
916
+ """Solve the equation ``C @ x = b`` for ``x``, where ``C`` is a
917
+ circulant matrix defined by `c`.
896
918
 
897
919
  `C` is the circulant matrix associated with the vector `c`.
898
920
 
@@ -1094,6 +1116,7 @@ def solve_circulant(c, b, singular='raise', tol=None,
1094
1116
 
1095
1117
 
1096
1118
  # matrix inversion
1119
+ @_apply_over_batch(('a', 2))
1097
1120
  def inv(a, overwrite_a=False, check_finite=True):
1098
1121
  """
1099
1122
  Compute the inverse of a matrix.
@@ -1162,8 +1185,9 @@ def inv(a, overwrite_a=False, check_finite=True):
1162
1185
  if info > 0:
1163
1186
  raise LinAlgError("singular matrix")
1164
1187
  if info < 0:
1165
- raise ValueError('illegal value in %d-th argument of internal '
1166
- 'getrf|getri' % -info)
1188
+ raise ValueError(
1189
+ f'illegal value in {-info}-th argument of internal getrf|getri'
1190
+ )
1167
1191
  return inv_a
1168
1192
 
1169
1193
 
@@ -1298,10 +1322,11 @@ def det(a, overwrite_a=False, check_finite=True):
1298
1322
 
1299
1323
 
1300
1324
  # Linear Least Squares
1325
+ @_apply_over_batch(('a', 2), ('b', '1|2'))
1301
1326
  def lstsq(a, b, cond=None, overwrite_a=False, overwrite_b=False,
1302
1327
  check_finite=True, lapack_driver=None):
1303
1328
  """
1304
- Compute least-squares solution to equation Ax = b.
1329
+ Compute least-squares solution to the equation ``a @ x = b``.
1305
1330
 
1306
1331
  Compute a vector x such that the 2-norm ``|b - A x|`` is minimized.
1307
1332
 
@@ -1477,8 +1502,9 @@ def lstsq(a, b, cond=None, overwrite_a=False, overwrite_b=False,
1477
1502
  if info > 0:
1478
1503
  raise LinAlgError("SVD did not converge in Linear Least Squares")
1479
1504
  if info < 0:
1480
- raise ValueError('illegal value in %d-th argument of internal %s'
1481
- % (-info, lapack_driver))
1505
+ raise ValueError(
1506
+ f'illegal value in {-info}-th argument of internal {lapack_driver}'
1507
+ )
1482
1508
  resids = np.asarray([], dtype=x.dtype)
1483
1509
  if m > n:
1484
1510
  x1 = x[:n]
@@ -1493,8 +1519,7 @@ def lstsq(a, b, cond=None, overwrite_a=False, overwrite_b=False,
1493
1519
  v, x, j, rank, info = lapack_func(a1, b1, jptv, cond,
1494
1520
  lwork, False, False)
1495
1521
  if info < 0:
1496
- raise ValueError("illegal value in %d-th argument of internal "
1497
- "gelsy" % -info)
1522
+ raise ValueError(f'illegal value in {-info}-th argument of internal gelsy')
1498
1523
  if m > n:
1499
1524
  x1 = x[:n]
1500
1525
  x = x1
@@ -1504,6 +1529,7 @@ def lstsq(a, b, cond=None, overwrite_a=False, overwrite_b=False,
1504
1529
  lstsq.default_lapack_driver = 'gelsd'
1505
1530
 
1506
1531
 
1532
+ @_apply_over_batch(('a', 2))
1507
1533
  def pinv(a, *, atol=None, rtol=None, return_rank=False, check_finite=True):
1508
1534
  """
1509
1535
  Compute the (Moore-Penrose) pseudo-inverse of a matrix.
@@ -1627,6 +1653,7 @@ def pinv(a, *, atol=None, rtol=None, return_rank=False, check_finite=True):
1627
1653
  return B
1628
1654
 
1629
1655
 
1656
+ @_apply_over_batch(('a', 2))
1630
1657
  def pinvh(a, atol=None, rtol=None, lower=True, return_rank=False,
1631
1658
  check_finite=True):
1632
1659
  """
@@ -1720,6 +1747,7 @@ def pinvh(a, atol=None, rtol=None, lower=True, return_rank=False,
1720
1747
  return B
1721
1748
 
1722
1749
 
1750
+ @_apply_over_batch(('A', 2))
1723
1751
  def matrix_balance(A, permute=True, scale=True, separate=False,
1724
1752
  overwrite_a=False):
1725
1753
  """
@@ -1733,15 +1761,6 @@ def matrix_balance(A, permute=True, scale=True, separate=False,
1733
1761
  triangular parts of the matrix and, again if scaling is also enabled,
1734
1762
  only the remaining subblocks are subjected to scaling.
1735
1763
 
1736
- The balanced matrix satisfies the following equality
1737
-
1738
- .. math::
1739
-
1740
- B = T^{-1} A T
1741
-
1742
- The scaling coefficients are approximated to the nearest power of 2
1743
- to avoid round-off errors.
1744
-
1745
1764
  Parameters
1746
1765
  ----------
1747
1766
  A : (n, n) array_like
@@ -1774,6 +1793,14 @@ def matrix_balance(A, permute=True, scale=True, separate=False,
1774
1793
 
1775
1794
  Notes
1776
1795
  -----
1796
+ The balanced matrix satisfies the following equality
1797
+
1798
+ .. math::
1799
+ B = T^{-1} A T
1800
+
1801
+ The scaling coefficients are approximated to the nearest power of 2
1802
+ to avoid round-off errors.
1803
+
1777
1804
  This algorithm is particularly useful for eigenvalue and matrix
1778
1805
  decompositions and in many cases it is already called by various
1779
1806
  LAPACK routines.
scipy/linalg/_decomp.py CHANGED
@@ -21,7 +21,7 @@ from numpy import (array, isfinite, inexact, nonzero, iscomplexobj,
21
21
  flatnonzero, conj, asarray, argsort, empty,
22
22
  iscomplex, zeros, einsum, eye, inf)
23
23
  # Local imports
24
- from scipy._lib._util import _asarray_validated
24
+ from scipy._lib._util import _asarray_validated, _apply_over_batch
25
25
  from ._misc import LinAlgError, _datacopied, norm
26
26
  from .lapack import get_lapack_funcs, _compute_lwork
27
27
 
@@ -111,6 +111,7 @@ def _geneig(a1, b1, left, right, overwrite_a, overwrite_b,
111
111
  return w, vr
112
112
 
113
113
 
114
+ @_apply_over_batch(('a', 2), ('b', 2))
114
115
  def eig(a, b=None, left=False, right=True, overwrite_a=False,
115
116
  overwrite_b=False, check_finite=True, homogeneous_eigvals=False):
116
117
  """
@@ -280,6 +281,7 @@ def eig(a, b=None, left=False, right=True, overwrite_a=False,
280
281
  return w, vr
281
282
 
282
283
 
284
+ @_apply_over_batch(('a', 2), ('b', 2))
283
285
  def eigh(a, b=None, *, lower=True, eigvals_only=False, overwrite_a=False,
284
286
  overwrite_b=False, type=1, check_finite=True, subset_by_index=None,
285
287
  subset_by_value=None, driver=None):
@@ -656,6 +658,7 @@ def _check_select(select, select_range, max_ev, max_len):
656
658
  return select, vl, vu, il, iu, max_ev
657
659
 
658
660
 
661
+ @_apply_over_batch(('a_band', 2))
659
662
  def eig_banded(a_band, lower=False, eigvals_only=False, overwrite_a_band=False,
660
663
  select='a', select_range=None, max_ev=0, check_finite=True):
661
664
  """
@@ -835,6 +838,7 @@ def eig_banded(a_band, lower=False, eigvals_only=False, overwrite_a_band=False,
835
838
  return w, v
836
839
 
837
840
 
841
+ @_apply_over_batch(('a', 2), ('b', 2))
838
842
  def eigvals(a, b=None, overwrite_a=False, check_finite=True,
839
843
  homogeneous_eigvals=False):
840
844
  """
@@ -910,6 +914,7 @@ def eigvals(a, b=None, overwrite_a=False, check_finite=True,
910
914
  homogeneous_eigvals=homogeneous_eigvals)
911
915
 
912
916
 
917
+ @_apply_over_batch(('a', 2), ('b', 2))
913
918
  def eigvalsh(a, b=None, *, lower=True, overwrite_a=False,
914
919
  overwrite_b=False, type=1, check_finite=True, subset_by_index=None,
915
920
  subset_by_value=None, driver=None):
@@ -1028,6 +1033,7 @@ def eigvalsh(a, b=None, *, lower=True, overwrite_a=False,
1028
1033
  driver=driver)
1029
1034
 
1030
1035
 
1036
+ @_apply_over_batch(('a_band', 2))
1031
1037
  def eigvals_banded(a_band, lower=False, overwrite_a_band=False,
1032
1038
  select='a', select_range=None, check_finite=True):
1033
1039
  """
@@ -1121,6 +1127,7 @@ def eigvals_banded(a_band, lower=False, overwrite_a_band=False,
1121
1127
  select_range=select_range, check_finite=check_finite)
1122
1128
 
1123
1129
 
1130
+ @_apply_over_batch(('d', 1), ('e', 1))
1124
1131
  def eigvalsh_tridiagonal(d, e, select='a', select_range=None,
1125
1132
  check_finite=True, tol=0., lapack_driver='auto'):
1126
1133
  """
@@ -1165,9 +1172,9 @@ def eigvalsh_tridiagonal(d, e, select='a', select_range=None,
1165
1172
  and ``|a|`` is the 1-norm of the matrix ``a``.
1166
1173
  lapack_driver : str
1167
1174
  LAPACK function to use, can be 'auto', 'stemr', 'stebz', 'sterf',
1168
- or 'stev'. When 'auto' (default), it will use 'stemr' if ``select='a'``
1169
- and 'stebz' otherwise. 'sterf' and 'stev' can only be used when
1170
- ``select='a'``.
1175
+ 'stev', or 'stevd'. When 'auto' (default), it will use 'stevd' if
1176
+ ``select='a'`` and 'stebz' otherwise. 'sterf' and 'stev' can only
1177
+ be used when ``select='a'``.
1171
1178
 
1172
1179
  Returns
1173
1180
  -------
@@ -1202,6 +1209,7 @@ def eigvalsh_tridiagonal(d, e, select='a', select_range=None,
1202
1209
  check_finite=check_finite, tol=tol, lapack_driver=lapack_driver)
1203
1210
 
1204
1211
 
1212
+ @_apply_over_batch(('d', 1), ('e', 1))
1205
1213
  def eigh_tridiagonal(d, e, eigvals_only=False, select='a', select_range=None,
1206
1214
  check_finite=True, tol=0., lapack_driver='auto'):
1207
1215
  """
@@ -1249,7 +1257,7 @@ def eigh_tridiagonal(d, e, eigvals_only=False, select='a', select_range=None,
1249
1257
  and ``|a|`` is the 1-norm of the matrix ``a``.
1250
1258
  lapack_driver : str
1251
1259
  LAPACK function to use, can be 'auto', 'stemr', 'stebz', 'sterf',
1252
- or 'stev'. When 'auto' (default), it will use 'stemr' if ``select='a'``
1260
+ 'stev', or 'stevd'. When 'auto' (default), it will use 'stevd' if ``select='a'``
1253
1261
  and 'stebz' otherwise. When 'stebz' is used to find the eigenvalues and
1254
1262
  ``eigvals_only=False``, then a second LAPACK call (to ``?STEIN``) is
1255
1263
  used to find the corresponding eigenvectors. 'sterf' can only be
@@ -1307,12 +1315,12 @@ def eigh_tridiagonal(d, e, eigvals_only=False, select='a', select_range=None,
1307
1315
  select, select_range, 0, d.size)
1308
1316
  if not isinstance(lapack_driver, str):
1309
1317
  raise TypeError('lapack_driver must be str')
1310
- drivers = ('auto', 'stemr', 'sterf', 'stebz', 'stev')
1318
+ drivers = ('auto', 'stemr', 'sterf', 'stebz', 'stev', 'stevd')
1311
1319
  if lapack_driver not in drivers:
1312
1320
  raise ValueError(f'lapack_driver must be one of {drivers}, '
1313
1321
  f'got {lapack_driver}')
1314
1322
  if lapack_driver == 'auto':
1315
- lapack_driver = 'stemr' if select == 0 else 'stebz'
1323
+ lapack_driver = 'stevd' if select == 0 else 'stebz'
1316
1324
 
1317
1325
  # Quick exit for 1x1 case
1318
1326
  if len(d) == 1:
@@ -1343,6 +1351,11 @@ def eigh_tridiagonal(d, e, eigvals_only=False, select='a', select_range=None,
1343
1351
  raise ValueError('stev can only be used when select == "a"')
1344
1352
  w, v, info = func(d, e, compute_v=compute_v)
1345
1353
  m = len(w)
1354
+ elif lapack_driver == 'stevd':
1355
+ if select != 0:
1356
+ raise ValueError('stevd can only be used when select == "a"')
1357
+ w, v, info = func(d, e, compute_v=compute_v)
1358
+ m = len(w)
1346
1359
  elif lapack_driver == 'stebz':
1347
1360
  tol = float(tol)
1348
1361
  internal_name = 'stebz'
@@ -1384,12 +1397,12 @@ def eigh_tridiagonal(d, e, eigvals_only=False, select='a', select_range=None,
1384
1397
  def _check_info(info, driver, positive='did not converge (LAPACK info=%d)'):
1385
1398
  """Check info return value."""
1386
1399
  if info < 0:
1387
- raise ValueError('illegal value in argument %d of internal %s'
1388
- % (-info, driver))
1400
+ raise ValueError(f'illegal value in argument {-info} of internal {driver}')
1389
1401
  if info > 0 and positive:
1390
1402
  raise LinAlgError(("%s " + positive) % (driver, info,))
1391
1403
 
1392
1404
 
1405
+ @_apply_over_batch(('a', 2))
1393
1406
  def hessenberg(a, calc_q=False, overwrite_a=False, check_finite=True):
1394
1407
  """
1395
1408
  Compute Hessenberg form of a matrix.