scipy 1.15.3__cp312-cp312-musllinux_1_2_aarch64.whl → 1.16.0rc2__cp312-cp312-musllinux_1_2_aarch64.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 (641) hide show
  1. scipy/__config__.py +10 -10
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-312-aarch64-linux-musl.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-aarch64-linux-musl.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_fpumode.cpython-312-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-312-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-312-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-312-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-312-aarch64-linux-musl.so +0 -0
  17. scipy/_lib/_util.py +222 -125
  18. scipy/_lib/array_api_compat/__init__.py +4 -4
  19. scipy/_lib/array_api_compat/_internal.py +19 -6
  20. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  21. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  22. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  23. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  24. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  25. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  26. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  27. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  28. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  29. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  30. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  31. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  32. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  33. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  34. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  35. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  36. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  37. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  38. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  39. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  40. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  41. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  42. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  43. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  44. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  45. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  46. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  47. scipy/_lib/array_api_extra/__init__.py +26 -3
  48. scipy/_lib/array_api_extra/_delegation.py +171 -0
  49. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  50. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  51. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  52. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  53. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  54. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  60. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  61. scipy/_lib/array_api_extra/testing.py +359 -0
  62. scipy/_lib/decorator.py +2 -2
  63. scipy/_lib/doccer.py +1 -7
  64. scipy/_lib/messagestream.cpython-312-aarch64-linux-musl.so +0 -0
  65. scipy/_lib/pyprima/__init__.py +212 -0
  66. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  67. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  68. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  69. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  70. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  71. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  72. scipy/_lib/pyprima/cobyla/update.py +289 -0
  73. scipy/_lib/pyprima/common/__init__.py +0 -0
  74. scipy/_lib/pyprima/common/_bounds.py +34 -0
  75. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  76. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  77. scipy/_lib/pyprima/common/_project.py +173 -0
  78. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  79. scipy/_lib/pyprima/common/consts.py +47 -0
  80. scipy/_lib/pyprima/common/evaluate.py +99 -0
  81. scipy/_lib/pyprima/common/history.py +38 -0
  82. scipy/_lib/pyprima/common/infos.py +30 -0
  83. scipy/_lib/pyprima/common/linalg.py +435 -0
  84. scipy/_lib/pyprima/common/message.py +290 -0
  85. scipy/_lib/pyprima/common/powalg.py +131 -0
  86. scipy/_lib/pyprima/common/preproc.py +277 -0
  87. scipy/_lib/pyprima/common/present.py +5 -0
  88. scipy/_lib/pyprima/common/ratio.py +54 -0
  89. scipy/_lib/pyprima/common/redrho.py +47 -0
  90. scipy/_lib/pyprima/common/selectx.py +296 -0
  91. scipy/_lib/tests/test__util.py +105 -121
  92. scipy/_lib/tests/test_array_api.py +166 -35
  93. scipy/_lib/tests/test_bunch.py +7 -0
  94. scipy/_lib/tests/test_ccallback.py +2 -10
  95. scipy/_lib/tests/test_public_api.py +13 -0
  96. scipy/cluster/_hierarchy.cpython-312-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-312-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-312-aarch64-linux-musl.so +0 -0
  99. scipy/cluster/hierarchy.py +393 -223
  100. scipy/cluster/tests/test_hierarchy.py +273 -335
  101. scipy/cluster/tests/test_vq.py +45 -61
  102. scipy/cluster/vq.py +39 -35
  103. scipy/conftest.py +263 -157
  104. scipy/constants/_constants.py +4 -1
  105. scipy/constants/tests/test_codata.py +2 -2
  106. scipy/constants/tests/test_constants.py +11 -18
  107. scipy/datasets/_download_all.py +15 -1
  108. scipy/datasets/_fetchers.py +7 -1
  109. scipy/datasets/_utils.py +1 -1
  110. scipy/differentiate/_differentiate.py +25 -25
  111. scipy/differentiate/tests/test_differentiate.py +24 -25
  112. scipy/fft/_basic.py +20 -0
  113. scipy/fft/_helper.py +3 -34
  114. scipy/fft/_pocketfft/helper.py +29 -1
  115. scipy/fft/_pocketfft/pypocketfft.cpython-312-aarch64-linux-musl.so +0 -0
  116. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  117. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  118. scipy/fft/_realtransforms.py +13 -0
  119. scipy/fft/tests/test_basic.py +27 -25
  120. scipy/fft/tests/test_fftlog.py +16 -7
  121. scipy/fft/tests/test_helper.py +18 -34
  122. scipy/fft/tests/test_real_transforms.py +8 -10
  123. scipy/fftpack/convolve.cpython-312-aarch64-linux-musl.so +0 -0
  124. scipy/fftpack/tests/test_basic.py +2 -4
  125. scipy/fftpack/tests/test_real_transforms.py +8 -9
  126. scipy/integrate/_bvp.py +9 -3
  127. scipy/integrate/_cubature.py +3 -2
  128. scipy/integrate/_dop.cpython-312-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_lsoda.cpython-312-aarch64-linux-musl.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-312-aarch64-linux-musl.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-312-aarch64-linux-musl.so +0 -0
  134. scipy/integrate/_quadpack_py.py +11 -7
  135. scipy/integrate/_quadrature.py +3 -3
  136. scipy/integrate/_rules/_base.py +2 -2
  137. scipy/integrate/_tanhsinh.py +48 -47
  138. scipy/integrate/_test_multivariate.cpython-312-aarch64-linux-musl.so +0 -0
  139. scipy/integrate/_test_odeint_banded.cpython-312-aarch64-linux-musl.so +0 -0
  140. scipy/integrate/_vode.cpython-312-aarch64-linux-musl.so +0 -0
  141. scipy/integrate/tests/test__quad_vec.py +0 -6
  142. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  143. scipy/integrate/tests/test_cubature.py +21 -35
  144. scipy/integrate/tests/test_quadrature.py +6 -8
  145. scipy/integrate/tests/test_tanhsinh.py +56 -48
  146. scipy/interpolate/__init__.py +70 -58
  147. scipy/interpolate/_bary_rational.py +22 -22
  148. scipy/interpolate/_bsplines.py +119 -66
  149. scipy/interpolate/_cubic.py +65 -50
  150. scipy/interpolate/_dfitpack.cpython-312-aarch64-linux-musl.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-312-aarch64-linux-musl.so +0 -0
  152. scipy/interpolate/_fitpack.cpython-312-aarch64-linux-musl.so +0 -0
  153. scipy/interpolate/_fitpack2.py +9 -6
  154. scipy/interpolate/_fitpack_impl.py +32 -26
  155. scipy/interpolate/_fitpack_repro.py +23 -19
  156. scipy/interpolate/_interpnd.cpython-312-aarch64-linux-musl.so +0 -0
  157. scipy/interpolate/_interpolate.py +30 -12
  158. scipy/interpolate/_ndbspline.py +13 -18
  159. scipy/interpolate/_ndgriddata.py +5 -8
  160. scipy/interpolate/_polyint.py +95 -31
  161. scipy/interpolate/_ppoly.cpython-312-aarch64-linux-musl.so +0 -0
  162. scipy/interpolate/_rbf.py +2 -2
  163. scipy/interpolate/_rbfinterp.py +1 -1
  164. scipy/interpolate/_rbfinterp_pythran.cpython-312-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rgi.py +31 -26
  166. scipy/interpolate/_rgi_cython.cpython-312-aarch64-linux-musl.so +0 -0
  167. scipy/interpolate/dfitpack.py +0 -20
  168. scipy/interpolate/interpnd.py +1 -2
  169. scipy/interpolate/tests/test_bary_rational.py +2 -2
  170. scipy/interpolate/tests/test_bsplines.py +97 -1
  171. scipy/interpolate/tests/test_fitpack2.py +39 -1
  172. scipy/interpolate/tests/test_interpnd.py +32 -20
  173. scipy/interpolate/tests/test_interpolate.py +48 -4
  174. scipy/interpolate/tests/test_rgi.py +2 -1
  175. scipy/io/_fast_matrix_market/__init__.py +2 -0
  176. scipy/io/_fast_matrix_market/_fmm_core.cpython-312-aarch64-linux-musl.so +0 -0
  177. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  178. scipy/io/_harwell_boeing/hb.py +7 -11
  179. scipy/io/_idl.py +5 -7
  180. scipy/io/_netcdf.py +15 -5
  181. scipy/io/_test_fortran.cpython-312-aarch64-linux-musl.so +0 -0
  182. scipy/io/arff/tests/test_arffread.py +3 -3
  183. scipy/io/matlab/__init__.py +5 -3
  184. scipy/io/matlab/_mio.py +4 -1
  185. scipy/io/matlab/_mio5.py +19 -13
  186. scipy/io/matlab/_mio5_utils.cpython-312-aarch64-linux-musl.so +0 -0
  187. scipy/io/matlab/_mio_utils.cpython-312-aarch64-linux-musl.so +0 -0
  188. scipy/io/matlab/_miobase.py +4 -1
  189. scipy/io/matlab/_streams.cpython-312-aarch64-linux-musl.so +0 -0
  190. scipy/io/matlab/tests/test_mio.py +46 -18
  191. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  192. scipy/io/tests/test_mmio.py +7 -1
  193. scipy/io/tests/test_wavfile.py +41 -0
  194. scipy/io/wavfile.py +57 -10
  195. scipy/linalg/_basic.py +113 -86
  196. scipy/linalg/_cythonized_array_utils.cpython-312-aarch64-linux-musl.so +0 -0
  197. scipy/linalg/_decomp.py +22 -9
  198. scipy/linalg/_decomp_cholesky.py +28 -13
  199. scipy/linalg/_decomp_cossin.py +45 -30
  200. scipy/linalg/_decomp_interpolative.cpython-312-aarch64-linux-musl.so +0 -0
  201. scipy/linalg/_decomp_ldl.py +4 -1
  202. scipy/linalg/_decomp_lu.py +18 -6
  203. scipy/linalg/_decomp_lu_cython.cpython-312-aarch64-linux-musl.so +0 -0
  204. scipy/linalg/_decomp_polar.py +2 -0
  205. scipy/linalg/_decomp_qr.py +6 -2
  206. scipy/linalg/_decomp_qz.py +3 -0
  207. scipy/linalg/_decomp_schur.py +3 -1
  208. scipy/linalg/_decomp_svd.py +13 -2
  209. scipy/linalg/_decomp_update.cpython-312-aarch64-linux-musl.so +0 -0
  210. scipy/linalg/_expm_frechet.py +4 -0
  211. scipy/linalg/_fblas.cpython-312-aarch64-linux-musl.so +0 -0
  212. scipy/linalg/_flapack.cpython-312-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_linalg_pythran.cpython-312-aarch64-linux-musl.so +0 -0
  214. scipy/linalg/_matfuncs.py +187 -4
  215. scipy/linalg/_matfuncs_expm.cpython-312-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  218. scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-aarch64-linux-musl.so +0 -0
  219. scipy/linalg/_procrustes.py +2 -0
  220. scipy/linalg/_sketches.py +17 -6
  221. scipy/linalg/_solve_toeplitz.cpython-312-aarch64-linux-musl.so +0 -0
  222. scipy/linalg/_solvers.py +7 -2
  223. scipy/linalg/_special_matrices.py +26 -36
  224. scipy/linalg/cython_blas.cpython-312-aarch64-linux-musl.so +0 -0
  225. scipy/linalg/cython_lapack.cpython-312-aarch64-linux-musl.so +0 -0
  226. scipy/linalg/lapack.py +22 -2
  227. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  228. scipy/linalg/tests/test_basic.py +31 -16
  229. scipy/linalg/tests/test_batch.py +588 -0
  230. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  231. scipy/linalg/tests/test_decomp.py +40 -3
  232. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  233. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  234. scipy/linalg/tests/test_lapack.py +115 -7
  235. scipy/linalg/tests/test_matfuncs.py +157 -102
  236. scipy/linalg/tests/test_procrustes.py +0 -7
  237. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  238. scipy/linalg/tests/test_special_matrices.py +1 -5
  239. scipy/ndimage/__init__.py +1 -0
  240. scipy/ndimage/_ctest.cpython-312-aarch64-linux-musl.so +0 -0
  241. scipy/ndimage/_cytest.cpython-312-aarch64-linux-musl.so +0 -0
  242. scipy/ndimage/_delegators.py +8 -2
  243. scipy/ndimage/_filters.py +453 -5
  244. scipy/ndimage/_interpolation.py +36 -6
  245. scipy/ndimage/_measurements.py +4 -2
  246. scipy/ndimage/_morphology.py +5 -0
  247. scipy/ndimage/_nd_image.cpython-312-aarch64-linux-musl.so +0 -0
  248. scipy/ndimage/_ni_docstrings.py +5 -1
  249. scipy/ndimage/_ni_label.cpython-312-aarch64-linux-musl.so +0 -0
  250. scipy/ndimage/_ni_support.py +1 -5
  251. scipy/ndimage/_rank_filter_1d.cpython-312-aarch64-linux-musl.so +0 -0
  252. scipy/ndimage/_support_alternative_backends.py +18 -6
  253. scipy/ndimage/tests/test_filters.py +370 -259
  254. scipy/ndimage/tests/test_fourier.py +7 -9
  255. scipy/ndimage/tests/test_interpolation.py +68 -61
  256. scipy/ndimage/tests/test_measurements.py +18 -35
  257. scipy/ndimage/tests/test_morphology.py +143 -131
  258. scipy/ndimage/tests/test_splines.py +1 -3
  259. scipy/odr/__odrpack.cpython-312-aarch64-linux-musl.so +0 -0
  260. scipy/optimize/_basinhopping.py +13 -7
  261. scipy/optimize/_bglu_dense.cpython-312-aarch64-linux-musl.so +0 -0
  262. scipy/optimize/_bracket.py +17 -24
  263. scipy/optimize/_chandrupatla.py +9 -10
  264. scipy/optimize/_cobyla_py.py +104 -123
  265. scipy/optimize/_constraints.py +14 -10
  266. scipy/optimize/_differentiable_functions.py +371 -230
  267. scipy/optimize/_differentialevolution.py +4 -3
  268. scipy/optimize/_direct.cpython-312-aarch64-linux-musl.so +0 -0
  269. scipy/optimize/_dual_annealing.py +1 -1
  270. scipy/optimize/_elementwise.py +1 -4
  271. scipy/optimize/_group_columns.cpython-312-aarch64-linux-musl.so +0 -0
  272. scipy/optimize/_highspy/_core.cpython-312-aarch64-linux-musl.so +0 -0
  273. scipy/optimize/_highspy/_highs_options.cpython-312-aarch64-linux-musl.so +0 -0
  274. scipy/optimize/_lbfgsb.cpython-312-aarch64-linux-musl.so +0 -0
  275. scipy/optimize/_lbfgsb_py.py +57 -16
  276. scipy/optimize/_linprog_doc.py +2 -2
  277. scipy/optimize/_linprog_highs.py +2 -2
  278. scipy/optimize/_linprog_ip.py +25 -10
  279. scipy/optimize/_linprog_util.py +14 -16
  280. scipy/optimize/_lsap.cpython-312-aarch64-linux-musl.so +0 -0
  281. scipy/optimize/_lsq/common.py +3 -3
  282. scipy/optimize/_lsq/dogbox.py +16 -2
  283. scipy/optimize/_lsq/givens_elimination.cpython-312-aarch64-linux-musl.so +0 -0
  284. scipy/optimize/_lsq/least_squares.py +198 -126
  285. scipy/optimize/_lsq/lsq_linear.py +6 -6
  286. scipy/optimize/_lsq/trf.py +35 -8
  287. scipy/optimize/_milp.py +3 -1
  288. scipy/optimize/_minimize.py +105 -36
  289. scipy/optimize/_minpack.cpython-312-aarch64-linux-musl.so +0 -0
  290. scipy/optimize/_minpack_py.py +21 -14
  291. scipy/optimize/_moduleTNC.cpython-312-aarch64-linux-musl.so +0 -0
  292. scipy/optimize/_nnls.py +20 -21
  293. scipy/optimize/_nonlin.py +34 -3
  294. scipy/optimize/_numdiff.py +288 -110
  295. scipy/optimize/_optimize.py +86 -48
  296. scipy/optimize/_pava_pybind.cpython-312-aarch64-linux-musl.so +0 -0
  297. scipy/optimize/_remove_redundancy.py +5 -5
  298. scipy/optimize/_root_scalar.py +1 -1
  299. scipy/optimize/_shgo.py +6 -0
  300. scipy/optimize/_shgo_lib/_complex.py +1 -1
  301. scipy/optimize/_slsqp_py.py +216 -124
  302. scipy/optimize/_slsqplib.cpython-312-aarch64-linux-musl.so +0 -0
  303. scipy/optimize/_spectral.py +1 -1
  304. scipy/optimize/_tnc.py +8 -1
  305. scipy/optimize/_trlib/_trlib.cpython-312-aarch64-linux-musl.so +0 -0
  306. scipy/optimize/_trustregion.py +20 -6
  307. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  308. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  309. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  310. scipy/optimize/_trustregion_constr/projections.py +12 -8
  311. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  312. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  313. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  314. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  315. scipy/optimize/_trustregion_exact.py +0 -1
  316. scipy/optimize/_zeros.cpython-312-aarch64-linux-musl.so +0 -0
  317. scipy/optimize/_zeros_py.py +97 -17
  318. scipy/optimize/cython_optimize/_zeros.cpython-312-aarch64-linux-musl.so +0 -0
  319. scipy/optimize/slsqp.py +0 -1
  320. scipy/optimize/tests/test__basinhopping.py +1 -1
  321. scipy/optimize/tests/test__differential_evolution.py +4 -4
  322. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  323. scipy/optimize/tests/test__numdiff.py +66 -22
  324. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  325. scipy/optimize/tests/test__shgo.py +9 -1
  326. scipy/optimize/tests/test_bracket.py +36 -46
  327. scipy/optimize/tests/test_chandrupatla.py +133 -135
  328. scipy/optimize/tests/test_cobyla.py +74 -45
  329. scipy/optimize/tests/test_constraints.py +1 -1
  330. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  331. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  332. scipy/optimize/tests/test_least_squares.py +125 -13
  333. scipy/optimize/tests/test_linear_assignment.py +3 -3
  334. scipy/optimize/tests/test_linprog.py +3 -3
  335. scipy/optimize/tests/test_lsq_linear.py +6 -6
  336. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  337. scipy/optimize/tests/test_minpack.py +4 -4
  338. scipy/optimize/tests/test_nnls.py +43 -3
  339. scipy/optimize/tests/test_nonlin.py +36 -0
  340. scipy/optimize/tests/test_optimize.py +95 -17
  341. scipy/optimize/tests/test_slsqp.py +36 -4
  342. scipy/optimize/tests/test_zeros.py +34 -1
  343. scipy/signal/__init__.py +12 -23
  344. scipy/signal/_delegators.py +568 -0
  345. scipy/signal/_filter_design.py +459 -241
  346. scipy/signal/_fir_filter_design.py +262 -90
  347. scipy/signal/_lti_conversion.py +3 -2
  348. scipy/signal/_ltisys.py +118 -91
  349. scipy/signal/_max_len_seq_inner.cpython-312-aarch64-linux-musl.so +0 -0
  350. scipy/signal/_peak_finding_utils.cpython-312-aarch64-linux-musl.so +0 -0
  351. scipy/signal/_polyutils.py +172 -0
  352. scipy/signal/_short_time_fft.py +519 -70
  353. scipy/signal/_signal_api.py +30 -0
  354. scipy/signal/_signaltools.py +719 -399
  355. scipy/signal/_sigtools.cpython-312-aarch64-linux-musl.so +0 -0
  356. scipy/signal/_sosfilt.cpython-312-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_spectral_py.py +230 -50
  358. scipy/signal/_spline.cpython-312-aarch64-linux-musl.so +0 -0
  359. scipy/signal/_spline_filters.py +108 -68
  360. scipy/signal/_support_alternative_backends.py +73 -0
  361. scipy/signal/_upfirdn.py +4 -1
  362. scipy/signal/_upfirdn_apply.cpython-312-aarch64-linux-musl.so +0 -0
  363. scipy/signal/_waveforms.py +2 -11
  364. scipy/signal/_wavelets.py +1 -1
  365. scipy/signal/fir_filter_design.py +1 -0
  366. scipy/signal/spline.py +4 -11
  367. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  368. scipy/signal/tests/test_bsplines.py +114 -79
  369. scipy/signal/tests/test_cont2discrete.py +9 -2
  370. scipy/signal/tests/test_filter_design.py +721 -481
  371. scipy/signal/tests/test_fir_filter_design.py +332 -140
  372. scipy/signal/tests/test_savitzky_golay.py +4 -3
  373. scipy/signal/tests/test_short_time_fft.py +221 -3
  374. scipy/signal/tests/test_signaltools.py +2144 -1348
  375. scipy/signal/tests/test_spectral.py +50 -6
  376. scipy/signal/tests/test_splines.py +161 -96
  377. scipy/signal/tests/test_upfirdn.py +84 -50
  378. scipy/signal/tests/test_waveforms.py +20 -0
  379. scipy/signal/tests/test_windows.py +607 -466
  380. scipy/signal/windows/_windows.py +287 -148
  381. scipy/sparse/__init__.py +23 -4
  382. scipy/sparse/_base.py +270 -108
  383. scipy/sparse/_bsr.py +7 -4
  384. scipy/sparse/_compressed.py +59 -231
  385. scipy/sparse/_construct.py +90 -38
  386. scipy/sparse/_coo.py +115 -181
  387. scipy/sparse/_csc.py +4 -4
  388. scipy/sparse/_csparsetools.cpython-312-aarch64-linux-musl.so +0 -0
  389. scipy/sparse/_csr.py +2 -2
  390. scipy/sparse/_data.py +48 -48
  391. scipy/sparse/_dia.py +105 -18
  392. scipy/sparse/_dok.py +0 -23
  393. scipy/sparse/_index.py +4 -4
  394. scipy/sparse/_matrix.py +23 -0
  395. scipy/sparse/_sparsetools.cpython-312-aarch64-linux-musl.so +0 -0
  396. scipy/sparse/_sputils.py +37 -22
  397. scipy/sparse/base.py +0 -9
  398. scipy/sparse/bsr.py +0 -14
  399. scipy/sparse/compressed.py +0 -23
  400. scipy/sparse/construct.py +0 -6
  401. scipy/sparse/coo.py +0 -14
  402. scipy/sparse/csc.py +0 -3
  403. scipy/sparse/csgraph/_flow.cpython-312-aarch64-linux-musl.so +0 -0
  404. scipy/sparse/csgraph/_matching.cpython-312-aarch64-linux-musl.so +0 -0
  405. scipy/sparse/csgraph/_min_spanning_tree.cpython-312-aarch64-linux-musl.so +0 -0
  406. scipy/sparse/csgraph/_reordering.cpython-312-aarch64-linux-musl.so +0 -0
  407. scipy/sparse/csgraph/_shortest_path.cpython-312-aarch64-linux-musl.so +0 -0
  408. scipy/sparse/csgraph/_tools.cpython-312-aarch64-linux-musl.so +0 -0
  409. scipy/sparse/csgraph/_traversal.cpython-312-aarch64-linux-musl.so +0 -0
  410. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  411. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  412. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  413. scipy/sparse/csr.py +0 -5
  414. scipy/sparse/data.py +1 -6
  415. scipy/sparse/dia.py +0 -7
  416. scipy/sparse/dok.py +0 -10
  417. scipy/sparse/linalg/_dsolve/_superlu.cpython-312-aarch64-linux-musl.so +0 -0
  418. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  419. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  420. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-aarch64-linux-musl.so +0 -0
  421. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  422. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  423. scipy/sparse/linalg/_interface.py +17 -18
  424. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  425. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  426. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  427. scipy/sparse/linalg/_isolve/minres.py +5 -5
  428. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  429. scipy/sparse/linalg/_isolve/utils.py +2 -8
  430. scipy/sparse/linalg/_matfuncs.py +1 -1
  431. scipy/sparse/linalg/_norm.py +1 -1
  432. scipy/sparse/linalg/_propack/_cpropack.cpython-312-aarch64-linux-musl.so +0 -0
  433. scipy/sparse/linalg/_propack/_dpropack.cpython-312-aarch64-linux-musl.so +0 -0
  434. scipy/sparse/linalg/_propack/_spropack.cpython-312-aarch64-linux-musl.so +0 -0
  435. scipy/sparse/linalg/_propack/_zpropack.cpython-312-aarch64-linux-musl.so +0 -0
  436. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  437. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  438. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  439. scipy/sparse/tests/test_base.py +214 -42
  440. scipy/sparse/tests/test_common1d.py +7 -7
  441. scipy/sparse/tests/test_construct.py +1 -1
  442. scipy/sparse/tests/test_coo.py +272 -4
  443. scipy/sparse/tests/test_sparsetools.py +5 -0
  444. scipy/sparse/tests/test_sputils.py +36 -7
  445. scipy/spatial/_ckdtree.cpython-312-aarch64-linux-musl.so +0 -0
  446. scipy/spatial/_distance_pybind.cpython-312-aarch64-linux-musl.so +0 -0
  447. scipy/spatial/_distance_wrap.cpython-312-aarch64-linux-musl.so +0 -0
  448. scipy/spatial/_hausdorff.cpython-312-aarch64-linux-musl.so +0 -0
  449. scipy/spatial/_qhull.cpython-312-aarch64-linux-musl.so +0 -0
  450. scipy/spatial/_voronoi.cpython-312-aarch64-linux-musl.so +0 -0
  451. scipy/spatial/distance.py +49 -42
  452. scipy/spatial/tests/test_distance.py +15 -1
  453. scipy/spatial/tests/test_kdtree.py +1 -0
  454. scipy/spatial/tests/test_qhull.py +7 -2
  455. scipy/spatial/transform/__init__.py +5 -3
  456. scipy/spatial/transform/_rigid_transform.cpython-312-aarch64-linux-musl.so +0 -0
  457. scipy/spatial/transform/_rotation.cpython-312-aarch64-linux-musl.so +0 -0
  458. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  459. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  460. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  461. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  462. scipy/special/__init__.py +1 -47
  463. scipy/special/_add_newdocs.py +34 -772
  464. scipy/special/_basic.py +22 -25
  465. scipy/special/_comb.cpython-312-aarch64-linux-musl.so +0 -0
  466. scipy/special/_ellip_harm_2.cpython-312-aarch64-linux-musl.so +0 -0
  467. scipy/special/_gufuncs.cpython-312-aarch64-linux-musl.so +0 -0
  468. scipy/special/_logsumexp.py +67 -58
  469. scipy/special/_orthogonal.pyi +1 -1
  470. scipy/special/_specfun.cpython-312-aarch64-linux-musl.so +0 -0
  471. scipy/special/_special_ufuncs.cpython-312-aarch64-linux-musl.so +0 -0
  472. scipy/special/_spherical_bessel.py +4 -4
  473. scipy/special/_support_alternative_backends.py +212 -119
  474. scipy/special/_test_internal.cpython-312-aarch64-linux-musl.so +0 -0
  475. scipy/special/_testutils.py +4 -4
  476. scipy/special/_ufuncs.cpython-312-aarch64-linux-musl.so +0 -0
  477. scipy/special/_ufuncs.pyi +1 -0
  478. scipy/special/_ufuncs.pyx +215 -1400
  479. scipy/special/_ufuncs_cxx.cpython-312-aarch64-linux-musl.so +0 -0
  480. scipy/special/_ufuncs_cxx.pxd +2 -15
  481. scipy/special/_ufuncs_cxx.pyx +5 -44
  482. scipy/special/_ufuncs_cxx_defs.h +2 -16
  483. scipy/special/_ufuncs_defs.h +0 -8
  484. scipy/special/cython_special.cpython-312-aarch64-linux-musl.so +0 -0
  485. scipy/special/cython_special.pxd +1 -1
  486. scipy/special/tests/_cython_examples/meson.build +10 -1
  487. scipy/special/tests/test_basic.py +153 -20
  488. scipy/special/tests/test_boost_ufuncs.py +3 -0
  489. scipy/special/tests/test_cdflib.py +35 -11
  490. scipy/special/tests/test_gammainc.py +16 -0
  491. scipy/special/tests/test_hyp2f1.py +2 -2
  492. scipy/special/tests/test_log1mexp.py +85 -0
  493. scipy/special/tests/test_logsumexp.py +206 -64
  494. scipy/special/tests/test_mpmath.py +1 -0
  495. scipy/special/tests/test_nan_inputs.py +1 -1
  496. scipy/special/tests/test_orthogonal.py +17 -18
  497. scipy/special/tests/test_sf_error.py +3 -2
  498. scipy/special/tests/test_sph_harm.py +6 -7
  499. scipy/special/tests/test_support_alternative_backends.py +211 -76
  500. scipy/stats/__init__.py +4 -1
  501. scipy/stats/_ansari_swilk_statistics.cpython-312-aarch64-linux-musl.so +0 -0
  502. scipy/stats/_axis_nan_policy.py +5 -12
  503. scipy/stats/_biasedurn.cpython-312-aarch64-linux-musl.so +0 -0
  504. scipy/stats/_continued_fraction.py +387 -0
  505. scipy/stats/_continuous_distns.py +277 -310
  506. scipy/stats/_correlation.py +1 -1
  507. scipy/stats/_covariance.py +6 -3
  508. scipy/stats/_discrete_distns.py +39 -32
  509. scipy/stats/_distn_infrastructure.py +39 -12
  510. scipy/stats/_distribution_infrastructure.py +900 -238
  511. scipy/stats/_entropy.py +9 -10
  512. scipy/{_lib → stats}/_finite_differences.py +1 -1
  513. scipy/stats/_hypotests.py +83 -50
  514. scipy/stats/_kde.py +53 -49
  515. scipy/stats/_ksstats.py +1 -1
  516. scipy/stats/_levy_stable/__init__.py +7 -15
  517. scipy/stats/_levy_stable/levyst.cpython-312-aarch64-linux-musl.so +0 -0
  518. scipy/stats/_morestats.py +118 -73
  519. scipy/stats/_mstats_basic.py +13 -17
  520. scipy/stats/_mstats_extras.py +8 -8
  521. scipy/stats/_multivariate.py +89 -113
  522. scipy/stats/_new_distributions.py +97 -20
  523. scipy/stats/_page_trend_test.py +12 -5
  524. scipy/stats/_probability_distribution.py +265 -43
  525. scipy/stats/_qmc.py +14 -9
  526. scipy/stats/_qmc_cy.cpython-312-aarch64-linux-musl.so +0 -0
  527. scipy/stats/_qmvnt.py +16 -95
  528. scipy/stats/_qmvnt_cy.cpython-312-aarch64-linux-musl.so +0 -0
  529. scipy/stats/_quantile.py +335 -0
  530. scipy/stats/_rcont/rcont.cpython-312-aarch64-linux-musl.so +0 -0
  531. scipy/stats/_resampling.py +4 -29
  532. scipy/stats/_sampling.py +1 -1
  533. scipy/stats/_sobol.cpython-312-aarch64-linux-musl.so +0 -0
  534. scipy/stats/_stats.cpython-312-aarch64-linux-musl.so +0 -0
  535. scipy/stats/_stats_mstats_common.py +21 -2
  536. scipy/stats/_stats_py.py +550 -476
  537. scipy/stats/_stats_pythran.cpython-312-aarch64-linux-musl.so +0 -0
  538. scipy/stats/_unuran/unuran_wrapper.cpython-312-aarch64-linux-musl.so +0 -0
  539. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  540. scipy/stats/_variation.py +6 -8
  541. scipy/stats/_wilcoxon.py +13 -7
  542. scipy/stats/tests/common_tests.py +6 -4
  543. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  544. scipy/stats/tests/test_continued_fraction.py +173 -0
  545. scipy/stats/tests/test_continuous.py +379 -60
  546. scipy/stats/tests/test_continuous_basic.py +18 -12
  547. scipy/stats/tests/test_discrete_basic.py +14 -8
  548. scipy/stats/tests/test_discrete_distns.py +16 -16
  549. scipy/stats/tests/test_distributions.py +95 -75
  550. scipy/stats/tests/test_entropy.py +40 -48
  551. scipy/stats/tests/test_fit.py +4 -3
  552. scipy/stats/tests/test_hypotests.py +153 -24
  553. scipy/stats/tests/test_kdeoth.py +109 -41
  554. scipy/stats/tests/test_marray.py +289 -0
  555. scipy/stats/tests/test_morestats.py +79 -47
  556. scipy/stats/tests/test_mstats_basic.py +3 -3
  557. scipy/stats/tests/test_multivariate.py +434 -83
  558. scipy/stats/tests/test_qmc.py +13 -10
  559. scipy/stats/tests/test_quantile.py +199 -0
  560. scipy/stats/tests/test_rank.py +119 -112
  561. scipy/stats/tests/test_resampling.py +47 -56
  562. scipy/stats/tests/test_sampling.py +9 -4
  563. scipy/stats/tests/test_stats.py +799 -939
  564. scipy/stats/tests/test_variation.py +8 -6
  565. scipy/version.py +2 -2
  566. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  567. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  568. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +1262 -1269
  569. scipy.libs/libgcc_s-69c45f16.so.1 +0 -0
  570. scipy.libs/libgfortran-db0b6589.so.5.0.0 +0 -0
  571. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-1f1a71be.so.6.0.33} +0 -0
  572. scipy/_lib/array_api_extra/_funcs.py +0 -484
  573. scipy/_lib/array_api_extra/_typing.py +0 -8
  574. scipy/interpolate/_bspl.cpython-312-aarch64-linux-musl.so +0 -0
  575. scipy/optimize/_cobyla.cpython-312-aarch64-linux-musl.so +0 -0
  576. scipy/optimize/_cython_nnls.cpython-312-aarch64-linux-musl.so +0 -0
  577. scipy/optimize/_slsqp.cpython-312-aarch64-linux-musl.so +0 -0
  578. scipy/spatial/qhull_src/COPYING.txt +0 -38
  579. scipy/special/libsf_error_state.so +0 -0
  580. scipy/special/tests/test_log_softmax.py +0 -109
  581. scipy/special/tests/test_xsf_cuda.py +0 -114
  582. scipy/special/xsf/binom.h +0 -89
  583. scipy/special/xsf/cdflib.h +0 -100
  584. scipy/special/xsf/cephes/airy.h +0 -307
  585. scipy/special/xsf/cephes/besselpoly.h +0 -51
  586. scipy/special/xsf/cephes/beta.h +0 -257
  587. scipy/special/xsf/cephes/cbrt.h +0 -131
  588. scipy/special/xsf/cephes/chbevl.h +0 -85
  589. scipy/special/xsf/cephes/chdtr.h +0 -193
  590. scipy/special/xsf/cephes/const.h +0 -87
  591. scipy/special/xsf/cephes/ellie.h +0 -293
  592. scipy/special/xsf/cephes/ellik.h +0 -251
  593. scipy/special/xsf/cephes/ellpe.h +0 -107
  594. scipy/special/xsf/cephes/ellpk.h +0 -117
  595. scipy/special/xsf/cephes/expn.h +0 -260
  596. scipy/special/xsf/cephes/gamma.h +0 -398
  597. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  598. scipy/special/xsf/cephes/hyperg.h +0 -361
  599. scipy/special/xsf/cephes/i0.h +0 -149
  600. scipy/special/xsf/cephes/i1.h +0 -158
  601. scipy/special/xsf/cephes/igam.h +0 -421
  602. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  603. scipy/special/xsf/cephes/igami.h +0 -313
  604. scipy/special/xsf/cephes/j0.h +0 -225
  605. scipy/special/xsf/cephes/j1.h +0 -198
  606. scipy/special/xsf/cephes/jv.h +0 -715
  607. scipy/special/xsf/cephes/k0.h +0 -164
  608. scipy/special/xsf/cephes/k1.h +0 -163
  609. scipy/special/xsf/cephes/kn.h +0 -243
  610. scipy/special/xsf/cephes/lanczos.h +0 -112
  611. scipy/special/xsf/cephes/ndtr.h +0 -275
  612. scipy/special/xsf/cephes/poch.h +0 -85
  613. scipy/special/xsf/cephes/polevl.h +0 -167
  614. scipy/special/xsf/cephes/psi.h +0 -194
  615. scipy/special/xsf/cephes/rgamma.h +0 -111
  616. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  617. scipy/special/xsf/cephes/shichi.h +0 -248
  618. scipy/special/xsf/cephes/sici.h +0 -224
  619. scipy/special/xsf/cephes/sindg.h +0 -221
  620. scipy/special/xsf/cephes/tandg.h +0 -139
  621. scipy/special/xsf/cephes/trig.h +0 -58
  622. scipy/special/xsf/cephes/unity.h +0 -186
  623. scipy/special/xsf/cephes/zeta.h +0 -172
  624. scipy/special/xsf/config.h +0 -304
  625. scipy/special/xsf/digamma.h +0 -205
  626. scipy/special/xsf/error.h +0 -57
  627. scipy/special/xsf/evalpoly.h +0 -47
  628. scipy/special/xsf/expint.h +0 -266
  629. scipy/special/xsf/hyp2f1.h +0 -694
  630. scipy/special/xsf/iv_ratio.h +0 -173
  631. scipy/special/xsf/lambertw.h +0 -150
  632. scipy/special/xsf/loggamma.h +0 -163
  633. scipy/special/xsf/sici.h +0 -200
  634. scipy/special/xsf/tools.h +0 -427
  635. scipy/special/xsf/trig.h +0 -164
  636. scipy/special/xsf/wright_bessel.h +0 -843
  637. scipy/special/xsf/zlog1.h +0 -35
  638. scipy/stats/_mvn.cpython-312-aarch64-linux-musl.so +0 -0
  639. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  640. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  641. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -284,6 +284,7 @@ class ArpackError(RuntimeError):
