scipy 1.15.3__cp313-cp313-win_amd64.whl → 1.16.0rc2__cp313-cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/_cyutility.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/_lib/_ccallback_c.cp313-win_amd64.pyd +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_fpumode.cp313-win_amd64.dll.a +0 -0
- scipy/_lib/_fpumode.cp313-win_amd64.pyd +0 -0
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_ccallback.cp313-win_amd64.dll.a +0 -0
- scipy/_lib/_test_ccallback.cp313-win_amd64.pyd +0 -0
- scipy/_lib/_test_deprecation_call.cp313-win_amd64.dll.a +0 -0
- scipy/_lib/_test_deprecation_call.cp313-win_amd64.pyd +0 -0
- scipy/_lib/_test_deprecation_def.cp313-win_amd64.dll.a +0 -0
- scipy/_lib/_test_deprecation_def.cp313-win_amd64.pyd +0 -0
- scipy/_lib/_testutils.py +6 -2
- scipy/_lib/_uarray/_uarray.cp313-win_amd64.dll.a +0 -0
- scipy/_lib/_uarray/_uarray.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/_lib/messagestream.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/cluster/_hierarchy.cp313-win_amd64.pyd +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp313-win_amd64.dll.a +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp313-win_amd64.pyd +0 -0
- scipy/cluster/_vq.cp313-win_amd64.dll.a +0 -0
- scipy/cluster/_vq.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/fft/_pocketfft/pypocketfft.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/fftpack/convolve.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/integrate/_dop.cp313-win_amd64.pyd +0 -0
- scipy/integrate/_lsoda.cp313-win_amd64.dll.a +0 -0
- scipy/integrate/_lsoda.cp313-win_amd64.pyd +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cp313-win_amd64.dll.a +0 -0
- scipy/integrate/_odepack.cp313-win_amd64.pyd +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cp313-win_amd64.dll.a +0 -0
- scipy/integrate/_quadpack.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/integrate/_test_multivariate.cp313-win_amd64.pyd +0 -0
- scipy/integrate/_test_odeint_banded.cp313-win_amd64.dll.a +0 -0
- scipy/integrate/_test_odeint_banded.cp313-win_amd64.pyd +0 -0
- scipy/integrate/_vode.cp313-win_amd64.dll.a +0 -0
- scipy/integrate/_vode.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/interpolate/_dfitpack.cp313-win_amd64.pyd +0 -0
- scipy/interpolate/_dierckx.cp313-win_amd64.dll.a +0 -0
- scipy/interpolate/_dierckx.cp313-win_amd64.pyd +0 -0
- scipy/interpolate/_fitpack.cp313-win_amd64.dll.a +0 -0
- scipy/interpolate/_fitpack.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/interpolate/_interpnd.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/interpolate/_ppoly.cp313-win_amd64.pyd +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cp313-win_amd64.dll.a +0 -0
- scipy/interpolate/_rbfinterp_pythran.cp313-win_amd64.pyd +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cp313-win_amd64.dll.a +0 -0
- scipy/interpolate/_rgi_cython.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/io/_test_fortran.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/io/matlab/_mio5_utils.cp313-win_amd64.pyd +0 -0
- scipy/io/matlab/_mio_utils.cp313-win_amd64.dll.a +0 -0
- scipy/io/matlab/_mio_utils.cp313-win_amd64.pyd +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cp313-win_amd64.dll.a +0 -0
- scipy/io/matlab/_streams.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/linalg/_cythonized_array_utils.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_interpolative.cp313-win_amd64.pyd +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cp313-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_lu_cython.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_update.cp313-win_amd64.pyd +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cp313-win_amd64.dll.a +0 -0
- scipy/linalg/_fblas.cp313-win_amd64.pyd +0 -0
- scipy/linalg/_flapack.cp313-win_amd64.dll.a +0 -0
- scipy/linalg/_flapack.cp313-win_amd64.pyd +0 -0
- scipy/linalg/_linalg_pythran.cp313-win_amd64.dll.a +0 -0
- scipy/linalg/_linalg_pythran.cp313-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cp313-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_expm.cp313-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_amd64.pyd +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cp313-win_amd64.dll.a +0 -0
- scipy/linalg/_solve_toeplitz.cp313-win_amd64.pyd +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cp313-win_amd64.dll.a +0 -0
- scipy/linalg/cython_blas.cp313-win_amd64.pyd +0 -0
- scipy/linalg/cython_lapack.cp313-win_amd64.dll.a +0 -0
- scipy/linalg/cython_lapack.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/ndimage/_ctest.cp313-win_amd64.pyd +0 -0
- scipy/ndimage/_cytest.cp313-win_amd64.dll.a +0 -0
- scipy/ndimage/_cytest.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/ndimage/_nd_image.cp313-win_amd64.pyd +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cp313-win_amd64.dll.a +0 -0
- scipy/ndimage/_ni_label.cp313-win_amd64.pyd +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cp313-win_amd64.dll.a +0 -0
- scipy/ndimage/_rank_filter_1d.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/odr/__odrpack.cp313-win_amd64.pyd +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_bglu_dense.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_direct.cp313-win_amd64.pyd +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_group_columns.cp313-win_amd64.pyd +0 -0
- scipy/optimize/_highspy/_core.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_highspy/_core.cp313-win_amd64.pyd +0 -0
- scipy/optimize/_highspy/_highs_options.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_highspy/_highs_options.cp313-win_amd64.pyd +0 -0
- scipy/optimize/_lbfgsb.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_lbfgsb.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_lsap.cp313-win_amd64.pyd +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_lsq/givens_elimination.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_minpack.cp313-win_amd64.pyd +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_moduleTNC.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_pava_pybind.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_slsqplib.cp313-win_amd64.pyd +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_trlib/_trlib.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_zeros.cp313-win_amd64.pyd +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/cython_optimize/_zeros.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/signal/_max_len_seq_inner.cp313-win_amd64.pyd +0 -0
- scipy/signal/_peak_finding_utils.cp313-win_amd64.dll.a +0 -0
- scipy/signal/_peak_finding_utils.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/signal/_sigtools.cp313-win_amd64.pyd +0 -0
- scipy/signal/_sosfilt.cp313-win_amd64.dll.a +0 -0
- scipy/signal/_sosfilt.cp313-win_amd64.pyd +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cp313-win_amd64.dll.a +0 -0
- scipy/signal/_spline.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/signal/_upfirdn_apply.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/_csparsetools.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/_sparsetools.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_flow.cp313-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_matching.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_matching.cp313-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp313-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_reordering.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_reordering.cp313-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_shortest_path.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_shortest_path.cp313-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_tools.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_tools.cp313-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_traversal.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_traversal.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_dsolve/_superlu.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_cpropack.cp313-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp313-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp313-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp313-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/spatial/_ckdtree.cp313-win_amd64.pyd +0 -0
- scipy/spatial/_distance_pybind.cp313-win_amd64.dll.a +0 -0
- scipy/spatial/_distance_pybind.cp313-win_amd64.pyd +0 -0
- scipy/spatial/_distance_wrap.cp313-win_amd64.dll.a +0 -0
- scipy/spatial/_distance_wrap.cp313-win_amd64.pyd +0 -0
- scipy/spatial/_hausdorff.cp313-win_amd64.dll.a +0 -0
- scipy/spatial/_hausdorff.cp313-win_amd64.pyd +0 -0
- scipy/spatial/_qhull.cp313-win_amd64.dll.a +0 -0
- scipy/spatial/_qhull.cp313-win_amd64.pyd +0 -0
- scipy/spatial/_voronoi.cp313-win_amd64.dll.a +0 -0
- scipy/spatial/_voronoi.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/spatial/transform/_rigid_transform.cp313-win_amd64.pyd +0 -0
- scipy/spatial/transform/_rotation.cp313-win_amd64.dll.a +0 -0
- scipy/spatial/transform/_rotation.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/special/_comb.cp313-win_amd64.pyd +0 -0
- scipy/special/_ellip_harm_2.cp313-win_amd64.dll.a +0 -0
- scipy/special/_ellip_harm_2.cp313-win_amd64.pyd +0 -0
- scipy/special/_gufuncs.cp313-win_amd64.dll.a +0 -0
- scipy/special/_gufuncs.cp313-win_amd64.pyd +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cp313-win_amd64.dll.a +0 -0
- scipy/special/_specfun.cp313-win_amd64.pyd +0 -0
- scipy/special/_special_ufuncs.cp313-win_amd64.dll.a +0 -0
- scipy/special/_special_ufuncs.cp313-win_amd64.pyd +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cp313-win_amd64.dll.a +0 -0
- scipy/special/_test_internal.cp313-win_amd64.pyd +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cp313-win_amd64.dll.a +0 -0
- scipy/special/_ufuncs.cp313-win_amd64.pyd +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cp313-win_amd64.dll.a +0 -0
- scipy/special/_ufuncs_cxx.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/special/cython_special.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/stats/_ansari_swilk_statistics.cp313-win_amd64.pyd +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cp313-win_amd64.dll.a +0 -0
- scipy/stats/_biasedurn.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/stats/_levy_stable/levyst.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/stats/_qmc_cy.cp313-win_amd64.pyd +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cp313-win_amd64.dll.a +0 -0
- scipy/stats/_qmvnt_cy.cp313-win_amd64.pyd +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cp313-win_amd64.dll.a +0 -0
- scipy/stats/_rcont/rcont.cp313-win_amd64.pyd +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cp313-win_amd64.dll.a +0 -0
- scipy/stats/_sobol.cp313-win_amd64.pyd +0 -0
- scipy/stats/_stats.cp313-win_amd64.dll.a +0 -0
- scipy/stats/_stats.cp313-win_amd64.pyd +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cp313-win_amd64.dll.a +0 -0
- scipy/stats/_stats_pythran.cp313-win_amd64.pyd +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp313-win_amd64.dll.a +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/interpolate/_bspl.cp313-win_amd64.pyd +0 -0
- scipy/optimize/_cobyla.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_cobyla.cp313-win_amd64.pyd +0 -0
- scipy/optimize/_cython_nnls.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_cython_nnls.cp313-win_amd64.pyd +0 -0
- scipy/optimize/_slsqp.cp313-win_amd64.dll.a +0 -0
- scipy/optimize/_slsqp.cp313-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.cp313-win_amd64.dll.a +0 -0
- scipy/stats/_mvn.cp313-win_amd64.pyd +0 -0
- scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
- /scipy-1.15.3-cp313-cp313-win_amd64.whl → /scipy-1.16.0rc2-cp313-cp313-win_amd64.whl +0 -0
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
scipy/linalg/_matfuncs.py
CHANGED
@@ -8,14 +8,17 @@ import numpy as np
|
|
8
8
|
from numpy import (dot, diag, prod, logical_not, ravel, transpose,
|
9
9
|
conjugate, absolute, amax, sign, isfinite, triu)
|
10
10
|
|
11
|
+
from scipy._lib._util import _apply_over_batch
|
12
|
+
from scipy._lib.deprecation import _NoValue
|
13
|
+
|
11
14
|
# Local imports
|
12
|
-
from scipy.linalg import LinAlgError, bandwidth
|
15
|
+
from scipy.linalg import LinAlgError, bandwidth, LinAlgWarning
|
13
16
|
from ._misc import norm
|
14
17
|
from ._basic import solve, inv
|
15
18
|
from ._decomp_svd import svd
|
16
19
|
from ._decomp_schur import schur, rsf2csf
|
17
20
|
from ._expm_frechet import expm_frechet, expm_cond
|
18
|
-
from .
|
21
|
+
from ._matfuncs_schur_sqrtm import recursive_schur_sqrtm
|
19
22
|
from ._matfuncs_expm import pick_pade_structure, pade_UV_calc
|
20
23
|
from ._linalg_pythran import _funm_loops # type: ignore[import-not-found]
|
21
24
|
|
@@ -95,6 +98,7 @@ def _maybe_real(A, B, tol=None):
|
|
95
98
|
# Matrix functions.
|
96
99
|
|
97
100
|
|
101
|
+
@_apply_over_batch(('A', 2))
|
98
102
|
def fractional_matrix_power(A, t):
|
99
103
|
"""
|
100
104
|
Compute the fractional power of a matrix.
|
@@ -141,7 +145,8 @@ def fractional_matrix_power(A, t):
|
|
141
145
|
return scipy.linalg._matfuncs_inv_ssq._fractional_matrix_power(A, t)
|
142
146
|
|
143
147
|
|
144
|
-
|
148
|
+
@_apply_over_batch(('A', 2))
|
149
|
+
def logm(A, disp=_NoValue):
|
145
150
|
"""
|
146
151
|
Compute matrix logarithm.
|
147
152
|
|
@@ -156,6 +161,11 @@ def logm(A, disp=True):
|
|
156
161
|
Emit warning if error in the result is estimated large
|
157
162
|
instead of returning estimated error. (Default: True)
|
158
163
|
|
164
|
+
.. deprecated:: 1.16.0
|
165
|
+
The `disp` argument is deprecated and will be
|
166
|
+
removed in SciPy 1.18.0. The previously returned error estimate
|
167
|
+
can be computed as ``norm(expm(logm(A)) - A, 1) / norm(A, 1)``.
|
168
|
+
|
159
169
|
Returns
|
160
170
|
-------
|
161
171
|
logm : (N, N) ndarray
|
@@ -196,6 +206,12 @@ def logm(A, disp=True):
|
|
196
206
|
[ 1., 4.]])
|
197
207
|
|
198
208
|
"""
|
209
|
+
if disp is _NoValue:
|
210
|
+
disp = True
|
211
|
+
else:
|
212
|
+
warnings.warn("The `disp` argument is deprecated "
|
213
|
+
"and will be removed in SciPy 1.18.0.",
|
214
|
+
DeprecationWarning, stacklevel=2)
|
199
215
|
A = np.asarray(A) # squareness checked in `_logm`
|
200
216
|
# Avoid circular import ... this is OK, right?
|
201
217
|
import scipy.linalg._matfuncs_inv_ssq
|
@@ -391,6 +407,153 @@ def _exp_sinch(x):
|
|
391
407
|
return lexp_diff
|
392
408
|
|
393
409
|
|
410
|
+
def sqrtm(A, disp=_NoValue, blocksize=_NoValue):
|
411
|
+
"""
|
412
|
+
Compute, if exists, the matrix square root.
|
413
|
+
|
414
|
+
The matrix square root of ``A`` is a matrix ``X`` such that ``X @ X = A``.
|
415
|
+
Every square matrix is not guaranteed to have a matrix square root, for
|
416
|
+
example, the array ``[[0, 1], [0, 0]]`` does not have a square root.
|
417
|
+
|
418
|
+
Moreover, not every real matrix has a real square root. Hence, for
|
419
|
+
real-valued matrices the return type can be complex if, numerically, there
|
420
|
+
is an eigenvalue on the negative real axis.
|
421
|
+
|
422
|
+
Parameters
|
423
|
+
----------
|
424
|
+
A : ndarray
|
425
|
+
Input with last two dimensions are square ``(..., n, n)``.
|
426
|
+
disp : bool, optional
|
427
|
+
Print warning if error in the result is estimated large
|
428
|
+
instead of returning estimated error. (Default: True)
|
429
|
+
|
430
|
+
.. deprecated:: 1.16.0
|
431
|
+
The `disp` argument is deprecated and will be
|
432
|
+
removed in SciPy 1.18.0. The previously returned error estimate
|
433
|
+
can be computed as ``norm(X @ X - A, 'fro')**2 / norm(A, 'fro')``
|
434
|
+
|
435
|
+
blocksize : integer, optional
|
436
|
+
|
437
|
+
.. deprecated:: 1.16.0
|
438
|
+
The `blocksize` argument is deprecated as it is unused by the algorithm
|
439
|
+
and will be removed in SciPy 1.18.0.
|
440
|
+
|
441
|
+
Returns
|
442
|
+
-------
|
443
|
+
sqrtm : ndarray
|
444
|
+
Computed matrix squareroot of `A` with same size ``(..., n, n)``.
|
445
|
+
|
446
|
+
errest : float
|
447
|
+
Frobenius norm of the estimated error, ||err||_F / ||A||_F. Only
|
448
|
+
returned, if ``disp`` is set to ``False``. This return argument will be
|
449
|
+
removed in version 1.20.0 and only the sqrtm result will be returned.
|
450
|
+
|
451
|
+
.. deprecated:: 1.16.0
|
452
|
+
|
453
|
+
Notes
|
454
|
+
-----
|
455
|
+
This function uses the Schur decomposition method to compute the matrix
|
456
|
+
square root following [1]_ and for real matrices [2]_. Moreover, note
|
457
|
+
that, there exist matrices that have square roots that are not polynomials
|
458
|
+
in ``A``. For a classical example from [2]_, the matrix satisfies::
|
459
|
+
|
460
|
+
[ a, a**2 + 1]**2 [-1, 0]
|
461
|
+
[-1, -a] = [ 0, -1]
|
462
|
+
|
463
|
+
for any scalar ``a`` but it is not a polynomial in ``-I``. Thus, they will
|
464
|
+
not be found by this function.
|
465
|
+
|
466
|
+
References
|
467
|
+
----------
|
468
|
+
.. [1] Edvin Deadman, Nicholas J. Higham, Rui Ralha (2013)
|
469
|
+
"Blocked Schur Algorithms for Computing the Matrix Square Root,
|
470
|
+
Lecture Notes in Computer Science, 7782. pp. 171-182.
|
471
|
+
:doi:`10.1016/0024-3795(87)90118-2`
|
472
|
+
.. [2] Nicholas J. Higham (1987) "Computing real square roots of a real
|
473
|
+
matrix", Linear Algebra and its Applications, 88/89:405-430.
|
474
|
+
:doi:`10.1016/0024-3795(87)90118-2`
|
475
|
+
|
476
|
+
Examples
|
477
|
+
--------
|
478
|
+
>>> import numpy as np
|
479
|
+
>>> from scipy.linalg import sqrtm
|
480
|
+
>>> a = np.array([[1.0, 3.0], [1.0, 4.0]])
|
481
|
+
>>> r = sqrtm(a)
|
482
|
+
>>> r
|
483
|
+
array([[ 0.75592895, 1.13389342],
|
484
|
+
[ 0.37796447, 1.88982237]])
|
485
|
+
>>> r.dot(r)
|
486
|
+
array([[ 1., 3.],
|
487
|
+
[ 1., 4.]])
|
488
|
+
|
489
|
+
"""
|
490
|
+
if disp is _NoValue:
|
491
|
+
disp = True
|
492
|
+
else:
|
493
|
+
warnings.warn("The `disp` argument is deprecated and will be removed in SciPy "
|
494
|
+
"1.18.0.",
|
495
|
+
DeprecationWarning, stacklevel=2)
|
496
|
+
if blocksize is not _NoValue:
|
497
|
+
warnings.warn("The `blocksize` argument is deprecated and will be removed in "
|
498
|
+
"SciPy 1.18.0.",
|
499
|
+
DeprecationWarning, stacklevel=2)
|
500
|
+
|
501
|
+
a = np.asarray(A)
|
502
|
+
if a.size == 1 and a.ndim < 2:
|
503
|
+
return np.array([[np.exp(a.item())]])
|
504
|
+
|
505
|
+
if a.ndim < 2:
|
506
|
+
raise LinAlgError('The input array must be at least two-dimensional')
|
507
|
+
if a.shape[-1] != a.shape[-2]:
|
508
|
+
raise LinAlgError('Last 2 dimensions of the array must be square')
|
509
|
+
|
510
|
+
# Empty array
|
511
|
+
if min(*a.shape) == 0:
|
512
|
+
dtype = sqrtm(np.eye(2, dtype=a.dtype)).dtype
|
513
|
+
return np.empty_like(a, dtype=dtype)
|
514
|
+
|
515
|
+
# Scalar case
|
516
|
+
if a.shape[-2:] == (1, 1):
|
517
|
+
return np.emath.sqrt(a)
|
518
|
+
|
519
|
+
if not np.issubdtype(a.dtype, np.inexact):
|
520
|
+
a = a.astype(np.float64)
|
521
|
+
elif a.dtype == np.float16:
|
522
|
+
a = a.astype(np.float32)
|
523
|
+
elif a.dtype.char in 'G':
|
524
|
+
a = a.astype(np.complex128)
|
525
|
+
elif a.dtype.char in 'g':
|
526
|
+
a = a.astype(np.float64)
|
527
|
+
|
528
|
+
if a.dtype.char not in 'fdFD':
|
529
|
+
raise TypeError("scipy.linalg.sqrtm is not supported for the data type"
|
530
|
+
f" {a.dtype}")
|
531
|
+
|
532
|
+
res, isIllconditioned, isSingular, info = recursive_schur_sqrtm(a)
|
533
|
+
if info < 0:
|
534
|
+
raise LinAlgError(f"Internal error in scipy.linalg.sqrtm: {info}")
|
535
|
+
|
536
|
+
if isSingular or isIllconditioned:
|
537
|
+
if isSingular:
|
538
|
+
msg = ("Matrix is singular. The result might be inaccurate or the"
|
539
|
+
" array might not have a square root.")
|
540
|
+
else:
|
541
|
+
msg = ("Matrix is ill-conditioned. The result might be inaccurate"
|
542
|
+
" or the array might not have a square root.")
|
543
|
+
warnings.warn(msg, LinAlgWarning, stacklevel=2)
|
544
|
+
|
545
|
+
if disp is False:
|
546
|
+
try:
|
547
|
+
arg2 = norm(res @ res - A, 'fro')**2 / norm(A, 'fro')
|
548
|
+
except ValueError:
|
549
|
+
# NaNs in matrix
|
550
|
+
arg2 = np.inf
|
551
|
+
return res, arg2
|
552
|
+
else:
|
553
|
+
return res
|
554
|
+
|
555
|
+
|
556
|
+
@_apply_over_batch(('A', 2))
|
394
557
|
def cosm(A):
|
395
558
|
"""
|
396
559
|
Compute the matrix cosine.
|
@@ -431,6 +594,7 @@ def cosm(A):
|
|
431
594
|
return expm(1j*A).real
|
432
595
|
|
433
596
|
|
597
|
+
@_apply_over_batch(('A', 2))
|
434
598
|
def sinm(A):
|
435
599
|
"""
|
436
600
|
Compute the matrix sine.
|
@@ -471,6 +635,7 @@ def sinm(A):
|
|
471
635
|
return expm(1j*A).imag
|
472
636
|
|
473
637
|
|
638
|
+
@_apply_over_batch(('A', 2))
|
474
639
|
def tanm(A):
|
475
640
|
"""
|
476
641
|
Compute the matrix tangent.
|
@@ -510,6 +675,7 @@ def tanm(A):
|
|
510
675
|
return _maybe_real(A, solve(cosm(A), sinm(A)))
|
511
676
|
|
512
677
|
|
678
|
+
@_apply_over_batch(('A', 2))
|
513
679
|
def coshm(A):
|
514
680
|
"""
|
515
681
|
Compute the hyperbolic matrix cosine.
|
@@ -549,6 +715,7 @@ def coshm(A):
|
|
549
715
|
return _maybe_real(A, 0.5 * (expm(A) + expm(-A)))
|
550
716
|
|
551
717
|
|
718
|
+
@_apply_over_batch(('A', 2))
|
552
719
|
def sinhm(A):
|
553
720
|
"""
|
554
721
|
Compute the hyperbolic matrix sine.
|
@@ -588,6 +755,7 @@ def sinhm(A):
|
|
588
755
|
return _maybe_real(A, 0.5 * (expm(A) - expm(-A)))
|
589
756
|
|
590
757
|
|
758
|
+
@_apply_over_batch(('A', 2))
|
591
759
|
def tanhm(A):
|
592
760
|
"""
|
593
761
|
Compute the hyperbolic matrix tangent.
|
@@ -627,6 +795,7 @@ def tanhm(A):
|
|
627
795
|
return _maybe_real(A, solve(coshm(A), sinhm(A)))
|
628
796
|
|
629
797
|
|
798
|
+
@_apply_over_batch(('A', 2))
|
630
799
|
def funm(A, func, disp=True):
|
631
800
|
"""
|
632
801
|
Evaluate a matrix function specified by a callable.
|
@@ -721,7 +890,8 @@ def funm(A, func, disp=True):
|
|
721
890
|
return F, err
|
722
891
|
|
723
892
|
|
724
|
-
|
893
|
+
@_apply_over_batch(('A', 2))
|
894
|
+
def signm(A, disp=_NoValue):
|
725
895
|
"""
|
726
896
|
Matrix sign function.
|
727
897
|
|
@@ -735,6 +905,11 @@ def signm(A, disp=True):
|
|
735
905
|
Print warning if error in the result is estimated large
|
736
906
|
instead of returning estimated error. (Default: True)
|
737
907
|
|
908
|
+
.. deprecated:: 1.16.0
|
909
|
+
The `disp` argument is deprecated and will be
|
910
|
+
removed in SciPy 1.18.0. The previously returned error estimate
|
911
|
+
can be computed as ``norm(signm @ signm - signm, 1)``.
|
912
|
+
|
738
913
|
Returns
|
739
914
|
-------
|
740
915
|
signm : (N, N) ndarray
|
@@ -754,6 +929,13 @@ def signm(A, disp=True):
|
|
754
929
|
array([-1.+0.j, 1.+0.j, 1.+0.j])
|
755
930
|
|
756
931
|
"""
|
932
|
+
if disp is _NoValue:
|
933
|
+
disp = True
|
934
|
+
else:
|
935
|
+
warnings.warn("The `disp` argument is deprecated "
|
936
|
+
"and will be removed in SciPy 1.18.0.",
|
937
|
+
DeprecationWarning, stacklevel=2)
|
938
|
+
|
757
939
|
A = _asarray_square(A)
|
758
940
|
|
759
941
|
def rounded_sign(x):
|
@@ -801,6 +983,7 @@ def signm(A, disp=True):
|
|
801
983
|
return S0, errest
|
802
984
|
|
803
985
|
|
986
|
+
@_apply_over_batch(('a', 2), ('b', 2))
|
804
987
|
def khatri_rao(a, b):
|
805
988
|
r"""
|
806
989
|
Khatri-rao product
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
scipy/linalg/_matfuncs_sqrtm.py
CHANGED
@@ -4,24 +4,16 @@ Matrix square root for general matrices and for upper triangular matrices.
|
|
4
4
|
This module exists to avoid cyclic imports.
|
5
5
|
|
6
6
|
"""
|
7
|
-
__all__ = [
|
7
|
+
__all__ = []
|
8
8
|
|
9
9
|
import numpy as np
|
10
10
|
|
11
|
-
from scipy._lib._util import _asarray_validated
|
12
|
-
|
13
11
|
# Local imports
|
14
|
-
from ._misc import norm
|
15
12
|
from .lapack import ztrsyl, dtrsyl
|
16
|
-
from ._decomp_schur import schur, rsf2csf
|
17
|
-
from ._basic import _ensure_dtype_cdsz
|
18
|
-
|
19
|
-
|
20
13
|
|
21
14
|
class SqrtmError(np.linalg.LinAlgError):
|
22
15
|
pass
|
23
16
|
|
24
|
-
|
25
17
|
from ._matfuncs_sqrtm_triu import within_block_loop # noqa: E402
|
26
18
|
|
27
19
|
|
@@ -113,93 +105,3 @@ def _sqrtm_triu(T, blocksize=64):
|
|
113
105
|
|
114
106
|
# Return the matrix square root.
|
115
107
|
return R
|
116
|
-
|
117
|
-
|
118
|
-
def sqrtm(A, disp=True, blocksize=64):
|
119
|
-
"""
|
120
|
-
Matrix square root.
|
121
|
-
|
122
|
-
Parameters
|
123
|
-
----------
|
124
|
-
A : (N, N) array_like
|
125
|
-
Matrix whose square root to evaluate
|
126
|
-
disp : bool, optional
|
127
|
-
Print warning if error in the result is estimated large
|
128
|
-
instead of returning estimated error. (Default: True)
|
129
|
-
blocksize : integer, optional
|
130
|
-
If the blocksize is not degenerate with respect to the
|
131
|
-
size of the input array, then use a blocked algorithm. (Default: 64)
|
132
|
-
|
133
|
-
Returns
|
134
|
-
-------
|
135
|
-
sqrtm : (N, N) ndarray
|
136
|
-
Value of the sqrt function at `A`. The dtype is float or complex.
|
137
|
-
The precision (data size) is determined based on the precision of
|
138
|
-
input `A`.
|
139
|
-
|
140
|
-
errest : float
|
141
|
-
(if disp == False)
|
142
|
-
|
143
|
-
Frobenius norm of the estimated error, ||err||_F / ||A||_F
|
144
|
-
|
145
|
-
References
|
146
|
-
----------
|
147
|
-
.. [1] Edvin Deadman, Nicholas J. Higham, Rui Ralha (2013)
|
148
|
-
"Blocked Schur Algorithms for Computing the Matrix Square Root,
|
149
|
-
Lecture Notes in Computer Science, 7782. pp. 171-182.
|
150
|
-
|
151
|
-
Examples
|
152
|
-
--------
|
153
|
-
>>> import numpy as np
|
154
|
-
>>> from scipy.linalg import sqrtm
|
155
|
-
>>> a = np.array([[1.0, 3.0], [1.0, 4.0]])
|
156
|
-
>>> r = sqrtm(a)
|
157
|
-
>>> r
|
158
|
-
array([[ 0.75592895, 1.13389342],
|
159
|
-
[ 0.37796447, 1.88982237]])
|
160
|
-
>>> r.dot(r)
|
161
|
-
array([[ 1., 3.],
|
162
|
-
[ 1., 4.]])
|
163
|
-
|
164
|
-
"""
|
165
|
-
A = _asarray_validated(A, check_finite=True, as_inexact=True)
|
166
|
-
if len(A.shape) != 2:
|
167
|
-
raise ValueError("Non-matrix input to matrix function.")
|
168
|
-
if blocksize < 1:
|
169
|
-
raise ValueError("The blocksize should be at least 1.")
|
170
|
-
A, = _ensure_dtype_cdsz(A)
|
171
|
-
keep_it_real = np.isrealobj(A)
|
172
|
-
if keep_it_real:
|
173
|
-
T, Z = schur(A)
|
174
|
-
d0 = np.diagonal(T)
|
175
|
-
d1 = np.diagonal(T, -1)
|
176
|
-
eps = np.finfo(T.dtype).eps
|
177
|
-
needs_conversion = abs(d1) > eps * (abs(d0[1:]) + abs(d0[:-1]))
|
178
|
-
if needs_conversion.any():
|
179
|
-
T, Z = rsf2csf(T, Z)
|
180
|
-
else:
|
181
|
-
T, Z = schur(A, output='complex')
|
182
|
-
failflag = False
|
183
|
-
try:
|
184
|
-
R = _sqrtm_triu(T, blocksize=blocksize)
|
185
|
-
ZH = np.conjugate(Z).T
|
186
|
-
X = Z.dot(R).dot(ZH)
|
187
|
-
dtype = np.result_type(A.dtype, 1j if np.iscomplexobj(X) else 1)
|
188
|
-
X = X.astype(dtype, copy=False)
|
189
|
-
except SqrtmError:
|
190
|
-
failflag = True
|
191
|
-
X = np.empty_like(A)
|
192
|
-
X.fill(np.nan)
|
193
|
-
|
194
|
-
if disp:
|
195
|
-
if failflag:
|
196
|
-
print("Failed to find a square root.")
|
197
|
-
return X
|
198
|
-
else:
|
199
|
-
try:
|
200
|
-
arg2 = norm(X.dot(X) - A, 'fro')**2 / norm(A, 'fro')
|
201
|
-
except ValueError:
|
202
|
-
# NaNs in matrix
|
203
|
-
arg2 = np.inf
|
204
|
-
|
205
|
-
return X, arg2
|
Binary file
|
Binary file
|
scipy/linalg/_procrustes.py
CHANGED
@@ -3,12 +3,14 @@ Solve the orthogonal Procrustes problem.
|
|
3
3
|
|
4
4
|
"""
|
5
5
|
import numpy as np
|
6
|
+
from scipy._lib._util import _apply_over_batch
|
6
7
|
from ._decomp_svd import svd
|
7
8
|
|
8
9
|
|
9
10
|
__all__ = ['orthogonal_procrustes']
|
10
11
|
|
11
12
|
|
13
|
+
@_apply_over_batch(('A', 2), ('B', 2))
|
12
14
|
def orthogonal_procrustes(A, B, check_finite=True):
|
13
15
|
"""
|
14
16
|
Compute the matrix solution of the orthogonal (or unitary) Procrustes problem.
|
scipy/linalg/_sketches.py
CHANGED
@@ -6,8 +6,8 @@
|
|
6
6
|
import numpy as np
|
7
7
|
|
8
8
|
from scipy._lib._util import (check_random_state, rng_integers,
|
9
|
-
_transition_to_rng)
|
10
|
-
from scipy.sparse import csc_matrix
|
9
|
+
_transition_to_rng, _apply_over_batch)
|
10
|
+
from scipy.sparse import csc_matrix, issparse
|
11
11
|
|
12
12
|
__all__ = ['clarkson_woodruff_transform']
|
13
13
|
|
@@ -68,8 +68,8 @@ def clarkson_woodruff_transform(input_matrix, sketch_size, rng=None):
|
|
68
68
|
|
69
69
|
Parameters
|
70
70
|
----------
|
71
|
-
input_matrix : array_like
|
72
|
-
Input matrix
|
71
|
+
input_matrix : array_like, shape (..., n, d)
|
72
|
+
Input matrix.
|
73
73
|
sketch_size : int
|
74
74
|
Number of rows for the sketch.
|
75
75
|
rng : `numpy.random.Generator`, optional
|
@@ -174,5 +174,16 @@ def clarkson_woodruff_transform(input_matrix, sketch_size, rng=None):
|
|
174
174
|
166.58473879945151
|
175
175
|
|
176
176
|
"""
|
177
|
-
|
178
|
-
|
177
|
+
if issparse(input_matrix) and input_matrix.ndim > 2:
|
178
|
+
message = "Batch support for sparse arrays is not available."
|
179
|
+
raise NotImplementedError(message)
|
180
|
+
|
181
|
+
S = cwt_matrix(sketch_size, input_matrix.shape[-2], rng=rng)
|
182
|
+
# Despite argument order (required by decorator), this is S @ input_matrix
|
183
|
+
# Can avoid _batch_dot when gh-22153 is resolved.
|
184
|
+
return S @ input_matrix if input_matrix.ndim <= 2 else _batch_dot(input_matrix, S)
|
185
|
+
|
186
|
+
|
187
|
+
@_apply_over_batch(('input_matrix', 2))
|
188
|
+
def _batch_dot(input_matrix, S):
|
189
|
+
return S @ input_matrix
|
Binary file
|
Binary file
|
scipy/linalg/_solvers.py
CHANGED
@@ -12,6 +12,7 @@ import warnings
|
|
12
12
|
import numpy as np
|
13
13
|
from numpy.linalg import inv, LinAlgError, norm, cond, svd
|
14
14
|
|
15
|
+
from scipy._lib._util import _apply_over_batch
|
15
16
|
from ._basic import solve, solve_triangular, matrix_balance
|
16
17
|
from .lapack import get_lapack_funcs
|
17
18
|
from ._decomp_schur import schur
|
@@ -27,6 +28,7 @@ __all__ = ['solve_sylvester',
|
|
27
28
|
'solve_continuous_are', 'solve_discrete_are']
|
28
29
|
|
29
30
|
|
31
|
+
@_apply_over_batch(('a', 2), ('b', 2), ('q', 2))
|
30
32
|
def solve_sylvester(a, b, q):
|
31
33
|
"""
|
32
34
|
Computes a solution (X) to the Sylvester equation :math:`AX + XB = Q`.
|
@@ -106,12 +108,12 @@ def solve_sylvester(a, b, q):
|
|
106
108
|
y = scale*y
|
107
109
|
|
108
110
|
if info < 0:
|
109
|
-
raise LinAlgError("Illegal value encountered in "
|
110
|
-
"the %d term" % (-info,))
|
111
|
+
raise LinAlgError(f"Illegal value encountered in the {-info} term")
|
111
112
|
|
112
113
|
return np.dot(np.dot(u, y), v.conj().transpose())
|
113
114
|
|
114
115
|
|
116
|
+
@_apply_over_batch(('a', 2), ('q', 2))
|
115
117
|
def solve_continuous_lyapunov(a, q):
|
116
118
|
"""
|
117
119
|
Solves the continuous Lyapunov equation :math:`AX + XA^H = Q`.
|
@@ -245,6 +247,7 @@ def _solve_discrete_lyapunov_bilinear(a, q):
|
|
245
247
|
return solve_lyapunov(b.conj().transpose(), -c)
|
246
248
|
|
247
249
|
|
250
|
+
@_apply_over_batch(('a', 2), ('q', 2))
|
248
251
|
def solve_discrete_lyapunov(a, q, method=None):
|
249
252
|
"""
|
250
253
|
Solves the discrete Lyapunov equation :math:`AXA^H - X + Q = 0`.
|
@@ -336,6 +339,7 @@ def solve_discrete_lyapunov(a, q, method=None):
|
|
336
339
|
return x
|
337
340
|
|
338
341
|
|
342
|
+
@_apply_over_batch(('a', 2), ('b', 2), ('q', 2), ('r', 2), ('e', 2), ('s', 2))
|
339
343
|
def solve_continuous_are(a, b, q, r, e=None, s=None, balanced=True):
|
340
344
|
r"""
|
341
345
|
Solves the continuous-time algebraic Riccati equation (CARE).
|
@@ -541,6 +545,7 @@ def solve_continuous_are(a, b, q, r, e=None, s=None, balanced=True):
|
|
541
545
|
return (x + x.conj().T)/2
|
542
546
|
|
543
547
|
|
548
|
+
@_apply_over_batch(('a', 2), ('b', 2), ('q', 2), ('r', 2), ('e', 2), ('s', 2))
|
544
549
|
def solve_discrete_are(a, b, q, r, e=None, s=None, balanced=True):
|
545
550
|
r"""
|
546
551
|
Solves the discrete-time algebraic Riccati equation (DARE).
|
@@ -3,6 +3,7 @@ import warnings
|
|
3
3
|
|
4
4
|
import numpy as np
|
5
5
|
from numpy.lib.stride_tricks import as_strided
|
6
|
+
from scipy._lib._util import _apply_over_batch
|
6
7
|
|
7
8
|
|
8
9
|
__all__ = ['toeplitz', 'circulant', 'hankel',
|
@@ -269,6 +270,7 @@ def hadamard(n, dtype=int):
|
|
269
270
|
return H
|
270
271
|
|
271
272
|
|
273
|
+
@_apply_over_batch(("f", 1), ("s", 1))
|
272
274
|
def leslie(f, s):
|
273
275
|
"""
|
274
276
|
Create a Leslie matrix.
|
@@ -279,24 +281,22 @@ def leslie(f, s):
|
|
279
281
|
|
280
282
|
Parameters
|
281
283
|
----------
|
282
|
-
f : (
|
284
|
+
f : (N,) array_like
|
283
285
|
The "fecundity" coefficients.
|
284
|
-
s : (
|
285
|
-
The "survival" coefficients. The length of
|
286
|
-
|
286
|
+
s : (N-1,) array_like
|
287
|
+
The "survival" coefficients. The length of `s` must be one less
|
288
|
+
than the length of `f`, and it must be at least 1.
|
287
289
|
|
288
290
|
Returns
|
289
291
|
-------
|
290
|
-
L : (
|
292
|
+
L : (N, N) ndarray
|
291
293
|
The array is zero except for the first row,
|
292
294
|
which is `f`, and the first sub-diagonal, which is `s`.
|
293
|
-
|
295
|
+
The data-type of the array will be the data-type of
|
294
296
|
``f[0]+s[0]``.
|
295
297
|
|
296
298
|
Notes
|
297
299
|
-----
|
298
|
-
.. versionadded:: 0.8.0
|
299
|
-
|
300
300
|
The Leslie matrix is used to model discrete-time, age-structured
|
301
301
|
population growth [1]_ [2]_. In a population with `n` age classes, two sets
|
302
302
|
of parameters define a Leslie matrix: the `n` "fecundity coefficients",
|
@@ -304,11 +304,6 @@ def leslie(f, s):
|
|
304
304
|
class, and the `n` - 1 "survival coefficients", which give the
|
305
305
|
per-capita survival rate of each age class.
|
306
306
|
|
307
|
-
N-dimensional input are treated as a batches of coefficient arrays: each
|
308
|
-
slice along the last axis of the input arrays is a 1-D coefficient array,
|
309
|
-
and each slice along the last two dimensions of the output is the
|
310
|
-
corresponding Leslie matrix.
|
311
|
-
|
312
307
|
References
|
313
308
|
----------
|
314
309
|
.. [1] P. H. Leslie, On the use of matrices in certain population
|
@@ -337,12 +332,6 @@ def leslie(f, s):
|
|
337
332
|
raise ValueError("The length of s must be at least 1.")
|
338
333
|
|
339
334
|
n = f.shape[-1]
|
340
|
-
|
341
|
-
if f.ndim > 1 or s.ndim > 1:
|
342
|
-
from scipy.stats._resampling import _vectorize_statistic
|
343
|
-
_leslie_nd = _vectorize_statistic(leslie)
|
344
|
-
return np.moveaxis(_leslie_nd(f, s, axis=-1), [0, 1], [-2, -1])
|
345
|
-
|
346
335
|
tmp = f[0] + s[0]
|
347
336
|
a = np.zeros((n, n), dtype=tmp.dtype)
|
348
337
|
a[0] = f
|
@@ -406,9 +395,9 @@ def kron(a, b):
|
|
406
395
|
|
407
396
|
def block_diag(*arrs):
|
408
397
|
"""
|
409
|
-
Create a block diagonal
|
398
|
+
Create a block diagonal array from provided arrays.
|
410
399
|
|
411
|
-
|
400
|
+
For example, given 2-D inputs `A`, `B` and `C`, the output will have these
|
412
401
|
arrays arranged on the diagonal::
|
413
402
|
|
414
403
|
[[A, 0, 0],
|
@@ -417,15 +406,17 @@ def block_diag(*arrs):
|
|
417
406
|
|
418
407
|
Parameters
|
419
408
|
----------
|
420
|
-
A, B, C, ... : array_like
|
421
|
-
Input arrays. A 1-D array or array_like sequence of length
|
422
|
-
treated as a 2-D array with shape ``(1,n)``.
|
409
|
+
A, B, C, ... : array_like
|
410
|
+
Input arrays. A 1-D array or array_like sequence of length ``n`` is
|
411
|
+
treated as a 2-D array with shape ``(1, n)``. Any dimensions before
|
412
|
+
the last two are treated as batch dimensions; see :ref:`linalg_batch`.
|
423
413
|
|
424
414
|
Returns
|
425
415
|
-------
|
426
416
|
D : ndarray
|
427
|
-
Array with `A`, `B`, `C`, ... on the diagonal
|
428
|
-
same dtype as
|
417
|
+
Array with `A`, `B`, `C`, ... on the diagonal of the last two
|
418
|
+
dimensions. `D` has the same dtype as the result type of the
|
419
|
+
inputs.
|
429
420
|
|
430
421
|
Notes
|
431
422
|
-----
|
@@ -433,7 +424,8 @@ def block_diag(*arrs):
|
|
433
424
|
block diagonal matrix.
|
434
425
|
|
435
426
|
Empty sequences (i.e., array-likes of zero size) will not be ignored.
|
436
|
-
Noteworthy, both [] and [[]] are treated as matrices with shape
|
427
|
+
Noteworthy, both ``[]`` and ``[[]]`` are treated as matrices with shape
|
428
|
+
``(1,0)``.
|
437
429
|
|
438
430
|
Examples
|
439
431
|
--------
|
@@ -470,18 +462,16 @@ def block_diag(*arrs):
|
|
470
462
|
arrs = ([],)
|
471
463
|
arrs = [np.atleast_2d(a) for a in arrs]
|
472
464
|
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
f"have dimension greater than 2: {bad_args}")
|
477
|
-
|
478
|
-
shapes = np.array([a.shape for a in arrs])
|
465
|
+
batch_shapes = [a.shape[:-2] for a in arrs]
|
466
|
+
batch_shape = np.broadcast_shapes(*batch_shapes)
|
467
|
+
arrs = [np.broadcast_to(a, batch_shape + a.shape[-2:]) for a in arrs]
|
479
468
|
out_dtype = np.result_type(*[arr.dtype for arr in arrs])
|
480
|
-
|
469
|
+
block_shapes = np.array([a.shape[-2:] for a in arrs])
|
470
|
+
out = np.zeros(batch_shape + tuple(np.sum(block_shapes, axis=0)), dtype=out_dtype)
|
481
471
|
|
482
472
|
r, c = 0, 0
|
483
|
-
for i, (rr, cc) in enumerate(
|
484
|
-
out[r:r + rr, c:c + cc] = arrs[i]
|
473
|
+
for i, (rr, cc) in enumerate(block_shapes):
|
474
|
+
out[..., r:r + rr, c:c + cc] = arrs[i]
|
485
475
|
r += rr
|
486
476
|
c += cc
|
487
477
|
return out
|
Binary file
|