scipy 1.15.3__cp312-cp312-macosx_14_0_arm64.whl → 1.16.0rc2__cp312-cp312-macosx_14_0_arm64.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 (628) hide show
  1. scipy/__config__.py +4 -4
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-312-darwin.so +0 -0
  4. scipy/_lib/_array_api.py +486 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-312-darwin.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_sparse.py +41 -0
  11. scipy/_lib/_test_deprecation_call.cpython-312-darwin.so +0 -0
  12. scipy/_lib/_test_deprecation_def.cpython-312-darwin.so +0 -0
  13. scipy/_lib/_testutils.py +6 -2
  14. scipy/_lib/_util.py +222 -125
  15. scipy/_lib/array_api_compat/__init__.py +4 -4
  16. scipy/_lib/array_api_compat/_internal.py +19 -6
  17. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  18. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  19. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  20. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  21. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  22. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  23. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  24. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  25. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  26. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  27. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  28. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  29. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  30. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  31. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  32. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  33. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  34. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  35. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  36. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  37. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  38. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  39. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  40. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  41. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  42. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  43. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  44. scipy/_lib/array_api_extra/__init__.py +26 -3
  45. scipy/_lib/array_api_extra/_delegation.py +171 -0
  46. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  47. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  48. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  49. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  50. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  51. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  52. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  58. scipy/_lib/array_api_extra/testing.py +359 -0
  59. scipy/_lib/decorator.py +2 -2
  60. scipy/_lib/doccer.py +1 -7
  61. scipy/_lib/messagestream.cpython-312-darwin.so +0 -0
  62. scipy/_lib/pyprima/__init__.py +212 -0
  63. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  64. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  65. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  66. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  67. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  68. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  69. scipy/_lib/pyprima/cobyla/update.py +289 -0
  70. scipy/_lib/pyprima/common/__init__.py +0 -0
  71. scipy/_lib/pyprima/common/_bounds.py +34 -0
  72. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  73. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  74. scipy/_lib/pyprima/common/_project.py +173 -0
  75. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  76. scipy/_lib/pyprima/common/consts.py +47 -0
  77. scipy/_lib/pyprima/common/evaluate.py +99 -0
  78. scipy/_lib/pyprima/common/history.py +38 -0
  79. scipy/_lib/pyprima/common/infos.py +30 -0
  80. scipy/_lib/pyprima/common/linalg.py +435 -0
  81. scipy/_lib/pyprima/common/message.py +290 -0
  82. scipy/_lib/pyprima/common/powalg.py +131 -0
  83. scipy/_lib/pyprima/common/preproc.py +277 -0
  84. scipy/_lib/pyprima/common/present.py +5 -0
  85. scipy/_lib/pyprima/common/ratio.py +54 -0
  86. scipy/_lib/pyprima/common/redrho.py +47 -0
  87. scipy/_lib/pyprima/common/selectx.py +296 -0
  88. scipy/_lib/tests/test__util.py +105 -121
  89. scipy/_lib/tests/test_array_api.py +166 -35
  90. scipy/_lib/tests/test_bunch.py +7 -0
  91. scipy/_lib/tests/test_ccallback.py +2 -10
  92. scipy/_lib/tests/test_public_api.py +13 -0
  93. scipy/cluster/_hierarchy.cpython-312-darwin.so +0 -0
  94. scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
  95. scipy/cluster/_vq.cpython-312-darwin.so +0 -0
  96. scipy/cluster/hierarchy.py +393 -223
  97. scipy/cluster/tests/test_hierarchy.py +273 -335
  98. scipy/cluster/tests/test_vq.py +45 -61
  99. scipy/cluster/vq.py +39 -35
  100. scipy/conftest.py +263 -157
  101. scipy/constants/_constants.py +4 -1
  102. scipy/constants/tests/test_codata.py +2 -2
  103. scipy/constants/tests/test_constants.py +11 -18
  104. scipy/datasets/_download_all.py +15 -1
  105. scipy/datasets/_fetchers.py +7 -1
  106. scipy/datasets/_utils.py +1 -1
  107. scipy/differentiate/_differentiate.py +25 -25
  108. scipy/differentiate/tests/test_differentiate.py +24 -25
  109. scipy/fft/_basic.py +20 -0
  110. scipy/fft/_helper.py +3 -34
  111. scipy/fft/_pocketfft/helper.py +29 -1
  112. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  113. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  114. scipy/fft/_realtransforms.py +13 -0
  115. scipy/fft/tests/test_basic.py +27 -25
  116. scipy/fft/tests/test_fftlog.py +16 -7
  117. scipy/fft/tests/test_helper.py +18 -34
  118. scipy/fft/tests/test_real_transforms.py +8 -10
  119. scipy/fftpack/convolve.cpython-312-darwin.so +0 -0
  120. scipy/fftpack/tests/test_basic.py +2 -4
  121. scipy/fftpack/tests/test_real_transforms.py +8 -9
  122. scipy/integrate/_bvp.py +9 -3
  123. scipy/integrate/_cubature.py +3 -2
  124. scipy/integrate/_dop.cpython-312-darwin.so +0 -0
  125. scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
  126. scipy/integrate/_ode.py +9 -2
  127. scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
  128. scipy/integrate/_quad_vec.py +21 -29
  129. scipy/integrate/_quadpack.cpython-312-darwin.so +0 -0
  130. scipy/integrate/_quadpack_py.py +11 -7
  131. scipy/integrate/_quadrature.py +3 -3
  132. scipy/integrate/_rules/_base.py +2 -2
  133. scipy/integrate/_tanhsinh.py +48 -47
  134. scipy/integrate/_test_odeint_banded.cpython-312-darwin.so +0 -0
  135. scipy/integrate/_vode.cpython-312-darwin.so +0 -0
  136. scipy/integrate/tests/test__quad_vec.py +0 -6
  137. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  138. scipy/integrate/tests/test_cubature.py +21 -35
  139. scipy/integrate/tests/test_quadrature.py +6 -8
  140. scipy/integrate/tests/test_tanhsinh.py +56 -48
  141. scipy/interpolate/__init__.py +70 -58
  142. scipy/interpolate/_bary_rational.py +22 -22
  143. scipy/interpolate/_bsplines.py +119 -66
  144. scipy/interpolate/_cubic.py +65 -50
  145. scipy/interpolate/_dfitpack.cpython-312-darwin.so +0 -0
  146. scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
  147. scipy/interpolate/_fitpack.cpython-312-darwin.so +0 -0
  148. scipy/interpolate/_fitpack2.py +9 -6
  149. scipy/interpolate/_fitpack_impl.py +32 -26
  150. scipy/interpolate/_fitpack_repro.py +23 -19
  151. scipy/interpolate/_interpnd.cpython-312-darwin.so +0 -0
  152. scipy/interpolate/_interpolate.py +30 -12
  153. scipy/interpolate/_ndbspline.py +13 -18
  154. scipy/interpolate/_ndgriddata.py +5 -8
  155. scipy/interpolate/_polyint.py +95 -31
  156. scipy/interpolate/_ppoly.cpython-312-darwin.so +0 -0
  157. scipy/interpolate/_rbf.py +2 -2
  158. scipy/interpolate/_rbfinterp.py +1 -1
  159. scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
  160. scipy/interpolate/_rgi.py +31 -26
  161. scipy/interpolate/_rgi_cython.cpython-312-darwin.so +0 -0
  162. scipy/interpolate/dfitpack.py +0 -20
  163. scipy/interpolate/interpnd.py +1 -2
  164. scipy/interpolate/tests/test_bary_rational.py +2 -2
  165. scipy/interpolate/tests/test_bsplines.py +97 -1
  166. scipy/interpolate/tests/test_fitpack2.py +39 -1
  167. scipy/interpolate/tests/test_interpnd.py +32 -20
  168. scipy/interpolate/tests/test_interpolate.py +48 -4
  169. scipy/interpolate/tests/test_rgi.py +2 -1
  170. scipy/io/_fast_matrix_market/__init__.py +2 -0
  171. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  172. scipy/io/_harwell_boeing/hb.py +7 -11
  173. scipy/io/_idl.py +5 -7
  174. scipy/io/_netcdf.py +15 -5
  175. scipy/io/_test_fortran.cpython-312-darwin.so +0 -0
  176. scipy/io/arff/tests/test_arffread.py +3 -3
  177. scipy/io/matlab/__init__.py +5 -3
  178. scipy/io/matlab/_mio.py +4 -1
  179. scipy/io/matlab/_mio5.py +19 -13
  180. scipy/io/matlab/_mio5_utils.cpython-312-darwin.so +0 -0
  181. scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
  182. scipy/io/matlab/_miobase.py +4 -1
  183. scipy/io/matlab/_streams.cpython-312-darwin.so +0 -0
  184. scipy/io/matlab/tests/test_mio.py +46 -18
  185. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  186. scipy/io/tests/test_mmio.py +7 -1
  187. scipy/io/tests/test_wavfile.py +41 -0
  188. scipy/io/wavfile.py +57 -10
  189. scipy/linalg/_basic.py +113 -86
  190. scipy/linalg/_cythonized_array_utils.cpython-312-darwin.so +0 -0
  191. scipy/linalg/_decomp.py +22 -9
  192. scipy/linalg/_decomp_cholesky.py +28 -13
  193. scipy/linalg/_decomp_cossin.py +45 -30
  194. scipy/linalg/_decomp_interpolative.cpython-312-darwin.so +0 -0
  195. scipy/linalg/_decomp_ldl.py +4 -1
  196. scipy/linalg/_decomp_lu.py +18 -6
  197. scipy/linalg/_decomp_lu_cython.cpython-312-darwin.so +0 -0
  198. scipy/linalg/_decomp_polar.py +2 -0
  199. scipy/linalg/_decomp_qr.py +6 -2
  200. scipy/linalg/_decomp_qz.py +3 -0
  201. scipy/linalg/_decomp_schur.py +3 -1
  202. scipy/linalg/_decomp_svd.py +13 -2
  203. scipy/linalg/_decomp_update.cpython-312-darwin.so +0 -0
  204. scipy/linalg/_expm_frechet.py +4 -0
  205. scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
  206. scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
  207. scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
  208. scipy/linalg/_matfuncs.py +187 -4
  209. scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
  210. scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
  211. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  212. scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
  213. scipy/linalg/_procrustes.py +2 -0
  214. scipy/linalg/_sketches.py +17 -6
  215. scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
  216. scipy/linalg/_solvers.py +7 -2
  217. scipy/linalg/_special_matrices.py +26 -36
  218. scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
  219. scipy/linalg/cython_lapack.cpython-312-darwin.so +0 -0
  220. scipy/linalg/lapack.py +22 -2
  221. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  222. scipy/linalg/tests/test_basic.py +31 -16
  223. scipy/linalg/tests/test_batch.py +588 -0
  224. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  225. scipy/linalg/tests/test_decomp.py +40 -3
  226. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  227. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  228. scipy/linalg/tests/test_lapack.py +115 -7
  229. scipy/linalg/tests/test_matfuncs.py +157 -102
  230. scipy/linalg/tests/test_procrustes.py +0 -7
  231. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  232. scipy/linalg/tests/test_special_matrices.py +1 -5
  233. scipy/ndimage/__init__.py +1 -0
  234. scipy/ndimage/_cytest.cpython-312-darwin.so +0 -0
  235. scipy/ndimage/_delegators.py +8 -2
  236. scipy/ndimage/_filters.py +453 -5
  237. scipy/ndimage/_interpolation.py +36 -6
  238. scipy/ndimage/_measurements.py +4 -2
  239. scipy/ndimage/_morphology.py +5 -0
  240. scipy/ndimage/_nd_image.cpython-312-darwin.so +0 -0
  241. scipy/ndimage/_ni_docstrings.py +5 -1
  242. scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
  243. scipy/ndimage/_ni_support.py +1 -5
  244. scipy/ndimage/_rank_filter_1d.cpython-312-darwin.so +0 -0
  245. scipy/ndimage/_support_alternative_backends.py +18 -6
  246. scipy/ndimage/tests/test_filters.py +370 -259
  247. scipy/ndimage/tests/test_fourier.py +7 -9
  248. scipy/ndimage/tests/test_interpolation.py +68 -61
  249. scipy/ndimage/tests/test_measurements.py +18 -35
  250. scipy/ndimage/tests/test_morphology.py +143 -131
  251. scipy/ndimage/tests/test_splines.py +1 -3
  252. scipy/odr/__odrpack.cpython-312-darwin.so +0 -0
  253. scipy/optimize/_basinhopping.py +13 -7
  254. scipy/optimize/_bglu_dense.cpython-312-darwin.so +0 -0
  255. scipy/optimize/_bracket.py +17 -24
  256. scipy/optimize/_chandrupatla.py +9 -10
  257. scipy/optimize/_cobyla_py.py +104 -123
  258. scipy/optimize/_constraints.py +14 -10
  259. scipy/optimize/_differentiable_functions.py +371 -230
  260. scipy/optimize/_differentialevolution.py +4 -3
  261. scipy/optimize/_direct.cpython-312-darwin.so +0 -0
  262. scipy/optimize/_dual_annealing.py +1 -1
  263. scipy/optimize/_elementwise.py +1 -4
  264. scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
  265. scipy/optimize/_lbfgsb.cpython-312-darwin.so +0 -0
  266. scipy/optimize/_lbfgsb_py.py +57 -16
  267. scipy/optimize/_linprog_doc.py +2 -2
  268. scipy/optimize/_linprog_highs.py +2 -2
  269. scipy/optimize/_linprog_ip.py +25 -10
  270. scipy/optimize/_linprog_util.py +14 -16
  271. scipy/optimize/_lsap.cpython-312-darwin.so +0 -0
  272. scipy/optimize/_lsq/common.py +3 -3
  273. scipy/optimize/_lsq/dogbox.py +16 -2
  274. scipy/optimize/_lsq/givens_elimination.cpython-312-darwin.so +0 -0
  275. scipy/optimize/_lsq/least_squares.py +198 -126
  276. scipy/optimize/_lsq/lsq_linear.py +6 -6
  277. scipy/optimize/_lsq/trf.py +35 -8
  278. scipy/optimize/_milp.py +3 -1
  279. scipy/optimize/_minimize.py +105 -36
  280. scipy/optimize/_minpack.cpython-312-darwin.so +0 -0
  281. scipy/optimize/_minpack_py.py +21 -14
  282. scipy/optimize/_moduleTNC.cpython-312-darwin.so +0 -0
  283. scipy/optimize/_nnls.py +20 -21
  284. scipy/optimize/_nonlin.py +34 -3
  285. scipy/optimize/_numdiff.py +288 -110
  286. scipy/optimize/_optimize.py +86 -48
  287. scipy/optimize/_pava_pybind.cpython-312-darwin.so +0 -0
  288. scipy/optimize/_remove_redundancy.py +5 -5
  289. scipy/optimize/_root_scalar.py +1 -1
  290. scipy/optimize/_shgo.py +6 -0
  291. scipy/optimize/_shgo_lib/_complex.py +1 -1
  292. scipy/optimize/_slsqp_py.py +216 -124
  293. scipy/optimize/_slsqplib.cpython-312-darwin.so +0 -0
  294. scipy/optimize/_spectral.py +1 -1
  295. scipy/optimize/_tnc.py +8 -1
  296. scipy/optimize/_trlib/_trlib.cpython-312-darwin.so +0 -0
  297. scipy/optimize/_trustregion.py +20 -6
  298. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  299. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  300. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  301. scipy/optimize/_trustregion_constr/projections.py +12 -8
  302. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  303. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  304. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  305. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  306. scipy/optimize/_trustregion_exact.py +0 -1
  307. scipy/optimize/_zeros.cpython-312-darwin.so +0 -0
  308. scipy/optimize/_zeros_py.py +97 -17
  309. scipy/optimize/cython_optimize/_zeros.cpython-312-darwin.so +0 -0
  310. scipy/optimize/slsqp.py +0 -1
  311. scipy/optimize/tests/test__basinhopping.py +1 -1
  312. scipy/optimize/tests/test__differential_evolution.py +4 -4
  313. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  314. scipy/optimize/tests/test__numdiff.py +66 -22
  315. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  316. scipy/optimize/tests/test__shgo.py +9 -1
  317. scipy/optimize/tests/test_bracket.py +36 -46
  318. scipy/optimize/tests/test_chandrupatla.py +133 -135
  319. scipy/optimize/tests/test_cobyla.py +74 -45
  320. scipy/optimize/tests/test_constraints.py +1 -1
  321. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  322. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  323. scipy/optimize/tests/test_least_squares.py +125 -13
  324. scipy/optimize/tests/test_linear_assignment.py +3 -3
  325. scipy/optimize/tests/test_linprog.py +3 -3
  326. scipy/optimize/tests/test_lsq_linear.py +6 -6
  327. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  328. scipy/optimize/tests/test_minpack.py +4 -4
  329. scipy/optimize/tests/test_nnls.py +43 -3
  330. scipy/optimize/tests/test_nonlin.py +36 -0
  331. scipy/optimize/tests/test_optimize.py +95 -17
  332. scipy/optimize/tests/test_slsqp.py +36 -4
  333. scipy/optimize/tests/test_zeros.py +34 -1
  334. scipy/signal/__init__.py +12 -23
  335. scipy/signal/_delegators.py +568 -0
  336. scipy/signal/_filter_design.py +459 -241
  337. scipy/signal/_fir_filter_design.py +262 -90
  338. scipy/signal/_lti_conversion.py +3 -2
  339. scipy/signal/_ltisys.py +118 -91
  340. scipy/signal/_max_len_seq_inner.cpython-312-darwin.so +0 -0
  341. scipy/signal/_peak_finding_utils.cpython-312-darwin.so +0 -0
  342. scipy/signal/_polyutils.py +172 -0
  343. scipy/signal/_short_time_fft.py +519 -70
  344. scipy/signal/_signal_api.py +30 -0
  345. scipy/signal/_signaltools.py +719 -399
  346. scipy/signal/_sigtools.cpython-312-darwin.so +0 -0
  347. scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
  348. scipy/signal/_spectral_py.py +230 -50
  349. scipy/signal/_spline.cpython-312-darwin.so +0 -0
  350. scipy/signal/_spline_filters.py +108 -68
  351. scipy/signal/_support_alternative_backends.py +73 -0
  352. scipy/signal/_upfirdn.py +4 -1
  353. scipy/signal/_upfirdn_apply.cpython-312-darwin.so +0 -0
  354. scipy/signal/_waveforms.py +2 -11
  355. scipy/signal/_wavelets.py +1 -1
  356. scipy/signal/fir_filter_design.py +1 -0
  357. scipy/signal/spline.py +4 -11
  358. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  359. scipy/signal/tests/test_bsplines.py +114 -79
  360. scipy/signal/tests/test_cont2discrete.py +9 -2
  361. scipy/signal/tests/test_filter_design.py +721 -481
  362. scipy/signal/tests/test_fir_filter_design.py +332 -140
  363. scipy/signal/tests/test_savitzky_golay.py +4 -3
  364. scipy/signal/tests/test_short_time_fft.py +221 -3
  365. scipy/signal/tests/test_signaltools.py +2144 -1348
  366. scipy/signal/tests/test_spectral.py +50 -6
  367. scipy/signal/tests/test_splines.py +161 -96
  368. scipy/signal/tests/test_upfirdn.py +84 -50
  369. scipy/signal/tests/test_waveforms.py +20 -0
  370. scipy/signal/tests/test_windows.py +607 -466
  371. scipy/signal/windows/_windows.py +287 -148
  372. scipy/sparse/__init__.py +23 -4
  373. scipy/sparse/_base.py +270 -108
  374. scipy/sparse/_bsr.py +7 -4
  375. scipy/sparse/_compressed.py +59 -231
  376. scipy/sparse/_construct.py +90 -38
  377. scipy/sparse/_coo.py +115 -181
  378. scipy/sparse/_csc.py +4 -4
  379. scipy/sparse/_csparsetools.cpython-312-darwin.so +0 -0
  380. scipy/sparse/_csr.py +2 -2
  381. scipy/sparse/_data.py +48 -48
  382. scipy/sparse/_dia.py +105 -18
  383. scipy/sparse/_dok.py +0 -23
  384. scipy/sparse/_index.py +4 -4
  385. scipy/sparse/_matrix.py +23 -0
  386. scipy/sparse/_sparsetools.cpython-312-darwin.so +0 -0
  387. scipy/sparse/_sputils.py +37 -22
  388. scipy/sparse/base.py +0 -9
  389. scipy/sparse/bsr.py +0 -14
  390. scipy/sparse/compressed.py +0 -23
  391. scipy/sparse/construct.py +0 -6
  392. scipy/sparse/coo.py +0 -14
  393. scipy/sparse/csc.py +0 -3
  394. scipy/sparse/csgraph/_flow.cpython-312-darwin.so +0 -0
  395. scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
  396. scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
  397. scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
  398. scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
  399. scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
  400. scipy/sparse/csgraph/_traversal.cpython-312-darwin.so +0 -0
  401. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  402. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  403. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  404. scipy/sparse/csr.py +0 -5
  405. scipy/sparse/data.py +1 -6
  406. scipy/sparse/dia.py +0 -7
  407. scipy/sparse/dok.py +0 -10
  408. scipy/sparse/linalg/_dsolve/_superlu.cpython-312-darwin.so +0 -0
  409. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  410. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  411. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-darwin.so +0 -0
  412. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  413. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  414. scipy/sparse/linalg/_interface.py +17 -18
  415. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  416. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  417. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  418. scipy/sparse/linalg/_isolve/minres.py +5 -5
  419. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  420. scipy/sparse/linalg/_isolve/utils.py +2 -8
  421. scipy/sparse/linalg/_matfuncs.py +1 -1
  422. scipy/sparse/linalg/_norm.py +1 -1
  423. scipy/sparse/linalg/_propack/_cpropack.cpython-312-darwin.so +0 -0
  424. scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_zpropack.cpython-312-darwin.so +0 -0
  427. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  428. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  429. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  430. scipy/sparse/tests/test_base.py +214 -42
  431. scipy/sparse/tests/test_common1d.py +7 -7
  432. scipy/sparse/tests/test_construct.py +1 -1
  433. scipy/sparse/tests/test_coo.py +272 -4
  434. scipy/sparse/tests/test_sparsetools.py +5 -0
  435. scipy/sparse/tests/test_sputils.py +36 -7
  436. scipy/spatial/_ckdtree.cpython-312-darwin.so +0 -0
  437. scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
  438. scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
  439. scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
  440. scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
  441. scipy/spatial/_voronoi.cpython-312-darwin.so +0 -0
  442. scipy/spatial/distance.py +49 -42
  443. scipy/spatial/tests/test_distance.py +15 -1
  444. scipy/spatial/tests/test_kdtree.py +1 -0
  445. scipy/spatial/tests/test_qhull.py +7 -2
  446. scipy/spatial/transform/__init__.py +5 -3
  447. scipy/spatial/transform/_rigid_transform.cpython-312-darwin.so +0 -0
  448. scipy/spatial/transform/_rotation.cpython-312-darwin.so +0 -0
  449. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  450. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  451. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  452. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  453. scipy/special/__init__.py +1 -47
  454. scipy/special/_add_newdocs.py +34 -772
  455. scipy/special/_basic.py +22 -25
  456. scipy/special/_comb.cpython-312-darwin.so +0 -0
  457. scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
  458. scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
  459. scipy/special/_logsumexp.py +67 -58
  460. scipy/special/_orthogonal.pyi +1 -1
  461. scipy/special/_specfun.cpython-312-darwin.so +0 -0
  462. scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
  463. scipy/special/_spherical_bessel.py +4 -4
  464. scipy/special/_support_alternative_backends.py +212 -119
  465. scipy/special/_test_internal.cpython-312-darwin.so +0 -0
  466. scipy/special/_testutils.py +4 -4
  467. scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
  468. scipy/special/_ufuncs.pyi +1 -0
  469. scipy/special/_ufuncs.pyx +215 -1400
  470. scipy/special/_ufuncs_cxx.cpython-312-darwin.so +0 -0
  471. scipy/special/_ufuncs_cxx.pxd +2 -15
  472. scipy/special/_ufuncs_cxx.pyx +5 -44
  473. scipy/special/_ufuncs_cxx_defs.h +2 -16
  474. scipy/special/_ufuncs_defs.h +0 -8
  475. scipy/special/cython_special.cpython-312-darwin.so +0 -0
  476. scipy/special/cython_special.pxd +1 -1
  477. scipy/special/tests/_cython_examples/meson.build +10 -1
  478. scipy/special/tests/test_basic.py +153 -20
  479. scipy/special/tests/test_boost_ufuncs.py +3 -0
  480. scipy/special/tests/test_cdflib.py +35 -11
  481. scipy/special/tests/test_gammainc.py +16 -0
  482. scipy/special/tests/test_hyp2f1.py +2 -2
  483. scipy/special/tests/test_log1mexp.py +85 -0
  484. scipy/special/tests/test_logsumexp.py +206 -64
  485. scipy/special/tests/test_mpmath.py +1 -0
  486. scipy/special/tests/test_nan_inputs.py +1 -1
  487. scipy/special/tests/test_orthogonal.py +17 -18
  488. scipy/special/tests/test_sf_error.py +3 -2
  489. scipy/special/tests/test_sph_harm.py +6 -7
  490. scipy/special/tests/test_support_alternative_backends.py +211 -76
  491. scipy/stats/__init__.py +4 -1
  492. scipy/stats/_ansari_swilk_statistics.cpython-312-darwin.so +0 -0
  493. scipy/stats/_axis_nan_policy.py +5 -12
  494. scipy/stats/_biasedurn.cpython-312-darwin.so +0 -0
  495. scipy/stats/_continued_fraction.py +387 -0
  496. scipy/stats/_continuous_distns.py +277 -310
  497. scipy/stats/_correlation.py +1 -1
  498. scipy/stats/_covariance.py +6 -3
  499. scipy/stats/_discrete_distns.py +39 -32
  500. scipy/stats/_distn_infrastructure.py +39 -12
  501. scipy/stats/_distribution_infrastructure.py +900 -238
  502. scipy/stats/_entropy.py +9 -10
  503. scipy/{_lib → stats}/_finite_differences.py +1 -1
  504. scipy/stats/_hypotests.py +83 -50
  505. scipy/stats/_kde.py +53 -49
  506. scipy/stats/_ksstats.py +1 -1
  507. scipy/stats/_levy_stable/__init__.py +7 -15
  508. scipy/stats/_levy_stable/levyst.cpython-312-darwin.so +0 -0
  509. scipy/stats/_morestats.py +118 -73
  510. scipy/stats/_mstats_basic.py +13 -17
  511. scipy/stats/_mstats_extras.py +8 -8
  512. scipy/stats/_multivariate.py +89 -113
  513. scipy/stats/_new_distributions.py +97 -20
  514. scipy/stats/_page_trend_test.py +12 -5
  515. scipy/stats/_probability_distribution.py +265 -43
  516. scipy/stats/_qmc.py +14 -9
  517. scipy/stats/_qmc_cy.cpython-312-darwin.so +0 -0
  518. scipy/stats/_qmvnt.py +16 -95
  519. scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
  520. scipy/stats/_quantile.py +335 -0
  521. scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
  522. scipy/stats/_resampling.py +4 -29
  523. scipy/stats/_sampling.py +1 -1
  524. scipy/stats/_sobol.cpython-312-darwin.so +0 -0
  525. scipy/stats/_stats.cpython-312-darwin.so +0 -0
  526. scipy/stats/_stats_mstats_common.py +21 -2
  527. scipy/stats/_stats_py.py +550 -476
  528. scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
  529. scipy/stats/_unuran/unuran_wrapper.cpython-312-darwin.so +0 -0
  530. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  531. scipy/stats/_variation.py +6 -8
  532. scipy/stats/_wilcoxon.py +13 -7
  533. scipy/stats/tests/common_tests.py +6 -4
  534. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  535. scipy/stats/tests/test_continued_fraction.py +173 -0
  536. scipy/stats/tests/test_continuous.py +379 -60
  537. scipy/stats/tests/test_continuous_basic.py +18 -12
  538. scipy/stats/tests/test_discrete_basic.py +14 -8
  539. scipy/stats/tests/test_discrete_distns.py +16 -16
  540. scipy/stats/tests/test_distributions.py +95 -75
  541. scipy/stats/tests/test_entropy.py +40 -48
  542. scipy/stats/tests/test_fit.py +4 -3
  543. scipy/stats/tests/test_hypotests.py +153 -24
  544. scipy/stats/tests/test_kdeoth.py +109 -41
  545. scipy/stats/tests/test_marray.py +289 -0
  546. scipy/stats/tests/test_morestats.py +79 -47
  547. scipy/stats/tests/test_mstats_basic.py +3 -3
  548. scipy/stats/tests/test_multivariate.py +434 -83
  549. scipy/stats/tests/test_qmc.py +13 -10
  550. scipy/stats/tests/test_quantile.py +199 -0
  551. scipy/stats/tests/test_rank.py +119 -112
  552. scipy/stats/tests/test_resampling.py +47 -56
  553. scipy/stats/tests/test_sampling.py +9 -4
  554. scipy/stats/tests/test_stats.py +799 -939
  555. scipy/stats/tests/test_variation.py +8 -6
  556. scipy/version.py +2 -2
  557. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  559. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +560 -567
  560. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  561. scipy/_lib/array_api_extra/_funcs.py +0 -484
  562. scipy/_lib/array_api_extra/_typing.py +0 -8
  563. scipy/interpolate/_bspl.cpython-312-darwin.so +0 -0
  564. scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
  565. scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
  566. scipy/optimize/_slsqp.cpython-312-darwin.so +0 -0
  567. scipy/spatial/qhull_src/COPYING.txt +0 -38
  568. scipy/special/libsf_error_state.dylib +0 -0
  569. scipy/special/tests/test_log_softmax.py +0 -109
  570. scipy/special/tests/test_xsf_cuda.py +0 -114
  571. scipy/special/xsf/binom.h +0 -89
  572. scipy/special/xsf/cdflib.h +0 -100
  573. scipy/special/xsf/cephes/airy.h +0 -307
  574. scipy/special/xsf/cephes/besselpoly.h +0 -51
  575. scipy/special/xsf/cephes/beta.h +0 -257
  576. scipy/special/xsf/cephes/cbrt.h +0 -131
  577. scipy/special/xsf/cephes/chbevl.h +0 -85
  578. scipy/special/xsf/cephes/chdtr.h +0 -193
  579. scipy/special/xsf/cephes/const.h +0 -87
  580. scipy/special/xsf/cephes/ellie.h +0 -293
  581. scipy/special/xsf/cephes/ellik.h +0 -251
  582. scipy/special/xsf/cephes/ellpe.h +0 -107
  583. scipy/special/xsf/cephes/ellpk.h +0 -117
  584. scipy/special/xsf/cephes/expn.h +0 -260
  585. scipy/special/xsf/cephes/gamma.h +0 -398
  586. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  587. scipy/special/xsf/cephes/hyperg.h +0 -361
  588. scipy/special/xsf/cephes/i0.h +0 -149
  589. scipy/special/xsf/cephes/i1.h +0 -158
  590. scipy/special/xsf/cephes/igam.h +0 -421
  591. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  592. scipy/special/xsf/cephes/igami.h +0 -313
  593. scipy/special/xsf/cephes/j0.h +0 -225
  594. scipy/special/xsf/cephes/j1.h +0 -198
  595. scipy/special/xsf/cephes/jv.h +0 -715
  596. scipy/special/xsf/cephes/k0.h +0 -164
  597. scipy/special/xsf/cephes/k1.h +0 -163
  598. scipy/special/xsf/cephes/kn.h +0 -243
  599. scipy/special/xsf/cephes/lanczos.h +0 -112
  600. scipy/special/xsf/cephes/ndtr.h +0 -275
  601. scipy/special/xsf/cephes/poch.h +0 -85
  602. scipy/special/xsf/cephes/polevl.h +0 -167
  603. scipy/special/xsf/cephes/psi.h +0 -194
  604. scipy/special/xsf/cephes/rgamma.h +0 -111
  605. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  606. scipy/special/xsf/cephes/shichi.h +0 -248
  607. scipy/special/xsf/cephes/sici.h +0 -224
  608. scipy/special/xsf/cephes/sindg.h +0 -221
  609. scipy/special/xsf/cephes/tandg.h +0 -139
  610. scipy/special/xsf/cephes/trig.h +0 -58
  611. scipy/special/xsf/cephes/unity.h +0 -186
  612. scipy/special/xsf/cephes/zeta.h +0 -172
  613. scipy/special/xsf/config.h +0 -304
  614. scipy/special/xsf/digamma.h +0 -205
  615. scipy/special/xsf/error.h +0 -57
  616. scipy/special/xsf/evalpoly.h +0 -47
  617. scipy/special/xsf/expint.h +0 -266
  618. scipy/special/xsf/hyp2f1.h +0 -694
  619. scipy/special/xsf/iv_ratio.h +0 -173
  620. scipy/special/xsf/lambertw.h +0 -150
  621. scipy/special/xsf/loggamma.h +0 -163
  622. scipy/special/xsf/sici.h +0 -200
  623. scipy/special/xsf/tools.h +0 -427
  624. scipy/special/xsf/trig.h +0 -164
  625. scipy/special/xsf/wright_bessel.h +0 -843
  626. scipy/special/xsf/zlog1.h +0 -35
  627. scipy/stats/_mvn.cpython-312-darwin.so +0 -0
  628. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -334,6 +334,47 @@ def test_write_roundtrip_rf64(tmpdir):
