scipy 1.15.3__cp313-cp313t-macosx_14_0_arm64.whl → 1.16.0rc2__cp313-cp313t-macosx_14_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scipy/__config__.py +3 -3
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-313t-darwin.so +0 -0
- scipy/_lib/_array_api.py +486 -161
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_bunch.py +4 -0
- scipy/_lib/_ccallback_c.cpython-313t-darwin.so +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_deprecation_call.cpython-313t-darwin.so +0 -0
- scipy/_lib/_testutils.py +6 -2
- scipy/_lib/_util.py +222 -125
- scipy/_lib/array_api_compat/__init__.py +4 -4
- scipy/_lib/array_api_compat/_internal.py +19 -6
- scipy/_lib/array_api_compat/common/__init__.py +1 -1
- scipy/_lib/array_api_compat/common/_aliases.py +365 -193
- scipy/_lib/array_api_compat/common/_fft.py +94 -64
- scipy/_lib/array_api_compat/common/_helpers.py +413 -180
- scipy/_lib/array_api_compat/common/_linalg.py +116 -40
- scipy/_lib/array_api_compat/common/_typing.py +179 -10
- scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
- scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
- scipy/_lib/array_api_compat/cupy/_info.py +16 -6
- scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
- scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
- scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
- scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
- scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
- scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
- scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
- scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
- scipy/_lib/array_api_compat/numpy/_info.py +36 -16
- scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
- scipy/_lib/array_api_compat/numpy/fft.py +11 -5
- scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
- scipy/_lib/array_api_compat/torch/__init__.py +3 -5
- scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
- scipy/_lib/array_api_compat/torch/_info.py +27 -16
- scipy/_lib/array_api_compat/torch/_typing.py +3 -0
- scipy/_lib/array_api_compat/torch/fft.py +17 -18
- scipy/_lib/array_api_compat/torch/linalg.py +16 -16
- scipy/_lib/array_api_extra/__init__.py +26 -3
- scipy/_lib/array_api_extra/_delegation.py +171 -0
- scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_at.py +463 -0
- scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
- scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
- scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
- scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
- scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
- scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
- scipy/_lib/array_api_extra/testing.py +359 -0
- scipy/_lib/decorator.py +2 -2
- scipy/_lib/doccer.py +1 -7
- scipy/_lib/messagestream.cpython-313t-darwin.so +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/test__util.py +105 -121
- scipy/_lib/tests/test_array_api.py +166 -35
- scipy/_lib/tests/test_bunch.py +7 -0
- scipy/_lib/tests/test_ccallback.py +2 -10
- scipy/_lib/tests/test_public_api.py +13 -0
- scipy/cluster/_hierarchy.cpython-313t-darwin.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-313t-darwin.so +0 -0
- scipy/cluster/_vq.cpython-313t-darwin.so +0 -0
- scipy/cluster/hierarchy.py +393 -223
- scipy/cluster/tests/test_hierarchy.py +273 -335
- scipy/cluster/tests/test_vq.py +45 -61
- scipy/cluster/vq.py +39 -35
- scipy/conftest.py +263 -157
- scipy/constants/_constants.py +4 -1
- scipy/constants/tests/test_codata.py +2 -2
- scipy/constants/tests/test_constants.py +11 -18
- scipy/datasets/_download_all.py +15 -1
- scipy/datasets/_fetchers.py +7 -1
- scipy/datasets/_utils.py +1 -1
- scipy/differentiate/_differentiate.py +25 -25
- scipy/differentiate/tests/test_differentiate.py +24 -25
- scipy/fft/_basic.py +20 -0
- scipy/fft/_helper.py +3 -34
- scipy/fft/_pocketfft/helper.py +29 -1
- scipy/fft/_pocketfft/tests/test_basic.py +2 -4
- scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
- scipy/fft/_realtransforms.py +13 -0
- scipy/fft/tests/test_basic.py +27 -25
- scipy/fft/tests/test_fftlog.py +16 -7
- scipy/fft/tests/test_helper.py +18 -34
- scipy/fft/tests/test_real_transforms.py +8 -10
- scipy/fftpack/convolve.cpython-313t-darwin.so +0 -0
- scipy/fftpack/tests/test_basic.py +2 -4
- scipy/fftpack/tests/test_real_transforms.py +8 -9
- scipy/integrate/_bvp.py +9 -3
- scipy/integrate/_cubature.py +3 -2
- scipy/integrate/_dop.cpython-313t-darwin.so +0 -0
- scipy/integrate/_lsoda.cpython-313t-darwin.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-313t-darwin.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-313t-darwin.so +0 -0
- scipy/integrate/_quadpack_py.py +11 -7
- scipy/integrate/_quadrature.py +3 -3
- scipy/integrate/_rules/_base.py +2 -2
- scipy/integrate/_tanhsinh.py +48 -47
- scipy/integrate/_test_odeint_banded.cpython-313t-darwin.so +0 -0
- scipy/integrate/_vode.cpython-313t-darwin.so +0 -0
- scipy/integrate/tests/test__quad_vec.py +0 -6
- scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
- scipy/integrate/tests/test_cubature.py +21 -35
- scipy/integrate/tests/test_quadrature.py +6 -8
- scipy/integrate/tests/test_tanhsinh.py +56 -48
- scipy/interpolate/__init__.py +70 -58
- scipy/interpolate/_bary_rational.py +22 -22
- scipy/interpolate/_bsplines.py +119 -66
- scipy/interpolate/_cubic.py +65 -50
- scipy/interpolate/_dfitpack.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_dierckx.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_fitpack.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_fitpack2.py +9 -6
- scipy/interpolate/_fitpack_impl.py +32 -26
- scipy/interpolate/_fitpack_repro.py +23 -19
- scipy/interpolate/_interpnd.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_interpolate.py +30 -12
- scipy/interpolate/_ndbspline.py +13 -18
- scipy/interpolate/_ndgriddata.py +5 -8
- scipy/interpolate/_polyint.py +95 -31
- scipy/interpolate/_ppoly.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-313t-darwin.so +0 -0
- scipy/interpolate/dfitpack.py +0 -20
- scipy/interpolate/interpnd.py +1 -2
- scipy/interpolate/tests/test_bary_rational.py +2 -2
- scipy/interpolate/tests/test_bsplines.py +97 -1
- scipy/interpolate/tests/test_fitpack2.py +39 -1
- scipy/interpolate/tests/test_interpnd.py +32 -20
- scipy/interpolate/tests/test_interpolate.py +48 -4
- scipy/interpolate/tests/test_rgi.py +2 -1
- scipy/io/_fast_matrix_market/__init__.py +2 -0
- scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
- scipy/io/_harwell_boeing/hb.py +7 -11
- scipy/io/_idl.py +5 -7
- scipy/io/_netcdf.py +15 -5
- scipy/io/_test_fortran.cpython-313t-darwin.so +0 -0
- scipy/io/arff/tests/test_arffread.py +3 -3
- scipy/io/matlab/__init__.py +5 -3
- scipy/io/matlab/_mio.py +4 -1
- scipy/io/matlab/_mio5.py +19 -13
- scipy/io/matlab/_mio5_utils.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/tests/test_mio.py +46 -18
- scipy/io/matlab/tests/test_mio_funcs.py +1 -1
- scipy/io/tests/test_mmio.py +7 -1
- scipy/io/tests/test_wavfile.py +41 -0
- scipy/io/wavfile.py +57 -10
- scipy/linalg/_basic.py +113 -86
- scipy/linalg/_cythonized_array_utils.cpython-313t-darwin.so +0 -0
- scipy/linalg/_decomp.py +22 -9
- scipy/linalg/_decomp_cholesky.py +28 -13
- scipy/linalg/_decomp_cossin.py +45 -30
- scipy/linalg/_decomp_interpolative.cpython-313t-darwin.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-313t-darwin.so +0 -0
- scipy/linalg/_decomp_polar.py +2 -0
- scipy/linalg/_decomp_qr.py +6 -2
- scipy/linalg/_decomp_qz.py +3 -0
- scipy/linalg/_decomp_schur.py +3 -1
- scipy/linalg/_decomp_svd.py +13 -2
- scipy/linalg/_decomp_update.cpython-313t-darwin.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-313t-darwin.so +0 -0
- scipy/linalg/_flapack.cpython-313t-darwin.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-darwin.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-313t-darwin.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-313t-darwin.so +0 -0
- scipy/linalg/cython_lapack.cpython-313t-darwin.so +0 -0
- scipy/linalg/lapack.py +22 -2
- scipy/linalg/tests/_cython_examples/meson.build +7 -0
- scipy/linalg/tests/test_basic.py +31 -16
- scipy/linalg/tests/test_batch.py +588 -0
- scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
- scipy/linalg/tests/test_decomp.py +40 -3
- scipy/linalg/tests/test_decomp_cossin.py +14 -0
- scipy/linalg/tests/test_decomp_ldl.py +1 -1
- scipy/linalg/tests/test_lapack.py +115 -7
- scipy/linalg/tests/test_matfuncs.py +157 -102
- scipy/linalg/tests/test_procrustes.py +0 -7
- scipy/linalg/tests/test_solve_toeplitz.py +1 -1
- scipy/linalg/tests/test_special_matrices.py +1 -5
- scipy/ndimage/__init__.py +1 -0
- scipy/ndimage/_cytest.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_delegators.py +8 -2
- scipy/ndimage/_filters.py +453 -5
- scipy/ndimage/_interpolation.py +36 -6
- scipy/ndimage/_measurements.py +4 -2
- scipy/ndimage/_morphology.py +5 -0
- scipy/ndimage/_nd_image.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_support_alternative_backends.py +18 -6
- scipy/ndimage/tests/test_filters.py +370 -259
- scipy/ndimage/tests/test_fourier.py +7 -9
- scipy/ndimage/tests/test_interpolation.py +68 -61
- scipy/ndimage/tests/test_measurements.py +18 -35
- scipy/ndimage/tests/test_morphology.py +143 -131
- scipy/ndimage/tests/test_splines.py +1 -3
- scipy/odr/__odrpack.cpython-313t-darwin.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-313t-darwin.so +0 -0
- scipy/optimize/_bracket.py +17 -24
- scipy/optimize/_chandrupatla.py +9 -10
- scipy/optimize/_cobyla_py.py +104 -123
- scipy/optimize/_constraints.py +14 -10
- scipy/optimize/_differentiable_functions.py +371 -230
- scipy/optimize/_differentialevolution.py +4 -3
- scipy/optimize/_direct.cpython-313t-darwin.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lbfgsb.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lbfgsb_py.py +57 -16
- scipy/optimize/_linprog_doc.py +2 -2
- scipy/optimize/_linprog_highs.py +2 -2
- scipy/optimize/_linprog_ip.py +25 -10
- scipy/optimize/_linprog_util.py +14 -16
- scipy/optimize/_lsap.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lsq/least_squares.py +198 -126
- scipy/optimize/_lsq/lsq_linear.py +6 -6
- scipy/optimize/_lsq/trf.py +35 -8
- scipy/optimize/_milp.py +3 -1
- scipy/optimize/_minimize.py +105 -36
- scipy/optimize/_minpack.cpython-313t-darwin.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-313t-darwin.so +0 -0
- scipy/optimize/_nnls.py +20 -21
- scipy/optimize/_nonlin.py +34 -3
- scipy/optimize/_numdiff.py +288 -110
- scipy/optimize/_optimize.py +86 -48
- scipy/optimize/_pava_pybind.cpython-313t-darwin.so +0 -0
- scipy/optimize/_remove_redundancy.py +5 -5
- scipy/optimize/_root_scalar.py +1 -1
- scipy/optimize/_shgo.py +6 -0
- scipy/optimize/_shgo_lib/_complex.py +1 -1
- scipy/optimize/_slsqp_py.py +216 -124
- scipy/optimize/_slsqplib.cpython-313t-darwin.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-313t-darwin.so +0 -0
- scipy/optimize/_trustregion.py +20 -6
- scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
- scipy/optimize/_trustregion_constr/projections.py +12 -8
- scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
- scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
- scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
- scipy/optimize/_trustregion_exact.py +0 -1
- scipy/optimize/_zeros.cpython-313t-darwin.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-313t-darwin.so +0 -0
- scipy/optimize/slsqp.py +0 -1
- scipy/optimize/tests/test__basinhopping.py +1 -1
- scipy/optimize/tests/test__differential_evolution.py +4 -4
- scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
- scipy/optimize/tests/test__numdiff.py +66 -22
- scipy/optimize/tests/test__remove_redundancy.py +2 -2
- scipy/optimize/tests/test__shgo.py +9 -1
- scipy/optimize/tests/test_bracket.py +36 -46
- scipy/optimize/tests/test_chandrupatla.py +133 -135
- scipy/optimize/tests/test_cobyla.py +74 -45
- scipy/optimize/tests/test_constraints.py +1 -1
- scipy/optimize/tests/test_differentiable_functions.py +226 -6
- scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
- scipy/optimize/tests/test_least_squares.py +125 -13
- scipy/optimize/tests/test_linear_assignment.py +3 -3
- scipy/optimize/tests/test_linprog.py +3 -3
- scipy/optimize/tests/test_lsq_linear.py +6 -6
- scipy/optimize/tests/test_minimize_constrained.py +2 -2
- scipy/optimize/tests/test_minpack.py +4 -4
- scipy/optimize/tests/test_nnls.py +43 -3
- scipy/optimize/tests/test_nonlin.py +36 -0
- scipy/optimize/tests/test_optimize.py +95 -17
- scipy/optimize/tests/test_slsqp.py +36 -4
- scipy/optimize/tests/test_zeros.py +34 -1
- scipy/signal/__init__.py +12 -23
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +459 -241
- scipy/signal/_fir_filter_design.py +262 -90
- scipy/signal/_lti_conversion.py +3 -2
- scipy/signal/_ltisys.py +118 -91
- scipy/signal/_max_len_seq_inner.cpython-313t-darwin.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-313t-darwin.so +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_short_time_fft.py +519 -70
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +719 -399
- scipy/signal/_sigtools.cpython-313t-darwin.so +0 -0
- scipy/signal/_sosfilt.cpython-313t-darwin.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-313t-darwin.so +0 -0
- scipy/signal/_spline_filters.py +108 -68
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +4 -1
- scipy/signal/_upfirdn_apply.cpython-313t-darwin.so +0 -0
- scipy/signal/_waveforms.py +2 -11
- scipy/signal/_wavelets.py +1 -1
- scipy/signal/fir_filter_design.py +1 -0
- scipy/signal/spline.py +4 -11
- scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
- scipy/signal/tests/test_bsplines.py +114 -79
- scipy/signal/tests/test_cont2discrete.py +9 -2
- scipy/signal/tests/test_filter_design.py +721 -481
- scipy/signal/tests/test_fir_filter_design.py +332 -140
- scipy/signal/tests/test_savitzky_golay.py +4 -3
- scipy/signal/tests/test_short_time_fft.py +221 -3
- scipy/signal/tests/test_signaltools.py +2144 -1348
- scipy/signal/tests/test_spectral.py +50 -6
- scipy/signal/tests/test_splines.py +161 -96
- scipy/signal/tests/test_upfirdn.py +84 -50
- scipy/signal/tests/test_waveforms.py +20 -0
- scipy/signal/tests/test_windows.py +607 -466
- scipy/signal/windows/_windows.py +287 -148
- scipy/sparse/__init__.py +23 -4
- scipy/sparse/_base.py +270 -108
- scipy/sparse/_bsr.py +7 -4
- scipy/sparse/_compressed.py +59 -231
- scipy/sparse/_construct.py +90 -38
- scipy/sparse/_coo.py +115 -181
- scipy/sparse/_csc.py +4 -4
- scipy/sparse/_csparsetools.cpython-313t-darwin.so +0 -0
- scipy/sparse/_csr.py +2 -2
- scipy/sparse/_data.py +48 -48
- scipy/sparse/_dia.py +105 -18
- scipy/sparse/_dok.py +0 -23
- scipy/sparse/_index.py +4 -4
- scipy/sparse/_matrix.py +23 -0
- scipy/sparse/_sparsetools.cpython-313t-darwin.so +0 -0
- scipy/sparse/_sputils.py +37 -22
- scipy/sparse/base.py +0 -9
- scipy/sparse/bsr.py +0 -14
- scipy/sparse/compressed.py +0 -23
- scipy/sparse/construct.py +0 -6
- scipy/sparse/coo.py +0 -14
- scipy/sparse/csc.py +0 -3
- scipy/sparse/csgraph/_flow.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/tests/test_matching.py +14 -2
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
- scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
- scipy/sparse/csr.py +0 -5
- scipy/sparse/data.py +1 -6
- scipy/sparse/dia.py +0 -7
- scipy/sparse/dok.py +0 -10
- scipy/sparse/linalg/_dsolve/_superlu.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
- scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
- scipy/sparse/linalg/_interface.py +17 -18
- scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
- scipy/sparse/linalg/_isolve/iterative.py +51 -45
- scipy/sparse/linalg/_isolve/lgmres.py +6 -6
- scipy/sparse/linalg/_isolve/minres.py +5 -5
- scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
- scipy/sparse/linalg/_isolve/utils.py +2 -8
- scipy/sparse/linalg/_matfuncs.py +1 -1
- scipy/sparse/linalg/_norm.py +1 -1
- scipy/sparse/linalg/_propack/_cpropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
- scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
- scipy/sparse/tests/test_arithmetic1d.py +5 -2
- scipy/sparse/tests/test_base.py +214 -42
- scipy/sparse/tests/test_common1d.py +7 -7
- scipy/sparse/tests/test_construct.py +1 -1
- scipy/sparse/tests/test_coo.py +272 -4
- scipy/sparse/tests/test_sparsetools.py +5 -0
- scipy/sparse/tests/test_sputils.py +36 -7
- scipy/spatial/_ckdtree.cpython-313t-darwin.so +0 -0
- scipy/spatial/_distance_pybind.cpython-313t-darwin.so +0 -0
- scipy/spatial/_distance_wrap.cpython-313t-darwin.so +0 -0
- scipy/spatial/_hausdorff.cpython-313t-darwin.so +0 -0
- scipy/spatial/_qhull.cpython-313t-darwin.so +0 -0
- scipy/spatial/_voronoi.cpython-313t-darwin.so +0 -0
- scipy/spatial/distance.py +49 -42
- scipy/spatial/tests/test_distance.py +15 -1
- scipy/spatial/tests/test_kdtree.py +1 -0
- scipy/spatial/tests/test_qhull.py +7 -2
- scipy/spatial/transform/__init__.py +5 -3
- scipy/spatial/transform/_rigid_transform.cpython-313t-darwin.so +0 -0
- scipy/spatial/transform/_rotation.cpython-313t-darwin.so +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +1213 -832
- scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
- scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
- scipy/special/__init__.py +1 -47
- scipy/special/_add_newdocs.py +34 -772
- scipy/special/_basic.py +22 -25
- scipy/special/_comb.cpython-313t-darwin.so +0 -0
- scipy/special/_ellip_harm_2.cpython-313t-darwin.so +0 -0
- scipy/special/_gufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-313t-darwin.so +0 -0
- scipy/special/_special_ufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-313t-darwin.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-313t-darwin.so +0 -0
- scipy/special/_ufuncs_cxx.pxd +2 -15
- scipy/special/_ufuncs_cxx.pyx +5 -44
- scipy/special/_ufuncs_cxx_defs.h +2 -16
- scipy/special/_ufuncs_defs.h +0 -8
- scipy/special/cython_special.cpython-313t-darwin.so +0 -0
- scipy/special/cython_special.pxd +1 -1
- scipy/special/tests/_cython_examples/meson.build +10 -1
- scipy/special/tests/test_basic.py +153 -20
- scipy/special/tests/test_boost_ufuncs.py +3 -0
- scipy/special/tests/test_cdflib.py +35 -11
- scipy/special/tests/test_gammainc.py +16 -0
- scipy/special/tests/test_hyp2f1.py +2 -2
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_logsumexp.py +206 -64
- scipy/special/tests/test_mpmath.py +1 -0
- scipy/special/tests/test_nan_inputs.py +1 -1
- scipy/special/tests/test_orthogonal.py +17 -18
- scipy/special/tests/test_sf_error.py +3 -2
- scipy/special/tests/test_sph_harm.py +6 -7
- scipy/special/tests/test_support_alternative_backends.py +211 -76
- scipy/stats/__init__.py +4 -1
- scipy/stats/_ansari_swilk_statistics.cpython-313t-darwin.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-313t-darwin.so +0 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +277 -310
- scipy/stats/_correlation.py +1 -1
- scipy/stats/_covariance.py +6 -3
- scipy/stats/_discrete_distns.py +39 -32
- scipy/stats/_distn_infrastructure.py +39 -12
- scipy/stats/_distribution_infrastructure.py +900 -238
- scipy/stats/_entropy.py +9 -10
- scipy/{_lib → stats}/_finite_differences.py +1 -1
- scipy/stats/_hypotests.py +83 -50
- scipy/stats/_kde.py +53 -49
- scipy/stats/_ksstats.py +1 -1
- scipy/stats/_levy_stable/__init__.py +7 -15
- scipy/stats/_levy_stable/levyst.cpython-313t-darwin.so +0 -0
- scipy/stats/_morestats.py +118 -73
- scipy/stats/_mstats_basic.py +13 -17
- scipy/stats/_mstats_extras.py +8 -8
- scipy/stats/_multivariate.py +89 -113
- scipy/stats/_new_distributions.py +97 -20
- scipy/stats/_page_trend_test.py +12 -5
- scipy/stats/_probability_distribution.py +265 -43
- scipy/stats/_qmc.py +14 -9
- scipy/stats/_qmc_cy.cpython-313t-darwin.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-313t-darwin.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-313t-darwin.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-313t-darwin.so +0 -0
- scipy/stats/_stats.cpython-313t-darwin.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-313t-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-313t-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
- scipy/stats/_variation.py +6 -8
- scipy/stats/_wilcoxon.py +13 -7
- scipy/stats/tests/common_tests.py +6 -4
- scipy/stats/tests/test_axis_nan_policy.py +62 -24
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +379 -60
- scipy/stats/tests/test_continuous_basic.py +18 -12
- scipy/stats/tests/test_discrete_basic.py +14 -8
- scipy/stats/tests/test_discrete_distns.py +16 -16
- scipy/stats/tests/test_distributions.py +95 -75
- scipy/stats/tests/test_entropy.py +40 -48
- scipy/stats/tests/test_fit.py +4 -3
- scipy/stats/tests/test_hypotests.py +153 -24
- scipy/stats/tests/test_kdeoth.py +109 -41
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_morestats.py +79 -47
- scipy/stats/tests/test_mstats_basic.py +3 -3
- scipy/stats/tests/test_multivariate.py +434 -83
- scipy/stats/tests/test_qmc.py +13 -10
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +119 -112
- scipy/stats/tests/test_resampling.py +47 -56
- scipy/stats/tests/test_sampling.py +9 -4
- scipy/stats/tests/test_stats.py +799 -939
- scipy/stats/tests/test_variation.py +8 -6
- scipy/version.py +2 -2
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +559 -566
- scipy-1.16.0rc2.dist-info/WHEEL +6 -0
- scipy/_lib/array_api_extra/_funcs.py +0 -484
- scipy/_lib/array_api_extra/_typing.py +0 -8
- scipy/interpolate/_bspl.cpython-313t-darwin.so +0 -0
- scipy/optimize/_cobyla.cpython-313t-darwin.so +0 -0
- scipy/optimize/_cython_nnls.cpython-313t-darwin.so +0 -0
- scipy/optimize/_slsqp.cpython-313t-darwin.so +0 -0
- scipy/spatial/qhull_src/COPYING.txt +0 -38
- scipy/special/libsf_error_state.dylib +0 -0
- scipy/special/tests/test_log_softmax.py +0 -109
- scipy/special/tests/test_xsf_cuda.py +0 -114
- scipy/special/xsf/binom.h +0 -89
- scipy/special/xsf/cdflib.h +0 -100
- scipy/special/xsf/cephes/airy.h +0 -307
- scipy/special/xsf/cephes/besselpoly.h +0 -51
- scipy/special/xsf/cephes/beta.h +0 -257
- scipy/special/xsf/cephes/cbrt.h +0 -131
- scipy/special/xsf/cephes/chbevl.h +0 -85
- scipy/special/xsf/cephes/chdtr.h +0 -193
- scipy/special/xsf/cephes/const.h +0 -87
- scipy/special/xsf/cephes/ellie.h +0 -293
- scipy/special/xsf/cephes/ellik.h +0 -251
- scipy/special/xsf/cephes/ellpe.h +0 -107
- scipy/special/xsf/cephes/ellpk.h +0 -117
- scipy/special/xsf/cephes/expn.h +0 -260
- scipy/special/xsf/cephes/gamma.h +0 -398
- scipy/special/xsf/cephes/hyp2f1.h +0 -596
- scipy/special/xsf/cephes/hyperg.h +0 -361
- scipy/special/xsf/cephes/i0.h +0 -149
- scipy/special/xsf/cephes/i1.h +0 -158
- scipy/special/xsf/cephes/igam.h +0 -421
- scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
- scipy/special/xsf/cephes/igami.h +0 -313
- scipy/special/xsf/cephes/j0.h +0 -225
- scipy/special/xsf/cephes/j1.h +0 -198
- scipy/special/xsf/cephes/jv.h +0 -715
- scipy/special/xsf/cephes/k0.h +0 -164
- scipy/special/xsf/cephes/k1.h +0 -163
- scipy/special/xsf/cephes/kn.h +0 -243
- scipy/special/xsf/cephes/lanczos.h +0 -112
- scipy/special/xsf/cephes/ndtr.h +0 -275
- scipy/special/xsf/cephes/poch.h +0 -85
- scipy/special/xsf/cephes/polevl.h +0 -167
- scipy/special/xsf/cephes/psi.h +0 -194
- scipy/special/xsf/cephes/rgamma.h +0 -111
- scipy/special/xsf/cephes/scipy_iv.h +0 -811
- scipy/special/xsf/cephes/shichi.h +0 -248
- scipy/special/xsf/cephes/sici.h +0 -224
- scipy/special/xsf/cephes/sindg.h +0 -221
- scipy/special/xsf/cephes/tandg.h +0 -139
- scipy/special/xsf/cephes/trig.h +0 -58
- scipy/special/xsf/cephes/unity.h +0 -186
- scipy/special/xsf/cephes/zeta.h +0 -172
- scipy/special/xsf/config.h +0 -304
- scipy/special/xsf/digamma.h +0 -205
- scipy/special/xsf/error.h +0 -57
- scipy/special/xsf/evalpoly.h +0 -47
- scipy/special/xsf/expint.h +0 -266
- scipy/special/xsf/hyp2f1.h +0 -694
- scipy/special/xsf/iv_ratio.h +0 -173
- scipy/special/xsf/lambertw.h +0 -150
- scipy/special/xsf/loggamma.h +0 -163
- scipy/special/xsf/sici.h +0 -200
- scipy/special/xsf/tools.h +0 -427
- scipy/special/xsf/trig.h +0 -164
- scipy/special/xsf/wright_bessel.h +0 -843
- scipy/special/xsf/zlog1.h +0 -35
- scipy/stats/_mvn.cpython-313t-darwin.so +0 -0
- scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -6,10 +6,8 @@ from scipy._lib._array_api import assert_almost_equal
|
|
6
6
|
|
7
7
|
from scipy import ndimage
|
8
8
|
|
9
|
-
from scipy.conftest import array_api_compatible
|
10
9
|
skip_xp_backends = pytest.mark.skip_xp_backends
|
11
|
-
pytestmark = [
|
12
|
-
skip_xp_backends(cpu_only=True, exceptions=['cupy', 'jax.numpy'],)]
|
10
|
+
pytestmark = [skip_xp_backends(cpu_only=True, exceptions=['cupy', 'jax.numpy'])]
|
13
11
|
|
14
12
|
|
15
13
|
def get_spline_knot_values(order):
|
Binary file
|
scipy/optimize/_basinhopping.py
CHANGED
@@ -84,7 +84,7 @@ class BasinHoppingRunner:
|
|
84
84
|
self.energy = minres.fun
|
85
85
|
self.incumbent_minres = minres # best minimize result found so far
|
86
86
|
if self.disp:
|
87
|
-
print("basinhopping step
|
87
|
+
print(f"basinhopping step {self.nstep}: f {self.energy:g}")
|
88
88
|
|
89
89
|
# initialize storage class
|
90
90
|
self.storage = Storage(minres)
|
@@ -171,8 +171,10 @@ class BasinHoppingRunner:
|
|
171
171
|
if self.disp:
|
172
172
|
self.print_report(minres.fun, accept)
|
173
173
|
if new_global_min:
|
174
|
-
print(
|
175
|
-
|
174
|
+
print(
|
175
|
+
f"found new global minimum on step {self.nstep} with "
|
176
|
+
f"function value {self.energy:g}"
|
177
|
+
)
|
176
178
|
|
177
179
|
# save some variables as BasinHoppingRunner attributes
|
178
180
|
self.xtrial = minres.x
|
@@ -184,9 +186,11 @@ class BasinHoppingRunner:
|
|
184
186
|
def print_report(self, energy_trial, accept):
|
185
187
|
"""print a status update"""
|
186
188
|
minres = self.storage.get_lowest()
|
187
|
-
print(
|
188
|
-
|
189
|
-
|
189
|
+
print(
|
190
|
+
f"basinhopping step {self.nstep}: f {self.energy:g} "
|
191
|
+
f"trial_f {energy_trial:g} accepted {accept} "
|
192
|
+
f"lowest_f {minres.fun:g}"
|
193
|
+
)
|
190
194
|
|
191
195
|
|
192
196
|
class AdaptiveStepsize:
|
@@ -451,7 +455,9 @@ def basinhopping(func, x0, niter=100, T=1.0, stepsize=0.5,
|
|
451
455
|
cause of the termination. The ``OptimizeResult`` object returned by the
|
452
456
|
selected minimizer at the lowest minimum is also contained within this
|
453
457
|
object and can be accessed through the ``lowest_optimization_result``
|
454
|
-
attribute.
|
458
|
+
attribute. ``lowest_optimization_result`` will only be updated if a
|
459
|
+
local minimization was successful.
|
460
|
+
See `OptimizeResult` for a description of other attributes.
|
455
461
|
|
456
462
|
See Also
|
457
463
|
--------
|
Binary file
|
scipy/optimize/_bracket.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
import numpy as np
|
2
2
|
import scipy._lib._elementwise_iterative_method as eim
|
3
3
|
from scipy._lib._util import _RichResult
|
4
|
-
from scipy._lib._array_api import array_namespace, xp_ravel,
|
4
|
+
from scipy._lib._array_api import array_namespace, xp_ravel, xp_promote
|
5
5
|
|
6
6
|
_ELIMITS = -1 # used in _bracket_root
|
7
7
|
_ESTOPONESIDE = 2 # used in _bracket_root
|
@@ -14,13 +14,7 @@ def _bracket_root_iv(func, xl0, xr0, xmin, xmax, factor, args, maxiter):
|
|
14
14
|
if not np.iterable(args):
|
15
15
|
args = (args,)
|
16
16
|
|
17
|
-
xp = array_namespace(xl0)
|
18
|
-
xl0 = xp.asarray(xl0)[()]
|
19
|
-
if (not xp.isdtype(xl0.dtype, "numeric")
|
20
|
-
or xp.isdtype(xl0.dtype, "complex floating")):
|
21
|
-
raise ValueError('`xl0` must be numeric and real.')
|
22
|
-
if not xp.isdtype(xl0.dtype, "real floating"):
|
23
|
-
xl0 = xp.asarray(xl0, dtype=xp_default_dtype(xp))
|
17
|
+
xp = array_namespace(xl0, xr0, xmin, xmax, factor, *args)
|
24
18
|
|
25
19
|
# If xr0 is not supplied, fill with a dummy value for the sake of
|
26
20
|
# broadcasting. We need to wait until xmax has been validated to
|
@@ -33,8 +27,11 @@ def _bracket_root_iv(func, xl0, xr0, xmin, xmax, factor, args, maxiter):
|
|
33
27
|
xmin = -xp.inf if xmin is None else xmin
|
34
28
|
xmax = xp.inf if xmax is None else xmax
|
35
29
|
factor = 2. if factor is None else factor
|
36
|
-
xl0, xr0, xmin, xmax, factor =
|
37
|
-
xl0,
|
30
|
+
xl0, xr0, xmin, xmax, factor = xp_promote(
|
31
|
+
xl0, xr0, xmin, xmax, factor, broadcast=True, force_floating=True, xp=xp)
|
32
|
+
|
33
|
+
if not xp.isdtype(xl0.dtype, ('integral', 'real floating')):
|
34
|
+
raise ValueError('`xl0` must be numeric and real.')
|
38
35
|
|
39
36
|
if (not xp.isdtype(xr0.dtype, "numeric")
|
40
37
|
or xp.isdtype(xr0.dtype, "complex floating")):
|
@@ -57,7 +54,7 @@ def _bracket_root_iv(func, xl0, xr0, xmin, xmax, factor, args, maxiter):
|
|
57
54
|
# Calculate the default value of xr0 if a value has not been supplied.
|
58
55
|
# Be careful to ensure xr0 is not larger than xmax.
|
59
56
|
if xr0_not_supplied:
|
60
|
-
xr0 = xl0 + xp.minimum((xmax - xl0)/ 8,
|
57
|
+
xr0 = xl0 + xp.minimum((xmax - xl0)/ 8, 1.0)
|
61
58
|
xr0 = xp.astype(xr0, xl0.dtype, copy=False)
|
62
59
|
|
63
60
|
maxiter = xp.asarray(maxiter)
|
@@ -425,13 +422,7 @@ def _bracket_minimum_iv(func, xm0, xl0, xr0, xmin, xmax, factor, args, maxiter):
|
|
425
422
|
if not np.iterable(args):
|
426
423
|
args = (args,)
|
427
424
|
|
428
|
-
xp = array_namespace(xm0)
|
429
|
-
xm0 = xp.asarray(xm0)[()]
|
430
|
-
if (not xp.isdtype(xm0.dtype, "numeric")
|
431
|
-
or xp.isdtype(xm0.dtype, "complex floating")):
|
432
|
-
raise ValueError('`xm0` must be numeric and real.')
|
433
|
-
if not xp.isdtype(xm0.dtype, "real floating"):
|
434
|
-
xm0 = xp.asarray(xm0, dtype=xp_default_dtype(xp))
|
425
|
+
xp = array_namespace(xm0, xl0, xr0, xmin, xmax, factor, *args)
|
435
426
|
|
436
427
|
xmin = -xp.inf if xmin is None else xmin
|
437
428
|
xmax = xp.inf if xmax is None else xmax
|
@@ -450,10 +441,12 @@ def _bracket_minimum_iv(func, xm0, xl0, xr0, xmin, xmax, factor, args, maxiter):
|
|
450
441
|
xr0_not_supplied = True
|
451
442
|
|
452
443
|
factor = 2.0 if factor is None else factor
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
444
|
+
|
445
|
+
xm0, xl0, xr0, xmin, xmax, factor = xp_promote(
|
446
|
+
xm0, xl0, xr0, xmin, xmax, factor, broadcast=True, force_floating=True, xp=xp)
|
447
|
+
|
448
|
+
if not xp.isdtype(xm0.dtype, ('integral', 'real floating')):
|
449
|
+
raise ValueError('`xm0` must be numeric and real.')
|
457
450
|
|
458
451
|
if (not xp.isdtype(xl0.dtype, "numeric")
|
459
452
|
or xp.isdtype(xl0.dtype, "complex floating")):
|
@@ -481,10 +474,10 @@ def _bracket_minimum_iv(func, xm0, xl0, xr0, xmin, xmax, factor, args, maxiter):
|
|
481
474
|
# by the user. We need to be careful to ensure xl0 and xr0 are not outside
|
482
475
|
# of (xmin, xmax).
|
483
476
|
if xl0_not_supplied:
|
484
|
-
xl0 = xm0 - xp.minimum((xm0 - xmin)/16,
|
477
|
+
xl0 = xm0 - xp.minimum((xm0 - xmin)/16, 0.5)
|
485
478
|
xl0 = xp.astype(xl0, xm0.dtype, copy=False)
|
486
479
|
if xr0_not_supplied:
|
487
|
-
xr0 = xm0 + xp.minimum((xmax - xm0)/16,
|
480
|
+
xr0 = xm0 + xp.minimum((xmax - xm0)/16, 0.5)
|
488
481
|
xr0 = xp.astype(xr0, xm0.dtype, copy=False)
|
489
482
|
|
490
483
|
maxiter = xp.asarray(maxiter)
|
scipy/optimize/_chandrupatla.py
CHANGED
@@ -2,7 +2,7 @@ import math
|
|
2
2
|
import numpy as np
|
3
3
|
import scipy._lib._elementwise_iterative_method as eim
|
4
4
|
from scipy._lib._util import _RichResult
|
5
|
-
from scipy._lib._array_api import
|
5
|
+
from scipy._lib._array_api import xp_copy
|
6
6
|
|
7
7
|
# TODO:
|
8
8
|
# - (maybe?) don't use fancy indexing assignment
|
@@ -134,7 +134,7 @@ def _chandrupatla(func, a, b, *, args=(), xatol=None, xrtol=None,
|
|
134
134
|
func, xs, fs, args, shape, dtype, xp = temp
|
135
135
|
x1, x2 = xs
|
136
136
|
f1, f2 = fs
|
137
|
-
status = xp.full_like(x1,
|
137
|
+
status = xp.full_like(x1, eim._EINPROGRESS,
|
138
138
|
dtype=xp.int32) # in progress
|
139
139
|
nit, nfev = 0, 2 # two function evaluations performed above
|
140
140
|
finfo = xp.finfo(dtype)
|
@@ -187,7 +187,7 @@ def _chandrupatla(func, a, b, *, args=(), xatol=None, xrtol=None,
|
|
187
187
|
|
188
188
|
# If the bracket is no longer valid, report failure (unless a function
|
189
189
|
# tolerance is met, as detected above).
|
190
|
-
i = (
|
190
|
+
i = (xp.sign(work.f1) == xp.sign(work.f2)) & ~stop
|
191
191
|
NaN = xp.asarray(xp.nan, dtype=work.xmin.dtype)
|
192
192
|
work.xmin[i], work.fmin[i], work.status[i] = NaN, NaN, eim._ESIGNERR
|
193
193
|
stop[i] = True
|
@@ -219,7 +219,7 @@ def _chandrupatla(func, a, b, *, args=(), xatol=None, xrtol=None,
|
|
219
219
|
j = ((1 - xp.sqrt(1 - xi1)) < phi1) & (phi1 < xp.sqrt(xi1))
|
220
220
|
|
221
221
|
f1j, f2j, f3j, alphaj = work.f1[j], work.f2[j], work.f3[j], alpha[j]
|
222
|
-
t = xp.full_like(alpha,
|
222
|
+
t = xp.full_like(alpha, 0.5)
|
223
223
|
t[j] = (f1j / (f1j - f2j) * f3j / (f3j - f2j)
|
224
224
|
- alphaj * f1j / (f3j - f1j) * f2j / (f2j - f3j))
|
225
225
|
|
@@ -401,8 +401,7 @@ def _chandrupatla_minimize(func, x1, x2, x3, *, args=(), xatol=None,
|
|
401
401
|
x1, x2, x3 = xs
|
402
402
|
f1, f2, f3 = fs
|
403
403
|
phi = xp.asarray(0.5 + 0.5*5**0.5, dtype=dtype)[()] # golden ratio
|
404
|
-
status = xp.full_like(x1,
|
405
|
-
dtype=xp.int32) # in progress
|
404
|
+
status = xp.full_like(x1, eim._EINPROGRESS, dtype=xp.int32) # in progress
|
406
405
|
nit, nfev = 0, 3 # three function evaluations performed above
|
407
406
|
fatol = xp.finfo(dtype).smallest_normal if fatol is None else fatol
|
408
407
|
frtol = xp.finfo(dtype).smallest_normal if frtol is None else frtol
|
@@ -412,8 +411,8 @@ def _chandrupatla_minimize(func, x1, x2, x3, *, args=(), xatol=None,
|
|
412
411
|
# Ensure that x1 < x2 < x3 initially.
|
413
412
|
xs, fs = xp.stack((x1, x2, x3)), xp.stack((f1, f2, f3))
|
414
413
|
i = xp.argsort(xs, axis=0)
|
415
|
-
x1, x2, x3 =
|
416
|
-
f1, f2, f3 =
|
414
|
+
x1, x2, x3 = xp.take_along_axis(xs, i, axis=0) # data-apis/array-api#808
|
415
|
+
f1, f2, f3 = xp.take_along_axis(fs, i, axis=0) # data-apis/array-api#808
|
417
416
|
q0 = xp_copy(x3) # "At the start, q0 is set at x3..." ([1] after (7))
|
418
417
|
|
419
418
|
work = _RichResult(x1=x1, f1=f1, x2=x2, f2=f2, x3=x3, f3=f3, phi=phi,
|
@@ -449,7 +448,7 @@ def _chandrupatla_minimize(func, x1, x2, x3, *, args=(), xatol=None,
|
|
449
448
|
# tol away from x2."
|
450
449
|
# See also QBASIC code after "Accept Ql adjust if close to X2".
|
451
450
|
j = xp.abs(q1[i] - work.x2[i]) <= work.xtol[i]
|
452
|
-
xi[j] = work.x2[i][j] +
|
451
|
+
xi[j] = work.x2[i][j] + xp.sign(x32[i][j]) * work.xtol[i][j]
|
453
452
|
|
454
453
|
# "If condition (7) is not satisfied, golden sectioning of the larger
|
455
454
|
# interval is carried out to introduce the new point."
|
@@ -467,7 +466,7 @@ def _chandrupatla_minimize(func, x1, x2, x3, *, args=(), xatol=None,
|
|
467
466
|
# point. In QBASIC code, see "IF SGN(X-X2) = SGN(X3-X2) THEN...".
|
468
467
|
# There is an awful lot of data copying going on here; this would
|
469
468
|
# probably benefit from code optimization or implementation in Pythran.
|
470
|
-
i =
|
469
|
+
i = xp.sign(x - work.x2) == xp.sign(work.x3 - work.x2)
|
471
470
|
xi, x1i, x2i, x3i = x[i], work.x1[i], work.x2[i], work.x3[i],
|
472
471
|
fi, f1i, f2i, f3i = f[i], work.f1[i], work.f2[i], work.f3[i]
|
473
472
|
j = fi > f2i
|
scipy/optimize/_cobyla_py.py
CHANGED
@@ -10,39 +10,24 @@ Functions
|
|
10
10
|
|
11
11
|
"""
|
12
12
|
|
13
|
-
import
|
14
|
-
from threading import RLock
|
13
|
+
from inspect import signature
|
15
14
|
|
16
15
|
import numpy as np
|
17
|
-
from scipy.optimize import _cobyla as cobyla
|
18
16
|
from ._optimize import (OptimizeResult, _check_unknown_options,
|
19
17
|
_prepare_scalar_function)
|
20
|
-
|
21
|
-
|
22
|
-
except ImportError:
|
23
|
-
izip = zip
|
18
|
+
from ._constraints import NonlinearConstraint
|
19
|
+
|
24
20
|
|
25
21
|
__all__ = ['fmin_cobyla']
|
26
22
|
|
27
|
-
|
28
|
-
# due to an unknown f2py bug and can segfault,
|
29
|
-
# see gh-9658.
|
30
|
-
_module_lock = RLock()
|
31
|
-
def synchronized(func):
|
32
|
-
@functools.wraps(func)
|
33
|
-
def wrapper(*args, **kwargs):
|
34
|
-
with _module_lock:
|
35
|
-
return func(*args, **kwargs)
|
36
|
-
return wrapper
|
37
|
-
|
38
|
-
@synchronized
|
23
|
+
|
39
24
|
def fmin_cobyla(func, x0, cons, args=(), consargs=None, rhobeg=1.0,
|
40
25
|
rhoend=1e-4, maxfun=1000, disp=None, catol=2e-4,
|
41
26
|
*, callback=None):
|
42
27
|
"""
|
43
28
|
Minimize a function using the Constrained Optimization By Linear
|
44
|
-
Approximation (COBYLA) method. This method
|
45
|
-
|
29
|
+
Approximation (COBYLA) method. This method uses the pure-python implementation
|
30
|
+
of the algorithm from PRIMA.
|
46
31
|
|
47
32
|
Parameters
|
48
33
|
----------
|
@@ -113,6 +98,11 @@ def fmin_cobyla(func, x0, cons, args=(), consargs=None, rhobeg=1.0,
|
|
113
98
|
how these issues are resolved, as well as how the points v_i are
|
114
99
|
updated, refer to the source code or the references below.
|
115
100
|
|
101
|
+
.. versionchanged:: 1.16.0
|
102
|
+
The original Powell implementation was replaced by a pure
|
103
|
+
Python version from the PRIMA package, with bug fixes and
|
104
|
+
improvements being made.
|
105
|
+
|
116
106
|
|
117
107
|
References
|
118
108
|
----------
|
@@ -127,6 +117,9 @@ def fmin_cobyla(func, x0, cons, args=(), consargs=None, rhobeg=1.0,
|
|
127
117
|
Powell M.J.D. (2007), "A view of algorithms for optimization without
|
128
118
|
derivatives", Cambridge University Technical Report DAMTP 2007/NA03
|
129
119
|
|
120
|
+
Zhang Z. (2023), "PRIMA: Reference Implementation for Powell's Methods with
|
121
|
+
Modernization and Amelioration", https://www.libprima.net,
|
122
|
+
:doi:`10.5281/zenodo.8052654`
|
130
123
|
|
131
124
|
Examples
|
132
125
|
--------
|
@@ -169,7 +162,12 @@ def fmin_cobyla(func, x0, cons, args=(), consargs=None, rhobeg=1.0,
|
|
169
162
|
consargs = args
|
170
163
|
|
171
164
|
# build constraints
|
172
|
-
|
165
|
+
nlcs = []
|
166
|
+
for con in cons:
|
167
|
+
# Use default argument, otherwise the last `con` is captured by all wrapped_con
|
168
|
+
def wrapped_con(x, confunc=con):
|
169
|
+
return confunc(x, *consargs)
|
170
|
+
nlcs.append(NonlinearConstraint(wrapped_con, 0, np.inf))
|
173
171
|
|
174
172
|
# options
|
175
173
|
opts = {'rhobeg': rhobeg,
|
@@ -179,21 +177,21 @@ def fmin_cobyla(func, x0, cons, args=(), consargs=None, rhobeg=1.0,
|
|
179
177
|
'catol': catol,
|
180
178
|
'callback': callback}
|
181
179
|
|
182
|
-
sol = _minimize_cobyla(func, x0, args, constraints=
|
180
|
+
sol = _minimize_cobyla(func, x0, args, constraints=nlcs,
|
183
181
|
**opts)
|
184
182
|
if disp and not sol['success']:
|
185
183
|
print(f"COBYLA failed to find a solution: {sol.message}")
|
186
184
|
return sol['x']
|
187
185
|
|
188
186
|
|
189
|
-
@synchronized
|
190
187
|
def _minimize_cobyla(fun, x0, args=(), constraints=(),
|
191
188
|
rhobeg=1.0, tol=1e-4, maxiter=1000,
|
192
|
-
disp=
|
193
|
-
**unknown_options):
|
189
|
+
disp=0, catol=None, f_target=-np.inf,
|
190
|
+
callback=None, bounds=None, **unknown_options):
|
194
191
|
"""
|
195
192
|
Minimize a scalar function of one or more variables using the
|
196
193
|
Constrained Optimization BY Linear Approximation (COBYLA) algorithm.
|
194
|
+
This method uses the pure-python implementation of the algorithm from PRIMA.
|
197
195
|
|
198
196
|
Options
|
199
197
|
-------
|
@@ -202,74 +200,44 @@ def _minimize_cobyla(fun, x0, args=(), constraints=(),
|
|
202
200
|
tol : float
|
203
201
|
Final accuracy in the optimization (not precisely guaranteed).
|
204
202
|
This is a lower bound on the size of the trust region.
|
205
|
-
disp :
|
206
|
-
|
207
|
-
|
203
|
+
disp : int
|
204
|
+
Controls the frequency of output:
|
205
|
+
0. (default) There will be no printing
|
206
|
+
1. A message will be printed to the screen at the end of iteration, showing
|
207
|
+
the best vector of variables found and its objective function value
|
208
|
+
2. in addition to 1, each new value of RHO is printed to the screen,
|
209
|
+
with the best vector of variables so far and its objective function
|
210
|
+
value.
|
211
|
+
3. in addition to 2, each function evaluation with its variables will
|
212
|
+
be printed to the screen.
|
208
213
|
maxiter : int
|
209
214
|
Maximum number of function evaluations.
|
210
215
|
catol : float
|
211
216
|
Tolerance (absolute) for constraint violations
|
217
|
+
f_target : float
|
218
|
+
Stop if the objective function is less than `f_target`.
|
219
|
+
|
220
|
+
.. versionchanged:: 1.16.0
|
221
|
+
The original Powell implementation was replaced by a pure
|
222
|
+
Python version from the PRIMA package, with bug fixes and
|
223
|
+
improvements being made.
|
212
224
|
|
225
|
+
|
226
|
+
References
|
227
|
+
----------
|
228
|
+
Zhang Z. (2023), "PRIMA: Reference Implementation for Powell's Methods with
|
229
|
+
Modernization and Amelioration", https://www.libprima.net,
|
230
|
+
:doi:`10.5281/zenodo.8052654`
|
213
231
|
"""
|
232
|
+
from .._lib.pyprima import minimize
|
233
|
+
from .._lib.pyprima.common.infos import SMALL_TR_RADIUS, FTARGET_ACHIEVED
|
234
|
+
from .._lib.pyprima.common.message import get_info_string
|
214
235
|
_check_unknown_options(unknown_options)
|
215
|
-
maxfun = maxiter
|
216
236
|
rhoend = tol
|
217
|
-
iprint =
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
constraints = (constraints, )
|
222
|
-
|
223
|
-
if bounds:
|
224
|
-
i_lb = np.isfinite(bounds.lb)
|
225
|
-
if np.any(i_lb):
|
226
|
-
def lb_constraint(x, *args, **kwargs):
|
227
|
-
return x[i_lb] - bounds.lb[i_lb]
|
228
|
-
|
229
|
-
constraints.append({'type': 'ineq', 'fun': lb_constraint})
|
230
|
-
|
231
|
-
i_ub = np.isfinite(bounds.ub)
|
232
|
-
if np.any(i_ub):
|
233
|
-
def ub_constraint(x):
|
234
|
-
return bounds.ub[i_ub] - x[i_ub]
|
235
|
-
|
236
|
-
constraints.append({'type': 'ineq', 'fun': ub_constraint})
|
237
|
-
|
238
|
-
for ic, con in enumerate(constraints):
|
239
|
-
# check type
|
240
|
-
try:
|
241
|
-
ctype = con['type'].lower()
|
242
|
-
except KeyError as e:
|
243
|
-
raise KeyError('Constraint %d has no type defined.' % ic) from e
|
244
|
-
except TypeError as e:
|
245
|
-
raise TypeError('Constraints must be defined using a '
|
246
|
-
'dictionary.') from e
|
247
|
-
except AttributeError as e:
|
248
|
-
raise TypeError("Constraint's type must be a string.") from e
|
249
|
-
else:
|
250
|
-
if ctype != 'ineq':
|
251
|
-
raise ValueError(f"Constraints of type '{con['type']}' not handled by "
|
252
|
-
"COBYLA.")
|
253
|
-
|
254
|
-
# check function
|
255
|
-
if 'fun' not in con:
|
256
|
-
raise KeyError('Constraint %d has no function defined.' % ic)
|
257
|
-
|
258
|
-
# check extra arguments
|
259
|
-
if 'args' not in con:
|
260
|
-
con['args'] = ()
|
261
|
-
|
262
|
-
# m is the total number of constraint values
|
263
|
-
# it takes into account that some constraints may be vector-valued
|
264
|
-
cons_lengths = []
|
265
|
-
for c in constraints:
|
266
|
-
f = c['fun'](x0, *c['args'])
|
267
|
-
try:
|
268
|
-
cons_length = len(f)
|
269
|
-
except TypeError:
|
270
|
-
cons_length = 1
|
271
|
-
cons_lengths.append(cons_length)
|
272
|
-
m = sum(cons_lengths)
|
237
|
+
iprint = disp if disp is not None else 0
|
238
|
+
if iprint != 0 and iprint != 1 and iprint != 2 and iprint != 3:
|
239
|
+
raise ValueError(f'disp argument to minimize must be 0, 1, 2, or 3,\
|
240
|
+
received {iprint}')
|
273
241
|
|
274
242
|
# create the ScalarFunction, cobyla doesn't require derivative function
|
275
243
|
def _jac(x, *args):
|
@@ -277,40 +245,53 @@ def _minimize_cobyla(fun, x0, args=(), constraints=(),
|
|
277
245
|
|
278
246
|
sf = _prepare_scalar_function(fun, x0, args=args, jac=_jac)
|
279
247
|
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
248
|
+
if callback is not None:
|
249
|
+
sig = signature(callback)
|
250
|
+
if set(sig.parameters) == {"intermediate_result"}:
|
251
|
+
def wrapped_callback_intermediate(x, f, nf, tr, cstrv, nlconstrlist):
|
252
|
+
intermediate_result = OptimizeResult(x=np.copy(x), fun=f, nfev=nf,
|
253
|
+
nit=tr, maxcv=cstrv)
|
254
|
+
callback(intermediate_result=intermediate_result)
|
255
|
+
else:
|
256
|
+
def wrapped_callback_intermediate(x, f, nf, tr, cstrv, nlconstrlist):
|
257
|
+
callback(np.copy(x))
|
258
|
+
def wrapped_callback(x, f, nf, tr, cstrv, nlconstrlist):
|
259
|
+
try:
|
260
|
+
wrapped_callback_intermediate(x, f, nf, tr, cstrv, nlconstrlist)
|
261
|
+
return False
|
262
|
+
except StopIteration:
|
263
|
+
return True
|
264
|
+
else:
|
265
|
+
wrapped_callback = None
|
266
|
+
|
267
|
+
|
268
|
+
ctol = catol if catol is not None else np.sqrt(np.finfo(float).eps)
|
269
|
+
options = {
|
270
|
+
'rhobeg': rhobeg,
|
271
|
+
'rhoend': rhoend,
|
272
|
+
'maxfev': maxiter,
|
273
|
+
'iprint': iprint,
|
274
|
+
'ctol': ctol,
|
275
|
+
'ftarget': f_target,
|
276
|
+
}
|
277
|
+
|
278
|
+
result = minimize(sf.fun, x0, method='cobyla', bounds=bounds,
|
279
|
+
constraints=constraints, callback=wrapped_callback,
|
280
|
+
options=options)
|
281
|
+
|
282
|
+
|
283
|
+
if result.cstrv > ctol:
|
284
|
+
success = False
|
285
|
+
message = ('Did not converge to a solution satisfying the constraints. See '
|
286
|
+
'`maxcv` for the magnitude of the violation.')
|
287
|
+
else:
|
288
|
+
success = result.info == SMALL_TR_RADIUS or result.info == FTARGET_ACHIEVED
|
289
|
+
message = get_info_string('COBYLA', result.info)
|
290
|
+
|
291
|
+
return OptimizeResult(x=result.x,
|
292
|
+
status=result.info,
|
293
|
+
success=success,
|
294
|
+
message=message,
|
295
|
+
nfev=result.nf,
|
296
|
+
fun=result.f,
|
297
|
+
maxcv=result.cstrv)
|
scipy/optimize/_constraints.py
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
"""Constraints definition for minimize."""
|
2
|
+
from warnings import warn, catch_warnings, simplefilter, filterwarnings
|
3
|
+
|
2
4
|
import numpy as np
|
3
|
-
|
5
|
+
|
4
6
|
from ._differentiable_functions import (
|
5
|
-
VectorFunction, LinearVectorFunction, IdentityVectorFunction
|
7
|
+
VectorFunction, LinearVectorFunction, IdentityVectorFunction
|
8
|
+
)
|
9
|
+
from ._hessian_update_strategy import BFGS
|
6
10
|
from ._optimize import OptimizeWarning
|
7
|
-
|
8
|
-
from scipy.
|
11
|
+
|
12
|
+
from scipy._lib._sparse import issparse
|
9
13
|
|
10
14
|
|
11
15
|
def _arr_to_scalar(x):
|
@@ -48,7 +52,7 @@ class NonlinearConstraint:
|
|
48
52
|
'cs'} select a finite difference scheme for the numerical estimation.
|
49
53
|
A callable must have the following signature::
|
50
54
|
|
51
|
-
jac(x) -> {ndarray, sparse
|
55
|
+
jac(x) -> {ndarray, sparse array}, shape (m, n)
|
52
56
|
|
53
57
|
Default is '2-point'.
|
54
58
|
hess : {callable, '2-point', '3-point', 'cs', HessianUpdateStrategy, None}, optional
|
@@ -63,7 +67,7 @@ class NonlinearConstraint:
|
|
63
67
|
|
64
68
|
A callable must return the Hessian matrix of ``dot(fun, v)`` and
|
65
69
|
must have the following signature:
|
66
|
-
``hess(x, v) -> {LinearOperator, sparse
|
70
|
+
``hess(x, v) -> {LinearOperator, sparse array, array_like}, shape (n, n)``.
|
67
71
|
Here ``v`` is ndarray with shape (m,) containing Lagrange multipliers.
|
68
72
|
keep_feasible : array_like of bool, optional
|
69
73
|
Whether to keep the constraint components feasible throughout
|
@@ -73,7 +77,7 @@ class NonlinearConstraint:
|
|
73
77
|
Relative step size for the finite difference approximation. Default is
|
74
78
|
None, which will select a reasonable value automatically depending
|
75
79
|
on a finite difference scheme.
|
76
|
-
finite_diff_jac_sparsity: {None, array_like, sparse
|
80
|
+
finite_diff_jac_sparsity: {None, array_like, sparse array}, optional
|
77
81
|
Defines the sparsity structure of the Jacobian matrix for finite
|
78
82
|
difference estimation, its shape must be (m, n). If the Jacobian has
|
79
83
|
only few non-zero elements in *each* row, providing the sparsity
|
@@ -135,7 +139,7 @@ class LinearConstraint:
|
|
135
139
|
|
136
140
|
Parameters
|
137
141
|
----------
|
138
|
-
A : {array_like, sparse
|
142
|
+
A : {array_like, sparse array}, shape (m, n)
|
139
143
|
Matrix defining the constraint.
|
140
144
|
lb, ub : dense array_like, optional
|
141
145
|
Lower and upper limits on the constraint. Each array must have the
|
@@ -559,7 +563,7 @@ def old_constraint_to_new(ic, con):
|
|
559
563
|
try:
|
560
564
|
ctype = con['type'].lower()
|
561
565
|
except KeyError as e:
|
562
|
-
raise KeyError('Constraint
|
566
|
+
raise KeyError(f'Constraint {ic} has no type defined.') from e
|
563
567
|
except TypeError as e:
|
564
568
|
raise TypeError(
|
565
569
|
'Constraints must be a sequence of dictionaries.'
|
@@ -570,7 +574,7 @@ def old_constraint_to_new(ic, con):
|
|
570
574
|
if ctype not in ['eq', 'ineq']:
|
571
575
|
raise ValueError(f"Unknown constraint type '{con['type']}'.")
|
572
576
|
if 'fun' not in con:
|
573
|
-
raise ValueError('Constraint
|
577
|
+
raise ValueError(f'Constraint {ic} has no function defined.')
|
574
578
|
|
575
579
|
lb = 0
|
576
580
|
if ctype == 'eq':
|