scipy 1.15.3__cp313-cp313t-macosx_14_0_arm64.whl → 1.16.0rc2__cp313-cp313t-macosx_14_0_arm64.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 +3 -3
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_deprecation_call.cpython-313t-darwin.so +0 -0
- scipy/_lib/_testutils.py +6 -2
- 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.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-313t-darwin.so +0 -0
- scipy/cluster/_vq.cpython-313t-darwin.so +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/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.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/integrate/_lsoda.cpython-313t-darwin.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-313t-darwin.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-313t-darwin.so +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_odeint_banded.cpython-313t-darwin.so +0 -0
- scipy/integrate/_vode.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_dierckx.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_fitpack.cpython-313t-darwin.so +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.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-313t-darwin.so +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/_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.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-313t-darwin.so +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.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-313t-darwin.so +0 -0
- scipy/linalg/_flapack.cpython-313t-darwin.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-darwin.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-313t-darwin.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-313t-darwin.so +0 -0
- scipy/linalg/cython_lapack.cpython-313t-darwin.so +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/_cytest.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lbfgsb.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-313t-darwin.so +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.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/signal/_sosfilt.cpython-313t-darwin.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-313t-darwin.so +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.cpython-313t-darwin.so +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.cpython-313t-darwin.so +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.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-313t-darwin.so +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.cpython-313t-darwin.so +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.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/spatial/_distance_pybind.cpython-313t-darwin.so +0 -0
- scipy/spatial/_distance_wrap.cpython-313t-darwin.so +0 -0
- scipy/spatial/_hausdorff.cpython-313t-darwin.so +0 -0
- scipy/spatial/_qhull.cpython-313t-darwin.so +0 -0
- scipy/spatial/_voronoi.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/spatial/transform/_rotation.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/special/_ellip_harm_2.cpython-313t-darwin.so +0 -0
- scipy/special/_gufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-313t-darwin.so +0 -0
- scipy/special/_special_ufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-313t-darwin.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-313t-darwin.so +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.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-313t-darwin.so +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.cpython-313t-darwin.so +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.cpython-313t-darwin.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-313t-darwin.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-313t-darwin.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-313t-darwin.so +0 -0
- scipy/stats/_stats.cpython-313t-darwin.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-313t-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-313t-darwin.so +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.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 +559 -566
- scipy-1.16.0rc2.dist-info/WHEEL +6 -0
- scipy/_lib/array_api_extra/_funcs.py +0 -484
- scipy/_lib/array_api_extra/_typing.py +0 -8
- scipy/interpolate/_bspl.cpython-313t-darwin.so +0 -0
- scipy/optimize/_cobyla.cpython-313t-darwin.so +0 -0
- scipy/optimize/_cython_nnls.cpython-313t-darwin.so +0 -0
- scipy/optimize/_slsqp.cpython-313t-darwin.so +0 -0
- scipy/spatial/qhull_src/COPYING.txt +0 -38
- scipy/special/libsf_error_state.dylib +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.cpython-313t-darwin.so +0 -0
- scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -8,9 +8,10 @@ import pytest
|
|
8
8
|
from pytest import raises as assert_raises
|
9
9
|
|
10
10
|
from scipy import signal
|
11
|
+
from scipy._lib._array_api import xp_assert_close
|
11
12
|
from scipy.fft import fftfreq, rfftfreq, fft, irfft
|
12
13
|
from scipy.integrate import trapezoid
|
13
|
-
from scipy.signal import (periodogram, welch, lombscargle, coherence,
|
14
|
+
from scipy.signal import (periodogram, welch, lombscargle, coherence, csd,
|
14
15
|
spectrogram, check_COLA, check_NOLA)
|
15
16
|
from scipy.signal.windows import hann
|
16
17
|
from scipy.signal._spectral_py import _spectral_helper
|
@@ -18,7 +19,6 @@ from scipy.signal._spectral_py import _spectral_helper
|
|
18
19
|
# Compare ShortTimeFFT.stft() / ShortTimeFFT.istft() with stft() / istft():
|
19
20
|
from scipy.signal.tests._scipy_spectral_test_shim import stft_compare as stft
|
20
21
|
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
22
|
|
23
23
|
|
24
24
|
class TestPeriodogram:
|
@@ -416,8 +416,7 @@ class TestWelch:
|
|
416
416
|
#for string-like window, input signal length < nperseg value gives
|
417
417
|
#UserWarning, sets nperseg to x.shape[-1]
|
418
418
|
with suppress_warnings() as sup:
|
419
|
-
|
420
|
-
sup.filter(UserWarning, msg)
|
419
|
+
sup.filter(UserWarning, "nperseg=256 is greater than signal.*")
|
421
420
|
f, p = welch(x,window='hann') # default nperseg
|
422
421
|
f1, p1 = welch(x,window='hann', nperseg=256) # user-specified nperseg
|
423
422
|
f2, p2 = welch(x, nperseg=8) # valid nperseg, doesn't give warning
|
@@ -560,6 +559,15 @@ class TestWelch:
|
|
560
559
|
assert_raises(ValueError, welch, x, nperseg=8,
|
561
560
|
average='unrecognised-average')
|
562
561
|
|
562
|
+
def test_ratio_scale_to(self):
|
563
|
+
"""Verify the factor of ``sum(abs(window)**2)*fs / abs(sum(window))**2``
|
564
|
+
used in the `welch` and `csd` docstrs. """
|
565
|
+
x, win, fs = np.array([1., 0, 0, 0]), np.ones(4), 12
|
566
|
+
params = dict(fs=fs, window=win, return_onesided=False, detrend=None)
|
567
|
+
p_dens = welch(x, scaling='density', **params)[1]
|
568
|
+
p_spec = welch(x, scaling='spectrum', **params)[1]
|
569
|
+
p_fac = sum(win**2)*fs / abs(sum(win))**2
|
570
|
+
assert_allclose(p_spec / p_dens, p_fac)
|
563
571
|
|
564
572
|
class TestCSD:
|
565
573
|
def test_pad_shorter_x(self):
|
@@ -584,6 +592,36 @@ class TestCSD:
|
|
584
592
|
assert_allclose(f, f1)
|
585
593
|
assert_allclose(c, c1)
|
586
594
|
|
595
|
+
def test_unequal_length_input_1D(self):
|
596
|
+
"""Test zero-padding for input `x.shape[axis] != y.shape[axis]` for 1d arrays.
|
597
|
+
|
598
|
+
This test ensures that issue 23036 is fixed.
|
599
|
+
"""
|
600
|
+
x = np.tile([4, 0, -4, 0], 4)
|
601
|
+
|
602
|
+
kw = dict(fs=len(x), window='boxcar', nperseg=4)
|
603
|
+
X0 = signal.csd(x, np.copy(x), **kw)[1] # `x is x` must be False
|
604
|
+
X1 = signal.csd(x, x[:8], **kw)[1]
|
605
|
+
X2 = signal.csd(x[:8], x, **kw)[1]
|
606
|
+
xp_assert_close(X1, X0 / 2)
|
607
|
+
xp_assert_close(X2, X0 / 2)
|
608
|
+
|
609
|
+
def test_unequal_length_input_3D(self):
|
610
|
+
"""Test zero-padding for input `x.shape[axis] != y.shape[axis]` for 3d arrays.
|
611
|
+
|
612
|
+
This test ensures that issue 23036 is fixed.
|
613
|
+
"""
|
614
|
+
n = 8
|
615
|
+
x = np.zeros(2 * 3 * n).reshape(2, n, 3)
|
616
|
+
x[:, 0, :] = n
|
617
|
+
|
618
|
+
kw = dict(fs=n, window='boxcar', nperseg=n, detrend=None, axis=1)
|
619
|
+
X0 = signal.csd(x, x.copy(), **kw)[1] # `x is x` must be False
|
620
|
+
X1 = signal.csd(x, x[:, :2, :], **kw)[1]
|
621
|
+
X2 = signal.csd(x[:, :2, :], x, **kw)[1]
|
622
|
+
xp_assert_close(X1, X0)
|
623
|
+
xp_assert_close(X2, X0)
|
624
|
+
|
587
625
|
def test_real_onesided_even(self):
|
588
626
|
x = np.zeros(16)
|
589
627
|
x[0] = 1
|
@@ -735,6 +773,8 @@ class TestCSD:
|
|
735
773
|
win_err = signal.get_window('hann', 32)
|
736
774
|
assert_raises(ValueError, csd, x, x,
|
737
775
|
10, win_err, nperseg=None) # because win longer than signal
|
776
|
+
with pytest.raises(ValueError, match="Parameter nperseg=0.*"):
|
777
|
+
csd(x, x, 0, nperseg=0)
|
738
778
|
|
739
779
|
def test_empty_input(self):
|
740
780
|
f, p = csd([],np.zeros(10))
|
@@ -779,8 +819,7 @@ class TestCSD:
|
|
779
819
|
#for string-like window, input signal length < nperseg value gives
|
780
820
|
#UserWarning, sets nperseg to x.shape[-1]
|
781
821
|
with suppress_warnings() as sup:
|
782
|
-
|
783
|
-
sup.filter(UserWarning, msg)
|
822
|
+
sup.filter(UserWarning, "nperseg=256 is greater than signal length.*")
|
784
823
|
f, p = csd(x, x, window='hann') # default nperseg
|
785
824
|
f1, p1 = csd(x, x, window='hann', nperseg=256) # user-specified nperseg
|
786
825
|
f2, p2 = csd(x, x, nperseg=8) # valid nperseg, doesn't give warning
|
@@ -811,6 +850,11 @@ class TestCSD:
|
|
811
850
|
assert_raises(ValueError, csd, np.ones(12), np.zeros(12), nfft=3,
|
812
851
|
nperseg=4)
|
813
852
|
|
853
|
+
def test_incompatible_inputs(self):
|
854
|
+
with pytest.raises(ValueError, match='x and y cannot be broadcast.*'):
|
855
|
+
csd(np.ones((1, 8, 1)), np.ones((2, 8)), nperseg=4)
|
856
|
+
|
857
|
+
|
814
858
|
def test_real_onesided_even_32(self):
|
815
859
|
x = np.zeros(16, 'f')
|
816
860
|
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)
|