scipy 1.15.3__cp313-cp313t-macosx_14_0_arm64.whl → 1.16.0rc2__cp313-cp313t-macosx_14_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scipy/__config__.py +3 -3
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-313t-darwin.so +0 -0
- scipy/_lib/_array_api.py +486 -161
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_bunch.py +4 -0
- scipy/_lib/_ccallback_c.cpython-313t-darwin.so +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_deprecation_call.cpython-313t-darwin.so +0 -0
- scipy/_lib/_testutils.py +6 -2
- scipy/_lib/_util.py +222 -125
- scipy/_lib/array_api_compat/__init__.py +4 -4
- scipy/_lib/array_api_compat/_internal.py +19 -6
- scipy/_lib/array_api_compat/common/__init__.py +1 -1
- scipy/_lib/array_api_compat/common/_aliases.py +365 -193
- scipy/_lib/array_api_compat/common/_fft.py +94 -64
- scipy/_lib/array_api_compat/common/_helpers.py +413 -180
- scipy/_lib/array_api_compat/common/_linalg.py +116 -40
- scipy/_lib/array_api_compat/common/_typing.py +179 -10
- scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
- scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
- scipy/_lib/array_api_compat/cupy/_info.py +16 -6
- scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
- scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
- scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
- scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
- scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
- scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
- scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
- scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
- scipy/_lib/array_api_compat/numpy/_info.py +36 -16
- scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
- scipy/_lib/array_api_compat/numpy/fft.py +11 -5
- scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
- scipy/_lib/array_api_compat/torch/__init__.py +3 -5
- scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
- scipy/_lib/array_api_compat/torch/_info.py +27 -16
- scipy/_lib/array_api_compat/torch/_typing.py +3 -0
- scipy/_lib/array_api_compat/torch/fft.py +17 -18
- scipy/_lib/array_api_compat/torch/linalg.py +16 -16
- scipy/_lib/array_api_extra/__init__.py +26 -3
- scipy/_lib/array_api_extra/_delegation.py +171 -0
- scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_at.py +463 -0
- scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
- scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
- scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
- scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
- scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
- scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
- scipy/_lib/array_api_extra/testing.py +359 -0
- scipy/_lib/decorator.py +2 -2
- scipy/_lib/doccer.py +1 -7
- scipy/_lib/messagestream.cpython-313t-darwin.so +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/test__util.py +105 -121
- scipy/_lib/tests/test_array_api.py +166 -35
- scipy/_lib/tests/test_bunch.py +7 -0
- scipy/_lib/tests/test_ccallback.py +2 -10
- scipy/_lib/tests/test_public_api.py +13 -0
- scipy/cluster/_hierarchy.cpython-313t-darwin.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-313t-darwin.so +0 -0
- scipy/cluster/_vq.cpython-313t-darwin.so +0 -0
- scipy/cluster/hierarchy.py +393 -223
- scipy/cluster/tests/test_hierarchy.py +273 -335
- scipy/cluster/tests/test_vq.py +45 -61
- scipy/cluster/vq.py +39 -35
- scipy/conftest.py +263 -157
- scipy/constants/_constants.py +4 -1
- scipy/constants/tests/test_codata.py +2 -2
- scipy/constants/tests/test_constants.py +11 -18
- scipy/datasets/_download_all.py +15 -1
- scipy/datasets/_fetchers.py +7 -1
- scipy/datasets/_utils.py +1 -1
- scipy/differentiate/_differentiate.py +25 -25
- scipy/differentiate/tests/test_differentiate.py +24 -25
- scipy/fft/_basic.py +20 -0
- scipy/fft/_helper.py +3 -34
- scipy/fft/_pocketfft/helper.py +29 -1
- scipy/fft/_pocketfft/tests/test_basic.py +2 -4
- scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
- scipy/fft/_realtransforms.py +13 -0
- scipy/fft/tests/test_basic.py +27 -25
- scipy/fft/tests/test_fftlog.py +16 -7
- scipy/fft/tests/test_helper.py +18 -34
- scipy/fft/tests/test_real_transforms.py +8 -10
- scipy/fftpack/convolve.cpython-313t-darwin.so +0 -0
- scipy/fftpack/tests/test_basic.py +2 -4
- scipy/fftpack/tests/test_real_transforms.py +8 -9
- scipy/integrate/_bvp.py +9 -3
- scipy/integrate/_cubature.py +3 -2
- scipy/integrate/_dop.cpython-313t-darwin.so +0 -0
- scipy/integrate/_lsoda.cpython-313t-darwin.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-313t-darwin.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-313t-darwin.so +0 -0
- scipy/integrate/_quadpack_py.py +11 -7
- scipy/integrate/_quadrature.py +3 -3
- scipy/integrate/_rules/_base.py +2 -2
- scipy/integrate/_tanhsinh.py +48 -47
- scipy/integrate/_test_odeint_banded.cpython-313t-darwin.so +0 -0
- scipy/integrate/_vode.cpython-313t-darwin.so +0 -0
- scipy/integrate/tests/test__quad_vec.py +0 -6
- scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
- scipy/integrate/tests/test_cubature.py +21 -35
- scipy/integrate/tests/test_quadrature.py +6 -8
- scipy/integrate/tests/test_tanhsinh.py +56 -48
- scipy/interpolate/__init__.py +70 -58
- scipy/interpolate/_bary_rational.py +22 -22
- scipy/interpolate/_bsplines.py +119 -66
- scipy/interpolate/_cubic.py +65 -50
- scipy/interpolate/_dfitpack.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_dierckx.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_fitpack.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_fitpack2.py +9 -6
- scipy/interpolate/_fitpack_impl.py +32 -26
- scipy/interpolate/_fitpack_repro.py +23 -19
- scipy/interpolate/_interpnd.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_interpolate.py +30 -12
- scipy/interpolate/_ndbspline.py +13 -18
- scipy/interpolate/_ndgriddata.py +5 -8
- scipy/interpolate/_polyint.py +95 -31
- scipy/interpolate/_ppoly.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-313t-darwin.so +0 -0
- scipy/interpolate/dfitpack.py +0 -20
- scipy/interpolate/interpnd.py +1 -2
- scipy/interpolate/tests/test_bary_rational.py +2 -2
- scipy/interpolate/tests/test_bsplines.py +97 -1
- scipy/interpolate/tests/test_fitpack2.py +39 -1
- scipy/interpolate/tests/test_interpnd.py +32 -20
- scipy/interpolate/tests/test_interpolate.py +48 -4
- scipy/interpolate/tests/test_rgi.py +2 -1
- scipy/io/_fast_matrix_market/__init__.py +2 -0
- scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
- scipy/io/_harwell_boeing/hb.py +7 -11
- scipy/io/_idl.py +5 -7
- scipy/io/_netcdf.py +15 -5
- scipy/io/_test_fortran.cpython-313t-darwin.so +0 -0
- scipy/io/arff/tests/test_arffread.py +3 -3
- scipy/io/matlab/__init__.py +5 -3
- scipy/io/matlab/_mio.py +4 -1
- scipy/io/matlab/_mio5.py +19 -13
- scipy/io/matlab/_mio5_utils.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/tests/test_mio.py +46 -18
- scipy/io/matlab/tests/test_mio_funcs.py +1 -1
- scipy/io/tests/test_mmio.py +7 -1
- scipy/io/tests/test_wavfile.py +41 -0
- scipy/io/wavfile.py +57 -10
- scipy/linalg/_basic.py +113 -86
- scipy/linalg/_cythonized_array_utils.cpython-313t-darwin.so +0 -0
- scipy/linalg/_decomp.py +22 -9
- scipy/linalg/_decomp_cholesky.py +28 -13
- scipy/linalg/_decomp_cossin.py +45 -30
- scipy/linalg/_decomp_interpolative.cpython-313t-darwin.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-313t-darwin.so +0 -0
- scipy/linalg/_decomp_polar.py +2 -0
- scipy/linalg/_decomp_qr.py +6 -2
- scipy/linalg/_decomp_qz.py +3 -0
- scipy/linalg/_decomp_schur.py +3 -1
- scipy/linalg/_decomp_svd.py +13 -2
- scipy/linalg/_decomp_update.cpython-313t-darwin.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-313t-darwin.so +0 -0
- scipy/linalg/_flapack.cpython-313t-darwin.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-darwin.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-313t-darwin.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-313t-darwin.so +0 -0
- scipy/linalg/cython_lapack.cpython-313t-darwin.so +0 -0
- scipy/linalg/lapack.py +22 -2
- scipy/linalg/tests/_cython_examples/meson.build +7 -0
- scipy/linalg/tests/test_basic.py +31 -16
- scipy/linalg/tests/test_batch.py +588 -0
- scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
- scipy/linalg/tests/test_decomp.py +40 -3
- scipy/linalg/tests/test_decomp_cossin.py +14 -0
- scipy/linalg/tests/test_decomp_ldl.py +1 -1
- scipy/linalg/tests/test_lapack.py +115 -7
- scipy/linalg/tests/test_matfuncs.py +157 -102
- scipy/linalg/tests/test_procrustes.py +0 -7
- scipy/linalg/tests/test_solve_toeplitz.py +1 -1
- scipy/linalg/tests/test_special_matrices.py +1 -5
- scipy/ndimage/__init__.py +1 -0
- scipy/ndimage/_cytest.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_delegators.py +8 -2
- scipy/ndimage/_filters.py +453 -5
- scipy/ndimage/_interpolation.py +36 -6
- scipy/ndimage/_measurements.py +4 -2
- scipy/ndimage/_morphology.py +5 -0
- scipy/ndimage/_nd_image.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_support_alternative_backends.py +18 -6
- scipy/ndimage/tests/test_filters.py +370 -259
- scipy/ndimage/tests/test_fourier.py +7 -9
- scipy/ndimage/tests/test_interpolation.py +68 -61
- scipy/ndimage/tests/test_measurements.py +18 -35
- scipy/ndimage/tests/test_morphology.py +143 -131
- scipy/ndimage/tests/test_splines.py +1 -3
- scipy/odr/__odrpack.cpython-313t-darwin.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-313t-darwin.so +0 -0
- scipy/optimize/_bracket.py +17 -24
- scipy/optimize/_chandrupatla.py +9 -10
- scipy/optimize/_cobyla_py.py +104 -123
- scipy/optimize/_constraints.py +14 -10
- scipy/optimize/_differentiable_functions.py +371 -230
- scipy/optimize/_differentialevolution.py +4 -3
- scipy/optimize/_direct.cpython-313t-darwin.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lbfgsb.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lbfgsb_py.py +57 -16
- scipy/optimize/_linprog_doc.py +2 -2
- scipy/optimize/_linprog_highs.py +2 -2
- scipy/optimize/_linprog_ip.py +25 -10
- scipy/optimize/_linprog_util.py +14 -16
- scipy/optimize/_lsap.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lsq/least_squares.py +198 -126
- scipy/optimize/_lsq/lsq_linear.py +6 -6
- scipy/optimize/_lsq/trf.py +35 -8
- scipy/optimize/_milp.py +3 -1
- scipy/optimize/_minimize.py +105 -36
- scipy/optimize/_minpack.cpython-313t-darwin.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-313t-darwin.so +0 -0
- scipy/optimize/_nnls.py +20 -21
- scipy/optimize/_nonlin.py +34 -3
- scipy/optimize/_numdiff.py +288 -110
- scipy/optimize/_optimize.py +86 -48
- scipy/optimize/_pava_pybind.cpython-313t-darwin.so +0 -0
- scipy/optimize/_remove_redundancy.py +5 -5
- scipy/optimize/_root_scalar.py +1 -1
- scipy/optimize/_shgo.py +6 -0
- scipy/optimize/_shgo_lib/_complex.py +1 -1
- scipy/optimize/_slsqp_py.py +216 -124
- scipy/optimize/_slsqplib.cpython-313t-darwin.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-313t-darwin.so +0 -0
- scipy/optimize/_trustregion.py +20 -6
- scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
- scipy/optimize/_trustregion_constr/projections.py +12 -8
- scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
- scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
- scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
- scipy/optimize/_trustregion_exact.py +0 -1
- scipy/optimize/_zeros.cpython-313t-darwin.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-313t-darwin.so +0 -0
- scipy/optimize/slsqp.py +0 -1
- scipy/optimize/tests/test__basinhopping.py +1 -1
- scipy/optimize/tests/test__differential_evolution.py +4 -4
- scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
- scipy/optimize/tests/test__numdiff.py +66 -22
- scipy/optimize/tests/test__remove_redundancy.py +2 -2
- scipy/optimize/tests/test__shgo.py +9 -1
- scipy/optimize/tests/test_bracket.py +36 -46
- scipy/optimize/tests/test_chandrupatla.py +133 -135
- scipy/optimize/tests/test_cobyla.py +74 -45
- scipy/optimize/tests/test_constraints.py +1 -1
- scipy/optimize/tests/test_differentiable_functions.py +226 -6
- scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
- scipy/optimize/tests/test_least_squares.py +125 -13
- scipy/optimize/tests/test_linear_assignment.py +3 -3
- scipy/optimize/tests/test_linprog.py +3 -3
- scipy/optimize/tests/test_lsq_linear.py +6 -6
- scipy/optimize/tests/test_minimize_constrained.py +2 -2
- scipy/optimize/tests/test_minpack.py +4 -4
- scipy/optimize/tests/test_nnls.py +43 -3
- scipy/optimize/tests/test_nonlin.py +36 -0
- scipy/optimize/tests/test_optimize.py +95 -17
- scipy/optimize/tests/test_slsqp.py +36 -4
- scipy/optimize/tests/test_zeros.py +34 -1
- scipy/signal/__init__.py +12 -23
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +459 -241
- scipy/signal/_fir_filter_design.py +262 -90
- scipy/signal/_lti_conversion.py +3 -2
- scipy/signal/_ltisys.py +118 -91
- scipy/signal/_max_len_seq_inner.cpython-313t-darwin.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-313t-darwin.so +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_short_time_fft.py +519 -70
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +719 -399
- scipy/signal/_sigtools.cpython-313t-darwin.so +0 -0
- scipy/signal/_sosfilt.cpython-313t-darwin.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-313t-darwin.so +0 -0
- scipy/signal/_spline_filters.py +108 -68
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +4 -1
- scipy/signal/_upfirdn_apply.cpython-313t-darwin.so +0 -0
- scipy/signal/_waveforms.py +2 -11
- scipy/signal/_wavelets.py +1 -1
- scipy/signal/fir_filter_design.py +1 -0
- scipy/signal/spline.py +4 -11
- scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
- scipy/signal/tests/test_bsplines.py +114 -79
- scipy/signal/tests/test_cont2discrete.py +9 -2
- scipy/signal/tests/test_filter_design.py +721 -481
- scipy/signal/tests/test_fir_filter_design.py +332 -140
- scipy/signal/tests/test_savitzky_golay.py +4 -3
- scipy/signal/tests/test_short_time_fft.py +221 -3
- scipy/signal/tests/test_signaltools.py +2144 -1348
- scipy/signal/tests/test_spectral.py +50 -6
- scipy/signal/tests/test_splines.py +161 -96
- scipy/signal/tests/test_upfirdn.py +84 -50
- scipy/signal/tests/test_waveforms.py +20 -0
- scipy/signal/tests/test_windows.py +607 -466
- scipy/signal/windows/_windows.py +287 -148
- scipy/sparse/__init__.py +23 -4
- scipy/sparse/_base.py +270 -108
- scipy/sparse/_bsr.py +7 -4
- scipy/sparse/_compressed.py +59 -231
- scipy/sparse/_construct.py +90 -38
- scipy/sparse/_coo.py +115 -181
- scipy/sparse/_csc.py +4 -4
- scipy/sparse/_csparsetools.cpython-313t-darwin.so +0 -0
- scipy/sparse/_csr.py +2 -2
- scipy/sparse/_data.py +48 -48
- scipy/sparse/_dia.py +105 -18
- scipy/sparse/_dok.py +0 -23
- scipy/sparse/_index.py +4 -4
- scipy/sparse/_matrix.py +23 -0
- scipy/sparse/_sparsetools.cpython-313t-darwin.so +0 -0
- scipy/sparse/_sputils.py +37 -22
- scipy/sparse/base.py +0 -9
- scipy/sparse/bsr.py +0 -14
- scipy/sparse/compressed.py +0 -23
- scipy/sparse/construct.py +0 -6
- scipy/sparse/coo.py +0 -14
- scipy/sparse/csc.py +0 -3
- scipy/sparse/csgraph/_flow.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/tests/test_matching.py +14 -2
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
- scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
- scipy/sparse/csr.py +0 -5
- scipy/sparse/data.py +1 -6
- scipy/sparse/dia.py +0 -7
- scipy/sparse/dok.py +0 -10
- scipy/sparse/linalg/_dsolve/_superlu.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
- scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
- scipy/sparse/linalg/_interface.py +17 -18
- scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
- scipy/sparse/linalg/_isolve/iterative.py +51 -45
- scipy/sparse/linalg/_isolve/lgmres.py +6 -6
- scipy/sparse/linalg/_isolve/minres.py +5 -5
- scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
- scipy/sparse/linalg/_isolve/utils.py +2 -8
- scipy/sparse/linalg/_matfuncs.py +1 -1
- scipy/sparse/linalg/_norm.py +1 -1
- scipy/sparse/linalg/_propack/_cpropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
- scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
- scipy/sparse/tests/test_arithmetic1d.py +5 -2
- scipy/sparse/tests/test_base.py +214 -42
- scipy/sparse/tests/test_common1d.py +7 -7
- scipy/sparse/tests/test_construct.py +1 -1
- scipy/sparse/tests/test_coo.py +272 -4
- scipy/sparse/tests/test_sparsetools.py +5 -0
- scipy/sparse/tests/test_sputils.py +36 -7
- scipy/spatial/_ckdtree.cpython-313t-darwin.so +0 -0
- scipy/spatial/_distance_pybind.cpython-313t-darwin.so +0 -0
- scipy/spatial/_distance_wrap.cpython-313t-darwin.so +0 -0
- scipy/spatial/_hausdorff.cpython-313t-darwin.so +0 -0
- scipy/spatial/_qhull.cpython-313t-darwin.so +0 -0
- scipy/spatial/_voronoi.cpython-313t-darwin.so +0 -0
- scipy/spatial/distance.py +49 -42
- scipy/spatial/tests/test_distance.py +15 -1
- scipy/spatial/tests/test_kdtree.py +1 -0
- scipy/spatial/tests/test_qhull.py +7 -2
- scipy/spatial/transform/__init__.py +5 -3
- scipy/spatial/transform/_rigid_transform.cpython-313t-darwin.so +0 -0
- scipy/spatial/transform/_rotation.cpython-313t-darwin.so +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +1213 -832
- scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
- scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
- scipy/special/__init__.py +1 -47
- scipy/special/_add_newdocs.py +34 -772
- scipy/special/_basic.py +22 -25
- scipy/special/_comb.cpython-313t-darwin.so +0 -0
- scipy/special/_ellip_harm_2.cpython-313t-darwin.so +0 -0
- scipy/special/_gufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-313t-darwin.so +0 -0
- scipy/special/_special_ufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-313t-darwin.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-313t-darwin.so +0 -0
- scipy/special/_ufuncs_cxx.pxd +2 -15
- scipy/special/_ufuncs_cxx.pyx +5 -44
- scipy/special/_ufuncs_cxx_defs.h +2 -16
- scipy/special/_ufuncs_defs.h +0 -8
- scipy/special/cython_special.cpython-313t-darwin.so +0 -0
- scipy/special/cython_special.pxd +1 -1
- scipy/special/tests/_cython_examples/meson.build +10 -1
- scipy/special/tests/test_basic.py +153 -20
- scipy/special/tests/test_boost_ufuncs.py +3 -0
- scipy/special/tests/test_cdflib.py +35 -11
- scipy/special/tests/test_gammainc.py +16 -0
- scipy/special/tests/test_hyp2f1.py +2 -2
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_logsumexp.py +206 -64
- scipy/special/tests/test_mpmath.py +1 -0
- scipy/special/tests/test_nan_inputs.py +1 -1
- scipy/special/tests/test_orthogonal.py +17 -18
- scipy/special/tests/test_sf_error.py +3 -2
- scipy/special/tests/test_sph_harm.py +6 -7
- scipy/special/tests/test_support_alternative_backends.py +211 -76
- scipy/stats/__init__.py +4 -1
- scipy/stats/_ansari_swilk_statistics.cpython-313t-darwin.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-313t-darwin.so +0 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +277 -310
- scipy/stats/_correlation.py +1 -1
- scipy/stats/_covariance.py +6 -3
- scipy/stats/_discrete_distns.py +39 -32
- scipy/stats/_distn_infrastructure.py +39 -12
- scipy/stats/_distribution_infrastructure.py +900 -238
- scipy/stats/_entropy.py +9 -10
- scipy/{_lib → stats}/_finite_differences.py +1 -1
- scipy/stats/_hypotests.py +83 -50
- scipy/stats/_kde.py +53 -49
- scipy/stats/_ksstats.py +1 -1
- scipy/stats/_levy_stable/__init__.py +7 -15
- scipy/stats/_levy_stable/levyst.cpython-313t-darwin.so +0 -0
- scipy/stats/_morestats.py +118 -73
- scipy/stats/_mstats_basic.py +13 -17
- scipy/stats/_mstats_extras.py +8 -8
- scipy/stats/_multivariate.py +89 -113
- scipy/stats/_new_distributions.py +97 -20
- scipy/stats/_page_trend_test.py +12 -5
- scipy/stats/_probability_distribution.py +265 -43
- scipy/stats/_qmc.py +14 -9
- scipy/stats/_qmc_cy.cpython-313t-darwin.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-313t-darwin.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-313t-darwin.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-313t-darwin.so +0 -0
- scipy/stats/_stats.cpython-313t-darwin.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-313t-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-313t-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
- scipy/stats/_variation.py +6 -8
- scipy/stats/_wilcoxon.py +13 -7
- scipy/stats/tests/common_tests.py +6 -4
- scipy/stats/tests/test_axis_nan_policy.py +62 -24
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +379 -60
- scipy/stats/tests/test_continuous_basic.py +18 -12
- scipy/stats/tests/test_discrete_basic.py +14 -8
- scipy/stats/tests/test_discrete_distns.py +16 -16
- scipy/stats/tests/test_distributions.py +95 -75
- scipy/stats/tests/test_entropy.py +40 -48
- scipy/stats/tests/test_fit.py +4 -3
- scipy/stats/tests/test_hypotests.py +153 -24
- scipy/stats/tests/test_kdeoth.py +109 -41
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_morestats.py +79 -47
- scipy/stats/tests/test_mstats_basic.py +3 -3
- scipy/stats/tests/test_multivariate.py +434 -83
- scipy/stats/tests/test_qmc.py +13 -10
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +119 -112
- scipy/stats/tests/test_resampling.py +47 -56
- scipy/stats/tests/test_sampling.py +9 -4
- scipy/stats/tests/test_stats.py +799 -939
- scipy/stats/tests/test_variation.py +8 -6
- scipy/version.py +2 -2
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +559 -566
- scipy-1.16.0rc2.dist-info/WHEEL +6 -0
- scipy/_lib/array_api_extra/_funcs.py +0 -484
- scipy/_lib/array_api_extra/_typing.py +0 -8
- scipy/interpolate/_bspl.cpython-313t-darwin.so +0 -0
- scipy/optimize/_cobyla.cpython-313t-darwin.so +0 -0
- scipy/optimize/_cython_nnls.cpython-313t-darwin.so +0 -0
- scipy/optimize/_slsqp.cpython-313t-darwin.so +0 -0
- scipy/spatial/qhull_src/COPYING.txt +0 -38
- scipy/special/libsf_error_state.dylib +0 -0
- scipy/special/tests/test_log_softmax.py +0 -109
- scipy/special/tests/test_xsf_cuda.py +0 -114
- scipy/special/xsf/binom.h +0 -89
- scipy/special/xsf/cdflib.h +0 -100
- scipy/special/xsf/cephes/airy.h +0 -307
- scipy/special/xsf/cephes/besselpoly.h +0 -51
- scipy/special/xsf/cephes/beta.h +0 -257
- scipy/special/xsf/cephes/cbrt.h +0 -131
- scipy/special/xsf/cephes/chbevl.h +0 -85
- scipy/special/xsf/cephes/chdtr.h +0 -193
- scipy/special/xsf/cephes/const.h +0 -87
- scipy/special/xsf/cephes/ellie.h +0 -293
- scipy/special/xsf/cephes/ellik.h +0 -251
- scipy/special/xsf/cephes/ellpe.h +0 -107
- scipy/special/xsf/cephes/ellpk.h +0 -117
- scipy/special/xsf/cephes/expn.h +0 -260
- scipy/special/xsf/cephes/gamma.h +0 -398
- scipy/special/xsf/cephes/hyp2f1.h +0 -596
- scipy/special/xsf/cephes/hyperg.h +0 -361
- scipy/special/xsf/cephes/i0.h +0 -149
- scipy/special/xsf/cephes/i1.h +0 -158
- scipy/special/xsf/cephes/igam.h +0 -421
- scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
- scipy/special/xsf/cephes/igami.h +0 -313
- scipy/special/xsf/cephes/j0.h +0 -225
- scipy/special/xsf/cephes/j1.h +0 -198
- scipy/special/xsf/cephes/jv.h +0 -715
- scipy/special/xsf/cephes/k0.h +0 -164
- scipy/special/xsf/cephes/k1.h +0 -163
- scipy/special/xsf/cephes/kn.h +0 -243
- scipy/special/xsf/cephes/lanczos.h +0 -112
- scipy/special/xsf/cephes/ndtr.h +0 -275
- scipy/special/xsf/cephes/poch.h +0 -85
- scipy/special/xsf/cephes/polevl.h +0 -167
- scipy/special/xsf/cephes/psi.h +0 -194
- scipy/special/xsf/cephes/rgamma.h +0 -111
- scipy/special/xsf/cephes/scipy_iv.h +0 -811
- scipy/special/xsf/cephes/shichi.h +0 -248
- scipy/special/xsf/cephes/sici.h +0 -224
- scipy/special/xsf/cephes/sindg.h +0 -221
- scipy/special/xsf/cephes/tandg.h +0 -139
- scipy/special/xsf/cephes/trig.h +0 -58
- scipy/special/xsf/cephes/unity.h +0 -186
- scipy/special/xsf/cephes/zeta.h +0 -172
- scipy/special/xsf/config.h +0 -304
- scipy/special/xsf/digamma.h +0 -205
- scipy/special/xsf/error.h +0 -57
- scipy/special/xsf/evalpoly.h +0 -47
- scipy/special/xsf/expint.h +0 -266
- scipy/special/xsf/hyp2f1.h +0 -694
- scipy/special/xsf/iv_ratio.h +0 -173
- scipy/special/xsf/lambertw.h +0 -150
- scipy/special/xsf/loggamma.h +0 -163
- scipy/special/xsf/sici.h +0 -200
- scipy/special/xsf/tools.h +0 -427
- scipy/special/xsf/trig.h +0 -164
- scipy/special/xsf/wright_bessel.h +0 -843
- scipy/special/xsf/zlog1.h +0 -35
- scipy/stats/_mvn.cpython-313t-darwin.so +0 -0
- scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -1,4 +1,5 @@
|
|
1
1
|
from itertools import product
|
2
|
+
from multiprocessing import Pool
|
2
3
|
|
3
4
|
import numpy as np
|
4
5
|
from numpy.linalg import norm
|
@@ -6,13 +7,14 @@ from numpy.testing import (assert_, assert_allclose,
|
|
6
7
|
assert_equal, suppress_warnings)
|
7
8
|
import pytest
|
8
9
|
from pytest import raises as assert_raises
|
9
|
-
from scipy.sparse import issparse,
|
10
|
+
from scipy.sparse import issparse, lil_array
|
10
11
|
from scipy.sparse.linalg import aslinearoperator
|
11
12
|
|
12
13
|
from scipy.optimize import least_squares, Bounds
|
13
14
|
from scipy.optimize._lsq.least_squares import IMPLEMENTED_LOSSES
|
14
15
|
from scipy.optimize._lsq.common import EPS, make_strictly_feasible, CL_scaling_vector
|
15
16
|
|
17
|
+
from scipy.optimize import OptimizeResult
|
16
18
|
|
17
19
|
def fun_trivial(x, a=0):
|
18
20
|
return (x - a)**2 + 5.0
|
@@ -34,6 +36,15 @@ def fun_rosenbrock(x):
|
|
34
36
|
return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])
|
35
37
|
|
36
38
|
|
39
|
+
class Fun_Rosenbrock:
|
40
|
+
def __init__(self):
|
41
|
+
self.nfev = 0
|
42
|
+
|
43
|
+
def __call__(self, x, a=0):
|
44
|
+
self.nfev += 1
|
45
|
+
return fun_rosenbrock(x)
|
46
|
+
|
47
|
+
|
37
48
|
def jac_rosenbrock(x):
|
38
49
|
return np.array([
|
39
50
|
[-20 * x[0], 10],
|
@@ -92,7 +103,7 @@ class BroydenTridiagonal:
|
|
92
103
|
self.x0 = make_strictly_feasible(self.x0, self.lb, self.ub)
|
93
104
|
|
94
105
|
if mode == 'sparse':
|
95
|
-
self.sparsity =
|
106
|
+
self.sparsity = lil_array((n, n), dtype=int)
|
96
107
|
i = np.arange(n)
|
97
108
|
self.sparsity[i, i] = 1
|
98
109
|
i = np.arange(1, n)
|
@@ -116,7 +127,7 @@ class BroydenTridiagonal:
|
|
116
127
|
return f
|
117
128
|
|
118
129
|
def _jac(self, x):
|
119
|
-
J =
|
130
|
+
J = lil_array((self.n, self.n))
|
120
131
|
i = np.arange(self.n)
|
121
132
|
J[i, i] = 3 - 2 * x
|
122
133
|
i = np.arange(1, self.n)
|
@@ -227,25 +238,17 @@ class BaseMixin:
|
|
227
238
|
2.0, x_scale='auto', method=self.method)
|
228
239
|
assert_raises(ValueError, least_squares, fun_trivial,
|
229
240
|
2.0, x_scale=-1.0, method=self.method)
|
230
|
-
assert_raises(ValueError, least_squares, fun_trivial,
|
231
|
-
2.0, x_scale=None, method=self.method)
|
232
241
|
assert_raises(ValueError, least_squares, fun_trivial,
|
233
242
|
2.0, x_scale=1.0+2.0j, method=self.method)
|
234
243
|
|
235
244
|
def test_diff_step(self):
|
236
|
-
# res1 and res2 should be equivalent.
|
237
|
-
# res2 and res3 should be different.
|
238
245
|
res1 = least_squares(fun_trivial, 2.0, diff_step=1e-1,
|
239
246
|
method=self.method)
|
240
|
-
res2 = least_squares(fun_trivial, 2.0, diff_step=-1e-1,
|
241
|
-
method=self.method)
|
242
247
|
res3 = least_squares(fun_trivial, 2.0,
|
243
248
|
diff_step=None, method=self.method)
|
244
249
|
assert_allclose(res1.x, 0, atol=1e-4)
|
245
|
-
assert_allclose(res2.x, 0, atol=1e-4)
|
246
250
|
assert_allclose(res3.x, 0, atol=1e-4)
|
247
|
-
|
248
|
-
assert_equal(res1.nfev, res2.nfev)
|
251
|
+
|
249
252
|
|
250
253
|
def test_incorrect_options_usage(self):
|
251
254
|
assert_raises(TypeError, least_squares, fun_trivial, 2.0,
|
@@ -265,7 +268,6 @@ class BaseMixin:
|
|
265
268
|
assert_allclose(res.optimality, 0, atol=1e-2)
|
266
269
|
assert_equal(res.active_mask, 0)
|
267
270
|
if self.method == 'lm':
|
268
|
-
assert_(res.nfev < 30)
|
269
271
|
assert_(res.njev is None)
|
270
272
|
else:
|
271
273
|
assert_(res.nfev < 10)
|
@@ -293,6 +295,17 @@ class BaseMixin:
|
|
293
295
|
assert_equal(res.status, 0)
|
294
296
|
assert_equal(res.success, 0)
|
295
297
|
|
298
|
+
def test_nfev(self):
|
299
|
+
# checks that the true number of nfev are being consumed
|
300
|
+
for i in range(1, 3):
|
301
|
+
rng = np.random.default_rng(128908)
|
302
|
+
x0 = rng.uniform(size=2) * 10
|
303
|
+
ftrivial = Fun_Rosenbrock()
|
304
|
+
res = least_squares(
|
305
|
+
ftrivial, x0, jac=jac_rosenbrock, method=self.method, max_nfev=i
|
306
|
+
)
|
307
|
+
assert res.nfev == ftrivial.nfev
|
308
|
+
|
296
309
|
def test_rosenbrock(self):
|
297
310
|
x0 = [-2, 1]
|
298
311
|
x_opt = [1, 1]
|
@@ -387,6 +400,27 @@ class BaseMixin:
|
|
387
400
|
method=self.method)
|
388
401
|
assert_allclose(res.x, x_opt)
|
389
402
|
|
403
|
+
@pytest.mark.fail_slow(5.0)
|
404
|
+
def test_workers(self):
|
405
|
+
serial = least_squares(fun_trivial, 2.0, method=self.method)
|
406
|
+
|
407
|
+
reses = []
|
408
|
+
for workers in [None, 2]:
|
409
|
+
res = least_squares(
|
410
|
+
fun_trivial, 2.0, method=self.method, workers=workers
|
411
|
+
)
|
412
|
+
reses.append(res)
|
413
|
+
with Pool() as workers:
|
414
|
+
res = least_squares(
|
415
|
+
fun_trivial, 2.0, method=self.method, workers=workers.map
|
416
|
+
)
|
417
|
+
reses.append(res)
|
418
|
+
for res in reses:
|
419
|
+
assert res.success
|
420
|
+
assert_equal(res.x, serial.x)
|
421
|
+
assert_equal(res.nfev, serial.nfev)
|
422
|
+
assert_equal(res.njev, serial.njev)
|
423
|
+
|
390
424
|
|
391
425
|
class BoundsMixin:
|
392
426
|
def test_inconsistent(self):
|
@@ -779,6 +813,17 @@ class TestLM(BaseMixin):
|
|
779
813
|
|
780
814
|
assert_raises(ValueError, least_squares, fun_trivial, 2.0,
|
781
815
|
method='lm', loss='huber')
|
816
|
+
|
817
|
+
def test_callback_with_lm_method(self):
|
818
|
+
def callback(x):
|
819
|
+
assert(False) # Dummy callback function
|
820
|
+
|
821
|
+
with suppress_warnings() as sup:
|
822
|
+
sup.filter(
|
823
|
+
UserWarning,
|
824
|
+
"Callback function specified, but not supported with `lm` method."
|
825
|
+
)
|
826
|
+
least_squares(fun_trivial, x0=[0], method='lm', callback=callback)
|
782
827
|
|
783
828
|
|
784
829
|
def test_basic():
|
@@ -787,6 +832,73 @@ def test_basic():
|
|
787
832
|
assert_allclose(res.x, 0, atol=1e-10)
|
788
833
|
|
789
834
|
|
835
|
+
def test_callback():
|
836
|
+
# test that callback function works as expected
|
837
|
+
|
838
|
+
results = []
|
839
|
+
|
840
|
+
def my_callback_optimresult(intermediate_result: OptimizeResult):
|
841
|
+
results.append(intermediate_result)
|
842
|
+
|
843
|
+
def my_callback_x(x):
|
844
|
+
r = OptimizeResult()
|
845
|
+
r.nit = 1
|
846
|
+
r.x = x
|
847
|
+
results.append(r)
|
848
|
+
return False
|
849
|
+
|
850
|
+
def my_callback_optimresult_stop_exception(
|
851
|
+
intermediate_result: OptimizeResult):
|
852
|
+
results.append(intermediate_result)
|
853
|
+
raise StopIteration
|
854
|
+
|
855
|
+
def my_callback_x_stop_exception(x):
|
856
|
+
r = OptimizeResult()
|
857
|
+
r.nit = 1
|
858
|
+
r.x = x
|
859
|
+
results.append(r)
|
860
|
+
raise StopIteration
|
861
|
+
|
862
|
+
# Try for different function signatures and stop methods
|
863
|
+
callbacks_nostop = [my_callback_optimresult, my_callback_x]
|
864
|
+
callbacks_stop = [my_callback_optimresult_stop_exception,
|
865
|
+
my_callback_x_stop_exception]
|
866
|
+
|
867
|
+
# Try for all the implemented methods: trf, trf_bounds and dogbox
|
868
|
+
calls = [
|
869
|
+
lambda callback: least_squares(fun_trivial, 5.0, method='trf',
|
870
|
+
callback=callback),
|
871
|
+
lambda callback: least_squares(fun_trivial, 5.0, method='trf',
|
872
|
+
bounds=(-8.0, 8.0), callback=callback),
|
873
|
+
lambda callback: least_squares(fun_trivial, 5.0, method='dogbox',
|
874
|
+
callback=callback)
|
875
|
+
]
|
876
|
+
|
877
|
+
for mycallback, call in product(callbacks_nostop, calls):
|
878
|
+
results.clear()
|
879
|
+
# Call the different implemented methods
|
880
|
+
res = call(mycallback)
|
881
|
+
# Check that callback was called
|
882
|
+
assert len(results) > 0
|
883
|
+
# Check that results data makes sense
|
884
|
+
assert results[-1].nit > 0
|
885
|
+
# Check that it didn't stop because of the callback
|
886
|
+
assert res.status != -2
|
887
|
+
# final callback x should be same as final result
|
888
|
+
assert_allclose(results[-1].x, res.x)
|
889
|
+
|
890
|
+
for mycallback, call in product(callbacks_stop, calls):
|
891
|
+
results.clear()
|
892
|
+
# Call the different implemented methods
|
893
|
+
res = call(mycallback)
|
894
|
+
# Check that callback was called
|
895
|
+
assert len(results) > 0
|
896
|
+
# Check that only one iteration was run
|
897
|
+
assert results[-1].nit == 1
|
898
|
+
# Check that it stopped because of the callback
|
899
|
+
assert res.status == -2
|
900
|
+
|
901
|
+
|
790
902
|
def test_small_tolerances_for_lm():
|
791
903
|
for ftol, xtol, gtol in [(None, 1e-13, 1e-13),
|
792
904
|
(1e-13, None, 1e-13),
|
@@ -7,7 +7,7 @@ import pytest
|
|
7
7
|
import numpy as np
|
8
8
|
|
9
9
|
from scipy.optimize import linear_sum_assignment
|
10
|
-
from scipy.sparse import
|
10
|
+
from scipy.sparse import random_array
|
11
11
|
from scipy.sparse._sputils import matrix
|
12
12
|
from scipy.sparse.csgraph import min_weight_full_bipartite_matching
|
13
13
|
from scipy.sparse.csgraph.tests.test_matching import (
|
@@ -93,8 +93,8 @@ def test_two_methods_give_same_result_on_many_sparse_inputs():
|
|
93
93
|
for _ in range(100):
|
94
94
|
lsa_raises = False
|
95
95
|
mwfbm_raises = False
|
96
|
-
sparse =
|
97
|
-
|
96
|
+
sparse = random_array((100, 100), density=0.06,
|
97
|
+
data_sampler=lambda size: np.random.randint(1, 100, size))
|
98
98
|
# In csgraph, zeros correspond to missing edges, so we explicitly
|
99
99
|
# replace those with infinities
|
100
100
|
dense = np.full(sparse.shape, np.inf)
|
@@ -5,6 +5,7 @@ import sys
|
|
5
5
|
import platform
|
6
6
|
|
7
7
|
import numpy as np
|
8
|
+
from numpy.exceptions import VisibleDeprecationWarning
|
8
9
|
from numpy.testing import (assert_, assert_allclose, assert_equal,
|
9
10
|
assert_array_less, assert_warns, suppress_warnings)
|
10
11
|
from pytest import raises as assert_raises
|
@@ -12,7 +13,6 @@ from scipy.optimize import linprog, OptimizeWarning
|
|
12
13
|
from scipy.optimize._numdiff import approx_derivative
|
13
14
|
from scipy.sparse.linalg import MatrixRankWarning
|
14
15
|
from scipy.linalg import LinAlgWarning
|
15
|
-
from scipy._lib._util import VisibleDeprecationWarning
|
16
16
|
import scipy.sparse
|
17
17
|
import pytest
|
18
18
|
|
@@ -220,7 +220,7 @@ def l1_regression_prob(seed=0, m=8, d=9, n=100):
|
|
220
220
|
# construct the problem
|
221
221
|
c = np.ones(m+n)
|
222
222
|
c[:m] = 0
|
223
|
-
A_ub = scipy.sparse.
|
223
|
+
A_ub = scipy.sparse.lil_array((2*n, n+m))
|
224
224
|
idx = 0
|
225
225
|
for ii in range(n):
|
226
226
|
A_ub[idx, :m] = phi @ x[:, ii]
|
@@ -519,7 +519,7 @@ class LinprogCommonTests:
|
|
519
519
|
rng = np.random.RandomState(0)
|
520
520
|
m = 100
|
521
521
|
n = 150
|
522
|
-
A_eq = scipy.sparse.
|
522
|
+
A_eq = scipy.sparse.random_array((m, n), density=0.5)
|
523
523
|
x_valid = rng.randn(n)
|
524
524
|
c = rng.randn(n)
|
525
525
|
ub = x_valid + rng.rand(n)
|
@@ -4,7 +4,7 @@ import numpy as np
|
|
4
4
|
from numpy.linalg import lstsq
|
5
5
|
from numpy.testing import assert_allclose, assert_equal, assert_
|
6
6
|
|
7
|
-
from scipy.sparse import
|
7
|
+
from scipy.sparse import random_array, coo_array
|
8
8
|
from scipy.sparse.linalg import aslinearoperator
|
9
9
|
from scipy.optimize import lsq_linear
|
10
10
|
from scipy.optimize._minimize import Bounds
|
@@ -177,7 +177,7 @@ class BaseMixin:
|
|
177
177
|
|
178
178
|
assert_(abs(cost_bvls - cost_trf) < cost_trf*1e-10)
|
179
179
|
|
180
|
-
def
|
180
|
+
def test_convergence_small_array(self):
|
181
181
|
A = np.array([[49.0, 41.0, -32.0],
|
182
182
|
[-19.0, -32.0, -8.0],
|
183
183
|
[-13.0, 10.0, 69.0]])
|
@@ -199,7 +199,7 @@ class SparseMixin:
|
|
199
199
|
m = 5000
|
200
200
|
n = 1000
|
201
201
|
rng = np.random.RandomState(0)
|
202
|
-
A =
|
202
|
+
A = random_array((m, n), random_state=rng)
|
203
203
|
b = rng.randn(m)
|
204
204
|
res = lsq_linear(A, b)
|
205
205
|
assert_allclose(res.optimality, 0, atol=1e-6)
|
@@ -213,7 +213,7 @@ class SparseMixin:
|
|
213
213
|
m = 5000
|
214
214
|
n = 1000
|
215
215
|
rng = np.random.RandomState(0)
|
216
|
-
A =
|
216
|
+
A = random_array((m, n), random_state=rng)
|
217
217
|
b = rng.randn(m)
|
218
218
|
lb = rng.randn(n)
|
219
219
|
ub = lb + 1
|
@@ -232,14 +232,14 @@ class SparseMixin:
|
|
232
232
|
data = np.array([1., 1., 1., 1. + 1e-6, 1.])
|
233
233
|
row = np.array([0, 0, 1, 2, 2])
|
234
234
|
col = np.array([0, 2, 1, 0, 2])
|
235
|
-
A =
|
235
|
+
A = coo_array((data, (row, col)), shape=(3, 3))
|
236
236
|
|
237
237
|
# Get the exact solution
|
238
238
|
exact_sol = lsq_linear(A.toarray(), b, lsq_solver='exact')
|
239
239
|
|
240
240
|
# Default lsmr arguments should not fully converge the solution
|
241
241
|
default_lsmr_sol = lsq_linear(A, b, lsq_solver='lsmr')
|
242
|
-
with pytest.raises(AssertionError
|
242
|
+
with pytest.raises(AssertionError):
|
243
243
|
assert_allclose(exact_sol.x, default_lsmr_sol.x)
|
244
244
|
|
245
245
|
# By increasing the maximum lsmr iters, it will converge
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import numpy as np
|
2
2
|
import pytest
|
3
3
|
from scipy.linalg import block_diag
|
4
|
-
from scipy.sparse import
|
4
|
+
from scipy.sparse import csc_array
|
5
5
|
from numpy.testing import (assert_array_almost_equal,
|
6
6
|
assert_array_less, assert_,
|
7
7
|
suppress_warnings)
|
@@ -430,7 +430,7 @@ class Elec:
|
|
430
430
|
Jx = 2 * np.diag(x_coord)
|
431
431
|
Jy = 2 * np.diag(y_coord)
|
432
432
|
Jz = 2 * np.diag(z_coord)
|
433
|
-
return
|
433
|
+
return csc_array(np.hstack((Jx, Jy, Jz)))
|
434
434
|
else:
|
435
435
|
jac = self.constr_jac
|
436
436
|
|
@@ -308,7 +308,7 @@ class TestLeastSq:
|
|
308
308
|
p0 = array([0,0,0])
|
309
309
|
params_fit, ier = leastsq(self.residuals, p0,
|
310
310
|
args=(self.y_meas, self.x))
|
311
|
-
assert_(ier in (1,2,3,4), 'solution not found (ier
|
311
|
+
assert_(ier in (1, 2, 3, 4), f'solution not found (ier={ier})')
|
312
312
|
# low precision due to random
|
313
313
|
assert_array_almost_equal(params_fit, self.abc, decimal=2)
|
314
314
|
|
@@ -317,7 +317,7 @@ class TestLeastSq:
|
|
317
317
|
params_fit, ier = leastsq(self.residuals, p0,
|
318
318
|
args=(self.y_meas, self.x),
|
319
319
|
Dfun=self.residuals_jacobian)
|
320
|
-
assert_(ier in (1,2,3,4), 'solution not found (ier
|
320
|
+
assert_(ier in (1, 2, 3, 4), f'solution not found (ier={ier})')
|
321
321
|
# low precision due to random
|
322
322
|
assert_array_almost_equal(params_fit, self.abc, decimal=2)
|
323
323
|
|
@@ -405,7 +405,7 @@ class TestLeastSq:
|
|
405
405
|
p0 = array([0,0,0])
|
406
406
|
params_fit, ier = leastsq(func, p0,
|
407
407
|
args=(self.y_meas, self.x))
|
408
|
-
assert_(ier in (1,2,3,4), 'solution not found (ier
|
408
|
+
assert_(ier in (1, 2, 3, 4), f'solution not found (ier={ier})')
|
409
409
|
# low precision due to random
|
410
410
|
assert_array_almost_equal(params_fit, self.abc, decimal=2)
|
411
411
|
|
@@ -418,7 +418,7 @@ class TestLeastSq:
|
|
418
418
|
params_fit, ier = leastsq(self.residuals, p0,
|
419
419
|
args=(self.y_meas, self.x),
|
420
420
|
Dfun=deriv_func)
|
421
|
-
assert_(ier in (1,2,3,4), 'solution not found (ier
|
421
|
+
assert_(ier in (1, 2, 3, 4), f'solution not found (ier={ier})')
|
422
422
|
# low precision due to random
|
423
423
|
assert_array_almost_equal(params_fit, self.abc, decimal=2)
|
424
424
|
|
@@ -2,6 +2,7 @@ import numpy as np
|
|
2
2
|
from numpy.testing import assert_allclose
|
3
3
|
from pytest import raises as assert_raises
|
4
4
|
from scipy.optimize import nnls
|
5
|
+
import pytest
|
5
6
|
|
6
7
|
|
7
8
|
class TestNNLS:
|
@@ -21,7 +22,7 @@ class TestNNLS:
|
|
21
22
|
x = np.abs(self.rng.uniform(low=-2, high=2, size=[10]))
|
22
23
|
x[::2] = 0
|
23
24
|
b = a @ x
|
24
|
-
xact, rnorm = nnls(a, b
|
25
|
+
xact, rnorm = nnls(a, b)
|
25
26
|
assert_allclose(xact, x, rtol=0., atol=1e-10)
|
26
27
|
assert rnorm < 1e-12
|
27
28
|
|
@@ -32,7 +33,7 @@ class TestNNLS:
|
|
32
33
|
x = np.abs(self.rng.uniform(low=-2, high=2, size=[120]))
|
33
34
|
x[::2] = 0
|
34
35
|
b = a @ x
|
35
|
-
xact, rnorm = nnls(a, b
|
36
|
+
xact, rnorm = nnls(a, b)
|
36
37
|
assert_allclose(xact, x, rtol=0., atol=1e-10)
|
37
38
|
assert rnorm < 1e-12
|
38
39
|
|
@@ -153,7 +154,7 @@ class TestNNLS:
|
|
153
154
|
k[nz] = 0
|
154
155
|
W = np.diag(w)
|
155
156
|
|
156
|
-
dact, _ = nnls(W @ A, W @ k
|
157
|
+
dact, _ = nnls(W @ A, W @ k)
|
157
158
|
|
158
159
|
p = np.cumsum(dact)
|
159
160
|
assert np.all(dact >= 0)
|
@@ -427,3 +428,42 @@ class TestNNLS:
|
|
427
428
|
assert_allclose(sol, np.array([0.0, 0.0, 76.3611306173957, 0.0, 0.0]),
|
428
429
|
atol=5e-14)
|
429
430
|
assert np.abs(np.linalg.norm(A@sol - b) - res) < 5e-14
|
431
|
+
|
432
|
+
def test_atol_deprecation_warning(self):
|
433
|
+
"""Test that using atol parameter triggers deprecation warning"""
|
434
|
+
a = np.array([[1, 0], [1, 0], [0, 1]])
|
435
|
+
b = np.array([2, 1, 1])
|
436
|
+
|
437
|
+
with pytest.warns(DeprecationWarning, match="{'atol'}"):
|
438
|
+
nnls(a, b, atol=1e-8)
|
439
|
+
|
440
|
+
def test_2D_singleton_RHS_input(self):
|
441
|
+
# Test that a 2D singleton RHS input is accepted
|
442
|
+
A = np.array([[1.0, 0.5, -1.],
|
443
|
+
[1.0, 0.5, 0.0],
|
444
|
+
[-1., 0.0, 1.0]])
|
445
|
+
b = np.array([[-1.0, 2.0, 2.0]]).T
|
446
|
+
x, r = nnls(A, b)
|
447
|
+
assert_allclose(x, np.array([1.0, 2.0, 3.0]))
|
448
|
+
assert_allclose(r, 0.0)
|
449
|
+
|
450
|
+
def test_2D_not_singleton_RHS_input_2(self):
|
451
|
+
# Test that a 2D but not a column vector RHS input is rejected
|
452
|
+
A = np.array([[1.0, 0.5, -1.],
|
453
|
+
[1.0, 0.5, 0.0],
|
454
|
+
[1.0, 0.5, 0.0],
|
455
|
+
[0.0, 0.0, 1.0]])
|
456
|
+
b = np.ones(shape=[4, 2], dtype=np.float64)
|
457
|
+
with pytest.raises(ValueError, match="Expected a 1D array"):
|
458
|
+
nnls(A, b)
|
459
|
+
|
460
|
+
def test_gh_22791_32bit(self):
|
461
|
+
# Scikit-learn got hit by this problem on 32-bit arch.
|
462
|
+
desired = [0, 0, 1.05617285, 0, 0, 0, 0, 0.23123048, 0, 0, 0, 0.26128651]
|
463
|
+
rng = np.random.RandomState(42)
|
464
|
+
n_samples, n_features = 5, 12
|
465
|
+
X = rng.randn(n_samples, n_features)
|
466
|
+
X[:2, :] = 0
|
467
|
+
y = rng.randn(n_samples)
|
468
|
+
coef, _ = nnls(X, y)
|
469
|
+
assert_allclose(coef, desired)
|
@@ -12,6 +12,7 @@ from numpy import diag, dot
|
|
12
12
|
from numpy.linalg import inv
|
13
13
|
import numpy as np
|
14
14
|
import scipy
|
15
|
+
from scipy.sparse.linalg import minres
|
15
16
|
|
16
17
|
from .test_minpack import pressure_network
|
17
18
|
|
@@ -217,6 +218,41 @@ class TestNonlin:
|
|
217
218
|
with pytest.raises(scipy.optimize.NoConvergence):
|
218
219
|
nonlin.newton_krylov(wont_converge, xin=[0], maxiter=1)
|
219
220
|
|
221
|
+
def test_warnings_invalid_inner_param(self):
|
222
|
+
"""
|
223
|
+
Test for ENH #21986, for behavior of `nonlin.newton_krylov`
|
224
|
+
Test the following scenarios:
|
225
|
+
1. Raise warning for invalid inner param
|
226
|
+
2. No warning for valid inner param
|
227
|
+
3. No warning for user-provided callable method
|
228
|
+
"""
|
229
|
+
# This should raise exactly one warning
|
230
|
+
# (`inner_atol` is not valid for `minres`)
|
231
|
+
with pytest.warns(UserWarning,
|
232
|
+
match="Please check inner method documentation"):
|
233
|
+
nonlin.newton_krylov(F, F.xin, method="minres", inner_atol=1e-5)
|
234
|
+
|
235
|
+
# This should not raise a warning (`minres` without `inner_atol`,
|
236
|
+
# but with `inner_maxiter` which is valid)
|
237
|
+
nonlin.newton_krylov(F, F.xin, method="minres", inner_maxiter=100,
|
238
|
+
inner_callback= lambda _ : ...)
|
239
|
+
|
240
|
+
# Test newton_krylov with a user-provided callable method
|
241
|
+
def user_provided_callable_method_enh_21986(op, rhs, **kwargs):
|
242
|
+
"""A dummy user-provided callable method for testing."""
|
243
|
+
# Return a dummy result (mimicking minres)
|
244
|
+
return minres(op, rhs, **kwargs)
|
245
|
+
# This should not raise any warnings
|
246
|
+
nonlin.newton_krylov(F, F.xin,
|
247
|
+
method=user_provided_callable_method_enh_21986)
|
248
|
+
|
249
|
+
def test_non_inner_prefix(self):
|
250
|
+
with pytest.raises(ValueError,
|
251
|
+
match="Unknown parameter"
|
252
|
+
):
|
253
|
+
# Pass a parameter without 'inner_' prefix
|
254
|
+
nonlin.newton_krylov(F, F.xin, method="minres", invalid_param=1e-5)
|
255
|
+
|
220
256
|
|
221
257
|
class TestSecant:
|
222
258
|
"""Check that some Jacobian approximations satisfy the secant condition"""
|