scipy 1.15.3__cp312-cp312-win_amd64.whl → 1.16.0rc2__cp312-cp312-win_amd64.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 +8 -8
- scipy/__init__.py +3 -6
- scipy/_cyutility.cp312-win_amd64.dll.a +0 -0
- scipy/_cyutility.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/_ccallback_c.cp312-win_amd64.pyd +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_fpumode.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/_fpumode.cp312-win_amd64.pyd +0 -0
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_ccallback.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/_test_ccallback.cp312-win_amd64.pyd +0 -0
- scipy/_lib/_test_deprecation_call.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/_test_deprecation_call.cp312-win_amd64.pyd +0 -0
- scipy/_lib/_test_deprecation_def.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/_test_deprecation_def.cp312-win_amd64.pyd +0 -0
- scipy/_lib/_testutils.py +6 -2
- scipy/_lib/_uarray/_uarray.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/_uarray/_uarray.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/messagestream.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/cluster/_hierarchy.cp312-win_amd64.pyd +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.dll.a +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.pyd +0 -0
- scipy/cluster/_vq.cp312-win_amd64.dll.a +0 -0
- scipy/cluster/_vq.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/fft/_pocketfft/pypocketfft.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/fftpack/convolve.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_dop.cp312-win_amd64.pyd +0 -0
- scipy/integrate/_lsoda.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_lsoda.cp312-win_amd64.pyd +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_odepack.cp312-win_amd64.pyd +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_quadpack.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_test_multivariate.cp312-win_amd64.pyd +0 -0
- scipy/integrate/_test_odeint_banded.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_test_odeint_banded.cp312-win_amd64.pyd +0 -0
- scipy/integrate/_vode.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_vode.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_dfitpack.cp312-win_amd64.pyd +0 -0
- scipy/interpolate/_dierckx.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_dierckx.cp312-win_amd64.pyd +0 -0
- scipy/interpolate/_fitpack.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_fitpack.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_interpnd.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_ppoly.cp312-win_amd64.pyd +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.pyd +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_rgi_cython.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/io/_test_fortran.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/io/matlab/_mio5_utils.cp312-win_amd64.pyd +0 -0
- scipy/io/matlab/_mio_utils.cp312-win_amd64.dll.a +0 -0
- scipy/io/matlab/_mio_utils.cp312-win_amd64.pyd +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cp312-win_amd64.dll.a +0 -0
- scipy/io/matlab/_streams.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_cythonized_array_utils.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_interpolative.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_lu_cython.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_update.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_fblas.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_flapack.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_flapack.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_linalg_pythran.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_linalg_pythran.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_expm.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_solve_toeplitz.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/cython_blas.cp312-win_amd64.pyd +0 -0
- scipy/linalg/cython_lapack.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/cython_lapack.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/ndimage/_ctest.cp312-win_amd64.pyd +0 -0
- scipy/ndimage/_cytest.cp312-win_amd64.dll.a +0 -0
- scipy/ndimage/_cytest.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/ndimage/_nd_image.cp312-win_amd64.pyd +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cp312-win_amd64.dll.a +0 -0
- scipy/ndimage/_ni_label.cp312-win_amd64.pyd +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cp312-win_amd64.dll.a +0 -0
- scipy/ndimage/_rank_filter_1d.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/odr/__odrpack.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_bglu_dense.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_direct.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_group_columns.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_highspy/_core.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_highspy/_core.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_highspy/_highs_options.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_highspy/_highs_options.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_lbfgsb.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_lbfgsb.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_lsap.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_lsq/givens_elimination.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_minpack.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_moduleTNC.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_pava_pybind.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_slsqplib.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_trlib/_trlib.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_zeros.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/cython_optimize/_zeros.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/signal/_max_len_seq_inner.cp312-win_amd64.pyd +0 -0
- scipy/signal/_peak_finding_utils.cp312-win_amd64.dll.a +0 -0
- scipy/signal/_peak_finding_utils.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/signal/_sigtools.cp312-win_amd64.pyd +0 -0
- scipy/signal/_sosfilt.cp312-win_amd64.dll.a +0 -0
- scipy/signal/_sosfilt.cp312-win_amd64.pyd +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cp312-win_amd64.dll.a +0 -0
- scipy/signal/_spline.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/signal/_upfirdn_apply.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/_csparsetools.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/_sparsetools.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_flow.cp312-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_matching.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_matching.cp312-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_reordering.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_reordering.cp312-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_tools.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_tools.cp312-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_traversal.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_traversal.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_dsolve/_superlu.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_cpropack.cp312-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/_ckdtree.cp312-win_amd64.pyd +0 -0
- scipy/spatial/_distance_pybind.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/_distance_pybind.cp312-win_amd64.pyd +0 -0
- scipy/spatial/_distance_wrap.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/_distance_wrap.cp312-win_amd64.pyd +0 -0
- scipy/spatial/_hausdorff.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/_hausdorff.cp312-win_amd64.pyd +0 -0
- scipy/spatial/_qhull.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/_qhull.cp312-win_amd64.pyd +0 -0
- scipy/spatial/_voronoi.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/_voronoi.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/transform/_rigid_transform.cp312-win_amd64.pyd +0 -0
- scipy/spatial/transform/_rotation.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/transform/_rotation.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/special/_comb.cp312-win_amd64.pyd +0 -0
- scipy/special/_ellip_harm_2.cp312-win_amd64.dll.a +0 -0
- scipy/special/_ellip_harm_2.cp312-win_amd64.pyd +0 -0
- scipy/special/_gufuncs.cp312-win_amd64.dll.a +0 -0
- scipy/special/_gufuncs.cp312-win_amd64.pyd +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cp312-win_amd64.dll.a +0 -0
- scipy/special/_specfun.cp312-win_amd64.pyd +0 -0
- scipy/special/_special_ufuncs.cp312-win_amd64.dll.a +0 -0
- scipy/special/_special_ufuncs.cp312-win_amd64.pyd +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cp312-win_amd64.dll.a +0 -0
- scipy/special/_test_internal.cp312-win_amd64.pyd +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cp312-win_amd64.dll.a +0 -0
- scipy/special/_ufuncs.cp312-win_amd64.pyd +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cp312-win_amd64.dll.a +0 -0
- scipy/special/_ufuncs_cxx.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/special/cython_special.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_ansari_swilk_statistics.cp312-win_amd64.pyd +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_biasedurn.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_levy_stable/levyst.cp312-win_amd64.pyd +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.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_qmc_cy.cp312-win_amd64.pyd +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_qmvnt_cy.cp312-win_amd64.pyd +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_rcont/rcont.cp312-win_amd64.pyd +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_sobol.cp312-win_amd64.pyd +0 -0
- scipy/stats/_stats.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_stats.cp312-win_amd64.pyd +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_stats_pythran.cp312-win_amd64.pyd +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp312-win_amd64.pyd +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.16.0rc2.dist-info/DELVEWHEEL +2 -0
- {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 +685 -693
- scipy/_lib/array_api_extra/_funcs.py +0 -484
- scipy/_lib/array_api_extra/_typing.py +0 -8
- scipy/interpolate/_bspl.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_bspl.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_cobyla.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_cobyla.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_cython_nnls.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_cython_nnls.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_slsqp.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_slsqp.cp312-win_amd64.pyd +0 -0
- scipy/spatial/qhull_src/COPYING.txt +0 -38
- scipy/special/libsf_error_state.dll +0 -0
- scipy/special/libsf_error_state.dll.a +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.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_mvn.cp312-win_amd64.pyd +0 -0
- scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
- /scipy-1.15.3-cp312-cp312-win_amd64.whl → /scipy-1.16.0rc2-cp312-cp312-win_amd64.whl +0 -0
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
scipy/_lib/tests/test__util.py
CHANGED
@@ -2,25 +2,26 @@ from multiprocessing import Pool
|
|
2
2
|
from multiprocessing.pool import Pool as PWL
|
3
3
|
import re
|
4
4
|
import math
|
5
|
+
import functools
|
5
6
|
from fractions import Fraction
|
6
7
|
|
7
8
|
import numpy as np
|
8
9
|
from numpy.testing import assert_equal, assert_
|
9
10
|
import pytest
|
10
11
|
from pytest import raises as assert_raises
|
11
|
-
|
12
|
-
from hypothesis import given, strategies, reproduce_failure # noqa: F401
|
13
|
-
from scipy.conftest import array_api_compatible, skip_xp_invalid_arg
|
12
|
+
from scipy.conftest import skip_xp_invalid_arg
|
14
13
|
|
15
|
-
from scipy._lib._array_api import
|
16
|
-
xp_copy, is_array_api_strict)
|
14
|
+
from scipy._lib._array_api import xp_assert_equal, is_numpy
|
17
15
|
from scipy._lib._util import (_aligned_zeros, check_random_state, MapWrapper,
|
18
16
|
getfullargspec_no_self, FullArgSpec,
|
19
17
|
rng_integers, _validate_int, _rename_parameter,
|
20
|
-
_contains_nan, _rng_html_rewrite,
|
18
|
+
_contains_nan, _rng_html_rewrite, _workers_wrapper)
|
19
|
+
import scipy._lib.array_api_extra as xpx
|
20
|
+
from scipy._lib.array_api_extra.testing import lazy_xp_function
|
21
21
|
from scipy import cluster, interpolate, linalg, optimize, sparse, spatial, stats
|
22
22
|
|
23
|
-
|
23
|
+
|
24
|
+
lazy_xp_function(_contains_nan)
|
24
25
|
|
25
26
|
|
26
27
|
@pytest.mark.slow
|
@@ -147,6 +148,36 @@ def test_mapwrapper_parallel():
|
|
147
148
|
assert_equal(list(out), out_arg)
|
148
149
|
|
149
150
|
|
151
|
+
@_workers_wrapper
|
152
|
+
def user_of_workers(x, b=1, workers=None):
|
153
|
+
assert workers is not None
|
154
|
+
assert isinstance(workers, MapWrapper)
|
155
|
+
return np.array(list(workers(np.sin, x * b)))
|
156
|
+
|
157
|
+
|
158
|
+
def test__workers_wrapper():
|
159
|
+
arr = np.linspace(0, np.pi)
|
160
|
+
req = np.sin(arr * 2.0)
|
161
|
+
|
162
|
+
with Pool(2) as p:
|
163
|
+
v = user_of_workers(arr, workers=p.map, b=2)
|
164
|
+
assert_equal(v, req)
|
165
|
+
|
166
|
+
v = user_of_workers(arr, workers=None, b=2)
|
167
|
+
assert_equal(v, req)
|
168
|
+
|
169
|
+
v = user_of_workers(arr, workers=2, b=2)
|
170
|
+
assert_equal(v, req)
|
171
|
+
|
172
|
+
# assess if decorator works with partial functions
|
173
|
+
part_f = functools.partial(user_of_workers, b=2)
|
174
|
+
assert_equal(part_f(arr), req)
|
175
|
+
|
176
|
+
with Pool(2) as p:
|
177
|
+
part_f = functools.partial(user_of_workers, b=2, workers=p.map)
|
178
|
+
assert_equal(part_f(arr), req)
|
179
|
+
|
180
|
+
|
150
181
|
def test_rng_integers():
|
151
182
|
rng = np.random.RandomState()
|
152
183
|
|
@@ -296,86 +327,103 @@ class TestRenameParameter:
|
|
296
327
|
self.old_keyword_deprecated(new=10, old=10)
|
297
328
|
|
298
329
|
|
299
|
-
class
|
300
|
-
|
330
|
+
class TestContainsNaN:
|
301
331
|
def test_policy(self):
|
302
332
|
data = np.array([1, 2, 3, np.nan])
|
303
333
|
|
304
|
-
|
305
|
-
assert
|
306
|
-
assert nan_policy
|
307
|
-
|
308
|
-
|
309
|
-
assert
|
310
|
-
assert nan_policy == "omit"
|
334
|
+
assert _contains_nan(data) # default policy is "propagate"
|
335
|
+
assert _contains_nan(data, nan_policy="propagate")
|
336
|
+
assert _contains_nan(data, nan_policy="omit")
|
337
|
+
assert not _contains_nan(data[:3])
|
338
|
+
assert not _contains_nan(data[:3], nan_policy="propagate")
|
339
|
+
assert not _contains_nan(data[:3], nan_policy="omit")
|
311
340
|
|
312
|
-
|
313
|
-
with pytest.raises(ValueError, match=msg):
|
341
|
+
with pytest.raises(ValueError, match="The input contains nan values"):
|
314
342
|
_contains_nan(data, nan_policy="raise")
|
343
|
+
assert not _contains_nan(data[:3], nan_policy="raise")
|
315
344
|
|
316
|
-
|
317
|
-
with pytest.raises(ValueError, match=msg):
|
345
|
+
with pytest.raises(ValueError, match="nan_policy must be one of"):
|
318
346
|
_contains_nan(data, nan_policy="nan")
|
319
347
|
|
320
348
|
def test_contains_nan(self):
|
321
|
-
|
322
|
-
assert not _contains_nan(
|
323
|
-
|
324
|
-
|
325
|
-
assert _contains_nan(
|
326
|
-
|
327
|
-
|
328
|
-
assert _contains_nan(
|
329
|
-
|
330
|
-
|
331
|
-
assert
|
332
|
-
|
333
|
-
|
334
|
-
assert _contains_nan(
|
349
|
+
# Special case: empty array
|
350
|
+
assert not _contains_nan(np.array([], dtype=float))
|
351
|
+
|
352
|
+
# Integer arrays cannot contain NaN
|
353
|
+
assert not _contains_nan(np.array([1, 2, 3]))
|
354
|
+
assert not _contains_nan(np.array([[1, 2], [3, 4]]))
|
355
|
+
|
356
|
+
assert not _contains_nan(np.array([1., 2., 3.]))
|
357
|
+
assert not _contains_nan(np.array([1., 2.j, 3.]))
|
358
|
+
assert _contains_nan(np.array([1., 2.j, np.nan]))
|
359
|
+
assert _contains_nan(np.array([1., 2., np.nan]))
|
360
|
+
assert _contains_nan(np.array([np.nan, 2., np.nan]))
|
361
|
+
assert not _contains_nan(np.array([[1., 2.], [3., 4.]]))
|
362
|
+
assert _contains_nan(np.array([[1., 2.], [3., np.nan]]))
|
335
363
|
|
336
364
|
@skip_xp_invalid_arg
|
337
365
|
def test_contains_nan_with_strings(self):
|
338
366
|
data1 = np.array([1, 2, "3", np.nan]) # converted to string "nan"
|
339
|
-
assert not _contains_nan(data1)
|
367
|
+
assert not _contains_nan(data1)
|
340
368
|
|
341
369
|
data2 = np.array([1, 2, "3", np.nan], dtype='object')
|
342
|
-
assert _contains_nan(data2)
|
370
|
+
assert _contains_nan(data2)
|
343
371
|
|
344
372
|
data3 = np.array([["1", 2], [3, np.nan]]) # converted to string "nan"
|
345
|
-
assert not _contains_nan(data3)
|
373
|
+
assert not _contains_nan(data3)
|
346
374
|
|
347
375
|
data4 = np.array([["1", 2], [3, np.nan]], dtype='object')
|
348
|
-
assert _contains_nan(data4)
|
376
|
+
assert _contains_nan(data4)
|
349
377
|
|
350
|
-
@skip_xp_backends(
|
351
|
-
|
352
|
-
@pytest.mark.usefixtures("skip_xp_backends")
|
353
|
-
@array_api_compatible
|
378
|
+
@pytest.mark.skip_xp_backends(eager_only=True,
|
379
|
+
reason="lazy backends tested separately")
|
354
380
|
@pytest.mark.parametrize("nan_policy", ['propagate', 'omit', 'raise'])
|
355
381
|
def test_array_api(self, xp, nan_policy):
|
356
382
|
rng = np.random.default_rng(932347235892482)
|
357
383
|
x0 = rng.random(size=(2, 3, 4))
|
358
384
|
x = xp.asarray(x0)
|
359
|
-
|
360
|
-
x_nan[1, 2, 1] = np.nan
|
385
|
+
assert not _contains_nan(x, nan_policy)
|
361
386
|
|
362
|
-
|
363
|
-
assert not contains_nan
|
364
|
-
assert nan_policy_out == nan_policy
|
387
|
+
x = xpx.at(x)[1, 2, 1].set(np.nan)
|
365
388
|
|
366
389
|
if nan_policy == 'raise':
|
367
|
-
|
368
|
-
|
369
|
-
_contains_nan(x_nan, nan_policy=nan_policy)
|
390
|
+
with pytest.raises(ValueError, match="The input contains nan values"):
|
391
|
+
_contains_nan(x, nan_policy)
|
370
392
|
elif nan_policy == 'omit' and not is_numpy(xp):
|
371
|
-
|
372
|
-
|
373
|
-
|
393
|
+
with pytest.raises(ValueError, match="nan_policy='omit' is incompatible"):
|
394
|
+
_contains_nan(x, nan_policy)
|
395
|
+
assert _contains_nan(x, nan_policy, xp_omit_okay=True)
|
374
396
|
elif nan_policy == 'propagate':
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
397
|
+
assert _contains_nan(x, nan_policy)
|
398
|
+
|
399
|
+
@pytest.mark.skip_xp_backends("numpy", reason="lazy backends only")
|
400
|
+
@pytest.mark.skip_xp_backends("cupy", reason="lazy backends only")
|
401
|
+
@pytest.mark.skip_xp_backends("array_api_strict", reason="lazy backends only")
|
402
|
+
@pytest.mark.skip_xp_backends("torch", reason="lazy backends only")
|
403
|
+
def test_array_api_lazy(self, xp):
|
404
|
+
rng = np.random.default_rng(932347235892482)
|
405
|
+
x0 = rng.random(size=(2, 3, 4))
|
406
|
+
x = xp.asarray(x0)
|
407
|
+
|
408
|
+
xp_assert_equal(_contains_nan(x), xp.asarray(False))
|
409
|
+
xp_assert_equal(_contains_nan(x, "propagate"), xp.asarray(False))
|
410
|
+
xp_assert_equal(_contains_nan(x, "omit", xp_omit_okay=True), xp.asarray(False))
|
411
|
+
# Lazy arrays don't support "omit" and "raise" policies
|
412
|
+
match = "not supported for lazy arrays"
|
413
|
+
with pytest.raises(TypeError, match=match):
|
414
|
+
_contains_nan(x, "omit")
|
415
|
+
with pytest.raises(TypeError, match=match):
|
416
|
+
_contains_nan(x, "raise")
|
417
|
+
|
418
|
+
x = xpx.at(x)[1, 2, 1].set(np.nan)
|
419
|
+
|
420
|
+
xp_assert_equal(_contains_nan(x), xp.asarray(True))
|
421
|
+
xp_assert_equal(_contains_nan(x, "propagate"), xp.asarray(True))
|
422
|
+
xp_assert_equal(_contains_nan(x, "omit", xp_omit_okay=True), xp.asarray(True))
|
423
|
+
with pytest.raises(TypeError, match=match):
|
424
|
+
_contains_nan(x, "omit")
|
425
|
+
with pytest.raises(TypeError, match=match):
|
426
|
+
_contains_nan(x, "raise")
|
379
427
|
|
380
428
|
|
381
429
|
def test__rng_html_rewrite():
|
@@ -591,67 +639,3 @@ class TestTransitionToRNG:
|
|
591
639
|
res3 = method(self, **{arg_name: None})
|
592
640
|
assert_equal(res2, res1)
|
593
641
|
assert_equal(res3, res1)
|
594
|
-
|
595
|
-
|
596
|
-
class TestLazywhere:
|
597
|
-
n_arrays = strategies.integers(min_value=1, max_value=3)
|
598
|
-
rng_seed = strategies.integers(min_value=1000000000, max_value=9999999999)
|
599
|
-
dtype = strategies.sampled_from((np.float32, np.float64))
|
600
|
-
p = strategies.floats(min_value=0, max_value=1)
|
601
|
-
data = strategies.data()
|
602
|
-
|
603
|
-
@pytest.mark.fail_slow(10)
|
604
|
-
@pytest.mark.filterwarnings('ignore::RuntimeWarning') # overflows, etc.
|
605
|
-
@skip_xp_backends('jax.numpy',
|
606
|
-
reason="JAX arrays do not support item assignment")
|
607
|
-
@pytest.mark.usefixtures("skip_xp_backends")
|
608
|
-
@array_api_compatible
|
609
|
-
@given(n_arrays=n_arrays, rng_seed=rng_seed, dtype=dtype, p=p, data=data)
|
610
|
-
@pytest.mark.thread_unsafe
|
611
|
-
def test_basic(self, n_arrays, rng_seed, dtype, p, data, xp):
|
612
|
-
mbs = npst.mutually_broadcastable_shapes(num_shapes=n_arrays+1,
|
613
|
-
min_side=0)
|
614
|
-
input_shapes, result_shape = data.draw(mbs)
|
615
|
-
cond_shape, *shapes = input_shapes
|
616
|
-
elements = {'allow_subnormal': False} # cupy/cupy#8382
|
617
|
-
fillvalue = xp.asarray(data.draw(npst.arrays(dtype=dtype, shape=tuple(),
|
618
|
-
elements=elements)))
|
619
|
-
float_fillvalue = float(fillvalue)
|
620
|
-
arrays = [xp.asarray(data.draw(npst.arrays(dtype=dtype, shape=shape)))
|
621
|
-
for shape in shapes]
|
622
|
-
|
623
|
-
def f(*args):
|
624
|
-
return sum(arg for arg in args)
|
625
|
-
|
626
|
-
def f2(*args):
|
627
|
-
return sum(arg for arg in args) / 2
|
628
|
-
|
629
|
-
rng = np.random.default_rng(rng_seed)
|
630
|
-
cond = xp.asarray(rng.random(size=cond_shape) > p)
|
631
|
-
|
632
|
-
res1 = _lazywhere(cond, arrays, f, fillvalue)
|
633
|
-
res2 = _lazywhere(cond, arrays, f, f2=f2)
|
634
|
-
if not is_array_api_strict(xp):
|
635
|
-
res3 = _lazywhere(cond, arrays, f, float_fillvalue)
|
636
|
-
|
637
|
-
# Ensure arrays are at least 1d to follow sane type promotion rules.
|
638
|
-
# This can be removed when minimum supported NumPy is 2.0
|
639
|
-
if xp == np:
|
640
|
-
cond, fillvalue, *arrays = np.atleast_1d(cond, fillvalue, *arrays)
|
641
|
-
|
642
|
-
ref1 = xp.where(cond, f(*arrays), fillvalue)
|
643
|
-
ref2 = xp.where(cond, f(*arrays), f2(*arrays))
|
644
|
-
if not is_array_api_strict(xp):
|
645
|
-
# Array API standard doesn't currently define behavior when fillvalue is a
|
646
|
-
# Python scalar. When it does, test can be run with array_api_strict, too.
|
647
|
-
ref3 = xp.where(cond, f(*arrays), float_fillvalue)
|
648
|
-
|
649
|
-
if xp == np: # because we ensured arrays are at least 1d
|
650
|
-
ref1 = ref1.reshape(result_shape)
|
651
|
-
ref2 = ref2.reshape(result_shape)
|
652
|
-
ref3 = ref3.reshape(result_shape)
|
653
|
-
|
654
|
-
xp_assert_close(res1, ref1, rtol=2e-16)
|
655
|
-
xp_assert_equal(res2, ref2)
|
656
|
-
if not is_array_api_strict(xp):
|
657
|
-
xp_assert_equal(res3, ref3)
|
@@ -1,14 +1,19 @@
|
|
1
|
+
import re
|
2
|
+
|
1
3
|
import numpy as np
|
2
4
|
import pytest
|
3
5
|
|
4
|
-
from scipy.conftest import array_api_compatible
|
5
6
|
from scipy._lib._array_api import (
|
6
7
|
_GLOBAL_CONFIG, array_namespace, _asarray, xp_copy, xp_assert_equal, is_numpy,
|
7
|
-
np_compat, xp_default_dtype
|
8
|
+
np_compat, xp_default_dtype, xp_result_type, is_torch
|
8
9
|
)
|
10
|
+
from scipy._lib import array_api_extra as xpx
|
9
11
|
from scipy._lib._array_api_no_0d import xp_assert_equal as xp_assert_equal_no_0d
|
12
|
+
from scipy._lib.array_api_extra.testing import lazy_xp_function
|
13
|
+
|
10
14
|
|
11
|
-
|
15
|
+
lazy_xp_function(_asarray)
|
16
|
+
lazy_xp_function(xp_copy)
|
12
17
|
|
13
18
|
|
14
19
|
@pytest.mark.skipif(not _GLOBAL_CONFIG["SCIPY_ARRAY_API"],
|
@@ -25,7 +30,6 @@ class TestArrayAPI:
|
|
25
30
|
assert 'array_api_compat.numpy' in xp.__name__
|
26
31
|
_GLOBAL_CONFIG["SCIPY_ARRAY_API"] = True
|
27
32
|
|
28
|
-
@array_api_compatible
|
29
33
|
def test_asarray(self, xp):
|
30
34
|
x, y = _asarray([0, 1, 2], xp=xp), _asarray(np.arange(3), xp=xp)
|
31
35
|
ref = xp.asarray([0, 1, 2])
|
@@ -48,32 +52,67 @@ class TestArrayAPI:
|
|
48
52
|
with pytest.raises(TypeError, match=msg):
|
49
53
|
array_namespace('abc')
|
50
54
|
|
51
|
-
|
52
|
-
|
53
|
-
array_namespace
|
54
|
-
|
55
|
-
|
55
|
+
@pytest.mark.skip_xp_backends(np_only=True, reason="Array-likes")
|
56
|
+
def test_array_likes(self, xp):
|
57
|
+
"""Test that if all parameters of array_namespace are Array-likes,
|
58
|
+
the output is array_api_compat.numpy
|
59
|
+
"""
|
60
|
+
assert array_namespace([0, 1, 2]) is xp
|
61
|
+
assert array_namespace((0, 1, 2)) is xp
|
62
|
+
assert array_namespace(1, 2, 3) is xp
|
63
|
+
assert array_namespace(1) is xp
|
64
|
+
assert array_namespace(np.int64(1)) is xp
|
65
|
+
assert array_namespace([0, 1, 2], 3) is xp
|
66
|
+
assert array_namespace() is xp
|
67
|
+
assert array_namespace(None) is xp
|
68
|
+
assert array_namespace(1, None) is xp
|
69
|
+
assert array_namespace(None, 1) is xp
|
70
|
+
|
71
|
+
# This only works when xp is numpy!
|
72
|
+
assert array_namespace(np.asarray([1, 2]), [3, 4]) is xp
|
73
|
+
assert array_namespace(np.int64(1), [3, 4]) is xp
|
74
|
+
|
75
|
+
def test_array_and_array_likes_mix(self, xp):
|
76
|
+
"""Test that if there is at least one Array API object among
|
77
|
+
the parameters of array_namespace, and all other parameters
|
78
|
+
are scalars, the output is its namespace.
|
79
|
+
|
80
|
+
If there are non-scalar Array-Likes, raise as in array-api-compat.
|
81
|
+
"""
|
82
|
+
x = xp.asarray(1)
|
83
|
+
assert array_namespace(x) is xp
|
84
|
+
assert array_namespace(x, 1) is xp
|
85
|
+
assert array_namespace(1, x) is xp
|
86
|
+
assert array_namespace(None, x) is xp
|
87
|
+
|
88
|
+
if not is_numpy(xp):
|
89
|
+
with pytest.raises(TypeError, match="Multiple namespaces"):
|
90
|
+
array_namespace(x, [1, 2])
|
91
|
+
with pytest.raises(TypeError, match="Multiple namespaces"):
|
92
|
+
array_namespace(x, np.int64(1))
|
93
|
+
|
94
|
+
def test_array_api_extra_hook(self):
|
95
|
+
"""Test that the `array_namespace` function used by
|
96
|
+
array-api-extra has been overridden by scipy
|
97
|
+
"""
|
98
|
+
msg = "only boolean and numerical dtypes are supported"
|
99
|
+
with pytest.raises(TypeError, match=msg):
|
100
|
+
xpx.atleast_nd("abc", ndim=0)
|
56
101
|
|
57
|
-
@skip_xp_backends('jax.numpy',
|
58
|
-
reason="JAX arrays do not support item assignment")
|
59
|
-
@pytest.mark.usefixtures("skip_xp_backends")
|
60
|
-
@array_api_compatible
|
61
102
|
def test_copy(self, xp):
|
62
103
|
for _xp in [xp, None]:
|
63
104
|
x = xp.asarray([1, 2, 3])
|
64
105
|
y = xp_copy(x, xp=_xp)
|
65
106
|
# with numpy we'd want to use np.shared_memory, but that's not specified
|
66
107
|
# in the array-api
|
67
|
-
x[0] = 10
|
68
|
-
x[1] = 11
|
69
|
-
x[2] = 12
|
70
|
-
|
71
|
-
assert x[0] != y[0]
|
72
|
-
assert x[1] != y[1]
|
73
|
-
assert x[2] != y[2]
|
74
108
|
assert id(x) != id(y)
|
75
|
-
|
76
|
-
|
109
|
+
try:
|
110
|
+
y[0] = 10
|
111
|
+
except (TypeError, ValueError):
|
112
|
+
pass
|
113
|
+
else:
|
114
|
+
assert x[0] != y[0]
|
115
|
+
|
77
116
|
@pytest.mark.parametrize('dtype', ['int32', 'int64', 'float32', 'float64'])
|
78
117
|
@pytest.mark.parametrize('shape', [(), (3,)])
|
79
118
|
def test_strict_checks(self, xp, dtype, shape):
|
@@ -85,11 +124,19 @@ class TestArrayAPI:
|
|
85
124
|
|
86
125
|
kwarg_names = ["check_namespace", "check_dtype", "check_shape", "check_0d"]
|
87
126
|
options = dict(zip(kwarg_names, [True, False, False, False]))
|
88
|
-
if xp
|
127
|
+
if is_numpy(xp):
|
89
128
|
xp_assert_equal(x, y, **options)
|
90
129
|
else:
|
91
|
-
with pytest.raises(
|
130
|
+
with pytest.raises(
|
131
|
+
AssertionError,
|
132
|
+
match="Namespace of desired array does not match",
|
133
|
+
):
|
92
134
|
xp_assert_equal(x, y, **options)
|
135
|
+
with pytest.raises(
|
136
|
+
AssertionError,
|
137
|
+
match="Namespace of actual and desired arrays do not match",
|
138
|
+
):
|
139
|
+
xp_assert_equal(y, x, **options)
|
93
140
|
|
94
141
|
options = dict(zip(kwarg_names, [False, True, False, False]))
|
95
142
|
if y.dtype.name in str(x.dtype):
|
@@ -112,12 +159,8 @@ class TestArrayAPI:
|
|
112
159
|
with pytest.raises(AssertionError, match="Array-ness does not match."):
|
113
160
|
xp_assert_equal(x, y, **options)
|
114
161
|
|
115
|
-
|
116
|
-
@array_api_compatible
|
162
|
+
@pytest.mark.skip_xp_backends(np_only=True, reason="Scalars only exist in NumPy")
|
117
163
|
def test_check_scalar(self, xp):
|
118
|
-
if not is_numpy(xp):
|
119
|
-
pytest.skip("Scalars only exist in NumPy")
|
120
|
-
|
121
164
|
# identity always passes
|
122
165
|
xp_assert_equal(xp.float64(0), xp.float64(0))
|
123
166
|
xp_assert_equal(xp.asarray(0.), xp.asarray(0.))
|
@@ -147,12 +190,8 @@ class TestArrayAPI:
|
|
147
190
|
# as an alternative to `check_0d=False`, explicitly expect scalar
|
148
191
|
xp_assert_equal(xp.float64(0), xp.asarray(0.)[()])
|
149
192
|
|
150
|
-
|
151
|
-
@array_api_compatible
|
193
|
+
@pytest.mark.skip_xp_backends(np_only=True, reason="Scalars only exist in NumPy")
|
152
194
|
def test_check_scalar_no_0d(self, xp):
|
153
|
-
if not is_numpy(xp):
|
154
|
-
pytest.skip("Scalars only exist in NumPy")
|
155
|
-
|
156
195
|
# identity passes, if first argument is not 0d (or check_0d=True)
|
157
196
|
xp_assert_equal_no_0d(xp.float64(0), xp.float64(0))
|
158
197
|
xp_assert_equal_no_0d(xp.float64(0), xp.float64(0), check_0d=True)
|
@@ -186,6 +225,98 @@ class TestArrayAPI:
|
|
186
225
|
xp_assert_equal_no_0d(0., xp.asarray(0.))
|
187
226
|
xp_assert_equal_no_0d(42, xp.asarray(42))
|
188
227
|
|
189
|
-
@array_api_compatible
|
190
228
|
def test_default_dtype(self, xp):
|
191
229
|
assert xp_default_dtype(xp) == xp.asarray(1.).dtype
|
230
|
+
|
231
|
+
|
232
|
+
scalars = [1, 1., 1. + 1j]
|
233
|
+
lists = [[1], [1.], [1. + 1j]]
|
234
|
+
types = ('int8 int16 int32 int64 '
|
235
|
+
'uint8 uint16 uint32 uint64 '
|
236
|
+
'float32 float64 complex64 complex128').split()
|
237
|
+
arrays = [np.asarray([1], dtype=getattr(np, t)) for t in types]
|
238
|
+
|
239
|
+
|
240
|
+
def convert_type(x, xp):
|
241
|
+
# Convert NumPy array to xp-array
|
242
|
+
# Convert string to indicated dtype from xp
|
243
|
+
# Return Python scalars unchanged
|
244
|
+
if isinstance(x, np.ndarray):
|
245
|
+
return xp.asarray(x)
|
246
|
+
elif isinstance(x, str):
|
247
|
+
return getattr(xp, x)
|
248
|
+
return x
|
249
|
+
|
250
|
+
|
251
|
+
def is_inexact(x, xp):
|
252
|
+
# Determine whether `x` is of inexact (real of complex floating) dtype
|
253
|
+
x = xp.asarray(x) if np.isscalar(x) or isinstance(x, list) else x
|
254
|
+
dtype = getattr(x, 'dtype', x)
|
255
|
+
return xp.isdtype(dtype, ('real floating', 'complex floating'))
|
256
|
+
|
257
|
+
|
258
|
+
@pytest.mark.parametrize('x', scalars + lists + types + arrays)
|
259
|
+
@pytest.mark.parametrize('y', scalars + lists + types + arrays)
|
260
|
+
def test_xp_result_type_no_force(x, y, xp):
|
261
|
+
# When force_floating==False (default), behavior of `xp_result_type`
|
262
|
+
# should match that of `xp.result_type` on the same arguments after
|
263
|
+
# converting lists to arrays of type `xp`.
|
264
|
+
x = convert_type(x, xp)
|
265
|
+
y = convert_type(y, xp)
|
266
|
+
x_ref = xp.asarray(x) if isinstance(x, list) else x
|
267
|
+
y_ref = xp.asarray(y) if isinstance(y, list) else y
|
268
|
+
|
269
|
+
try:
|
270
|
+
dtype_ref = xp.result_type(x_ref, y_ref)
|
271
|
+
expected_error = None
|
272
|
+
except Exception as e:
|
273
|
+
expected_error = (type(e), str(e))
|
274
|
+
|
275
|
+
if expected_error is not None:
|
276
|
+
with pytest.raises(expected_error[0], match=re.escape(expected_error[1])):
|
277
|
+
xp_result_type(x, y, xp=xp)
|
278
|
+
return
|
279
|
+
|
280
|
+
dtype_res = xp_result_type(x, y, xp=xp)
|
281
|
+
assert dtype_res == dtype_ref
|
282
|
+
|
283
|
+
|
284
|
+
@pytest.mark.parametrize('x', scalars + lists + types + arrays)
|
285
|
+
@pytest.mark.parametrize('y', scalars + lists + types + arrays)
|
286
|
+
def test_xp_result_type_force_floating(x, y, xp):
|
287
|
+
# When `force_floating==True`, behavior of `xp_result_type`
|
288
|
+
# should match that of `xp.result_type` with `1.0` appended to the set of
|
289
|
+
# arguments (after converting lists to arrays of type `xp`).
|
290
|
+
# If this raises a `TypeError`, which is the case when the result
|
291
|
+
# type is not defined by the standard, the result type should be
|
292
|
+
# the result type of any inexact (real or complex floating) arguments
|
293
|
+
# and the default floating point type.
|
294
|
+
if (is_torch(xp) and not(isinstance(x, str) or isinstance(y, str))
|
295
|
+
and np.isscalar(x) and np.isscalar(y)):
|
296
|
+
pytest.skip("See 3/27/2024 comment at data-apis/array-api-compat#277")
|
297
|
+
|
298
|
+
x = convert_type(x, xp)
|
299
|
+
y = convert_type(y, xp)
|
300
|
+
x_ref = xp.asarray(x) if isinstance(x, list) else x
|
301
|
+
y_ref = xp.asarray(y) if isinstance(y, list) else y
|
302
|
+
|
303
|
+
expected_error = None
|
304
|
+
try:
|
305
|
+
dtype_ref = xp.result_type(x_ref, y_ref, 1.0)
|
306
|
+
except TypeError:
|
307
|
+
args = []
|
308
|
+
if is_inexact(x_ref, xp):
|
309
|
+
args.append(x_ref)
|
310
|
+
if is_inexact(y_ref, xp):
|
311
|
+
args.append(y_ref)
|
312
|
+
dtype_ref = xp.result_type(*args, xp.asarray(1.0))
|
313
|
+
except Exception as e:
|
314
|
+
expected_error = (type(e), str(e))
|
315
|
+
|
316
|
+
if expected_error is not None:
|
317
|
+
with pytest.raises(expected_error[0], match=expected_error[1]):
|
318
|
+
xp_result_type(x, y, xp=xp)
|
319
|
+
return
|
320
|
+
|
321
|
+
dtype_res = xp_result_type(x, y, force_floating=True, xp=xp)
|
322
|
+
assert dtype_res == dtype_ref
|
scipy/_lib/tests/test_bunch.py
CHANGED
@@ -127,6 +127,13 @@ class TestMakeTupleBunch:
|
|
127
127
|
assert_equal(Foo.__module__, m)
|
128
128
|
assert_equal(foo.__module__, m)
|
129
129
|
|
130
|
+
def test_passes_polars_checks(self):
|
131
|
+
# gh-22450
|
132
|
+
Square = _make_tuple_bunch('Square', ['width', 'height'])
|
133
|
+
assert hasattr(Square, '_replace')
|
134
|
+
assert hasattr(Square, '_field_defaults')
|
135
|
+
|
136
|
+
|
130
137
|
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
131
138
|
# Argument validation
|
132
139
|
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
@@ -9,12 +9,6 @@ from scipy._lib import _ccallback_c as _test_ccallback_cython
|
|
9
9
|
from scipy._lib import _test_ccallback
|
10
10
|
from scipy._lib._ccallback import LowLevelCallable
|
11
11
|
|
12
|
-
try:
|
13
|
-
import cffi
|
14
|
-
HAVE_CFFI = True
|
15
|
-
except ImportError:
|
16
|
-
HAVE_CFFI = False
|
17
|
-
|
18
12
|
|
19
13
|
ERROR_VALUE = 2.0
|
20
14
|
|
@@ -29,8 +23,7 @@ def callback_python(a, user_data=None):
|
|
29
23
|
return a + user_data
|
30
24
|
|
31
25
|
def _get_cffi_func(base, signature):
|
32
|
-
|
33
|
-
pytest.skip("cffi not installed")
|
26
|
+
cffi = pytest.importorskip("cffi")
|
34
27
|
|
35
28
|
# Get function address
|
36
29
|
voidp = ctypes.cast(base, ctypes.c_void_p)
|
@@ -48,8 +41,7 @@ def _get_ctypes_data():
|
|
48
41
|
|
49
42
|
|
50
43
|
def _get_cffi_data():
|
51
|
-
|
52
|
-
pytest.skip("cffi not installed")
|
44
|
+
cffi = pytest.importorskip("cffi")
|
53
45
|
ffi = cffi.FFI()
|
54
46
|
return ffi.new('double *', 2.0)
|
55
47
|
|
@@ -357,6 +357,7 @@ def test_api_importable():
|
|
357
357
|
('scipy.integrate.odepack', None),
|
358
358
|
('scipy.integrate.quadpack', None),
|
359
359
|
('scipy.integrate.vode', None),
|
360
|
+
('scipy.interpolate.dfitpack', None),
|
360
361
|
('scipy.interpolate.fitpack', None),
|
361
362
|
('scipy.interpolate.fitpack2', None),
|
362
363
|
('scipy.interpolate.interpolate', None),
|
@@ -412,9 +413,21 @@ def test_api_importable():
|
|
412
413
|
('scipy.signal.ltisys', None),
|
413
414
|
('scipy.signal.signaltools', None),
|
414
415
|
('scipy.signal.spectral', None),
|
416
|
+
('scipy.signal.spline', None),
|
415
417
|
('scipy.signal.waveforms', None),
|
416
418
|
('scipy.signal.wavelets', None),
|
417
419
|
('scipy.signal.windows.windows', 'windows'),
|
420
|
+
('scipy.sparse.base', None),
|
421
|
+
('scipy.sparse.bsr', None),
|
422
|
+
('scipy.sparse.compressed', None),
|
423
|
+
('scipy.sparse.construct', None),
|
424
|
+
('scipy.sparse.coo', None),
|
425
|
+
('scipy.sparse.csc', None),
|
426
|
+
('scipy.sparse.csr', None),
|
427
|
+
('scipy.sparse.data', None),
|
428
|
+
('scipy.sparse.dia', None),
|
429
|
+
('scipy.sparse.dok', None),
|
430
|
+
('scipy.sparse.extract', None),
|
418
431
|
('scipy.sparse.lil', None),
|
419
432
|
('scipy.sparse.linalg.dsolve', 'linalg'),
|
420
433
|
('scipy.sparse.linalg.eigen', 'linalg'),
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|