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