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
@@ -1,27 +1,16 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
from functools import wraps as _wraps
|
3
|
+
from functools import reduce as _reduce, wraps as _wraps
|
4
4
|
from builtins import all as _builtin_all, any as _builtin_any
|
5
|
-
|
6
|
-
from ..common._aliases import (matrix_transpose as _aliases_matrix_transpose,
|
7
|
-
vecdot as _aliases_vecdot,
|
8
|
-
clip as _aliases_clip,
|
9
|
-
unstack as _aliases_unstack,
|
10
|
-
cumulative_sum as _aliases_cumulative_sum,
|
11
|
-
)
|
12
|
-
from .._internal import get_xp
|
13
|
-
|
14
|
-
from ._info import __array_namespace_info__
|
5
|
+
from typing import Any, List, Optional, Sequence, Tuple, Union, Literal
|
15
6
|
|
16
7
|
import torch
|
17
8
|
|
18
|
-
from
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
array = torch.Tensor
|
9
|
+
from .._internal import get_xp
|
10
|
+
from ..common import _aliases
|
11
|
+
from ..common._typing import NestedSequence, SupportsBufferProtocol
|
12
|
+
from ._info import __array_namespace_info__
|
13
|
+
from ._typing import Array, Device, DType
|
25
14
|
|
26
15
|
_int_dtypes = {
|
27
16
|
torch.uint8,
|
@@ -30,6 +19,12 @@ _int_dtypes = {
|
|
30
19
|
torch.int32,
|
31
20
|
torch.int64,
|
32
21
|
}
|
22
|
+
try:
|
23
|
+
# torch >=2.3
|
24
|
+
_int_dtypes |= {torch.uint16, torch.uint32, torch.uint64}
|
25
|
+
except AttributeError:
|
26
|
+
pass
|
27
|
+
|
33
28
|
|
34
29
|
_array_api_dtypes = {
|
35
30
|
torch.bool,
|
@@ -40,47 +35,23 @@ _array_api_dtypes = {
|
|
40
35
|
torch.complex128,
|
41
36
|
}
|
42
37
|
|
43
|
-
_promotion_table
|
44
|
-
# bool
|
45
|
-
(torch.bool, torch.bool): torch.bool,
|
38
|
+
_promotion_table = {
|
46
39
|
# ints
|
47
|
-
(torch.int8, torch.int8): torch.int8,
|
48
40
|
(torch.int8, torch.int16): torch.int16,
|
49
41
|
(torch.int8, torch.int32): torch.int32,
|
50
42
|
(torch.int8, torch.int64): torch.int64,
|
51
|
-
(torch.int16, torch.int8): torch.int16,
|
52
|
-
(torch.int16, torch.int16): torch.int16,
|
53
43
|
(torch.int16, torch.int32): torch.int32,
|
54
44
|
(torch.int16, torch.int64): torch.int64,
|
55
|
-
(torch.int32, torch.int8): torch.int32,
|
56
|
-
(torch.int32, torch.int16): torch.int32,
|
57
|
-
(torch.int32, torch.int32): torch.int32,
|
58
45
|
(torch.int32, torch.int64): torch.int64,
|
59
|
-
(torch.int64, torch.int8): torch.int64,
|
60
|
-
(torch.int64, torch.int16): torch.int64,
|
61
|
-
(torch.int64, torch.int32): torch.int64,
|
62
|
-
(torch.int64, torch.int64): torch.int64,
|
63
|
-
# uints
|
64
|
-
(torch.uint8, torch.uint8): torch.uint8,
|
65
46
|
# ints and uints (mixed sign)
|
66
|
-
(torch.int8, torch.uint8): torch.int16,
|
67
|
-
(torch.int16, torch.uint8): torch.int16,
|
68
|
-
(torch.int32, torch.uint8): torch.int32,
|
69
|
-
(torch.int64, torch.uint8): torch.int64,
|
70
47
|
(torch.uint8, torch.int8): torch.int16,
|
71
48
|
(torch.uint8, torch.int16): torch.int16,
|
72
49
|
(torch.uint8, torch.int32): torch.int32,
|
73
50
|
(torch.uint8, torch.int64): torch.int64,
|
74
51
|
# floats
|
75
|
-
(torch.float32, torch.float32): torch.float32,
|
76
52
|
(torch.float32, torch.float64): torch.float64,
|
77
|
-
(torch.float64, torch.float32): torch.float64,
|
78
|
-
(torch.float64, torch.float64): torch.float64,
|
79
53
|
# complexes
|
80
|
-
(torch.complex64, torch.complex64): torch.complex64,
|
81
54
|
(torch.complex64, torch.complex128): torch.complex128,
|
82
|
-
(torch.complex128, torch.complex64): torch.complex128,
|
83
|
-
(torch.complex128, torch.complex128): torch.complex128,
|
84
55
|
# Mixed float and complex
|
85
56
|
(torch.float32, torch.complex64): torch.complex64,
|
86
57
|
(torch.float32, torch.complex128): torch.complex128,
|
@@ -88,6 +59,9 @@ _promotion_table = {
|
|
88
59
|
(torch.float64, torch.complex128): torch.complex128,
|
89
60
|
}
|
90
61
|
|
62
|
+
_promotion_table.update({(b, a): c for (a, b), c in _promotion_table.items()})
|
63
|
+
_promotion_table.update({(a, a): a for a in _array_api_dtypes})
|
64
|
+
|
91
65
|
|
92
66
|
def _two_arg(f):
|
93
67
|
@_wraps(f)
|
@@ -118,23 +92,55 @@ def _fix_promotion(x1, x2, only_scalar=True):
|
|
118
92
|
x1 = x1.to(dtype)
|
119
93
|
return x1, x2
|
120
94
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
95
|
+
|
96
|
+
_py_scalars = (bool, int, float, complex)
|
97
|
+
|
98
|
+
|
99
|
+
def result_type(
|
100
|
+
*arrays_and_dtypes: Array | DType | bool | int | float | complex
|
101
|
+
) -> DType:
|
102
|
+
num = len(arrays_and_dtypes)
|
103
|
+
|
104
|
+
if num == 0:
|
105
|
+
raise ValueError("At least one array or dtype must be provided")
|
106
|
+
|
107
|
+
elif num == 1:
|
125
108
|
x = arrays_and_dtypes[0]
|
126
109
|
if isinstance(x, torch.dtype):
|
127
110
|
return x
|
128
111
|
return x.dtype
|
129
|
-
if len(arrays_and_dtypes) > 2:
|
130
|
-
return result_type(arrays_and_dtypes[0], result_type(*arrays_and_dtypes[1:]))
|
131
112
|
|
132
|
-
|
133
|
-
|
134
|
-
|
113
|
+
if num == 2:
|
114
|
+
x, y = arrays_and_dtypes
|
115
|
+
return _result_type(x, y)
|
135
116
|
|
136
|
-
|
137
|
-
|
117
|
+
else:
|
118
|
+
# sort scalars so that they are treated last
|
119
|
+
scalars, others = [], []
|
120
|
+
for x in arrays_and_dtypes:
|
121
|
+
if isinstance(x, _py_scalars):
|
122
|
+
scalars.append(x)
|
123
|
+
else:
|
124
|
+
others.append(x)
|
125
|
+
if not others:
|
126
|
+
raise ValueError("At least one array or dtype must be provided")
|
127
|
+
|
128
|
+
# combine left-to-right
|
129
|
+
return _reduce(_result_type, others + scalars)
|
130
|
+
|
131
|
+
|
132
|
+
def _result_type(
|
133
|
+
x: Array | DType | bool | int | float | complex,
|
134
|
+
y: Array | DType | bool | int | float | complex,
|
135
|
+
) -> DType:
|
136
|
+
if not (isinstance(x, _py_scalars) or isinstance(y, _py_scalars)):
|
137
|
+
xdt = x if isinstance(x, torch.dtype) else x.dtype
|
138
|
+
ydt = y if isinstance(y, torch.dtype) else y.dtype
|
139
|
+
|
140
|
+
try:
|
141
|
+
return _promotion_table[xdt, ydt]
|
142
|
+
except KeyError:
|
143
|
+
pass
|
138
144
|
|
139
145
|
# This doesn't result_type(dtype, dtype) for non-array API dtypes
|
140
146
|
# because torch.result_type only accepts tensors. This does however, allow
|
@@ -143,7 +149,8 @@ def result_type(*arrays_and_dtypes: Union[array, Dtype]) -> Dtype:
|
|
143
149
|
y = torch.tensor([], dtype=y) if isinstance(y, torch.dtype) else y
|
144
150
|
return torch.result_type(x, y)
|
145
151
|
|
146
|
-
|
152
|
+
|
153
|
+
def can_cast(from_: Union[DType, Array], to: DType, /) -> bool:
|
147
154
|
if not isinstance(from_, torch.dtype):
|
148
155
|
from_ = from_.dtype
|
149
156
|
return torch.can_cast(from_, to)
|
@@ -185,29 +192,55 @@ pow = _two_arg(torch.pow)
|
|
185
192
|
remainder = _two_arg(torch.remainder)
|
186
193
|
subtract = _two_arg(torch.subtract)
|
187
194
|
|
195
|
+
|
196
|
+
def asarray(
|
197
|
+
obj: (
|
198
|
+
Array
|
199
|
+
| bool | int | float | complex
|
200
|
+
| NestedSequence[bool | int | float | complex]
|
201
|
+
| SupportsBufferProtocol
|
202
|
+
),
|
203
|
+
/,
|
204
|
+
*,
|
205
|
+
dtype: DType | None = None,
|
206
|
+
device: Device | None = None,
|
207
|
+
copy: bool | None = None,
|
208
|
+
**kwargs: Any,
|
209
|
+
) -> Array:
|
210
|
+
# torch.asarray does not respect input->output device propagation
|
211
|
+
# https://github.com/pytorch/pytorch/issues/150199
|
212
|
+
if device is None and isinstance(obj, torch.Tensor):
|
213
|
+
device = obj.device
|
214
|
+
return torch.asarray(obj, dtype=dtype, device=device, copy=copy, **kwargs)
|
215
|
+
|
216
|
+
|
188
217
|
# These wrappers are mostly based on the fact that pytorch uses 'dim' instead
|
189
218
|
# of 'axis'.
|
190
219
|
|
191
220
|
# torch.min and torch.max return a tuple and don't support multiple axes https://github.com/pytorch/pytorch/issues/58745
|
192
|
-
def max(x:
|
221
|
+
def max(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False) -> Array:
|
193
222
|
# https://github.com/pytorch/pytorch/issues/29137
|
194
223
|
if axis == ():
|
195
224
|
return torch.clone(x)
|
196
225
|
return torch.amax(x, axis, keepdims=keepdims)
|
197
226
|
|
198
|
-
def min(x:
|
227
|
+
def min(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False) -> Array:
|
199
228
|
# https://github.com/pytorch/pytorch/issues/29137
|
200
229
|
if axis == ():
|
201
230
|
return torch.clone(x)
|
202
231
|
return torch.amin(x, axis, keepdims=keepdims)
|
203
232
|
|
204
|
-
clip = get_xp(torch)(
|
205
|
-
unstack = get_xp(torch)(
|
206
|
-
cumulative_sum = get_xp(torch)(
|
233
|
+
clip = get_xp(torch)(_aliases.clip)
|
234
|
+
unstack = get_xp(torch)(_aliases.unstack)
|
235
|
+
cumulative_sum = get_xp(torch)(_aliases.cumulative_sum)
|
236
|
+
cumulative_prod = get_xp(torch)(_aliases.cumulative_prod)
|
237
|
+
finfo = get_xp(torch)(_aliases.finfo)
|
238
|
+
iinfo = get_xp(torch)(_aliases.iinfo)
|
239
|
+
|
207
240
|
|
208
241
|
# torch.sort also returns a tuple
|
209
242
|
# https://github.com/pytorch/pytorch/issues/70921
|
210
|
-
def sort(x:
|
243
|
+
def sort(x: Array, /, *, axis: int = -1, descending: bool = False, stable: bool = True, **kwargs) -> Array:
|
211
244
|
return torch.sort(x, dim=axis, descending=descending, stable=stable, **kwargs).values
|
212
245
|
|
213
246
|
def _normalize_axes(axis, ndim):
|
@@ -252,28 +285,35 @@ def _reduce_multiple_axes(f, x, axis, keepdims=False, **kwargs):
|
|
252
285
|
out = torch.unsqueeze(out, a)
|
253
286
|
return out
|
254
287
|
|
255
|
-
|
288
|
+
|
289
|
+
def _sum_prod_no_axis(x: Array, dtype: DType | None) -> Array:
|
290
|
+
"""
|
291
|
+
Implements `sum(..., axis=())` and `prod(..., axis=())`.
|
292
|
+
|
293
|
+
Works around https://github.com/pytorch/pytorch/issues/29137
|
294
|
+
"""
|
295
|
+
if dtype is not None:
|
296
|
+
return x.clone() if dtype == x.dtype else x.to(dtype)
|
297
|
+
|
298
|
+
# We can't upcast uint8 according to the spec because there is no
|
299
|
+
# torch.uint64, so at least upcast to int64 which is what prod does
|
300
|
+
# when axis=None.
|
301
|
+
if x.dtype in (torch.uint8, torch.int8, torch.int16, torch.int32):
|
302
|
+
return x.to(torch.int64)
|
303
|
+
|
304
|
+
return x.clone()
|
305
|
+
|
306
|
+
|
307
|
+
def prod(x: Array,
|
256
308
|
/,
|
257
309
|
*,
|
258
310
|
axis: Optional[Union[int, Tuple[int, ...]]] = None,
|
259
|
-
dtype: Optional[
|
311
|
+
dtype: Optional[DType] = None,
|
260
312
|
keepdims: bool = False,
|
261
|
-
**kwargs) ->
|
262
|
-
x = torch.asarray(x)
|
263
|
-
ndim = x.ndim
|
313
|
+
**kwargs) -> Array:
|
264
314
|
|
265
|
-
# https://github.com/pytorch/pytorch/issues/29137. Separate from the logic
|
266
|
-
# below because it still needs to upcast.
|
267
315
|
if axis == ():
|
268
|
-
|
269
|
-
# We can't upcast uint8 according to the spec because there is no
|
270
|
-
# torch.uint64, so at least upcast to int64 which is what sum does
|
271
|
-
# when axis=None.
|
272
|
-
if x.dtype in [torch.int8, torch.int16, torch.int32, torch.uint8]:
|
273
|
-
return x.to(torch.int64)
|
274
|
-
return x.clone()
|
275
|
-
return x.to(dtype)
|
276
|
-
|
316
|
+
return _sum_prod_no_axis(x, dtype)
|
277
317
|
# torch.prod doesn't support multiple axes
|
278
318
|
# (https://github.com/pytorch/pytorch/issues/56586).
|
279
319
|
if isinstance(axis, tuple):
|
@@ -282,51 +322,38 @@ def prod(x: array,
|
|
282
322
|
# torch doesn't support keepdims with axis=None
|
283
323
|
# (https://github.com/pytorch/pytorch/issues/71209)
|
284
324
|
res = torch.prod(x, dtype=dtype, **kwargs)
|
285
|
-
res = _axis_none_keepdims(res, ndim, keepdims)
|
325
|
+
res = _axis_none_keepdims(res, x.ndim, keepdims)
|
286
326
|
return res
|
287
327
|
|
288
328
|
return torch.prod(x, axis, dtype=dtype, keepdims=keepdims, **kwargs)
|
289
329
|
|
290
330
|
|
291
|
-
def sum(x:
|
331
|
+
def sum(x: Array,
|
292
332
|
/,
|
293
333
|
*,
|
294
334
|
axis: Optional[Union[int, Tuple[int, ...]]] = None,
|
295
|
-
dtype: Optional[
|
335
|
+
dtype: Optional[DType] = None,
|
296
336
|
keepdims: bool = False,
|
297
|
-
**kwargs) ->
|
298
|
-
x = torch.asarray(x)
|
299
|
-
ndim = x.ndim
|
337
|
+
**kwargs) -> Array:
|
300
338
|
|
301
|
-
# https://github.com/pytorch/pytorch/issues/29137.
|
302
|
-
# Make sure it upcasts.
|
303
339
|
if axis == ():
|
304
|
-
|
305
|
-
# We can't upcast uint8 according to the spec because there is no
|
306
|
-
# torch.uint64, so at least upcast to int64 which is what sum does
|
307
|
-
# when axis=None.
|
308
|
-
if x.dtype in [torch.int8, torch.int16, torch.int32, torch.uint8]:
|
309
|
-
return x.to(torch.int64)
|
310
|
-
return x.clone()
|
311
|
-
return x.to(dtype)
|
312
|
-
|
340
|
+
return _sum_prod_no_axis(x, dtype)
|
313
341
|
if axis is None:
|
314
342
|
# torch doesn't support keepdims with axis=None
|
315
343
|
# (https://github.com/pytorch/pytorch/issues/71209)
|
316
344
|
res = torch.sum(x, dtype=dtype, **kwargs)
|
317
|
-
res = _axis_none_keepdims(res, ndim, keepdims)
|
345
|
+
res = _axis_none_keepdims(res, x.ndim, keepdims)
|
318
346
|
return res
|
319
347
|
|
320
348
|
return torch.sum(x, axis, dtype=dtype, keepdims=keepdims, **kwargs)
|
321
349
|
|
322
|
-
def any(x:
|
350
|
+
def any(x: Array,
|
323
351
|
/,
|
324
352
|
*,
|
325
353
|
axis: Optional[Union[int, Tuple[int, ...]]] = None,
|
326
354
|
keepdims: bool = False,
|
327
|
-
**kwargs) ->
|
328
|
-
|
329
|
-
ndim = x.ndim
|
355
|
+
**kwargs) -> Array:
|
356
|
+
|
330
357
|
if axis == ():
|
331
358
|
return x.to(torch.bool)
|
332
359
|
# torch.any doesn't support multiple axes
|
@@ -338,20 +365,19 @@ def any(x: array,
|
|
338
365
|
# torch doesn't support keepdims with axis=None
|
339
366
|
# (https://github.com/pytorch/pytorch/issues/71209)
|
340
367
|
res = torch.any(x, **kwargs)
|
341
|
-
res = _axis_none_keepdims(res, ndim, keepdims)
|
368
|
+
res = _axis_none_keepdims(res, x.ndim, keepdims)
|
342
369
|
return res.to(torch.bool)
|
343
370
|
|
344
371
|
# torch.any doesn't return bool for uint8
|
345
372
|
return torch.any(x, axis, keepdims=keepdims).to(torch.bool)
|
346
373
|
|
347
|
-
def all(x:
|
374
|
+
def all(x: Array,
|
348
375
|
/,
|
349
376
|
*,
|
350
377
|
axis: Optional[Union[int, Tuple[int, ...]]] = None,
|
351
378
|
keepdims: bool = False,
|
352
|
-
**kwargs) ->
|
353
|
-
|
354
|
-
ndim = x.ndim
|
379
|
+
**kwargs) -> Array:
|
380
|
+
|
355
381
|
if axis == ():
|
356
382
|
return x.to(torch.bool)
|
357
383
|
# torch.all doesn't support multiple axes
|
@@ -363,18 +389,18 @@ def all(x: array,
|
|
363
389
|
# torch doesn't support keepdims with axis=None
|
364
390
|
# (https://github.com/pytorch/pytorch/issues/71209)
|
365
391
|
res = torch.all(x, **kwargs)
|
366
|
-
res = _axis_none_keepdims(res, ndim, keepdims)
|
392
|
+
res = _axis_none_keepdims(res, x.ndim, keepdims)
|
367
393
|
return res.to(torch.bool)
|
368
394
|
|
369
395
|
# torch.all doesn't return bool for uint8
|
370
396
|
return torch.all(x, axis, keepdims=keepdims).to(torch.bool)
|
371
397
|
|
372
|
-
def mean(x:
|
398
|
+
def mean(x: Array,
|
373
399
|
/,
|
374
400
|
*,
|
375
401
|
axis: Optional[Union[int, Tuple[int, ...]]] = None,
|
376
402
|
keepdims: bool = False,
|
377
|
-
**kwargs) ->
|
403
|
+
**kwargs) -> Array:
|
378
404
|
# https://github.com/pytorch/pytorch/issues/29137
|
379
405
|
if axis == ():
|
380
406
|
return torch.clone(x)
|
@@ -386,13 +412,13 @@ def mean(x: array,
|
|
386
412
|
return res
|
387
413
|
return torch.mean(x, axis, keepdims=keepdims, **kwargs)
|
388
414
|
|
389
|
-
def std(x:
|
415
|
+
def std(x: Array,
|
390
416
|
/,
|
391
417
|
*,
|
392
418
|
axis: Optional[Union[int, Tuple[int, ...]]] = None,
|
393
419
|
correction: Union[int, float] = 0.0,
|
394
420
|
keepdims: bool = False,
|
395
|
-
**kwargs) ->
|
421
|
+
**kwargs) -> Array:
|
396
422
|
# Note, float correction is not supported
|
397
423
|
# https://github.com/pytorch/pytorch/issues/61492. We don't try to
|
398
424
|
# implement it here for now.
|
@@ -417,13 +443,13 @@ def std(x: array,
|
|
417
443
|
return res
|
418
444
|
return torch.std(x, axis, correction=_correction, keepdims=keepdims, **kwargs)
|
419
445
|
|
420
|
-
def var(x:
|
446
|
+
def var(x: Array,
|
421
447
|
/,
|
422
448
|
*,
|
423
449
|
axis: Optional[Union[int, Tuple[int, ...]]] = None,
|
424
450
|
correction: Union[int, float] = 0.0,
|
425
451
|
keepdims: bool = False,
|
426
|
-
**kwargs) ->
|
452
|
+
**kwargs) -> Array:
|
427
453
|
# Note, float correction is not supported
|
428
454
|
# https://github.com/pytorch/pytorch/issues/61492. We don't try to
|
429
455
|
# implement it here for now.
|
@@ -446,11 +472,11 @@ def var(x: array,
|
|
446
472
|
|
447
473
|
# torch.concat doesn't support dim=None
|
448
474
|
# https://github.com/pytorch/pytorch/issues/70925
|
449
|
-
def concat(arrays: Union[Tuple[
|
475
|
+
def concat(arrays: Union[Tuple[Array, ...], List[Array]],
|
450
476
|
/,
|
451
477
|
*,
|
452
478
|
axis: Optional[int] = 0,
|
453
|
-
**kwargs) ->
|
479
|
+
**kwargs) -> Array:
|
454
480
|
if axis is None:
|
455
481
|
arrays = tuple(ar.flatten() for ar in arrays)
|
456
482
|
axis = 0
|
@@ -459,7 +485,7 @@ def concat(arrays: Union[Tuple[array, ...], List[array]],
|
|
459
485
|
# torch.squeeze only accepts int dim and doesn't require it
|
460
486
|
# https://github.com/pytorch/pytorch/issues/70924. Support for tuple dim was
|
461
487
|
# added at https://github.com/pytorch/pytorch/pull/89017.
|
462
|
-
def squeeze(x:
|
488
|
+
def squeeze(x: Array, /, axis: Union[int, Tuple[int, ...]]) -> Array:
|
463
489
|
if isinstance(axis, int):
|
464
490
|
axis = (axis,)
|
465
491
|
for a in axis:
|
@@ -473,41 +499,88 @@ def squeeze(x: array, /, axis: Union[int, Tuple[int, ...]]) -> array:
|
|
473
499
|
return x
|
474
500
|
|
475
501
|
# torch.broadcast_to uses size instead of shape
|
476
|
-
def broadcast_to(x:
|
502
|
+
def broadcast_to(x: Array, /, shape: Tuple[int, ...], **kwargs) -> Array:
|
477
503
|
return torch.broadcast_to(x, shape, **kwargs)
|
478
504
|
|
479
505
|
# torch.permute uses dims instead of axes
|
480
|
-
def permute_dims(x:
|
506
|
+
def permute_dims(x: Array, /, axes: Tuple[int, ...]) -> Array:
|
481
507
|
return torch.permute(x, axes)
|
482
508
|
|
483
509
|
# The axis parameter doesn't work for flip() and roll()
|
484
510
|
# https://github.com/pytorch/pytorch/issues/71210. Also torch.flip() doesn't
|
485
511
|
# accept axis=None
|
486
|
-
def flip(x:
|
512
|
+
def flip(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, **kwargs) -> Array:
|
487
513
|
if axis is None:
|
488
514
|
axis = tuple(range(x.ndim))
|
489
515
|
# torch.flip doesn't accept dim as an int but the method does
|
490
516
|
# https://github.com/pytorch/pytorch/issues/18095
|
491
517
|
return x.flip(axis, **kwargs)
|
492
518
|
|
493
|
-
def roll(x:
|
519
|
+
def roll(x: Array, /, shift: Union[int, Tuple[int, ...]], *, axis: Optional[Union[int, Tuple[int, ...]]] = None, **kwargs) -> Array:
|
494
520
|
return torch.roll(x, shift, axis, **kwargs)
|
495
521
|
|
496
|
-
def nonzero(x:
|
522
|
+
def nonzero(x: Array, /, **kwargs) -> Tuple[Array, ...]:
|
497
523
|
if x.ndim == 0:
|
498
524
|
raise ValueError("nonzero() does not support zero-dimensional arrays")
|
499
525
|
return torch.nonzero(x, as_tuple=True, **kwargs)
|
500
526
|
|
501
|
-
|
527
|
+
|
528
|
+
# torch uses `dim` instead of `axis`
|
529
|
+
def diff(
|
530
|
+
x: Array,
|
531
|
+
/,
|
532
|
+
*,
|
533
|
+
axis: int = -1,
|
534
|
+
n: int = 1,
|
535
|
+
prepend: Optional[Array] = None,
|
536
|
+
append: Optional[Array] = None,
|
537
|
+
) -> Array:
|
538
|
+
return torch.diff(x, dim=axis, n=n, prepend=prepend, append=append)
|
539
|
+
|
540
|
+
|
541
|
+
# torch uses `dim` instead of `axis`, does not have keepdims
|
542
|
+
def count_nonzero(
|
543
|
+
x: Array,
|
544
|
+
/,
|
545
|
+
*,
|
546
|
+
axis: Optional[Union[int, Tuple[int, ...]]] = None,
|
547
|
+
keepdims: bool = False,
|
548
|
+
) -> Array:
|
549
|
+
result = torch.count_nonzero(x, dim=axis)
|
550
|
+
if keepdims:
|
551
|
+
if isinstance(axis, int):
|
552
|
+
return result.unsqueeze(axis)
|
553
|
+
elif isinstance(axis, tuple):
|
554
|
+
n_axis = [x.ndim + ax if ax < 0 else ax for ax in axis]
|
555
|
+
sh = [1 if i in n_axis else x.shape[i] for i in range(x.ndim)]
|
556
|
+
return torch.reshape(result, sh)
|
557
|
+
return _axis_none_keepdims(result, x.ndim, keepdims)
|
558
|
+
else:
|
559
|
+
return result
|
560
|
+
|
561
|
+
|
562
|
+
# "repeat" is torch.repeat_interleave; also the dim argument
|
563
|
+
def repeat(x: Array, repeats: int | Array, /, *, axis: int | None = None) -> Array:
|
564
|
+
return torch.repeat_interleave(x, repeats, axis)
|
565
|
+
|
566
|
+
|
567
|
+
def where(
|
568
|
+
condition: Array,
|
569
|
+
x1: Array | bool | int | float | complex,
|
570
|
+
x2: Array | bool | int | float | complex,
|
571
|
+
/,
|
572
|
+
) -> Array:
|
502
573
|
x1, x2 = _fix_promotion(x1, x2)
|
503
574
|
return torch.where(condition, x1, x2)
|
504
575
|
|
576
|
+
|
505
577
|
# torch.reshape doesn't have the copy keyword
|
506
|
-
def reshape(x:
|
578
|
+
def reshape(x: Array,
|
507
579
|
/,
|
508
580
|
shape: Tuple[int, ...],
|
581
|
+
*,
|
509
582
|
copy: Optional[bool] = None,
|
510
|
-
**kwargs) ->
|
583
|
+
**kwargs) -> Array:
|
511
584
|
if copy is not None:
|
512
585
|
raise NotImplementedError("torch.reshape doesn't yet support the copy keyword")
|
513
586
|
return torch.reshape(x, shape, **kwargs)
|
@@ -521,9 +594,9 @@ def arange(start: Union[int, float],
|
|
521
594
|
stop: Optional[Union[int, float]] = None,
|
522
595
|
step: Union[int, float] = 1,
|
523
596
|
*,
|
524
|
-
dtype: Optional[
|
597
|
+
dtype: Optional[DType] = None,
|
525
598
|
device: Optional[Device] = None,
|
526
|
-
**kwargs) ->
|
599
|
+
**kwargs) -> Array:
|
527
600
|
if stop is None:
|
528
601
|
start, stop = 0, start
|
529
602
|
if step > 0 and stop <= start or step < 0 and stop >= start:
|
@@ -542,9 +615,9 @@ def eye(n_rows: int,
|
|
542
615
|
/,
|
543
616
|
*,
|
544
617
|
k: int = 0,
|
545
|
-
dtype: Optional[
|
618
|
+
dtype: Optional[DType] = None,
|
546
619
|
device: Optional[Device] = None,
|
547
|
-
**kwargs) ->
|
620
|
+
**kwargs) -> Array:
|
548
621
|
if n_cols is None:
|
549
622
|
n_cols = n_rows
|
550
623
|
z = torch.zeros(n_rows, n_cols, dtype=dtype, device=device, **kwargs)
|
@@ -558,10 +631,10 @@ def linspace(start: Union[int, float],
|
|
558
631
|
/,
|
559
632
|
num: int,
|
560
633
|
*,
|
561
|
-
dtype: Optional[
|
634
|
+
dtype: Optional[DType] = None,
|
562
635
|
device: Optional[Device] = None,
|
563
636
|
endpoint: bool = True,
|
564
|
-
**kwargs) ->
|
637
|
+
**kwargs) -> Array:
|
565
638
|
if not endpoint:
|
566
639
|
return torch.linspace(start, stop, num+1, dtype=dtype, device=device, **kwargs)[:-1]
|
567
640
|
return torch.linspace(start, stop, num, dtype=dtype, device=device, **kwargs)
|
@@ -569,11 +642,11 @@ def linspace(start: Union[int, float],
|
|
569
642
|
# torch.full does not accept an int size
|
570
643
|
# https://github.com/pytorch/pytorch/issues/70906
|
571
644
|
def full(shape: Union[int, Tuple[int, ...]],
|
572
|
-
fill_value:
|
645
|
+
fill_value: bool | int | float | complex,
|
573
646
|
*,
|
574
|
-
dtype: Optional[
|
647
|
+
dtype: Optional[DType] = None,
|
575
648
|
device: Optional[Device] = None,
|
576
|
-
**kwargs) ->
|
649
|
+
**kwargs) -> Array:
|
577
650
|
if isinstance(shape, int):
|
578
651
|
shape = (shape,)
|
579
652
|
|
@@ -582,41 +655,52 @@ def full(shape: Union[int, Tuple[int, ...]],
|
|
582
655
|
# ones, zeros, and empty do not accept shape as a keyword argument
|
583
656
|
def ones(shape: Union[int, Tuple[int, ...]],
|
584
657
|
*,
|
585
|
-
dtype: Optional[
|
658
|
+
dtype: Optional[DType] = None,
|
586
659
|
device: Optional[Device] = None,
|
587
|
-
**kwargs) ->
|
660
|
+
**kwargs) -> Array:
|
588
661
|
return torch.ones(shape, dtype=dtype, device=device, **kwargs)
|
589
662
|
|
590
663
|
def zeros(shape: Union[int, Tuple[int, ...]],
|
591
664
|
*,
|
592
|
-
dtype: Optional[
|
665
|
+
dtype: Optional[DType] = None,
|
593
666
|
device: Optional[Device] = None,
|
594
|
-
**kwargs) ->
|
667
|
+
**kwargs) -> Array:
|
595
668
|
return torch.zeros(shape, dtype=dtype, device=device, **kwargs)
|
596
669
|
|
597
670
|
def empty(shape: Union[int, Tuple[int, ...]],
|
598
671
|
*,
|
599
|
-
dtype: Optional[
|
672
|
+
dtype: Optional[DType] = None,
|
600
673
|
device: Optional[Device] = None,
|
601
|
-
**kwargs) ->
|
674
|
+
**kwargs) -> Array:
|
602
675
|
return torch.empty(shape, dtype=dtype, device=device, **kwargs)
|
603
676
|
|
604
677
|
# tril and triu do not call the keyword argument k
|
605
678
|
|
606
|
-
def tril(x:
|
679
|
+
def tril(x: Array, /, *, k: int = 0) -> Array:
|
607
680
|
return torch.tril(x, k)
|
608
681
|
|
609
|
-
def triu(x:
|
682
|
+
def triu(x: Array, /, *, k: int = 0) -> Array:
|
610
683
|
return torch.triu(x, k)
|
611
684
|
|
612
685
|
# Functions that aren't in torch https://github.com/pytorch/pytorch/issues/58742
|
613
|
-
def expand_dims(x:
|
686
|
+
def expand_dims(x: Array, /, *, axis: int = 0) -> Array:
|
614
687
|
return torch.unsqueeze(x, axis)
|
615
688
|
|
616
|
-
def astype(x: array, dtype: Dtype, /, *, copy: bool = True) -> array:
|
617
|
-
return x.to(dtype, copy=copy)
|
618
689
|
|
619
|
-
def
|
690
|
+
def astype(
|
691
|
+
x: Array,
|
692
|
+
dtype: DType,
|
693
|
+
/,
|
694
|
+
*,
|
695
|
+
copy: bool = True,
|
696
|
+
device: Optional[Device] = None,
|
697
|
+
) -> Array:
|
698
|
+
if device is not None:
|
699
|
+
return x.to(device, dtype=dtype, copy=copy)
|
700
|
+
return x.to(dtype=dtype, copy=copy)
|
701
|
+
|
702
|
+
|
703
|
+
def broadcast_arrays(*arrays: Array) -> List[Array]:
|
620
704
|
shape = torch.broadcast_shapes(*[a.shape for a in arrays])
|
621
705
|
return [torch.broadcast_to(a, shape) for a in arrays]
|
622
706
|
|
@@ -626,7 +710,7 @@ from ..common._aliases import (UniqueAllResult, UniqueCountsResult,
|
|
626
710
|
UniqueInverseResult)
|
627
711
|
|
628
712
|
# https://github.com/pytorch/pytorch/issues/70920
|
629
|
-
def unique_all(x:
|
713
|
+
def unique_all(x: Array) -> UniqueAllResult:
|
630
714
|
# torch.unique doesn't support returning indices.
|
631
715
|
# https://github.com/pytorch/pytorch/issues/36748. The workaround
|
632
716
|
# suggested in that issue doesn't actually function correctly (it relies
|
@@ -639,7 +723,7 @@ def unique_all(x: array) -> UniqueAllResult:
|
|
639
723
|
# counts[torch.isnan(values)] = 1
|
640
724
|
# return UniqueAllResult(values, indices, inverse_indices, counts)
|
641
725
|
|
642
|
-
def unique_counts(x:
|
726
|
+
def unique_counts(x: Array) -> UniqueCountsResult:
|
643
727
|
values, counts = torch.unique(x, return_counts=True)
|
644
728
|
|
645
729
|
# torch.unique incorrectly gives a 0 count for nan values.
|
@@ -647,27 +731,34 @@ def unique_counts(x: array) -> UniqueCountsResult:
|
|
647
731
|
counts[torch.isnan(values)] = 1
|
648
732
|
return UniqueCountsResult(values, counts)
|
649
733
|
|
650
|
-
def unique_inverse(x:
|
734
|
+
def unique_inverse(x: Array) -> UniqueInverseResult:
|
651
735
|
values, inverse = torch.unique(x, return_inverse=True)
|
652
736
|
return UniqueInverseResult(values, inverse)
|
653
737
|
|
654
|
-
def unique_values(x:
|
738
|
+
def unique_values(x: Array) -> Array:
|
655
739
|
return torch.unique(x)
|
656
740
|
|
657
|
-
def matmul(x1:
|
741
|
+
def matmul(x1: Array, x2: Array, /, **kwargs) -> Array:
|
658
742
|
# torch.matmul doesn't type promote (but differently from _fix_promotion)
|
659
743
|
x1, x2 = _fix_promotion(x1, x2, only_scalar=False)
|
660
744
|
return torch.matmul(x1, x2, **kwargs)
|
661
745
|
|
662
|
-
matrix_transpose = get_xp(torch)(
|
663
|
-
_vecdot = get_xp(torch)(
|
746
|
+
matrix_transpose = get_xp(torch)(_aliases.matrix_transpose)
|
747
|
+
_vecdot = get_xp(torch)(_aliases.vecdot)
|
664
748
|
|
665
|
-
def vecdot(x1:
|
749
|
+
def vecdot(x1: Array, x2: Array, /, *, axis: int = -1) -> Array:
|
666
750
|
x1, x2 = _fix_promotion(x1, x2, only_scalar=False)
|
667
751
|
return _vecdot(x1, x2, axis=axis)
|
668
752
|
|
669
753
|
# torch.tensordot uses dims instead of axes
|
670
|
-
def tensordot(
|
754
|
+
def tensordot(
|
755
|
+
x1: Array,
|
756
|
+
x2: Array,
|
757
|
+
/,
|
758
|
+
*,
|
759
|
+
axes: Union[int, Tuple[Sequence[int], Sequence[int]]] = 2,
|
760
|
+
**kwargs,
|
761
|
+
) -> Array:
|
671
762
|
# Note: torch.tensordot fails with integer dtypes when there is only 1
|
672
763
|
# element in the axis (https://github.com/pytorch/pytorch/issues/84530).
|
673
764
|
x1, x2 = _fix_promotion(x1, x2, only_scalar=False)
|
@@ -675,7 +766,7 @@ def tensordot(x1: array, x2: array, /, *, axes: Union[int, Tuple[Sequence[int],
|
|
675
766
|
|
676
767
|
|
677
768
|
def isdtype(
|
678
|
-
dtype:
|
769
|
+
dtype: DType, kind: Union[DType, str, Tuple[Union[DType, str], ...]],
|
679
770
|
*, _tuple=True, # Disallow nested tuples
|
680
771
|
) -> bool:
|
681
772
|
"""
|
@@ -710,14 +801,19 @@ def isdtype(
|
|
710
801
|
else:
|
711
802
|
return dtype == kind
|
712
803
|
|
713
|
-
def take(x:
|
804
|
+
def take(x: Array, indices: Array, /, *, axis: Optional[int] = None, **kwargs) -> Array:
|
714
805
|
if axis is None:
|
715
806
|
if x.ndim != 1:
|
716
807
|
raise ValueError("axis must be specified when ndim > 1")
|
717
808
|
axis = 0
|
718
809
|
return torch.index_select(x, axis, indices, **kwargs)
|
719
810
|
|
720
|
-
|
811
|
+
|
812
|
+
def take_along_axis(x: Array, indices: Array, /, *, axis: int = -1) -> Array:
|
813
|
+
return torch.take_along_dim(x, indices, dim=axis)
|
814
|
+
|
815
|
+
|
816
|
+
def sign(x: Array, /) -> Array:
|
721
817
|
# torch sign() does not support complex numbers and does not propagate
|
722
818
|
# nans. See https://github.com/data-apis/array-api-compat/issues/136
|
723
819
|
if x.dtype.is_complex:
|
@@ -732,14 +828,21 @@ def sign(x: array, /) -> array:
|
|
732
828
|
return out
|
733
829
|
|
734
830
|
|
735
|
-
|
831
|
+
def meshgrid(*arrays: Array, indexing: Literal['xy', 'ij'] = 'xy') -> List[Array]:
|
832
|
+
# enforce the default of 'xy'
|
833
|
+
# TODO: is the return type a list or a tuple
|
834
|
+
return list(torch.meshgrid(*arrays, indexing='xy'))
|
835
|
+
|
836
|
+
|
837
|
+
__all__ = ['__array_namespace_info__', 'asarray', 'result_type', 'can_cast',
|
736
838
|
'permute_dims', 'bitwise_invert', 'newaxis', 'conj', 'add',
|
737
839
|
'atan2', 'bitwise_and', 'bitwise_left_shift', 'bitwise_or',
|
738
|
-
'bitwise_right_shift', 'bitwise_xor', 'copysign', '
|
840
|
+
'bitwise_right_shift', 'bitwise_xor', 'copysign', 'count_nonzero',
|
841
|
+
'diff', 'divide',
|
739
842
|
'equal', 'floor_divide', 'greater', 'greater_equal', 'hypot',
|
740
843
|
'less', 'less_equal', 'logaddexp', 'maximum', 'minimum',
|
741
844
|
'multiply', 'not_equal', 'pow', 'remainder', 'subtract', 'max',
|
742
|
-
'min', 'clip', 'unstack', 'cumulative_sum', 'sort', 'prod', 'sum',
|
845
|
+
'min', 'clip', 'unstack', 'cumulative_sum', 'cumulative_prod', 'sort', 'prod', 'sum',
|
743
846
|
'any', 'all', 'mean', 'std', 'var', 'concat', 'squeeze',
|
744
847
|
'broadcast_to', 'flip', 'roll', 'nonzero', 'where', 'reshape',
|
745
848
|
'arange', 'eye', 'linspace', 'full', 'ones', 'zeros', 'empty',
|
@@ -747,6 +850,6 @@ __all__ = ['__array_namespace_info__', 'result_type', 'can_cast',
|
|
747
850
|
'UniqueAllResult', 'UniqueCountsResult', 'UniqueInverseResult',
|
748
851
|
'unique_all', 'unique_counts', 'unique_inverse', 'unique_values',
|
749
852
|
'matmul', 'matrix_transpose', 'vecdot', 'tensordot', 'isdtype',
|
750
|
-
'take', 'sign']
|
853
|
+
'take', 'take_along_axis', 'sign', 'finfo', 'iinfo', 'repeat', 'meshgrid']
|
751
854
|
|
752
855
|
_all_ignore = ['torch', 'get_xp']
|