scipy 1.15.3__cp312-cp312-musllinux_1_2_aarch64.whl → 1.16.0rc2__cp312-cp312-musllinux_1_2_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scipy/__config__.py +10 -10
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/_array_api.py +486 -161
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_bunch.py +4 -0
- scipy/_lib/_ccallback_c.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_fpumode.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_ccallback.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/_test_deprecation_call.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/_test_deprecation_def.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/_testutils.py +6 -2
- scipy/_lib/_uarray/_uarray.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/_util.py +222 -125
- scipy/_lib/array_api_compat/__init__.py +4 -4
- scipy/_lib/array_api_compat/_internal.py +19 -6
- scipy/_lib/array_api_compat/common/__init__.py +1 -1
- scipy/_lib/array_api_compat/common/_aliases.py +365 -193
- scipy/_lib/array_api_compat/common/_fft.py +94 -64
- scipy/_lib/array_api_compat/common/_helpers.py +413 -180
- scipy/_lib/array_api_compat/common/_linalg.py +116 -40
- scipy/_lib/array_api_compat/common/_typing.py +179 -10
- scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
- scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
- scipy/_lib/array_api_compat/cupy/_info.py +16 -6
- scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
- scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
- scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
- scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
- scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
- scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
- scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
- scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
- scipy/_lib/array_api_compat/numpy/_info.py +36 -16
- scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
- scipy/_lib/array_api_compat/numpy/fft.py +11 -5
- scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
- scipy/_lib/array_api_compat/torch/__init__.py +3 -5
- scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
- scipy/_lib/array_api_compat/torch/_info.py +27 -16
- scipy/_lib/array_api_compat/torch/_typing.py +3 -0
- scipy/_lib/array_api_compat/torch/fft.py +17 -18
- scipy/_lib/array_api_compat/torch/linalg.py +16 -16
- scipy/_lib/array_api_extra/__init__.py +26 -3
- scipy/_lib/array_api_extra/_delegation.py +171 -0
- scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_at.py +463 -0
- scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
- scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
- scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
- scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
- scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
- scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
- scipy/_lib/array_api_extra/testing.py +359 -0
- scipy/_lib/decorator.py +2 -2
- scipy/_lib/doccer.py +1 -7
- scipy/_lib/messagestream.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/test__util.py +105 -121
- scipy/_lib/tests/test_array_api.py +166 -35
- scipy/_lib/tests/test_bunch.py +7 -0
- scipy/_lib/tests/test_ccallback.py +2 -10
- scipy/_lib/tests/test_public_api.py +13 -0
- scipy/cluster/_hierarchy.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/cluster/_vq.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/cluster/hierarchy.py +393 -223
- scipy/cluster/tests/test_hierarchy.py +273 -335
- scipy/cluster/tests/test_vq.py +45 -61
- scipy/cluster/vq.py +39 -35
- scipy/conftest.py +263 -157
- scipy/constants/_constants.py +4 -1
- scipy/constants/tests/test_codata.py +2 -2
- scipy/constants/tests/test_constants.py +11 -18
- scipy/datasets/_download_all.py +15 -1
- scipy/datasets/_fetchers.py +7 -1
- scipy/datasets/_utils.py +1 -1
- scipy/differentiate/_differentiate.py +25 -25
- scipy/differentiate/tests/test_differentiate.py +24 -25
- scipy/fft/_basic.py +20 -0
- scipy/fft/_helper.py +3 -34
- scipy/fft/_pocketfft/helper.py +29 -1
- scipy/fft/_pocketfft/pypocketfft.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/fft/_pocketfft/tests/test_basic.py +2 -4
- scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
- scipy/fft/_realtransforms.py +13 -0
- scipy/fft/tests/test_basic.py +27 -25
- scipy/fft/tests/test_fftlog.py +16 -7
- scipy/fft/tests/test_helper.py +18 -34
- scipy/fft/tests/test_real_transforms.py +8 -10
- scipy/fftpack/convolve.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/fftpack/tests/test_basic.py +2 -4
- scipy/fftpack/tests/test_real_transforms.py +8 -9
- scipy/integrate/_bvp.py +9 -3
- scipy/integrate/_cubature.py +3 -2
- scipy/integrate/_dop.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/integrate/_lsoda.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/integrate/_quadpack_py.py +11 -7
- scipy/integrate/_quadrature.py +3 -3
- scipy/integrate/_rules/_base.py +2 -2
- scipy/integrate/_tanhsinh.py +48 -47
- scipy/integrate/_test_multivariate.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/integrate/_test_odeint_banded.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/integrate/_vode.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/integrate/tests/test__quad_vec.py +0 -6
- scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
- scipy/integrate/tests/test_cubature.py +21 -35
- scipy/integrate/tests/test_quadrature.py +6 -8
- scipy/integrate/tests/test_tanhsinh.py +56 -48
- scipy/interpolate/__init__.py +70 -58
- scipy/interpolate/_bary_rational.py +22 -22
- scipy/interpolate/_bsplines.py +119 -66
- scipy/interpolate/_cubic.py +65 -50
- scipy/interpolate/_dfitpack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_dierckx.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_fitpack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_fitpack2.py +9 -6
- scipy/interpolate/_fitpack_impl.py +32 -26
- scipy/interpolate/_fitpack_repro.py +23 -19
- scipy/interpolate/_interpnd.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_interpolate.py +30 -12
- scipy/interpolate/_ndbspline.py +13 -18
- scipy/interpolate/_ndgriddata.py +5 -8
- scipy/interpolate/_polyint.py +95 -31
- scipy/interpolate/_ppoly.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/interpolate/dfitpack.py +0 -20
- scipy/interpolate/interpnd.py +1 -2
- scipy/interpolate/tests/test_bary_rational.py +2 -2
- scipy/interpolate/tests/test_bsplines.py +97 -1
- scipy/interpolate/tests/test_fitpack2.py +39 -1
- scipy/interpolate/tests/test_interpnd.py +32 -20
- scipy/interpolate/tests/test_interpolate.py +48 -4
- scipy/interpolate/tests/test_rgi.py +2 -1
- scipy/io/_fast_matrix_market/__init__.py +2 -0
- scipy/io/_fast_matrix_market/_fmm_core.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
- scipy/io/_harwell_boeing/hb.py +7 -11
- scipy/io/_idl.py +5 -7
- scipy/io/_netcdf.py +15 -5
- scipy/io/_test_fortran.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/io/arff/tests/test_arffread.py +3 -3
- scipy/io/matlab/__init__.py +5 -3
- scipy/io/matlab/_mio.py +4 -1
- scipy/io/matlab/_mio5.py +19 -13
- scipy/io/matlab/_mio5_utils.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/io/matlab/tests/test_mio.py +46 -18
- scipy/io/matlab/tests/test_mio_funcs.py +1 -1
- scipy/io/tests/test_mmio.py +7 -1
- scipy/io/tests/test_wavfile.py +41 -0
- scipy/io/wavfile.py +57 -10
- scipy/linalg/_basic.py +113 -86
- scipy/linalg/_cythonized_array_utils.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_decomp.py +22 -9
- scipy/linalg/_decomp_cholesky.py +28 -13
- scipy/linalg/_decomp_cossin.py +45 -30
- scipy/linalg/_decomp_interpolative.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_decomp_polar.py +2 -0
- scipy/linalg/_decomp_qr.py +6 -2
- scipy/linalg/_decomp_qz.py +3 -0
- scipy/linalg/_decomp_schur.py +3 -1
- scipy/linalg/_decomp_svd.py +13 -2
- scipy/linalg/_decomp_update.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_flapack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/cython_lapack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/linalg/lapack.py +22 -2
- scipy/linalg/tests/_cython_examples/meson.build +7 -0
- scipy/linalg/tests/test_basic.py +31 -16
- scipy/linalg/tests/test_batch.py +588 -0
- scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
- scipy/linalg/tests/test_decomp.py +40 -3
- scipy/linalg/tests/test_decomp_cossin.py +14 -0
- scipy/linalg/tests/test_decomp_ldl.py +1 -1
- scipy/linalg/tests/test_lapack.py +115 -7
- scipy/linalg/tests/test_matfuncs.py +157 -102
- scipy/linalg/tests/test_procrustes.py +0 -7
- scipy/linalg/tests/test_solve_toeplitz.py +1 -1
- scipy/linalg/tests/test_special_matrices.py +1 -5
- scipy/ndimage/__init__.py +1 -0
- scipy/ndimage/_ctest.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_cytest.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_delegators.py +8 -2
- scipy/ndimage/_filters.py +453 -5
- scipy/ndimage/_interpolation.py +36 -6
- scipy/ndimage/_measurements.py +4 -2
- scipy/ndimage/_morphology.py +5 -0
- scipy/ndimage/_nd_image.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_support_alternative_backends.py +18 -6
- scipy/ndimage/tests/test_filters.py +370 -259
- scipy/ndimage/tests/test_fourier.py +7 -9
- scipy/ndimage/tests/test_interpolation.py +68 -61
- scipy/ndimage/tests/test_measurements.py +18 -35
- scipy/ndimage/tests/test_morphology.py +143 -131
- scipy/ndimage/tests/test_splines.py +1 -3
- scipy/odr/__odrpack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_bracket.py +17 -24
- scipy/optimize/_chandrupatla.py +9 -10
- scipy/optimize/_cobyla_py.py +104 -123
- scipy/optimize/_constraints.py +14 -10
- scipy/optimize/_differentiable_functions.py +371 -230
- scipy/optimize/_differentialevolution.py +4 -3
- scipy/optimize/_direct.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_highspy/_core.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_highspy/_highs_options.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_lbfgsb.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_lbfgsb_py.py +57 -16
- scipy/optimize/_linprog_doc.py +2 -2
- scipy/optimize/_linprog_highs.py +2 -2
- scipy/optimize/_linprog_ip.py +25 -10
- scipy/optimize/_linprog_util.py +14 -16
- scipy/optimize/_lsap.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_lsq/least_squares.py +198 -126
- scipy/optimize/_lsq/lsq_linear.py +6 -6
- scipy/optimize/_lsq/trf.py +35 -8
- scipy/optimize/_milp.py +3 -1
- scipy/optimize/_minimize.py +105 -36
- scipy/optimize/_minpack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_nnls.py +20 -21
- scipy/optimize/_nonlin.py +34 -3
- scipy/optimize/_numdiff.py +288 -110
- scipy/optimize/_optimize.py +86 -48
- scipy/optimize/_pava_pybind.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_remove_redundancy.py +5 -5
- scipy/optimize/_root_scalar.py +1 -1
- scipy/optimize/_shgo.py +6 -0
- scipy/optimize/_shgo_lib/_complex.py +1 -1
- scipy/optimize/_slsqp_py.py +216 -124
- scipy/optimize/_slsqplib.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_trustregion.py +20 -6
- scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
- scipy/optimize/_trustregion_constr/projections.py +12 -8
- scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
- scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
- scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
- scipy/optimize/_trustregion_exact.py +0 -1
- scipy/optimize/_zeros.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/slsqp.py +0 -1
- scipy/optimize/tests/test__basinhopping.py +1 -1
- scipy/optimize/tests/test__differential_evolution.py +4 -4
- scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
- scipy/optimize/tests/test__numdiff.py +66 -22
- scipy/optimize/tests/test__remove_redundancy.py +2 -2
- scipy/optimize/tests/test__shgo.py +9 -1
- scipy/optimize/tests/test_bracket.py +36 -46
- scipy/optimize/tests/test_chandrupatla.py +133 -135
- scipy/optimize/tests/test_cobyla.py +74 -45
- scipy/optimize/tests/test_constraints.py +1 -1
- scipy/optimize/tests/test_differentiable_functions.py +226 -6
- scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
- scipy/optimize/tests/test_least_squares.py +125 -13
- scipy/optimize/tests/test_linear_assignment.py +3 -3
- scipy/optimize/tests/test_linprog.py +3 -3
- scipy/optimize/tests/test_lsq_linear.py +6 -6
- scipy/optimize/tests/test_minimize_constrained.py +2 -2
- scipy/optimize/tests/test_minpack.py +4 -4
- scipy/optimize/tests/test_nnls.py +43 -3
- scipy/optimize/tests/test_nonlin.py +36 -0
- scipy/optimize/tests/test_optimize.py +95 -17
- scipy/optimize/tests/test_slsqp.py +36 -4
- scipy/optimize/tests/test_zeros.py +34 -1
- scipy/signal/__init__.py +12 -23
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +459 -241
- scipy/signal/_fir_filter_design.py +262 -90
- scipy/signal/_lti_conversion.py +3 -2
- scipy/signal/_ltisys.py +118 -91
- scipy/signal/_max_len_seq_inner.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_short_time_fft.py +519 -70
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +719 -399
- scipy/signal/_sigtools.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/signal/_sosfilt.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/signal/_spline_filters.py +108 -68
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +4 -1
- scipy/signal/_upfirdn_apply.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/signal/_waveforms.py +2 -11
- scipy/signal/_wavelets.py +1 -1
- scipy/signal/fir_filter_design.py +1 -0
- scipy/signal/spline.py +4 -11
- scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
- scipy/signal/tests/test_bsplines.py +114 -79
- scipy/signal/tests/test_cont2discrete.py +9 -2
- scipy/signal/tests/test_filter_design.py +721 -481
- scipy/signal/tests/test_fir_filter_design.py +332 -140
- scipy/signal/tests/test_savitzky_golay.py +4 -3
- scipy/signal/tests/test_short_time_fft.py +221 -3
- scipy/signal/tests/test_signaltools.py +2144 -1348
- scipy/signal/tests/test_spectral.py +50 -6
- scipy/signal/tests/test_splines.py +161 -96
- scipy/signal/tests/test_upfirdn.py +84 -50
- scipy/signal/tests/test_waveforms.py +20 -0
- scipy/signal/tests/test_windows.py +607 -466
- scipy/signal/windows/_windows.py +287 -148
- scipy/sparse/__init__.py +23 -4
- scipy/sparse/_base.py +270 -108
- scipy/sparse/_bsr.py +7 -4
- scipy/sparse/_compressed.py +59 -231
- scipy/sparse/_construct.py +90 -38
- scipy/sparse/_coo.py +115 -181
- scipy/sparse/_csc.py +4 -4
- scipy/sparse/_csparsetools.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/_csr.py +2 -2
- scipy/sparse/_data.py +48 -48
- scipy/sparse/_dia.py +105 -18
- scipy/sparse/_dok.py +0 -23
- scipy/sparse/_index.py +4 -4
- scipy/sparse/_matrix.py +23 -0
- scipy/sparse/_sparsetools.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/_sputils.py +37 -22
- scipy/sparse/base.py +0 -9
- scipy/sparse/bsr.py +0 -14
- scipy/sparse/compressed.py +0 -23
- scipy/sparse/construct.py +0 -6
- scipy/sparse/coo.py +0 -14
- scipy/sparse/csc.py +0 -3
- scipy/sparse/csgraph/_flow.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/tests/test_matching.py +14 -2
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
- scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
- scipy/sparse/csr.py +0 -5
- scipy/sparse/data.py +1 -6
- scipy/sparse/dia.py +0 -7
- scipy/sparse/dok.py +0 -10
- scipy/sparse/linalg/_dsolve/_superlu.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
- scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
- scipy/sparse/linalg/_interface.py +17 -18
- scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
- scipy/sparse/linalg/_isolve/iterative.py +51 -45
- scipy/sparse/linalg/_isolve/lgmres.py +6 -6
- scipy/sparse/linalg/_isolve/minres.py +5 -5
- scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
- scipy/sparse/linalg/_isolve/utils.py +2 -8
- scipy/sparse/linalg/_matfuncs.py +1 -1
- scipy/sparse/linalg/_norm.py +1 -1
- scipy/sparse/linalg/_propack/_cpropack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
- scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
- scipy/sparse/tests/test_arithmetic1d.py +5 -2
- scipy/sparse/tests/test_base.py +214 -42
- scipy/sparse/tests/test_common1d.py +7 -7
- scipy/sparse/tests/test_construct.py +1 -1
- scipy/sparse/tests/test_coo.py +272 -4
- scipy/sparse/tests/test_sparsetools.py +5 -0
- scipy/sparse/tests/test_sputils.py +36 -7
- scipy/spatial/_ckdtree.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/_distance_pybind.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/_distance_wrap.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/_hausdorff.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/_qhull.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/_voronoi.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/distance.py +49 -42
- scipy/spatial/tests/test_distance.py +15 -1
- scipy/spatial/tests/test_kdtree.py +1 -0
- scipy/spatial/tests/test_qhull.py +7 -2
- scipy/spatial/transform/__init__.py +5 -3
- scipy/spatial/transform/_rigid_transform.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/transform/_rotation.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +1213 -832
- scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
- scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
- scipy/special/__init__.py +1 -47
- scipy/special/_add_newdocs.py +34 -772
- scipy/special/_basic.py +22 -25
- scipy/special/_comb.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_ellip_harm_2.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_gufuncs.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_special_ufuncs.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/_ufuncs_cxx.pxd +2 -15
- scipy/special/_ufuncs_cxx.pyx +5 -44
- scipy/special/_ufuncs_cxx_defs.h +2 -16
- scipy/special/_ufuncs_defs.h +0 -8
- scipy/special/cython_special.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/special/cython_special.pxd +1 -1
- scipy/special/tests/_cython_examples/meson.build +10 -1
- scipy/special/tests/test_basic.py +153 -20
- scipy/special/tests/test_boost_ufuncs.py +3 -0
- scipy/special/tests/test_cdflib.py +35 -11
- scipy/special/tests/test_gammainc.py +16 -0
- scipy/special/tests/test_hyp2f1.py +2 -2
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_logsumexp.py +206 -64
- scipy/special/tests/test_mpmath.py +1 -0
- scipy/special/tests/test_nan_inputs.py +1 -1
- scipy/special/tests/test_orthogonal.py +17 -18
- scipy/special/tests/test_sf_error.py +3 -2
- scipy/special/tests/test_sph_harm.py +6 -7
- scipy/special/tests/test_support_alternative_backends.py +211 -76
- scipy/stats/__init__.py +4 -1
- scipy/stats/_ansari_swilk_statistics.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +277 -310
- scipy/stats/_correlation.py +1 -1
- scipy/stats/_covariance.py +6 -3
- scipy/stats/_discrete_distns.py +39 -32
- scipy/stats/_distn_infrastructure.py +39 -12
- scipy/stats/_distribution_infrastructure.py +900 -238
- scipy/stats/_entropy.py +9 -10
- scipy/{_lib → stats}/_finite_differences.py +1 -1
- scipy/stats/_hypotests.py +83 -50
- scipy/stats/_kde.py +53 -49
- scipy/stats/_ksstats.py +1 -1
- scipy/stats/_levy_stable/__init__.py +7 -15
- scipy/stats/_levy_stable/levyst.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_morestats.py +118 -73
- scipy/stats/_mstats_basic.py +13 -17
- scipy/stats/_mstats_extras.py +8 -8
- scipy/stats/_multivariate.py +89 -113
- scipy/stats/_new_distributions.py +97 -20
- scipy/stats/_page_trend_test.py +12 -5
- scipy/stats/_probability_distribution.py +265 -43
- scipy/stats/_qmc.py +14 -9
- scipy/stats/_qmc_cy.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_stats.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
- scipy/stats/_variation.py +6 -8
- scipy/stats/_wilcoxon.py +13 -7
- scipy/stats/tests/common_tests.py +6 -4
- scipy/stats/tests/test_axis_nan_policy.py +62 -24
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +379 -60
- scipy/stats/tests/test_continuous_basic.py +18 -12
- scipy/stats/tests/test_discrete_basic.py +14 -8
- scipy/stats/tests/test_discrete_distns.py +16 -16
- scipy/stats/tests/test_distributions.py +95 -75
- scipy/stats/tests/test_entropy.py +40 -48
- scipy/stats/tests/test_fit.py +4 -3
- scipy/stats/tests/test_hypotests.py +153 -24
- scipy/stats/tests/test_kdeoth.py +109 -41
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_morestats.py +79 -47
- scipy/stats/tests/test_mstats_basic.py +3 -3
- scipy/stats/tests/test_multivariate.py +434 -83
- scipy/stats/tests/test_qmc.py +13 -10
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +119 -112
- scipy/stats/tests/test_resampling.py +47 -56
- scipy/stats/tests/test_sampling.py +9 -4
- scipy/stats/tests/test_stats.py +799 -939
- scipy/stats/tests/test_variation.py +8 -6
- scipy/version.py +2 -2
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +1262 -1269
- scipy.libs/libgcc_s-69c45f16.so.1 +0 -0
- scipy.libs/libgfortran-db0b6589.so.5.0.0 +0 -0
- scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-1f1a71be.so.6.0.33} +0 -0
- scipy/_lib/array_api_extra/_funcs.py +0 -484
- scipy/_lib/array_api_extra/_typing.py +0 -8
- scipy/interpolate/_bspl.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_cobyla.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_cython_nnls.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/optimize/_slsqp.cpython-312-aarch64-linux-musl.so +0 -0
- scipy/spatial/qhull_src/COPYING.txt +0 -38
- scipy/special/libsf_error_state.so +0 -0
- scipy/special/tests/test_log_softmax.py +0 -109
- scipy/special/tests/test_xsf_cuda.py +0 -114
- scipy/special/xsf/binom.h +0 -89
- scipy/special/xsf/cdflib.h +0 -100
- scipy/special/xsf/cephes/airy.h +0 -307
- scipy/special/xsf/cephes/besselpoly.h +0 -51
- scipy/special/xsf/cephes/beta.h +0 -257
- scipy/special/xsf/cephes/cbrt.h +0 -131
- scipy/special/xsf/cephes/chbevl.h +0 -85
- scipy/special/xsf/cephes/chdtr.h +0 -193
- scipy/special/xsf/cephes/const.h +0 -87
- scipy/special/xsf/cephes/ellie.h +0 -293
- scipy/special/xsf/cephes/ellik.h +0 -251
- scipy/special/xsf/cephes/ellpe.h +0 -107
- scipy/special/xsf/cephes/ellpk.h +0 -117
- scipy/special/xsf/cephes/expn.h +0 -260
- scipy/special/xsf/cephes/gamma.h +0 -398
- scipy/special/xsf/cephes/hyp2f1.h +0 -596
- scipy/special/xsf/cephes/hyperg.h +0 -361
- scipy/special/xsf/cephes/i0.h +0 -149
- scipy/special/xsf/cephes/i1.h +0 -158
- scipy/special/xsf/cephes/igam.h +0 -421
- scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
- scipy/special/xsf/cephes/igami.h +0 -313
- scipy/special/xsf/cephes/j0.h +0 -225
- scipy/special/xsf/cephes/j1.h +0 -198
- scipy/special/xsf/cephes/jv.h +0 -715
- scipy/special/xsf/cephes/k0.h +0 -164
- scipy/special/xsf/cephes/k1.h +0 -163
- scipy/special/xsf/cephes/kn.h +0 -243
- scipy/special/xsf/cephes/lanczos.h +0 -112
- scipy/special/xsf/cephes/ndtr.h +0 -275
- scipy/special/xsf/cephes/poch.h +0 -85
- scipy/special/xsf/cephes/polevl.h +0 -167
- scipy/special/xsf/cephes/psi.h +0 -194
- scipy/special/xsf/cephes/rgamma.h +0 -111
- scipy/special/xsf/cephes/scipy_iv.h +0 -811
- scipy/special/xsf/cephes/shichi.h +0 -248
- scipy/special/xsf/cephes/sici.h +0 -224
- scipy/special/xsf/cephes/sindg.h +0 -221
- scipy/special/xsf/cephes/tandg.h +0 -139
- scipy/special/xsf/cephes/trig.h +0 -58
- scipy/special/xsf/cephes/unity.h +0 -186
- scipy/special/xsf/cephes/zeta.h +0 -172
- scipy/special/xsf/config.h +0 -304
- scipy/special/xsf/digamma.h +0 -205
- scipy/special/xsf/error.h +0 -57
- scipy/special/xsf/evalpoly.h +0 -47
- scipy/special/xsf/expint.h +0 -266
- scipy/special/xsf/hyp2f1.h +0 -694
- scipy/special/xsf/iv_ratio.h +0 -173
- scipy/special/xsf/lambertw.h +0 -150
- scipy/special/xsf/loggamma.h +0 -163
- scipy/special/xsf/sici.h +0 -200
- scipy/special/xsf/tools.h +0 -427
- scipy/special/xsf/trig.h +0 -164
- scipy/special/xsf/wright_bessel.h +0 -843
- scipy/special/xsf/zlog1.h +0 -35
- scipy/stats/_mvn.cpython-312-aarch64-linux-musl.so +0 -0
- scipy.libs/libgcc_s-7393e603.so.1 +0 -0
- scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
scipy/integrate/_tanhsinh.py
CHANGED
@@ -5,7 +5,7 @@ from scipy import special
|
|
5
5
|
import scipy._lib._elementwise_iterative_method as eim
|
6
6
|
from scipy._lib._util import _RichResult
|
7
7
|
from scipy._lib._array_api import (array_namespace, xp_copy, xp_ravel,
|
8
|
-
|
8
|
+
xp_promote)
|
9
9
|
|
10
10
|
|
11
11
|
__all__ = ['nsum']
|
@@ -97,13 +97,10 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
|
|
97
97
|
atol, rtol : float, optional
|
98
98
|
Absolute termination tolerance (default: 0) and relative termination
|
99
99
|
tolerance (default: ``eps**0.75``, where ``eps`` is the precision of
|
100
|
-
the result dtype), respectively.
|
101
|
-
|
102
|
-
|
103
|
-
``
|
104
|
-
conservative, it is said to work well in practice. Must be non-negative
|
105
|
-
and finite if `log` is False, and must be expressed as the log of a
|
106
|
-
non-negative and finite number if `log` is True.
|
100
|
+
the result dtype), respectively. Must be non-negative and finite if
|
101
|
+
`log` is False, and must be expressed as the log of a non-negative and
|
102
|
+
finite number if `log` is True. Iteration will stop when
|
103
|
+
``res.error < atol`` or ``res.error < res.integral * rtol``.
|
107
104
|
preserve_shape : bool, default: False
|
108
105
|
In the following, "arguments of `f`" refers to the array ``xi`` and
|
109
106
|
any arrays within ``argsi``. Let ``shape`` be the broadcasted shape
|
@@ -128,7 +125,7 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
|
|
128
125
|
An optional user-supplied function to be called before the first
|
129
126
|
iteration and after each iteration.
|
130
127
|
Called as ``callback(res)``, where ``res`` is a ``_RichResult``
|
131
|
-
similar to that returned by `
|
128
|
+
similar to that returned by `tanhsinh` (but containing the
|
132
129
|
current iterate's values of all variables). If `callback` raises a
|
133
130
|
``StopIteration``, the algorithm will terminate immediately and
|
134
131
|
`tanhsinh` will return a result object. `callback` must not mutate
|
@@ -175,6 +172,12 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
|
|
175
172
|
finite-precision arithmetic, including some described by [2]_ and [3]_. The
|
176
173
|
tanh-sinh scheme was originally introduced in [4]_.
|
177
174
|
|
175
|
+
Two error estimation schemes are described in [1]_ Section 5: one attempts to
|
176
|
+
detect and exploit quadratic convergence; the other simply compares the integral
|
177
|
+
estimates at successive levels. While neither is theoretically rigorous or
|
178
|
+
conservative, both work well in practice. Our error estimate uses the minimum of
|
179
|
+
these two schemes with a lower bound of ``eps * res.integral``.
|
180
|
+
|
178
181
|
Due to floating-point error in the abscissae, the function may be evaluated
|
179
182
|
at the endpoints of the interval during iterations, but the values returned by
|
180
183
|
the function at the endpoints will be ignored.
|
@@ -364,7 +367,7 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
|
|
364
367
|
aerr = xp_ravel(xp.full(shape, xp.nan, dtype=dtype)) # absolute error
|
365
368
|
status = xp_ravel(xp.full(shape, eim._EINPROGRESS, dtype=xp.int32))
|
366
369
|
h0 = _get_base_step(dtype, xp)
|
367
|
-
h0 =
|
370
|
+
h0 = xp.real(h0) # base step
|
368
371
|
|
369
372
|
# For term `d4` of error estimate ([1] Section 5), we need to keep the
|
370
373
|
# most extreme abscissae and corresponding `fj`s, `wj`s in Euler-Maclaurin
|
@@ -403,8 +406,7 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
|
|
403
406
|
|
404
407
|
# Perform abscissae substitutions for infinite limits of integration
|
405
408
|
xj = xp_copy(work.xj)
|
406
|
-
|
407
|
-
xj[work.abinf] = xj[work.abinf] / (1 - xp_real(xj[work.abinf])**2)
|
409
|
+
xj[work.abinf] = xj[work.abinf] / (1 - xp.real(xj[work.abinf])**2)
|
408
410
|
xj[work.binf] = 1/xj[work.binf] - 1 + work.a0[work.binf]
|
409
411
|
xj[work.ainf] *= -1
|
410
412
|
return xj
|
@@ -454,7 +456,7 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
|
|
454
456
|
|
455
457
|
# Terminate if integral estimate becomes invalid
|
456
458
|
if log:
|
457
|
-
Sn_real =
|
459
|
+
Sn_real = xp.real(work.Sn)
|
458
460
|
Sn_pos_inf = xp.isinf(Sn_real) & (Sn_real > 0)
|
459
461
|
i = (Sn_pos_inf | xp.isnan(work.Sn)) & ~stop
|
460
462
|
else:
|
@@ -473,10 +475,7 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
|
|
473
475
|
# If the integration limits were such that b < a, we reversed them
|
474
476
|
# to perform the calculation, and the final result needs to be negated.
|
475
477
|
if log and xp.any(negative):
|
476
|
-
|
477
|
-
pi = xp.asarray(xp.pi, dtype=dtype)[()]
|
478
|
-
j = xp.asarray(1j, dtype=xp.complex64)[()] # minimum complex type
|
479
|
-
res['integral'] = res['integral'] + negative*pi*j
|
478
|
+
res['integral'] = res['integral'] + negative * xp.pi * 1.0j
|
480
479
|
else:
|
481
480
|
res['integral'][negative] *= -1
|
482
481
|
|
@@ -615,7 +614,7 @@ def _transform_to_limits(xjc, wj, a, b, xp):
|
|
615
614
|
# these points; however, we can't easily filter out points since this
|
616
615
|
# function is vectorized. Instead, zero the weights.
|
617
616
|
# Note: values may have complex dtype, but have zero imaginary part
|
618
|
-
xj_real, a_real, b_real =
|
617
|
+
xj_real, a_real, b_real = xp.real(xj), xp.real(a), xp.real(b)
|
619
618
|
invalid = (xj_real <= a_real) | (xj_real >= b_real)
|
620
619
|
wj[invalid] = 0
|
621
620
|
return xj, wj
|
@@ -646,16 +645,16 @@ def _euler_maclaurin_sum(fj, work, xp):
|
|
646
645
|
|
647
646
|
# integer index of the maximum abscissa at this level
|
648
647
|
xr[invalid_r] = -xp.inf
|
649
|
-
ir = xp.argmax(
|
648
|
+
ir = xp.argmax(xp.real(xr), axis=0, keepdims=True)
|
650
649
|
# abscissa, function value, and weight at this index
|
651
650
|
### Not Array API Compatible... yet ###
|
652
|
-
xr_max =
|
653
|
-
fr_max =
|
654
|
-
wr_max =
|
651
|
+
xr_max = xp.take_along_axis(xr, ir, axis=0)[0]
|
652
|
+
fr_max = xp.take_along_axis(fr, ir, axis=0)[0]
|
653
|
+
wr_max = xp.take_along_axis(wr, ir, axis=0)[0]
|
655
654
|
# boolean indices at which maximum abscissa at this level exceeds
|
656
655
|
# the incumbent maximum abscissa (from all previous levels)
|
657
656
|
# note: abscissa may have complex dtype, but will have zero imaginary part
|
658
|
-
j =
|
657
|
+
j = xp.real(xr_max) > xp.real(xr0)
|
659
658
|
# Update record of the incumbent abscissa, function value, and weight
|
660
659
|
xr0[j] = xr_max[j]
|
661
660
|
fr0[j] = fr_max[j]
|
@@ -663,15 +662,15 @@ def _euler_maclaurin_sum(fj, work, xp):
|
|
663
662
|
|
664
663
|
# integer index of the minimum abscissa at this level
|
665
664
|
xl[invalid_l] = xp.inf
|
666
|
-
il = xp.argmin(
|
665
|
+
il = xp.argmin(xp.real(xl), axis=0, keepdims=True)
|
667
666
|
# abscissa, function value, and weight at this index
|
668
|
-
xl_min =
|
669
|
-
fl_min =
|
670
|
-
wl_min =
|
667
|
+
xl_min = xp.take_along_axis(xl, il, axis=0)[0]
|
668
|
+
fl_min = xp.take_along_axis(fl, il, axis=0)[0]
|
669
|
+
wl_min = xp.take_along_axis(wl, il, axis=0)[0]
|
671
670
|
# boolean indices at which minimum abscissa at this level is less than
|
672
671
|
# the incumbent minimum abscissa (from all previous levels)
|
673
672
|
# note: abscissa may have complex dtype, but will have zero imaginary part
|
674
|
-
j =
|
673
|
+
j = xp.real(xl_min) < xp.real(xl0)
|
675
674
|
# Update record of the incumbent abscissa, function value, and weight
|
676
675
|
xl0[j] = xl_min[j]
|
677
676
|
fl0[j] = fl_min[j]
|
@@ -682,7 +681,7 @@ def _euler_maclaurin_sum(fj, work, xp):
|
|
682
681
|
# rightmost term, whichever is greater.
|
683
682
|
flwl0 = fl0 + xp.log(wl0) if work.log else fl0 * wl0 # leftmost term
|
684
683
|
frwr0 = fr0 + xp.log(wr0) if work.log else fr0 * wr0 # rightmost term
|
685
|
-
magnitude =
|
684
|
+
magnitude = xp.real if work.log else xp.abs
|
686
685
|
work.d4 = xp.maximum(magnitude(flwl0), magnitude(frwr0))
|
687
686
|
|
688
687
|
# There are two approaches to dealing with function values that are
|
@@ -769,14 +768,14 @@ def _estimate_error(work, xp):
|
|
769
768
|
# complex values have imaginary part in increments of pi*j, which just
|
770
769
|
# carries sign information of the original integral, so use of
|
771
770
|
# `xp.real` here is equivalent to absolute value in real scale.
|
772
|
-
d1 =
|
773
|
-
d2 =
|
774
|
-
d3 = log_e1 + xp.max(
|
771
|
+
d1 = xp.real(special.logsumexp(xp.stack([work.Sn, Snm1 + work.pi*1j]), axis=0))
|
772
|
+
d2 = xp.real(special.logsumexp(xp.stack([work.Sn, Snm2 + work.pi*1j]), axis=0))
|
773
|
+
d3 = log_e1 + xp.max(xp.real(work.fjwj), axis=-1)
|
775
774
|
d4 = work.d4
|
776
775
|
d5 = log_e1 + xp.real(work.Sn)
|
777
776
|
temp = xp.where(d1 > -xp.inf, d1 ** 2 / d2, -xp.inf)
|
778
|
-
ds = xp.stack([temp, 2 * d1, d3, d4
|
779
|
-
aerr = xp.max(ds, axis=0)
|
777
|
+
ds = xp.stack([temp, 2 * d1, d3, d4])
|
778
|
+
aerr = xp.clip(xp.max(ds, axis=0), d5, d1)
|
780
779
|
rerr = aerr - xp.real(work.Sn)
|
781
780
|
else:
|
782
781
|
# Note: explicit computation of log10 of each of these is unnecessary.
|
@@ -786,8 +785,8 @@ def _estimate_error(work, xp):
|
|
786
785
|
d4 = work.d4
|
787
786
|
d5 = e1 * xp.abs(work.Sn)
|
788
787
|
temp = xp.where(d1 > 0, d1**(xp.log(d1)/xp.log(d2)), 0)
|
789
|
-
ds = xp.stack([temp, d1**2, d3, d4
|
790
|
-
aerr = xp.max(ds, axis=0)
|
788
|
+
ds = xp.stack([temp, d1**2, d3, d4])
|
789
|
+
aerr = xp.clip(xp.max(ds, axis=0), d5, d1)
|
791
790
|
rerr = aerr/xp.abs(work.Sn)
|
792
791
|
|
793
792
|
return rerr, aerr
|
@@ -804,7 +803,7 @@ def _transform_integrals(a, b, xp):
|
|
804
803
|
a[ab_same], b[ab_same] = 1, 1
|
805
804
|
|
806
805
|
# `a, b` may have complex dtype but have zero imaginary part
|
807
|
-
negative =
|
806
|
+
negative = xp.real(b) < xp.real(a)
|
808
807
|
a[negative], b[negative] = b[negative], a[negative]
|
809
808
|
|
810
809
|
abinf = xp.isinf(a) & xp.isinf(b)
|
@@ -825,14 +824,13 @@ def _tanhsinh_iv(f, a, b, log, maxfun, maxlevel, minlevel,
|
|
825
824
|
# Input validation and standardization
|
826
825
|
|
827
826
|
xp = array_namespace(a, b)
|
827
|
+
a, b = xp_promote(a, b, broadcast=True, force_floating=True, xp=xp)
|
828
828
|
|
829
829
|
message = '`f` must be callable.'
|
830
830
|
if not callable(f):
|
831
831
|
raise ValueError(message)
|
832
832
|
|
833
833
|
message = 'All elements of `a` and `b` must be real numbers.'
|
834
|
-
a, b = xp.asarray(a), xp.asarray(b)
|
835
|
-
a, b = xp.broadcast_arrays(a, b)
|
836
834
|
if (xp.isdtype(a.dtype, 'complex floating')
|
837
835
|
or xp.isdtype(b.dtype, 'complex floating')):
|
838
836
|
raise ValueError(message)
|
@@ -901,16 +899,15 @@ def _tanhsinh_iv(f, a, b, log, maxfun, maxlevel, minlevel,
|
|
901
899
|
def _nsum_iv(f, a, b, step, args, log, maxterms, tolerances):
|
902
900
|
# Input validation and standardization
|
903
901
|
|
904
|
-
xp = array_namespace(a, b)
|
902
|
+
xp = array_namespace(a, b, step)
|
903
|
+
a, b, step = xp_promote(a, b, step, broadcast=True, force_floating=True, xp=xp)
|
905
904
|
|
906
905
|
message = '`f` must be callable.'
|
907
906
|
if not callable(f):
|
908
907
|
raise ValueError(message)
|
909
908
|
|
910
909
|
message = 'All elements of `a`, `b`, and `step` must be real numbers.'
|
911
|
-
|
912
|
-
dtype = xp.result_type(a.dtype, b.dtype, step.dtype)
|
913
|
-
if not xp.isdtype(dtype, 'numeric') or xp.isdtype(dtype, 'complex floating'):
|
910
|
+
if not xp.isdtype(a.dtype, ('integral', 'real floating')):
|
914
911
|
raise ValueError(message)
|
915
912
|
|
916
913
|
valid_b = b >= a # NaNs will be False
|
@@ -1183,6 +1180,7 @@ def nsum(f, a, b, *, step=1, args=(), log=False, maxterms=int(2**20), tolerances
|
|
1183
1180
|
|
1184
1181
|
# Branch for direct sum evaluation / integral approximation / invalid input
|
1185
1182
|
i0 = ~valid_abstep # invalid
|
1183
|
+
i0b = b < a # zero
|
1186
1184
|
i1 = (nterms + 1 <= maxterms) & ~i0 # direct sum evaluation
|
1187
1185
|
i2 = xp.isfinite(a) & ~i1 & ~i0 # infinite sum to the right
|
1188
1186
|
i3 = xp.isfinite(b) & ~i2 & ~i1 & ~i0 # infinite sum to the left
|
@@ -1192,6 +1190,9 @@ def nsum(f, a, b, *, step=1, args=(), log=False, maxterms=int(2**20), tolerances
|
|
1192
1190
|
S[i0], E[i0] = xp.nan, xp.nan
|
1193
1191
|
status[i0] = -1
|
1194
1192
|
|
1193
|
+
S[i0b], E[i0b] = zero, zero
|
1194
|
+
status[i0b] = 0
|
1195
|
+
|
1195
1196
|
if xp.any(i1):
|
1196
1197
|
args_direct = [arg[i1] for arg in args]
|
1197
1198
|
tmp = _direct(f, a[i1], b[i1], step[i1], args_direct, constants, xp)
|
@@ -1294,7 +1295,7 @@ def _direct(f, a, b, step, args, constants, xp, inclusive=True):
|
|
1294
1295
|
nfev = max_steps - i_nan.sum(axis=-1)
|
1295
1296
|
S = special.logsumexp(fs, axis=-1) if log else xp.sum(fs, axis=-1)
|
1296
1297
|
# Rough, non-conservative error estimate. See gh-19667 for improvement ideas.
|
1297
|
-
E =
|
1298
|
+
E = xp.real(S) + math.log(eps) if log else eps * abs(S)
|
1298
1299
|
return S, E, nfev
|
1299
1300
|
|
1300
1301
|
|
@@ -1310,7 +1311,7 @@ def _integral_bound(f, a, b, step, args, constants, xp):
|
|
1310
1311
|
tol = special.logsumexp(xp.stack((tol, rtol + lb.integral)), axis=0)
|
1311
1312
|
else:
|
1312
1313
|
tol = tol + rtol*lb.integral
|
1313
|
-
i_skip = lb.status
|
1314
|
+
i_skip = lb.status == -3 # avoid unnecessary f_evals if integral is divergent
|
1314
1315
|
tol[i_skip] = xp.nan
|
1315
1316
|
status = lb.status
|
1316
1317
|
|
@@ -1331,7 +1332,7 @@ def _integral_bound(f, a, b, step, args, constants, xp):
|
|
1331
1332
|
fksp1 = f(ks + step2, *args2) # check that the function is decreasing
|
1332
1333
|
fk_insufficient = (fks > tol[:, xp.newaxis]) | (fksp1 > fks)
|
1333
1334
|
n_fk_insufficient = xp.sum(fk_insufficient, axis=-1)
|
1334
|
-
nt = xp.minimum(n_fk_insufficient,
|
1335
|
+
nt = xp.minimum(n_fk_insufficient, n_steps.shape[-1]-1)
|
1335
1336
|
n_steps = n_steps[nt]
|
1336
1337
|
|
1337
1338
|
# If `maxterms` is insufficient (i.e. either the magnitude of the last term of the
|
@@ -1374,7 +1375,7 @@ def _integral_bound(f, a, b, step, args, constants, xp):
|
|
1374
1375
|
S_terms = (left, right.integral - log_step, fk - log2, fb - log2)
|
1375
1376
|
S = special.logsumexp(xp.stack(S_terms), axis=0)
|
1376
1377
|
E_terms = (left_error, right.error - log_step, fk-log2, fb-log2+xp.pi*1j)
|
1377
|
-
E =
|
1378
|
+
E = xp.real(special.logsumexp(xp.stack(E_terms), axis=0))
|
1378
1379
|
else:
|
1379
1380
|
S = left + right.integral/step + fk/2 + fb/2
|
1380
1381
|
E = left_error + right.error/step + fk/2 - fb/2
|
Binary file
|
Binary file
|
Binary file
|
@@ -209,9 +209,3 @@ def test_points(a, b):
|
|
209
209
|
for p in interval_sets:
|
210
210
|
j = np.searchsorted(sorted(points), tuple(p))
|
211
211
|
assert np.all(j == j[0])
|
212
|
-
|
213
|
-
|
214
|
-
@pytest.mark.thread_unsafe
|
215
|
-
def test_trapz_deprecation():
|
216
|
-
with pytest.deprecated_call(match="`quadrature='trapz'`"):
|
217
|
-
quad_vec(lambda x: x, 0, 1, quadrature="trapz")
|
@@ -130,6 +130,9 @@ def test_banded_ode_solvers():
|
|
130
130
|
# Test the "lsoda", "vode" and "zvode" solvers of the `ode` class
|
131
131
|
# with a system that has a banded Jacobian matrix.
|
132
132
|
|
133
|
+
# This test does not test the Jacobian evaluation (banded or not)
|
134
|
+
# of "lsoda" due to the nonstiff nature of the equations.
|
135
|
+
|
133
136
|
t_exact = np.linspace(0, 1.0, 5)
|
134
137
|
|
135
138
|
# --- Real arrays for testing the "lsoda" and "vode" solvers ---
|
@@ -218,3 +221,85 @@ def test_banded_ode_solvers():
|
|
218
221
|
[False, True]] # banded
|
219
222
|
for meth, use_jac, with_jac, banded in itertools.product(*p):
|
220
223
|
check_complex(idx, "zvode", meth, use_jac, with_jac, banded)
|
224
|
+
|
225
|
+
# lsoda requires a stiffer problem to switch to stiff solver
|
226
|
+
# Use the Robertson equation with surrounding trivial equations to make banded
|
227
|
+
|
228
|
+
def stiff_f(t, y):
|
229
|
+
return np.array([
|
230
|
+
y[0],
|
231
|
+
-0.04 * y[1] + 1e4 * y[2] * y[3],
|
232
|
+
0.04 * y[1] - 1e4 * y[2] * y[3] - 3e7 * y[2]**2,
|
233
|
+
3e7 * y[2]**2,
|
234
|
+
y[4]
|
235
|
+
])
|
236
|
+
|
237
|
+
def stiff_jac(t, y):
|
238
|
+
return np.array([
|
239
|
+
[1, 0, 0, 0, 0],
|
240
|
+
[0, -0.04, 1e4*y[3], 1e4*y[2], 0],
|
241
|
+
[0, 0.04, -1e4 * y[3] - 3e7 * 2 * y[2], -1e4*y[2], 0],
|
242
|
+
[0, 0, 3e7*2*y[2], 0, 0],
|
243
|
+
[0, 0, 0, 0, 1]
|
244
|
+
])
|
245
|
+
|
246
|
+
def banded_stiff_jac(t, y):
|
247
|
+
return np.array([
|
248
|
+
[0, 0, 0, 1e4*y[2], 0],
|
249
|
+
[0, 0, 1e4*y[3], -1e4*y[2], 0],
|
250
|
+
[1, -0.04, -1e4*y[3]-3e7*2*y[2], 0, 1],
|
251
|
+
[0, 0.04, 3e7*2*y[2], 0, 0]
|
252
|
+
])
|
253
|
+
|
254
|
+
@pytest.mark.thread_unsafe
|
255
|
+
def test_banded_lsoda():
|
256
|
+
# expected solution is given by problem with full jacobian
|
257
|
+
tfull, yfull = _solve_robertson_lsoda(use_jac=True, banded=False)
|
258
|
+
|
259
|
+
for use_jac in [True, False]:
|
260
|
+
t, y = _solve_robertson_lsoda(use_jac, True)
|
261
|
+
assert_allclose(t, tfull)
|
262
|
+
assert_allclose(y, yfull)
|
263
|
+
|
264
|
+
def _solve_robertson_lsoda(use_jac, banded):
|
265
|
+
|
266
|
+
if use_jac:
|
267
|
+
if banded:
|
268
|
+
jac = banded_stiff_jac
|
269
|
+
else:
|
270
|
+
jac = stiff_jac
|
271
|
+
else:
|
272
|
+
jac = None
|
273
|
+
|
274
|
+
if banded:
|
275
|
+
lband = 1
|
276
|
+
uband = 2
|
277
|
+
else:
|
278
|
+
lband = None
|
279
|
+
uband = None
|
280
|
+
|
281
|
+
r = ode(stiff_f, jac)
|
282
|
+
r.set_integrator('lsoda',
|
283
|
+
lband=lband, uband=uband,
|
284
|
+
rtol=1e-9, atol=1e-10,
|
285
|
+
)
|
286
|
+
t0 = 0
|
287
|
+
dt = 1
|
288
|
+
tend = 10
|
289
|
+
y0 = np.array([1.0, 1.0, 0.0, 0.0, 1.0])
|
290
|
+
r.set_initial_value(y0, t0)
|
291
|
+
|
292
|
+
t = [t0]
|
293
|
+
y = [y0]
|
294
|
+
while r.successful() and r.t < tend:
|
295
|
+
r.integrate(r.t + dt)
|
296
|
+
t.append(r.t)
|
297
|
+
y.append(r.y)
|
298
|
+
|
299
|
+
# Ensure that the Jacobian was evaluated
|
300
|
+
# iwork[12] has the number of Jacobian evaluations.
|
301
|
+
assert r._integrator.iwork[12] > 0
|
302
|
+
|
303
|
+
t = np.array(t)
|
304
|
+
y = np.array(y)
|
305
|
+
return t, y
|
@@ -11,10 +11,8 @@ from scipy._lib._array_api import (
|
|
11
11
|
np_compat,
|
12
12
|
is_array_api_strict,
|
13
13
|
)
|
14
|
-
from scipy.conftest import array_api_compatible
|
15
|
-
|
16
14
|
from scipy.integrate import cubature
|
17
|
-
|
15
|
+
from scipy.integrate._cubature import _InfiniteLimitsTransform
|
18
16
|
from scipy.integrate._rules import (
|
19
17
|
Rule, FixedRule,
|
20
18
|
NestedFixedRule,
|
@@ -22,10 +20,8 @@ from scipy.integrate._rules import (
|
|
22
20
|
GenzMalikCubature,
|
23
21
|
)
|
24
22
|
|
25
|
-
from scipy.integrate._cubature import _InfiniteLimitsTransform
|
26
|
-
|
27
|
-
pytestmark = [pytest.mark.usefixtures("skip_xp_backends"),]
|
28
23
|
skip_xp_backends = pytest.mark.skip_xp_backends
|
24
|
+
boolean_index_skip_reason = 'JAX/Dask arrays do not support boolean assignment.'
|
29
25
|
|
30
26
|
# The integrands ``genz_malik_1980_*`` come from the paper:
|
31
27
|
# A.C. Genz, A.A. Malik, Remarks on algorithm 006: An adaptive algorithm for
|
@@ -120,13 +116,10 @@ def genz_malik_1980_f_2_exact(a, b, alphas, betas, xp):
|
|
120
116
|
a = xp.reshape(a, (*([1]*(len(alphas.shape) - 1)), ndim))
|
121
117
|
b = xp.reshape(b, (*([1]*(len(alphas.shape) - 1)), ndim))
|
122
118
|
|
123
|
-
# `xp` is the unwrapped namespace, so `.atan` won't work for `xp = np` and np<2.
|
124
|
-
xp_test = array_namespace(a)
|
125
|
-
|
126
119
|
return (
|
127
120
|
(-1)**ndim * 1/xp.prod(alphas, axis=-1)
|
128
121
|
* xp.prod(
|
129
|
-
|
122
|
+
xp.atan((a - betas)/alphas) - xp.atan((b - betas)/alphas),
|
130
123
|
axis=-1,
|
131
124
|
)
|
132
125
|
)
|
@@ -229,7 +222,9 @@ def _eval_indefinite_integral(F, a, b, xp):
|
|
229
222
|
|
230
223
|
out = 0
|
231
224
|
for ind in itertools.product(range(2), repeat=ndim):
|
232
|
-
selected_points = xp.asarray(
|
225
|
+
selected_points = xp.asarray(
|
226
|
+
[float(points[i, j]) for i, j in zip(ind, range(ndim))]
|
227
|
+
)
|
233
228
|
out += pow(-1, sum(ind) + ndim) * F(selected_points)
|
234
229
|
|
235
230
|
return out
|
@@ -377,7 +372,6 @@ def f_with_problematic_points(x_arr, points, xp):
|
|
377
372
|
return xp.ones(x_arr.shape[0])
|
378
373
|
|
379
374
|
|
380
|
-
@array_api_compatible
|
381
375
|
class TestCubature:
|
382
376
|
"""
|
383
377
|
Tests related to the interface of `cubature`.
|
@@ -534,12 +528,13 @@ class TestCubature:
|
|
534
528
|
"gk21",
|
535
529
|
"genz-malik",
|
536
530
|
])
|
537
|
-
@array_api_compatible
|
538
531
|
class TestCubatureProblems:
|
539
532
|
"""
|
540
533
|
Tests that `cubature` gives the correct answer.
|
541
534
|
"""
|
542
535
|
|
536
|
+
@skip_xp_backends("dask.array",
|
537
|
+
reason="Dask hangs/takes a long time for some test cases")
|
543
538
|
@pytest.mark.parametrize("problem", [
|
544
539
|
# -- f1 --
|
545
540
|
(
|
@@ -786,6 +781,8 @@ class TestCubatureProblems:
|
|
786
781
|
err_msg=f"estimate_error={res.error}, subdivisions={res.subdivisions}",
|
787
782
|
)
|
788
783
|
|
784
|
+
@skip_xp_backends("dask.array",
|
785
|
+
reason="Dask hangs/takes a long time for some test cases")
|
789
786
|
@pytest.mark.parametrize("problem", [
|
790
787
|
(
|
791
788
|
# Function to integrate, like `f(x, *args)`
|
@@ -973,10 +970,8 @@ class TestCubatureProblems:
|
|
973
970
|
f"true_error={xp.abs(res.estimate - exact)}")
|
974
971
|
assert res.status == "converged", err_msg
|
975
972
|
|
976
|
-
@skip_xp_backends(
|
977
|
-
|
978
|
-
reasons=["transforms make use of indexing assignment"],
|
979
|
-
)
|
973
|
+
@pytest.mark.skip_xp_backends('jax.numpy', reason=boolean_index_skip_reason)
|
974
|
+
@pytest.mark.skip_xp_backends('dask.array', reason=boolean_index_skip_reason)
|
980
975
|
@pytest.mark.parametrize("problem", [
|
981
976
|
(
|
982
977
|
# Function to integrate
|
@@ -1123,10 +1118,8 @@ class TestCubatureProblems:
|
|
1123
1118
|
check_0d=False,
|
1124
1119
|
)
|
1125
1120
|
|
1126
|
-
@skip_xp_backends(
|
1127
|
-
|
1128
|
-
reasons=["transforms make use of indexing assignment"],
|
1129
|
-
)
|
1121
|
+
@pytest.mark.skip_xp_backends('jax.numpy', reason=boolean_index_skip_reason)
|
1122
|
+
@pytest.mark.skip_xp_backends('dask.array', reason=boolean_index_skip_reason)
|
1130
1123
|
@pytest.mark.parametrize("problem", [
|
1131
1124
|
(
|
1132
1125
|
# Function to integrate
|
@@ -1197,7 +1190,6 @@ class TestCubatureProblems:
|
|
1197
1190
|
)
|
1198
1191
|
|
1199
1192
|
|
1200
|
-
@array_api_compatible
|
1201
1193
|
class TestRules:
|
1202
1194
|
"""
|
1203
1195
|
Tests related to the general Rule interface (currently private).
|
@@ -1238,7 +1230,6 @@ class TestRules:
|
|
1238
1230
|
base_class.estimate(basic_1d_integrand, a, b, args=(xp,))
|
1239
1231
|
|
1240
1232
|
|
1241
|
-
@array_api_compatible
|
1242
1233
|
class TestRulesQuadrature:
|
1243
1234
|
"""
|
1244
1235
|
Tests underlying quadrature rules (ndim == 1).
|
@@ -1311,7 +1302,6 @@ class TestRulesQuadrature:
|
|
1311
1302
|
quadrature(1, xp=xp)
|
1312
1303
|
|
1313
1304
|
|
1314
|
-
@array_api_compatible
|
1315
1305
|
class TestRulesCubature:
|
1316
1306
|
"""
|
1317
1307
|
Tests underlying cubature rules (ndim >= 2).
|
@@ -1333,11 +1323,8 @@ class TestRulesCubature:
|
|
1333
1323
|
GenzMalikCubature(1, xp=xp)
|
1334
1324
|
|
1335
1325
|
|
1336
|
-
@
|
1337
|
-
@skip_xp_backends(
|
1338
|
-
"jax.numpy",
|
1339
|
-
reasons=["transforms make use of indexing assignment"],
|
1340
|
-
)
|
1326
|
+
@pytest.mark.skip_xp_backends('jax.numpy', reason=boolean_index_skip_reason)
|
1327
|
+
@pytest.mark.skip_xp_backends('dask.array', reason=boolean_index_skip_reason)
|
1341
1328
|
class TestTransformations:
|
1342
1329
|
@pytest.mark.parametrize(("a", "b", "points"), [
|
1343
1330
|
(
|
@@ -1355,19 +1342,18 @@ class TestTransformations:
|
|
1355
1342
|
transformation.
|
1356
1343
|
"""
|
1357
1344
|
|
1358
|
-
xp_compat = array_namespace(xp.empty(0))
|
1359
1345
|
points = [xp.asarray(p, dtype=xp.float64) for p in points]
|
1360
1346
|
|
1361
1347
|
f_transformed = _InfiniteLimitsTransform(
|
1362
1348
|
# Bind `points` and `xp` argument in f
|
1363
|
-
lambda x: f_with_problematic_points(x, points,
|
1364
|
-
xp.asarray(a, dtype=
|
1365
|
-
xp.asarray(b, dtype=
|
1366
|
-
xp=
|
1349
|
+
lambda x: f_with_problematic_points(x, points, xp),
|
1350
|
+
xp.asarray(a, dtype=xp.float64),
|
1351
|
+
xp.asarray(b, dtype=xp.float64),
|
1352
|
+
xp=xp,
|
1367
1353
|
)
|
1368
1354
|
|
1369
1355
|
for point in points:
|
1370
|
-
transformed_point = f_transformed.inv(
|
1356
|
+
transformed_point = f_transformed.inv(xp.reshape(point, (1, -1)))
|
1371
1357
|
|
1372
1358
|
with pytest.raises(Exception, match="called with a problematic point"):
|
1373
1359
|
f_transformed(transformed_point)
|
@@ -13,7 +13,7 @@ from scipy.integrate import (romb, newton_cotes,
|
|
13
13
|
from scipy.integrate._quadrature import _cumulative_simpson_unequal_intervals
|
14
14
|
|
15
15
|
from scipy import stats, special, integrate
|
16
|
-
from scipy.conftest import
|
16
|
+
from scipy.conftest import skip_xp_invalid_arg
|
17
17
|
from scipy._lib._array_api_no_0d import xp_assert_close
|
18
18
|
|
19
19
|
skip_xp_backends = pytest.mark.skip_xp_backends
|
@@ -269,7 +269,6 @@ class TestCumulative_trapezoid:
|
|
269
269
|
cumulative_trapezoid(y=[])
|
270
270
|
|
271
271
|
|
272
|
-
@array_api_compatible
|
273
272
|
class TestTrapezoid:
|
274
273
|
def test_simple(self, xp):
|
275
274
|
x = xp.arange(-10, 10, .1)
|
@@ -278,8 +277,7 @@ class TestTrapezoid:
|
|
278
277
|
xp_assert_close(r, xp.asarray(1.0))
|
279
278
|
|
280
279
|
@skip_xp_backends('jax.numpy',
|
281
|
-
|
282
|
-
@pytest.mark.usefixtures("skip_xp_backends")
|
280
|
+
reason="JAX arrays do not support item assignment")
|
283
281
|
def test_ndim(self, xp):
|
284
282
|
x = xp.linspace(0, 1, 3)
|
285
283
|
y = xp.linspace(0, 2, 8)
|
@@ -318,8 +316,7 @@ class TestTrapezoid:
|
|
318
316
|
xp_assert_close(r, qz)
|
319
317
|
|
320
318
|
@skip_xp_backends('jax.numpy',
|
321
|
-
|
322
|
-
@pytest.mark.usefixtures("skip_xp_backends")
|
319
|
+
reason="JAX arrays do not support item assignment")
|
323
320
|
def test_gh21908(self, xp):
|
324
321
|
# extended testing for n-dim arrays
|
325
322
|
x = xp.reshape(xp.linspace(0, 29, 30), (3, 10))
|
@@ -362,8 +359,7 @@ class TestTrapezoid:
|
|
362
359
|
assert_allclose(trapezoid(y, xm), r)
|
363
360
|
|
364
361
|
@skip_xp_backends(np_only=True,
|
365
|
-
|
366
|
-
@pytest.mark.usefixtures("skip_xp_backends")
|
362
|
+
reason='array-likes only supported for NumPy backend')
|
367
363
|
def test_array_like(self, xp):
|
368
364
|
x = list(range(5))
|
369
365
|
y = [t * t for t in x]
|
@@ -635,6 +631,7 @@ class TestCumulativeSimpson:
|
|
635
631
|
# `simpson` uses the trapezoidal rule
|
636
632
|
return theoretical_difference
|
637
633
|
|
634
|
+
@pytest.mark.fail_slow(10)
|
638
635
|
@pytest.mark.thread_unsafe
|
639
636
|
@pytest.mark.slow
|
640
637
|
@given(
|
@@ -666,6 +663,7 @@ class TestCumulativeSimpson:
|
|
666
663
|
res[..., 1:], ref[..., 1:] + theoretical_difference[..., 1:], atol=1e-16
|
667
664
|
)
|
668
665
|
|
666
|
+
@pytest.mark.fail_slow(10)
|
669
667
|
@pytest.mark.thread_unsafe
|
670
668
|
@pytest.mark.slow
|
671
669
|
@given(
|