284
284
  super().__init__(f"ARPACK error {info}: {msg}")
285
285
 
286
286
 
287
+
287
288
  class ArpackNoConvergence(ArpackError):
288
289
  """
289
290
  ARPACK iteration did not converge
@@ -315,12 +316,12 @@ class _ArpackParams:
315
316
  def __init__(self, n, k, tp, mode=1, sigma=None,
316
317
  ncv=None, v0=None, maxiter=None, which="LM", tol=0):
317
318
  if k <= 0:
318
- raise ValueError("k must be positive, k=%d" % k)
319
+ raise ValueError(f"k must be positive, k={k}")
319
320
 
320
321
  if maxiter is None:
321
322
  maxiter = n * 10
322
323
  if maxiter <= 0:
323
- raise ValueError("maxiter must be positive, maxiter=%d" % maxiter)
324
+ raise ValueError(f"maxiter must be positive, maxiter={maxiter}")
324
325
 
325
326
  if tp not in 'fdFD':
326
327
  # Use `float64` libraries from integer dtypes.
@@ -510,12 +511,12 @@ class _SymmetricArpackParams(_ArpackParams):
510
511
  self.B = M_matvec
511
512
  self.bmat = 'G'
512
513
  else:
513
- raise ValueError("mode=%i not implemented" % mode)
514
+ raise ValueError(f"mode={mode} not implemented")
514
515
 
515
516
  if which not in _SEUPD_WHICH:
516
517
  raise ValueError(f"which must be one of {' '.join(_SEUPD_WHICH)}")
517
518
  if k >= n:
518
- raise ValueError("k must be less than ndim(A), k=%d" % k)
519
+ raise ValueError(f"k must be less than ndim(A), k={k}")
519
520
 
520
521
  _ArpackParams.__init__(self, n, k, tp, mode, sigma,
521
522
  ncv, v0, maxiter, which, tol)
@@ -692,12 +693,12 @@ class _UnsymmetricArpackParams(_ArpackParams):
692
693
  self.bmat = 'G'
693
694
  self.OP = lambda x: self.OPa(M_matvec(x))
694
695
  else:
695
- raise ValueError("mode=%i not implemented" % mode)
696
+ raise ValueError(f"mode={mode} not implemented")
696
697
 
697
698
  if which not in _NEUPD_WHICH:
698
699
  raise ValueError(f"Parameter which must be one of {' '.join(_NEUPD_WHICH)}")
699
700
  if k >= n - 1:
700
- raise ValueError("k must be less than ndim(A)-1, k=%d" % k)
701
+ raise ValueError(f"k must be less than ndim(A)-1, k={k}")
701
702
 
702
703
  _ArpackParams.__init__(self, n, k, tp, mode, sigma,
703
704
  ncv, v0, maxiter, which, tol)
@@ -979,9 +980,10 @@ class IterInv(LinearOperator):
979
980
  def _matvec(self, x):
980
981
  b, info = self.ifunc(self.M, x, tol=self.tol)
981
982
  if info != 0:
982
- raise ValueError("Error in inverting M: function "
983
- "%s did not converge (info = %i)."
984
- % (self.ifunc.__name__, info))
983
+ raise ValueError(
984
+ f"Error in inverting M: function {self.ifunc.__name__} "
985
+ f"did not converge (info = {info})."
986
+ )
985
987
  return b
986
988
 
987
989
 
@@ -1026,9 +1028,10 @@ class IterOpInv(LinearOperator):
1026
1028
  def _matvec(self, x):
1027
1029
  b, info = self.ifunc(self.OP, x, tol=self.tol)
1028
1030
  if info != 0:
1029
- raise ValueError("Error in inverting [A-sigma*M]: function "
1030
- "%s did not converge (info = %i)."
1031
- % (self.ifunc.__name__, info))
1031
+ raise ValueError(
1032
+ f"Error in inverting [A-sigma*M]: function {self.ifunc.__name__} "
1033
+ f"did not converge (info = {info})."
1034
+ )
1032
1035
  return b
1033
1036
 
1034
1037
  @property
@@ -1268,7 +1271,7 @@ def eigs(A, k=6, M=None, sigma=None, which='LM', v0=None,
1268
1271
  n = A.shape[0]
1269
1272
 
1270
1273
  if k <= 0:
1271
- raise ValueError("k=%d must be greater than 0." % k)
1274
+ raise ValueError(f"k={k} must be greater than 0.")
1272
1275
 
1273
1276
  if k >= n - 1:
1274
1277
  warnings.warn("k >= N - 1 for N * N square matrix. "
@@ -1424,16 +1427,19 @@ def eigsh(A, k=6, M=None, sigma=None, which='LM', v0=None,
1424
1427
  unspecified. This is computed internally via a (sparse) LU
1425
1428
  decomposition for explicit matrices A & M, or via an iterative
1426
1429
  solver if either A or M is a general linear operator.
1427
- Alternatively, the user can supply the matrix or operator OPinv,
1430
+ Alternatively, the user can supply the matrix or operator `OPinv`,
1428
1431
  which gives ``x = OPinv @ b = [A - sigma * M]^-1 @ b``.
1432
+ Regardless of the selected mode (normal, cayley, or buckling),
1433
+ `OPinv` should always be supplied as ``OPinv = [A - sigma * M]^-1``.
1434
+
1429
1435
  Note that when sigma is specified, the keyword 'which' refers to
1430
1436
  the shifted eigenvalues ``w'[i]`` where:
1431
1437
 
1432
- if mode == 'normal', ``w'[i] = 1 / (w[i] - sigma)``.
1438
+ if ``mode == 'normal'``: ``w'[i] = 1 / (w[i] - sigma)``.
1433
1439
 
1434
- if mode == 'cayley', ``w'[i] = (w[i] + sigma) / (w[i] - sigma)``.
1440
+ if ``mode == 'cayley'``: ``w'[i] = (w[i] + sigma) / (w[i] - sigma)``.
1435
1441
 
1436
- if mode == 'buckling', ``w'[i] = w[i] / (w[i] - sigma)``.
1442
+ if ``mode == 'buckling'``: ``w'[i] = w[i] / (w[i] - sigma)``.
1437
1443
 
1438
1444
  (see further discussion in 'mode' below)
1439
1445
  v0 : ndarray, optional
@@ -307,7 +307,7 @@ def lobpcg(
307
307
  ``A x = lambda x`` without constraints or preconditioning.
308
308
 
309
309
  >>> import numpy as np
310
- >>> from scipy.sparse import spdiags
310
+ >>> from scipy.sparse import diags_array
311
311
  >>> from scipy.sparse.linalg import LinearOperator, aslinearoperator
312
312
  >>> from scipy.sparse.linalg import lobpcg
313
313
 
@@ -323,7 +323,7 @@ def lobpcg(
323
323
  the sparse diagonal matrix `A`
324
324
  of the eigenvalue problem ``A x = lambda x`` to solve.
325
325
 
326
- >>> A = spdiags(vals, 0, n, n)
326
+ >>> A = diags_array(vals, offsets=0, shape=(n, n))
327
327
  >>> A = A.astype(np.int16)
328
328
  >>> A.toarray()
329
329
  array([[ 1, 0, 0, ..., 0, 0, 0],
@@ -507,15 +507,15 @@ def lobpcg(
507
507
  if M is None:
508
508
  aux += "out"
509
509
  aux += " preconditioning\n\n"
510
- aux += "matrix size %d\n" % n
511
- aux += "block size %d\n\n" % sizeX
510
+ aux += f"matrix size {n}\n"
511
+ aux += f"block size {sizeX}\n\n"
512
512
  if blockVectorY is None:
513
513
  aux += "No constraints\n\n"
514
514
  else:
515
515
  if sizeY > 1:
516
- aux += "%d constraints\n\n" % sizeY
516
+ aux += f"{sizeY} constraints\n\n"
517
517
  else:
518
- aux += "%d constraint\n\n" % sizeY
518
+ aux += f"{sizeY} constraint\n\n"
519
519
  print(aux)
520
520
 
521
521
  if (n - sizeY) < (5 * sizeX):
@@ -55,14 +55,14 @@ __all__ = ['LinearOperator', 'aslinearoperator']
55
55
  class LinearOperator:
56
56
  """Common interface for performing matrix vector products
