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
@@ -0,0 +1,9 @@
|
|
1
|
+
# DO NOT RENAME THIS FILE
|
2
|
+
# This is a hook for array_api_extra/src/array_api_extra/_lib/_compat.py
|
3
|
+
# to override functions of array_api_compat.
|
4
|
+
|
5
|
+
from .array_api_compat import * # noqa: F403
|
6
|
+
from ._array_api import array_namespace as scipy_array_namespace
|
7
|
+
|
8
|
+
# overrides array_api_compat.array_namespace inside array-api-extra
|
9
|
+
array_namespace = scipy_array_namespace # type: ignore[assignment]
|
scipy/_lib/_bunch.py
CHANGED
@@ -194,6 +194,10 @@ def __setattr__(self, key, val):
|
|
194
194
|
'_asdict': _asdict,
|
195
195
|
'_extra_fields': extra_field_names,
|
196
196
|
'__getnewargs_ex__': __getnewargs_ex__,
|
197
|
+
# _field_defaults and _replace are added to get Polars to detect
|
198
|
+
# a bunch object as a namedtuple. See gh-22450
|
199
|
+
'_field_defaults': {},
|
200
|
+
'_replace': None,
|
197
201
|
}
|
198
202
|
for index, name in enumerate(field_names):
|
199
203
|
|
Binary file
|
Binary file
|
scipy/_lib/_docscrape.py
CHANGED
@@ -703,7 +703,7 @@ class ClassDoc(NumpyDocString):
|
|
703
703
|
and not self._should_skip_member(name, self._cls)
|
704
704
|
and (
|
705
705
|
func is None
|
706
|
-
or isinstance(func,
|
706
|
+
or isinstance(func, property | cached_property)
|
707
707
|
or inspect.isdatadescriptor(func)
|
708
708
|
)
|
709
709
|
and self._is_show_member(name)
|
@@ -15,7 +15,8 @@
|
|
15
15
|
import math
|
16
16
|
import numpy as np
|
17
17
|
from ._util import _RichResult, _call_callback_maybe_halt
|
18
|
-
from ._array_api import array_namespace, xp_size
|
18
|
+
from ._array_api import array_namespace, xp_size, xp_result_type
|
19
|
+
import scipy._lib.array_api_extra as xpx
|
19
20
|
|
20
21
|
_ESIGNERR = -1
|
21
22
|
_ECONVERR = -2
|
@@ -82,9 +83,8 @@ def _initialize(func, xs, args, complex_ok=False, preserve_shape=None, xp=None):
|
|
82
83
|
# and cause failure.
|
83
84
|
# There might be benefit to combining the `xs` into a single array and
|
84
85
|
# calling `func` once on the combined array. For now, keep them separate.
|
86
|
+
xat = xp_result_type(*xs, force_floating=True, xp=xp)
|
85
87
|
xas = xp.broadcast_arrays(*xs, *args) # broadcast and rename
|
86
|
-
xat = xp.result_type(*[xa.dtype for xa in xas])
|
87
|
-
xat = xp.asarray(1.).dtype if xp.isdtype(xat, "integral") else xat
|
88
88
|
xs, args = xas[:nx], xas[nx:]
|
89
89
|
xs = [xp.asarray(x, dtype=xat) for x in xs] # use copy=False when implemented
|
90
90
|
fs = [xp.asarray(func(x, *args)) for x in xs]
|
@@ -264,7 +264,7 @@ def _loop(work, callback, shape, maxiter, func, args, dtype, pre_func_eval,
|
|
264
264
|
|
265
265
|
post_termination_check(work)
|
266
266
|
|
267
|
-
work.status[:]
|
267
|
+
work.status = xpx.at(work.status)[:].set(_ECALLBACK if cb_terminate else _ECONVERR)
|
268
268
|
return _prepare_result(work, res, res_work_pairs, active, shape,
|
269
269
|
customize_result, preserve_shape, xp)
|
270
270
|
|
@@ -290,14 +290,10 @@ def _check_termination(work, res, res_work_pairs, active, check_termination,
|
|
290
290
|
if not preserve_shape:
|
291
291
|
# compress the arrays to avoid unnecessary computation
|
292
292
|
for key, val in work.items():
|
293
|
-
#
|
294
|
-
|
295
|
-
if key == 'args':
|
293
|
+
# `continued_fraction` hacks `n`; improve if this becomes a problem
|
294
|
+
if key in {'args', 'n'}:
|
296
295
|
continue
|
297
|
-
|
298
|
-
work[key] = val[proceed]
|
299
|
-
except (IndexError, TypeError, KeyError): # not a compressible array
|
300
|
-
work[key] = val
|
296
|
+
work[key] = val[proceed] if getattr(val, 'ndim', 0) > 0 else val
|
301
297
|
work.args = [arg[proceed] for arg in work.args]
|
302
298
|
|
303
299
|
return active
|
@@ -314,28 +310,21 @@ def _update_active(work, res, res_work_pairs, active, mask, preserve_shape, xp):
|
|
314
310
|
if mask is not None:
|
315
311
|
if preserve_shape:
|
316
312
|
active_mask = xp.zeros_like(mask)
|
317
|
-
active_mask[active]
|
313
|
+
active_mask = xpx.at(active_mask)[active].set(True)
|
318
314
|
active_mask = active_mask & mask
|
319
315
|
for key, val in update_dict.items():
|
320
|
-
|
321
|
-
|
322
|
-
except (IndexError, TypeError, KeyError):
|
323
|
-
res[key][active_mask] = val
|
316
|
+
val = val[active_mask] if getattr(val, 'ndim', 0) > 0 else val
|
317
|
+
res[key] = xpx.at(res[key])[active_mask].set(val)
|
324
318
|
else:
|
325
319
|
active_mask = active[mask]
|
326
320
|
for key, val in update_dict.items():
|
327
|
-
|
328
|
-
|
329
|
-
except (IndexError, TypeError, KeyError):
|
330
|
-
res[key][active_mask] = val
|
321
|
+
val = val[mask] if getattr(val, 'ndim', 0) > 0 else val
|
322
|
+
res[key] = xpx.at(res[key])[active_mask].set(val)
|
331
323
|
else:
|
332
324
|
for key, val in update_dict.items():
|
333
|
-
if preserve_shape:
|
334
|
-
|
335
|
-
|
336
|
-
except (IndexError, TypeError, KeyError):
|
337
|
-
pass
|
338
|
-
res[key][active] = val
|
325
|
+
if preserve_shape and getattr(val, 'ndim', 0) > 0:
|
326
|
+
val = val[active]
|
327
|
+
res[key] = xpx.at(res[key])[active].set(val)
|
339
328
|
|
340
329
|
|
341
330
|
def _prepare_result(work, res, res_work_pairs, active, shape, customize_result,
|
Binary file
|
Binary file
|
scipy/_lib/_sparse.py
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
from abc import ABC
|
2
|
+
|
3
|
+
__all__ = ["SparseABC", "issparse"]
|
4
|
+
|
5
|
+
|
6
|
+
class SparseABC(ABC):
|
7
|
+
pass
|
8
|
+
|
9
|
+
|
10
|
+
def issparse(x):
|
11
|
+
"""Is `x` of a sparse array or sparse matrix type?
|
12
|
+
|
13
|
+
Parameters
|
14
|
+
----------
|
15
|
+
x
|
16
|
+
object to check for being a sparse array or sparse matrix
|
17
|
+
|
18
|
+
Returns
|
19
|
+
-------
|
20
|
+
bool
|
21
|
+
True if `x` is a sparse array or a sparse matrix, False otherwise
|
22
|
+
|
23
|
+
Notes
|
24
|
+
-----
|
25
|
+
Use `isinstance(x, sp.sparse.sparray)` to check between an array or matrix.
|
26
|
+
Use `a.format` to check the sparse format, e.g. `a.format == 'csr'`.
|
27
|
+
|
28
|
+
Examples
|
29
|
+
--------
|
30
|
+
>>> import numpy as np
|
31
|
+
>>> from scipy.sparse import csr_array, csr_matrix, issparse
|
32
|
+
>>> issparse(csr_matrix([[5]]))
|
33
|
+
True
|
34
|
+
>>> issparse(csr_array([[5]]))
|
35
|
+
True
|
36
|
+
>>> issparse(np.array([[5]]))
|
37
|
+
False
|
38
|
+
>>> issparse(5)
|
39
|
+
False
|
40
|
+
"""
|
41
|
+
return isinstance(x, SparseABC)
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
scipy/_lib/_testutils.py
CHANGED
@@ -95,8 +95,12 @@ class PytestTester:
|
|
95
95
|
|
96
96
|
pytest_args = ['--showlocals', '--tb=short']
|
97
97
|
|
98
|
-
if extra_argv:
|
99
|
-
|
98
|
+
if extra_argv is None:
|
99
|
+
extra_argv = []
|
100
|
+
pytest_args += extra_argv
|
101
|
+
if any(arg == "-m" or arg == "--markers" for arg in extra_argv):
|
102
|
+
# Likely conflict with default --mode=fast
|
103
|
+
raise ValueError("Must specify -m before --")
|
100
104
|
|
101
105
|
if verbose and int(verbose) > 1:
|
102
106
|
pytest_args += ["-" + "v"*(int(verbose)-1)]
|
Binary file
|
Binary file
|
scipy/_lib/_util.py
CHANGED
@@ -7,27 +7,18 @@ import numbers
|
|
7
7
|
from collections import namedtuple
|
8
8
|
import inspect
|
9
9
|
import math
|
10
|
-
from
|
10
|
+
from types import ModuleType
|
11
|
+
from typing import Literal, TypeAlias, TypeVar
|
11
12
|
|
12
13
|
import numpy as np
|
13
|
-
from scipy._lib._array_api import array_namespace,
|
14
|
+
from scipy._lib._array_api import (Array, array_namespace, is_lazy_array,
|
15
|
+
is_numpy, is_marray, xp_result_device,
|
16
|
+
xp_size, xp_result_type)
|
14
17
|
from scipy._lib._docscrape import FunctionDoc, Parameter
|
18
|
+
from scipy._lib._sparse import issparse
|
15
19
|
|
20
|
+
from numpy.exceptions import AxisError
|
16
21
|
|
17
|
-
AxisError: type[Exception]
|
18
|
-
ComplexWarning: type[Warning]
|
19
|
-
VisibleDeprecationWarning: type[Warning]
|
20
|
-
|
21
|
-
if np.lib.NumpyVersion(np.__version__) >= '1.25.0':
|
22
|
-
from numpy.exceptions import (
|
23
|
-
AxisError, ComplexWarning, VisibleDeprecationWarning,
|
24
|
-
DTypePromotionError
|
25
|
-
)
|
26
|
-
else:
|
27
|
-
from numpy import ( # type: ignore[attr-defined, no-redef]
|
28
|
-
AxisError, ComplexWarning, VisibleDeprecationWarning # noqa: F401
|
29
|
-
)
|
30
|
-
DTypePromotionError = TypeError # type: ignore
|
31
22
|
|
32
23
|
np_long: type
|
33
24
|
np_ulong: type
|
@@ -81,85 +72,6 @@ except ImportError:
|
|
81
72
|
pass
|
82
73
|
|
83
74
|
|
84
|
-
def _lazywhere(cond, arrays, f, fillvalue=None, f2=None):
|
85
|
-
"""Return elements chosen from two possibilities depending on a condition
|
86
|
-
|
87
|
-
Equivalent to ``f(*arrays) if cond else fillvalue`` performed elementwise.
|
88
|
-
|
89
|
-
Parameters
|
90
|
-
----------
|
91
|
-
cond : array
|
92
|
-
The condition (expressed as a boolean array).
|
93
|
-
arrays : tuple of array
|
94
|
-
Arguments to `f` (and `f2`). Must be broadcastable with `cond`.
|
95
|
-
f : callable
|
96
|
-
Where `cond` is True, output will be ``f(arr1[cond], arr2[cond], ...)``
|
97
|
-
fillvalue : object
|
98
|
-
If provided, value with which to fill output array where `cond` is
|
99
|
-
not True.
|
100
|
-
f2 : callable
|
101
|
-
If provided, output will be ``f2(arr1[cond], arr2[cond], ...)`` where
|
102
|
-
`cond` is not True.
|
103
|
-
|
104
|
-
Returns
|
105
|
-
-------
|
106
|
-
out : array
|
107
|
-
An array with elements from the output of `f` where `cond` is True
|
108
|
-
and `fillvalue` (or elements from the output of `f2`) elsewhere. The
|
109
|
-
returned array has data type determined by Type Promotion Rules
|
110
|
-
with the output of `f` and `fillvalue` (or the output of `f2`).
|
111
|
-
|
112
|
-
Notes
|
113
|
-
-----
|
114
|
-
``xp.where(cond, x, fillvalue)`` requires explicitly forming `x` even where
|
115
|
-
`cond` is False. This function evaluates ``f(arr1[cond], arr2[cond], ...)``
|
116
|
-
onle where `cond` ``is True.
|
117
|
-
|
118
|
-
Examples
|
119
|
-
--------
|
120
|
-
>>> import numpy as np
|
121
|
-
>>> a, b = np.array([1, 2, 3, 4]), np.array([5, 6, 7, 8])
|
122
|
-
>>> def f(a, b):
|
123
|
-
... return a*b
|
124
|
-
>>> _lazywhere(a > 2, (a, b), f, np.nan)
|
125
|
-
array([ nan, nan, 21., 32.])
|
126
|
-
|
127
|
-
"""
|
128
|
-
xp = array_namespace(cond, *arrays)
|
129
|
-
|
130
|
-
if (f2 is fillvalue is None) or (f2 is not None and fillvalue is not None):
|
131
|
-
raise ValueError("Exactly one of `fillvalue` or `f2` must be given.")
|
132
|
-
|
133
|
-
args = xp.broadcast_arrays(cond, *arrays)
|
134
|
-
bool_dtype = xp.asarray([True]).dtype # numpy 1.xx doesn't have `bool`
|
135
|
-
cond, arrays = xp.astype(args[0], bool_dtype, copy=False), args[1:]
|
136
|
-
|
137
|
-
temp1 = xp.asarray(f(*(arr[cond] for arr in arrays)))
|
138
|
-
|
139
|
-
if f2 is None:
|
140
|
-
# If `fillvalue` is a Python scalar and we convert to `xp.asarray`, it gets the
|
141
|
-
# default `int` or `float` type of `xp`, so `result_type` could be wrong.
|
142
|
-
# `result_type` should/will handle mixed array/Python scalars;
|
143
|
-
# remove this special logic when it does.
|
144
|
-
if type(fillvalue) in {bool, int, float, complex}:
|
145
|
-
with np.errstate(invalid='ignore'):
|
146
|
-
dtype = (temp1 * fillvalue).dtype
|
147
|
-
else:
|
148
|
-
dtype = xp.result_type(temp1.dtype, fillvalue)
|
149
|
-
out = xp.full(cond.shape, dtype=dtype,
|
150
|
-
fill_value=xp.asarray(fillvalue, dtype=dtype))
|
151
|
-
else:
|
152
|
-
ncond = ~cond
|
153
|
-
temp2 = xp.asarray(f2(*(arr[ncond] for arr in arrays)))
|
154
|
-
dtype = xp.result_type(temp1, temp2)
|
155
|
-
out = xp.empty(cond.shape, dtype=dtype)
|
156
|
-
out[ncond] = temp2
|
157
|
-
|
158
|
-
out[cond] = temp1
|
159
|
-
|
160
|
-
return out
|
161
|
-
|
162
|
-
|
163
75
|
def _lazyselect(condlist, choicelist, arrays, default=0):
|
164
76
|
"""
|
165
77
|
Mimic `np.select(condlist, choicelist)`.
|
@@ -524,8 +436,7 @@ def _asarray_validated(a, check_finite=True,
|
|
524
436
|
|
525
437
|
"""
|
526
438
|
if not sparse_ok:
|
527
|
-
|
528
|
-
if scipy.sparse.issparse(a):
|
439
|
+
if issparse(a):
|
529
440
|
msg = ('Sparse arrays/matrices are not supported by this function. '
|
530
441
|
'Perhaps one of the `scipy.sparse.linalg` functions '
|
531
442
|
'would work instead.')
|
@@ -657,6 +568,32 @@ class _FunctionWrapper:
|
|
657
568
|
return self.f(x, *self.args)
|
658
569
|
|
659
570
|
|
571
|
+
class _ScalarFunctionWrapper:
|
572
|
+
"""
|
573
|
+
Object to wrap scalar user function, allowing picklability
|
574
|
+
"""
|
575
|
+
def __init__(self, f, args=None):
|
576
|
+
self.f = f
|
577
|
+
self.args = [] if args is None else args
|
578
|
+
self.nfev = 0
|
579
|
+
|
580
|
+
def __call__(self, x):
|
581
|
+
# Send a copy because the user may overwrite it.
|
582
|
+
# The user of this class might want `x` to remain unchanged.
|
583
|
+
fx = self.f(np.copy(x), *self.args)
|
584
|
+
self.nfev += 1
|
585
|
+
|
586
|
+
# Make sure the function returns a true scalar
|
587
|
+
if not np.isscalar(fx):
|
588
|
+
try:
|
589
|
+
fx = np.asarray(fx).item()
|
590
|
+
except (TypeError, ValueError) as e:
|
591
|
+
raise ValueError(
|
592
|
+
"The user-provided objective function "
|
593
|
+
"must return a scalar value."
|
594
|
+
) from e
|
595
|
+
return fx
|
596
|
+
|
660
597
|
class MapWrapper:
|
661
598
|
"""
|
662
599
|
Parallelisation wrapper for working with map-like callables, such as
|
@@ -731,6 +668,29 @@ class MapWrapper:
|
|
731
668
|
" form f(func, iterable)") from e
|
732
669
|
|
733
670
|
|
671
|
+
def _workers_wrapper(func):
|
672
|
+
"""
|
673
|
+
Wrapper to deal with setup-cleanup of workers outside a user function via a
|
674
|
+
ContextManager. It saves having to do the setup/tear down with within that
|
675
|
+
function, which can be messy.
|
676
|
+
"""
|
677
|
+
@functools.wraps(func)
|
678
|
+
def inner(*args, **kwds):
|
679
|
+
kwargs = kwds.copy()
|
680
|
+
if 'workers' not in kwargs:
|
681
|
+
_workers = map
|
682
|
+
elif 'workers' in kwargs and kwargs['workers'] is None:
|
683
|
+
_workers = map
|
684
|
+
else:
|
685
|
+
_workers = kwargs['workers']
|
686
|
+
|
687
|
+
with MapWrapper(_workers) as mf:
|
688
|
+
kwargs['workers'] = mf
|
689
|
+
return func(*args, **kwargs)
|
690
|
+
|
691
|
+
return inner
|
692
|
+
|
693
|
+
|
734
694
|
def rng_integers(gen, low, high=None, size=None, dtype='int64',
|
735
695
|
endpoint=False):
|
736
696
|
"""
|
@@ -923,25 +883,30 @@ def _nan_allsame(a, axis, keepdims=False):
|
|
923
883
|
return ((a0 == a) | np.isnan(a)).all(axis=axis, keepdims=keepdims)
|
924
884
|
|
925
885
|
|
926
|
-
def _contains_nan(
|
927
|
-
|
886
|
+
def _contains_nan(
|
887
|
+
a: Array,
|
888
|
+
nan_policy: Literal["propagate", "raise", "omit"] = "propagate",
|
889
|
+
*,
|
890
|
+
xp_omit_okay: bool = False,
|
891
|
+
xp: ModuleType | None = None,
|
892
|
+
) -> Array | bool:
|
928
893
|
# Regarding `xp_omit_okay`: Temporarily, while `_axis_nan_policy` does not
|
929
894
|
# handle non-NumPy arrays, most functions that call `_contains_nan` want
|
930
895
|
# it to raise an error if `nan_policy='omit'` and `xp` is not `np`.
|
931
896
|
# Some functions support `nan_policy='omit'` natively, so setting this to
|
932
897
|
# `True` prevents the error from being raised.
|
933
|
-
|
934
|
-
xp = array_namespace(a)
|
935
|
-
not_numpy = not is_numpy(xp)
|
936
|
-
|
937
|
-
if policies is None:
|
938
|
-
policies = {'propagate', 'raise', 'omit'}
|
898
|
+
policies = {"propagate", "raise", "omit"}
|
939
899
|
if nan_policy not in policies:
|
940
|
-
|
900
|
+
msg = f"nan_policy must be one of {policies}."
|
901
|
+
raise ValueError(msg)
|
941
902
|
|
942
903
|
if xp_size(a) == 0:
|
943
|
-
|
944
|
-
|
904
|
+
return False
|
905
|
+
|
906
|
+
if xp is None:
|
907
|
+
xp = array_namespace(a)
|
908
|
+
|
909
|
+
if xp.isdtype(a.dtype, "real floating"):
|
945
910
|
# Faster and less memory-intensive than xp.any(xp.isnan(a)), and unlike other
|
946
911
|
# reductions, `max`/`min` won't return NaN unless there is a NaN in the data.
|
947
912
|
contains_nan = xp.isnan(xp.max(a))
|
@@ -958,16 +923,27 @@ def _contains_nan(a, nan_policy='propagate', policies=None, *,
|
|
958
923
|
break
|
959
924
|
else:
|
960
925
|
# Only `object` and `inexact` arrays can have NaNs
|
961
|
-
|
962
|
-
|
963
|
-
if contains_nan and nan_policy == 'raise':
|
964
|
-
raise ValueError("The input contains nan values")
|
926
|
+
return False
|
965
927
|
|
966
|
-
|
967
|
-
|
968
|
-
|
928
|
+
# The implicit call to bool(contains_nan) must happen after testing
|
929
|
+
# nan_policy to prevent lazy and device-bound xps from raising in the
|
930
|
+
# default policy='propagate' case.
|
931
|
+
if nan_policy == 'raise':
|
932
|
+
if is_lazy_array(a):
|
933
|
+
msg = "nan_policy='raise' is not supported for lazy arrays."
|
934
|
+
raise TypeError(msg)
|
935
|
+
if contains_nan:
|
936
|
+
msg = "The input contains nan values"
|
937
|
+
raise ValueError(msg)
|
938
|
+
elif nan_policy == 'omit' and not xp_omit_okay and not is_numpy(xp):
|
939
|
+
if is_lazy_array(a):
|
940
|
+
msg = "nan_policy='omit' is not supported for lazy arrays."
|
941
|
+
raise TypeError(msg)
|
942
|
+
if contains_nan:
|
943
|
+
msg = "nan_policy='omit' is incompatible with non-NumPy arrays."
|
944
|
+
raise ValueError(msg)
|
969
945
|
|
970
|
-
return contains_nan
|
946
|
+
return contains_nan
|
971
947
|
|
972
948
|
|
973
949
|
def _rename_parameter(old_name, new_name, dep_version=None):
|
@@ -1034,17 +1010,16 @@ def _rng_spawn(rng, n_children):
|
|
1034
1010
|
return child_rngs
|
1035
1011
|
|
1036
1012
|
|
1037
|
-
def _get_nan(*data, xp=None):
|
1013
|
+
def _get_nan(*data, shape=(), xp=None):
|
1038
1014
|
xp = array_namespace(*data) if xp is None else xp
|
1039
1015
|
# Get NaN of appropriate dtype for data
|
1040
|
-
data =
|
1041
|
-
|
1042
|
-
|
1043
|
-
|
1044
|
-
|
1045
|
-
|
1046
|
-
|
1047
|
-
return xp.asarray(xp.nan, dtype=dtype)[()]
|
1016
|
+
dtype = xp_result_type(*data, force_floating=True, xp=xp)
|
1017
|
+
device = xp_result_device(*data)
|
1018
|
+
res = xp.full(shape, xp.nan, dtype=dtype, device=device)
|
1019
|
+
if not shape:
|
1020
|
+
res = res[()]
|
1021
|
+
# whenever mdhaber/marray#89 is resolved, could just return `res`
|
1022
|
+
return res.data if is_marray(xp) else res
|
1048
1023
|
|
1049
1024
|
|
1050
1025
|
def normalize_axis_index(axis, ndim):
|
@@ -1177,3 +1152,125 @@ def _dict_formatter(d, n=0, mplus=1, sorter=None):
|
|
1177
1152
|
formatter={'float_kind': _float_formatter_10}):
|
1178
1153
|
s = str(d)
|
1179
1154
|
return s
|
1155
|
+
|
1156
|
+
|
1157
|
+
_batch_note = """
|
1158
|
+
The documentation is written assuming array arguments are of specified
|
1159
|
+
"core" shapes. However, array argument(s) of this function may have additional
|
1160
|
+
"batch" dimensions prepended to the core shape. In this case, the array is treated
|
1161
|
+
as a batch of lower-dimensional slices; see :ref:`linalg_batch` for details.
|
1162
|
+
"""
|
1163
|
+
|
1164
|
+
|
1165
|
+
def _apply_over_batch(*argdefs):
|
1166
|
+
"""
|
1167
|
+
Factory for decorator that applies a function over batched arguments.
|
1168
|
+
|
1169
|
+
Array arguments may have any number of core dimensions (typically 0,
|
1170
|
+
1, or 2) and any broadcastable batch shapes. There may be any
|
1171
|
+
number of array outputs of any number of dimensions. Assumptions
|
1172
|
+
right now - which are satisfied by all functions of interest in `linalg` -
|
1173
|
+
are that all array inputs are consecutive keyword or positional arguments,
|
1174
|
+
and that the wrapped function returns either a single array or a tuple of
|
1175
|
+
arrays. It's only as general as it needs to be right now - it can be extended.
|
1176
|
+
|
1177
|
+
Parameters
|
1178
|
+
----------
|
1179
|
+
*argdefs : tuple of (str, int)
|
1180
|
+
Definitions of array arguments: the keyword name of the argument, and
|
1181
|
+
the number of core dimensions.
|
1182
|
+
|
1183
|
+
Example:
|
1184
|
+
--------
|
1185
|
+
`linalg.eig` accepts two matrices as the first two arguments `a` and `b`, where
|
1186
|
+
`b` is optional, and returns one array or a tuple of arrays, depending on the
|
1187
|
+
values of other positional or keyword arguments. To generate a wrapper that applies
|
1188
|
+
the function over batches of `a` and optionally `b` :
|
1189
|
+
|
1190
|
+
>>> _apply_over_batch(('a', 2), ('b', 2))
|
1191
|
+
"""
|
1192
|
+
names, ndims = list(zip(*argdefs))
|
1193
|
+
n_arrays = len(names)
|
1194
|
+
|
1195
|
+
def decorator(f):
|
1196
|
+
@functools.wraps(f)
|
1197
|
+
def wrapper(*args, **kwargs):
|
1198
|
+
args = list(args)
|
1199
|
+
|
1200
|
+
# Ensure all arrays in `arrays`, other arguments in `other_args`/`kwargs`
|
1201
|
+
arrays, other_args = args[:n_arrays], args[n_arrays:]
|
1202
|
+
for i, name in enumerate(names):
|
1203
|
+
if name in kwargs:
|
1204
|
+
if i + 1 <= len(args):
|
1205
|
+
raise ValueError(f'{f.__name__}() got multiple values '
|
1206
|
+
f'for argument `{name}`.')
|
1207
|
+
else:
|
1208
|
+
arrays.append(kwargs.pop(name))
|
1209
|
+
|
1210
|
+
# Determine core and batch shapes
|
1211
|
+
batch_shapes = []
|
1212
|
+
core_shapes = []
|
1213
|
+
for i, (array, ndim) in enumerate(zip(arrays, ndims)):
|
1214
|
+
array = None if array is None else np.asarray(array)
|
1215
|
+
shape = () if array is None else array.shape
|
1216
|
+
|
1217
|
+
if ndim == "1|2": # special case for `solve`, etc.
|
1218
|
+
ndim = 2 if array.ndim >= 2 else 1
|
1219
|
+
|
1220
|
+
arrays[i] = array
|
1221
|
+
batch_shapes.append(shape[:-ndim] if ndim > 0 else shape)
|
1222
|
+
core_shapes.append(shape[-ndim:] if ndim > 0 else ())
|
1223
|
+
|
1224
|
+
# Early exit if call is not batched
|
1225
|
+
if not any(batch_shapes):
|
1226
|
+
return f(*arrays, *other_args, **kwargs)
|
1227
|
+
|
1228
|
+
# Determine broadcasted batch shape
|
1229
|
+
batch_shape = np.broadcast_shapes(*batch_shapes) # Gives OK error message
|
1230
|
+
|
1231
|
+
# Broadcast arrays to appropriate shape
|
1232
|
+
for i, (array, core_shape) in enumerate(zip(arrays, core_shapes)):
|
1233
|
+
if array is None:
|
1234
|
+
continue
|
1235
|
+
arrays[i] = np.broadcast_to(array, batch_shape + core_shape)
|
1236
|
+
|
1237
|
+
# Main loop
|
1238
|
+
results = []
|
1239
|
+
for index in np.ndindex(batch_shape):
|
1240
|
+
result = f(*(array[index] for array in arrays), *other_args, **kwargs)
|
1241
|
+
# Assume `result` is either a tuple or single array. This is easily
|
1242
|
+
# generalized by allowing the contributor to pass an `unpack_result`
|
1243
|
+
# callable to the decorator factory.
|
1244
|
+
result = (result,) if not isinstance(result, tuple) else result
|
1245
|
+
results.append(result)
|
1246
|
+
results = list(zip(*results))
|
1247
|
+
|
1248
|
+
# Reshape results
|
1249
|
+
for i, result in enumerate(results):
|
1250
|
+
result = np.stack(result)
|
1251
|
+
core_shape = result.shape[1:]
|
1252
|
+
results[i] = np.reshape(result, batch_shape + core_shape)
|
1253
|
+
|
1254
|
+
# Assume `result` should be a single array if there is only one element or
|
1255
|
+
# a `tuple` otherwise. This is easily generalized by allowing the
|
1256
|
+
# contributor to pass an `pack_result` callable to the decorator factory.
|
1257
|
+
return results[0] if len(results) == 1 else results
|
1258
|
+
|
1259
|
+
doc = FunctionDoc(wrapper)
|
1260
|
+
doc['Extended Summary'].append(_batch_note.rstrip())
|
1261
|
+
wrapper.__doc__ = str(doc).split("\n", 1)[1] # remove signature
|
1262
|
+
|
1263
|
+
return wrapper
|
1264
|
+
return decorator
|
1265
|
+
|
1266
|
+
|
1267
|
+
def np_vecdot(x1, x2, /, *, axis=-1):
|
1268
|
+
# `np.vecdot` has advantages (e.g. see gh-22462), so let's use it when
|
1269
|
+
# available. As functions are translated to Array API, `np_vecdot` can be
|
1270
|
+
# replaced with `xp.vecdot`.
|
1271
|
+
if np.__version__ > "2.0":
|
1272
|
+
return np.vecdot(x1, x2, axis=axis)
|
1273
|
+
else:
|
1274
|
+
# of course there are other fancy ways of doing this (e.g. `einsum`)
|
1275
|
+
# but let's keep it simple since it's temporary
|
1276
|
+
return np.sum(x1 * x2, axis=axis)
|
@@ -1,9 +1,9 @@
|
|
1
1
|
"""
|
2
2
|
NumPy Array API compatibility library
|
3
3
|
|
4
|
-
This is a small wrapper around NumPy
|
5
|
-
Array API standard https://data-apis.org/array-api/latest/.
|
6
|
-
https://numpy.org/neps/nep-0047-array-api-standard.html.
|
4
|
+
This is a small wrapper around NumPy, CuPy, JAX, sparse and others that are
|
5
|
+
compatible with the Array API standard https://data-apis.org/array-api/latest/.
|
6
|
+
See also NEP 47 https://numpy.org/neps/nep-0047-array-api-standard.html.
|
7
7
|
|
8
8
|
Unlike array_api_strict, this is not a strict minimal implementation of the
|
9
9
|
Array API, but rather just an extension of the main NumPy namespace with
|
@@ -17,6 +17,6 @@ to ensure they are not using functionality outside of the standard, but prefer
|
|
17
17
|
this implementation for the default when working with NumPy arrays.
|
18
18
|
|
19
19
|
"""
|
20
|
-
__version__ = '1.
|
20
|
+
__version__ = '1.12.0'
|
21
21
|
|
22
22
|
from .common import * # noqa: F401, F403
|