scipy 1.15.3__cp312-cp312-win_amd64.whl → 1.16.0rc2__cp312-cp312-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scipy/__config__.py +8 -8
- scipy/__init__.py +3 -6
- scipy/_cyutility.cp312-win_amd64.dll.a +0 -0
- scipy/_cyutility.cp312-win_amd64.pyd +0 -0
- scipy/_lib/_array_api.py +486 -161
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_bunch.py +4 -0
- scipy/_lib/_ccallback_c.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/_ccallback_c.cp312-win_amd64.pyd +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_fpumode.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/_fpumode.cp312-win_amd64.pyd +0 -0
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_ccallback.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/_test_ccallback.cp312-win_amd64.pyd +0 -0
- scipy/_lib/_test_deprecation_call.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/_test_deprecation_call.cp312-win_amd64.pyd +0 -0
- scipy/_lib/_test_deprecation_def.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/_test_deprecation_def.cp312-win_amd64.pyd +0 -0
- scipy/_lib/_testutils.py +6 -2
- scipy/_lib/_uarray/_uarray.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/_uarray/_uarray.cp312-win_amd64.pyd +0 -0
- scipy/_lib/_util.py +222 -125
- scipy/_lib/array_api_compat/__init__.py +4 -4
- scipy/_lib/array_api_compat/_internal.py +19 -6
- scipy/_lib/array_api_compat/common/__init__.py +1 -1
- scipy/_lib/array_api_compat/common/_aliases.py +365 -193
- scipy/_lib/array_api_compat/common/_fft.py +94 -64
- scipy/_lib/array_api_compat/common/_helpers.py +413 -180
- scipy/_lib/array_api_compat/common/_linalg.py +116 -40
- scipy/_lib/array_api_compat/common/_typing.py +179 -10
- scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
- scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
- scipy/_lib/array_api_compat/cupy/_info.py +16 -6
- scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
- scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
- scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
- scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
- scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
- scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
- scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
- scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
- scipy/_lib/array_api_compat/numpy/_info.py +36 -16
- scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
- scipy/_lib/array_api_compat/numpy/fft.py +11 -5
- scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
- scipy/_lib/array_api_compat/torch/__init__.py +3 -5
- scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
- scipy/_lib/array_api_compat/torch/_info.py +27 -16
- scipy/_lib/array_api_compat/torch/_typing.py +3 -0
- scipy/_lib/array_api_compat/torch/fft.py +17 -18
- scipy/_lib/array_api_compat/torch/linalg.py +16 -16
- scipy/_lib/array_api_extra/__init__.py +26 -3
- scipy/_lib/array_api_extra/_delegation.py +171 -0
- scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_at.py +463 -0
- scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
- scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
- scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
- scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
- scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
- scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
- scipy/_lib/array_api_extra/testing.py +359 -0
- scipy/_lib/decorator.py +2 -2
- scipy/_lib/doccer.py +1 -7
- scipy/_lib/messagestream.cp312-win_amd64.dll.a +0 -0
- scipy/_lib/messagestream.cp312-win_amd64.pyd +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/test__util.py +105 -121
- scipy/_lib/tests/test_array_api.py +166 -35
- scipy/_lib/tests/test_bunch.py +7 -0
- scipy/_lib/tests/test_ccallback.py +2 -10
- scipy/_lib/tests/test_public_api.py +13 -0
- scipy/cluster/_hierarchy.cp312-win_amd64.dll.a +0 -0
- scipy/cluster/_hierarchy.cp312-win_amd64.pyd +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.dll.a +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.pyd +0 -0
- scipy/cluster/_vq.cp312-win_amd64.dll.a +0 -0
- scipy/cluster/_vq.cp312-win_amd64.pyd +0 -0
- scipy/cluster/hierarchy.py +393 -223
- scipy/cluster/tests/test_hierarchy.py +273 -335
- scipy/cluster/tests/test_vq.py +45 -61
- scipy/cluster/vq.py +39 -35
- scipy/conftest.py +263 -157
- scipy/constants/_constants.py +4 -1
- scipy/constants/tests/test_codata.py +2 -2
- scipy/constants/tests/test_constants.py +11 -18
- scipy/datasets/_download_all.py +15 -1
- scipy/datasets/_fetchers.py +7 -1
- scipy/datasets/_utils.py +1 -1
- scipy/differentiate/_differentiate.py +25 -25
- scipy/differentiate/tests/test_differentiate.py +24 -25
- scipy/fft/_basic.py +20 -0
- scipy/fft/_helper.py +3 -34
- scipy/fft/_pocketfft/helper.py +29 -1
- scipy/fft/_pocketfft/pypocketfft.cp312-win_amd64.dll.a +0 -0
- scipy/fft/_pocketfft/pypocketfft.cp312-win_amd64.pyd +0 -0
- scipy/fft/_pocketfft/tests/test_basic.py +2 -4
- scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
- scipy/fft/_realtransforms.py +13 -0
- scipy/fft/tests/test_basic.py +27 -25
- scipy/fft/tests/test_fftlog.py +16 -7
- scipy/fft/tests/test_helper.py +18 -34
- scipy/fft/tests/test_real_transforms.py +8 -10
- scipy/fftpack/convolve.cp312-win_amd64.dll.a +0 -0
- scipy/fftpack/convolve.cp312-win_amd64.pyd +0 -0
- scipy/fftpack/tests/test_basic.py +2 -4
- scipy/fftpack/tests/test_real_transforms.py +8 -9
- scipy/integrate/_bvp.py +9 -3
- scipy/integrate/_cubature.py +3 -2
- scipy/integrate/_dop.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_dop.cp312-win_amd64.pyd +0 -0
- scipy/integrate/_lsoda.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_lsoda.cp312-win_amd64.pyd +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_odepack.cp312-win_amd64.pyd +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_quadpack.cp312-win_amd64.pyd +0 -0
- scipy/integrate/_quadpack_py.py +11 -7
- scipy/integrate/_quadrature.py +3 -3
- scipy/integrate/_rules/_base.py +2 -2
- scipy/integrate/_tanhsinh.py +48 -47
- scipy/integrate/_test_multivariate.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_test_multivariate.cp312-win_amd64.pyd +0 -0
- scipy/integrate/_test_odeint_banded.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_test_odeint_banded.cp312-win_amd64.pyd +0 -0
- scipy/integrate/_vode.cp312-win_amd64.dll.a +0 -0
- scipy/integrate/_vode.cp312-win_amd64.pyd +0 -0
- scipy/integrate/tests/test__quad_vec.py +0 -6
- scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
- scipy/integrate/tests/test_cubature.py +21 -35
- scipy/integrate/tests/test_quadrature.py +6 -8
- scipy/integrate/tests/test_tanhsinh.py +56 -48
- scipy/interpolate/__init__.py +70 -58
- scipy/interpolate/_bary_rational.py +22 -22
- scipy/interpolate/_bsplines.py +119 -66
- scipy/interpolate/_cubic.py +65 -50
- scipy/interpolate/_dfitpack.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_dfitpack.cp312-win_amd64.pyd +0 -0
- scipy/interpolate/_dierckx.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_dierckx.cp312-win_amd64.pyd +0 -0
- scipy/interpolate/_fitpack.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_fitpack.cp312-win_amd64.pyd +0 -0
- scipy/interpolate/_fitpack2.py +9 -6
- scipy/interpolate/_fitpack_impl.py +32 -26
- scipy/interpolate/_fitpack_repro.py +23 -19
- scipy/interpolate/_interpnd.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_interpnd.cp312-win_amd64.pyd +0 -0
- scipy/interpolate/_interpolate.py +30 -12
- scipy/interpolate/_ndbspline.py +13 -18
- scipy/interpolate/_ndgriddata.py +5 -8
- scipy/interpolate/_polyint.py +95 -31
- scipy/interpolate/_ppoly.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_ppoly.cp312-win_amd64.pyd +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.pyd +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_rgi_cython.cp312-win_amd64.pyd +0 -0
- scipy/interpolate/dfitpack.py +0 -20
- scipy/interpolate/interpnd.py +1 -2
- scipy/interpolate/tests/test_bary_rational.py +2 -2
- scipy/interpolate/tests/test_bsplines.py +97 -1
- scipy/interpolate/tests/test_fitpack2.py +39 -1
- scipy/interpolate/tests/test_interpnd.py +32 -20
- scipy/interpolate/tests/test_interpolate.py +48 -4
- scipy/interpolate/tests/test_rgi.py +2 -1
- scipy/io/_fast_matrix_market/__init__.py +2 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp312-win_amd64.dll.a +0 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp312-win_amd64.pyd +0 -0
- scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
- scipy/io/_harwell_boeing/hb.py +7 -11
- scipy/io/_idl.py +5 -7
- scipy/io/_netcdf.py +15 -5
- scipy/io/_test_fortran.cp312-win_amd64.dll.a +0 -0
- scipy/io/_test_fortran.cp312-win_amd64.pyd +0 -0
- scipy/io/arff/tests/test_arffread.py +3 -3
- scipy/io/matlab/__init__.py +5 -3
- scipy/io/matlab/_mio.py +4 -1
- scipy/io/matlab/_mio5.py +19 -13
- scipy/io/matlab/_mio5_utils.cp312-win_amd64.dll.a +0 -0
- scipy/io/matlab/_mio5_utils.cp312-win_amd64.pyd +0 -0
- scipy/io/matlab/_mio_utils.cp312-win_amd64.dll.a +0 -0
- scipy/io/matlab/_mio_utils.cp312-win_amd64.pyd +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cp312-win_amd64.dll.a +0 -0
- scipy/io/matlab/_streams.cp312-win_amd64.pyd +0 -0
- scipy/io/matlab/tests/test_mio.py +46 -18
- scipy/io/matlab/tests/test_mio_funcs.py +1 -1
- scipy/io/tests/test_mmio.py +7 -1
- scipy/io/tests/test_wavfile.py +41 -0
- scipy/io/wavfile.py +57 -10
- scipy/linalg/_basic.py +113 -86
- scipy/linalg/_cythonized_array_utils.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_cythonized_array_utils.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_decomp.py +22 -9
- scipy/linalg/_decomp_cholesky.py +28 -13
- scipy/linalg/_decomp_cossin.py +45 -30
- scipy/linalg/_decomp_interpolative.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_interpolative.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_lu_cython.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_decomp_polar.py +2 -0
- scipy/linalg/_decomp_qr.py +6 -2
- scipy/linalg/_decomp_qz.py +3 -0
- scipy/linalg/_decomp_schur.py +3 -1
- scipy/linalg/_decomp_svd.py +13 -2
- scipy/linalg/_decomp_update.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_update.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_fblas.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_flapack.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_flapack.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_linalg_pythran.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_linalg_pythran.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_expm.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/_solve_toeplitz.cp312-win_amd64.pyd +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/cython_blas.cp312-win_amd64.pyd +0 -0
- scipy/linalg/cython_lapack.cp312-win_amd64.dll.a +0 -0
- scipy/linalg/cython_lapack.cp312-win_amd64.pyd +0 -0
- scipy/linalg/lapack.py +22 -2
- scipy/linalg/tests/_cython_examples/meson.build +7 -0
- scipy/linalg/tests/test_basic.py +31 -16
- scipy/linalg/tests/test_batch.py +588 -0
- scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
- scipy/linalg/tests/test_decomp.py +40 -3
- scipy/linalg/tests/test_decomp_cossin.py +14 -0
- scipy/linalg/tests/test_decomp_ldl.py +1 -1
- scipy/linalg/tests/test_lapack.py +115 -7
- scipy/linalg/tests/test_matfuncs.py +157 -102
- scipy/linalg/tests/test_procrustes.py +0 -7
- scipy/linalg/tests/test_solve_toeplitz.py +1 -1
- scipy/linalg/tests/test_special_matrices.py +1 -5
- scipy/ndimage/__init__.py +1 -0
- scipy/ndimage/_ctest.cp312-win_amd64.dll.a +0 -0
- scipy/ndimage/_ctest.cp312-win_amd64.pyd +0 -0
- scipy/ndimage/_cytest.cp312-win_amd64.dll.a +0 -0
- scipy/ndimage/_cytest.cp312-win_amd64.pyd +0 -0
- scipy/ndimage/_delegators.py +8 -2
- scipy/ndimage/_filters.py +453 -5
- scipy/ndimage/_interpolation.py +36 -6
- scipy/ndimage/_measurements.py +4 -2
- scipy/ndimage/_morphology.py +5 -0
- scipy/ndimage/_nd_image.cp312-win_amd64.dll.a +0 -0
- scipy/ndimage/_nd_image.cp312-win_amd64.pyd +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cp312-win_amd64.dll.a +0 -0
- scipy/ndimage/_ni_label.cp312-win_amd64.pyd +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cp312-win_amd64.dll.a +0 -0
- scipy/ndimage/_rank_filter_1d.cp312-win_amd64.pyd +0 -0
- scipy/ndimage/_support_alternative_backends.py +18 -6
- scipy/ndimage/tests/test_filters.py +370 -259
- scipy/ndimage/tests/test_fourier.py +7 -9
- scipy/ndimage/tests/test_interpolation.py +68 -61
- scipy/ndimage/tests/test_measurements.py +18 -35
- scipy/ndimage/tests/test_morphology.py +143 -131
- scipy/ndimage/tests/test_splines.py +1 -3
- scipy/odr/__odrpack.cp312-win_amd64.dll.a +0 -0
- scipy/odr/__odrpack.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_bglu_dense.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_bracket.py +17 -24
- scipy/optimize/_chandrupatla.py +9 -10
- scipy/optimize/_cobyla_py.py +104 -123
- scipy/optimize/_constraints.py +14 -10
- scipy/optimize/_differentiable_functions.py +371 -230
- scipy/optimize/_differentialevolution.py +4 -3
- scipy/optimize/_direct.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_direct.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_group_columns.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_highspy/_core.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_highspy/_core.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_highspy/_highs_options.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_highspy/_highs_options.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_lbfgsb.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_lbfgsb.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_lbfgsb_py.py +57 -16
- scipy/optimize/_linprog_doc.py +2 -2
- scipy/optimize/_linprog_highs.py +2 -2
- scipy/optimize/_linprog_ip.py +25 -10
- scipy/optimize/_linprog_util.py +14 -16
- scipy/optimize/_lsap.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_lsap.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_lsq/givens_elimination.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_lsq/least_squares.py +198 -126
- scipy/optimize/_lsq/lsq_linear.py +6 -6
- scipy/optimize/_lsq/trf.py +35 -8
- scipy/optimize/_milp.py +3 -1
- scipy/optimize/_minimize.py +105 -36
- scipy/optimize/_minpack.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_minpack.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_moduleTNC.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_nnls.py +20 -21
- scipy/optimize/_nonlin.py +34 -3
- scipy/optimize/_numdiff.py +288 -110
- scipy/optimize/_optimize.py +86 -48
- scipy/optimize/_pava_pybind.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_pava_pybind.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_remove_redundancy.py +5 -5
- scipy/optimize/_root_scalar.py +1 -1
- scipy/optimize/_shgo.py +6 -0
- scipy/optimize/_shgo_lib/_complex.py +1 -1
- scipy/optimize/_slsqp_py.py +216 -124
- scipy/optimize/_slsqplib.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_slsqplib.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_trlib/_trlib.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_trustregion.py +20 -6
- scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
- scipy/optimize/_trustregion_constr/projections.py +12 -8
- scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
- scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
- scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
- scipy/optimize/_trustregion_exact.py +0 -1
- scipy/optimize/_zeros.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_zeros.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/cython_optimize/_zeros.cp312-win_amd64.pyd +0 -0
- scipy/optimize/slsqp.py +0 -1
- scipy/optimize/tests/test__basinhopping.py +1 -1
- scipy/optimize/tests/test__differential_evolution.py +4 -4
- scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
- scipy/optimize/tests/test__numdiff.py +66 -22
- scipy/optimize/tests/test__remove_redundancy.py +2 -2
- scipy/optimize/tests/test__shgo.py +9 -1
- scipy/optimize/tests/test_bracket.py +36 -46
- scipy/optimize/tests/test_chandrupatla.py +133 -135
- scipy/optimize/tests/test_cobyla.py +74 -45
- scipy/optimize/tests/test_constraints.py +1 -1
- scipy/optimize/tests/test_differentiable_functions.py +226 -6
- scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
- scipy/optimize/tests/test_least_squares.py +125 -13
- scipy/optimize/tests/test_linear_assignment.py +3 -3
- scipy/optimize/tests/test_linprog.py +3 -3
- scipy/optimize/tests/test_lsq_linear.py +6 -6
- scipy/optimize/tests/test_minimize_constrained.py +2 -2
- scipy/optimize/tests/test_minpack.py +4 -4
- scipy/optimize/tests/test_nnls.py +43 -3
- scipy/optimize/tests/test_nonlin.py +36 -0
- scipy/optimize/tests/test_optimize.py +95 -17
- scipy/optimize/tests/test_slsqp.py +36 -4
- scipy/optimize/tests/test_zeros.py +34 -1
- scipy/signal/__init__.py +12 -23
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +459 -241
- scipy/signal/_fir_filter_design.py +262 -90
- scipy/signal/_lti_conversion.py +3 -2
- scipy/signal/_ltisys.py +118 -91
- scipy/signal/_max_len_seq_inner.cp312-win_amd64.dll.a +0 -0
- scipy/signal/_max_len_seq_inner.cp312-win_amd64.pyd +0 -0
- scipy/signal/_peak_finding_utils.cp312-win_amd64.dll.a +0 -0
- scipy/signal/_peak_finding_utils.cp312-win_amd64.pyd +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_short_time_fft.py +519 -70
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +719 -399
- scipy/signal/_sigtools.cp312-win_amd64.dll.a +0 -0
- scipy/signal/_sigtools.cp312-win_amd64.pyd +0 -0
- scipy/signal/_sosfilt.cp312-win_amd64.dll.a +0 -0
- scipy/signal/_sosfilt.cp312-win_amd64.pyd +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cp312-win_amd64.dll.a +0 -0
- scipy/signal/_spline.cp312-win_amd64.pyd +0 -0
- scipy/signal/_spline_filters.py +108 -68
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +4 -1
- scipy/signal/_upfirdn_apply.cp312-win_amd64.dll.a +0 -0
- scipy/signal/_upfirdn_apply.cp312-win_amd64.pyd +0 -0
- scipy/signal/_waveforms.py +2 -11
- scipy/signal/_wavelets.py +1 -1
- scipy/signal/fir_filter_design.py +1 -0
- scipy/signal/spline.py +4 -11
- scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
- scipy/signal/tests/test_bsplines.py +114 -79
- scipy/signal/tests/test_cont2discrete.py +9 -2
- scipy/signal/tests/test_filter_design.py +721 -481
- scipy/signal/tests/test_fir_filter_design.py +332 -140
- scipy/signal/tests/test_savitzky_golay.py +4 -3
- scipy/signal/tests/test_short_time_fft.py +221 -3
- scipy/signal/tests/test_signaltools.py +2144 -1348
- scipy/signal/tests/test_spectral.py +50 -6
- scipy/signal/tests/test_splines.py +161 -96
- scipy/signal/tests/test_upfirdn.py +84 -50
- scipy/signal/tests/test_waveforms.py +20 -0
- scipy/signal/tests/test_windows.py +607 -466
- scipy/signal/windows/_windows.py +287 -148
- scipy/sparse/__init__.py +23 -4
- scipy/sparse/_base.py +270 -108
- scipy/sparse/_bsr.py +7 -4
- scipy/sparse/_compressed.py +59 -231
- scipy/sparse/_construct.py +90 -38
- scipy/sparse/_coo.py +115 -181
- scipy/sparse/_csc.py +4 -4
- scipy/sparse/_csparsetools.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/_csparsetools.cp312-win_amd64.pyd +0 -0
- scipy/sparse/_csr.py +2 -2
- scipy/sparse/_data.py +48 -48
- scipy/sparse/_dia.py +105 -18
- scipy/sparse/_dok.py +0 -23
- scipy/sparse/_index.py +4 -4
- scipy/sparse/_matrix.py +23 -0
- scipy/sparse/_sparsetools.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/_sparsetools.cp312-win_amd64.pyd +0 -0
- scipy/sparse/_sputils.py +37 -22
- scipy/sparse/base.py +0 -9
- scipy/sparse/bsr.py +0 -14
- scipy/sparse/compressed.py +0 -23
- scipy/sparse/construct.py +0 -6
- scipy/sparse/coo.py +0 -14
- scipy/sparse/csc.py +0 -3
- scipy/sparse/csgraph/_flow.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_flow.cp312-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_matching.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_matching.cp312-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_reordering.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_reordering.cp312-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_tools.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_tools.cp312-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_traversal.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_traversal.cp312-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/tests/test_matching.py +14 -2
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
- scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
- scipy/sparse/csr.py +0 -5
- scipy/sparse/data.py +1 -6
- scipy/sparse/dia.py +0 -7
- scipy/sparse/dok.py +0 -10
- scipy/sparse/linalg/_dsolve/_superlu.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_dsolve/_superlu.cp312-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
- scipy/sparse/linalg/_interface.py +17 -18
- scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
- scipy/sparse/linalg/_isolve/iterative.py +51 -45
- scipy/sparse/linalg/_isolve/lgmres.py +6 -6
- scipy/sparse/linalg/_isolve/minres.py +5 -5
- scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
- scipy/sparse/linalg/_isolve/utils.py +2 -8
- scipy/sparse/linalg/_matfuncs.py +1 -1
- scipy/sparse/linalg/_norm.py +1 -1
- scipy/sparse/linalg/_propack/_cpropack.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_cpropack.cp312-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp312-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp312-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
- scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
- scipy/sparse/tests/test_arithmetic1d.py +5 -2
- scipy/sparse/tests/test_base.py +214 -42
- scipy/sparse/tests/test_common1d.py +7 -7
- scipy/sparse/tests/test_construct.py +1 -1
- scipy/sparse/tests/test_coo.py +272 -4
- scipy/sparse/tests/test_sparsetools.py +5 -0
- scipy/sparse/tests/test_sputils.py +36 -7
- scipy/spatial/_ckdtree.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/_ckdtree.cp312-win_amd64.pyd +0 -0
- scipy/spatial/_distance_pybind.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/_distance_pybind.cp312-win_amd64.pyd +0 -0
- scipy/spatial/_distance_wrap.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/_distance_wrap.cp312-win_amd64.pyd +0 -0
- scipy/spatial/_hausdorff.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/_hausdorff.cp312-win_amd64.pyd +0 -0
- scipy/spatial/_qhull.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/_qhull.cp312-win_amd64.pyd +0 -0
- scipy/spatial/_voronoi.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/_voronoi.cp312-win_amd64.pyd +0 -0
- scipy/spatial/distance.py +49 -42
- scipy/spatial/tests/test_distance.py +15 -1
- scipy/spatial/tests/test_kdtree.py +1 -0
- scipy/spatial/tests/test_qhull.py +7 -2
- scipy/spatial/transform/__init__.py +5 -3
- scipy/spatial/transform/_rigid_transform.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/transform/_rigid_transform.cp312-win_amd64.pyd +0 -0
- scipy/spatial/transform/_rotation.cp312-win_amd64.dll.a +0 -0
- scipy/spatial/transform/_rotation.cp312-win_amd64.pyd +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +1213 -832
- scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
- scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
- scipy/special/__init__.py +1 -47
- scipy/special/_add_newdocs.py +34 -772
- scipy/special/_basic.py +22 -25
- scipy/special/_comb.cp312-win_amd64.dll.a +0 -0
- scipy/special/_comb.cp312-win_amd64.pyd +0 -0
- scipy/special/_ellip_harm_2.cp312-win_amd64.dll.a +0 -0
- scipy/special/_ellip_harm_2.cp312-win_amd64.pyd +0 -0
- scipy/special/_gufuncs.cp312-win_amd64.dll.a +0 -0
- scipy/special/_gufuncs.cp312-win_amd64.pyd +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cp312-win_amd64.dll.a +0 -0
- scipy/special/_specfun.cp312-win_amd64.pyd +0 -0
- scipy/special/_special_ufuncs.cp312-win_amd64.dll.a +0 -0
- scipy/special/_special_ufuncs.cp312-win_amd64.pyd +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cp312-win_amd64.dll.a +0 -0
- scipy/special/_test_internal.cp312-win_amd64.pyd +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cp312-win_amd64.dll.a +0 -0
- scipy/special/_ufuncs.cp312-win_amd64.pyd +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cp312-win_amd64.dll.a +0 -0
- scipy/special/_ufuncs_cxx.cp312-win_amd64.pyd +0 -0
- scipy/special/_ufuncs_cxx.pxd +2 -15
- scipy/special/_ufuncs_cxx.pyx +5 -44
- scipy/special/_ufuncs_cxx_defs.h +2 -16
- scipy/special/_ufuncs_defs.h +0 -8
- scipy/special/cython_special.cp312-win_amd64.dll.a +0 -0
- scipy/special/cython_special.cp312-win_amd64.pyd +0 -0
- scipy/special/cython_special.pxd +1 -1
- scipy/special/tests/_cython_examples/meson.build +10 -1
- scipy/special/tests/test_basic.py +153 -20
- scipy/special/tests/test_boost_ufuncs.py +3 -0
- scipy/special/tests/test_cdflib.py +35 -11
- scipy/special/tests/test_gammainc.py +16 -0
- scipy/special/tests/test_hyp2f1.py +2 -2
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_logsumexp.py +206 -64
- scipy/special/tests/test_mpmath.py +1 -0
- scipy/special/tests/test_nan_inputs.py +1 -1
- scipy/special/tests/test_orthogonal.py +17 -18
- scipy/special/tests/test_sf_error.py +3 -2
- scipy/special/tests/test_sph_harm.py +6 -7
- scipy/special/tests/test_support_alternative_backends.py +211 -76
- scipy/stats/__init__.py +4 -1
- scipy/stats/_ansari_swilk_statistics.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_ansari_swilk_statistics.cp312-win_amd64.pyd +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_biasedurn.cp312-win_amd64.pyd +0 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +277 -310
- scipy/stats/_correlation.py +1 -1
- scipy/stats/_covariance.py +6 -3
- scipy/stats/_discrete_distns.py +39 -32
- scipy/stats/_distn_infrastructure.py +39 -12
- scipy/stats/_distribution_infrastructure.py +900 -238
- scipy/stats/_entropy.py +9 -10
- scipy/{_lib → stats}/_finite_differences.py +1 -1
- scipy/stats/_hypotests.py +83 -50
- scipy/stats/_kde.py +53 -49
- scipy/stats/_ksstats.py +1 -1
- scipy/stats/_levy_stable/__init__.py +7 -15
- scipy/stats/_levy_stable/levyst.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_levy_stable/levyst.cp312-win_amd64.pyd +0 -0
- scipy/stats/_morestats.py +118 -73
- scipy/stats/_mstats_basic.py +13 -17
- scipy/stats/_mstats_extras.py +8 -8
- scipy/stats/_multivariate.py +89 -113
- scipy/stats/_new_distributions.py +97 -20
- scipy/stats/_page_trend_test.py +12 -5
- scipy/stats/_probability_distribution.py +265 -43
- scipy/stats/_qmc.py +14 -9
- scipy/stats/_qmc_cy.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_qmc_cy.cp312-win_amd64.pyd +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_qmvnt_cy.cp312-win_amd64.pyd +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_rcont/rcont.cp312-win_amd64.pyd +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_sobol.cp312-win_amd64.pyd +0 -0
- scipy/stats/_stats.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_stats.cp312-win_amd64.pyd +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_stats_pythran.cp312-win_amd64.pyd +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp312-win_amd64.pyd +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
- scipy/stats/_variation.py +6 -8
- scipy/stats/_wilcoxon.py +13 -7
- scipy/stats/tests/common_tests.py +6 -4
- scipy/stats/tests/test_axis_nan_policy.py +62 -24
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +379 -60
- scipy/stats/tests/test_continuous_basic.py +18 -12
- scipy/stats/tests/test_discrete_basic.py +14 -8
- scipy/stats/tests/test_discrete_distns.py +16 -16
- scipy/stats/tests/test_distributions.py +95 -75
- scipy/stats/tests/test_entropy.py +40 -48
- scipy/stats/tests/test_fit.py +4 -3
- scipy/stats/tests/test_hypotests.py +153 -24
- scipy/stats/tests/test_kdeoth.py +109 -41
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_morestats.py +79 -47
- scipy/stats/tests/test_mstats_basic.py +3 -3
- scipy/stats/tests/test_multivariate.py +434 -83
- scipy/stats/tests/test_qmc.py +13 -10
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +119 -112
- scipy/stats/tests/test_resampling.py +47 -56
- scipy/stats/tests/test_sampling.py +9 -4
- scipy/stats/tests/test_stats.py +799 -939
- scipy/stats/tests/test_variation.py +8 -6
- scipy/version.py +2 -2
- scipy-1.16.0rc2.dist-info/DELVEWHEEL +2 -0
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +685 -693
- scipy/_lib/array_api_extra/_funcs.py +0 -484
- scipy/_lib/array_api_extra/_typing.py +0 -8
- scipy/interpolate/_bspl.cp312-win_amd64.dll.a +0 -0
- scipy/interpolate/_bspl.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_cobyla.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_cobyla.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_cython_nnls.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_cython_nnls.cp312-win_amd64.pyd +0 -0
- scipy/optimize/_slsqp.cp312-win_amd64.dll.a +0 -0
- scipy/optimize/_slsqp.cp312-win_amd64.pyd +0 -0
- scipy/spatial/qhull_src/COPYING.txt +0 -38
- scipy/special/libsf_error_state.dll +0 -0
- scipy/special/libsf_error_state.dll.a +0 -0
- scipy/special/tests/test_log_softmax.py +0 -109
- scipy/special/tests/test_xsf_cuda.py +0 -114
- scipy/special/xsf/binom.h +0 -89
- scipy/special/xsf/cdflib.h +0 -100
- scipy/special/xsf/cephes/airy.h +0 -307
- scipy/special/xsf/cephes/besselpoly.h +0 -51
- scipy/special/xsf/cephes/beta.h +0 -257
- scipy/special/xsf/cephes/cbrt.h +0 -131
- scipy/special/xsf/cephes/chbevl.h +0 -85
- scipy/special/xsf/cephes/chdtr.h +0 -193
- scipy/special/xsf/cephes/const.h +0 -87
- scipy/special/xsf/cephes/ellie.h +0 -293
- scipy/special/xsf/cephes/ellik.h +0 -251
- scipy/special/xsf/cephes/ellpe.h +0 -107
- scipy/special/xsf/cephes/ellpk.h +0 -117
- scipy/special/xsf/cephes/expn.h +0 -260
- scipy/special/xsf/cephes/gamma.h +0 -398
- scipy/special/xsf/cephes/hyp2f1.h +0 -596
- scipy/special/xsf/cephes/hyperg.h +0 -361
- scipy/special/xsf/cephes/i0.h +0 -149
- scipy/special/xsf/cephes/i1.h +0 -158
- scipy/special/xsf/cephes/igam.h +0 -421
- scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
- scipy/special/xsf/cephes/igami.h +0 -313
- scipy/special/xsf/cephes/j0.h +0 -225
- scipy/special/xsf/cephes/j1.h +0 -198
- scipy/special/xsf/cephes/jv.h +0 -715
- scipy/special/xsf/cephes/k0.h +0 -164
- scipy/special/xsf/cephes/k1.h +0 -163
- scipy/special/xsf/cephes/kn.h +0 -243
- scipy/special/xsf/cephes/lanczos.h +0 -112
- scipy/special/xsf/cephes/ndtr.h +0 -275
- scipy/special/xsf/cephes/poch.h +0 -85
- scipy/special/xsf/cephes/polevl.h +0 -167
- scipy/special/xsf/cephes/psi.h +0 -194
- scipy/special/xsf/cephes/rgamma.h +0 -111
- scipy/special/xsf/cephes/scipy_iv.h +0 -811
- scipy/special/xsf/cephes/shichi.h +0 -248
- scipy/special/xsf/cephes/sici.h +0 -224
- scipy/special/xsf/cephes/sindg.h +0 -221
- scipy/special/xsf/cephes/tandg.h +0 -139
- scipy/special/xsf/cephes/trig.h +0 -58
- scipy/special/xsf/cephes/unity.h +0 -186
- scipy/special/xsf/cephes/zeta.h +0 -172
- scipy/special/xsf/config.h +0 -304
- scipy/special/xsf/digamma.h +0 -205
- scipy/special/xsf/error.h +0 -57
- scipy/special/xsf/evalpoly.h +0 -47
- scipy/special/xsf/expint.h +0 -266
- scipy/special/xsf/hyp2f1.h +0 -694
- scipy/special/xsf/iv_ratio.h +0 -173
- scipy/special/xsf/lambertw.h +0 -150
- scipy/special/xsf/loggamma.h +0 -163
- scipy/special/xsf/sici.h +0 -200
- scipy/special/xsf/tools.h +0 -427
- scipy/special/xsf/trig.h +0 -164
- scipy/special/xsf/wright_bessel.h +0 -843
- scipy/special/xsf/zlog1.h +0 -35
- scipy/stats/_mvn.cp312-win_amd64.dll.a +0 -0
- scipy/stats/_mvn.cp312-win_amd64.pyd +0 -0
- scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
- /scipy-1.15.3-cp312-cp312-win_amd64.whl → /scipy-1.16.0rc2-cp312-cp312-win_amd64.whl +0 -0
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
scipy/datasets/_download_all.py
CHANGED
@@ -31,6 +31,18 @@ def download_all(path=None):
|
|
31
31
|
path : str, optional
|
32
32
|
Directory path to download all the dataset files.
|
33
33
|
If None, default to the system cache_dir detected by pooch.
|
34
|
+
|
35
|
+
Examples
|
36
|
+
--------
|
37
|
+
Download the datasets to the default cache location:
|
38
|
+
|
39
|
+
>>> from scipy import datasets
|
40
|
+
>>> datasets.download_all()
|
41
|
+
|
42
|
+
Download the datasets to the current directory:
|
43
|
+
|
44
|
+
>>> datasets.download_all(".")
|
45
|
+
|
34
46
|
"""
|
35
47
|
if pooch is None:
|
36
48
|
raise ImportError("Missing optional dependency 'pooch' required "
|
@@ -38,10 +50,12 @@ def download_all(path=None):
|
|
38
50
|
"conda to install 'pooch'.")
|
39
51
|
if path is None:
|
40
52
|
path = pooch.os_cache('scipy-data')
|
53
|
+
# https://github.com/scipy/scipy/issues/21879
|
54
|
+
downloader = pooch.HTTPDownloader(headers={"User-Agent": "SciPy"})
|
41
55
|
for dataset_name, dataset_hash in _registry.registry.items():
|
42
56
|
pooch.retrieve(url=_registry.registry_urls[dataset_name],
|
43
57
|
known_hash=dataset_hash,
|
44
|
-
fname=dataset_name, path=path)
|
58
|
+
fname=dataset_name, path=path, downloader=downloader)
|
45
59
|
|
46
60
|
|
47
61
|
def main():
|
scipy/datasets/_fetchers.py
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
import sys
|
2
|
+
|
1
3
|
from numpy import array, frombuffer, load
|
2
4
|
from ._registry import registry, registry_urls
|
3
5
|
|
@@ -27,8 +29,12 @@ def fetch_data(dataset_name, data_fetcher=data_fetcher):
|
|
27
29
|
raise ImportError("Missing optional dependency 'pooch' required "
|
28
30
|
"for scipy.datasets module. Please use pip or "
|
29
31
|
"conda to install 'pooch'.")
|
32
|
+
# https://github.com/scipy/scipy/issues/21879
|
33
|
+
downloader = pooch.HTTPDownloader(
|
34
|
+
headers={"User-Agent": f"SciPy {sys.modules['scipy'].__version__}"}
|
35
|
+
)
|
30
36
|
# The "fetch" method returns the full path to the downloaded data file.
|
31
|
-
return data_fetcher.fetch(dataset_name)
|
37
|
+
return data_fetcher.fetch(dataset_name, downloader=downloader)
|
32
38
|
|
33
39
|
|
34
40
|
def ascent():
|
scipy/datasets/_utils.py
CHANGED
@@ -29,7 +29,7 @@ def _clear_cache(datasets, cache_dir=None, method_map=None):
|
|
29
29
|
print(f"Cleaning the cache directory {cache_dir}!")
|
30
30
|
shutil.rmtree(cache_dir)
|
31
31
|
else:
|
32
|
-
if not isinstance(datasets,
|
32
|
+
if not isinstance(datasets, list | tuple):
|
33
33
|
# single dataset method passed should be converted to list
|
34
34
|
datasets = [datasets, ]
|
35
35
|
for dataset in datasets:
|
@@ -3,7 +3,8 @@ import warnings
|
|
3
3
|
import numpy as np
|
4
4
|
import scipy._lib._elementwise_iterative_method as eim
|
5
5
|
from scipy._lib._util import _RichResult
|
6
|
-
from scipy._lib._array_api import array_namespace,
|
6
|
+
from scipy._lib._array_api import array_namespace, xp_copy, xp_promote
|
7
|
+
import scipy._lib.array_api_extra as xpx
|
7
8
|
|
8
9
|
_EERRORINCREASE = -1 # used in derivative
|
9
10
|
|
@@ -400,11 +401,11 @@ def derivative(f, x, *, args=(), tolerances=None, maxiter=10,
|
|
400
401
|
# that `hdir` can be broadcasted to the final shape. Same with `h0`.
|
401
402
|
hdir = xp.broadcast_to(hdir, shape)
|
402
403
|
hdir = xp.reshape(hdir, (-1,))
|
403
|
-
hdir = xp.astype(
|
404
|
+
hdir = xp.astype(xp.sign(hdir), dtype)
|
404
405
|
h0 = xp.broadcast_to(h0, shape)
|
405
406
|
h0 = xp.reshape(h0, (-1,))
|
406
407
|
h0 = xp.astype(h0, dtype)
|
407
|
-
h0[h0 <= 0]
|
408
|
+
h0 = xpx.at(h0)[h0 <= 0].set(xp.nan)
|
408
409
|
|
409
410
|
status = xp.full_like(x, eim._EINPROGRESS, dtype=xp.int32) # in progress
|
410
411
|
nit, nfev = 0, 1 # one function evaluations performed above
|
@@ -477,9 +478,9 @@ def derivative(f, x, *, args=(), tolerances=None, maxiter=10,
|
|
477
478
|
n_new = 2*n if work.nit == 0 else 2 # number of new abscissae
|
478
479
|
x_eval = xp.zeros((work.hdir.shape[0], n_new), dtype=work.dtype)
|
479
480
|
il, ic, ir = work.il, work.ic, work.ir
|
480
|
-
x_eval[ir]
|
481
|
-
x_eval[ic]
|
482
|
-
x_eval[il]
|
481
|
+
x_eval = xpx.at(x_eval)[ir].set(work.x[ir][:, xp.newaxis] + hr[ir])
|
482
|
+
x_eval = xpx.at(x_eval)[ic].set(work.x[ic][:, xp.newaxis] + hc[ic])
|
483
|
+
x_eval = xpx.at(x_eval)[il].set(work.x[il][:, xp.newaxis] - hr[il])
|
483
484
|
return x_eval
|
484
485
|
|
485
486
|
def post_func_eval(x, f, work):
|
@@ -529,14 +530,14 @@ def derivative(f, x, *, args=(), tolerances=None, maxiter=10,
|
|
529
530
|
fo = xp.concat((work_fo[:, 0:1], work_fo[:, -2*n:]), axis=-1)
|
530
531
|
|
531
532
|
work.fs = xp.zeros((ic.shape[0], work.fs.shape[-1] + 2*n_new), dtype=work.dtype)
|
532
|
-
work.fs[ic]
|
533
|
-
work.fs[io]
|
533
|
+
work.fs = xpx.at(work.fs)[ic].set(work_fc)
|
534
|
+
work.fs = xpx.at(work.fs)[io].set(work_fo)
|
534
535
|
|
535
536
|
wc, wo = _derivative_weights(work, n, xp)
|
536
537
|
work.df_last = xp.asarray(work.df, copy=True)
|
537
|
-
work.df[ic]
|
538
|
-
work.df[io]
|
539
|
-
work.df[il]
|
538
|
+
work.df = xpx.at(work.df)[ic].set(fc @ wc / work.h[ic])
|
539
|
+
work.df = xpx.at(work.df)[io].set(fo @ wo / work.h[io])
|
540
|
+
work.df = xpx.at(work.df)[il].multiply(-1)
|
540
541
|
|
541
542
|
work.h /= work.fac
|
542
543
|
work.error_last = work.error
|
@@ -554,13 +555,14 @@ def derivative(f, x, *, args=(), tolerances=None, maxiter=10,
|
|
554
555
|
stop = xp.astype(xp.zeros_like(work.df), xp.bool)
|
555
556
|
|
556
557
|
i = work.error < work.atol + work.rtol*abs(work.df)
|
557
|
-
work.status[i]
|
558
|
-
stop[i]
|
558
|
+
work.status = xpx.at(work.status)[i].set(eim._ECONVERGED)
|
559
|
+
stop = xpx.at(stop)[i].set(True)
|
559
560
|
|
560
561
|
if work.nit > 0:
|
561
562
|
i = ~((xp.isfinite(work.x) & xp.isfinite(work.df)) | stop)
|
562
|
-
work.df
|
563
|
-
|
563
|
+
work.df = xpx.at(work.df)[i].set(xp.nan)
|
564
|
+
work.status = xpx.at(work.status)[i].set(eim._EVALUEERR)
|
565
|
+
stop = xpx.at(stop)[i].set(True)
|
564
566
|
|
565
567
|
# With infinite precision, there is a step size below which
|
566
568
|
# all smaller step sizes will reduce the error. But in floating point
|
@@ -570,8 +572,8 @@ def derivative(f, x, *, args=(), tolerances=None, maxiter=10,
|
|
570
572
|
# detecting a step size that minimizes the total error, but this
|
571
573
|
# heuristic seems simple and effective.
|
572
574
|
i = (work.error > work.error_last*10) & ~stop
|
573
|
-
work.status[i]
|
574
|
-
stop[i]
|
575
|
+
work.status = xpx.at(work.status)[i].set(_EERRORINCREASE)
|
576
|
+
stop = xpx.at(stop)[i].set(True)
|
575
577
|
|
576
578
|
return stop
|
577
579
|
|
@@ -906,9 +908,7 @@ def jacobian(f, x, *, tolerances=None, maxiter=10, order=8, initial_step=0.5,
|
|
906
908
|
|
907
909
|
"""
|
908
910
|
xp = array_namespace(x)
|
909
|
-
x = xp
|
910
|
-
int_dtype = xp.isdtype(x.dtype, 'integral')
|
911
|
-
x0 = xp.asarray(x, dtype=xp.asarray(1.0).dtype) if int_dtype else x
|
911
|
+
x0 = xp_promote(x, force_floating=True, xp=xp)
|
912
912
|
|
913
913
|
if x0.ndim < 1:
|
914
914
|
message = "Argument `x` must be at least 1-D."
|
@@ -925,7 +925,7 @@ def jacobian(f, x, *, tolerances=None, maxiter=10, order=8, initial_step=0.5,
|
|
925
925
|
if x.ndim != x0.ndim:
|
926
926
|
xph = xp.expand_dims(xph, axis=-1)
|
927
927
|
xph = xp_copy(xp.broadcast_to(xph, new_shape), xp=xp)
|
928
|
-
xph[i, i]
|
928
|
+
xph = xpx.at(xph)[i, i].set(x)
|
929
929
|
return f(xph)
|
930
930
|
|
931
931
|
res = derivative(wrapped, x, tolerances=tolerances,
|
@@ -1097,9 +1097,9 @@ def hessian(f, x, *, tolerances=None, maxiter=10,
|
|
1097
1097
|
rtol = tolerances.get('rtol', None)
|
1098
1098
|
|
1099
1099
|
xp = array_namespace(x)
|
1100
|
-
x = xp
|
1101
|
-
|
1102
|
-
finfo = xp.finfo(dtype)
|
1100
|
+
x0 = xp_promote(x, force_floating=True, xp=xp)
|
1101
|
+
|
1102
|
+
finfo = xp.finfo(x0.dtype)
|
1103
1103
|
rtol = finfo.eps**0.5 if rtol is None else rtol # keep same as `derivative`
|
1104
1104
|
|
1105
1105
|
# tighten the inner tolerance to make the inner error negligible
|
@@ -1121,7 +1121,7 @@ def hessian(f, x, *, tolerances=None, maxiter=10,
|
|
1121
1121
|
|
1122
1122
|
nfev = xp.cumulative_sum(xp.stack(nfev), axis=0)
|
1123
1123
|
res_nit = xp.astype(res.nit[xp.newaxis, ...], xp.int64) # appease torch
|
1124
|
-
res.nfev =
|
1124
|
+
res.nfev = xp.take_along_axis(nfev, res_nit, axis=0)[0]
|
1125
1125
|
res.ddf = res.df
|
1126
1126
|
del res.df # this is renamed to ddf
|
1127
1127
|
del res.nit # this is only the outer-jacobian nit
|
@@ -3,24 +3,20 @@ import pytest
|
|
3
3
|
|
4
4
|
import numpy as np
|
5
5
|
|
6
|
-
from scipy.conftest import array_api_compatible
|
7
6
|
import scipy._lib._elementwise_iterative_method as eim
|
7
|
+
import scipy._lib.array_api_extra as xpx
|
8
8
|
from scipy._lib._array_api_no_0d import xp_assert_close, xp_assert_equal, xp_assert_less
|
9
|
-
from scipy._lib._array_api import is_numpy, is_torch
|
9
|
+
from scipy._lib._array_api import is_numpy, is_torch
|
10
10
|
|
11
11
|
from scipy import stats, optimize, special
|
12
12
|
from scipy.differentiate import derivative, jacobian, hessian
|
13
13
|
from scipy.differentiate._differentiate import _EERRORINCREASE
|
14
14
|
|
15
|
-
|
16
|
-
pytestmark = [array_api_compatible, pytest.mark.usefixtures("skip_xp_backends")]
|
17
|
-
|
18
15
|
array_api_strict_skip_reason = 'Array API does not support fancy indexing assignment.'
|
19
|
-
jax_skip_reason = 'JAX arrays do not support item assignment.'
|
20
16
|
|
21
17
|
|
22
18
|
@pytest.mark.skip_xp_backends('array_api_strict', reason=array_api_strict_skip_reason)
|
23
|
-
@pytest.mark.skip_xp_backends('
|
19
|
+
@pytest.mark.skip_xp_backends('dask.array', reason='boolean indexing assignment')
|
24
20
|
class TestDerivative:
|
25
21
|
|
26
22
|
def f(self, x):
|
@@ -40,7 +36,7 @@ class TestDerivative:
|
|
40
36
|
|
41
37
|
@pytest.mark.skip_xp_backends(np_only=True)
|
42
38
|
@pytest.mark.parametrize('case', stats._distr_params.distcont)
|
43
|
-
def test_accuracy(self, case):
|
39
|
+
def test_accuracy(self, case, xp):
|
44
40
|
distname, params = case
|
45
41
|
dist = getattr(stats, distname)(*params)
|
46
42
|
x = dist.median() + 0.1
|
@@ -215,12 +211,13 @@ class TestDerivative:
|
|
215
211
|
# test that `step_direction` works as expected
|
216
212
|
def f(x):
|
217
213
|
y = xp.exp(x)
|
218
|
-
y[(x < 0) + (x > 2)]
|
214
|
+
y = xpx.at(y)[(x < 0) + (x > 2)].set(xp.nan)
|
219
215
|
return y
|
220
216
|
|
221
217
|
x = xp.linspace(0, 2, 10)
|
222
218
|
step_direction = xp.zeros_like(x)
|
223
|
-
step_direction[x < 0.6]
|
219
|
+
step_direction = xpx.at(step_direction)[x < 0.6].set(1)
|
220
|
+
step_direction = xpx.at(step_direction)[x > 1.4].set(-1)
|
224
221
|
res = derivative(f, x, step_direction=step_direction)
|
225
222
|
xp_assert_close(res.df, xp.exp(x))
|
226
223
|
assert xp.all(res.success)
|
@@ -380,8 +377,7 @@ class TestDerivative:
|
|
380
377
|
# Test that integers are not passed to `f`
|
381
378
|
# (otherwise this would overflow)
|
382
379
|
def f(x):
|
383
|
-
|
384
|
-
assert xp_test.isdtype(x.dtype, 'real floating')
|
380
|
+
assert xp.isdtype(x.dtype, 'real floating')
|
385
381
|
return x ** 99 - 1
|
386
382
|
|
387
383
|
if not is_torch(xp): # torch defaults to float32
|
@@ -435,7 +431,7 @@ class TestDerivative:
|
|
435
431
|
(lambda x: (x - 1) ** 3, 1),
|
436
432
|
(lambda x: np.where(x > 1, (x - 1) ** 5, (x - 1) ** 3), 1)
|
437
433
|
))
|
438
|
-
def test_saddle_gh18811(self, case):
|
434
|
+
def test_saddle_gh18811(self, case, xp):
|
439
435
|
# With default settings, `derivative` will not always converge when
|
440
436
|
# the true derivative is exactly zero. This tests that specifying a
|
441
437
|
# (tight) `atol` alleviates the problem. See discussion in gh-18811.
|
@@ -476,7 +472,7 @@ class JacobianHessianTest:
|
|
476
472
|
|
477
473
|
|
478
474
|
@pytest.mark.skip_xp_backends('array_api_strict', reason=array_api_strict_skip_reason)
|
479
|
-
@pytest.mark.skip_xp_backends('
|
475
|
+
@pytest.mark.skip_xp_backends('dask.array', reason='boolean indexing assignment')
|
480
476
|
class TestJacobian(JacobianHessianTest):
|
481
477
|
jh_func = jacobian
|
482
478
|
|
@@ -586,9 +582,10 @@ class TestJacobian(JacobianHessianTest):
|
|
586
582
|
return xp.sin(2*x) * y**2
|
587
583
|
|
588
584
|
res = jacobian(df1, z, initial_step=10)
|
589
|
-
|
590
|
-
|
591
|
-
assert
|
585
|
+
# FIXME https://github.com/scipy/scipy/pull/22320#discussion_r1914898175
|
586
|
+
if not is_torch(xp):
|
587
|
+
assert xpx.nunique(res.nit) == 4
|
588
|
+
assert xpx.nunique(res.nfev) == 4
|
592
589
|
|
593
590
|
res00 = jacobian(lambda x: df1_0xy(x, z[1]), z[0:1], initial_step=10)
|
594
591
|
res01 = jacobian(lambda y: df1_0xy(z[0], y), z[1:2], initial_step=10)
|
@@ -598,7 +595,10 @@ class TestJacobian(JacobianHessianTest):
|
|
598
595
|
for attr in ['success', 'status', 'df', 'nit', 'nfev']:
|
599
596
|
ref_attr = xp.asarray([[getattr(res00, attr), getattr(res01, attr)],
|
600
597
|
[getattr(res10, attr), getattr(res11, attr)]])
|
601
|
-
ref[attr] = xp.squeeze(
|
598
|
+
ref[attr] = xp.squeeze(
|
599
|
+
ref_attr,
|
600
|
+
axis=tuple(ax for ax, size in enumerate(ref_attr.shape) if size == 1)
|
601
|
+
)
|
602
602
|
rtol = 1.5e-5 if res[attr].dtype == xp.float32 else 1.5e-14
|
603
603
|
xp_assert_close(res[attr], ref[attr], rtol=rtol)
|
604
604
|
|
@@ -610,10 +610,10 @@ class TestJacobian(JacobianHessianTest):
|
|
610
610
|
eps = 1e-7 # torch needs wiggle room?
|
611
611
|
|
612
612
|
def f(x):
|
613
|
-
x[0, x[0] < b[0]]
|
614
|
-
x[0, x[0] > b[0] + 0.25]
|
615
|
-
x[1, x[1] > b[1]]
|
616
|
-
x[1, x[1] < b[1] - 0.1-eps]
|
613
|
+
x = xpx.at(x)[0, x[0] < b[0]].set(xp.nan)
|
614
|
+
x = xpx.at(x)[0, x[0] > b[0] + 0.25].set(xp.nan)
|
615
|
+
x = xpx.at(x)[1, x[1] > b[1]].set(xp.nan)
|
616
|
+
x = xpx.at(x)[1, x[1] < b[1] - 0.1-eps].set(xp.nan)
|
617
617
|
return TestJacobian.f5(x, xp)
|
618
618
|
|
619
619
|
dir = [1, -1, 0]
|
@@ -627,7 +627,7 @@ class TestJacobian(JacobianHessianTest):
|
|
627
627
|
|
628
628
|
|
629
629
|
@pytest.mark.skip_xp_backends('array_api_strict', reason=array_api_strict_skip_reason)
|
630
|
-
@pytest.mark.skip_xp_backends('
|
630
|
+
@pytest.mark.skip_xp_backends('dask.array', reason='boolean indexing assignment')
|
631
631
|
class TestHessian(JacobianHessianTest):
|
632
632
|
jh_func = hessian
|
633
633
|
|
@@ -663,10 +663,9 @@ class TestHessian(JacobianHessianTest):
|
|
663
663
|
|
664
664
|
def test_nfev(self, xp):
|
665
665
|
z = xp.asarray([0.5, 0.25])
|
666
|
-
xp_test = array_namespace(z)
|
667
666
|
|
668
667
|
def f1(z):
|
669
|
-
x, y =
|
668
|
+
x, y = xp.broadcast_arrays(*z)
|
670
669
|
f1.nfev = f1.nfev + (math.prod(x.shape[2:]) if x.ndim > 2 else 1)
|
671
670
|
return xp.sin(x) * y ** 3
|
672
671
|
f1.nfev = 0
|
scipy/fft/_basic.py
CHANGED
@@ -1166,6 +1166,17 @@ def rfft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None,
|
|
1166
1166
|
This is really just `rfftn` with different default behavior.
|
1167
1167
|
For more details see `rfftn`.
|
1168
1168
|
|
1169
|
+
Examples
|
1170
|
+
--------
|
1171
|
+
>>> import scipy.fft
|
1172
|
+
>>> import numpy as np
|
1173
|
+
>>> x = np.broadcast_to([1, 0, -1, 0], (4, 4))
|
1174
|
+
>>> scipy.fft.rfft2(x)
|
1175
|
+
array([[0.+0.j, 8.+0.j, 0.+0.j],
|
1176
|
+
[0.+0.j, 0.+0.j, 0.+0.j],
|
1177
|
+
[0.+0.j, 0.+0.j, 0.+0.j],
|
1178
|
+
[0.+0.j, 0.+0.j, 0.+0.j]])
|
1179
|
+
|
1169
1180
|
"""
|
1170
1181
|
return (Dispatchable(x, np.ndarray),)
|
1171
1182
|
|
@@ -1484,6 +1495,15 @@ def hfft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None,
|
|
1484
1495
|
This is really just `hfftn` with different default behavior.
|
1485
1496
|
For more details see `hfftn`.
|
1486
1497
|
|
1498
|
+
Examples
|
1499
|
+
--------
|
1500
|
+
>>> import scipy.fft
|
1501
|
+
>>> import numpy as np
|
1502
|
+
>>> x = np.array([[1+0j, 2+0j], [2+0j, 1+0j]]) # Hermitian-symmetric input
|
1503
|
+
>>> scipy.fft.hfft2(x, s=(2, 2))
|
1504
|
+
array([[ 6., 0.],
|
1505
|
+
[ 0., -2.]])
|
1506
|
+
|
1487
1507
|
"""
|
1488
1508
|
return (Dispatchable(x, np.ndarray),)
|
1489
1509
|
|
scipy/fft/_helper.py
CHANGED
@@ -7,6 +7,9 @@ import numpy as np
|
|
7
7
|
from scipy._lib._array_api import array_namespace
|
8
8
|
|
9
9
|
|
10
|
+
_init_nd_shape_and_axes = _helper._init_nd_shape_and_axes
|
11
|
+
|
12
|
+
|
10
13
|
def next_fast_len(target, real=False):
|
11
14
|
"""Find the next fast size of input data to ``fft``, for zero-padding, etc.
|
12
15
|
|
@@ -140,40 +143,6 @@ prev_fast_len.__wrapped__ = _helper.prev_good_size
|
|
140
143
|
prev_fast_len.__signature__ = _sig_prev_fast_len
|
141
144
|
|
142
145
|
|
143
|
-
def _init_nd_shape_and_axes(x, shape, axes):
|
144
|
-
"""Handle shape and axes arguments for N-D transforms.
|
145
|
-
|
146
|
-
Returns the shape and axes in a standard form, taking into account negative
|
147
|
-
values and checking for various potential errors.
|
148
|
-
|
149
|
-
Parameters
|
150
|
-
----------
|
151
|
-
x : array_like
|
152
|
-
The input array.
|
153
|
-
shape : int or array_like of ints or None
|
154
|
-
The shape of the result. If both `shape` and `axes` (see below) are
|
155
|
-
None, `shape` is ``x.shape``; if `shape` is None but `axes` is
|
156
|
-
not None, then `shape` is ``numpy.take(x.shape, axes, axis=0)``.
|
157
|
-
If `shape` is -1, the size of the corresponding dimension of `x` is
|
158
|
-
used.
|
159
|
-
axes : int or array_like of ints or None
|
160
|
-
Axes along which the calculation is computed.
|
161
|
-
The default is over all axes.
|
162
|
-
Negative indices are automatically converted to their positive
|
163
|
-
counterparts.
|
164
|
-
|
165
|
-
Returns
|
166
|
-
-------
|
167
|
-
shape : tuple
|
168
|
-
The shape of the result as a tuple of integers.
|
169
|
-
axes : list
|
170
|
-
Axes along which the calculation is computed, as a list of integers.
|
171
|
-
|
172
|
-
"""
|
173
|
-
x = np.asarray(x)
|
174
|
-
return _helper._init_nd_shape_and_axes(x, shape, axes)
|
175
|
-
|
176
|
-
|
177
146
|
def fftfreq(n, d=1.0, *, xp=None, device=None):
|
178
147
|
"""Return the Discrete Fourier Transform sample frequencies.
|
179
148
|
|
scipy/fft/_pocketfft/helper.py
CHANGED
@@ -44,7 +44,35 @@ def _iterable_of_int(x, name=None):
|
|
44
44
|
|
45
45
|
|
46
46
|
def _init_nd_shape_and_axes(x, shape, axes):
|
47
|
-
"""
|
47
|
+
"""
|
48
|
+
Handle shape and axes arguments for N-D transforms.
|
49
|
+
|
50
|
+
Returns the shape and axes in a standard form, taking into account negative
|
51
|
+
values and checking for various potential errors.
|
52
|
+
|
53
|
+
Parameters
|
54
|
+
----------
|
55
|
+
x : ndarray
|
56
|
+
The input array.
|
57
|
+
shape : int or array_like of ints or None
|
58
|
+
The shape of the result. If both `shape` and `axes` (see below) are
|
59
|
+
None, `shape` is ``x.shape``; if `shape` is None but `axes` is
|
60
|
+
not None, then `shape` is ``numpy.take(x.shape, axes, axis=0)``.
|
61
|
+
If `shape` is -1, the size of the corresponding dimension of `x` is
|
62
|
+
used.
|
63
|
+
axes : int or array_like of ints or None
|
64
|
+
Axes along which the calculation is computed.
|
65
|
+
The default is over all axes.
|
66
|
+
Negative indices are automatically converted to their positive
|
67
|
+
counterparts.
|
68
|
+
|
69
|
+
Returns
|
70
|
+
-------
|
71
|
+
shape : tuple
|
72
|
+
The shape of the result as a tuple of integers.
|
73
|
+
axes : list
|
74
|
+
Axes along which the calculation is computed, as a list of integers.
|
75
|
+
"""
|
48
76
|
noshape = shape is None
|
49
77
|
noaxes = axes is None
|
50
78
|
|
Binary file
|
Binary file
|
@@ -406,10 +406,8 @@ class _TestIRFFTBase:
|
|
406
406
|
y2 = rfft(irfft(x, n=(size*2-1)))
|
407
407
|
assert_equal(y1.dtype, self.rdt)
|
408
408
|
assert_equal(y2.dtype, self.cdt)
|
409
|
-
assert_array_almost_equal(y1, x, decimal=self.ndec,
|
410
|
-
|
411
|
-
assert_array_almost_equal(y2, x, decimal=self.ndec,
|
412
|
-
err_msg="size=%d" % size)
|
409
|
+
assert_array_almost_equal(y1, x, decimal=self.ndec, err_msg=f"size={size}")
|
410
|
+
assert_array_almost_equal(y2, x, decimal=self.ndec, err_msg=f"size={size}")
|
413
411
|
|
414
412
|
def test_size_accuracy(self):
|
415
413
|
# Sanity check for the accuracy for prime and non-prime sized inputs
|
@@ -30,8 +30,8 @@ def is_longdouble_binary_compatible():
|
|
30
30
|
def reference_data():
|
31
31
|
# Matlab reference data
|
32
32
|
MDATA = np.load(join(fftpack_test_dir, 'test.npz'))
|
33
|
-
X = [MDATA['x
|
34
|
-
Y = [MDATA['y
|
33
|
+
X = [MDATA[f'x{i}'] for i in range(MDATA_COUNT)]
|
34
|
+
Y = [MDATA[f'y{i}'] for i in range(MDATA_COUNT)]
|
35
35
|
|
36
36
|
# FFTW reference data: the data are organized as follows:
|
37
37
|
# * SIZES is an array containing all available sizes
|
@@ -100,7 +100,7 @@ def fftw_dct_ref(type, size, dt, reference_data):
|
|
100
100
|
data = reference_data['FFTWDATA_LONGDOUBLE']
|
101
101
|
else:
|
102
102
|
raise ValueError()
|
103
|
-
y = (data['dct_
|
103
|
+
y = (data[f'dct_{type}_{size}']).astype(dt)
|
104
104
|
return x, y, dt
|
105
105
|
|
106
106
|
|
@@ -115,7 +115,7 @@ def fftw_dst_ref(type, size, dt, reference_data):
|
|
115
115
|
data = reference_data['FFTWDATA_LONGDOUBLE']
|
116
116
|
else:
|
117
117
|
raise ValueError()
|
118
|
-
y = (data['dst_
|
118
|
+
y = (data[f'dst_{type}_{size}']).astype(dt)
|
119
119
|
return x, y, dt
|
120
120
|
|
121
121
|
|
scipy/fft/_realtransforms.py
CHANGED
@@ -621,6 +621,19 @@ def dst(x, type=2, n=None, axis=-1, norm=None, overwrite_x=False, workers=None,
|
|
621
621
|
The (unnormalized) DST-IV is its own inverse, up to a factor :math:`2N`. The
|
622
622
|
orthonormalized DST-IV is exactly its own inverse.
|
623
623
|
|
624
|
+
Examples
|
625
|
+
--------
|
626
|
+
Compute the DST of a simple 1D array:
|
627
|
+
|
628
|
+
>>> import numpy as np
|
629
|
+
>>> from scipy.fft import dst
|
630
|
+
>>> x = np.array([1, -1, 1, -1])
|
631
|
+
>>> dst(x, type=2)
|
632
|
+
array([0., 0., 0., 8.])
|
633
|
+
|
634
|
+
This computes the Discrete Sine Transform (DST) of type-II for the input array.
|
635
|
+
The output contains the transformed values corresponding to the given input sequence
|
636
|
+
|
624
637
|
References
|
625
638
|
----------
|
626
639
|
.. [1] Wikipedia, "Discrete sine transform",
|
scipy/fft/tests/test_basic.py
CHANGED
@@ -7,12 +7,10 @@ from numpy.random import random
|
|
7
7
|
from numpy.testing import assert_array_almost_equal, assert_allclose
|
8
8
|
from pytest import raises as assert_raises
|
9
9
|
import scipy.fft as fft
|
10
|
-
from scipy.conftest import array_api_compatible
|
11
10
|
from scipy._lib._array_api import (
|
12
|
-
|
11
|
+
is_numpy, xp_size, xp_assert_close, xp_assert_equal
|
13
12
|
)
|
14
13
|
|
15
|
-
pytestmark = [array_api_compatible, pytest.mark.usefixtures("skip_xp_backends")]
|
16
14
|
skip_xp_backends = pytest.mark.skip_xp_backends
|
17
15
|
|
18
16
|
|
@@ -230,10 +228,10 @@ class TestFFT:
|
|
230
228
|
dtype = get_expected_input_dtype(op, xp)
|
231
229
|
x = xp.asarray(random((30, 20, 10)), dtype=dtype)
|
232
230
|
axes = [(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
|
233
|
-
|
231
|
+
|
234
232
|
for a in axes:
|
235
|
-
op_tr = op(
|
236
|
-
tr_op =
|
233
|
+
op_tr = op(xp.permute_dims(x, axes=a))
|
234
|
+
tr_op = xp.permute_dims(op(x, axes=a), axes=a)
|
237
235
|
xp_assert_close(op_tr, tr_op)
|
238
236
|
|
239
237
|
@pytest.mark.parametrize("op", [fft.fftn, fft.ifftn, fft.rfftn, fft.irfftn])
|
@@ -250,15 +248,15 @@ class TestFFT:
|
|
250
248
|
dtype = get_expected_input_dtype(op, xp)
|
251
249
|
x = xp.asarray(random((16, 8, 4)), dtype=dtype)
|
252
250
|
axes = [(0, 1, 2), (0, 2, 1), (1, 2, 0)]
|
253
|
-
|
251
|
+
|
254
252
|
for a in axes:
|
255
253
|
# different shape on the first two axes
|
256
254
|
shape = tuple([2*x.shape[ax] if ax in a[:2] else x.shape[ax]
|
257
255
|
for ax in range(x.ndim)])
|
258
256
|
# transform only the first two axes
|
259
|
-
op_tr = op(
|
257
|
+
op_tr = op(xp.permute_dims(x, axes=a),
|
260
258
|
s=shape[:2], axes=(0, 1))
|
261
|
-
tr_op =
|
259
|
+
tr_op = xp.permute_dims(op(x, s=shape[:2], axes=a[:2]),
|
262
260
|
axes=a)
|
263
261
|
xp_assert_close(op_tr, tr_op)
|
264
262
|
|
@@ -270,21 +268,21 @@ class TestFFT:
|
|
270
268
|
dtype = get_expected_input_dtype(op, xp)
|
271
269
|
x = xp.asarray(random((16, 8, 4)), dtype=dtype)
|
272
270
|
axes = [(0, 1, 2), (0, 2, 1), (1, 2, 0)]
|
273
|
-
|
271
|
+
|
274
272
|
for a in axes:
|
275
273
|
# different shape on the first two axes
|
276
274
|
shape = tuple([2*x.shape[ax] if ax in a[:2] else x.shape[ax]
|
277
275
|
for ax in range(x.ndim)])
|
278
276
|
# transform only the first two axes
|
279
|
-
op_tr = op(
|
280
|
-
tr_op =
|
277
|
+
op_tr = op(xp.permute_dims(x, axes=a), s=shape[:2], axes=(0, 1))
|
278
|
+
tr_op = xp.permute_dims(op(x, s=shape[:2], axes=a[:2]), axes=a)
|
281
279
|
xp_assert_close(op_tr, tr_op)
|
282
280
|
|
283
281
|
def test_all_1d_norm_preserving(self, xp):
|
284
282
|
# verify that round-trip transforms are norm-preserving
|
285
283
|
x = xp.asarray(random(30), dtype=xp.float64)
|
286
|
-
|
287
|
-
x_norm =
|
284
|
+
|
285
|
+
x_norm = xp.linalg.vector_norm(x)
|
288
286
|
n = xp_size(x) * 2
|
289
287
|
func_pairs = [(fft.rfft, fft.irfft),
|
290
288
|
# hfft: order so the first function takes x.size samples
|
@@ -296,16 +294,16 @@ class TestFFT:
|
|
296
294
|
for forw, back in func_pairs:
|
297
295
|
if forw == fft.fft:
|
298
296
|
x = xp.asarray(x, dtype=xp.complex128)
|
299
|
-
x_norm =
|
297
|
+
x_norm = xp.linalg.vector_norm(x)
|
300
298
|
for n in [xp_size(x), 2*xp_size(x)]:
|
301
299
|
for norm in ['backward', 'ortho', 'forward']:
|
302
300
|
tmp = forw(x, n=n, norm=norm)
|
303
301
|
tmp = back(tmp, n=n, norm=norm)
|
304
|
-
xp_assert_close(
|
302
|
+
xp_assert_close(xp.linalg.vector_norm(tmp), x_norm)
|
305
303
|
|
306
304
|
@skip_xp_backends(np_only=True)
|
307
305
|
@pytest.mark.parametrize("dtype", [np.float16, np.longdouble])
|
308
|
-
def test_dtypes_nonstandard(self, dtype):
|
306
|
+
def test_dtypes_nonstandard(self, dtype, xp):
|
309
307
|
x = random(30).astype(dtype)
|
310
308
|
out_dtypes = {np.float16: np.complex64, np.longdouble: np.clongdouble}
|
311
309
|
x_complex = x.astype(out_dtypes[dtype])
|
@@ -368,7 +366,7 @@ class TestFFT:
|
|
368
366
|
"fft",
|
369
367
|
[fft.fft, fft.fft2, fft.fftn,
|
370
368
|
fft.ifft, fft.ifft2, fft.ifftn])
|
371
|
-
def test_fft_with_order(dtype, order, fft):
|
369
|
+
def test_fft_with_order(dtype, order, fft, xp):
|
372
370
|
# Check that FFT/IFFT produces identical results for C, Fortran and
|
373
371
|
# non contiguous arrays
|
374
372
|
rng = np.random.RandomState(42)
|
@@ -450,7 +448,7 @@ class TestFFTThreadSafe:
|
|
450
448
|
|
451
449
|
@skip_xp_backends(np_only=True)
|
452
450
|
@pytest.mark.parametrize("func", [fft.fft, fft.ifft, fft.rfft, fft.irfft])
|
453
|
-
def test_multiprocess(func):
|
451
|
+
def test_multiprocess(func, xp):
|
454
452
|
# Test that fft still works after fork (gh-10422)
|
455
453
|
|
456
454
|
with multiprocessing.Pool(2) as p:
|
@@ -483,13 +481,17 @@ def test_non_standard_params(func, xp):
|
|
483
481
|
else:
|
484
482
|
dtype = xp.complex128
|
485
483
|
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
484
|
+
x = xp.asarray([1, 2, 3], dtype=dtype)
|
485
|
+
# func(x) should not raise an exception
|
486
|
+
func(x)
|
487
|
+
|
488
|
+
if is_numpy(xp):
|
489
|
+
func(x, workers=2)
|
490
|
+
else:
|
490
491
|
assert_raises(ValueError, func, x, workers=2)
|
491
|
-
|
492
|
-
|
492
|
+
|
493
|
+
# `plan` param is not tested since SciPy does not use it currently
|
494
|
+
# but should be tested if it comes into use
|
493
495
|
|
494
496
|
|
495
497
|
@pytest.mark.parametrize("dtype", ['float32', 'float64'])
|