57
57
 
58
- Many iterative methods (e.g. cg, gmres) do not need to know the
59
- individual entries of a matrix to solve a linear system A@x=b.
58
+ Many iterative methods (e.g. `cg`, `gmres`) do not need to know the
59
+ individual entries of a matrix to solve a linear system ``A@x = b``.
60
60
  Such solvers only require the computation of matrix vector
61
- products, A@v where v is a dense vector. This class serves as
61
+ products, ``A@v`` where ``v`` is a dense vector. This class serves as
62
62
  an abstract interface between iterative solvers and matrix-like
63
63
  objects.
64
64
 
65
- To construct a concrete LinearOperator, either pass appropriate
65
+ To construct a concrete `LinearOperator`, either pass appropriate
66
66
  callables to the constructor of this class, or subclass it.
67
67
 
68
68
  A subclass must implement either one of the methods ``_matvec``
@@ -82,17 +82,17 @@ class LinearOperator:
82
82
  Parameters
83
83
  ----------
84
84
  shape : tuple
85
- Matrix dimensions (M, N).
85
+ Matrix dimensions ``(M, N)``.
86
86
  matvec : callable f(v)
87
- Returns returns A @ v.
87
+ Returns returns ``A @ v``.
88
88
  rmatvec : callable f(v)
89
- Returns A^H @ v, where A^H is the conjugate transpose of A.
89
+ Returns ``A^H @ v``, where ``A^H`` is the conjugate transpose of ``A``.
90
90
  matmat : callable f(V)