334
334
  data2[0] = 0
335
335
 
336
336
 
337
+ # Fake a non-seekable file-like object without resorting to subprocesses.
338
+ class Nonseekable:
339
+ def __init__(self, fp):
340
+ self.fp = fp
341
+
342
+ def seekable(self):
343
+ return False
344
+
345
+ def read(self, size=-1, /):
346
+ return self.fp.read(size)
347
+
348
+ def close(self):
349
+ self.fp.close()
350
+
351
+
352
+ def test_streams():
353
+ for filename in ['test-44100Hz-le-1ch-4bytes.wav',
354
+ 'test-8000Hz-le-2ch-1byteu.wav',
355
+ 'test-44100Hz-2ch-32bit-float-le.wav',
356
+ 'test-44100Hz-2ch-32bit-float-be.wav',
357
+ 'test-8000Hz-le-5ch-9S-5bit.wav',
358
+ 'test-8000Hz-le-4ch-9S-12bit.wav',
359
+ 'test-8000Hz-le-3ch-5S-24bit.wav',
360
+ 'test-1234Hz-le-1ch-10S-20bit-extra.wav',
361
+ 'test-8000Hz-le-3ch-5S-36bit.wav',
362
+ 'test-8000Hz-le-3ch-5S-45bit.wav',
363
+ 'test-8000Hz-le-3ch-5S-53bit.wav',
364
+ 'test-8000Hz-le-3ch-5S-64bit.wav',
365
+ 'test-44100Hz-be-1ch-4bytes.wav', # RIFX
366
+ 'test-44100Hz-le-1ch-4bytes-rf64.wav']:
367
+ dfname = datafile(filename)
368
+ with open(dfname, 'rb') as fp1, open(dfname, 'rb') as fp2:
369
+ rate1, data1 = wavfile.read(fp1)
370
+ rate2, data2 = wavfile.read(Nonseekable(fp2))
371
+ rate3, data3 = wavfile.read(dfname, mmap=False)
372
+ assert_equal(rate1, rate3)
373
+ assert_equal(rate2, rate3)
374
+ assert_equal(data1, data3)
375
+ assert_equal(data2, data3)
376
+
377
+
337
378
  def test_read_unknown_filetype_fail():
