scipy 1.15.3__cp312-cp312-musllinux_1_2_aarch64.whl → 1.16.0rc2__cp312-cp312-musllinux_1_2_aarch64.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 +10 -10
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/_array_api.py +486 -161
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_bunch.py +4 -0
- scipy/_lib/_ccallback_c.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_fpumode.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_ccallback.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/_test_deprecation_call.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/_test_deprecation_def.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/_testutils.py +6 -2
- scipy/_lib/_uarray/_uarray.cpython-312-aarch64-linux-musl.so +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.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/test__util.py +105 -121
- scipy/_lib/tests/test_array_api.py +166 -35
- scipy/_lib/tests/test_bunch.py +7 -0
- scipy/_lib/tests/test_ccallback.py +2 -10
- scipy/_lib/tests/test_public_api.py +13 -0
- scipy/cluster/_hierarchy.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/cluster/_vq.cpython-312-aarch64-linux-musl.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/pypocketfft.cpython-312-aarch64-linux-musl.so +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.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/fftpack/tests/test_basic.py +2 -4
- scipy/fftpack/tests/test_real_transforms.py +8 -9
- scipy/integrate/_bvp.py +9 -3
- scipy/integrate/_cubature.py +3 -2
- scipy/integrate/_dop.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/integrate/_lsoda.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-312-aarch64-linux-musl.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_multivariate.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/integrate/_test_odeint_banded.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/integrate/_vode.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/integrate/tests/test__quad_vec.py +0 -6
- scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
- scipy/integrate/tests/test_cubature.py +21 -35
- scipy/integrate/tests/test_quadrature.py +6 -8
- scipy/integrate/tests/test_tanhsinh.py +56 -48
- scipy/interpolate/__init__.py +70 -58
- scipy/interpolate/_bary_rational.py +22 -22
- scipy/interpolate/_bsplines.py +119 -66
- scipy/interpolate/_cubic.py +65 -50
- scipy/interpolate/_dfitpack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_dierckx.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_fitpack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_fitpack2.py +9 -6
- scipy/interpolate/_fitpack_impl.py +32 -26
- scipy/interpolate/_fitpack_repro.py +23 -19
- scipy/interpolate/_interpnd.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_interpolate.py +30 -12
- scipy/interpolate/_ndbspline.py +13 -18
- scipy/interpolate/_ndgriddata.py +5 -8
- scipy/interpolate/_polyint.py +95 -31
- scipy/interpolate/_ppoly.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-312-aarch64-linux-musl.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/_fast_matrix_market/_fmm_core.cpython-312-aarch64-linux-musl.so +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.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/io/arff/tests/test_arffread.py +3 -3
- scipy/io/matlab/__init__.py +5 -3
- scipy/io/matlab/_mio.py +4 -1
- scipy/io/matlab/_mio5.py +19 -13
- scipy/io/matlab/_mio5_utils.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/io/matlab/tests/test_mio.py +46 -18
- scipy/io/matlab/tests/test_mio_funcs.py +1 -1
- scipy/io/tests/test_mmio.py +7 -1
- scipy/io/tests/test_wavfile.py +41 -0
- scipy/io/wavfile.py +57 -10
- scipy/linalg/_basic.py +113 -86
- scipy/linalg/_cythonized_array_utils.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_decomp.py +22 -9
- scipy/linalg/_decomp_cholesky.py +28 -13
- scipy/linalg/_decomp_cossin.py +45 -30
- scipy/linalg/_decomp_interpolative.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_decomp_polar.py +2 -0
- scipy/linalg/_decomp_qr.py +6 -2
- scipy/linalg/_decomp_qz.py +3 -0
- scipy/linalg/_decomp_schur.py +3 -1
- scipy/linalg/_decomp_svd.py +13 -2
- scipy/linalg/_decomp_update.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_flapack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/cython_lapack.cpython-312-aarch64-linux-musl.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/_ctest.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_cytest.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_delegators.py +8 -2
- scipy/ndimage/_filters.py +453 -5
- scipy/ndimage/_interpolation.py +36 -6
- scipy/ndimage/_measurements.py +4 -2
- scipy/ndimage/_morphology.py +5 -0
- scipy/ndimage/_nd_image.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_support_alternative_backends.py +18 -6
- scipy/ndimage/tests/test_filters.py +370 -259
- scipy/ndimage/tests/test_fourier.py +7 -9
- scipy/ndimage/tests/test_interpolation.py +68 -61
- scipy/ndimage/tests/test_measurements.py +18 -35
- scipy/ndimage/tests/test_morphology.py +143 -131
- scipy/ndimage/tests/test_splines.py +1 -3
- scipy/odr/__odrpack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_bracket.py +17 -24
- scipy/optimize/_chandrupatla.py +9 -10
- scipy/optimize/_cobyla_py.py +104 -123
- scipy/optimize/_constraints.py +14 -10
- scipy/optimize/_differentiable_functions.py +371 -230
- scipy/optimize/_differentialevolution.py +4 -3
- scipy/optimize/_direct.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_highspy/_core.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_highspy/_highs_options.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_lbfgsb.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_lbfgsb_py.py +57 -16
- scipy/optimize/_linprog_doc.py +2 -2
- scipy/optimize/_linprog_highs.py +2 -2
- scipy/optimize/_linprog_ip.py +25 -10
- scipy/optimize/_linprog_util.py +14 -16
- scipy/optimize/_lsap.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_lsq/least_squares.py +198 -126
- scipy/optimize/_lsq/lsq_linear.py +6 -6
- scipy/optimize/_lsq/trf.py +35 -8
- scipy/optimize/_milp.py +3 -1
- scipy/optimize/_minimize.py +105 -36
- scipy/optimize/_minpack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_nnls.py +20 -21
- scipy/optimize/_nonlin.py +34 -3
- scipy/optimize/_numdiff.py +288 -110
- scipy/optimize/_optimize.py +86 -48
- scipy/optimize/_pava_pybind.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_remove_redundancy.py +5 -5
- scipy/optimize/_root_scalar.py +1 -1
- scipy/optimize/_shgo.py +6 -0
- scipy/optimize/_shgo_lib/_complex.py +1 -1
- scipy/optimize/_slsqp_py.py +216 -124
- scipy/optimize/_slsqplib.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_trustregion.py +20 -6
- scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
- scipy/optimize/_trustregion_constr/projections.py +12 -8
- scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
- scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
- scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
- scipy/optimize/_trustregion_exact.py +0 -1
- scipy/optimize/_zeros.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/slsqp.py +0 -1
- scipy/optimize/tests/test__basinhopping.py +1 -1
- scipy/optimize/tests/test__differential_evolution.py +4 -4
- scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
- scipy/optimize/tests/test__numdiff.py +66 -22
- scipy/optimize/tests/test__remove_redundancy.py +2 -2
- scipy/optimize/tests/test__shgo.py +9 -1
- scipy/optimize/tests/test_bracket.py +36 -46
- scipy/optimize/tests/test_chandrupatla.py +133 -135
- scipy/optimize/tests/test_cobyla.py +74 -45
- scipy/optimize/tests/test_constraints.py +1 -1
- scipy/optimize/tests/test_differentiable_functions.py +226 -6
- scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
- scipy/optimize/tests/test_least_squares.py +125 -13
- scipy/optimize/tests/test_linear_assignment.py +3 -3
- scipy/optimize/tests/test_linprog.py +3 -3
- scipy/optimize/tests/test_lsq_linear.py +6 -6
- scipy/optimize/tests/test_minimize_constrained.py +2 -2
- scipy/optimize/tests/test_minpack.py +4 -4
- scipy/optimize/tests/test_nnls.py +43 -3
- scipy/optimize/tests/test_nonlin.py +36 -0
- scipy/optimize/tests/test_optimize.py +95 -17
- scipy/optimize/tests/test_slsqp.py +36 -4
- scipy/optimize/tests/test_zeros.py +34 -1
- scipy/signal/__init__.py +12 -23
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +459 -241
- scipy/signal/_fir_filter_design.py +262 -90
- scipy/signal/_lti_conversion.py +3 -2
- scipy/signal/_ltisys.py +118 -91
- scipy/signal/_max_len_seq_inner.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_short_time_fft.py +519 -70
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +719 -399
- scipy/signal/_sigtools.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/signal/_sosfilt.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/signal/_spline_filters.py +108 -68
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +4 -1
- scipy/signal/_upfirdn_apply.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/signal/_waveforms.py +2 -11
- scipy/signal/_wavelets.py +1 -1
- scipy/signal/fir_filter_design.py +1 -0
- scipy/signal/spline.py +4 -11
- scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
- scipy/signal/tests/test_bsplines.py +114 -79
- scipy/signal/tests/test_cont2discrete.py +9 -2
- scipy/signal/tests/test_filter_design.py +721 -481
- scipy/signal/tests/test_fir_filter_design.py +332 -140
- scipy/signal/tests/test_savitzky_golay.py +4 -3
- scipy/signal/tests/test_short_time_fft.py +221 -3
- scipy/signal/tests/test_signaltools.py +2144 -1348
- scipy/signal/tests/test_spectral.py +50 -6
- scipy/signal/tests/test_splines.py +161 -96
- scipy/signal/tests/test_upfirdn.py +84 -50
- scipy/signal/tests/test_waveforms.py +20 -0
- scipy/signal/tests/test_windows.py +607 -466
- scipy/signal/windows/_windows.py +287 -148
- scipy/sparse/__init__.py +23 -4
- scipy/sparse/_base.py +270 -108
- scipy/sparse/_bsr.py +7 -4
- scipy/sparse/_compressed.py +59 -231
- scipy/sparse/_construct.py +90 -38
- scipy/sparse/_coo.py +115 -181
- scipy/sparse/_csc.py +4 -4
- scipy/sparse/_csparsetools.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/_csr.py +2 -2
- scipy/sparse/_data.py +48 -48
- scipy/sparse/_dia.py +105 -18
- scipy/sparse/_dok.py +0 -23
- scipy/sparse/_index.py +4 -4
- scipy/sparse/_matrix.py +23 -0
- scipy/sparse/_sparsetools.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/_sputils.py +37 -22
- scipy/sparse/base.py +0 -9
- scipy/sparse/bsr.py +0 -14
- scipy/sparse/compressed.py +0 -23
- scipy/sparse/construct.py +0 -6
- scipy/sparse/coo.py +0 -14
- scipy/sparse/csc.py +0 -3
- scipy/sparse/csgraph/_flow.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/tests/test_matching.py +14 -2
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
- scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
- scipy/sparse/csr.py +0 -5
- scipy/sparse/data.py +1 -6
- scipy/sparse/dia.py +0 -7
- scipy/sparse/dok.py +0 -10
- scipy/sparse/linalg/_dsolve/_superlu.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
- scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
- scipy/sparse/linalg/_interface.py +17 -18
- scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
- scipy/sparse/linalg/_isolve/iterative.py +51 -45
- scipy/sparse/linalg/_isolve/lgmres.py +6 -6
- scipy/sparse/linalg/_isolve/minres.py +5 -5
- scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
- scipy/sparse/linalg/_isolve/utils.py +2 -8
- scipy/sparse/linalg/_matfuncs.py +1 -1
- scipy/sparse/linalg/_norm.py +1 -1
- scipy/sparse/linalg/_propack/_cpropack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
- scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
- scipy/sparse/tests/test_arithmetic1d.py +5 -2
- scipy/sparse/tests/test_base.py +214 -42
- scipy/sparse/tests/test_common1d.py +7 -7
- scipy/sparse/tests/test_construct.py +1 -1
- scipy/sparse/tests/test_coo.py +272 -4
- scipy/sparse/tests/test_sparsetools.py +5 -0
- scipy/sparse/tests/test_sputils.py +36 -7
- scipy/spatial/_ckdtree.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/_distance_pybind.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/_distance_wrap.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/_hausdorff.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/_qhull.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/_voronoi.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/distance.py +49 -42
- scipy/spatial/tests/test_distance.py +15 -1
- scipy/spatial/tests/test_kdtree.py +1 -0
- scipy/spatial/tests/test_qhull.py +7 -2
- scipy/spatial/transform/__init__.py +5 -3
- scipy/spatial/transform/_rigid_transform.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/transform/_rotation.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +1213 -832
- scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
- scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
- scipy/special/__init__.py +1 -47
- scipy/special/_add_newdocs.py +34 -772
- scipy/special/_basic.py +22 -25
- scipy/special/_comb.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_ellip_harm_2.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_gufuncs.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_special_ufuncs.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_ufuncs_cxx.pxd +2 -15
- scipy/special/_ufuncs_cxx.pyx +5 -44
- scipy/special/_ufuncs_cxx_defs.h +2 -16
- scipy/special/_ufuncs_defs.h +0 -8
- scipy/special/cython_special.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/cython_special.pxd +1 -1
- scipy/special/tests/_cython_examples/meson.build +10 -1
- scipy/special/tests/test_basic.py +153 -20
- scipy/special/tests/test_boost_ufuncs.py +3 -0
- scipy/special/tests/test_cdflib.py +35 -11
- scipy/special/tests/test_gammainc.py +16 -0
- scipy/special/tests/test_hyp2f1.py +2 -2
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_logsumexp.py +206 -64
- scipy/special/tests/test_mpmath.py +1 -0
- scipy/special/tests/test_nan_inputs.py +1 -1
- scipy/special/tests/test_orthogonal.py +17 -18
- scipy/special/tests/test_sf_error.py +3 -2
- scipy/special/tests/test_sph_harm.py +6 -7
- scipy/special/tests/test_support_alternative_backends.py +211 -76
- scipy/stats/__init__.py +4 -1
- scipy/stats/_ansari_swilk_statistics.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +277 -310
- scipy/stats/_correlation.py +1 -1
- scipy/stats/_covariance.py +6 -3
- scipy/stats/_discrete_distns.py +39 -32
- scipy/stats/_distn_infrastructure.py +39 -12
- scipy/stats/_distribution_infrastructure.py +900 -238
- scipy/stats/_entropy.py +9 -10
- scipy/{_lib → stats}/_finite_differences.py +1 -1
- scipy/stats/_hypotests.py +83 -50
- scipy/stats/_kde.py +53 -49
- scipy/stats/_ksstats.py +1 -1
- scipy/stats/_levy_stable/__init__.py +7 -15
- scipy/stats/_levy_stable/levyst.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_morestats.py +118 -73
- scipy/stats/_mstats_basic.py +13 -17
- scipy/stats/_mstats_extras.py +8 -8
- scipy/stats/_multivariate.py +89 -113
- scipy/stats/_new_distributions.py +97 -20
- scipy/stats/_page_trend_test.py +12 -5
- scipy/stats/_probability_distribution.py +265 -43
- scipy/stats/_qmc.py +14 -9
- scipy/stats/_qmc_cy.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_stats.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-312-aarch64-linux-musl.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 +1262 -1269
- scipy.libs/libgcc_s-69c45f16.so.1 +0 -0
- scipy.libs/libgfortran-db0b6589.so.5.0.0 +0 -0
- scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-1f1a71be.so.6.0.33} +0 -0
- scipy/_lib/array_api_extra/_funcs.py +0 -484
- scipy/_lib/array_api_extra/_typing.py +0 -8
- scipy/interpolate/_bspl.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_cobyla.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_cython_nnls.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_slsqp.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/qhull_src/COPYING.txt +0 -38
- scipy/special/libsf_error_state.so +0 -0
- scipy/special/tests/test_log_softmax.py +0 -109
- scipy/special/tests/test_xsf_cuda.py +0 -114
- scipy/special/xsf/binom.h +0 -89
- scipy/special/xsf/cdflib.h +0 -100
- scipy/special/xsf/cephes/airy.h +0 -307
- scipy/special/xsf/cephes/besselpoly.h +0 -51
- scipy/special/xsf/cephes/beta.h +0 -257
- scipy/special/xsf/cephes/cbrt.h +0 -131
- scipy/special/xsf/cephes/chbevl.h +0 -85
- scipy/special/xsf/cephes/chdtr.h +0 -193
- scipy/special/xsf/cephes/const.h +0 -87
- scipy/special/xsf/cephes/ellie.h +0 -293
- scipy/special/xsf/cephes/ellik.h +0 -251
- scipy/special/xsf/cephes/ellpe.h +0 -107
- scipy/special/xsf/cephes/ellpk.h +0 -117
- scipy/special/xsf/cephes/expn.h +0 -260
- scipy/special/xsf/cephes/gamma.h +0 -398
- scipy/special/xsf/cephes/hyp2f1.h +0 -596
- scipy/special/xsf/cephes/hyperg.h +0 -361
- scipy/special/xsf/cephes/i0.h +0 -149
- scipy/special/xsf/cephes/i1.h +0 -158
- scipy/special/xsf/cephes/igam.h +0 -421
- scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
- scipy/special/xsf/cephes/igami.h +0 -313
- scipy/special/xsf/cephes/j0.h +0 -225
- scipy/special/xsf/cephes/j1.h +0 -198
- scipy/special/xsf/cephes/jv.h +0 -715
- scipy/special/xsf/cephes/k0.h +0 -164
- scipy/special/xsf/cephes/k1.h +0 -163
- scipy/special/xsf/cephes/kn.h +0 -243
- scipy/special/xsf/cephes/lanczos.h +0 -112
- scipy/special/xsf/cephes/ndtr.h +0 -275
- scipy/special/xsf/cephes/poch.h +0 -85
- scipy/special/xsf/cephes/polevl.h +0 -167
- scipy/special/xsf/cephes/psi.h +0 -194
- scipy/special/xsf/cephes/rgamma.h +0 -111
- scipy/special/xsf/cephes/scipy_iv.h +0 -811
- scipy/special/xsf/cephes/shichi.h +0 -248
- scipy/special/xsf/cephes/sici.h +0 -224
- scipy/special/xsf/cephes/sindg.h +0 -221
- scipy/special/xsf/cephes/tandg.h +0 -139
- scipy/special/xsf/cephes/trig.h +0 -58
- scipy/special/xsf/cephes/unity.h +0 -186
- scipy/special/xsf/cephes/zeta.h +0 -172
- scipy/special/xsf/config.h +0 -304
- scipy/special/xsf/digamma.h +0 -205
- scipy/special/xsf/error.h +0 -57
- scipy/special/xsf/evalpoly.h +0 -47
- scipy/special/xsf/expint.h +0 -266
- scipy/special/xsf/hyp2f1.h +0 -694
- scipy/special/xsf/iv_ratio.h +0 -173
- scipy/special/xsf/lambertw.h +0 -150
- scipy/special/xsf/loggamma.h +0 -163
- scipy/special/xsf/sici.h +0 -200
- scipy/special/xsf/tools.h +0 -427
- scipy/special/xsf/trig.h +0 -164
- scipy/special/xsf/wright_bessel.h +0 -843
- scipy/special/xsf/zlog1.h +0 -35
- scipy/stats/_mvn.cpython-312-aarch64-linux-musl.so +0 -0
- scipy.libs/libgcc_s-7393e603.so.1 +0 -0
- scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -0,0 +1,226 @@
|
|
1
|
+
'''
|
2
|
+
This module contains subroutines concerning the geometry-improving of the interpolation set.
|
3
|
+
|
4
|
+
Translated from Zaikun Zhang's modern-Fortran reference implementation in PRIMA.
|
5
|
+
|
6
|
+
Dedicated to late Professor M. J. D. Powell FRS (1936--2015).
|
7
|
+
|
8
|
+
Python translation by Nickolai Belakovski.
|
9
|
+
'''
|
10
|
+
|
11
|
+
from ..common.consts import DEBUGGING
|
12
|
+
from ..common.linalg import isinv, matprod, inprod, norm, primasum, primapow2
|
13
|
+
import numpy as np
|
14
|
+
|
15
|
+
|
16
|
+
def setdrop_tr(ximproved, d, delta, rho, sim, simi):
|
17
|
+
'''
|
18
|
+
This function finds (the index) of a current interpolation point to be replaced with
|
19
|
+
the trust-region trial point. See (19)-(22) of the COBYLA paper.
|
20
|
+
N.B.:
|
21
|
+
1. If XIMPROVED == True, then JDROP > 0 so that D is included into XPT. Otherwise,
|
22
|
+
it is a bug.
|
23
|
+
2. COBYLA never sets JDROP = NUM_VARS
|
24
|
+
TODO: Check whether it improves the performance if JDROP = NUM_VARS is allowed when
|
25
|
+
XIMPROVED is True. Note that UPDATEXFC should be revised accordingly.
|
26
|
+
'''
|
27
|
+
|
28
|
+
# Local variables
|
29
|
+
itol = 0.1
|
30
|
+
|
31
|
+
# Sizes
|
32
|
+
num_vars = np.size(sim, 0)
|
33
|
+
|
34
|
+
# Preconditions
|
35
|
+
if DEBUGGING:
|
36
|
+
assert num_vars >= 1
|
37
|
+
assert np.size(d) == num_vars and all(np.isfinite(d))
|
38
|
+
assert delta >= rho and rho > 0
|
39
|
+
assert np.size(sim, 0) == num_vars and np.size(sim, 1) == num_vars + 1
|
40
|
+
assert np.isfinite(sim).all()
|
41
|
+
assert all(np.max(abs(sim[:, :num_vars]), axis=0) > 0)
|
42
|
+
assert np.size(simi, 0) == num_vars and np.size(simi, 1) == num_vars
|
43
|
+
assert np.isfinite(simi).all()
|
44
|
+
assert isinv(sim[:, :num_vars], simi, itol)
|
45
|
+
|
46
|
+
#====================#
|
47
|
+
# Calculation starts #
|
48
|
+
#====================#
|
49
|
+
|
50
|
+
# -------------------------------------------------------------------------------------------------- #
|
51
|
+
# The following code is Powell's scheme for defining JDROP.
|
52
|
+
# -------------------------------------------------------------------------------------------------- #
|
53
|
+
# ! JDROP = 0 by default. It cannot be removed, as JDROP may not be set below in some cases (e.g.,
|
54
|
+
# ! when XIMPROVED == FALSE, MAXVAL(ABS(SIMID)) <= 1, and MAXVAL(VETA) <= EDGMAX).
|
55
|
+
# jdrop = 0
|
56
|
+
#
|
57
|
+
# ! SIMID(J) is the value of the J-th Lagrange function at D. It is the counterpart of VLAG in UOBYQA
|
58
|
+
# ! and DEN in NEWUOA/BOBYQA/LINCOA, but it excludes the value of the (N+1)-th Lagrange function.
|
59
|
+
# simid = matprod(simi, d)
|
60
|
+
# if (any(abs(simid) > 1) .or. (ximproved .and. any(.not. is_nan(simid)))) then
|
61
|
+
# jdrop = int(maxloc(abs(simid), mask=(.not. is_nan(simid)), dim=1), kind(jdrop))
|
62
|
+
# !!MATLAB: [~, jdrop] = max(simid, [], 'omitnan');
|
63
|
+
# end if
|
64
|
+
#
|
65
|
+
# ! VETA(J) is the distance from the J-th vertex of the simplex to the best vertex, taking the trial
|
66
|
+
# ! point SIM(:, N+1) + D into account.
|
67
|
+
# if (ximproved) then
|
68
|
+
# veta = sqrt(sum((sim(:, 1:n) - spread(d, dim=2, ncopies=n))**2, dim=1))
|
69
|
+
# !!MATLAB: veta = sqrt(sum((sim(:, 1:n) - d).^2)); % d should be a column! Implicit expansion
|
70
|
+
# else
|
71
|
+
# veta = sqrt(sum(sim(:, 1:n)**2, dim=1))
|
72
|
+
# end if
|
73
|
+
#
|
74
|
+
# ! VSIG(J) (J=1, .., N) is the Euclidean distance from vertex J to the opposite face of the simplex.
|
75
|
+
# vsig = ONE / sqrt(sum(simi**2, dim=2))
|
76
|
+
# sigbar = abs(simid) * vsig
|
77
|
+
#
|
78
|
+
# ! The following JDROP will overwrite the previous one if its premise holds.
|
79
|
+
# mask = (veta > factor_delta * delta .and. (sigbar >= factor_alpha * delta .or. sigbar >= vsig))
|
80
|
+
# if (any(mask)) then
|
81
|
+
# jdrop = int(maxloc(veta, mask=mask, dim=1), kind(jdrop))
|
82
|
+
# !!MATLAB: etamax = max(veta(mask)); jdrop = find(mask & ~(veta < etamax), 1, 'first');
|
83
|
+
# end if
|
84
|
+
#
|
85
|
+
# ! Powell's code does not include the following instructions. With Powell's code, if SIMID consists
|
86
|
+
# ! of only NaN, then JDROP can be 0 even when XIMPROVED == TRUE (i.e., D reduces the merit function).
|
87
|
+
# ! With the following code, JDROP cannot be 0 when XIMPROVED == TRUE, unless VETA is all NaN, which
|
88
|
+
# ! should not happen if X0 does not contain NaN, the trust-region/geometry steps never contain NaN,
|
89
|
+
# ! and we exit once encountering an iterate containing Inf (due to overflow).
|
90
|
+
# if (ximproved .and. jdrop <= 0) then ! Write JDROP <= 0 instead of JDROP == 0 for robustness.
|
91
|
+
# jdrop = int(maxloc(veta, mask=(.not. is_nan(veta)), dim=1), kind(jdrop))
|
92
|
+
# !!MATLAB: [~, jdrop] = max(veta, [], 'omitnan');
|
93
|
+
# end if
|
94
|
+
# -------------------------------------------------------------------------------------------------- #
|
95
|
+
# Powell's scheme ends here.
|
96
|
+
# -------------------------------------------------------------------------------------------------- #
|
97
|
+
|
98
|
+
# The following definition of JDROP is inspired by SETDROP_TR in UOBYQA/NEWUOA/BOBYQA/LINCOA.
|
99
|
+
# It is simpler and works better than Powell's scheme. Note that we allow JDROP to be NUM_VARS+1 if
|
100
|
+
# XIMPROVED is True, whereas Powell's code does not.
|
101
|
+
# See also (4.1) of Scheinberg-Toint-2010: Self-Correcting Geometry in Model-Based Algorithms for
|
102
|
+
# Derivative-Free Unconstrained Optimization, which refers to the strategy here as the "combined
|
103
|
+
# distance/poisedness criteria".
|
104
|
+
|
105
|
+
# DISTSQ[j] is the square of the distance from the jth vertex of the simplex to get "best" point so
|
106
|
+
# far, taking the trial point SIM[:, NUM_VARS] + D into account.
|
107
|
+
distsq = np.zeros(np.size(sim, 1))
|
108
|
+
if ximproved:
|
109
|
+
distsq[:num_vars] = primasum(primapow2(sim[:, :num_vars] - np.tile(d, (num_vars, 1)).T), axis=0)
|
110
|
+
distsq[num_vars] = primasum(d*d)
|
111
|
+
else:
|
112
|
+
distsq[:num_vars] = primasum(primapow2(sim[:, :num_vars]), axis=0)
|
113
|
+
distsq[num_vars] = 0
|
114
|
+
|
115
|
+
weight = np.maximum(1, distsq / primapow2(np.maximum(rho, delta/10))) # Similar to Powell's NEWUOA code.
|
116
|
+
|
117
|
+
# Other possible definitions of weight. They work almost the same as the one above.
|
118
|
+
# weight = distsq # Similar to Powell's LINCOA code, but WRONG. See comments in LINCOA/geometry.f90.
|
119
|
+
# weight = max(1, max(25 * distsq / delta**2)) # Similar to Powell's BOBYQA code, works well.
|
120
|
+
# weight = max(1, max(10 * distsq / delta**2))
|
121
|
+
# weight = max(1, max(1e2 * distsq / delta**2))
|
122
|
+
# weight = max(1, max(distsq / rho**2)) ! Similar to Powell's UOBYQA
|
123
|
+
|
124
|
+
# If 0 <= j < NUM_VARS, SIMID[j] is the value of the jth Lagrange function at D; the value of the
|
125
|
+
# (NUM_VARS+1)th Lagrange function is 1 - sum(SIMID). [SIMID, 1 - sum(SIMID)] is the counterpart of
|
126
|
+
# VLAG in UOBYQA and DEN in NEWUOA/BOBYQA/LINCOA.
|
127
|
+
simid = matprod(simi, d)
|
128
|
+
score = weight * abs(np.array([*simid, 1 - primasum(simid)]))
|
129
|
+
|
130
|
+
# If XIMPROVED = False (D does not render a better X), set SCORE[NUM_VARS] = -1 to avoid JDROP = NUM_VARS.
|
131
|
+
if not ximproved:
|
132
|
+
score[num_vars] = -1
|
133
|
+
|
134
|
+
# score[j] is NaN implies SIMID[j] is NaN, but we want abs(SIMID) to be big. So we
|
135
|
+
# exclude such j.
|
136
|
+
score[np.isnan(score)] = -1
|
137
|
+
|
138
|
+
jdrop = None
|
139
|
+
# The following if statement works a bit better than
|
140
|
+
# `if any(score > 1) or (any(score > 0) and ximproved)` from Powell's UOBYQA and
|
141
|
+
# NEWUOA code.
|
142
|
+
if any(score > 0): # Powell's BOBYQA and LINCOA code.
|
143
|
+
jdrop = np.argmax(score)
|
144
|
+
|
145
|
+
if (ximproved and jdrop is None):
|
146
|
+
jdrop = np.argmax(distsq)
|
147
|
+
|
148
|
+
#==================#
|
149
|
+
# Calculation ends #
|
150
|
+
#==================#
|
151
|
+
|
152
|
+
# Postconditions
|
153
|
+
if DEBUGGING:
|
154
|
+
assert jdrop is None or (0 <= jdrop < num_vars + 1)
|
155
|
+
assert jdrop <= num_vars or ximproved
|
156
|
+
assert jdrop >= 0 or not ximproved
|
157
|
+
# JDROP >= 1 when XIMPROVED = TRUE unless NaN occurs in DISTSQ, which should not happen if the
|
158
|
+
# starting point does not contain NaN and the trust-region/geometry steps never contain NaN.
|
159
|
+
|
160
|
+
return jdrop
|
161
|
+
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
def geostep(jdrop, amat, bvec, conmat, cpen, cval, delbar, fval, simi):
|
166
|
+
'''
|
167
|
+
This function calculates a geometry step so that the geometry of the interpolation set is improved
|
168
|
+
when SIM[: JDROP_GEO] is replaced with SIM[:, NUM_VARS] + D. See (15)--(17) of the COBYLA paper.
|
169
|
+
'''
|
170
|
+
|
171
|
+
# Sizes
|
172
|
+
m_lcon = np.size(bvec, 0) if bvec is not None else 0
|
173
|
+
num_constraints = np.size(conmat, 0)
|
174
|
+
num_vars = np.size(simi, 0)
|
175
|
+
|
176
|
+
# Preconditions
|
177
|
+
if DEBUGGING:
|
178
|
+
assert num_constraints >= m_lcon >= 0
|
179
|
+
assert num_vars >= 1
|
180
|
+
assert delbar > 0
|
181
|
+
assert cpen > 0
|
182
|
+
assert np.size(simi, 0) == num_vars and np.size(simi, 1) == num_vars
|
183
|
+
assert np.isfinite(simi).all()
|
184
|
+
assert np.size(fval) == num_vars + 1 and not any(np.isnan(fval) | np.isposinf(fval))
|
185
|
+
assert np.size(conmat, 0) == num_constraints and np.size(conmat, 1) == num_vars + 1
|
186
|
+
assert not np.any(np.isnan(conmat) | np.isposinf(conmat))
|
187
|
+
assert np.size(cval) == num_vars + 1 and not any(cval < 0 | np.isnan(cval) | np.isposinf(cval))
|
188
|
+
assert 0 <= jdrop < num_vars
|
189
|
+
|
190
|
+
#====================#
|
191
|
+
# Calculation starts #
|
192
|
+
#====================#
|
193
|
+
|
194
|
+
# SIMI[JDROP, :] is a vector perpendicular to the face of the simplex to the opposite of vertex
|
195
|
+
# JDROP. Set D to the vector in this direction and with length DELBAR.
|
196
|
+
d = simi[jdrop, :]
|
197
|
+
d = delbar * (d / norm(d))
|
198
|
+
|
199
|
+
# The code below chooses the direction of D according to an approximation of the merit function.
|
200
|
+
# See (17) of the COBYLA paper and line 225 of Powell's cobylb.f.
|
201
|
+
|
202
|
+
# Calculate the coefficients of the linear approximations to the objective and constraint functions.
|
203
|
+
# N.B.: CONMAT and SIMI have been updated after the last trust-region step, but G and A have not.
|
204
|
+
# So we cannot pass G and A from outside.
|
205
|
+
g = matprod(fval[:num_vars] - fval[num_vars], simi)
|
206
|
+
A = np.zeros((num_vars, num_constraints))
|
207
|
+
A[:, :m_lcon] = amat.T if amat is not None else amat
|
208
|
+
A[:, m_lcon:] = matprod((conmat[m_lcon:, :num_vars] -
|
209
|
+
np.tile(conmat[m_lcon:, num_vars], (num_vars, 1)).T), simi).T
|
210
|
+
# CVPD and CVND are the predicted constraint violation of D and -D by the linear models.
|
211
|
+
cvpd = np.max(np.append(0, conmat[:, num_vars] + matprod(d, A)))
|
212
|
+
cvnd = np.max(np.append(0, conmat[:, num_vars] - matprod(d, A)))
|
213
|
+
if -inprod(d, g) + cpen * cvnd < inprod(d, g) + cpen * cvpd:
|
214
|
+
d *= -1
|
215
|
+
|
216
|
+
#==================#
|
217
|
+
# Calculation ends #
|
218
|
+
#==================#
|
219
|
+
|
220
|
+
# Postconditions
|
221
|
+
if DEBUGGING:
|
222
|
+
assert np.size(d) == num_vars and all(np.isfinite(d))
|
223
|
+
# In theory, ||S|| == DELBAR, which may be false due to rounding, but not too far.
|
224
|
+
# It is crucial to ensure that the geometry step is nonzero, which holds in theory.
|
225
|
+
assert 0.9 * delbar < np.linalg.norm(d) <= 1.1 * delbar
|
226
|
+
return d
|
@@ -0,0 +1,215 @@
|
|
1
|
+
'''
|
2
|
+
This module contains subroutines for initialization.
|
3
|
+
|
4
|
+
Translated from Zaikun Zhang's modern-Fortran reference implementation in PRIMA.
|
5
|
+
|
6
|
+
Dedicated to late Professor M. J. D. Powell FRS (1936--2015).
|
7
|
+
|
8
|
+
Python translation by Nickolai Belakovski.
|
9
|
+
'''
|
10
|
+
|
11
|
+
from ..common.checkbreak import checkbreak_con
|
12
|
+
from ..common.consts import DEBUGGING, REALMAX
|
13
|
+
from ..common.infos import INFO_DEFAULT
|
14
|
+
from ..common.evaluate import evaluate
|
15
|
+
from ..common.history import savehist
|
16
|
+
from ..common.linalg import inv
|
17
|
+
from ..common.message import fmsg
|
18
|
+
from ..common.selectx import savefilt
|
19
|
+
|
20
|
+
import numpy as np
|
21
|
+
|
22
|
+
def initxfc(calcfc, iprint, maxfun, constr0, amat, bvec, ctol, f0, ftarget, rhobeg, x0,
|
23
|
+
xhist, fhist, chist, conhist, maxhist):
|
24
|
+
'''
|
25
|
+
This subroutine does the initialization concerning X, function values, and
|
26
|
+
constraints.
|
27
|
+
'''
|
28
|
+
|
29
|
+
# Local variables
|
30
|
+
solver = 'COBYLA'
|
31
|
+
srname = "INITIALIZE"
|
32
|
+
|
33
|
+
# Sizes
|
34
|
+
num_constraints = np.size(constr0)
|
35
|
+
m_lcon = np.size(bvec) if bvec is not None else 0
|
36
|
+
m_nlcon = num_constraints - m_lcon
|
37
|
+
num_vars = np.size(x0)
|
38
|
+
|
39
|
+
# Preconditions
|
40
|
+
if DEBUGGING:
|
41
|
+
assert num_constraints >= 0, f'M >= 0 {srname}'
|
42
|
+
assert num_vars >= 1, f'N >= 1 {srname}'
|
43
|
+
assert abs(iprint) <= 3, f'IPRINT is 0, 1, -1, 2, -2, 3, or -3 {srname}'
|
44
|
+
# assert conmat.shape == (num_constraints , num_vars + 1), f'CONMAT.shape = [M, N+1] {srname}'
|
45
|
+
# assert cval.size == num_vars + 1, f'CVAL.size == N+1 {srname}'
|
46
|
+
# assert maxchist * (maxchist - maxhist) == 0, f'CHIST.shape == 0 or MAXHIST {srname}'
|
47
|
+
# assert conhist.shape[0] == num_constraints and maxconhist * (maxconhist - maxhist) == 0, 'CONHIST.shape[0] == num_constraints, SIZE(CONHIST, 2) == 0 or MAXHIST {srname)}'
|
48
|
+
# assert maxfhist * (maxfhist - maxhist) == 0, f'FHIST.shape == 0 or MAXHIST {srname}'
|
49
|
+
# assert xhist.shape[0] == num_vars and maxxhist * (maxxhist - maxhist) == 0, 'XHIST.shape[0] == N, SIZE(XHIST, 2) == 0 or MAXHIST {srname)}'
|
50
|
+
assert all(np.isfinite(x0)), f'X0 is finite {srname}'
|
51
|
+
assert rhobeg > 0, f'RHOBEG > 0 {srname}'
|
52
|
+
|
53
|
+
#====================#
|
54
|
+
# Calculation starts #
|
55
|
+
#====================#
|
56
|
+
|
57
|
+
# Initialize info to the default value. At return, a value different from this
|
58
|
+
# value will indicate an abnormal return
|
59
|
+
info = INFO_DEFAULT
|
60
|
+
|
61
|
+
# Initialize the simplex. It will be revised during the initialization.
|
62
|
+
sim = np.eye(num_vars, num_vars+1) * rhobeg
|
63
|
+
sim[:, num_vars] = x0
|
64
|
+
|
65
|
+
# Initialize the matrix simi. In most cases simi is overwritten, but not always.
|
66
|
+
simi = np.eye(num_vars) / rhobeg
|
67
|
+
|
68
|
+
# evaluated[j] = True iff the function/constraint of SIM[:, j] has been evaluated.
|
69
|
+
evaluated = np.zeros(num_vars+1, dtype=bool)
|
70
|
+
|
71
|
+
# Initialize fval
|
72
|
+
fval = np.zeros(num_vars+1) + REALMAX
|
73
|
+
cval = np.zeros(num_vars+1) + REALMAX
|
74
|
+
conmat = np.zeros((num_constraints, num_vars+1)) + REALMAX
|
75
|
+
|
76
|
+
|
77
|
+
for k in range(num_vars + 1):
|
78
|
+
x = sim[:, num_vars].copy()
|
79
|
+
# We will evaluate F corresponding to SIM(:, J).
|
80
|
+
if k == 0:
|
81
|
+
j = num_vars
|
82
|
+
f = f0
|
83
|
+
constr = constr0
|
84
|
+
else:
|
85
|
+
j = k - 1
|
86
|
+
x[j] += rhobeg
|
87
|
+
f, constr = evaluate(calcfc, x, m_nlcon, amat, bvec)
|
88
|
+
cstrv = np.max(np.append(0, constr))
|
89
|
+
|
90
|
+
# Print a message about the function/constraint evaluation according to IPRINT.
|
91
|
+
fmsg(solver, 'Initialization', iprint, k, rhobeg, f, x, cstrv, constr)
|
92
|
+
|
93
|
+
# Save X, F, CONSTR, CSTRV into the history.
|
94
|
+
savehist(maxhist, x, xhist, f, fhist, cstrv, chist, constr, conhist)
|
95
|
+
|
96
|
+
# Save F, CONSTR, and CSTRV to FVAL, CONMAT, and CVAL respectively.
|
97
|
+
evaluated[j] = True
|
98
|
+
fval[j] = f
|
99
|
+
conmat[:, j] = constr
|
100
|
+
cval[j] = cstrv
|
101
|
+
|
102
|
+
# Check whether to exit.
|
103
|
+
subinfo = checkbreak_con(maxfun, k, cstrv, ctol, f, ftarget, x)
|
104
|
+
if subinfo != INFO_DEFAULT:
|
105
|
+
info = subinfo
|
106
|
+
break
|
107
|
+
|
108
|
+
# Exchange the new vertex of the initial simplex with the optimal vertex if necessary.
|
109
|
+
# This is the ONLY part that is essentially non-parallel.
|
110
|
+
if j < num_vars and fval[j] < fval[num_vars]:
|
111
|
+
fval[j], fval[num_vars] = fval[num_vars], fval[j]
|
112
|
+
cval[j], cval[num_vars] = cval[num_vars], cval[j]
|
113
|
+
conmat[:, [j, num_vars]] = conmat[:, [num_vars, j]]
|
114
|
+
sim[:, num_vars] = x
|
115
|
+
sim[j, :j+1] = -rhobeg # SIM[:, :j+1] is lower triangular
|
116
|
+
|
117
|
+
nf = np.count_nonzero(evaluated)
|
118
|
+
|
119
|
+
if evaluated.all():
|
120
|
+
# Initialize SIMI to the inverse of SIM[:, :num_vars]
|
121
|
+
simi = inv(sim[:, :num_vars])
|
122
|
+
|
123
|
+
#==================#
|
124
|
+
# Calculation ends #
|
125
|
+
#==================#
|
126
|
+
|
127
|
+
# Postconditions
|
128
|
+
if DEBUGGING:
|
129
|
+
assert nf <= maxfun, f'NF <= MAXFUN {srname}'
|
130
|
+
assert evaluated.size == num_vars + 1, f'EVALUATED.size == Num_vars + 1 {srname}'
|
131
|
+
# assert chist.size == maxchist, f'CHIST.size == MAXCHIST {srname}'
|
132
|
+
# assert conhist.shape== (num_constraints, maxconhist), f'CONHIST.shape == [M, MAXCONHIST] {srname}'
|
133
|
+
assert conmat.shape == (num_constraints, num_vars + 1), f'CONMAT.shape = [M, N+1] {srname}'
|
134
|
+
assert not (np.isnan(conmat).any() or np.isneginf(conmat).any()), f'CONMAT does not contain NaN/-Inf {srname}'
|
135
|
+
assert cval.size == num_vars + 1 and not (any(cval < 0) or any(np.isnan(cval)) or any(np.isposinf(cval))), f'CVAL.shape == Num_vars+1 and CVAL does not contain negative values or NaN/+Inf {srname}'
|
136
|
+
# assert fhist.shape == maxfhist, f'FHIST.shape == MAXFHIST {srname}'
|
137
|
+
# assert maxfhist * (maxfhist - maxhist) == 0, f'FHIST.shape == 0 or MAXHIST {srname}'
|
138
|
+
assert fval.size == num_vars + 1 and not (any(np.isnan(fval)) or any(np.isposinf(fval))), f'FVAL.shape == Num_vars+1 and FVAL is not NaN/+Inf {srname}'
|
139
|
+
# assert xhist.shape == (num_vars, maxxhist), f'XHIST.shape == [N, MAXXHIST] {srname}'
|
140
|
+
assert sim.shape == (num_vars, num_vars + 1), f'SIM.shape == [N, N+1] {srname}'
|
141
|
+
assert np.isfinite(sim).all(), f'SIM is finite {srname}'
|
142
|
+
assert all(np.max(abs(sim[:, :num_vars]), axis=0) > 0), f'SIM(:, 1:N) has no zero column {srname}'
|
143
|
+
assert simi.shape == (num_vars, num_vars), f'SIMI.shape == [N, N] {srname}'
|
144
|
+
assert np.isfinite(simi).all(), f'SIMI is finite {srname}'
|
145
|
+
assert np.allclose(sim[:, :num_vars] @ simi, np.eye(num_vars), rtol=0.1, atol=0.1) or not all(evaluated), f'SIMI = SIM(:, 1:N)^{-1} {srname}'
|
146
|
+
|
147
|
+
return evaluated, conmat, cval, sim, simi, fval, nf, info
|
148
|
+
|
149
|
+
|
150
|
+
def initfilt(conmat, ctol, cweight, cval, fval, sim, evaluated, cfilt, confilt, ffilt, xfilt):
|
151
|
+
'''
|
152
|
+
This function initializes the filter (XFILT, etc) that will be used when selecting
|
153
|
+
x at the end of the solver.
|
154
|
+
N.B.:
|
155
|
+
1. Why not initialize the filters using XHIST, etc? Because the history is empty if
|
156
|
+
the user chooses not to output it.
|
157
|
+
2. We decouple INITXFC and INITFILT so that it is easier to parallelize the former
|
158
|
+
if needed.
|
159
|
+
'''
|
160
|
+
|
161
|
+
# Sizes
|
162
|
+
num_constraints = conmat.shape[0]
|
163
|
+
num_vars = sim.shape[0]
|
164
|
+
maxfilt = len(ffilt)
|
165
|
+
|
166
|
+
# Preconditions
|
167
|
+
if DEBUGGING:
|
168
|
+
assert num_constraints >= 0
|
169
|
+
assert num_vars >= 1
|
170
|
+
assert maxfilt >= 1
|
171
|
+
assert np.size(confilt, 0) == num_constraints and np.size(confilt, 1) == maxfilt
|
172
|
+
assert np.size(cfilt) == maxfilt
|
173
|
+
assert np.size(xfilt, 0) == num_vars and np.size(xfilt, 1) == maxfilt
|
174
|
+
assert np.size(ffilt) == maxfilt
|
175
|
+
assert np.size(conmat, 0) == num_constraints and np.size(conmat, 1) == num_vars + 1
|
176
|
+
assert not (np.isnan(conmat) | np.isneginf(conmat)).any()
|
177
|
+
assert np.size(cval) == num_vars + 1 and not any(cval < 0 | np.isnan(cval) | np.isposinf(cval))
|
178
|
+
assert np.size(fval) == num_vars + 1 and not any(np.isnan(fval) | np.isposinf(fval))
|
179
|
+
assert np.size(sim, 0) == num_vars and np.size(sim, 1) == num_vars + 1
|
180
|
+
assert np.isfinite(sim).all()
|
181
|
+
assert all(np.max(abs(sim[:, :num_vars]), axis=0) > 0)
|
182
|
+
assert np.size(evaluated) == num_vars + 1
|
183
|
+
|
184
|
+
#====================#
|
185
|
+
# Calculation starts #
|
186
|
+
#====================#
|
187
|
+
|
188
|
+
|
189
|
+
nfilt = 0
|
190
|
+
for i in range(num_vars+1):
|
191
|
+
if evaluated[i]:
|
192
|
+
if i < num_vars:
|
193
|
+
x = sim[:, i] + sim[:, num_vars]
|
194
|
+
else:
|
195
|
+
x = sim[:, i] # i == num_vars, i.e. the last column
|
196
|
+
nfilt, cfilt, ffilt, xfilt, confilt = savefilt(cval[i], ctol, cweight, fval[i], x, nfilt, cfilt, ffilt, xfilt, conmat[:, i], confilt)
|
197
|
+
|
198
|
+
#==================#
|
199
|
+
# Calculation ends #
|
200
|
+
#==================#
|
201
|
+
|
202
|
+
# Postconditions
|
203
|
+
if DEBUGGING:
|
204
|
+
assert nfilt <= maxfilt
|
205
|
+
assert np.size(confilt, 0) == num_constraints and np.size(confilt, 1) == maxfilt
|
206
|
+
assert not (np.isnan(confilt[:, :nfilt]) | np.isneginf(confilt[:, :nfilt])).any()
|
207
|
+
assert np.size(cfilt) == maxfilt
|
208
|
+
assert not any(cfilt[:nfilt] < 0 | np.isnan(cfilt[:nfilt]) | np.isposinf(cfilt[:nfilt]))
|
209
|
+
assert np.size(xfilt, 0) == num_vars and np.size(xfilt, 1) == maxfilt
|
210
|
+
assert not (np.isnan(xfilt[:, :nfilt])).any()
|
211
|
+
# The last calculated X can be Inf (finite + finite can be Inf numerically).
|
212
|
+
assert np.size(ffilt) == maxfilt
|
213
|
+
assert not any(np.isnan(ffilt[:nfilt]) | np.isposinf(ffilt[:nfilt]))
|
214
|
+
|
215
|
+
return nfilt
|