91
- Returns A @ V, where V is a dense matrix with dimensions (N, K).
91
+ Returns ``A @ V``, where ``V`` is a dense matrix with dimensions ``(N, K)``.
92
92
  dtype : dtype
93
93
  Data type of the matrix.
94
94
  rmatmat : callable f(V)
95
- Returns A^H @ V, where V is a dense matrix with dimensions (M, K).
95
+ Returns ``A^H @ V``, where ``V`` is a dense matrix with dimensions ``(M, K)``.
96
96
 
97
97
  Attributes
98
98
  ----------
@@ -108,17 +108,17 @@ class LinearOperator:
108
108
 
109
109
  Notes
110
110
  -----
111
- The user-defined matvec() function must properly handle the case
112
- where v has shape (N,) as well as the (N,1) case. The shape of
113
- the return type is handled internally by LinearOperator.
111
+ The user-defined `matvec` function must properly handle the case
112
+ where ``v`` has shape ``(N,)`` as well as the ``(N,1)`` case. The shape of
113
+ the return type is handled internally by `LinearOperator`.
114
114
 
115
115
  It is highly recommended to explicitly specify the `dtype`, otherwise
116
116
  it is determined automatically at the cost of a single matvec application
117
- on `int8` zero vector using the promoted `dtype` of the output.
118
- Python `int` could be difficult to automatically cast to numpy integers
117
+ on ``int8`` zero vector using the promoted `dtype` of the output.
118
+ Python ``int`` could be difficult to automatically cast to numpy integers
119
119
  in the definition of the `matvec` so the determination may be inaccurate.