338
379
  # Not an RIFF
339
380
  for mmap in [False, True]:
scipy/io/wavfile.py CHANGED
@@ -9,6 +9,7 @@ Functions
9
9
 
10
10
  """
11
11
  import io
12
+ import os
12
13
  import sys
13
14
  import numpy as np
14
15
  import struct
@@ -27,6 +28,47 @@ class WavFileWarning(UserWarning):
27
28
  pass
28
29
 
29
30
 
31
+ class SeekEmulatingReader:
32
+ """
33
+ Tracks stream position, provides tell(), and emulates only those
34
+ seeks that can be supported by reading forward. Other seeks raise
35
+ io.UnsupportedOperation. Note that this class implements only the
36
+ minimum necessary to keep wavfile.read() happy.
37
+ """
38
+ def __init__(self, reader):
39
+ self.reader = reader
40
+ self.pos = 0
41
+
42
+ def read(self, size=-1, /):
43
+ data = self.reader.read(size)
44
+ self.pos += len(data)
45
+ return data
46
+
47
+ def seek(self, offset, whence=os.SEEK_SET, /):
48
+ match whence:
49
+ case os.SEEK_SET if offset >= self.pos:
50
+ self.read(offset - self.pos) # convert to relative
51
+ case os.SEEK_CUR if offset >= 0:
52
+ self.read(offset) # advance by offset
53
+ case os.SEEK_END if offset == 0:
54
+ self.read() # advance to end of stream
55
+ case _:
56
+ raise io.UnsupportedOperation("SeekEmulatingReader was asked to emulate"
57
+ " a seek operation it does not support.")
58
+ return self.pos
59
+
60
+ def tell(self):
61
+ return self.pos
62
+
63
+ def close(self):
64
+ self.reader.close()
65
+
66
+ # np.fromfile expects to be able to call flush(), and _read_data_chunk
67
+ # expects to catch io.UnsupportedOperation if np.fromfile fails.
68
+ def flush(self):
69
+ raise io.UnsupportedOperation("SeekEmulatingReader can't flush.")
70
+
71
+
30
72
  class WAVE_FORMAT(IntEnum):
31
73
  """
