scipy 1.15.3__cp312-cp312-macosx_12_0_arm64.whl → 1.16.0rc2__cp312-cp312-macosx_12_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/.dylibs/libscipy_openblas.dylib +0 -0
- scipy/__config__.py +8 -8
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/_lib/_test_deprecation_def.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
- scipy/cluster/_vq.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-312-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-312-darwin.so +0 -0
- scipy/integrate/_vode.cpython-312-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-312-darwin.so +0 -0
- scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
- scipy/interpolate/_fitpack.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-312-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-312-darwin.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
- scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
- scipy/linalg/cython_lapack.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
- scipy/optimize/_lbfgsb.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-312-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-312-darwin.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-312-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-312-darwin.so +0 -0
- scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-312-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-312-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-312-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-312-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-312-darwin.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-312-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-312-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-312-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-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-312-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-312-darwin.so +0 -0
- scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
- scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
- scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
- scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
- scipy/spatial/_voronoi.cpython-312-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-312-darwin.so +0 -0
- scipy/spatial/transform/_rotation.cpython-312-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-312-darwin.so +0 -0
- scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
- scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-312-darwin.so +0 -0
- scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-312-darwin.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-312-darwin.so +0 -0
- scipy/stats/_stats.cpython-312-darwin.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-312-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 +561 -568
- 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-312-darwin.so +0 -0
- scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
- scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
- scipy/optimize/_slsqp.cpython-312-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-312-darwin.so +0 -0
- scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -0,0 +1,290 @@
|
|
1
|
+
'''
|
2
|
+
This module provides some functions that print messages to terminal/files.
|
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
|
+
N.B.:
|
11
|
+
1. In case parallelism is desirable (especially during initialization), the functions may
|
12
|
+
have to be modified or disabled due to the IO operations.
|
13
|
+
2. IPRINT indicates the level of verbosity, which increases with the absolute value of IPRINT.
|
14
|
+
IPRINT = +/-3 can be expensive due to high IO operations.
|
15
|
+
'''
|
16
|
+
|
17
|
+
from .consts import DEBUGGING
|
18
|
+
from .infos import FTARGET_ACHIEVED, MAXFUN_REACHED, MAXTR_REACHED, \
|
19
|
+
SMALL_TR_RADIUS, TRSUBP_FAILED, NAN_INF_F, NAN_INF_X, NAN_INF_MODEL, DAMAGING_ROUNDING, \
|
20
|
+
NO_SPACE_BETWEEN_BOUNDS, ZERO_LINEAR_CONSTRAINT, CALLBACK_TERMINATE
|
21
|
+
from .present import present
|
22
|
+
import numpy as np
|
23
|
+
|
24
|
+
spaces = ' '
|
25
|
+
|
26
|
+
|
27
|
+
def get_info_string(solver, info):
|
28
|
+
if info == FTARGET_ACHIEVED:
|
29
|
+
reason = 'the target function value is achieved.'
|
30
|
+
elif info == MAXFUN_REACHED:
|
31
|
+
reason = 'the objective function has been evaluated MAXFUN times.'
|
32
|
+
elif info == MAXTR_REACHED:
|
33
|
+
reason = 'the maximal number of trust region iterations has been reached.'
|
34
|
+
elif info == SMALL_TR_RADIUS:
|
35
|
+
reason = 'the trust region radius reaches its lower bound.'
|
36
|
+
elif info == TRSUBP_FAILED:
|
37
|
+
reason = 'a trust region step has failed to reduce the quadratic model.'
|
38
|
+
elif info == NAN_INF_X:
|
39
|
+
reason = 'NaN or Inf occurs in x.'
|
40
|
+
elif info == NAN_INF_F:
|
41
|
+
reason = 'the objective function returns NaN/+Inf.'
|
42
|
+
elif info == NAN_INF_MODEL:
|
43
|
+
reason = 'NaN or Inf occurs in the models.'
|
44
|
+
elif info == DAMAGING_ROUNDING:
|
45
|
+
reason = 'rounding errors are becoming damaging.'
|
46
|
+
elif info == NO_SPACE_BETWEEN_BOUNDS:
|
47
|
+
reason = 'there is no space between the lower and upper bounds of variable.'
|
48
|
+
elif info == ZERO_LINEAR_CONSTRAINT:
|
49
|
+
reason = 'one of the linear constraints has a zero gradient'
|
50
|
+
elif info == CALLBACK_TERMINATE:
|
51
|
+
reason = 'the callback function requested termination'
|
52
|
+
else:
|
53
|
+
reason = 'UNKNOWN EXIT FLAG'
|
54
|
+
ret_message = f'Return from {solver} because {reason.strip()}'
|
55
|
+
return ret_message
|
56
|
+
|
57
|
+
|
58
|
+
def retmsg(solver, info, iprint, nf, f, x, cstrv=None, constr=None):
|
59
|
+
'''
|
60
|
+
This function prints messages at return.
|
61
|
+
'''
|
62
|
+
# Local variables
|
63
|
+
valid_exit_codes = [FTARGET_ACHIEVED, MAXFUN_REACHED, MAXTR_REACHED,
|
64
|
+
SMALL_TR_RADIUS, TRSUBP_FAILED, NAN_INF_F, NAN_INF_X, NAN_INF_MODEL, DAMAGING_ROUNDING,
|
65
|
+
NO_SPACE_BETWEEN_BOUNDS, ZERO_LINEAR_CONSTRAINT, CALLBACK_TERMINATE]
|
66
|
+
|
67
|
+
# Preconditions
|
68
|
+
if DEBUGGING:
|
69
|
+
assert info in valid_exit_codes
|
70
|
+
|
71
|
+
#====================#
|
72
|
+
# Calculation starts #
|
73
|
+
#====================#
|
74
|
+
|
75
|
+
if abs(iprint) < 1: # No printing (iprint == 0)
|
76
|
+
return
|
77
|
+
elif iprint > 0: # Print the message to the standard out.
|
78
|
+
fname = ''
|
79
|
+
else: # Print the message to a file named FNAME.
|
80
|
+
fname = f'{solver}_output.txt'
|
81
|
+
|
82
|
+
# Decide whether the problem is truly constrained.
|
83
|
+
if present(constr):
|
84
|
+
is_constrained = (np.size(constr) > 0)
|
85
|
+
else:
|
86
|
+
is_constrained = present(cstrv)
|
87
|
+
|
88
|
+
# Decide the constraint violation.
|
89
|
+
if present(cstrv):
|
90
|
+
cstrv_loc = cstrv
|
91
|
+
elif present(constr):
|
92
|
+
cstrv_loc = np.max(np.append(0, -constr)) # N.B.: We assume that the constraint is CONSTR >= 0.
|
93
|
+
else:
|
94
|
+
cstrv_loc = 0
|
95
|
+
|
96
|
+
# Decide the return message.
|
97
|
+
ret_message = get_info_string(solver, info)
|
98
|
+
|
99
|
+
if np.size(x) <= 2:
|
100
|
+
x_message = f'\nThe corresponding X is: {x}' # Printed in one line
|
101
|
+
else:
|
102
|
+
x_message = f'\nThe corresponding X is:\n{x}'
|
103
|
+
|
104
|
+
if is_constrained:
|
105
|
+
nf_message = (f'\nNumber of function values = {nf}{spaces}'
|
106
|
+
f'Least value of F = {f}{spaces}Constraint violation = {cstrv_loc}')
|
107
|
+
else:
|
108
|
+
nf_message = f'\nNumber of function values = {nf}{spaces}Least value of F = {f}'
|
109
|
+
|
110
|
+
if is_constrained and present(constr):
|
111
|
+
if np.size(constr) <= 2:
|
112
|
+
constr_message = f'\nThe constraint value is: {constr}' # Printed in one line
|
113
|
+
else:
|
114
|
+
constr_message = f'\nThe constraint value is:\n{constr}'
|
115
|
+
else:
|
116
|
+
constr_message = ''
|
117
|
+
|
118
|
+
# Print the message.
|
119
|
+
if abs(iprint) >= 2:
|
120
|
+
message = f'\n{ret_message}{nf_message}{x_message}{constr_message}\n'
|
121
|
+
else:
|
122
|
+
message = f'{ret_message}{nf_message}{x_message}{constr_message}\n'
|
123
|
+
if len(fname) > 0:
|
124
|
+
with open(fname, 'a') as f: f.write(message)
|
125
|
+
else:
|
126
|
+
print(message)
|
127
|
+
|
128
|
+
|
129
|
+
def rhomsg(solver, iprint, nf, delta, f, rho, x, cstrv=None, constr=None, cpen=None):
|
130
|
+
'''
|
131
|
+
This function prints messages when RHO is updated.
|
132
|
+
'''
|
133
|
+
|
134
|
+
#====================#
|
135
|
+
# Calculation starts #
|
136
|
+
#====================#
|
137
|
+
|
138
|
+
if abs(iprint) < 2: # No printing
|
139
|
+
return
|
140
|
+
elif iprint > 0: # Print the message to the standard out.
|
141
|
+
fname = ''
|
142
|
+
else: # Print the message to a file named FNAME.
|
143
|
+
fname = f'{solver.strip()}_output.txt'
|
144
|
+
|
145
|
+
# Decide whether the problem is truly constrained.
|
146
|
+
if present(constr):
|
147
|
+
is_constrained = (np.size(constr) > 0)
|
148
|
+
else:
|
149
|
+
is_constrained = present(cstrv)
|
150
|
+
|
151
|
+
# Decide the constraint violation.
|
152
|
+
if present(cstrv):
|
153
|
+
cstrv_loc = cstrv
|
154
|
+
elif present(constr):
|
155
|
+
cstrv_loc = np.max(np.append(0, -constr)) # N.B.: We assume that the constraint is CONSTR >= 0.
|
156
|
+
else:
|
157
|
+
cstrv_loc = 0
|
158
|
+
|
159
|
+
if present(cpen):
|
160
|
+
rho_message = (f'\nNew RHO = {rho}{spaces}Delta = {delta}{spaces}'
|
161
|
+
f'CPEN = {cpen}')
|
162
|
+
else:
|
163
|
+
rho_message = f'\nNew RHO = {rho}{spaces}Delta = {delta}'
|
164
|
+
|
165
|
+
if np.size(x) <= 2:
|
166
|
+
x_message = f'\nThe corresponding X is: {x}' # Printed in one line
|
167
|
+
else:
|
168
|
+
x_message = f'\nThe corresponding X is:\n{x}'
|
169
|
+
|
170
|
+
if is_constrained:
|
171
|
+
nf_message = (f'\nNumber of function values = {nf}{spaces}'
|
172
|
+
f'Least value of F = {f}{spaces}Constraint violation = {cstrv_loc}')
|
173
|
+
else:
|
174
|
+
nf_message = f'\nNumber of function values = {nf}{spaces}Least value of F = {f}'
|
175
|
+
|
176
|
+
if is_constrained and present(constr):
|
177
|
+
if np.size(constr) <= 2:
|
178
|
+
constr_message = f'\nThe constraint value is: {constr}' # Printed in one line
|
179
|
+
else:
|
180
|
+
constr_message = f'\nThe constraint value is:\n{constr}'
|
181
|
+
else:
|
182
|
+
constr_message = ''
|
183
|
+
|
184
|
+
# Print the message.
|
185
|
+
if abs(iprint) >= 3:
|
186
|
+
message = f'\n{rho_message}{nf_message}{x_message}{constr_message}'
|
187
|
+
else:
|
188
|
+
message = f'{rho_message}{nf_message}{x_message}{constr_message}'
|
189
|
+
if len(fname) > 0:
|
190
|
+
with open(fname, 'a') as f: f.write(message)
|
191
|
+
else:
|
192
|
+
print(message)
|
193
|
+
|
194
|
+
#====================#
|
195
|
+
# Calculation ends #
|
196
|
+
#====================#
|
197
|
+
|
198
|
+
|
199
|
+
def cpenmsg(solver, iprint, cpen):
|
200
|
+
'''
|
201
|
+
This function prints a message when CPEN is updated.
|
202
|
+
'''
|
203
|
+
|
204
|
+
#====================#
|
205
|
+
# Calculation starts #
|
206
|
+
#====================#
|
207
|
+
|
208
|
+
if abs(iprint) < 2: # No printing
|
209
|
+
return
|
210
|
+
elif iprint > 0: # Print the message to the standard out.
|
211
|
+
fname = ''
|
212
|
+
else: # Print the message to a file named FNAME.
|
213
|
+
fname = f'{solver.strip()}_output.txt'
|
214
|
+
|
215
|
+
# Print the message.
|
216
|
+
if abs(iprint) >= 3:
|
217
|
+
message = f'\nSet CPEN to {cpen}'
|
218
|
+
else:
|
219
|
+
message = f'\n\nSet CPEN to {cpen}'
|
220
|
+
if len(fname) > 0:
|
221
|
+
with open(fname, 'a') as f: f.write(message)
|
222
|
+
else:
|
223
|
+
print(message)
|
224
|
+
|
225
|
+
#====================#
|
226
|
+
# Calculation ends #
|
227
|
+
#====================#
|
228
|
+
|
229
|
+
|
230
|
+
def fmsg(solver, state, iprint, nf, delta, f, x, cstrv=None, constr=None):
|
231
|
+
'''
|
232
|
+
This subroutine prints messages for each evaluation of the objective function.
|
233
|
+
'''
|
234
|
+
|
235
|
+
#====================#
|
236
|
+
# Calculation starts #
|
237
|
+
#====================#
|
238
|
+
|
239
|
+
if abs(iprint) < 2: # No printing
|
240
|
+
return
|
241
|
+
elif iprint > 0: # Print the message to the standard out.
|
242
|
+
fname = ''
|
243
|
+
else: # Print the message to a file named FNAME.
|
244
|
+
fname = f'{solver.strip()}_output.txt'
|
245
|
+
|
246
|
+
# Decide whether the problem is truly constrained.
|
247
|
+
if present(constr):
|
248
|
+
is_constrained = (np.size(constr) > 0)
|
249
|
+
else:
|
250
|
+
is_constrained = present(cstrv)
|
251
|
+
|
252
|
+
# Decide the constraint violation.
|
253
|
+
if present(cstrv):
|
254
|
+
cstrv_loc = cstrv
|
255
|
+
elif present(constr):
|
256
|
+
cstrv_loc = np.max(np.append(0, -constr)) # N.B.: We assume that the constraint is CONSTR >= 0.
|
257
|
+
else:
|
258
|
+
cstrv_loc = 0
|
259
|
+
|
260
|
+
delta_message = f'\n{state} step with radius = {delta}'
|
261
|
+
|
262
|
+
if is_constrained:
|
263
|
+
nf_message = (f'\nNumber of function values = {nf}{spaces}'
|
264
|
+
f'Least value of F = {f}{spaces}Constraint violation = {cstrv_loc}')
|
265
|
+
else:
|
266
|
+
nf_message = f'\nNumber of function values = {nf}{spaces}Least value of F = {f}'
|
267
|
+
|
268
|
+
if np.size(x) <= 2:
|
269
|
+
x_message = f'\nThe corresponding X is: {x}' # Printed in one line
|
270
|
+
else:
|
271
|
+
x_message = f'\nThe corresponding X is:\n{x}'
|
272
|
+
|
273
|
+
if is_constrained and present(constr):
|
274
|
+
if np.size(constr) <= 2:
|
275
|
+
constr_message = f'\nThe constraint value is: {constr}' # Printed in one line
|
276
|
+
else:
|
277
|
+
constr_message = f'\nThe constraint value is:\n{constr}'
|
278
|
+
else:
|
279
|
+
constr_message = ''
|
280
|
+
|
281
|
+
# Print the message.
|
282
|
+
message = f'{delta_message}{nf_message}{x_message}{constr_message}'
|
283
|
+
if len(fname) > 0:
|
284
|
+
with open(fname, 'a') as f: f.write(message)
|
285
|
+
else:
|
286
|
+
print(message)
|
287
|
+
|
288
|
+
#====================#
|
289
|
+
# Calculation ends #
|
290
|
+
#====================#
|
@@ -0,0 +1,131 @@
|
|
1
|
+
'''
|
2
|
+
This module provides some Powell-style linear algebra procedures.
|
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
|
+
import numpy as np
|
12
|
+
from .linalg import isminor, planerot, matprod, inprod, hypot
|
13
|
+
from .consts import DEBUGGING, EPS
|
14
|
+
|
15
|
+
|
16
|
+
def qradd_Rdiag(c, Q, Rdiag, n):
|
17
|
+
'''
|
18
|
+
This function updates the QR factorization of an MxN matrix A of full column rank, attempting to
|
19
|
+
add a new column C to this matrix as the LAST column while maintaining the full-rankness.
|
20
|
+
Case 1. If C is not in range(A) (theoretically, it implies N < M), then the new matrix is np.hstack([A, C])
|
21
|
+
Case 2. If C is in range(A), then the new matrix is np.hstack([A[:, :n-1], C])
|
22
|
+
N.B.:
|
23
|
+
0. Instead of R, this subroutine updates Rdiag, which is np.diag(R), with a size at most M and at
|
24
|
+
least min(m, n+1). The number is min(m, n+1) rather than min(m, n) as n may be augmented by 1 in
|
25
|
+
the function.
|
26
|
+
1. With the two cases specified as above, this function does not need A as an input.
|
27
|
+
2. The function changes only Q[:, nsave:m] (nsave is the original value of n) and
|
28
|
+
R[:, n-1] (n takes the updated value)
|
29
|
+
3. Indeed, when C is in range(A), Powell wrote in comments that "set iOUT to the index of the
|
30
|
+
constraint (here, column of A --- Zaikun) to be deleted, but branch if no suitable index can be
|
31
|
+
found". The idea is to replace a column of A by C so that the new matrix still has full rank
|
32
|
+
(such a column must exist unless C = 0). But his code essentially sets iout=n always. Maybe he
|
33
|
+
found this worked well enough in practice. Meanwhile, Powell's code includes a snippet that can
|
34
|
+
never be reached, which was probably intended to deal with the case that IOUT != n
|
35
|
+
'''
|
36
|
+
m = Q.shape[1]
|
37
|
+
nsave = n # Needed for debugging (only)
|
38
|
+
|
39
|
+
# As in Powell's COBYLA, CQ is set to 0 at the positions with CQ being negligible as per ISMINOR.
|
40
|
+
# This may not be the best choice if the subroutine is used in other contexts, e.g. LINCOA.
|
41
|
+
cq = matprod(c, Q)
|
42
|
+
cqa = matprod(abs(c), abs(Q))
|
43
|
+
# The line below basically makes an element of cq 0 if adding it to the corresponding element of
|
44
|
+
# cqa does not change the latter.
|
45
|
+
cq = np.array([0 if isminor(cqi, cqai) else cqi for cqi, cqai in zip(cq, cqa)])
|
46
|
+
|
47
|
+
# Update Q so that the columns of Q[:, n+1:m] are orthogonal to C. This is done by applying a 2D
|
48
|
+
# Givens rotation to Q[:, [k, k+1]] from the right to zero C' @ Q[:, k+1] out for K=n+1, ... m-1.
|
49
|
+
# Nothing will be done if n >= m-1
|
50
|
+
for k in range(m-2, n-1, -1):
|
51
|
+
if abs(cq[k+1]) > 0:
|
52
|
+
# Powell wrote cq[k+1] != 0 instead of abs. The two differ if cq[k+1] is NaN.
|
53
|
+
# If we apply the rotation below when cq[k+1] = 0, then cq[k] will get updated to |cq[k]|.
|
54
|
+
G = planerot(cq[k:k+2])
|
55
|
+
Q[:, [k, k+1]] = matprod(Q[:, [k, k+1]], G.T)
|
56
|
+
cq[k] = hypot(*cq[k:k+2])
|
57
|
+
|
58
|
+
# Augment n by 1 if C is not in range(A)
|
59
|
+
if n < m:
|
60
|
+
# Powell's condition for the following if: cq[n+1] != 0
|
61
|
+
if abs(cq[n]) > EPS**2 and not isminor(cq[n], cqa[n]):
|
62
|
+
n += 1
|
63
|
+
|
64
|
+
# Update Rdiag so that Rdiag[n] = cq[n] = np.dot(c, q[:, n]). Note that N may be been augmented.
|
65
|
+
if n - 1 >= 0 and n - 1 < m: # n >= m should not happen unless the input is wrong
|
66
|
+
Rdiag[n - 1] = cq[n - 1]
|
67
|
+
|
68
|
+
if DEBUGGING:
|
69
|
+
assert nsave <= n <= min(nsave + 1, m)
|
70
|
+
assert n <= len(Rdiag) <= m
|
71
|
+
assert Q.shape == (m, m)
|
72
|
+
|
73
|
+
return Q, Rdiag, n
|
74
|
+
|
75
|
+
|
76
|
+
def qrexc_Rdiag(A, Q, Rdiag, i): # Used in COBYLA
|
77
|
+
'''
|
78
|
+
This function updates the QR factorization for an MxN matrix A=Q@R so that the updated Q and
|
79
|
+
R form a QR factorization of [A_0, ..., A_{I-1}, A_{I+1}, ..., A_{N-1}, A_I] which is the matrix
|
80
|
+
obtained by rearranging columns [I, I+1, ... N-1] of A to [I+1, ..., N-1, I]. Here A is ASSUMED TO
|
81
|
+
BE OF FULL COLUMN RANK, Q is a matrix whose columns are orthogonal, and R, which is not present,
|
82
|
+
is an upper triangular matrix whose diagonal entries are nonzero. Q and R need not be square.
|
83
|
+
N.B.:
|
84
|
+
0. Instead of R, this function updates Rdiag, which is np.diag(R), the size being n.
|
85
|
+
1. With L = Q.shape[1] = R.shape[0], we have M >= L >= N. Most often L = M or N.
|
86
|
+
2. This function changes only Q[:, i:] and Rdiag[i:]
|
87
|
+
3. (NDB 20230919) In Python, i is either icon or nact - 2, whereas in FORTRAN it is either icon or nact - 1.
|
88
|
+
'''
|
89
|
+
|
90
|
+
# Sizes
|
91
|
+
m, n = A.shape
|
92
|
+
|
93
|
+
# Preconditions
|
94
|
+
assert n >= 1 and n <= m
|
95
|
+
assert i >= 0 and i < n
|
96
|
+
assert len(Rdiag) == n
|
97
|
+
assert Q.shape[0] == m and Q.shape[1] >= n and Q.shape[1] <= m
|
98
|
+
# tol = max(1.0E-8, min(1.0E-1, 1.0E8 * EPS * m + 1))
|
99
|
+
# assert isorth(Q, tol) # Costly!
|
100
|
+
|
101
|
+
|
102
|
+
if i < 0 or i >= n:
|
103
|
+
return Q, Rdiag
|
104
|
+
|
105
|
+
# Let R be the upper triangular matrix in the QR factorization, namely R = Q.T@A.
|
106
|
+
# For each k, find the Givens rotation G with G@(R[k:k+2, :]) = [hypt, 0], and update Q[:, k:k+2]
|
107
|
+
# to Q[:, k:k+2]@(G.T). Then R = Q.T@A is an upper triangular matrix as long as A[:, [k, k+1]] is
|
108
|
+
# updated to A[:, [k+1, k]]. Indeed, this new upper triangular matrix can be obtained by first
|
109
|
+
# updating R[[k, k+1], :] to G@(R[[k, k+1], :]) and then exchanging its columns K and K+1; at the same
|
110
|
+
# time, entries k and k+1 of R's diagonal Rdiag become [hypt, -(Rdiag[k+1]/hypt)*RDiag[k]].
|
111
|
+
# After this is done for each k = 0, ..., n-2, we obtain the QR factorization of the matrix that
|
112
|
+
# rearranges columns [i, i+1, ... n-1] of A as [i+1, ..., n-1, i].
|
113
|
+
# Powell's code, however, is slightly different: before everything, he first exchanged columns k and
|
114
|
+
# k+1 of Q (as well as rows k and k+1 of R). This makes sure that the entries of the update Rdiag
|
115
|
+
# are all positive if it is the case for the original Rdiag.
|
116
|
+
for k in range(i, n-1):
|
117
|
+
G = planerot([Rdiag[k+1], inprod(Q[:, k], A[:, k+1])])
|
118
|
+
Q[:, [k, k+1]] = matprod(Q[:, [k+1, k]], (G.T))
|
119
|
+
# Powell's code updates Rdiag in the following way:
|
120
|
+
# hypt = np.sqrt(Rdiag[k+1]**2 + np.dot(Q[:, k], A[:, k+1])**2)
|
121
|
+
# Rdiag[[k, k+1]] = [hypt, (Rdiag[k+1]/hypt)*Rdiag[k]]
|
122
|
+
# Note that Rdiag[n-1] inherits all rounding in Rdiag[i:n-1] and Q[:, i:n-1] and hence contains
|
123
|
+
# significant errors. Thus we may modify Powell's code to set only Rdiag[k] = hypt here and then
|
124
|
+
# calculate Rdiag[n] by an inner product after the loop. Nevertheless, we simple calculate RDiag
|
125
|
+
# from scratch below.
|
126
|
+
|
127
|
+
# Calculate Rdiag(i:n) from scratch
|
128
|
+
Rdiag[i:n-1] = [inprod(Q[:, k], A[:, k+1]) for k in range(i, n-1)]
|
129
|
+
Rdiag[n-1] = inprod(Q[:, n-1], A[:, i])
|
130
|
+
|
131
|
+
return Q, Rdiag
|