120
120
  It is assumed that `matmat`, `rmatvec`, and `rmatmat` would result in
121
- the same dtype of the output given an `int8` input as `matvec`.
121
+ the same dtype of the output given an ``int8`` input as `matvec`.
122
122
 
123
123
  LinearOperator instances can also be multiplied, added with each
124
124
  other and exponentiated, all lazily: the result of these operations
@@ -403,8 +403,7 @@ class LinearOperator:
403
403
  X = np.asanyarray(X)
404
404
 
405
405
  if X.ndim != 2:
406
- raise ValueError('expected 2-d ndarray or matrix, not %d-d'
407
- % X.ndim)
406
+ raise ValueError(f'expected 2-d ndarray or matrix, not {X.ndim}-d')
408
407
 
409
408
  if X.shape[0] != self.shape[0]:
410
409
  raise ValueError(f'dimension mismatch: {self.shape}, {X.shape}')
@@ -552,7 +551,7 @@ class LinearOperator:
552
551
  else:
553
552
  dt = 'dtype=' + str(self.dtype)
554
553
 
555
- return '<%dx%d %s with %s>' % (M, N, self.__class__.__name__, dt)
554
+ return f'<{M}x{N} {self.__class__.__name__} with {dt}>'
556
555
 
557
556
  def adjoint(self):