32
74
  WAVE form wFormatTag IDs
@@ -397,7 +439,7 @@ def _read_fmt_chunk(fid, is_big_endian):
397
439
 
398
440
 
399
441
  def _read_data_chunk(fid, format_tag, channels, bit_depth, is_big_endian, is_rf64,
400
- block_align, mmap=False):
442
+ block_align, mmap=False, rf64_chunk_size=None):
401
443
  """
402
444
  Notes
403
445
  -----
@@ -431,11 +473,8 @@ def _read_data_chunk(fid, format_tag, channels, bit_depth, is_big_endian, is_rf6
431
473
  if not is_rf64:
432
474
  size = struct.unpack(fmt+'I', fid.read(4))[0]
433
475
  else:
434
- pos = fid.tell()
435
476
  # chunk size is stored in global file header for RF64
436
- fid.seek(28)
437
- size = struct.unpack('<Q', fid.read(8))[0]
438
- fid.seek(pos)
477
+ size = rf64_chunk_size
439
478
  # skip data chunk size as it is 0xFFFFFFF
440
479
  fid.read(4)
441
480
 
@@ -538,6 +577,7 @@ def _read_riff_chunk(fid):
538
577
  # Size of entire file
539
578
  if not is_rf64:
540
579
  file_size = struct.unpack(fmt, fid.read(4))[0] + 8
580
+ rf64_chunk_size = None
541
581
  str2 = fid.read(4)
542
582
  else:
543
583
  # Skip 0xFFFFFFFF (-1) bytes
@@ -548,14 +588,15 @@ def _read_riff_chunk(fid):
548
588
  raise ValueError("Invalid RF64 file: ds64 chunk not found.")
549
589
  ds64_size = struct.unpack("<I", fid.read(4))[0]
550
590
  file_size = struct.unpack(fmt, fid.read(8))[0] + 8
591
+ rf64_chunk_size = struct.unpack('<Q', fid.read(8))[0]
551
592
  # Ignore additional attributes of ds64 chunk like sample count, tables, etc.
552
593
  # and just skip to the next chunk
553
- fid.seek(ds64_size - 8, 1)
594
+ fid.seek(ds64_size - 16, 1)
554
595
 
555
596
  if str2 != b'WAVE':
556
597
  raise ValueError(f"Not a WAV file. RIFF form type is {repr(str2)}.")
557
598
 
558
- return file_size, is_big_endian, is_rf64
599
+ return file_size, is_big_endian, is_rf64, rf64_chunk_size
559
600
 
560
601
 
561
602
  def _handle_pad_byte(fid, size):
@@ -672,9 +713,12 @@ def read(filename, mmap=False):
672
713
  mmap = False
673
714
  else:
674
715
  fid = open(filename, 'rb')
716
+
717
+ if not (was_seekable := fid.seekable()):
718
+ fid = SeekEmulatingReader(fid)
675
719
 
676
720
  try:
677
- file_size, is_big_endian, is_rf64 = _read_riff_chunk(fid)
721
+ file_size, is_big_endian, is_rf64, rf64_chunk_size = _read_riff_chunk(fid)
678
722
  fmt_chunk_received = False
679
723
  data_chunk_received = False
680
724
  while fid.tell() < file_size:
@@ -713,7 +757,8 @@ def read(filename, mmap=False):
713
757
  if not fmt_chunk_received:
714
758
  raise ValueError("No fmt chunk before data")
715
759
  data = _read_data_chunk(fid, format_tag, channels, bit_depth,
716
- is_big_endian, is_rf64, block_align, mmap)
760
+ is_big_endian, is_rf64, block_align,
761
+ mmap, rf64_chunk_size)
717
762
  elif chunk_id == b'LIST':
718
763
  # Someday this could be handled properly but for now skip it
719
764
  _skip_unknown_chunk(fid, is_big_endian)
@@ -727,7 +772,9 @@ def read(filename, mmap=False):
727
772
  finally:
728
773
  if not hasattr(filename, 'read'):
729
774
  fid.close()
730
- else:
775
+ elif was_seekable:
776
+ # Rewind, if we are able, so that caller can do something
777
+ # else with the raw WAV stream.
731
778
  fid.seek(0)
732
779
 
733
780
  return fs, data
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.