scipy 1.15.3__cp312-cp312-macosx_12_0_arm64.whl → 1.16.0rc2__cp312-cp312-macosx_12_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.
- scipy/.dylibs/libscipy_openblas.dylib +0 -0
- scipy/__config__.py +8 -8
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-312-darwin.so +0 -0
- scipy/_lib/_array_api.py +486 -161
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_bunch.py +4 -0
- scipy/_lib/_ccallback_c.cpython-312-darwin.so +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_deprecation_call.cpython-312-darwin.so +0 -0
- scipy/_lib/_test_deprecation_def.cpython-312-darwin.so +0 -0
- scipy/_lib/_testutils.py +6 -2
- scipy/_lib/_util.py +222 -125
- scipy/_lib/array_api_compat/__init__.py +4 -4
- scipy/_lib/array_api_compat/_internal.py +19 -6
- scipy/_lib/array_api_compat/common/__init__.py +1 -1
- scipy/_lib/array_api_compat/common/_aliases.py +365 -193
- scipy/_lib/array_api_compat/common/_fft.py +94 -64
- scipy/_lib/array_api_compat/common/_helpers.py +413 -180
- scipy/_lib/array_api_compat/common/_linalg.py +116 -40
- scipy/_lib/array_api_compat/common/_typing.py +179 -10
- scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
- scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
- scipy/_lib/array_api_compat/cupy/_info.py +16 -6
- scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
- scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
- scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
- scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
- scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
- scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
- scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
- scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
- scipy/_lib/array_api_compat/numpy/_info.py +36 -16
- scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
- scipy/_lib/array_api_compat/numpy/fft.py +11 -5
- scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
- scipy/_lib/array_api_compat/torch/__init__.py +3 -5
- scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
- scipy/_lib/array_api_compat/torch/_info.py +27 -16
- scipy/_lib/array_api_compat/torch/_typing.py +3 -0
- scipy/_lib/array_api_compat/torch/fft.py +17 -18
- scipy/_lib/array_api_compat/torch/linalg.py +16 -16
- scipy/_lib/array_api_extra/__init__.py +26 -3
- scipy/_lib/array_api_extra/_delegation.py +171 -0
- scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_at.py +463 -0
- scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
- scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
- scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
- scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
- scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
- scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
- scipy/_lib/array_api_extra/testing.py +359 -0
- scipy/_lib/decorator.py +2 -2
- scipy/_lib/doccer.py +1 -7
- scipy/_lib/messagestream.cpython-312-darwin.so +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/test__util.py +105 -121
- scipy/_lib/tests/test_array_api.py +166 -35
- scipy/_lib/tests/test_bunch.py +7 -0
- scipy/_lib/tests/test_ccallback.py +2 -10
- scipy/_lib/tests/test_public_api.py +13 -0
- scipy/cluster/_hierarchy.cpython-312-darwin.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
- scipy/cluster/_vq.cpython-312-darwin.so +0 -0
- scipy/cluster/hierarchy.py +393 -223
- scipy/cluster/tests/test_hierarchy.py +273 -335
- scipy/cluster/tests/test_vq.py +45 -61
- scipy/cluster/vq.py +39 -35
- scipy/conftest.py +263 -157
- scipy/constants/_constants.py +4 -1
- scipy/constants/tests/test_codata.py +2 -2
- scipy/constants/tests/test_constants.py +11 -18
- scipy/datasets/_download_all.py +15 -1
- scipy/datasets/_fetchers.py +7 -1
- scipy/datasets/_utils.py +1 -1
- scipy/differentiate/_differentiate.py +25 -25
- scipy/differentiate/tests/test_differentiate.py +24 -25
- scipy/fft/_basic.py +20 -0
- scipy/fft/_helper.py +3 -34
- scipy/fft/_pocketfft/helper.py +29 -1
- scipy/fft/_pocketfft/tests/test_basic.py +2 -4
- scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
- scipy/fft/_realtransforms.py +13 -0
- scipy/fft/tests/test_basic.py +27 -25
- scipy/fft/tests/test_fftlog.py +16 -7
- scipy/fft/tests/test_helper.py +18 -34
- scipy/fft/tests/test_real_transforms.py +8 -10
- scipy/fftpack/convolve.cpython-312-darwin.so +0 -0
- scipy/fftpack/tests/test_basic.py +2 -4
- scipy/fftpack/tests/test_real_transforms.py +8 -9
- scipy/integrate/_bvp.py +9 -3
- scipy/integrate/_cubature.py +3 -2
- scipy/integrate/_dop.cpython-312-darwin.so +0 -0
- scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-312-darwin.so +0 -0
- scipy/integrate/_quadpack_py.py +11 -7
- scipy/integrate/_quadrature.py +3 -3
- scipy/integrate/_rules/_base.py +2 -2
- scipy/integrate/_tanhsinh.py +48 -47
- scipy/integrate/_test_odeint_banded.cpython-312-darwin.so +0 -0
- scipy/integrate/_vode.cpython-312-darwin.so +0 -0
- scipy/integrate/tests/test__quad_vec.py +0 -6
- scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
- scipy/integrate/tests/test_cubature.py +21 -35
- scipy/integrate/tests/test_quadrature.py +6 -8
- scipy/integrate/tests/test_tanhsinh.py +56 -48
- scipy/interpolate/__init__.py +70 -58
- scipy/interpolate/_bary_rational.py +22 -22
- scipy/interpolate/_bsplines.py +119 -66
- scipy/interpolate/_cubic.py +65 -50
- scipy/interpolate/_dfitpack.cpython-312-darwin.so +0 -0
- scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
- scipy/interpolate/_fitpack.cpython-312-darwin.so +0 -0
- scipy/interpolate/_fitpack2.py +9 -6
- scipy/interpolate/_fitpack_impl.py +32 -26
- scipy/interpolate/_fitpack_repro.py +23 -19
- scipy/interpolate/_interpnd.cpython-312-darwin.so +0 -0
- scipy/interpolate/_interpolate.py +30 -12
- scipy/interpolate/_ndbspline.py +13 -18
- scipy/interpolate/_ndgriddata.py +5 -8
- scipy/interpolate/_polyint.py +95 -31
- scipy/interpolate/_ppoly.cpython-312-darwin.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-312-darwin.so +0 -0
- scipy/interpolate/dfitpack.py +0 -20
- scipy/interpolate/interpnd.py +1 -2
- scipy/interpolate/tests/test_bary_rational.py +2 -2
- scipy/interpolate/tests/test_bsplines.py +97 -1
- scipy/interpolate/tests/test_fitpack2.py +39 -1
- scipy/interpolate/tests/test_interpnd.py +32 -20
- scipy/interpolate/tests/test_interpolate.py +48 -4
- scipy/interpolate/tests/test_rgi.py +2 -1
- scipy/io/_fast_matrix_market/__init__.py +2 -0
- scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
- scipy/io/_harwell_boeing/hb.py +7 -11
- scipy/io/_idl.py +5 -7
- scipy/io/_netcdf.py +15 -5
- scipy/io/_test_fortran.cpython-312-darwin.so +0 -0
- scipy/io/arff/tests/test_arffread.py +3 -3
- scipy/io/matlab/__init__.py +5 -3
- scipy/io/matlab/_mio.py +4 -1
- scipy/io/matlab/_mio5.py +19 -13
- scipy/io/matlab/_mio5_utils.cpython-312-darwin.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-312-darwin.so +0 -0
- scipy/io/matlab/tests/test_mio.py +46 -18
- scipy/io/matlab/tests/test_mio_funcs.py +1 -1
- scipy/io/tests/test_mmio.py +7 -1
- scipy/io/tests/test_wavfile.py +41 -0
- scipy/io/wavfile.py +57 -10
- scipy/linalg/_basic.py +113 -86
- scipy/linalg/_cythonized_array_utils.cpython-312-darwin.so +0 -0
- scipy/linalg/_decomp.py +22 -9
- scipy/linalg/_decomp_cholesky.py +28 -13
- scipy/linalg/_decomp_cossin.py +45 -30
- scipy/linalg/_decomp_interpolative.cpython-312-darwin.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-312-darwin.so +0 -0
- scipy/linalg/_decomp_polar.py +2 -0
- scipy/linalg/_decomp_qr.py +6 -2
- scipy/linalg/_decomp_qz.py +3 -0
- scipy/linalg/_decomp_schur.py +3 -1
- scipy/linalg/_decomp_svd.py +13 -2
- scipy/linalg/_decomp_update.cpython-312-darwin.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
- scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
- scipy/linalg/cython_lapack.cpython-312-darwin.so +0 -0
- scipy/linalg/lapack.py +22 -2
- scipy/linalg/tests/_cython_examples/meson.build +7 -0
- scipy/linalg/tests/test_basic.py +31 -16
- scipy/linalg/tests/test_batch.py +588 -0
- scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
- scipy/linalg/tests/test_decomp.py +40 -3
- scipy/linalg/tests/test_decomp_cossin.py +14 -0
- scipy/linalg/tests/test_decomp_ldl.py +1 -1
- scipy/linalg/tests/test_lapack.py +115 -7
- scipy/linalg/tests/test_matfuncs.py +157 -102
- scipy/linalg/tests/test_procrustes.py +0 -7
- scipy/linalg/tests/test_solve_toeplitz.py +1 -1
- scipy/linalg/tests/test_special_matrices.py +1 -5
- scipy/ndimage/__init__.py +1 -0
- scipy/ndimage/_cytest.cpython-312-darwin.so +0 -0
- scipy/ndimage/_delegators.py +8 -2
- scipy/ndimage/_filters.py +453 -5
- scipy/ndimage/_interpolation.py +36 -6
- scipy/ndimage/_measurements.py +4 -2
- scipy/ndimage/_morphology.py +5 -0
- scipy/ndimage/_nd_image.cpython-312-darwin.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-312-darwin.so +0 -0
- scipy/ndimage/_support_alternative_backends.py +18 -6
- scipy/ndimage/tests/test_filters.py +370 -259
- scipy/ndimage/tests/test_fourier.py +7 -9
- scipy/ndimage/tests/test_interpolation.py +68 -61
- scipy/ndimage/tests/test_measurements.py +18 -35
- scipy/ndimage/tests/test_morphology.py +143 -131
- scipy/ndimage/tests/test_splines.py +1 -3
- scipy/odr/__odrpack.cpython-312-darwin.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-312-darwin.so +0 -0
- scipy/optimize/_bracket.py +17 -24
- scipy/optimize/_chandrupatla.py +9 -10
- scipy/optimize/_cobyla_py.py +104 -123
- scipy/optimize/_constraints.py +14 -10
- scipy/optimize/_differentiable_functions.py +371 -230
- scipy/optimize/_differentialevolution.py +4 -3
- scipy/optimize/_direct.cpython-312-darwin.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
- scipy/optimize/_lbfgsb.cpython-312-darwin.so +0 -0
- scipy/optimize/_lbfgsb_py.py +57 -16
- scipy/optimize/_linprog_doc.py +2 -2
- scipy/optimize/_linprog_highs.py +2 -2
- scipy/optimize/_linprog_ip.py +25 -10
- scipy/optimize/_linprog_util.py +14 -16
- scipy/optimize/_lsap.cpython-312-darwin.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-312-darwin.so +0 -0
- scipy/optimize/_lsq/least_squares.py +198 -126
- scipy/optimize/_lsq/lsq_linear.py +6 -6
- scipy/optimize/_lsq/trf.py +35 -8
- scipy/optimize/_milp.py +3 -1
- scipy/optimize/_minimize.py +105 -36
- scipy/optimize/_minpack.cpython-312-darwin.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-312-darwin.so +0 -0
- scipy/optimize/_nnls.py +20 -21
- scipy/optimize/_nonlin.py +34 -3
- scipy/optimize/_numdiff.py +288 -110
- scipy/optimize/_optimize.py +86 -48
- scipy/optimize/_pava_pybind.cpython-312-darwin.so +0 -0
- scipy/optimize/_remove_redundancy.py +5 -5
- scipy/optimize/_root_scalar.py +1 -1
- scipy/optimize/_shgo.py +6 -0
- scipy/optimize/_shgo_lib/_complex.py +1 -1
- scipy/optimize/_slsqp_py.py +216 -124
- scipy/optimize/_slsqplib.cpython-312-darwin.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-312-darwin.so +0 -0
- scipy/optimize/_trustregion.py +20 -6
- scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
- scipy/optimize/_trustregion_constr/projections.py +12 -8
- scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
- scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
- scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
- scipy/optimize/_trustregion_exact.py +0 -1
- scipy/optimize/_zeros.cpython-312-darwin.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-312-darwin.so +0 -0
- scipy/optimize/slsqp.py +0 -1
- scipy/optimize/tests/test__basinhopping.py +1 -1
- scipy/optimize/tests/test__differential_evolution.py +4 -4
- scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
- scipy/optimize/tests/test__numdiff.py +66 -22
- scipy/optimize/tests/test__remove_redundancy.py +2 -2
- scipy/optimize/tests/test__shgo.py +9 -1
- scipy/optimize/tests/test_bracket.py +36 -46
- scipy/optimize/tests/test_chandrupatla.py +133 -135
- scipy/optimize/tests/test_cobyla.py +74 -45
- scipy/optimize/tests/test_constraints.py +1 -1
- scipy/optimize/tests/test_differentiable_functions.py +226 -6
- scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
- scipy/optimize/tests/test_least_squares.py +125 -13
- scipy/optimize/tests/test_linear_assignment.py +3 -3
- scipy/optimize/tests/test_linprog.py +3 -3
- scipy/optimize/tests/test_lsq_linear.py +6 -6
- scipy/optimize/tests/test_minimize_constrained.py +2 -2
- scipy/optimize/tests/test_minpack.py +4 -4
- scipy/optimize/tests/test_nnls.py +43 -3
- scipy/optimize/tests/test_nonlin.py +36 -0
- scipy/optimize/tests/test_optimize.py +95 -17
- scipy/optimize/tests/test_slsqp.py +36 -4
- scipy/optimize/tests/test_zeros.py +34 -1
- scipy/signal/__init__.py +12 -23
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +459 -241
- scipy/signal/_fir_filter_design.py +262 -90
- scipy/signal/_lti_conversion.py +3 -2
- scipy/signal/_ltisys.py +118 -91
- scipy/signal/_max_len_seq_inner.cpython-312-darwin.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-312-darwin.so +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_short_time_fft.py +519 -70
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +719 -399
- scipy/signal/_sigtools.cpython-312-darwin.so +0 -0
- scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-312-darwin.so +0 -0
- scipy/signal/_spline_filters.py +108 -68
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +4 -1
- scipy/signal/_upfirdn_apply.cpython-312-darwin.so +0 -0
- scipy/signal/_waveforms.py +2 -11
- scipy/signal/_wavelets.py +1 -1
- scipy/signal/fir_filter_design.py +1 -0
- scipy/signal/spline.py +4 -11
- scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
- scipy/signal/tests/test_bsplines.py +114 -79
- scipy/signal/tests/test_cont2discrete.py +9 -2
- scipy/signal/tests/test_filter_design.py +721 -481
- scipy/signal/tests/test_fir_filter_design.py +332 -140
- scipy/signal/tests/test_savitzky_golay.py +4 -3
- scipy/signal/tests/test_short_time_fft.py +221 -3
- scipy/signal/tests/test_signaltools.py +2144 -1348
- scipy/signal/tests/test_spectral.py +50 -6
- scipy/signal/tests/test_splines.py +161 -96
- scipy/signal/tests/test_upfirdn.py +84 -50
- scipy/signal/tests/test_waveforms.py +20 -0
- scipy/signal/tests/test_windows.py +607 -466
- scipy/signal/windows/_windows.py +287 -148
- scipy/sparse/__init__.py +23 -4
- scipy/sparse/_base.py +270 -108
- scipy/sparse/_bsr.py +7 -4
- scipy/sparse/_compressed.py +59 -231
- scipy/sparse/_construct.py +90 -38
- scipy/sparse/_coo.py +115 -181
- scipy/sparse/_csc.py +4 -4
- scipy/sparse/_csparsetools.cpython-312-darwin.so +0 -0
- scipy/sparse/_csr.py +2 -2
- scipy/sparse/_data.py +48 -48
- scipy/sparse/_dia.py +105 -18
- scipy/sparse/_dok.py +0 -23
- scipy/sparse/_index.py +4 -4
- scipy/sparse/_matrix.py +23 -0
- scipy/sparse/_sparsetools.cpython-312-darwin.so +0 -0
- scipy/sparse/_sputils.py +37 -22
- scipy/sparse/base.py +0 -9
- scipy/sparse/bsr.py +0 -14
- scipy/sparse/compressed.py +0 -23
- scipy/sparse/construct.py +0 -6
- scipy/sparse/coo.py +0 -14
- scipy/sparse/csc.py +0 -3
- scipy/sparse/csgraph/_flow.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/tests/test_matching.py +14 -2
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
- scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
- scipy/sparse/csr.py +0 -5
- scipy/sparse/data.py +1 -6
- scipy/sparse/dia.py +0 -7
- scipy/sparse/dok.py +0 -10
- scipy/sparse/linalg/_dsolve/_superlu.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
- scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
- scipy/sparse/linalg/_interface.py +17 -18
- scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
- scipy/sparse/linalg/_isolve/iterative.py +51 -45
- scipy/sparse/linalg/_isolve/lgmres.py +6 -6
- scipy/sparse/linalg/_isolve/minres.py +5 -5
- scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
- scipy/sparse/linalg/_isolve/utils.py +2 -8
- scipy/sparse/linalg/_matfuncs.py +1 -1
- scipy/sparse/linalg/_norm.py +1 -1
- scipy/sparse/linalg/_propack/_cpropack.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
- scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
- scipy/sparse/tests/test_arithmetic1d.py +5 -2
- scipy/sparse/tests/test_base.py +214 -42
- scipy/sparse/tests/test_common1d.py +7 -7
- scipy/sparse/tests/test_construct.py +1 -1
- scipy/sparse/tests/test_coo.py +272 -4
- scipy/sparse/tests/test_sparsetools.py +5 -0
- scipy/sparse/tests/test_sputils.py +36 -7
- scipy/spatial/_ckdtree.cpython-312-darwin.so +0 -0
- scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
- scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
- scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
- scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
- scipy/spatial/_voronoi.cpython-312-darwin.so +0 -0
- scipy/spatial/distance.py +49 -42
- scipy/spatial/tests/test_distance.py +15 -1
- scipy/spatial/tests/test_kdtree.py +1 -0
- scipy/spatial/tests/test_qhull.py +7 -2
- scipy/spatial/transform/__init__.py +5 -3
- scipy/spatial/transform/_rigid_transform.cpython-312-darwin.so +0 -0
- scipy/spatial/transform/_rotation.cpython-312-darwin.so +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +1213 -832
- scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
- scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
- scipy/special/__init__.py +1 -47
- scipy/special/_add_newdocs.py +34 -772
- scipy/special/_basic.py +22 -25
- scipy/special/_comb.cpython-312-darwin.so +0 -0
- scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
- scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-312-darwin.so +0 -0
- scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-312-darwin.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-312-darwin.so +0 -0
- scipy/special/_ufuncs_cxx.pxd +2 -15
- scipy/special/_ufuncs_cxx.pyx +5 -44
- scipy/special/_ufuncs_cxx_defs.h +2 -16
- scipy/special/_ufuncs_defs.h +0 -8
- scipy/special/cython_special.cpython-312-darwin.so +0 -0
- scipy/special/cython_special.pxd +1 -1
- scipy/special/tests/_cython_examples/meson.build +10 -1
- scipy/special/tests/test_basic.py +153 -20
- scipy/special/tests/test_boost_ufuncs.py +3 -0
- scipy/special/tests/test_cdflib.py +35 -11
- scipy/special/tests/test_gammainc.py +16 -0
- scipy/special/tests/test_hyp2f1.py +2 -2
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_logsumexp.py +206 -64
- scipy/special/tests/test_mpmath.py +1 -0
- scipy/special/tests/test_nan_inputs.py +1 -1
- scipy/special/tests/test_orthogonal.py +17 -18
- scipy/special/tests/test_sf_error.py +3 -2
- scipy/special/tests/test_sph_harm.py +6 -7
- scipy/special/tests/test_support_alternative_backends.py +211 -76
- scipy/stats/__init__.py +4 -1
- scipy/stats/_ansari_swilk_statistics.cpython-312-darwin.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-312-darwin.so +0 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +277 -310
- scipy/stats/_correlation.py +1 -1
- scipy/stats/_covariance.py +6 -3
- scipy/stats/_discrete_distns.py +39 -32
- scipy/stats/_distn_infrastructure.py +39 -12
- scipy/stats/_distribution_infrastructure.py +900 -238
- scipy/stats/_entropy.py +9 -10
- scipy/{_lib → stats}/_finite_differences.py +1 -1
- scipy/stats/_hypotests.py +83 -50
- scipy/stats/_kde.py +53 -49
- scipy/stats/_ksstats.py +1 -1
- scipy/stats/_levy_stable/__init__.py +7 -15
- scipy/stats/_levy_stable/levyst.cpython-312-darwin.so +0 -0
- scipy/stats/_morestats.py +118 -73
- scipy/stats/_mstats_basic.py +13 -17
- scipy/stats/_mstats_extras.py +8 -8
- scipy/stats/_multivariate.py +89 -113
- scipy/stats/_new_distributions.py +97 -20
- scipy/stats/_page_trend_test.py +12 -5
- scipy/stats/_probability_distribution.py +265 -43
- scipy/stats/_qmc.py +14 -9
- scipy/stats/_qmc_cy.cpython-312-darwin.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-312-darwin.so +0 -0
- scipy/stats/_stats.cpython-312-darwin.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-312-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
- scipy/stats/_variation.py +6 -8
- scipy/stats/_wilcoxon.py +13 -7
- scipy/stats/tests/common_tests.py +6 -4
- scipy/stats/tests/test_axis_nan_policy.py +62 -24
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +379 -60
- scipy/stats/tests/test_continuous_basic.py +18 -12
- scipy/stats/tests/test_discrete_basic.py +14 -8
- scipy/stats/tests/test_discrete_distns.py +16 -16
- scipy/stats/tests/test_distributions.py +95 -75
- scipy/stats/tests/test_entropy.py +40 -48
- scipy/stats/tests/test_fit.py +4 -3
- scipy/stats/tests/test_hypotests.py +153 -24
- scipy/stats/tests/test_kdeoth.py +109 -41
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_morestats.py +79 -47
- scipy/stats/tests/test_mstats_basic.py +3 -3
- scipy/stats/tests/test_multivariate.py +434 -83
- scipy/stats/tests/test_qmc.py +13 -10
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +119 -112
- scipy/stats/tests/test_resampling.py +47 -56
- scipy/stats/tests/test_sampling.py +9 -4
- scipy/stats/tests/test_stats.py +799 -939
- scipy/stats/tests/test_variation.py +8 -6
- scipy/version.py +2 -2
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +561 -568
- scipy-1.16.0rc2.dist-info/WHEEL +6 -0
- scipy/_lib/array_api_extra/_funcs.py +0 -484
- scipy/_lib/array_api_extra/_typing.py +0 -8
- scipy/interpolate/_bspl.cpython-312-darwin.so +0 -0
- scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
- scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
- scipy/optimize/_slsqp.cpython-312-darwin.so +0 -0
- scipy/spatial/qhull_src/COPYING.txt +0 -38
- scipy/special/libsf_error_state.dylib +0 -0
- scipy/special/tests/test_log_softmax.py +0 -109
- scipy/special/tests/test_xsf_cuda.py +0 -114
- scipy/special/xsf/binom.h +0 -89
- scipy/special/xsf/cdflib.h +0 -100
- scipy/special/xsf/cephes/airy.h +0 -307
- scipy/special/xsf/cephes/besselpoly.h +0 -51
- scipy/special/xsf/cephes/beta.h +0 -257
- scipy/special/xsf/cephes/cbrt.h +0 -131
- scipy/special/xsf/cephes/chbevl.h +0 -85
- scipy/special/xsf/cephes/chdtr.h +0 -193
- scipy/special/xsf/cephes/const.h +0 -87
- scipy/special/xsf/cephes/ellie.h +0 -293
- scipy/special/xsf/cephes/ellik.h +0 -251
- scipy/special/xsf/cephes/ellpe.h +0 -107
- scipy/special/xsf/cephes/ellpk.h +0 -117
- scipy/special/xsf/cephes/expn.h +0 -260
- scipy/special/xsf/cephes/gamma.h +0 -398
- scipy/special/xsf/cephes/hyp2f1.h +0 -596
- scipy/special/xsf/cephes/hyperg.h +0 -361
- scipy/special/xsf/cephes/i0.h +0 -149
- scipy/special/xsf/cephes/i1.h +0 -158
- scipy/special/xsf/cephes/igam.h +0 -421
- scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
- scipy/special/xsf/cephes/igami.h +0 -313
- scipy/special/xsf/cephes/j0.h +0 -225
- scipy/special/xsf/cephes/j1.h +0 -198
- scipy/special/xsf/cephes/jv.h +0 -715
- scipy/special/xsf/cephes/k0.h +0 -164
- scipy/special/xsf/cephes/k1.h +0 -163
- scipy/special/xsf/cephes/kn.h +0 -243
- scipy/special/xsf/cephes/lanczos.h +0 -112
- scipy/special/xsf/cephes/ndtr.h +0 -275
- scipy/special/xsf/cephes/poch.h +0 -85
- scipy/special/xsf/cephes/polevl.h +0 -167
- scipy/special/xsf/cephes/psi.h +0 -194
- scipy/special/xsf/cephes/rgamma.h +0 -111
- scipy/special/xsf/cephes/scipy_iv.h +0 -811
- scipy/special/xsf/cephes/shichi.h +0 -248
- scipy/special/xsf/cephes/sici.h +0 -224
- scipy/special/xsf/cephes/sindg.h +0 -221
- scipy/special/xsf/cephes/tandg.h +0 -139
- scipy/special/xsf/cephes/trig.h +0 -58
- scipy/special/xsf/cephes/unity.h +0 -186
- scipy/special/xsf/cephes/zeta.h +0 -172
- scipy/special/xsf/config.h +0 -304
- scipy/special/xsf/digamma.h +0 -205
- scipy/special/xsf/error.h +0 -57
- scipy/special/xsf/evalpoly.h +0 -47
- scipy/special/xsf/expint.h +0 -266
- scipy/special/xsf/hyp2f1.h +0 -694
- scipy/special/xsf/iv_ratio.h +0 -173
- scipy/special/xsf/lambertw.h +0 -150
- scipy/special/xsf/loggamma.h +0 -163
- scipy/special/xsf/sici.h +0 -200
- scipy/special/xsf/tools.h +0 -427
- scipy/special/xsf/trig.h +0 -164
- scipy/special/xsf/wright_bessel.h +0 -843
- scipy/special/xsf/zlog1.h +0 -35
- scipy/stats/_mvn.cpython-312-darwin.so +0 -0
- scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -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
|
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
|
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
|
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
|
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
|
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
|
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(
|
983
|
-
|
984
|
-
|
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(
|
1030
|
-
|
1031
|
-
|
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
|
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'
|
1438
|
+
if ``mode == 'normal'``: ``w'[i] = 1 / (w[i] - sigma)``.
|
1433
1439
|
|
1434
|
-
if mode == 'cayley'
|
1440
|
+
if ``mode == 'cayley'``: ``w'[i] = (w[i] + sigma) / (w[i] - sigma)``.
|
1435
1441
|
|
1436
|
-
if mode == 'buckling'
|
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
|
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 =
|
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
|
511
|
-
aux += "block size
|
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 += "
|
516
|
+
aux += f"{sizeY} constraints\n\n"
|
517
517
|
else:
|
518
|
-
aux += "
|
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
|
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
|
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
|
89
|
+
Returns ``A^H @ v``, where ``A^H`` is the conjugate transpose of ``A``.
|
90
90
|
matmat : callable f(V)
|
91
|
-
Returns A @ V
|
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
|
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
|
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
|
118
|
-
Python
|
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
|
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
|
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 '
|
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
|
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
|
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 (
|
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
|
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
|
-
"""
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
-
"""
|
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
|
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
|
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
|
260
|
+
return x, 0
|
259
261
|
|
260
262
|
rho = dotprod(rtilde, r)
|
261
263
|
if np.abs(rho) < rhotol: # rho breakdown
|
262
|
-
return
|
264
|
+
return x, -10
|
263
265
|
|
264
266
|
if iteration > 0:
|
265
267
|
if np.abs(omega) < omegatol: # omega breakdown
|
266
|
-
return
|
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
|
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
|
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
|
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
|
-
"""
|
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
|
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
|
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
|
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
|
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
|
-
"""
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
-
|
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
|
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
|
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
|
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
|
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
|
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
|
-
"""
|
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
|
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
|
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
|
973
|
+
return x, 0
|
968
974
|
if np.abs(rho) < rhotol: # rho breakdown
|
969
|
-
return
|
975
|
+
return x, -10
|
970
976
|
if np.abs(xi) < xitol: # xi breakdown
|
971
|
-
return
|
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
|
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
|
1005
|
+
return x, -14
|
1000
1006
|
|
1001
1007
|
beta = epsilon / delta
|
1002
1008
|
if np.abs(beta) < betatol: # beta breakdown
|
1003
|
-
return
|
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
|
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
|
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
|
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
|
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 (
|
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
|
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
|
228
|
+
return x, maxiter
|
229
229
|
|
230
|
-
return
|
230
|
+
return x, 0
|