scipy 1.15.2__cp312-cp312-win_amd64.whl → 1.16.0rc1__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 +7 -7
- scipy/__init__.py +6 -9
- scipy/_cyutility.cp312-win_amd64.dll.a +0 -0
- scipy/_cyutility.cp312-win_amd64.pyd +0 -0
- scipy/_lib/_array_api.py +497 -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 +169 -34
- 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/_ivp/common.py +3 -3
- scipy/integrate/_ivp/ivp.py +9 -2
- scipy/integrate/_ivp/tests/test_ivp.py +19 -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 +57 -54
- 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 +61 -43
- 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_interpolative.py +17 -0
- 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 +433 -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/_ndimage_api.py +2 -1
- 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 +351 -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 +46 -26
- 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/_highspy/_highs_wrapper.py +6 -4
- 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 +11 -11
- scipy/optimize/_linprog_ip.py +25 -10
- scipy/optimize/_linprog_util.py +18 -19
- 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 +71 -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 +5 -5
- 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 +553 -76
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +719 -396
- 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 +221 -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 +5 -182
- 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 +231 -5
- scipy/signal/tests/test_signaltools.py +2149 -1348
- scipy/signal/tests/test_spectral.py +19 -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 +269 -120
- scipy/sparse/_bsr.py +7 -4
- scipy/sparse/_compressed.py +59 -234
- 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 -21
- 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 +28 -20
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
- scipy/sparse/linalg/_expm_multiply.py +8 -3
- scipy/sparse/linalg/_interface.py +29 -26
- scipy/sparse/linalg/_isolve/_gcrotmk.py +6 -5
- 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_expm_multiply.py +10 -0
- scipy/sparse/linalg/tests/test_interface.py +35 -0
- scipy/sparse/linalg/tests/test_pydata_sparse.py +18 -0
- scipy/sparse/tests/test_arithmetic1d.py +5 -2
- scipy/sparse/tests/test_base.py +217 -40
- scipy/sparse/tests/test_common1d.py +17 -12
- 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 +3 -1
- scipy/spatial/tests/test_kdtree.py +1 -0
- scipy/spatial/tests/test_qhull.py +106 -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 +1342 -790
- 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 +83 -69
- 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 +23 -2
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_logsumexp.py +220 -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 +4 -3
- 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 +296 -319
- 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 +7 -8
- scipy/{_lib → stats}/_finite_differences.py +1 -1
- scipy/stats/_hypotests.py +82 -49
- 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 +112 -67
- 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 +19 -2
- scipy/stats/_stats_py.py +534 -460
- 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 +5 -7
- 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 +117 -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.0rc1.dist-info/DELVEWHEEL +2 -0
- {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/LICENSE.txt +1 -1
- {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/METADATA +9 -9
- {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/RECORD +693 -701
- 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.2.dist-info/DELVEWHEEL +0 -2
- /scipy-1.15.2-cp312-cp312-win_amd64.whl → /scipy-1.16.0rc1-cp312-cp312-win_amd64.whl +0 -0
- {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/WHEEL +0 -0
@@ -10,7 +10,7 @@ from pytest import raises as assert_raises
|
|
10
10
|
from scipy import signal
|
11
11
|
from scipy.fft import fftfreq, rfftfreq, fft, irfft
|
12
12
|
from scipy.integrate import trapezoid
|
13
|
-
from scipy.signal import (periodogram, welch, lombscargle, coherence,
|
13
|
+
from scipy.signal import (periodogram, welch, lombscargle, coherence, csd,
|
14
14
|
spectrogram, check_COLA, check_NOLA)
|
15
15
|
from scipy.signal.windows import hann
|
16
16
|
from scipy.signal._spectral_py import _spectral_helper
|
@@ -18,7 +18,6 @@ from scipy.signal._spectral_py import _spectral_helper
|
|
18
18
|
# Compare ShortTimeFFT.stft() / ShortTimeFFT.istft() with stft() / istft():
|
19
19
|
from scipy.signal.tests._scipy_spectral_test_shim import stft_compare as stft
|
20
20
|
from scipy.signal.tests._scipy_spectral_test_shim import istft_compare as istft
|
21
|
-
from scipy.signal.tests._scipy_spectral_test_shim import csd_compare as csd
|
22
21
|
|
23
22
|
|
24
23
|
class TestPeriodogram:
|
@@ -416,8 +415,7 @@ class TestWelch:
|
|
416
415
|
#for string-like window, input signal length < nperseg value gives
|
417
416
|
#UserWarning, sets nperseg to x.shape[-1]
|
418
417
|
with suppress_warnings() as sup:
|
419
|
-
|
420
|
-
sup.filter(UserWarning, msg)
|
418
|
+
sup.filter(UserWarning, "nperseg=256 is greater than signal.*")
|
421
419
|
f, p = welch(x,window='hann') # default nperseg
|
422
420
|
f1, p1 = welch(x,window='hann', nperseg=256) # user-specified nperseg
|
423
421
|
f2, p2 = welch(x, nperseg=8) # valid nperseg, doesn't give warning
|
@@ -560,6 +558,15 @@ class TestWelch:
|
|
560
558
|
assert_raises(ValueError, welch, x, nperseg=8,
|
561
559
|
average='unrecognised-average')
|
562
560
|
|
561
|
+
def test_ratio_scale_to(self):
|
562
|
+
"""Verify the factor of ``sum(abs(window)**2)*fs / abs(sum(window))**2``
|
563
|
+
used in the `welch` and `csd` docstrs. """
|
564
|
+
x, win, fs = np.array([1., 0, 0, 0]), np.ones(4), 12
|
565
|
+
params = dict(fs=fs, window=win, return_onesided=False, detrend=None)
|
566
|
+
p_dens = welch(x, scaling='density', **params)[1]
|
567
|
+
p_spec = welch(x, scaling='spectrum', **params)[1]
|
568
|
+
p_fac = sum(win**2)*fs / abs(sum(win))**2
|
569
|
+
assert_allclose(p_spec / p_dens, p_fac)
|
563
570
|
|
564
571
|
class TestCSD:
|
565
572
|
def test_pad_shorter_x(self):
|
@@ -735,6 +742,8 @@ class TestCSD:
|
|
735
742
|
win_err = signal.get_window('hann', 32)
|
736
743
|
assert_raises(ValueError, csd, x, x,
|
737
744
|
10, win_err, nperseg=None) # because win longer than signal
|
745
|
+
with pytest.raises(ValueError, match="Parameter nperseg=0.*"):
|
746
|
+
csd(x, x, 0, nperseg=0)
|
738
747
|
|
739
748
|
def test_empty_input(self):
|
740
749
|
f, p = csd([],np.zeros(10))
|
@@ -779,8 +788,7 @@ class TestCSD:
|
|
779
788
|
#for string-like window, input signal length < nperseg value gives
|
780
789
|
#UserWarning, sets nperseg to x.shape[-1]
|
781
790
|
with suppress_warnings() as sup:
|
782
|
-
|
783
|
-
sup.filter(UserWarning, msg)
|
791
|
+
sup.filter(UserWarning, "nperseg=256 is greater than signal length.*")
|
784
792
|
f, p = csd(x, x, window='hann') # default nperseg
|
785
793
|
f1, p1 = csd(x, x, window='hann', nperseg=256) # user-specified nperseg
|
786
794
|
f2, p2 = csd(x, x, nperseg=8) # valid nperseg, doesn't give warning
|
@@ -811,6 +819,11 @@ class TestCSD:
|
|
811
819
|
assert_raises(ValueError, csd, np.ones(12), np.zeros(12), nfft=3,
|
812
820
|
nperseg=4)
|
813
821
|
|
822
|
+
def test_incompatible_inputs(self):
|
823
|
+
with pytest.raises(ValueError, match='x and y cannot be broadcast.*'):
|
824
|
+
csd(np.ones((1, 8, 1)), np.ones((2, 8)), nperseg=4)
|
825
|
+
|
826
|
+
|
814
827
|
def test_real_onesided_even_32(self):
|
815
828
|
x = np.zeros(16, 'f')
|
816
829
|
x[0] = 1
|
@@ -1,12 +1,21 @@
|
|
1
1
|
# pylint: disable=missing-docstring
|
2
|
+
import math
|
2
3
|
import numpy as np
|
3
4
|
import pytest
|
4
|
-
|
5
|
+
import scipy._lib.array_api_extra as xpx
|
6
|
+
from scipy._lib._array_api import is_cupy, xp_assert_close, xp_default_dtype
|
5
7
|
|
6
8
|
from scipy.signal._spline import (
|
7
9
|
symiirorder1_ic, symiirorder2_ic_fwd, symiirorder2_ic_bwd)
|
8
10
|
from scipy.signal import symiirorder1, symiirorder2
|
9
11
|
|
12
|
+
skip_xp_backends = pytest.mark.skip_xp_backends
|
13
|
+
xfail_xp_backends = pytest.mark.xfail_xp_backends
|
14
|
+
|
15
|
+
|
16
|
+
def npr(xp, *args):
|
17
|
+
return xp.concat(tuple(xpx.atleast_nd(x, ndim=1, xp=xp) for x in args))
|
18
|
+
|
10
19
|
|
11
20
|
def _compute_symiirorder2_bwd_hs(k, cs, rsq, omega):
|
12
21
|
cssq = cs * cs
|
@@ -20,13 +29,18 @@ def _compute_symiirorder2_bwd_hs(k, cs, rsq, omega):
|
|
20
29
|
|
21
30
|
|
22
31
|
class TestSymIIR:
|
32
|
+
|
33
|
+
@skip_xp_backends(np_only=True, reason="_ic functions are private and numpy-only")
|
23
34
|
@pytest.mark.parametrize(
|
24
|
-
'dtype', [
|
35
|
+
'dtype', ['float32', 'float64', 'complex64', 'complex128'])
|
25
36
|
@pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
|
26
|
-
def test_symiir1_ic(self, dtype, precision):
|
37
|
+
def test_symiir1_ic(self, dtype, precision, xp):
|
38
|
+
|
39
|
+
dtype = getattr(xp, dtype)
|
40
|
+
|
27
41
|
c_precision = precision
|
28
42
|
if precision <= 0.0 or precision > 1.0:
|
29
|
-
if dtype in {
|
43
|
+
if dtype in {xp.float32, xp.complex64}:
|
30
44
|
c_precision = 1e-6
|
31
45
|
else:
|
32
46
|
c_precision = 1e-11
|
@@ -45,33 +59,34 @@ class TestSymIIR:
|
|
45
59
|
# using the partial sum formula: (1 - b**n) / (1 - b)
|
46
60
|
# This holds due to the input being a step signal.
|
47
61
|
b = 0.85
|
48
|
-
n_exp = int(
|
49
|
-
expected =
|
62
|
+
n_exp = int(math.ceil(math.log(c_precision) / math.log(b)))
|
63
|
+
expected = xp.asarray([[(1 - b ** n_exp) / (1 - b)]], dtype=dtype)
|
50
64
|
expected = 1 + b * expected
|
51
65
|
|
52
66
|
# Create a step signal of size n + 1
|
53
|
-
x =
|
67
|
+
x = xp.ones(n_exp + 1, dtype=dtype)
|
54
68
|
xp_assert_close(symiirorder1_ic(x, b, precision), expected,
|
55
69
|
atol=2e-6, rtol=2e-7)
|
56
70
|
|
57
71
|
# Check the conditions for a exponential decreasing signal with base 2.
|
58
72
|
# Same conditions hold, as the product of 0.5^n * 0.85^n is
|
59
73
|
# still a geometric series
|
60
|
-
b_d =
|
74
|
+
b_d = xp.asarray(b, dtype=dtype)
|
61
75
|
expected = np.asarray(
|
62
76
|
[[(1 - (0.5 * b_d) ** n_exp) / (1 - (0.5 * b_d))]], dtype=dtype)
|
63
77
|
expected = 1 + b_d * expected
|
64
78
|
|
65
79
|
# Create an exponential decreasing signal of size n + 1
|
66
|
-
x = 2 ** -
|
80
|
+
x = 2 ** -xp.arange(n_exp + 1, dtype=dtype)
|
67
81
|
xp_assert_close(symiirorder1_ic(x, b, precision), expected,
|
68
82
|
atol=2e-6, rtol=2e-7)
|
69
83
|
|
70
|
-
|
84
|
+
@skip_xp_backends(np_only=True, reason="_ic functions are private and numpy-only")
|
85
|
+
def test_symiir1_ic_fails(self, xp):
|
71
86
|
# Test that symiirorder1_ic fails whenever \sum_{n = 1}^{n} b^n > eps
|
72
87
|
b = 0.85
|
73
88
|
# Create a step signal of size 100
|
74
|
-
x =
|
89
|
+
x = xp.ones(100, dtype=xp.float64)
|
75
90
|
|
76
91
|
# Compute the closed form for the geometrical series
|
77
92
|
precision = 1 / (1 - b)
|
@@ -81,13 +96,20 @@ class TestSymIIR:
|
|
81
96
|
pytest.raises(ValueError, symiirorder1_ic, x, 1.0, -1)
|
82
97
|
pytest.raises(ValueError, symiirorder1_ic, x, 2.0, -1)
|
83
98
|
|
99
|
+
@skip_xp_backends(
|
100
|
+
cpu_only=True, exceptions=["cupy"], reason="internals are numpy-only"
|
101
|
+
)
|
102
|
+
@xfail_xp_backends("cupy", reason="sum did not converge")
|
103
|
+
@skip_xp_backends("jax.numpy", reason="item assignment in tests")
|
84
104
|
@pytest.mark.parametrize(
|
85
|
-
'dtype', [
|
105
|
+
'dtype', ['float32', 'float64', 'complex64', 'complex128'])
|
86
106
|
@pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
|
87
|
-
def test_symiir1(self, dtype, precision):
|
107
|
+
def test_symiir1(self, dtype, precision, xp):
|
108
|
+
dtype = getattr(xp, dtype)
|
109
|
+
|
88
110
|
c_precision = precision
|
89
111
|
if precision <= 0.0 or precision > 1.0:
|
90
|
-
if dtype in {
|
112
|
+
if dtype in {xp.float32, xp.complex64}:
|
91
113
|
c_precision = 1e-6
|
92
114
|
else:
|
93
115
|
c_precision = 1e-11
|
@@ -97,12 +119,12 @@ class TestSymIIR:
|
|
97
119
|
c0 = 0.15
|
98
120
|
z1 = 0.85
|
99
121
|
n = 200
|
100
|
-
signal =
|
122
|
+
signal = xp.ones(n, dtype=dtype)
|
101
123
|
|
102
124
|
# Find the initial condition. See test_symiir1_ic for a detailed
|
103
125
|
# explanation
|
104
|
-
n_exp = int(
|
105
|
-
initial =
|
126
|
+
n_exp = int(math.ceil(math.log(c_precision) / math.log(z1)))
|
127
|
+
initial = xp.asarray((1 - z1 ** n_exp) / (1 - z1), dtype=dtype)
|
106
128
|
initial = 1 + z1 * initial
|
107
129
|
|
108
130
|
# Forward pass
|
@@ -117,15 +139,15 @@ class TestSymIIR:
|
|
117
139
|
# d is the Kronecker delta function, and u is the unit step
|
118
140
|
|
119
141
|
# y0 * z1**n * u[n]
|
120
|
-
pos =
|
142
|
+
pos = xp.astype(xp.arange(n), dtype)
|
121
143
|
comp1 = initial * z1**pos
|
122
144
|
|
123
145
|
# -z1 / (1 - z1) * z1**(k - 1) * u[k - 1]
|
124
|
-
comp2 =
|
146
|
+
comp2 = xp.zeros(n, dtype=dtype)
|
125
147
|
comp2[1:] = -z1 / (1 - z1) * z1**pos[:-1]
|
126
148
|
|
127
149
|
# 1 / (1 - z1) * u[k - 1]
|
128
|
-
comp3 =
|
150
|
+
comp3 = xp.zeros(n, dtype=dtype)
|
129
151
|
comp3[1:] = 1 / (1 - z1)
|
130
152
|
|
131
153
|
expected_fwd = comp1 + comp2 + comp3
|
@@ -139,63 +161,73 @@ class TestSymIIR:
|
|
139
161
|
|
140
162
|
# Computing a closed form for the complete expression is difficult
|
141
163
|
# The result will be computed iteratively from the difference equation
|
142
|
-
exp_out =
|
164
|
+
exp_out = xp.zeros(n, dtype=dtype)
|
143
165
|
exp_out[0] = sym_cond
|
144
166
|
|
145
167
|
for i in range(1, n):
|
146
168
|
exp_out[i] = c0 * expected_fwd[n - 1 - i] + z1 * exp_out[i - 1]
|
147
169
|
|
148
|
-
exp_out = exp_out
|
170
|
+
exp_out = xp.flip(exp_out)
|
149
171
|
|
150
172
|
out = symiirorder1(signal, c0, z1, precision)
|
151
173
|
xp_assert_close(out, exp_out, atol=4e-6, rtol=6e-7)
|
152
174
|
|
175
|
+
@xfail_xp_backends("cupy", reason="sum did not converge")
|
176
|
+
@skip_xp_backends(
|
177
|
+
cpu_only=True, exceptions=["cupy"], reason="internals are numpy-only"
|
178
|
+
)
|
153
179
|
@pytest.mark.parametrize('dtype', ['float32', 'float64'])
|
154
|
-
def test_symiir1_values(self, dtype):
|
180
|
+
def test_symiir1_values(self, dtype, xp):
|
155
181
|
rng = np.random.RandomState(1234)
|
156
|
-
dtype = getattr(np, dtype)
|
157
182
|
s = rng.uniform(size=16).astype(dtype)
|
183
|
+
dtype = getattr(xp, dtype)
|
184
|
+
s = xp.asarray(s)
|
158
185
|
res = symiirorder1(s, 0.5, 0.1)
|
159
186
|
|
160
187
|
# values from scipy 1.9.1
|
161
|
-
exp_res =
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
atol = {
|
188
|
+
exp_res = xp.asarray([
|
189
|
+
0.14387447, 0.35166047, 0.29735238, 0.46295986, 0.45174927,
|
190
|
+
0.19982875, 0.20355805, 0.47378628, 0.57232247, 0.51597393,
|
191
|
+
0.25935107, 0.31438554, 0.41096728, 0.4190693 , 0.25812255,
|
192
|
+
0.33671467], dtype=res.dtype)
|
193
|
+
atol = {xp.float64: 1e-15, xp.float32: 1e-7}[dtype]
|
167
194
|
xp_assert_close(res, exp_res, atol=atol)
|
168
195
|
|
169
|
-
|
196
|
+
I1 = xp.asarray(
|
197
|
+
1 + 1j, dtype=xp.result_type(s, xp.complex64)
|
198
|
+
)
|
199
|
+
s = s * I1
|
170
200
|
res = symiirorder1(s, 0.5, 0.1)
|
171
|
-
assert res.dtype ==
|
172
|
-
xp_assert_close(res,
|
201
|
+
assert res.dtype == xp.complex64 if dtype == xp.float32 else xp.complex128
|
202
|
+
xp_assert_close(res, I1 * exp_res, atol=atol)
|
173
203
|
|
204
|
+
@skip_xp_backends(np_only=True,
|
205
|
+
reason="_initial_fwd functions are private and numpy-only")
|
174
206
|
@pytest.mark.parametrize(
|
175
207
|
'dtype', ['float32', 'float64'])
|
176
208
|
@pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
|
177
|
-
def test_symiir2_initial_fwd(self, dtype, precision):
|
178
|
-
dtype = getattr(
|
209
|
+
def test_symiir2_initial_fwd(self, dtype, precision, xp):
|
210
|
+
dtype = getattr(xp, dtype)
|
179
211
|
c_precision = precision
|
180
212
|
if precision <= 0.0 or precision > 1.0:
|
181
|
-
if dtype in {
|
213
|
+
if dtype in {xp.float32, xp.complex64}:
|
182
214
|
c_precision = 1e-6
|
183
215
|
else:
|
184
216
|
c_precision = 1e-11
|
185
217
|
|
186
218
|
# Compute the initial conditions for a order-two symmetrical low-pass
|
187
219
|
# filter with r = 0.5 and omega = pi / 3 for an unit step input.
|
188
|
-
r =
|
189
|
-
omega =
|
190
|
-
cs = 1 - 2 * r *
|
220
|
+
r = xp.asarray(0.5, dtype=dtype)
|
221
|
+
omega = xp.asarray(np.pi / 3.0, dtype=dtype)
|
222
|
+
cs = 1 - 2 * r * xp.cos(omega) + r**2
|
191
223
|
|
192
224
|
# The index n for the initial condition is bound from 0 to the
|
193
225
|
# first position where sin(omega * (n + 2)) = 0 => omega * (n + 2) = pi
|
194
226
|
# For omega = pi / 3, the maximum initial condition occurs when
|
195
227
|
# sqrt(3) / 2 * r**n < precision.
|
196
228
|
# => n = log(2 * sqrt(3) / 3 * precision) / log(r)
|
197
|
-
ub =
|
198
|
-
lb =
|
229
|
+
ub = xp.ceil(xp.log(c_precision / xp.sin(omega)) / math.log(c_precision))
|
230
|
+
lb = xp.ceil(math.pi / omega) - 2
|
199
231
|
n_exp = min(ub, lb)
|
200
232
|
|
201
233
|
# The forward initial condition for a filter of order two is:
|
@@ -207,10 +239,10 @@ class TestSymIIR:
|
|
207
239
|
# r**(n + 3) * np.sin(omega * (n + 2)) / np.sin(omega) + cs
|
208
240
|
fwd_initial_1 = (
|
209
241
|
cs +
|
210
|
-
2 * r *
|
242
|
+
2 * r * xp.cos(omega) -
|
211
243
|
r**2 -
|
212
|
-
r**(n_exp + 2) *
|
213
|
-
r**(n_exp + 3) *
|
244
|
+
r**(n_exp + 2) * xp.sin(omega * (n_exp + 3)) / xp.sin(omega) +
|
245
|
+
r**(n_exp + 3) * xp.sin(omega * (n_exp + 2)) / xp.sin(omega))
|
214
246
|
|
215
247
|
# The second initial condition is given by
|
216
248
|
# s[n] = 1 / np.sin(omega) * (
|
@@ -218,19 +250,19 @@ class TestSymIIR:
|
|
218
250
|
# r**3 * np.sin(2 * omega) -
|
219
251
|
# r**(n + 3) * np.sin(omega * (n + 4)) +
|
220
252
|
# r**(n + 4) * np.sin(omega * (n + 3)))
|
221
|
-
ub =
|
222
|
-
lb =
|
253
|
+
ub = xp.ceil(xp.log(c_precision / xp.sin(omega)) / math.log(c_precision))
|
254
|
+
lb = xp.ceil(xp.pi / omega) - 3
|
223
255
|
n_exp = min(ub, lb)
|
224
256
|
|
225
257
|
fwd_initial_2 = (
|
226
|
-
cs + cs * 2 * r *
|
227
|
-
(r**2 *
|
228
|
-
r**3 *
|
229
|
-
r**(n_exp + 3) *
|
230
|
-
r**(n_exp + 4) *
|
258
|
+
cs + cs * 2 * r * xp.cos(omega) +
|
259
|
+
(r**2 * xp.sin(3 * omega) -
|
260
|
+
r**3 * xp.sin(2 * omega) -
|
261
|
+
r**(n_exp + 3) * xp.sin(omega * (n_exp + 4)) +
|
262
|
+
r**(n_exp + 4) * xp.sin(omega * (n_exp + 3))) / xp.sin(omega))
|
231
263
|
|
232
|
-
expected =
|
233
|
-
expected =
|
264
|
+
expected = npr(xp, fwd_initial_1, fwd_initial_2)[None, :]
|
265
|
+
expected = xp.astype(expected, dtype)
|
234
266
|
|
235
267
|
n = 100
|
236
268
|
signal = np.ones(n, dtype=dtype)
|
@@ -238,29 +270,33 @@ class TestSymIIR:
|
|
238
270
|
out = symiirorder2_ic_fwd(signal, r, omega, precision)
|
239
271
|
xp_assert_close(out, expected, atol=4e-6, rtol=6e-7)
|
240
272
|
|
273
|
+
@skip_xp_backends(np_only=True,
|
274
|
+
reason="_initial_bwd functions are private and numpy-only")
|
241
275
|
@pytest.mark.parametrize(
|
242
|
-
'dtype', [
|
276
|
+
'dtype', ['float32', 'float64'])
|
243
277
|
@pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
|
244
|
-
def test_symiir2_initial_bwd(self, dtype, precision):
|
278
|
+
def test_symiir2_initial_bwd(self, dtype, precision, xp):
|
279
|
+
dtype = getattr(xp, dtype)
|
280
|
+
|
245
281
|
c_precision = precision
|
246
282
|
if precision <= 0.0 or precision > 1.0:
|
247
|
-
if dtype in {
|
283
|
+
if dtype in {xp.float32, xp.complex64}:
|
248
284
|
c_precision = 1e-6
|
249
285
|
else:
|
250
286
|
c_precision = 1e-11
|
251
287
|
|
252
|
-
r =
|
253
|
-
omega =
|
254
|
-
cs = 1 - 2 * r *
|
255
|
-
a2 = 2 * r *
|
288
|
+
r = xp.asarray(0.5, dtype=dtype)
|
289
|
+
omega = xp.asarray(xp.pi / 3.0, dtype=dtype)
|
290
|
+
cs = 1 - 2 * r * xp.cos(omega) + r * r
|
291
|
+
a2 = 2 * r * xp.cos(omega)
|
256
292
|
a3 = -r * r
|
257
293
|
|
258
294
|
n = 100
|
259
|
-
signal =
|
295
|
+
signal = xp.ones(n, dtype=dtype)
|
260
296
|
|
261
297
|
# Compute initial forward conditions
|
262
298
|
ic = symiirorder2_ic_fwd(signal, r, omega, precision)
|
263
|
-
out =
|
299
|
+
out = xp.zeros(n + 2, dtype=dtype)
|
264
300
|
out[:2] = ic[0]
|
265
301
|
|
266
302
|
# Apply the forward system cs / (1 - a2 * z^-1 - a3 * z^-2))
|
@@ -268,52 +304,61 @@ class TestSymIIR:
|
|
268
304
|
out[i] = cs * signal[i - 2] + a2 * out[i - 1] + a3 * out[i - 2]
|
269
305
|
|
270
306
|
# Find the backward initial conditions
|
271
|
-
ic2 =
|
272
|
-
idx =
|
307
|
+
ic2 = xp.zeros(2, dtype=dtype)
|
308
|
+
idx = xp.arange(n)
|
273
309
|
|
274
310
|
diff = (_compute_symiirorder2_bwd_hs(idx, cs, r * r, omega) +
|
275
311
|
_compute_symiirorder2_bwd_hs(idx + 1, cs, r * r, omega))
|
276
312
|
ic2_0_all = np.cumsum(diff * out[:1:-1])
|
277
|
-
pos =
|
313
|
+
pos = xp.nonzero(diff ** 2 < c_precision)[0]
|
278
314
|
ic2[0] = ic2_0_all[pos[0]]
|
279
315
|
|
280
316
|
diff = (_compute_symiirorder2_bwd_hs(idx - 1, cs, r * r, omega) +
|
281
317
|
_compute_symiirorder2_bwd_hs(idx + 2, cs, r * r, omega))
|
282
|
-
|
283
|
-
|
318
|
+
|
319
|
+
ic2_1_all = xp.cumulative_sum(diff * out[:1:-1])
|
320
|
+
pos = xp.nonzero(diff ** 2 < c_precision)[0]
|
284
321
|
ic2[1] = ic2_1_all[pos[0]]
|
285
322
|
|
286
323
|
out_ic = symiirorder2_ic_bwd(out, r, omega, precision)[0]
|
287
324
|
xp_assert_close(out_ic, ic2, atol=4e-6, rtol=6e-7)
|
288
325
|
|
326
|
+
@skip_xp_backends(cpu_only=True, reason="internals are numpy-only")
|
327
|
+
@skip_xp_backends("jax.numpy", reason="item assignment in tests")
|
289
328
|
@pytest.mark.parametrize(
|
290
|
-
'dtype', [
|
329
|
+
'dtype', ['float32', 'float64'])
|
291
330
|
@pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
|
292
|
-
def test_symiir2(self, dtype, precision):
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
331
|
+
def test_symiir2(self, dtype, precision, xp):
|
332
|
+
dtype = getattr(xp, dtype)
|
333
|
+
|
334
|
+
r = 0.5
|
335
|
+
omega = math.pi / 3.0
|
336
|
+
cs = 1 - 2 * r * math.cos(omega) + r * r
|
337
|
+
a2 = 2 * r * math.cos(omega)
|
297
338
|
a3 = -r * r
|
298
339
|
|
299
340
|
n = 100
|
300
|
-
signal =
|
341
|
+
signal = xp.ones(n, dtype=dtype)
|
301
342
|
|
302
343
|
# Compute initial forward conditions
|
303
|
-
|
304
|
-
|
305
|
-
|
344
|
+
signal_np = np.asarray(signal)
|
345
|
+
ic = symiirorder2_ic_fwd(signal_np, r, omega, precision)
|
346
|
+
ic = xp.asarray(ic)
|
347
|
+
out1 = xp.zeros(n + 2, dtype=dtype)
|
348
|
+
out1[:2] = ic[0, :]
|
306
349
|
|
307
350
|
# Apply the forward system cs / (1 - a2 * z^-1 - a3 * z^-2))
|
308
351
|
for i in range(2, n + 2):
|
309
352
|
out1[i] = cs * signal[i - 2] + a2 * out1[i - 1] + a3 * out1[i - 2]
|
310
353
|
|
311
354
|
# Find the backward initial conditions
|
312
|
-
ic2 = symiirorder2_ic_bwd(out1, r, omega, precision)[0]
|
355
|
+
ic2 = symiirorder2_ic_bwd(np.asarray(out1), r, omega, precision)[0]
|
356
|
+
ic2 = xp.asarray(ic2)
|
313
357
|
|
314
358
|
# Apply the system cs / (1 - a2 * z - a3 * z^2)) in backwards
|
315
|
-
exp =
|
316
|
-
|
359
|
+
exp = xp.empty(n, dtype=dtype)
|
360
|
+
|
361
|
+
exp[-2:] = xp.flip(ic2)
|
317
362
|
|
318
363
|
for i in range(n - 3, -1, -1):
|
319
364
|
exp[i] = cs * out1[i] + a2 * exp[i + 1] + a3 * exp[i + 2]
|
@@ -321,20 +366,26 @@ class TestSymIIR:
|
|
321
366
|
out = symiirorder2(signal, r, omega, precision)
|
322
367
|
xp_assert_close(out, exp, atol=4e-6, rtol=6e-7)
|
323
368
|
|
369
|
+
@skip_xp_backends(cpu_only=True, exceptions=["cupy"], reason="C internals")
|
324
370
|
@pytest.mark.parametrize('dtyp', ['float32', 'float64'])
|
325
|
-
def test_symiir2_values(self, dtyp):
|
326
|
-
dtyp = getattr(np, dtyp)
|
371
|
+
def test_symiir2_values(self, dtyp, xp):
|
327
372
|
rng = np.random.RandomState(1234)
|
328
373
|
s = rng.uniform(size=16).astype(dtyp)
|
374
|
+
s = xp.asarray(s)
|
375
|
+
|
376
|
+
# cupy returns f64 for f32 inputs
|
377
|
+
dtype = xp.float64 if is_cupy(xp) else getattr(xp, dtyp)
|
378
|
+
|
329
379
|
res = symiirorder2(s, 0.1, 0.1, precision=1e-10)
|
330
380
|
|
331
381
|
# values from scipy 1.9.1
|
332
|
-
exp_res =
|
333
|
-
|
334
|
-
|
335
|
-
|
382
|
+
exp_res = xp.asarray(
|
383
|
+
[0.26572609, 0.53408018, 0.51032696, 0.72115829, 0.69486885,
|
384
|
+
0.3649055 , 0.37349478, 0.74165032, 0.89718521, 0.80582483,
|
385
|
+
0.46758053, 0.51898709, 0.65025605, 0.65394321, 0.45273595,
|
386
|
+
0.53539183], dtype=dtype
|
387
|
+
)
|
336
388
|
|
337
|
-
assert res.dtype == dtyp
|
338
389
|
# The values in SciPy 1.14 agree with those in SciPy 1.9.1 to this
|
339
390
|
# accuracy only. Implementation differences are twofold:
|
340
391
|
# 1. boundary conditions are computed differently
|
@@ -345,18 +396,32 @@ class TestSymIIR:
|
|
345
396
|
# In that respect, sosfilt is likely doing a better job.
|
346
397
|
xp_assert_close(res, exp_res, atol=2e-6)
|
347
398
|
|
348
|
-
|
349
|
-
|
399
|
+
I1 = xp.asarray(1 + 1j, dtype=xp.result_type(s, xp.complex64))
|
400
|
+
s = s * I1
|
401
|
+
|
402
|
+
with pytest.raises((TypeError, ValueError)):
|
350
403
|
res = symiirorder2(s, 0.5, 0.1)
|
351
404
|
|
352
|
-
|
353
|
-
|
354
|
-
|
405
|
+
@skip_xp_backends(cpu_only=True, exceptions=["cupy"], reason="C internals")
|
406
|
+
@xfail_xp_backends("cupy", reason="cupy does not accept integer arrays")
|
407
|
+
def test_symiir1_integer_input(self, xp):
|
408
|
+
s = xp.where(
|
409
|
+
xp.astype(xp.arange(100) % 2, xp.bool),
|
410
|
+
xp.asarray(-1),
|
411
|
+
xp.asarray(1),
|
412
|
+
)
|
413
|
+
expected = symiirorder1(xp.astype(s, xp_default_dtype(xp)), 0.5, 0.5)
|
355
414
|
out = symiirorder1(s, 0.5, 0.5)
|
356
415
|
xp_assert_close(out, expected)
|
357
416
|
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
417
|
+
@skip_xp_backends(cpu_only=True, exceptions=["cupy"], reason="C internals")
|
418
|
+
@xfail_xp_backends("cupy", reason="cupy does not accept integer arrays")
|
419
|
+
def test_symiir2_integer_input(self, xp):
|
420
|
+
s = xp.where(
|
421
|
+
xp.astype(xp.arange(100) % 2, xp.bool),
|
422
|
+
xp.asarray(-1),
|
423
|
+
xp.asarray(1),
|
424
|
+
)
|
425
|
+
expected = symiirorder2(xp.astype(s, xp_default_dtype(xp)), 0.5, xp.pi / 3.0)
|
426
|
+
out = symiirorder2(s, 0.5, xp.pi / 3.0)
|
362
427
|
xp_assert_close(out, expected)
|