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
@@ -1,107 +1,242 @@
|
|
1
|
+
from functools import partial
|
2
|
+
import pickle
|
3
|
+
|
1
4
|
import pytest
|
5
|
+
from hypothesis import given, strategies
|
6
|
+
import hypothesis.extra.numpy as npst
|
7
|
+
from packaging import version
|
2
8
|
|
3
|
-
from scipy.special._support_alternative_backends import (get_array_special_func,
|
4
|
-
array_special_func_map)
|
5
|
-
from scipy.conftest import array_api_compatible
|
6
9
|
from scipy import special
|
10
|
+
from scipy.special._support_alternative_backends import _special_funcs
|
7
11
|
from scipy._lib._array_api_no_0d import xp_assert_close
|
8
|
-
from scipy._lib._array_api import is_jax, is_torch,
|
12
|
+
from scipy._lib._array_api import (is_cupy, is_dask, is_jax, is_torch,
|
13
|
+
make_xp_pytest_param, make_xp_test_case,
|
14
|
+
xp_default_dtype)
|
9
15
|
from scipy._lib.array_api_compat import numpy as np
|
10
16
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
except ImportError:
|
15
|
-
HAVE_ARRAY_API_STRICT = False
|
16
|
-
|
17
|
+
# Run all tests in this module in the Array API CI, including those without
|
18
|
+
# the xp fixture
|
19
|
+
pytestmark = pytest.mark.array_api_backends
|
17
20
|
|
18
|
-
|
19
|
-
reason="`array_api_strict` not installed")
|
20
|
-
def test_dispatch_to_unrecognize_library():
|
21
|
-
xp = array_api_strict
|
22
|
-
f = get_array_special_func('ndtr', xp=xp, n_array_args=1)
|
23
|
-
x = [1, 2, 3]
|
24
|
-
res = f(xp.asarray(x))
|
25
|
-
ref = xp.asarray(special.ndtr(np.asarray(x)))
|
26
|
-
xp_assert_close(res, ref, xp=xp)
|
21
|
+
lazy_xp_modules = [special]
|
27
22
|
|
28
23
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
xp = array_api_strict
|
34
|
-
f = get_array_special_func('rel_entr', xp=xp, n_array_args=2)
|
35
|
-
dtype_np = getattr(np, dtype)
|
36
|
-
dtype_xp = getattr(xp, dtype)
|
37
|
-
x, y = [-1, 0, 0, 1], [1, 0, 2, 3]
|
24
|
+
def _skip_or_tweak_alternative_backends(xp, f_name, dtypes):
|
25
|
+
"""Skip tests for specific intersections of scipy.special functions
|
26
|
+
vs. backends vs. dtypes vs. devices.
|
27
|
+
Also suggest bespoke tweaks.
|
38
28
|
|
39
|
-
|
40
|
-
|
29
|
+
Returns
|
30
|
+
-------
|
31
|
+
positive_only : bool
|
32
|
+
Whether you should exclusively test positive inputs.
|
33
|
+
dtypes_np_ref : list[str]
|
34
|
+
The dtypes to use for the reference NumPy arrays.
|
35
|
+
"""
|
36
|
+
if ((is_jax(xp) and f_name == 'gammaincc') # google/jax#20699
|
37
|
+
# gh-20972
|
38
|
+
or ((is_cupy(xp) or is_jax(xp) or is_torch(xp)) and f_name == 'chdtrc')):
|
39
|
+
positive_only = True
|
40
|
+
else:
|
41
|
+
positive_only = False
|
41
42
|
|
42
|
-
|
43
|
-
|
44
|
-
ref = np.asarray([np.inf, 0, 0, ref], dtype=ref.dtype)
|
43
|
+
if not any('int' in dtype for dtype in dtypes):
|
44
|
+
return positive_only, dtypes
|
45
45
|
|
46
|
-
|
46
|
+
# Integer-specific issues from this point onwards
|
47
47
|
|
48
|
+
if ((is_torch(xp) and f_name in {'gammainc', 'gammaincc'})
|
49
|
+
or (is_cupy(xp) and f_name in {'stdtr', 'i0e', 'i1e'})
|
50
|
+
or (is_jax(xp) and f_name in {'stdtr', 'ndtr', 'ndtri', 'log_ndtr'})
|
51
|
+
):
|
52
|
+
pytest.skip(f"`{f_name}` does not support integer types")
|
48
53
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
@pytest.mark.parametrize('shapes', [[(0,)]*4, [tuple()]*4, [(10,)]*4,
|
57
|
-
[(10,), (11, 1), (12, 1, 1), (13, 1, 1, 1)]])
|
58
|
-
def test_support_alternative_backends(xp, f_name_n_args, dtype, shapes):
|
59
|
-
f_name, n_args = f_name_n_args
|
54
|
+
# int/float mismatched args support is sketchy
|
55
|
+
if (any('float' in dtype for dtype in dtypes)
|
56
|
+
and ((is_torch(xp) and f_name in ('rel_entr', 'xlogy'))
|
57
|
+
or (is_jax(xp) and f_name in ('gammainc', 'gammaincc',
|
58
|
+
'rel_entr', 'xlogy')))
|
59
|
+
):
|
60
|
+
pytest.xfail("dtypes do not match")
|
60
61
|
|
61
|
-
|
62
|
-
|
63
|
-
and f_name in {'
|
62
|
+
dtypes_np_ref = dtypes
|
63
|
+
if (is_torch(xp) and xp_default_dtype(xp) == xp.float32
|
64
|
+
and f_name not in {'betainc', 'betaincc', 'stdtr', 'stdtrit'}
|
64
65
|
):
|
65
|
-
|
66
|
-
|
66
|
+
# On PyTorch with float32 default dtype, sometimes ints are promoted
|
67
|
+
# to float32, and sometimes to float64.
|
68
|
+
# When they are promoted to float32, explicitly convert the reference
|
69
|
+
# numpy arrays to float32 to prevent them from being automatically promoted
|
70
|
+
# to float64 instead.
|
71
|
+
dtypes_np_ref = ['float32' if 'int' in dtype else dtype for dtype in dtypes]
|
67
72
|
|
68
|
-
|
69
|
-
f = getattr(special, f_name)
|
73
|
+
return positive_only, dtypes_np_ref
|
70
74
|
|
75
|
+
|
76
|
+
@pytest.mark.filterwarnings("ignore:invalid value encountered:RuntimeWarning:dask")
|
77
|
+
@pytest.mark.parametrize('shapes', [[(0,)]*4, [tuple()]*4, [(10,)]*4,
|
78
|
+
[(10,), (11, 1), (12, 1, 1), (13, 1, 1, 1)]])
|
79
|
+
@pytest.mark.parametrize('dtype', ['float32', 'float64', 'int64'])
|
80
|
+
@pytest.mark.parametrize(
|
81
|
+
'func,nfo', [make_xp_pytest_param(i.wrapper, i) for i in _special_funcs])
|
82
|
+
def test_support_alternative_backends(xp, func, nfo, dtype, shapes):
|
83
|
+
positive_only, [dtype_np_ref] = _skip_or_tweak_alternative_backends(
|
84
|
+
xp, nfo.name, [dtype])
|
71
85
|
dtype_np = getattr(np, dtype)
|
72
86
|
dtype_xp = getattr(xp, dtype)
|
73
87
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
88
|
+
shapes = shapes[:nfo.n_args]
|
89
|
+
rng = np.random.default_rng(984254252920492019)
|
90
|
+
if 'int' in dtype:
|
91
|
+
iinfo = np.iinfo(dtype_np)
|
92
|
+
rand = partial(rng.integers, iinfo.min, iinfo.max + 1)
|
93
|
+
else:
|
94
|
+
rand = rng.standard_normal
|
95
|
+
args_np = [rand(size=shape, dtype=dtype_np) for shape in shapes]
|
96
|
+
if positive_only:
|
97
|
+
args_np = [np.abs(arg) for arg in args_np]
|
98
|
+
|
99
|
+
args_xp = [xp.asarray(arg, dtype=dtype_xp) for arg in args_np]
|
100
|
+
args_np = [np.asarray(arg, dtype=dtype_np_ref) for arg in args_np]
|
101
|
+
|
102
|
+
if is_dask(xp):
|
103
|
+
# We're using map_blocks to dispatch the function to Dask.
|
104
|
+
# This is the correct thing to do IF all tested functions are elementwise;
|
105
|
+
# otherwise the output would change depending on chunking.
|
106
|
+
# Try to trigger bugs related to having multiple chunks.
|
107
|
+
args_xp = [arg.rechunk(5) for arg in args_xp]
|
108
|
+
|
109
|
+
res = nfo.wrapper(*args_xp) # Also wrapped by lazy_xp_function
|
110
|
+
ref = nfo.func(*args_np) # Unwrapped ufunc
|
111
|
+
|
112
|
+
# When dtype_np is integer, the output dtype can be float
|
113
|
+
atol = 0 if ref.dtype.kind in 'iu' else 10 * np.finfo(ref.dtype).eps
|
114
|
+
xp_assert_close(res, xp.asarray(ref), atol=atol)
|
115
|
+
|
116
|
+
|
117
|
+
@pytest.mark.parametrize(
|
118
|
+
'func, nfo',
|
119
|
+
[make_xp_pytest_param(i.wrapper, i) for i in _special_funcs if i.n_args >= 2])
|
120
|
+
@pytest.mark.filterwarnings("ignore:invalid value encountered:RuntimeWarning:dask")
|
121
|
+
def test_support_alternative_backends_mismatched_dtypes(xp, func, nfo):
|
122
|
+
"""Test mix-n-match of int and float arguments"""
|
123
|
+
dtypes = ['int64', 'float32', 'float64'][:nfo.n_args]
|
124
|
+
dtypes_xp = [xp.int64, xp.float32, xp.float64][:nfo.n_args]
|
125
|
+
positive_only, dtypes_np_ref = _skip_or_tweak_alternative_backends(
|
126
|
+
xp, nfo.name, dtypes)
|
127
|
+
|
87
128
|
rng = np.random.default_rng(984254252920492019)
|
88
|
-
|
129
|
+
iinfo = np.iinfo(np.int64)
|
130
|
+
randint = partial(rng.integers, iinfo.min, iinfo.max + 1)
|
131
|
+
args_np = [
|
132
|
+
randint(size=1, dtype=np.int64),
|
133
|
+
rng.standard_normal(size=1, dtype=np.float32),
|
134
|
+
rng.standard_normal(size=1, dtype=np.float64),
|
135
|
+
][:nfo.n_args]
|
136
|
+
if positive_only:
|
137
|
+
args_np = [np.abs(arg) for arg in args_np]
|
138
|
+
|
139
|
+
args_xp = [xp.asarray(arg, dtype=dtype_xp)
|
140
|
+
for arg, dtype_xp in zip(args_np, dtypes_xp)]
|
141
|
+
args_np = [np.asarray(arg, dtype=dtype_np_ref)
|
142
|
+
for arg, dtype_np_ref in zip(args_np, dtypes_np_ref)]
|
143
|
+
|
144
|
+
res = nfo.wrapper(*args_xp) # Also wrapped by lazy_xp_function
|
145
|
+
ref = nfo.func(*args_np) # Unwrapped ufunc
|
146
|
+
|
147
|
+
atol = 10 * np.finfo(ref.dtype).eps
|
148
|
+
xp_assert_close(res, xp.asarray(ref), atol=atol)
|
149
|
+
|
150
|
+
|
151
|
+
@pytest.mark.xslow
|
152
|
+
@given(data=strategies.data())
|
153
|
+
@pytest.mark.fail_slow(5)
|
154
|
+
@pytest.mark.parametrize(
|
155
|
+
'func,nfo', [make_xp_pytest_param(nfo.wrapper, nfo) for nfo in _special_funcs])
|
156
|
+
@pytest.mark.filterwarnings("ignore:invalid value encountered:RuntimeWarning:dask")
|
157
|
+
@pytest.mark.filterwarnings("ignore:divide by zero encountered:RuntimeWarning:dask")
|
158
|
+
@pytest.mark.filterwarnings("ignore:overflow encountered:RuntimeWarning:dask")
|
159
|
+
@pytest.mark.filterwarnings(
|
160
|
+
"ignore:overflow encountered:RuntimeWarning:array_api_strict"
|
161
|
+
)
|
162
|
+
def test_support_alternative_backends_hypothesis(xp, func, nfo, data):
|
163
|
+
dtype = data.draw(strategies.sampled_from(['float32', 'float64', 'int64']))
|
164
|
+
positive_only, [dtype_np_ref] = _skip_or_tweak_alternative_backends(
|
165
|
+
xp, nfo.name, [dtype])
|
166
|
+
dtype_np = getattr(np, dtype)
|
167
|
+
dtype_xp = getattr(xp, dtype)
|
168
|
+
|
169
|
+
elements = {'allow_subnormal': False}
|
170
|
+
# Most failures are due to NaN or infinity; uncomment to suppress them
|
171
|
+
# elements['allow_infinity'] = False
|
172
|
+
# elements['allow_nan'] = False
|
173
|
+
if positive_only:
|
174
|
+
elements['min_value'] = 0
|
175
|
+
|
176
|
+
shapes, _ = data.draw(
|
177
|
+
npst.mutually_broadcastable_shapes(num_shapes=nfo.n_args))
|
178
|
+
args_np = [data.draw(npst.arrays(dtype_np, shape, elements=elements))
|
179
|
+
for shape in shapes]
|
180
|
+
|
181
|
+
args_xp = [xp.asarray(arg, dtype=dtype_xp) for arg in args_np]
|
182
|
+
args_np = [np.asarray(arg, dtype=dtype_np_ref) for arg in args_np]
|
183
|
+
|
184
|
+
res = nfo.wrapper(*args_xp) # Also wrapped by lazy_xp_function
|
185
|
+
ref = nfo.func(*args_np) # Unwrapped ufunc
|
186
|
+
|
187
|
+
# When dtype_np is integer, the output dtype can be float
|
188
|
+
atol = 0 if ref.dtype.kind in 'iu' else 10 * np.finfo(ref.dtype).eps
|
189
|
+
xp_assert_close(res, xp.asarray(ref), atol=atol)
|
190
|
+
|
191
|
+
|
192
|
+
@pytest.mark.parametrize("func", [nfo.wrapper for nfo in _special_funcs])
|
193
|
+
def test_pickle(func):
|
194
|
+
roundtrip = pickle.loads(pickle.dumps(func))
|
195
|
+
assert roundtrip is func
|
196
|
+
|
197
|
+
|
198
|
+
@pytest.mark.parametrize("func", [nfo.wrapper for nfo in _special_funcs])
|
199
|
+
def test_repr(func):
|
200
|
+
assert func.__name__ in repr(func)
|
201
|
+
assert "locals" not in repr(func)
|
202
|
+
|
203
|
+
|
204
|
+
@pytest.mark.skipif(
|
205
|
+
version.parse(np.__version__) < version.parse("2.2"),
|
206
|
+
reason="Can't update ufunc __doc__ when SciPy is compiled vs. NumPy < 2.2")
|
207
|
+
@pytest.mark.parametrize('func', [nfo.wrapper for nfo in _special_funcs])
|
208
|
+
def test_doc(func):
|
209
|
+
"""xp_capabilities updates the docstring in place.
|
210
|
+
Make sure it does so exactly once, including when SCIPY_ARRAY_API is not set.
|
211
|
+
"""
|
212
|
+
match = "has experimental support for Python Array API"
|
213
|
+
assert func.__doc__.count(match) == 1
|
214
|
+
|
89
215
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
216
|
+
@pytest.mark.parametrize('func,n_args',
|
217
|
+
[(nfo.wrapper, nfo.n_args) for nfo in _special_funcs])
|
218
|
+
def test_ufunc_kwargs(func, n_args):
|
219
|
+
"""Test that numpy-specific out= and dtype= keyword arguments
|
220
|
+
of ufuncs still work when SCIPY_ARRAY_API is set.
|
221
|
+
"""
|
222
|
+
# out=
|
223
|
+
args = [np.asarray([.1, .2])] * n_args
|
224
|
+
out = np.empty(2)
|
225
|
+
y = func(*args, out=out)
|
226
|
+
xp_assert_close(y, out)
|
94
227
|
|
95
|
-
|
228
|
+
# out= with out.dtype != args.dtype
|
229
|
+
out = np.empty(2, dtype=np.float32)
|
230
|
+
y = func(*args, out=out)
|
231
|
+
xp_assert_close(y, out)
|
96
232
|
|
97
|
-
|
98
|
-
|
233
|
+
# dtype=
|
234
|
+
y = func(*args, dtype=np.float32)
|
235
|
+
assert y.dtype == np.float32
|
99
236
|
|
100
|
-
eps = np.finfo(dtype_np).eps
|
101
|
-
xp_assert_close(res, ref, atol=10*eps)
|
102
237
|
|
103
238
|
|
104
|
-
@
|
239
|
+
@make_xp_test_case(special.chdtr)
|
105
240
|
def test_chdtr_gh21311(xp):
|
106
241
|
# the edge case behavior of generic chdtr was not right; see gh-21311
|
107
242
|
# be sure to test at least these cases
|
scipy/stats/__init__.py
CHANGED
@@ -280,6 +280,7 @@ Frequency statistics
|
|
280
280
|
:toctree: generated/
|
281
281
|
|
282
282
|
cumfreq
|
283
|
+
quantile
|
283
284
|
percentileofscore
|
284
285
|
scoreatpercentile
|
285
286
|
relfreq
|
@@ -471,6 +472,7 @@ Random Variables
|
|
471
472
|
make_distribution
|
472
473
|
Normal
|
473
474
|
Uniform
|
475
|
+
Binomial
|
474
476
|
Mixture
|
475
477
|
order_statistic
|
476
478
|
truncate
|
@@ -649,9 +651,10 @@ from ._survival import *
|
|
649
651
|
from ._distribution_infrastructure import (
|
650
652
|
make_distribution, Mixture, order_statistic, truncate, exp, log, abs
|
651
653
|
)
|
652
|
-
from ._new_distributions import Normal, Uniform
|
654
|
+
from ._new_distributions import Normal, Uniform, Binomial
|
653
655
|
from ._mgc import multiscale_graphcorr
|
654
656
|
from ._correlation import chatterjeexi
|
657
|
+
from ._quantile import quantile
|
655
658
|
|
656
659
|
|
657
660
|
# Deprecated namespaces, to be removed in v2.0.0
|
Binary file
|
scipy/stats/_axis_nan_policy.py
CHANGED
@@ -42,6 +42,7 @@ def _broadcast_arrays(arrays, axis=None, xp=None):
|
|
42
42
|
"""
|
43
43
|
Broadcast shapes of arrays, ignoring incompatibility of specified axes
|
44
44
|
"""
|
45
|
+
arrays = tuple(arrays)
|
45
46
|
if not arrays:
|
46
47
|
return arrays
|
47
48
|
xp = array_namespace(*arrays) if xp is None else xp
|
@@ -402,17 +403,9 @@ def _axis_nan_policy_factory(tuple_to_result, default_axis=0,
|
|
402
403
|
override.update(temp)
|
403
404
|
|
404
405
|
if result_to_tuple is None:
|
405
|
-
def result_to_tuple(res):
|
406
|
+
def result_to_tuple(res, _):
|
406
407
|
return res
|
407
408
|
|
408
|
-
# The only `result_to_tuple` that needs the second argument (number of
|
409
|
-
# outputs) is the one for `moment`, and this was realized very late.
|
410
|
-
# Rather than changing all `result_to_tuple` definitions, we wrap them
|
411
|
-
# here to accept a second argument if they don't already.
|
412
|
-
if len(inspect.signature(result_to_tuple).parameters) == 1:
|
413
|
-
def result_to_tuple(res, _, f=result_to_tuple):
|
414
|
-
return f(res)
|
415
|
-
|
416
409
|
if not callable(too_small):
|
417
410
|
def is_too_small(samples, *ts_args, axis=-1, **ts_kwargs):
|
418
411
|
for sample in samples:
|
@@ -554,11 +547,11 @@ def _axis_nan_policy_factory(tuple_to_result, default_axis=0,
|
|
554
547
|
if np.all(ndims <= 1):
|
555
548
|
# Addresses nan_policy == "raise"
|
556
549
|
if nan_policy != 'propagate' or override['nan_propagation']:
|
557
|
-
contains_nan = [_contains_nan(sample, nan_policy)
|
550
|
+
contains_nan = [_contains_nan(sample, nan_policy)
|
558
551
|
for sample in samples]
|
559
552
|
else:
|
560
553
|
# Behave as though there are no NaNs (even if there are)
|
561
|
-
contains_nan = [False]*len(samples)
|
554
|
+
contains_nan = [False] * len(samples)
|
562
555
|
|
563
556
|
# Addresses nan_policy == "propagate"
|
564
557
|
if any(contains_nan) and (nan_policy == 'propagate'
|
@@ -610,7 +603,7 @@ def _axis_nan_policy_factory(tuple_to_result, default_axis=0,
|
|
610
603
|
|
611
604
|
# Addresses nan_policy == "raise"
|
612
605
|
if nan_policy != 'propagate' or override['nan_propagation']:
|
613
|
-
contains_nan
|
606
|
+
contains_nan = _contains_nan(x, nan_policy)
|
614
607
|
else:
|
615
608
|
contains_nan = False # behave like there are no NaNs
|
616
609
|
|
Binary file
|