558
557
  """Hermitian adjoint.
@@ -184,7 +184,7 @@ def _fgmres(matvec, v0, m, atol, lpsolve=None, rpsolve=None, cs=(), outer_v=(),
184
184
  def gcrotmk(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=1000, M=None, callback=None,
185
185
  m=20, k=None, CU=None, discard_C=False, truncate='oldest'):
186
186
  """
187
- Solve a matrix equation using flexible GCROT(m,k) algorithm.
187
+ Solve ``Ax = b`` with the flexible GCROT(m,k) algorithm.
188
188
 
189
189
  Parameters
190
190
  ----------
@@ -273,7 +273,7 @@ def gcrotmk(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=1000, M=None, callback
273
273
  True
274
274
 
275
275
  """
276
- A,M,x,b,postprocess = make_system(A,M,x0,b)
276
+ A,M,x,b = make_system(A,M,x0,b)
277
277
 
278
278
  if not np.isfinite(b).all():
279
279
  raise ValueError("RHS must contain only finite numbers")
@@ -306,7 +306,7 @@ def gcrotmk(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=1000, M=None, callback
306
306
 
307
307
  if b_norm == 0:
308
308
  x = b
309
- return (postprocess(x), 0)
309
+ return (x, 0)
310
310
 
311
311
  if discard_C:
312
312
  CU[:] = [(None, u) for c, u in CU]
@@ -500,4 +500,4 @@ def gcrotmk(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=1000, M=None, callback
500
500
  if discard_C:
501
501
  CU[:] = [(None, uz) for cz, uz in CU]
502
502
 
503
- return postprocess(x), j_outer + 1
503
+ return x, j_outer + 1
@@ -22,7 +22,8 @@ def _get_atol_rtol(name, b_norm, atol=0., rtol=1e-5):
22
22
 
23
23
 
24
24
  def bicg(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=None):
25
- """Use BIConjugate Gradient iteration to solve ``Ax = b``.
25
+ """
26
+ Solve ``Ax = b`` with the BIConjugate Gradient method.
26
27
 
27
28
  Parameters
28
29
  ----------
@@ -86,13 +87,13 @@ def bicg(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=No
86
87
  >>> np.allclose(A.dot(x), b)
87
88
  True
88
89
  """
89
- A, M, x, b, postprocess = make_system(A, M, x0, b)
90
+ A, M, x, b = make_system(A, M, x0, b)
90
91
  bnrm2 = np.linalg.norm(b)
91
92
 
92
93
  atol, _ = _get_atol_rtol('bicg', bnrm2, atol, rtol)
93
94
 
94
95
  if bnrm2 == 0:
95
- return postprocess(b), 0
96
+ return b, 0
96
97
 
97
98
  n = len(b)
98
99
  dotprod = np.vdot if np.iscomplexobj(x) else np.dot
@@ -113,7 +114,7 @@ def bicg(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=No
113
114
 
114
115
  for iteration in range(maxiter):
115
116
  if np.linalg.norm(r) < atol: # Are we done?
116
- return postprocess(x), 0
117
+ return x, 0
117
118
 
118
119
  z = psolve(r)
119
120
  ztilde = rpsolve(rtilde)
@@ -121,7 +122,7 @@ def bicg(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=No
121
122
  rho_cur = dotprod(rtilde, z)
122
123
 
123
124
  if np.abs(rho_cur) < rhotol: # Breakdown case
124
- return postprocess, -10
125
+ return x, -10
125
126
 
126
127
  if iteration > 0:
127
128
  beta = rho_cur / rho_prev
@@ -138,7 +139,7 @@ def bicg(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=No
138
139
  rv = dotprod(ptilde, q)
139
140
 
140
141
  if rv == 0:
141
- return postprocess(x), -11
142
+ return x, -11
142
143
 
143
144
  alpha = rho_cur / rv
144
145
  x += alpha*p
@@ -151,12 +152,13 @@ def bicg(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=No
151
152
 
152
153
  else: # for loop exhausted
153
154
  # Return incomplete progress
154
- return postprocess(x), maxiter
155
+ return x, maxiter
155
156
 
156
157
 
157
158
  def bicgstab(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None,
158
159
  callback=None):
159
- """Use BIConjugate Gradient STABilized iteration to solve ``Ax = b``.
160
+ """
161
+ Solve ``Ax = b`` with the BIConjugate Gradient STABilized method.
160
162
 
161
163
  Parameters
162
164
  ----------
@@ -224,13 +226,13 @@ def bicgstab(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None,
224
226
  >>> np.allclose(A.dot(x), b)
225
227
  True
226
228
  """
227
- A, M, x, b, postprocess = make_system(A, M, x0, b)
229
+ A, M, x, b = make_system(A, M, x0, b)
228
230
  bnrm2 = np.linalg.norm(b)
229
231
 
230
232
  atol, _ = _get_atol_rtol('bicgstab', bnrm2, atol, rtol)
231
233
 
232
234
  if bnrm2 == 0:
233
- return postprocess(b), 0
235
+ return b, 0
234
236
 
235
237
  n = len(b)
236
238
 
@@ -255,15 +257,15 @@ def bicgstab(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None,
255
257
 
256
258
  for iteration in range(maxiter):
257
259
  if np.linalg.norm(r) < atol: # Are we done?
258
- return postprocess(x), 0
260
+ return x, 0
259
261
 
260
262
  rho = dotprod(rtilde, r)
261
263
  if np.abs(rho) < rhotol: # rho breakdown
262
- return postprocess(x), -10
264
+ return x, -10
263
265
 
264
266
  if iteration > 0:
265
267
  if np.abs(omega) < omegatol: # omega breakdown
266
- return postprocess(x), -11
268
+ return x, -11
267
269
 
268
270
  beta = (rho / rho_prev) * (alpha / omega)
269
271
  p -= omega*v
@@ -277,14 +279,14 @@ def bicgstab(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None,
277
279
  v = matvec(phat)
278
280
  rv = dotprod(rtilde, v)
279
281
  if rv == 0:
280
- return postprocess(x), -11
282
+ return x, -11
281
283
  alpha = rho / rv
282
284
  r -= alpha*v
283
285
  s[:] = r[:]
284
286
 
285
287
  if np.linalg.norm(s) < atol:
286
288
  x += alpha*phat
287
- return postprocess(x), 0
289
+ return x, 0
288
290
 
289
291
  shat = psolve(s)
290
292
  t = matvec(shat)
@@ -299,11 +301,13 @@ def bicgstab(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None,
299
301
 
300
302
  else: # for loop exhausted
301
303
  # Return incomplete progress
302
- return postprocess(x), maxiter
304
+ return x, maxiter
303
305
 
304
306
 
305
307
  def cg(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=None):
306
- """Use Conjugate Gradient iteration to solve ``Ax = b``.
308
+ """
309
+ Solve ``Ax = b`` with the Conjugate Gradient method, for a symmetric,
310
+ positive-definite `A`.
307
311
 
308
312
  Parameters
309
313
  ----------
@@ -372,13 +376,13 @@ def cg(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=None
372
376
  >>> np.allclose(A.dot(x), b)
373
377
  True
374
378
  """
375
- A, M, x, b, postprocess = make_system(A, M, x0, b)
379
+ A, M, x, b = make_system(A, M, x0, b)
376
380
  bnrm2 = np.linalg.norm(b)
377
381
 
378
382
  atol, _ = _get_atol_rtol('cg', bnrm2, atol, rtol)
379
383
 
380
384
  if bnrm2 == 0:
381
- return postprocess(b), 0
385
+ return b, 0
382
386
 
383
387
  n = len(b)
384
388
 
@@ -396,7 +400,7 @@ def cg(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=None
396
400
 
397
401
  for iteration in range(maxiter):
398
402
  if np.linalg.norm(r) < atol: # Are we done?
399
- return postprocess(x), 0
403
+ return x, 0
400
404
 
401
405
  z = psolve(r)
402
406
  rho_cur = dotprod(r, z)
@@ -419,11 +423,12 @@ def cg(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=None
419
423
 
420
424
  else: # for loop exhausted
421
425
  # Return incomplete progress
422
- return postprocess(x), maxiter
426
+ return x, maxiter
423
427
 
424
428
 
425
429
  def cgs(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=None):
426
- """Use Conjugate Gradient Squared iteration to solve ``Ax = b``.
430
+ """
431
+ Solve ``Ax = b`` with the Conjugate Gradient Squared method.
427
432
 
428
433
  Parameters
429
434
  ----------
@@ -491,13 +496,13 @@ def cgs(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=Non
491
496
  >>> np.allclose(A.dot(x), b)
492
497
  True
493
498
  """
494
- A, M, x, b, postprocess = make_system(A, M, x0, b)
499
+ A, M, x, b = make_system(A, M, x0, b)
495
500
  bnrm2 = np.linalg.norm(b)
496
501
 
497
502
  atol, _ = _get_atol_rtol('cgs', bnrm2, atol, rtol)
498
503
 
499
504
  if bnrm2 == 0:
500
- return postprocess(b), 0
505
+ return b, 0
501
506
 
502
507
  n = len(b)
503
508
 
@@ -524,11 +529,11 @@ def cgs(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=Non
524
529
  for iteration in range(maxiter):
525
530
  rnorm = np.linalg.norm(r)
526
531
  if rnorm < atol: # Are we done?
527
- return postprocess(x), 0
532
+ return x, 0
528
533
 
529
534
  rho_cur = dotprod(rtilde, r)
530
535
  if np.abs(rho_cur) < rhotol: # Breakdown case
531
- return postprocess, -10
536
+ return x, -10
532
537
 
533
538
  if iteration > 0:
534
539
  beta = rho_cur / rho_prev
@@ -553,7 +558,7 @@ def cgs(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=Non
553
558
  rv = dotprod(rtilde, vhat)
554
559
 
555
560
  if rv == 0: # Dot product breakdown
556
- return postprocess(x), -11
561
+ return x, -11
557
562
 
558
563
  alpha = rho_cur / rv
559
564
  q[:] = u[:]
@@ -576,13 +581,13 @@ def cgs(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M=None, callback=Non
576
581
 
577
582
  else: # for loop exhausted
578
583
  # Return incomplete progress
579
- return postprocess(x), maxiter
584
+ return x, maxiter
580
585
 
581
586
 
582
587
  def gmres(A, b, x0=None, *, rtol=1e-5, atol=0., restart=None, maxiter=None, M=None,
583
588
  callback=None, callback_type=None):
584
589
  """
585
- Use Generalized Minimal RESidual iteration to solve ``Ax = b``.
590
+ Solve ``Ax = b`` with the Generalized Minimal RESidual method.
586
591
 
587
592
  Parameters
588
593
  ----------
@@ -689,7 +694,7 @@ def gmres(A, b, x0=None, *, rtol=1e-5, atol=0., restart=None, maxiter=None, M=No
689
694
  if callback is None:
690
695
  callback_type = None
691
696
 
692
- A, M, x, b, postprocess = make_system(A, M, x0, b)
697
+ A, M, x, b = make_system(A, M, x0, b)
693
698
  matvec = A.matvec
694
699
  psolve = M.matvec
695
700
  n = len(b)
@@ -698,7 +703,7 @@ def gmres(A, b, x0=None, *, rtol=1e-5, atol=0., restart=None, maxiter=None, M=No
698
703
  atol, _ = _get_atol_rtol('gmres', bnrm2, atol, rtol)
699
704
 
700
705
  if bnrm2 == 0:
701
- return postprocess(b), 0
706
+ return b, 0
702
707
 
703
708
  eps = np.finfo(x.dtype.char).eps
704
709
 
@@ -737,7 +742,7 @@ def gmres(A, b, x0=None, *, rtol=1e-5, atol=0., restart=None, maxiter=None, M=No
737
742
  if iteration == 0:
738
743
  r = b - matvec(x) if x.any() else b.copy()
739
744
  if np.linalg.norm(r) < atol: # Are we done?
740
- return postprocess(x), 0
745
+ return x, 0
741
746
 
742
747
  v[0, :] = psolve(r)
743
748
  tmp = np.linalg.norm(v[0, :])
@@ -818,7 +823,7 @@ def gmres(A, b, x0=None, *, rtol=1e-5, atol=0., restart=None, maxiter=None, M=No
818
823
 
819
824
  # Legacy exit
820
825
  if callback_type == 'legacy' and inner_iter == maxiter:
821
- return postprocess(x), 0 if rnorm <= atol else maxiter
826
+ return x, 0 if rnorm <= atol else maxiter
822
827
 
823
828
  if callback_type == 'x':
824
829
  callback(x)
@@ -838,12 +843,13 @@ def gmres(A, b, x0=None, *, rtol=1e-5, atol=0., restart=None, maxiter=None, M=No
838
843
  ptol = presid * min(ptol_max_factor, atol / rnorm)
839
844
 
840
845
  info = 0 if (rnorm <= atol) else maxiter
841
- return postprocess(x), info
846
+ return x, info
842
847
 
843
848
 
844
849
  def qmr(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M1=None, M2=None,
845
850
  callback=None):
846
- """Use Quasi-Minimal Residual iteration to solve ``Ax = b``.
851
+ """
852
+ Solve ``Ax = b`` with the Quasi-Minimal Residual method.
847
853
 
848
854
  Parameters
849
855
  ----------
@@ -901,13 +907,13 @@ def qmr(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M1=None, M2=None,
901
907
  True
902
908
  """
903
909
  A_ = A
904
- A, M, x, b, postprocess = make_system(A, None, x0, b)
910
+ A, M, x, b = make_system(A, None, x0, b)
905
911
  bnrm2 = np.linalg.norm(b)
906
912
 
907
913
  atol, _ = _get_atol_rtol('qmr', bnrm2, atol, rtol)
908
914
 
909
915
  if bnrm2 == 0:
910
- return postprocess(b), 0
916
+ return b, 0
911
917
 
912
918
  if M1 is None and M2 is None:
913
919
  if hasattr(A_, 'psolve'):
@@ -964,11 +970,11 @@ def qmr(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M1=None, M2=None,
964
970
 
965
971
  for iteration in range(maxiter):
966
972
  if np.linalg.norm(r) < atol: # Are we done?
967
- return postprocess(x), 0
973
+ return x, 0
968
974
  if np.abs(rho) < rhotol: # rho breakdown
969
- return postprocess(x), -10
975
+ return x, -10
970
976
  if np.abs(xi) < xitol: # xi breakdown
971
- return postprocess(x), -15
977
+ return x, -15
972
978
 
973
979
  v[:] = vtilde[:]
974
980
  v *= (1 / rho)
@@ -979,7 +985,7 @@ def qmr(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M1=None, M2=None,
979
985
  delta = dotprod(z, y)
980
986
 
981
987
  if np.abs(delta) < deltatol: # delta breakdown
982
- return postprocess(x), -13
988
+ return x, -13
983
989
 
984
990
  ytilde = M2.matvec(y)
985
991
  ztilde = M1.rmatvec(z)
@@ -996,11 +1002,11 @@ def qmr(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M1=None, M2=None,
996
1002
  ptilde = A.matvec(p)
997
1003
  epsilon = dotprod(q, ptilde)
998
1004
  if np.abs(epsilon) < epsilontol: # epsilon breakdown
999
- return postprocess(x), -14
1005
+ return x, -14
1000
1006
 
1001
1007
  beta = epsilon / delta
1002
1008
  if np.abs(beta) < betatol: # beta breakdown
1003
- return postprocess(x), -11
1009
+ return x, -11
1004
1010
 
1005
1011
  vtilde[:] = ptilde[:]
1006
1012
  vtilde -= beta*v
@@ -1019,7 +1025,7 @@ def qmr(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M1=None, M2=None,
1019
1025
  gamma = 1 / np.sqrt(1 + theta**2)
1020
1026
 
1021
1027
  if np.abs(gamma) < gammatol: # gamma breakdown
1022
- return postprocess(x), -12
1028
+ return x, -12
1023
1029
 
1024
1030
  eta *= -(rho_prev / beta) * (gamma / gamma_prev)**2
1025
1031
 
@@ -1042,4 +1048,4 @@ def qmr(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=None, M1=None, M2=None,
1042
1048
 
1043
1049
  else: # for loop exhausted
1044
1050
  # Return incomplete progress
1045
- return postprocess(x), maxiter
1051
+ return x, maxiter
@@ -16,7 +16,7 @@ def lgmres(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=1000, M=None, callback=
16
16
  inner_m=30, outer_k=3, outer_v=None, store_outer_Av=True,
17
17
  prepend_outer_v=False):
18
18
  """
19
- Solve a matrix equation using the LGMRES algorithm.
19
+ Solve ``Ax = b`` with the LGMRES algorithm.
20
20
 
21
21
  The LGMRES algorithm [1]_ [2]_ is designed to avoid some problems
22
22
  in the convergence in restarted GMRES, and often converges in fewer
@@ -119,7 +119,7 @@ def lgmres(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=1000, M=None, callback=
119
119
  >>> np.allclose(A.dot(x), b)
120
120
  True
121
121
  """
122
- A,M,x,b,postprocess = make_system(A,M,x0,b)
122
+ A,M,x,b = make_system(A,M,x0,b)
123
123
 
124
124
  if not np.isfinite(b).all():
125
125
  raise ValueError("RHS must contain only finite numbers")
@@ -140,7 +140,7 @@ def lgmres(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=1000, M=None, callback=
140
140
 
141
141
  if b_norm == 0:
142
142
  x = b
143
- return (postprocess(x), 0)
143
+ return (x, 0)
144
144
 
145
145
  ptol_max_factor = 1.0
146
146
 
@@ -192,7 +192,7 @@ def lgmres(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=1000, M=None, callback=
192
192
  except LinAlgError:
193
193
  # Floating point over/underflow, non-finite result from
194
194
  # matmul etc. -- report failure.
195
- return postprocess(x), k_outer + 1
195
+ return x, k_outer + 1
196
196
 
197
197
  # Inner loop tolerance control
198
198
  if pres > ptol:
@@ -225,6 +225,6 @@ def lgmres(A, b, x0=None, *, rtol=1e-5, atol=0., maxiter=1000, M=None, callback=
225
225
  x += dx
226
226
  else:
227
227
  # didn't converge ...
228
- return postprocess(x), maxiter
228
+ return x, maxiter
229
229
 
230
- return postprocess(x), 0
230
+ return x, 0