scipy 1.15.3__cp313-cp313t-win_amd64.whl → 1.16.0rc2__cp313-cp313t-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 +7 -7
- scipy/__init__.py +3 -6
- scipy/_cyutility.cp313t-win_amd64.dll.a +0 -0
- scipy/_cyutility.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/_ccallback_c.cp313t-win_amd64.pyd +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_fpumode.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/_fpumode.cp313t-win_amd64.pyd +0 -0
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_ccallback.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/_test_ccallback.cp313t-win_amd64.pyd +0 -0
- scipy/_lib/_test_deprecation_call.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/_test_deprecation_call.cp313t-win_amd64.pyd +0 -0
- scipy/_lib/_test_deprecation_def.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/_test_deprecation_def.cp313t-win_amd64.pyd +0 -0
- scipy/_lib/_testutils.py +6 -2
- scipy/_lib/_uarray/_uarray.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/_uarray/_uarray.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/messagestream.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/cluster/_hierarchy.cp313t-win_amd64.pyd +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp313t-win_amd64.dll.a +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp313t-win_amd64.pyd +0 -0
- scipy/cluster/_vq.cp313t-win_amd64.dll.a +0 -0
- scipy/cluster/_vq.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/fft/_pocketfft/pypocketfft.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/fftpack/convolve.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_dop.cp313t-win_amd64.pyd +0 -0
- scipy/integrate/_lsoda.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_lsoda.cp313t-win_amd64.pyd +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_odepack.cp313t-win_amd64.pyd +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_quadpack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_test_multivariate.cp313t-win_amd64.pyd +0 -0
- scipy/integrate/_test_odeint_banded.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_test_odeint_banded.cp313t-win_amd64.pyd +0 -0
- scipy/integrate/_vode.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_vode.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_dfitpack.cp313t-win_amd64.pyd +0 -0
- scipy/interpolate/_dierckx.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_dierckx.cp313t-win_amd64.pyd +0 -0
- scipy/interpolate/_fitpack.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_fitpack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_interpnd.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_ppoly.cp313t-win_amd64.pyd +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_rbfinterp_pythran.cp313t-win_amd64.pyd +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_rgi_cython.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/io/_test_fortran.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/io/matlab/_mio5_utils.cp313t-win_amd64.pyd +0 -0
- scipy/io/matlab/_mio_utils.cp313t-win_amd64.dll.a +0 -0
- scipy/io/matlab/_mio_utils.cp313t-win_amd64.pyd +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cp313t-win_amd64.dll.a +0 -0
- scipy/io/matlab/_streams.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_cythonized_array_utils.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_interpolative.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_lu_cython.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_update.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_fblas.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_flapack.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_flapack.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_linalg_pythran.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_linalg_pythran.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_expm.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_solve_toeplitz.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/cython_blas.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/cython_lapack.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/cython_lapack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/ndimage/_ctest.cp313t-win_amd64.pyd +0 -0
- scipy/ndimage/_cytest.cp313t-win_amd64.dll.a +0 -0
- scipy/ndimage/_cytest.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/ndimage/_nd_image.cp313t-win_amd64.pyd +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cp313t-win_amd64.dll.a +0 -0
- scipy/ndimage/_ni_label.cp313t-win_amd64.pyd +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cp313t-win_amd64.dll.a +0 -0
- scipy/ndimage/_rank_filter_1d.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/odr/__odrpack.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_bglu_dense.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_direct.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_group_columns.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_highspy/_core.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_highspy/_core.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_highspy/_highs_options.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_highspy/_highs_options.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_lbfgsb.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_lbfgsb.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_lsap.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_lsq/givens_elimination.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_minpack.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_moduleTNC.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_pava_pybind.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_slsqplib.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_trlib/_trlib.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_zeros.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/cython_optimize/_zeros.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/signal/_max_len_seq_inner.cp313t-win_amd64.pyd +0 -0
- scipy/signal/_peak_finding_utils.cp313t-win_amd64.dll.a +0 -0
- scipy/signal/_peak_finding_utils.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/signal/_sigtools.cp313t-win_amd64.pyd +0 -0
- scipy/signal/_sosfilt.cp313t-win_amd64.dll.a +0 -0
- scipy/signal/_sosfilt.cp313t-win_amd64.pyd +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cp313t-win_amd64.dll.a +0 -0
- scipy/signal/_spline.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/signal/_upfirdn_apply.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/_csparsetools.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/_sparsetools.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_flow.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_matching.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_matching.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_reordering.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_reordering.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_shortest_path.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_shortest_path.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_tools.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_tools.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_traversal.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_traversal.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_dsolve/_superlu.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_cpropack.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/_ckdtree.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/_distance_pybind.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/_distance_pybind.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/_distance_wrap.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/_distance_wrap.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/_hausdorff.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/_hausdorff.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/_qhull.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/_qhull.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/_voronoi.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/_voronoi.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/transform/_rigid_transform.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/transform/_rotation.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/transform/_rotation.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_comb.cp313t-win_amd64.pyd +0 -0
- scipy/special/_ellip_harm_2.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_ellip_harm_2.cp313t-win_amd64.pyd +0 -0
- scipy/special/_gufuncs.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_gufuncs.cp313t-win_amd64.pyd +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_specfun.cp313t-win_amd64.pyd +0 -0
- scipy/special/_special_ufuncs.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_special_ufuncs.cp313t-win_amd64.pyd +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_test_internal.cp313t-win_amd64.pyd +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_ufuncs.cp313t-win_amd64.pyd +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_ufuncs_cxx.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/special/cython_special.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_ansari_swilk_statistics.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_biasedurn.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_levy_stable/levyst.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_qmc_cy.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_qmvnt_cy.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_rcont/rcont.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_sobol.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_stats.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_stats.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_stats_pythran.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_bspl.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_cobyla.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_cobyla.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_cython_nnls.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_cython_nnls.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_slsqp.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_slsqp.cp313t-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.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_mvn.cp313t-win_amd64.pyd +0 -0
- scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
- /scipy-1.15.3-cp313-cp313t-win_amd64.whl → /scipy-1.16.0rc2-cp313-cp313t-win_amd64.whl +0 -0
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
scipy/optimize/_slsqp_py.py
CHANGED
@@ -16,9 +16,8 @@ Functions
|
|
16
16
|
__all__ = ['approx_jacobian', 'fmin_slsqp']
|
17
17
|
|
18
18
|
import numpy as np
|
19
|
-
from
|
20
|
-
from
|
21
|
-
sqrt, vstack, isfinite, atleast_1d)
|
19
|
+
from ._slsqplib import slsqp
|
20
|
+
from scipy.linalg import norm as lanorm
|
22
21
|
from ._optimize import (OptimizeResult, _check_unknown_options,
|
23
22
|
_prepare_scalar_function, _clip_x_for_func,
|
24
23
|
_check_clip_x)
|
@@ -26,11 +25,11 @@ from ._numdiff import approx_derivative
|
|
26
25
|
from ._constraints import old_bound_to_new, _arr_to_scalar
|
27
26
|
from scipy._lib._array_api import array_namespace
|
28
27
|
from scipy._lib import array_api_extra as xpx
|
29
|
-
|
28
|
+
from numpy.typing import NDArray
|
30
29
|
|
31
30
|
__docformat__ = "restructuredtext en"
|
32
31
|
|
33
|
-
_epsilon = sqrt(finfo(
|
32
|
+
_epsilon = np.sqrt(np.finfo(np.float64).eps)
|
34
33
|
|
35
34
|
|
36
35
|
def approx_jacobian(x, func, epsilon, *args):
|
@@ -217,15 +216,19 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
|
|
217
216
|
constraints=(),
|
218
217
|
maxiter=100, ftol=1.0E-6, iprint=1, disp=False,
|
219
218
|
eps=_epsilon, callback=None, finite_diff_rel_step=None,
|
220
|
-
**unknown_options):
|
219
|
+
workers=None, **unknown_options):
|
221
220
|
"""
|
222
221
|
Minimize a scalar function of one or more variables using Sequential
|
223
222
|
Least Squares Programming (SLSQP).
|
224
223
|
|
225
|
-
|
226
|
-
|
224
|
+
Parameters
|
225
|
+
----------
|
227
226
|
ftol : float
|
228
|
-
Precision
|
227
|
+
Precision target for the value of f in the stopping criterion. This value
|
228
|
+
controls the final accuracy for checking various optimality conditions;
|
229
|
+
gradient of the lagrangian and absolute sum of the constraint violations
|
230
|
+
should be lower than ``ftol``. Similarly, computed step size and the
|
231
|
+
objective function changes are checked against this value. Default is 1e-6.
|
229
232
|
eps : float
|
230
233
|
Step size used for numerical approximation of the Jacobian.
|
231
234
|
disp : bool
|
@@ -240,9 +243,55 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
|
|
240
243
|
possibly adjusted to fit into the bounds. For ``method='3-point'``
|
241
244
|
the sign of `h` is ignored. If None (default) then step is selected
|
242
245
|
automatically.
|
246
|
+
workers : int, map-like callable, optional
|
247
|
+
A map-like callable, such as `multiprocessing.Pool.map` for evaluating
|
248
|
+
any numerical differentiation in parallel.
|
249
|
+
This evaluation is carried out as ``workers(fun, iterable)``.
|
250
|
+
|
251
|
+
.. versionadded:: 1.16.0
|
252
|
+
|
253
|
+
Returns
|
254
|
+
-------
|
255
|
+
res : OptimizeResult
|
256
|
+
The optimization result represented as an `OptimizeResult` object.
|
257
|
+
In this dict-like object the following fields are of particular importance:
|
258
|
+
``x`` the solution array, ``success`` a Boolean flag indicating if the
|
259
|
+
optimizer exited successfully, ``message`` which describes the reason for
|
260
|
+
termination, and ``multipliers`` which contains the Karush-Kuhn-Tucker
|
261
|
+
(KKT) multipliers for the QP approximation used in solving the original
|
262
|
+
nonlinear problem. See ``Notes`` below. See also `OptimizeResult` for a
|
263
|
+
description of other attributes.
|
264
|
+
|
265
|
+
Notes
|
266
|
+
-----
|
267
|
+
The KKT multipliers are returned in the ``OptimizeResult.multipliers``
|
268
|
+
attribute as a NumPy array. Denoting the dimension of the equality constraints
|
269
|
+
with ``meq``, and of inequality constraints with ``mineq``, then the returned
|
270
|
+
array slice ``m[:meq]`` contains the multipliers for the equality constraints,
|
271
|
+
and the remaining ``m[meq:meq + mineq]`` contains the multipliers for the
|
272
|
+
inequality constraints. The multipliers corresponding to bound inequalities
|
273
|
+
are not returned. See [1]_ pp. 321 or [2]_ for an explanation of how to interpret
|
274
|
+
these multipliers. The internal QP problem is solved using the methods given
|
275
|
+
in [3]_ Chapter 25.
|
276
|
+
|
277
|
+
Note that if new-style `NonlinearConstraint` or `LinearConstraint` were
|
278
|
+
used, then ``minimize`` converts them first to old-style constraint dicts.
|
279
|
+
It is possible for a single new-style constraint to simultaneously contain
|
280
|
+
both inequality and equality constraints. This means that if there is mixing
|
281
|
+
within a single constraint, then the returned list of multipliers will have
|
282
|
+
a different length than the original new-style constraints.
|
283
|
+
|
284
|
+
References
|
285
|
+
----------
|
286
|
+
.. [1] Nocedal, J., and S J Wright, 2006, "Numerical Optimization", Springer,
|
287
|
+
New York.
|
288
|
+
.. [2] Kraft, D., "A software package for sequential quadratic programming",
|
289
|
+
1988, Tech. Rep. DFVLR-FB 88-28, DLR German Aerospace Center, Germany.
|
290
|
+
.. [3] Lawson, C. L., and R. J. Hanson, 1995, "Solving Least Squares Problems",
|
291
|
+
SIAM, Philadelphia, PA.
|
292
|
+
|
243
293
|
"""
|
244
294
|
_check_unknown_options(unknown_options)
|
245
|
-
iter = maxiter - 1
|
246
295
|
acc = ftol
|
247
296
|
epsilon = eps
|
248
297
|
|
@@ -277,7 +326,7 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
|
|
277
326
|
try:
|
278
327
|
ctype = con['type'].lower()
|
279
328
|
except KeyError as e:
|
280
|
-
raise KeyError('Constraint
|
329
|
+
raise KeyError(f'Constraint {ic} has no type defined.') from e
|
281
330
|
except TypeError as e:
|
282
331
|
raise TypeError('Constraints must be defined using a '
|
283
332
|
'dictionary.') from e
|
@@ -289,7 +338,7 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
|
|
289
338
|
|
290
339
|
# check function
|
291
340
|
if 'fun' not in con:
|
292
|
-
raise ValueError('Constraint
|
341
|
+
raise ValueError(f'Constraint {ic} has no function defined.')
|
293
342
|
|
294
343
|
# check Jacobian
|
295
344
|
cjac = con.get('jac')
|
@@ -331,26 +380,15 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
|
|
331
380
|
|
332
381
|
# Set the parameters that SLSQP will need
|
333
382
|
# meq, mieq: number of equality and inequality constraints
|
334
|
-
meq = sum(map(len, [atleast_1d(c['fun'](x, *c['args']))
|
383
|
+
meq = sum(map(len, [np.atleast_1d(c['fun'](x, *c['args']))
|
335
384
|
for c in cons['eq']]))
|
336
|
-
mieq = sum(map(len, [atleast_1d(c['fun'](x, *c['args']))
|
385
|
+
mieq = sum(map(len, [np.atleast_1d(c['fun'](x, *c['args']))
|
337
386
|
for c in cons['ineq']]))
|
338
387
|
# m = The total number of constraints
|
339
388
|
m = meq + mieq
|
340
|
-
# la = The number of constraints, or 1 if there are no constraints
|
341
|
-
la = array([1, m]).max()
|
342
389
|
# n = The number of independent variables
|
343
390
|
n = len(x)
|
344
391
|
|
345
|
-
# Define the workspaces for SLSQP
|
346
|
-
n1 = n + 1
|
347
|
-
mineq = m - meq + n1 + n1
|
348
|
-
len_w = (3*n1+m)*(n1+1)+(n1-meq+1)*(mineq+2) + 2*mineq+(n1+mineq)*(n1-meq) \
|
349
|
-
+ 2*meq + n1 + ((n+1)*n)//2 + 2*m + 3*n + 3*n1 + 1
|
350
|
-
len_jw = mineq
|
351
|
-
w = zeros(len_w)
|
352
|
-
jw = zeros(len_jw)
|
353
|
-
|
354
392
|
# Decompose bounds into xl and xu
|
355
393
|
if bounds is None or len(bounds) == 0:
|
356
394
|
xl = np.empty(n, dtype=float)
|
@@ -358,8 +396,8 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
|
|
358
396
|
xl.fill(np.nan)
|
359
397
|
xu.fill(np.nan)
|
360
398
|
else:
|
361
|
-
bnds = array([(_arr_to_scalar(
|
362
|
-
for (
|
399
|
+
bnds = np.array([(_arr_to_scalar(lo), _arr_to_scalar(up))
|
400
|
+
for (lo, up) in bounds], float)
|
363
401
|
if bnds.shape[0] != n:
|
364
402
|
raise IndexError('SLSQP Error: the length of bounds is not '
|
365
403
|
'compatible with that of x0.')
|
@@ -370,142 +408,196 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
|
|
370
408
|
if bnderr.any():
|
371
409
|
raise ValueError("SLSQP Error: lb > ub in bounds "
|
372
410
|
f"{', '.join(str(b) for b in bnderr)}.")
|
373
|
-
xl, xu = bnds[:, 0], bnds[:, 1]
|
411
|
+
xl, xu = bnds[:, 0].copy(), bnds[:, 1].copy()
|
374
412
|
|
375
|
-
# Mark infinite bounds with nans; the
|
376
|
-
infbnd = ~isfinite(bnds)
|
413
|
+
# Mark infinite bounds with nans; the C code expects this
|
414
|
+
infbnd = ~np.isfinite(bnds)
|
377
415
|
xl[infbnd[:, 0]] = np.nan
|
378
416
|
xu[infbnd[:, 1]] = np.nan
|
379
417
|
|
380
418
|
# ScalarFunction provides function and gradient evaluation
|
381
419
|
sf = _prepare_scalar_function(func, x, jac=jac, args=args, epsilon=eps,
|
382
420
|
finite_diff_rel_step=finite_diff_rel_step,
|
383
|
-
bounds=new_bounds)
|
421
|
+
bounds=new_bounds, workers=workers)
|
384
422
|
# gh11403 SLSQP sometimes exceeds bounds by 1 or 2 ULP, make sure this
|
385
423
|
# doesn't get sent to the func/grad evaluator.
|
386
424
|
wrapped_fun = _clip_x_for_func(sf.fun, new_bounds)
|
387
425
|
wrapped_grad = _clip_x_for_func(sf.grad, new_bounds)
|
388
426
|
|
389
|
-
# Initialize
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
#
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
427
|
+
# Initialize internal SLSQP state variables dictionary
|
428
|
+
# This dictionary is passed to the SLSQP matching the C struct defined as
|
429
|
+
#
|
430
|
+
# struct SLSQP_static_vars {
|
431
|
+
# double acc, alpha, f0, gs, h1, h2, h3, h4, t, t0, tol;
|
432
|
+
# int exact, inconsistent, reset, iter, itermax, line, mode, meq;
|
433
|
+
# };
|
434
|
+
#
|
435
|
+
# exact : a dummy variable and should be kept 0 since the underlying code
|
436
|
+
# always uses an inexact search.
|
437
|
+
# inconsistent: a boolean set to 1 if the linearized QP is not well-defined
|
438
|
+
# while the original nonlinear problem is still solvable. Then
|
439
|
+
# the problem is augmented with a regularizing dummy variable.
|
440
|
+
# reset: holds the count of resetting bfgs to identity matrix.
|
441
|
+
# iter : the current and itermax is the maximum number of iterations.
|
442
|
+
# line : the current line search iteration.
|
443
|
+
# mode : the exit mode of the solver.
|
444
|
+
# alpha, f0, gs, h1, h2, h3, h4, t, t0 : internal variables used by the solver.
|
445
|
+
#
|
446
|
+
# The dict holds the intermediate state of the solver. The keys are the same
|
447
|
+
# as the C struct members and will be modified in-place.
|
448
|
+
state_dict = {
|
449
|
+
"acc": acc,
|
450
|
+
"alpha": 0.0,
|
451
|
+
"f0": 0.0,
|
452
|
+
"gs": 0.0,
|
453
|
+
"h1": 0.0,
|
454
|
+
"h2": 0.0,
|
455
|
+
"h3": 0.0,
|
456
|
+
"h4": 0.0,
|
457
|
+
"t": 0.0,
|
458
|
+
"t0": 0.0,
|
459
|
+
"tol": 10.0*acc,
|
460
|
+
"exact": 0,
|
461
|
+
"inconsistent": 0,
|
462
|
+
"reset": 0,
|
463
|
+
"iter": 0,
|
464
|
+
"itermax": maxiter,
|
465
|
+
"line": 0,
|
466
|
+
"m": m,
|
467
|
+
"meq": meq,
|
468
|
+
"mode": 0,
|
469
|
+
"n": n
|
470
|
+
}
|
414
471
|
|
415
472
|
# Print the header if iprint >= 2
|
416
473
|
if iprint >= 2:
|
417
|
-
print("
|
474
|
+
print(f"{'NIT':>5} {'FC':>5} {'OBJFUN':>16} {'GNORM':>16}")
|
475
|
+
|
476
|
+
# Internal buffer and int array
|
477
|
+
indices = np.zeros([max(m + 2*n + 2, 1)], dtype=np.int32)
|
478
|
+
|
479
|
+
# The worst case workspace requirements for the buffer are:
|
480
|
+
|
481
|
+
# n*(n+1)//2 + m + 4*n + 3 # SLSQP
|
482
|
+
# (n+1)*(n+2) + (n+1)*meq + m + (mineq + 2*n + 2)*(n+1) + 3*n + 3 # LSQ
|
483
|
+
# mineq + 2n + 2 + 2*meq + (n+1) + (mineq + 3n + 3)*(n + 1 - meq) # LSEI
|
484
|
+
# (mineq + 2n + 2 + 2)*(n + 2) + mineq + 2n + 2 # LDP
|
485
|
+
# mineq + 2n + 2 # NNLS
|
486
|
+
|
487
|
+
# If we sum all up and simplify by the help of sympy we get the following
|
488
|
+
buffer_size = (
|
489
|
+
n*(n+1)//2 + 3*m*n - (m + 5*n + 7)*meq + 9*m + 8*n*n + 35*n + meq*meq + 28
|
490
|
+
)
|
491
|
+
# If no inequality constraints are given, top up workspace for the missing
|
492
|
+
# terms.
|
493
|
+
if mieq == 0:
|
494
|
+
buffer_size += 2*n*(n + 1)
|
495
|
+
buffer = np.zeros(max(buffer_size, 1), dtype=np.float64)
|
418
496
|
|
419
497
|
# mode is zero on entry, so call objective, constraints and gradients
|
420
498
|
# there should be no func evaluations here because it's cached from
|
421
499
|
# ScalarFunction
|
422
500
|
fx = wrapped_fun(x)
|
423
|
-
g =
|
424
|
-
|
425
|
-
|
501
|
+
g = wrapped_grad(x)
|
502
|
+
|
503
|
+
# Allocate the multiplier array both for constraints and user specified
|
504
|
+
# bounds (extra +2 is for a possible augmented problem).
|
505
|
+
mult = np.zeros([max(1, m + 2*n + 2)], dtype=np.float64)
|
506
|
+
|
507
|
+
# Allocate the constraints and normals once and repopulate as needed
|
508
|
+
C = np.zeros([max(1, m), n], dtype=np.float64, order='F')
|
509
|
+
d = np.zeros([max(1, m)], dtype=np.float64)
|
510
|
+
_eval_con_normals(C, x, cons, m, meq)
|
511
|
+
_eval_constraint(d, x, cons, m, meq)
|
512
|
+
|
513
|
+
iter_prev = 0
|
426
514
|
|
427
|
-
while
|
515
|
+
while True:
|
428
516
|
# Call SLSQP
|
429
|
-
slsqp(
|
430
|
-
alpha, f0, gs, h1, h2, h3, h4, t, t0, tol,
|
431
|
-
iexact, incons, ireset, itermx, line,
|
432
|
-
n1, n2, n3)
|
517
|
+
slsqp(state_dict, fx, g, C, d, x, mult, xl, xu, buffer, indices)
|
433
518
|
|
434
|
-
if mode == 1: # objective and constraint evaluation required
|
435
|
-
fx =
|
436
|
-
|
519
|
+
if state_dict['mode'] == 1: # objective and constraint evaluation required
|
520
|
+
fx = sf.fun(x)
|
521
|
+
_eval_constraint(d, x, cons, m, meq)
|
437
522
|
|
438
|
-
if mode == -1: # gradient evaluation required
|
439
|
-
g =
|
440
|
-
|
523
|
+
if state_dict['mode'] == -1: # gradient evaluation required
|
524
|
+
g = sf.grad(x)
|
525
|
+
_eval_con_normals(C, x, cons, m, meq)
|
441
526
|
|
442
|
-
if
|
527
|
+
if state_dict['iter'] > iter_prev:
|
443
528
|
# call callback if major iteration has incremented
|
444
529
|
if callback is not None:
|
445
530
|
callback(np.copy(x))
|
446
531
|
|
447
532
|
# Print the status of the current iterate if iprint > 2
|
448
533
|
if iprint >= 2:
|
449
|
-
print("
|
450
|
-
|
534
|
+
print(f"{state_dict['iter']:5d} {sf.nfev:5d} "
|
535
|
+
f"{fx:16.6E} {lanorm(g):16.6E}")
|
451
536
|
|
452
537
|
# If exit mode is not -1 or 1, slsqp has completed
|
453
|
-
if abs(mode) != 1:
|
538
|
+
if abs(state_dict['mode']) != 1:
|
454
539
|
break
|
455
540
|
|
456
|
-
|
541
|
+
iter_prev = state_dict['iter']
|
457
542
|
|
458
543
|
# Optimization loop complete. Print status if requested
|
459
544
|
if iprint >= 1:
|
460
|
-
print(
|
545
|
+
print(
|
546
|
+
exit_modes[state_dict['mode']] + f" (Exit mode {state_dict['mode']})"
|
547
|
+
)
|
461
548
|
print(" Current function value:", fx)
|
462
|
-
print(" Iterations:",
|
549
|
+
print(" Iterations:", state_dict['iter'])
|
463
550
|
print(" Function evaluations:", sf.nfev)
|
464
551
|
print(" Gradient evaluations:", sf.ngev)
|
465
552
|
|
466
|
-
return OptimizeResult(
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
553
|
+
return OptimizeResult(
|
554
|
+
x=x, fun=fx, jac=g, nit=state_dict['iter'], nfev=sf.nfev, njev=sf.ngev,
|
555
|
+
status=state_dict['mode'], message=exit_modes[state_dict['mode']],
|
556
|
+
success=(state_dict['mode'] == 0), multipliers=mult[:m]
|
557
|
+
)
|
558
|
+
|
559
|
+
# The following functions modify their first input argument in-place.
|
560
|
+
def _eval_constraint(d: NDArray, x: NDArray, cons: dict, m: int, meq: int):
|
561
|
+
if m == 0:
|
562
|
+
return
|
563
|
+
|
564
|
+
# The reason why we don't use regular increments with a sane for loop is that
|
565
|
+
# the constraint evaluations do not necessarily return scalars. Their
|
566
|
+
# output length needs to be taken into account while placing them in d.
|
567
|
+
|
568
|
+
if meq > 0:
|
569
|
+
row = 0
|
570
|
+
for con in cons['eq']:
|
571
|
+
temp = np.atleast_1d(con['fun'](x, *con['args'])).ravel()
|
572
|
+
d[row:row + len(temp)] = temp
|
573
|
+
row += len(temp)
|
574
|
+
|
575
|
+
if m > meq:
|
576
|
+
row = meq
|
577
|
+
for con in cons['ineq']:
|
578
|
+
temp = np.atleast_1d(con['fun'](x, *con['args'])).ravel()
|
579
|
+
d[row:row + len(temp)] = temp
|
580
|
+
row += len(temp)
|
581
|
+
|
582
|
+
return
|
583
|
+
|
584
|
+
|
585
|
+
def _eval_con_normals(C: NDArray, x: NDArray, cons: dict, m: int, meq: int):
|
586
|
+
if m == 0:
|
587
|
+
return
|
588
|
+
|
589
|
+
if meq > 0:
|
590
|
+
row = 0
|
591
|
+
for con in cons['eq']:
|
592
|
+
temp = np.atleast_2d(con['jac'](x, *con['args']))
|
593
|
+
C[row:row + temp.shape[0], :] = temp
|
594
|
+
row += temp.shape[0]
|
595
|
+
|
596
|
+
if m > meq:
|
597
|
+
row = meq
|
598
|
+
for con in cons['ineq']:
|
599
|
+
temp = np.atleast_2d(con['jac'](x, *con['args']))
|
600
|
+
C[row:row + temp.shape[0], :] = temp
|
601
|
+
row += temp.shape[0]
|
602
|
+
|
603
|
+
return
|
Binary file
|
Binary file
|
scipy/optimize/_spectral.py
CHANGED
@@ -107,7 +107,7 @@ def _root_df_sane(func, x0, args=(), ftol=1e-8, fatol=1e-300, maxfev=1000,
|
|
107
107
|
F_k_norm = fnorm(F_k)
|
108
108
|
|
109
109
|
if disp:
|
110
|
-
print("iter
|
110
|
+
print(f"iter {k}: ||F|| = {F_k_norm:g}, sigma = {sigma_k:g}")
|
111
111
|
|
112
112
|
if callback is not None:
|
113
113
|
callback(x_k, F_k)
|
scipy/optimize/_tnc.py
CHANGED
@@ -287,6 +287,7 @@ def _minimize_tnc(fun, x0, args=(), jac=None, bounds=None,
|
|
287
287
|
maxCGit=-1, eta=-1, stepmx=0, accuracy=0,
|
288
288
|
minfev=0, ftol=-1, xtol=-1, gtol=-1, rescale=-1, disp=False,
|
289
289
|
callback=None, finite_diff_rel_step=None, maxfun=None,
|
290
|
+
workers=None,
|
290
291
|
**unknown_options):
|
291
292
|
"""
|
292
293
|
Minimize a scalar function of one or more variables using a truncated
|
@@ -351,6 +352,12 @@ def _minimize_tnc(fun, x0, args=(), jac=None, bounds=None,
|
|
351
352
|
maxfun : int
|
352
353
|
Maximum number of function evaluations. If None, `maxfun` is
|
353
354
|
set to max(100, 10*len(x0)). Defaults to None.
|
355
|
+
workers : int, map-like callable, optional
|
356
|
+
A map-like callable, such as `multiprocessing.Pool.map` for evaluating
|
357
|
+
any numerical differentiation in parallel.
|
358
|
+
This evaluation is carried out as ``workers(fun, iterable)``.
|
359
|
+
|
360
|
+
.. versionadded:: 1.16.0
|
354
361
|
"""
|
355
362
|
_check_unknown_options(unknown_options)
|
356
363
|
fmin = minfev
|
@@ -381,7 +388,7 @@ def _minimize_tnc(fun, x0, args=(), jac=None, bounds=None,
|
|
381
388
|
|
382
389
|
sf = _prepare_scalar_function(fun, x0, jac=jac, args=args, epsilon=eps,
|
383
390
|
finite_diff_rel_step=finite_diff_rel_step,
|
384
|
-
bounds=new_bounds)
|
391
|
+
bounds=new_bounds, workers=workers)
|
385
392
|
func_and_grad = sf.fun_and_grad
|
386
393
|
|
387
394
|
"""
|
Binary file
|
Binary file
|
scipy/optimize/_trustregion.py
CHANGED
@@ -119,7 +119,8 @@ def _minimize_trust_region(fun, x0, args=(), jac=None, hess=None, hessp=None,
|
|
119
119
|
subproblem=None, initial_trust_radius=1.0,
|
120
120
|
max_trust_radius=1000.0, eta=0.15, gtol=1e-4,
|
121
121
|
maxiter=None, disp=False, return_all=False,
|
122
|
-
callback=None, inexact=True,
|
122
|
+
callback=None, inexact=True, workers=None,
|
123
|
+
**unknown_options):
|
123
124
|
"""
|
124
125
|
Minimization of scalar function of one or more variables using a
|
125
126
|
trust-region algorithm.
|
@@ -142,6 +143,13 @@ def _minimize_trust_region(fun, x0, args=(), jac=None, hess=None, hessp=None,
|
|
142
143
|
Accuracy to solve subproblems. If True requires less nonlinear
|
143
144
|
iterations, but more vector products. Only effective for method
|
144
145
|
trust-krylov.
|
146
|
+
workers : int, map-like callable, optional
|
147
|
+
A map-like callable, such as `multiprocessing.Pool.map` for evaluating
|
148
|
+
any numerical differentiation in parallel.
|
149
|
+
This evaluation is carried out as ``workers(fun, iterable)``.
|
150
|
+
Only for 'trust-krylov', 'trust-ncg'.
|
151
|
+
|
152
|
+
.. versionadded:: 1.16.0
|
145
153
|
|
146
154
|
This function is called by the `minimize` function.
|
147
155
|
It is not supposed to be called directly.
|
@@ -172,7 +180,13 @@ def _minimize_trust_region(fun, x0, args=(), jac=None, hess=None, hessp=None,
|
|
172
180
|
|
173
181
|
# A ScalarFunction representing the problem. This caches calls to fun, jac,
|
174
182
|
# hess.
|
175
|
-
|
183
|
+
# the workers kwd only has an effect for trust-ncg, trust-krylov when
|
184
|
+
# estimating the Hessian with finite-differences. It's never used
|
185
|
+
# during calculation of jacobian, because callables are required for all
|
186
|
+
# methods.
|
187
|
+
sf = _prepare_scalar_function(
|
188
|
+
fun, x0, jac=jac, hess=hess, args=args, workers=workers
|
189
|
+
)
|
176
190
|
fun = sf.fun
|
177
191
|
jac = sf.grad
|
178
192
|
if callable(hess):
|
@@ -285,10 +299,10 @@ def _minimize_trust_region(fun, x0, args=(), jac=None, hess=None, hessp=None,
|
|
285
299
|
else:
|
286
300
|
warnings.warn(status_messages[warnflag], RuntimeWarning, stacklevel=3)
|
287
301
|
print(f" Current function value: {m.fun:f}")
|
288
|
-
print(" Iterations:
|
289
|
-
print(" Function evaluations:
|
290
|
-
print(" Gradient evaluations:
|
291
|
-
print(" Hessian evaluations:
|
302
|
+
print(f" Iterations: {k:d}")
|
303
|
+
print(f" Function evaluations: {sf.nfev:d}")
|
304
|
+
print(f" Gradient evaluations: {sf.ngev:d}")
|
305
|
+
print(f" Hessian evaluations: {sf.nhev + nhessp[0]:d}")
|
292
306
|
|
293
307
|
result = OptimizeResult(x=x, success=(warnflag == 0), status=warnflag,
|
294
308
|
fun=m.fun, jac=m.jac, nfev=sf.nfev, njev=sf.ngev,
|
@@ -27,7 +27,7 @@ class CanonicalConstraint:
|
|
27
27
|
jac : callable
|
28
28
|
Function to evaluate the Jacobian of the constraint. The signature
|
29
29
|
is ``jac(x) -> J_eq, J_ineq``, where ``J_eq`` and ``J_ineq`` are
|
30
|
-
either ndarray of
|
30
|
+
either ndarray of csr_array of shapes (n_eq, n) and (n_ineq, n),
|
31
31
|
respectively.
|
32
32
|
hess : callable
|
33
33
|
Function to evaluate the Hessian of the constraints multiplied
|
@@ -77,7 +77,7 @@ class CanonicalConstraint:
|
|
77
77
|
"""
|
78
78
|
empty_fun = np.empty(0)
|
79
79
|
empty_jac = np.empty((0, n))
|
80
|
-
empty_hess = sps.
|
80
|
+
empty_hess = sps.csr_array((n, n))
|
81
81
|
|
82
82
|
def fun(x):
|
83
83
|
return empty_fun, empty_fun
|
@@ -158,7 +158,7 @@ class CanonicalConstraint:
|
|
158
158
|
keep_feasible = np.empty(0, dtype=bool)
|
159
159
|
|
160
160
|
if cfun.sparse_jacobian:
|
161
|
-
empty_jac = sps.
|
161
|
+
empty_jac = sps.csr_array((0, n))
|
162
162
|
else:
|
163
163
|
empty_jac = np.empty((0, n))
|
164
164
|
|
@@ -174,7 +174,7 @@ class CanonicalConstraint:
|
|
174
174
|
empty_fun = np.empty(0)
|
175
175
|
n = cfun.n
|
176
176
|
if cfun.sparse_jacobian:
|
177
|
-
empty_jac = sps.
|
177
|
+
empty_jac = sps.csr_array((0, n))
|
178
178
|
else:
|
179
179
|
empty_jac = np.empty((0, n))
|
180
180
|
|
@@ -185,7 +185,7 @@ class CanonicalConstraint:
|
|
185
185
|
empty_fun = np.empty(0)
|
186
186
|
n = cfun.n
|
187
187
|
if cfun.sparse_jacobian:
|
188
|
-
empty_jac = sps.
|
188
|
+
empty_jac = sps.csr_array((0, n))
|
189
189
|
else:
|
190
190
|
empty_jac = np.empty((0, n))
|
191
191
|
|
@@ -225,7 +225,7 @@ class CanonicalConstraint:
|
|
225
225
|
empty_fun = np.empty(0)
|
226
226
|
n = cfun.n
|
227
227
|
if cfun.sparse_jacobian:
|
228
|
-
empty_jac = sps.
|
228
|
+
empty_jac = sps.csr_array((0, n))
|
229
229
|
else:
|
230
230
|
empty_jac = np.empty((0, n))
|
231
231
|
|
@@ -379,7 +379,7 @@ def initial_constraints_as_canonical(n, prepared_constraints, sparse_jacobian):
|
|
379
379
|
|
380
380
|
if sparse_jacobian:
|
381
381
|
vstack = sps.vstack
|
382
|
-
empty = sps.
|
382
|
+
empty = sps.csr_array((0, n))
|
383
383
|
else:
|
384
384
|
vstack = np.vstack
|
385
385
|
empty = np.empty((0, n))
|
@@ -1,6 +1,6 @@
|
|
1
1
|
"""Byrd-Omojokun Trust-Region SQP method."""
|
2
2
|
|
3
|
-
from scipy.sparse import
|
3
|
+
from scipy.sparse import eye_array as speye
|
4
4
|
from .projections import projections
|
5
5
|
from .qp_subproblem import modified_dogleg, projected_cg, box_intersections
|
6
6
|
import numpy as np
|