scipy 1.15.3__cp312-cp312-macosx_14_0_arm64.whl → 1.16.0rc2__cp312-cp312-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 +4 -4
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/_lib/_test_deprecation_def.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
- scipy/cluster/_vq.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-312-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-312-darwin.so +0 -0
- scipy/integrate/_vode.cpython-312-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-312-darwin.so +0 -0
- scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
- scipy/interpolate/_fitpack.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-312-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-312-darwin.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
- scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
- scipy/linalg/cython_lapack.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
- scipy/optimize/_lbfgsb.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-312-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-312-darwin.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-312-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-312-darwin.so +0 -0
- scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-312-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-312-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-312-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-312-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-312-darwin.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-312-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-312-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-312-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-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-312-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-312-darwin.so +0 -0
- scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
- scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
- scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
- scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
- scipy/spatial/_voronoi.cpython-312-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-312-darwin.so +0 -0
- scipy/spatial/transform/_rotation.cpython-312-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-312-darwin.so +0 -0
- scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
- scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-312-darwin.so +0 -0
- scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-312-darwin.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-312-darwin.so +0 -0
- scipy/stats/_stats.cpython-312-darwin.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-312-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 +560 -567
- 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-312-darwin.so +0 -0
- scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
- scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
- scipy/optimize/_slsqp.cpython-312-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-312-darwin.so +0 -0
- scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -1,13 +1,20 @@
|
|
1
|
+
import math
|
2
|
+
|
1
3
|
import numpy as np
|
2
4
|
from numpy import array
|
3
|
-
from numpy.testing import
|
4
|
-
|
5
|
-
assert_equal, assert_, assert_array_less,
|
6
|
-
suppress_warnings)
|
5
|
+
from numpy.testing import suppress_warnings
|
6
|
+
import pytest
|
7
7
|
from pytest import raises as assert_raises
|
8
8
|
|
9
9
|
from scipy.fft import fft
|
10
10
|
from scipy.signal import windows, get_window, resample
|
11
|
+
from scipy._lib._array_api import (
|
12
|
+
xp_assert_close, xp_assert_equal, array_namespace, is_torch, is_jax, is_cupy,
|
13
|
+
assert_array_almost_equal, SCIPY_DEVICE, is_numpy
|
14
|
+
)
|
15
|
+
|
16
|
+
skip_xp_backends = pytest.mark.skip_xp_backends
|
17
|
+
xfail_xp_backends = pytest.mark.xfail_xp_backends
|
11
18
|
|
12
19
|
|
13
20
|
window_funcs = [
|
@@ -38,101 +45,116 @@ window_funcs = [
|
|
38
45
|
|
39
46
|
class TestBartHann:
|
40
47
|
|
41
|
-
def test_basic(self):
|
42
|
-
|
43
|
-
[0, 0.35857354213752, 0.8794264578624801,
|
44
|
-
0.8794264578624801, 0.3585735421375199, 0],
|
48
|
+
def test_basic(self, xp):
|
49
|
+
xp_assert_close(windows.barthann(6, sym=True, xp=xp),
|
50
|
+
xp.asarray([0, 0.35857354213752, 0.8794264578624801,
|
51
|
+
0.8794264578624801, 0.3585735421375199, 0], dtype=xp.float64),
|
45
52
|
rtol=1e-15, atol=1e-15)
|
46
|
-
|
47
|
-
[0, 0.27, 0.73, 1.0, 0.73, 0.27, 0],
|
53
|
+
xp_assert_close(windows.barthann(7, xp=xp),
|
54
|
+
xp.asarray([0, 0.27, 0.73, 1.0, 0.73, 0.27, 0],
|
55
|
+
dtype=xp.float64),
|
48
56
|
rtol=1e-15, atol=1e-15)
|
49
|
-
|
50
|
-
[0, 0.27, 0.73, 1.0, 0.73, 0.27],
|
57
|
+
xp_assert_close(windows.barthann(6, False, xp=xp),
|
58
|
+
xp.asarray([0, 0.27, 0.73, 1.0, 0.73, 0.27], dtype=xp.float64),
|
51
59
|
rtol=1e-15, atol=1e-15)
|
52
60
|
|
53
61
|
|
54
62
|
class TestBartlett:
|
55
63
|
|
56
|
-
def test_basic(self):
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
[0, 1/3, 2/3, 1.0, 2/3, 1/3])
|
64
|
+
def test_basic(self, xp):
|
65
|
+
xp_assert_close(windows.bartlett(6, xp=xp),
|
66
|
+
xp.asarray([0, 0.4, 0.8, 0.8, 0.4, 0], dtype=xp.float64))
|
67
|
+
xp_assert_close(windows.bartlett(7, xp=xp),
|
68
|
+
xp.asarray([0, 1/3, 2/3, 1.0, 2/3, 1/3, 0], dtype=xp.float64))
|
69
|
+
xp_assert_close(windows.bartlett(6, False, xp=xp),
|
70
|
+
xp.asarray([0, 1/3, 2/3, 1.0, 2/3, 1/3], dtype=xp.float64))
|
61
71
|
|
62
72
|
|
63
73
|
class TestBlackman:
|
64
74
|
|
65
|
-
def test_basic(self):
|
66
|
-
|
67
|
-
[0, 0.13, 0.63, 1.0, 0.63, 0.13],
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
+
def test_basic(self, xp):
|
76
|
+
xp_assert_close(windows.blackman(6, sym=False, xp=xp),
|
77
|
+
xp.asarray([0, 0.13, 0.63, 1.0, 0.63, 0.13], dtype=xp.float64),
|
78
|
+
atol=1e-14)
|
79
|
+
xp_assert_close(windows.blackman(7, sym=False, xp=xp),
|
80
|
+
xp.asarray([0, 0.09045342435412804, 0.4591829575459636,
|
81
|
+
0.9203636180999081, 0.9203636180999081,
|
82
|
+
0.4591829575459636, 0.09045342435412804],
|
83
|
+
dtype=xp.float64),
|
84
|
+
atol=1e-8)
|
85
|
+
xp_assert_close(windows.blackman(6, xp=xp),
|
86
|
+
xp.asarray([0, 0.2007701432625305, 0.8492298567374694,
|
87
|
+
0.8492298567374694, 0.2007701432625305, 0],
|
88
|
+
dtype=xp.float64),
|
75
89
|
atol=1e-14)
|
76
|
-
|
77
|
-
[0, 0.13, 0.63, 1.0, 0.63, 0.13, 0],
|
90
|
+
xp_assert_close(windows.blackman(7, True, xp=xp),
|
91
|
+
xp.asarray([0, 0.13, 0.63, 1.0, 0.63, 0.13, 0],
|
92
|
+
dtype=xp.float64), atol=1e-14)
|
78
93
|
|
79
94
|
|
80
95
|
class TestBlackmanHarris:
|
81
96
|
|
82
|
-
def test_basic(self):
|
83
|
-
|
84
|
-
[6.0e-05, 0.055645, 0.520575,
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
+
def test_basic(self, xp):
|
98
|
+
xp_assert_close(windows.blackmanharris(6, False, xp=xp),
|
99
|
+
xp.asarray([6.0e-05, 0.055645, 0.520575,
|
100
|
+
1.0, 0.520575, 0.055645], dtype=xp.float64))
|
101
|
+
xp_assert_close(windows.blackmanharris(7, sym=False, xp=xp),
|
102
|
+
xp.asarray([6.0e-05, 0.03339172347815117, 0.332833504298565,
|
103
|
+
0.8893697722232837, 0.8893697722232838,
|
104
|
+
0.3328335042985652, 0.03339172347815122],
|
105
|
+
dtype=xp.float64))
|
106
|
+
xp_assert_close(windows.blackmanharris(6, xp=xp),
|
107
|
+
xp.asarray([6.0e-05, 0.1030114893456638, 0.7938335106543362,
|
108
|
+
0.7938335106543364, 0.1030114893456638, 6.0e-05],
|
109
|
+
dtype=xp.float64))
|
110
|
+
xp_assert_close(windows.blackmanharris(7, sym=True, xp=xp),
|
111
|
+
xp.asarray([6.0e-05, 0.055645, 0.520575, 1.0, 0.520575,
|
112
|
+
0.055645, 6.0e-05], dtype=xp.float64))
|
113
|
+
|
114
|
+
|
115
|
+
@skip_xp_backends('jax.numpy', reason='item assignment')
|
97
116
|
class TestTaylor:
|
98
117
|
|
99
|
-
def test_normalized(self):
|
118
|
+
def test_normalized(self, xp):
|
100
119
|
"""Tests windows of small length that are normalized to 1. See the
|
101
120
|
documentation for the Taylor window for more information on
|
102
121
|
normalization.
|
103
122
|
"""
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
123
|
+
xp_assert_close(windows.taylor(1, 2, 15, xp=xp),
|
124
|
+
xp.asarray([1.0], dtype=xp.float64))
|
125
|
+
xp_assert_close(
|
126
|
+
windows.taylor(5, 2, 15, xp=xp),
|
127
|
+
xp.asarray([0.75803341, 0.90757699, 1.0, 0.90757699, 0.75803341],
|
128
|
+
dtype=xp.float64)
|
108
129
|
)
|
109
|
-
|
110
|
-
windows.taylor(6, 2, 15),
|
111
|
-
|
130
|
+
xp_assert_close(
|
131
|
+
windows.taylor(6, 2, 15, xp=xp),
|
132
|
+
xp.asarray([
|
112
133
|
0.7504082, 0.86624416, 0.98208011, 0.98208011, 0.86624416,
|
113
134
|
0.7504082
|
114
|
-
])
|
135
|
+
], dtype=xp.float64)
|
115
136
|
)
|
116
137
|
|
117
|
-
def test_non_normalized(self):
|
138
|
+
def test_non_normalized(self, xp):
|
118
139
|
"""Test windows of small length that are not normalized to 1. See
|
119
140
|
the documentation for the Taylor window for more information on
|
120
141
|
normalization.
|
121
142
|
"""
|
122
|
-
|
123
|
-
windows.taylor(5, 2, 15, norm=False),
|
124
|
-
|
143
|
+
xp_assert_close(
|
144
|
+
windows.taylor(5, 2, 15, norm=False, xp=xp),
|
145
|
+
xp.asarray([
|
125
146
|
0.87508054, 1.04771499, 1.15440894, 1.04771499, 0.87508054
|
126
|
-
])
|
147
|
+
], dtype=xp.float64)
|
127
148
|
)
|
128
|
-
|
129
|
-
windows.taylor(6, 2, 15, norm=False),
|
130
|
-
|
149
|
+
xp_assert_close(
|
150
|
+
windows.taylor(6, 2, 15, norm=False, xp=xp),
|
151
|
+
xp.asarray([
|
131
152
|
0.86627793, 1.0, 1.13372207, 1.13372207, 1.0, 0.86627793
|
132
|
-
])
|
153
|
+
], dtype=xp.float64)
|
133
154
|
)
|
134
155
|
|
135
|
-
|
156
|
+
@skip_xp_backends(cpu_only=True)
|
157
|
+
def test_correctness(self, xp):
|
136
158
|
"""This test ensures the correctness of the implemented Taylor
|
137
159
|
Windowing function. A Taylor Window of 1024 points is created, its FFT
|
138
160
|
is taken, and the Peak Sidelobe Level (PSLL) and 3dB and 18dB bandwidth
|
@@ -152,131 +174,147 @@ class TestTaylor:
|
|
152
174
|
# Set norm=False for correctness as the values obtained from the
|
153
175
|
# scientific publication do not normalize the values. Normalizing
|
154
176
|
# changes the sidelobe level from the desired value.
|
155
|
-
w = windows.taylor(M_win, nbar=4, sll=35, norm=False, sym=False)
|
177
|
+
w = windows.taylor(M_win, nbar=4, sll=35, norm=False, sym=False, xp=xp)
|
156
178
|
f = fft(w, N_fft)
|
157
|
-
|
179
|
+
|
180
|
+
f_np = np.asarray(f)
|
181
|
+
spec = 20 * np.log10(np.abs(f_np / np.max(f_np)))
|
158
182
|
|
159
183
|
first_zero = np.argmax(np.diff(spec) > 0)
|
160
184
|
|
161
|
-
PSLL = np.
|
185
|
+
PSLL = np.max(spec[first_zero:-first_zero])
|
162
186
|
|
163
187
|
BW_3dB = 2*np.argmax(spec <= -3.0102999566398121) / N_fft * M_win
|
164
188
|
BW_18dB = 2*np.argmax(spec <= -18.061799739838872) / N_fft * M_win
|
165
189
|
|
166
|
-
|
167
|
-
|
168
|
-
|
190
|
+
assert math.isclose(PSLL, -35.1672, abs_tol=1)
|
191
|
+
assert math.isclose(BW_3dB, 1.1822, abs_tol=0.1)
|
192
|
+
assert math.isclose(BW_18dB, 2.6112, abs_tol=0.1)
|
169
193
|
|
170
194
|
|
171
195
|
class TestBohman:
|
172
196
|
|
173
|
-
def test_basic(self):
|
174
|
-
|
175
|
-
[0, 0.1791238937062839, 0.8343114522576858,
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
197
|
+
def test_basic(self, xp):
|
198
|
+
xp_assert_close(windows.bohman(6, xp=xp),
|
199
|
+
xp.asarray([0, 0.1791238937062839, 0.8343114522576858,
|
200
|
+
0.8343114522576858, 0.1791238937062838, 0],
|
201
|
+
dtype=xp.float64))
|
202
|
+
xp_assert_close(windows.bohman(7, sym=True, xp=xp),
|
203
|
+
xp.asarray([0, 0.1089977810442293, 0.6089977810442293, 1.0,
|
204
|
+
0.6089977810442295, 0.1089977810442293, 0],
|
205
|
+
dtype=xp.float64))
|
206
|
+
xp_assert_close(windows.bohman(6, False, xp=xp),
|
207
|
+
xp.asarray([0, 0.1089977810442293, 0.6089977810442293, 1.0,
|
208
|
+
0.6089977810442295, 0.1089977810442293],
|
209
|
+
dtype=xp.float64))
|
183
210
|
|
184
211
|
|
185
212
|
class TestBoxcar:
|
186
213
|
|
187
|
-
def test_basic(self):
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
214
|
+
def test_basic(self, xp):
|
215
|
+
xp_assert_close(windows.boxcar(6, xp=xp),
|
216
|
+
xp.asarray([1.0, 1, 1, 1, 1, 1], dtype=xp.float64))
|
217
|
+
xp_assert_close(windows.boxcar(7, xp=xp),
|
218
|
+
xp.asarray([1.0, 1, 1, 1, 1, 1, 1], dtype=xp.float64))
|
219
|
+
xp_assert_close(windows.boxcar(6, False, xp=xp),
|
220
|
+
xp.asarray([1.0, 1, 1, 1, 1, 1], dtype=xp.float64))
|
221
|
+
|
222
|
+
|
223
|
+
cheb_odd_true = [0.200938, 0.107729, 0.134941, 0.165348,
|
224
|
+
0.198891, 0.235450, 0.274846, 0.316836,
|
225
|
+
0.361119, 0.407338, 0.455079, 0.503883,
|
226
|
+
0.553248, 0.602637, 0.651489, 0.699227,
|
227
|
+
0.745266, 0.789028, 0.829947, 0.867485,
|
228
|
+
0.901138, 0.930448, 0.955010, 0.974482,
|
229
|
+
0.988591, 0.997138, 1.000000, 0.997138,
|
230
|
+
0.988591, 0.974482, 0.955010, 0.930448,
|
231
|
+
0.901138, 0.867485, 0.829947, 0.789028,
|
232
|
+
0.745266, 0.699227, 0.651489, 0.602637,
|
233
|
+
0.553248, 0.503883, 0.455079, 0.407338,
|
234
|
+
0.361119, 0.316836, 0.274846, 0.235450,
|
235
|
+
0.198891, 0.165348, 0.134941, 0.107729,
|
236
|
+
0.200938]
|
237
|
+
|
238
|
+
cheb_even_true = [0.203894, 0.107279, 0.133904,
|
239
|
+
0.163608, 0.196338, 0.231986,
|
240
|
+
0.270385, 0.311313, 0.354493,
|
241
|
+
0.399594, 0.446233, 0.493983,
|
242
|
+
0.542378, 0.590916, 0.639071,
|
243
|
+
0.686302, 0.732055, 0.775783,
|
244
|
+
0.816944, 0.855021, 0.889525,
|
245
|
+
0.920006, 0.946060, 0.967339,
|
246
|
+
0.983557, 0.994494, 1.000000,
|
247
|
+
1.000000, 0.994494, 0.983557,
|
248
|
+
0.967339, 0.946060, 0.920006,
|
249
|
+
0.889525, 0.855021, 0.816944,
|
250
|
+
0.775783, 0.732055, 0.686302,
|
251
|
+
0.639071, 0.590916, 0.542378,
|
252
|
+
0.493983, 0.446233, 0.399594,
|
253
|
+
0.354493, 0.311313, 0.270385,
|
254
|
+
0.231986, 0.196338, 0.163608,
|
255
|
+
0.133904, 0.107279, 0.203894]
|
256
|
+
|
257
|
+
|
258
|
+
@skip_xp_backends('jax.numpy', reason='item assignment')
|
259
|
+
@skip_xp_backends('dask.array', reason='data-dependent output shapes')
|
228
260
|
class TestChebWin:
|
229
261
|
|
230
|
-
def test_basic(self):
|
262
|
+
def test_basic(self, xp):
|
231
263
|
with suppress_warnings() as sup:
|
232
264
|
sup.filter(UserWarning, "This window is not suitable")
|
233
|
-
|
234
|
-
[0.1046401879356917, 0.5075781475823447,
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
[
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
265
|
+
xp_assert_close(windows.chebwin(6, 100, xp=xp),
|
266
|
+
xp.asarray([0.1046401879356917, 0.5075781475823447,
|
267
|
+
1.0, 1.0,
|
268
|
+
0.5075781475823447, 0.1046401879356917],
|
269
|
+
dtype=xp.float64),
|
270
|
+
atol=1e-8
|
271
|
+
)
|
272
|
+
xp_assert_close(windows.chebwin(7, 100, xp=xp),
|
273
|
+
xp.asarray([0.05650405062850233, 0.316608530648474,
|
274
|
+
0.7601208123539079, 1.0, 0.7601208123539079,
|
275
|
+
0.316608530648474, 0.05650405062850233],
|
276
|
+
dtype=xp.float64))
|
277
|
+
xp_assert_close(windows.chebwin(6, 10, xp=xp),
|
278
|
+
xp.asarray([1.0, 0.6071201674458373, 0.6808391469897297,
|
279
|
+
0.6808391469897297, 0.6071201674458373, 1.0],
|
280
|
+
dtype=xp.float64))
|
281
|
+
xp_assert_close(windows.chebwin(7, 10, xp=xp),
|
282
|
+
xp.asarray([1.0, 0.5190521247588651, 0.5864059018130382,
|
283
|
+
0.6101519801307441, 0.5864059018130382,
|
284
|
+
0.5190521247588651, 1.0], dtype=xp.float64))
|
285
|
+
xp_assert_close(windows.chebwin(6, 10, False, xp=xp),
|
286
|
+
xp.asarray([1.0, 0.5190521247588651, 0.5864059018130382,
|
287
|
+
0.6101519801307441, 0.5864059018130382,
|
288
|
+
0.5190521247588651], dtype=xp.float64))
|
289
|
+
|
290
|
+
def test_cheb_odd_high_attenuation(self, xp):
|
253
291
|
with suppress_warnings() as sup:
|
254
292
|
sup.filter(UserWarning, "This window is not suitable")
|
255
|
-
cheb_odd = windows.chebwin(53, at=-40)
|
256
|
-
assert_array_almost_equal(cheb_odd, cheb_odd_true, decimal=4)
|
293
|
+
cheb_odd = windows.chebwin(53, at=-40, xp=xp)
|
294
|
+
assert_array_almost_equal(cheb_odd, xp.asarray(cheb_odd_true), decimal=4)
|
257
295
|
|
258
|
-
def test_cheb_even_high_attenuation(self):
|
296
|
+
def test_cheb_even_high_attenuation(self, xp):
|
259
297
|
with suppress_warnings() as sup:
|
260
298
|
sup.filter(UserWarning, "This window is not suitable")
|
261
|
-
cheb_even = windows.chebwin(54, at=40)
|
262
|
-
assert_array_almost_equal(cheb_even, cheb_even_true, decimal=4)
|
299
|
+
cheb_even = windows.chebwin(54, at=40, xp=xp)
|
300
|
+
assert_array_almost_equal(cheb_even, xp.asarray(cheb_even_true), decimal=4)
|
263
301
|
|
264
|
-
def test_cheb_odd_low_attenuation(self):
|
265
|
-
cheb_odd_low_at_true =
|
266
|
-
|
267
|
-
|
302
|
+
def test_cheb_odd_low_attenuation(self, xp):
|
303
|
+
cheb_odd_low_at_true = xp.asarray([1.000000, 0.519052, 0.586405,
|
304
|
+
0.610151, 0.586405, 0.519052,
|
305
|
+
1.000000], dtype=xp.float64)
|
268
306
|
with suppress_warnings() as sup:
|
269
307
|
sup.filter(UserWarning, "This window is not suitable")
|
270
|
-
cheb_odd = windows.chebwin(7, at=10)
|
308
|
+
cheb_odd = windows.chebwin(7, at=10, xp=xp)
|
271
309
|
assert_array_almost_equal(cheb_odd, cheb_odd_low_at_true, decimal=4)
|
272
310
|
|
273
|
-
def test_cheb_even_low_attenuation(self):
|
274
|
-
cheb_even_low_at_true =
|
275
|
-
|
276
|
-
|
311
|
+
def test_cheb_even_low_attenuation(self, xp):
|
312
|
+
cheb_even_low_at_true = xp.asarray([1.000000, 0.451924, 0.51027,
|
313
|
+
0.541338, 0.541338, 0.51027,
|
314
|
+
0.451924, 1.000000], dtype=xp.float64)
|
277
315
|
with suppress_warnings() as sup:
|
278
316
|
sup.filter(UserWarning, "This window is not suitable")
|
279
|
-
cheb_even = windows.chebwin(8, at=-10)
|
317
|
+
cheb_even = windows.chebwin(8, at=-10, xp=xp)
|
280
318
|
assert_array_almost_equal(cheb_even, cheb_even_low_at_true, decimal=4)
|
281
319
|
|
282
320
|
|
@@ -309,224 +347,255 @@ exponential_data = {
|
|
309
347
|
}
|
310
348
|
|
311
349
|
|
312
|
-
def test_exponential():
|
350
|
+
def test_exponential(xp):
|
313
351
|
for k, v in exponential_data.items():
|
314
352
|
if v is None:
|
315
|
-
assert_raises(ValueError, windows.exponential, *k)
|
353
|
+
assert_raises(ValueError, windows.exponential, *k, xp=xp)
|
316
354
|
else:
|
317
|
-
win = windows.exponential(*k)
|
318
|
-
|
355
|
+
win = windows.exponential(*k, xp=xp)
|
356
|
+
xp_assert_close(win, xp.asarray(v), rtol=1e-14)
|
319
357
|
|
320
358
|
|
321
359
|
class TestFlatTop:
|
322
360
|
|
323
|
-
def test_basic(self):
|
324
|
-
|
325
|
-
[-0.000421051, -0.051263156, 0.19821053, 1.0,
|
326
|
-
|
327
|
-
|
328
|
-
[-0.000421051, -0.03684078115492348,
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
[-0.000421051, -0.0677142520762119,
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
361
|
+
def test_basic(self, xp):
|
362
|
+
xp_assert_close(windows.flattop(6, sym=False, xp=xp),
|
363
|
+
xp.asarray([-0.000421051, -0.051263156, 0.19821053, 1.0,
|
364
|
+
0.19821053, -0.051263156], dtype=xp.float64))
|
365
|
+
xp_assert_close(windows.flattop(7, sym=False, xp=xp),
|
366
|
+
xp.asarray([-0.000421051, -0.03684078115492348,
|
367
|
+
0.01070371671615342, 0.7808739149387698,
|
368
|
+
0.7808739149387698, 0.01070371671615342,
|
369
|
+
-0.03684078115492348], dtype=xp.float64))
|
370
|
+
xp_assert_close(windows.flattop(6, xp=xp),
|
371
|
+
xp.asarray([-0.000421051, -0.0677142520762119,
|
372
|
+
0.6068721525762117, 0.6068721525762117,
|
373
|
+
-0.0677142520762119, -0.000421051],
|
374
|
+
dtype=xp.float64))
|
375
|
+
xp_assert_close(windows.flattop(7, True, xp=xp),
|
376
|
+
xp.asarray([-0.000421051, -0.051263156, 0.19821053, 1.0,
|
377
|
+
0.19821053, -0.051263156, -0.000421051],
|
378
|
+
dtype=xp.float64))
|
339
379
|
|
340
380
|
|
341
381
|
class TestGaussian:
|
342
382
|
|
343
|
-
def test_basic(self):
|
344
|
-
|
345
|
-
[0.04393693362340742, 0.3246524673583497,
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
383
|
+
def test_basic(self, xp):
|
384
|
+
xp_assert_close(windows.gaussian(6, 1.0, xp=xp),
|
385
|
+
xp.asarray([0.04393693362340742, 0.3246524673583497,
|
386
|
+
0.8824969025845955, 0.8824969025845955,
|
387
|
+
0.3246524673583497, 0.04393693362340742],
|
388
|
+
dtype=xp.float64))
|
389
|
+
xp_assert_close(windows.gaussian(7, 1.2, xp=xp),
|
390
|
+
xp.asarray([0.04393693362340742, 0.2493522087772962,
|
391
|
+
0.7066482778577162, 1.0, 0.7066482778577162,
|
392
|
+
0.2493522087772962, 0.04393693362340742],
|
393
|
+
dtype=xp.float64))
|
394
|
+
xp_assert_close(windows.gaussian(7, 3, xp=xp),
|
395
|
+
xp.asarray([0.6065306597126334, 0.8007374029168081,
|
396
|
+
0.9459594689067654, 1.0, 0.9459594689067654,
|
397
|
+
0.8007374029168081, 0.6065306597126334],
|
398
|
+
dtype=xp.float64))
|
399
|
+
xp_assert_close(windows.gaussian(6, 3, False, xp=xp),
|
400
|
+
xp.asarray([0.6065306597126334, 0.8007374029168081,
|
401
|
+
0.9459594689067654, 1.0, 0.9459594689067654,
|
402
|
+
0.8007374029168081], dtype=xp.float64))
|
360
403
|
|
361
404
|
|
362
405
|
class TestGeneralCosine:
|
363
406
|
|
364
|
-
def test_basic(self):
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
407
|
+
def test_basic(self, xp):
|
408
|
+
a = xp.asarray([0.5, 0.3, 0.2])
|
409
|
+
xp_assert_close(windows.general_cosine(5, a),
|
410
|
+
xp.asarray([0.4, 0.3, 1, 0.3, 0.4], dtype=xp.float64))
|
411
|
+
|
412
|
+
a = xp.asarray([0.5, 0.3, 0.2])
|
413
|
+
xp_assert_close(windows.general_cosine(4, a, sym=False),
|
414
|
+
xp.asarray([0.4, 0.3, 1, 0.3], dtype=xp.float64))
|
369
415
|
|
370
416
|
|
371
417
|
class TestGeneralHamming:
|
372
418
|
|
373
|
-
def test_basic(self):
|
374
|
-
|
375
|
-
[0.4, 0.7, 1.0, 0.7, 0.4])
|
376
|
-
|
377
|
-
[0.5, 0.6727457514, 0.9522542486,
|
378
|
-
|
379
|
-
|
380
|
-
[0.5, 0.6727457514, 0.9522542486,
|
381
|
-
|
419
|
+
def test_basic(self, xp):
|
420
|
+
xp_assert_close(windows.general_hamming(5, 0.7, xp=xp),
|
421
|
+
xp.asarray([0.4, 0.7, 1.0, 0.7, 0.4], dtype=xp.float64))
|
422
|
+
xp_assert_close(windows.general_hamming(5, 0.75, sym=False, xp=xp),
|
423
|
+
xp.asarray([0.5, 0.6727457514, 0.9522542486,
|
424
|
+
0.9522542486, 0.6727457514], dtype=xp.float64))
|
425
|
+
xp_assert_close(windows.general_hamming(6, 0.75, sym=True, xp=xp),
|
426
|
+
xp.asarray([0.5, 0.6727457514, 0.9522542486,
|
427
|
+
0.9522542486, 0.6727457514, 0.5], dtype=xp.float64))
|
382
428
|
|
383
429
|
|
384
430
|
class TestHamming:
|
385
431
|
|
386
|
-
def test_basic(self):
|
387
|
-
|
388
|
-
[0.08, 0.31, 0.77, 1.0, 0.77, 0.31]
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
432
|
+
def test_basic(self, xp):
|
433
|
+
xp_assert_close(windows.hamming(6, False, xp=xp),
|
434
|
+
xp.asarray([0.08, 0.31, 0.77, 1.0, 0.77, 0.31],
|
435
|
+
dtype=xp.float64))
|
436
|
+
xp_assert_close(windows.hamming(7, sym=False, xp=xp),
|
437
|
+
xp.asarray([0.08, 0.2531946911449826, 0.6423596296199047,
|
438
|
+
0.9544456792351128, 0.9544456792351128,
|
439
|
+
0.6423596296199047, 0.2531946911449826],
|
440
|
+
dtype=xp.float64))
|
441
|
+
xp_assert_close(windows.hamming(6, xp=xp),
|
442
|
+
xp.asarray([0.08, 0.3978521825875242, 0.9121478174124757,
|
443
|
+
0.9121478174124757, 0.3978521825875242, 0.08],
|
444
|
+
dtype=xp.float64))
|
445
|
+
xp_assert_close(windows.hamming(7, sym=True, xp=xp),
|
446
|
+
xp.asarray([0.08, 0.31, 0.77, 1.0, 0.77, 0.31, 0.08],
|
447
|
+
dtype=xp.float64))
|
398
448
|
|
399
449
|
|
400
450
|
class TestHann:
|
401
451
|
|
402
|
-
def test_basic(self):
|
403
|
-
|
404
|
-
[0, 0.25, 0.75, 1.0, 0.75, 0.25],
|
452
|
+
def test_basic(self, xp):
|
453
|
+
xp_assert_close(windows.hann(6, sym=False, xp=xp),
|
454
|
+
xp.asarray([0, 0.25, 0.75, 1.0, 0.75, 0.25], dtype=xp.float64),
|
405
455
|
rtol=1e-15, atol=1e-15)
|
406
|
-
|
407
|
-
[0, 0.1882550990706332, 0.6112604669781572,
|
408
|
-
|
409
|
-
|
456
|
+
xp_assert_close(windows.hann(7, sym=False, xp=xp),
|
457
|
+
xp.asarray([0, 0.1882550990706332, 0.6112604669781572,
|
458
|
+
0.9504844339512095, 0.9504844339512095,
|
459
|
+
0.6112604669781572, 0.1882550990706332],
|
460
|
+
dtype=xp.float64),
|
410
461
|
rtol=1e-15, atol=1e-15)
|
411
|
-
|
412
|
-
[0, 0.3454915028125263, 0.9045084971874737,
|
413
|
-
|
462
|
+
xp_assert_close(windows.hann(6, True, xp=xp),
|
463
|
+
xp.asarray([0, 0.3454915028125263, 0.9045084971874737,
|
464
|
+
0.9045084971874737, 0.3454915028125263, 0],
|
465
|
+
dtype=xp.float64),
|
414
466
|
rtol=1e-15, atol=1e-15)
|
415
|
-
|
416
|
-
[0, 0.25, 0.75, 1.0, 0.75, 0.25, 0],
|
467
|
+
xp_assert_close(windows.hann(7, xp=xp),
|
468
|
+
xp.asarray([0, 0.25, 0.75, 1.0, 0.75, 0.25, 0],
|
469
|
+
dtype=xp.float64),
|
417
470
|
rtol=1e-15, atol=1e-15)
|
418
471
|
|
419
472
|
|
420
473
|
class TestKaiser:
|
421
474
|
|
422
|
-
def test_basic(self):
|
423
|
-
|
424
|
-
[0.9403061933191572, 0.9782962393705389,
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
475
|
+
def test_basic(self, xp):
|
476
|
+
xp_assert_close(windows.kaiser(6, 0.5, xp=xp),
|
477
|
+
xp.asarray([0.9403061933191572, 0.9782962393705389,
|
478
|
+
0.9975765035372042, 0.9975765035372042,
|
479
|
+
0.9782962393705389, 0.9403061933191572],
|
480
|
+
dtype=xp.float64))
|
481
|
+
xp_assert_close(windows.kaiser(7, 0.5, xp=xp),
|
482
|
+
xp.asarray([0.9403061933191572, 0.9732402256999829,
|
483
|
+
0.9932754654413773, 1.0, 0.9932754654413773,
|
484
|
+
0.9732402256999829, 0.9403061933191572],
|
485
|
+
dtype=xp.float64))
|
486
|
+
xp_assert_close(windows.kaiser(6, 2.7, xp=xp),
|
487
|
+
xp.asarray([0.2603047507678832, 0.6648106293528054,
|
488
|
+
0.9582099802511439, 0.9582099802511439,
|
489
|
+
0.6648106293528054, 0.2603047507678832],
|
490
|
+
dtype=xp.float64))
|
491
|
+
xp_assert_close(windows.kaiser(7, 2.7, xp=xp),
|
492
|
+
xp.asarray([0.2603047507678832, 0.5985765418119844,
|
493
|
+
0.8868495172060835, 1.0, 0.8868495172060835,
|
494
|
+
0.5985765418119844, 0.2603047507678832],
|
495
|
+
dtype=xp.float64))
|
496
|
+
xp_assert_close(windows.kaiser(6, 2.7, False, xp=xp),
|
497
|
+
xp.asarray([0.2603047507678832, 0.5985765418119844,
|
498
|
+
0.8868495172060835, 1.0, 0.8868495172060835,
|
499
|
+
0.5985765418119844], dtype=xp.float64))
|
443
500
|
|
444
501
|
|
445
502
|
class TestKaiserBesselDerived:
|
446
503
|
|
447
|
-
def test_basic(self):
|
504
|
+
def test_basic(self, xp):
|
505
|
+
# cover case `M < 1`
|
506
|
+
w = windows.kaiser_bessel_derived(0.5, beta=4.0, xp=xp)
|
507
|
+
xp_assert_equal(w, xp.asarray([]))
|
508
|
+
|
448
509
|
M = 100
|
449
|
-
w = windows.kaiser_bessel_derived(M, beta=4.0)
|
510
|
+
w = windows.kaiser_bessel_derived(M, beta=4.0, xp=xp)
|
450
511
|
w2 = windows.get_window(('kaiser bessel derived', 4.0),
|
451
|
-
M, fftbins=False)
|
452
|
-
|
512
|
+
M, fftbins=False, xp=xp)
|
513
|
+
xp_assert_close(w, w2)
|
453
514
|
|
454
515
|
# Test for Princen-Bradley condition
|
455
|
-
|
516
|
+
actual = w[:M // 2] ** 2 + w[-M // 2:] ** 2
|
517
|
+
xp_assert_close(actual, xp.ones(actual.shape, dtype=actual.dtype))
|
456
518
|
|
457
519
|
# Test actual values from other implementations
|
458
520
|
# M = 2: sqrt(2) / 2
|
459
521
|
# M = 4: 0.518562710536, 0.855039598640
|
460
522
|
# M = 6: 0.436168993154, 0.707106781187, 0.899864772847
|
461
523
|
# Ref:https://github.com/scipy/scipy/pull/4747#issuecomment-172849418
|
462
|
-
|
463
|
-
|
524
|
+
actual = windows.kaiser_bessel_derived(2, beta=np.pi / 2, xp=xp)[:1]
|
525
|
+
desired = xp.ones_like(actual) * math.sqrt(2) / 2.0
|
526
|
+
xp_assert_close(actual, desired)
|
464
527
|
|
465
|
-
|
466
|
-
[0.518562710536, 0.855039598640])
|
528
|
+
xp_assert_close(windows.kaiser_bessel_derived(4, beta=np.pi / 2, xp=xp)[:2],
|
529
|
+
xp.asarray([0.518562710536, 0.855039598640], dtype=xp.float64))
|
467
530
|
|
468
|
-
|
469
|
-
[0.436168993154, 0.707106781187, 0.899864772847]
|
531
|
+
xp_assert_close(windows.kaiser_bessel_derived(6, beta=np.pi / 2, xp=xp)[:3],
|
532
|
+
xp.asarray([0.436168993154, 0.707106781187, 0.899864772847],
|
533
|
+
dtype=xp.float64))
|
470
534
|
|
471
|
-
def test_exceptions(self):
|
535
|
+
def test_exceptions(self, xp):
|
472
536
|
M = 100
|
473
537
|
# Assert ValueError for odd window length
|
474
538
|
msg = ("Kaiser-Bessel Derived windows are only defined for even "
|
475
539
|
"number of points")
|
476
540
|
with assert_raises(ValueError, match=msg):
|
477
|
-
windows.kaiser_bessel_derived(M + 1, beta=4
|
541
|
+
windows.kaiser_bessel_derived(M + 1, beta=4., xp=xp)
|
478
542
|
|
479
543
|
# Assert ValueError for non-symmetric setting
|
480
544
|
msg = ("Kaiser-Bessel Derived windows are only defined for "
|
481
545
|
"symmetric shapes")
|
482
546
|
with assert_raises(ValueError, match=msg):
|
483
|
-
windows.kaiser_bessel_derived(M + 1, beta=4., sym=False)
|
547
|
+
windows.kaiser_bessel_derived(M + 1, beta=4., sym=False, xp=xp)
|
484
548
|
|
485
549
|
|
486
550
|
class TestNuttall:
|
487
551
|
|
488
|
-
def test_basic(self):
|
489
|
-
|
490
|
-
[0.0003628, 0.0613345, 0.5292298, 1.0, 0.5292298,
|
491
|
-
|
492
|
-
|
493
|
-
[0.0003628, 0.03777576895352025,
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
552
|
+
def test_basic(self, xp):
|
553
|
+
xp_assert_close(windows.nuttall(6, sym=False, xp=xp),
|
554
|
+
xp.asarray([0.0003628, 0.0613345, 0.5292298, 1.0, 0.5292298,
|
555
|
+
0.0613345], dtype=xp.float64))
|
556
|
+
xp_assert_close(windows.nuttall(7, sym=False, xp=xp),
|
557
|
+
xp.asarray([0.0003628, 0.03777576895352025,
|
558
|
+
0.3427276199688195,
|
559
|
+
0.8918518610776603, 0.8918518610776603,
|
560
|
+
0.3427276199688196, 0.0377757689535203],
|
561
|
+
dtype=xp.float64))
|
562
|
+
xp_assert_close(windows.nuttall(6, xp=xp),
|
563
|
+
xp.asarray([0.0003628, 0.1105152530498718,
|
564
|
+
0.7982580969501282, 0.7982580969501283,
|
565
|
+
0.1105152530498719, 0.0003628], dtype=xp.float64))
|
566
|
+
xp_assert_close(windows.nuttall(7, True, xp=xp),
|
567
|
+
xp.asarray([0.0003628, 0.0613345, 0.5292298, 1.0,
|
568
|
+
0.5292298, 0.0613345, 0.0003628], dtype=xp.float64))
|
502
569
|
|
503
570
|
|
504
571
|
class TestParzen:
|
505
572
|
|
506
|
-
def test_basic(self):
|
507
|
-
|
508
|
-
[0.009259259259259254, 0.25, 0.8611111111111112,
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
573
|
+
def test_basic(self, xp):
|
574
|
+
xp_assert_close(windows.parzen(6, xp=xp),
|
575
|
+
xp.asarray([0.009259259259259254, 0.25, 0.8611111111111112,
|
576
|
+
0.8611111111111112, 0.25, 0.009259259259259254],
|
577
|
+
dtype=xp.float64))
|
578
|
+
xp_assert_close(windows.parzen(7, sym=True, xp=xp),
|
579
|
+
xp.asarray([0.00583090379008747, 0.1574344023323616,
|
580
|
+
0.6501457725947521, 1.0, 0.6501457725947521,
|
581
|
+
0.1574344023323616, 0.00583090379008747],
|
582
|
+
dtype=xp.float64))
|
583
|
+
xp_assert_close(windows.parzen(6, False, xp=xp),
|
584
|
+
xp.asarray([0.00583090379008747, 0.1574344023323616,
|
585
|
+
0.6501457725947521, 1.0, 0.6501457725947521,
|
586
|
+
0.1574344023323616], dtype=xp.float64))
|
518
587
|
|
519
588
|
|
520
589
|
class TestTriang:
|
521
590
|
|
522
|
-
def test_basic(self):
|
591
|
+
def test_basic(self, xp):
|
523
592
|
|
524
|
-
|
525
|
-
[1/6, 1/2, 5/6, 5/6, 1/2, 1/6])
|
526
|
-
|
527
|
-
[1/4, 1/2, 3/4, 1, 3/4, 1/2, 1/4])
|
528
|
-
|
529
|
-
[1/4, 1/2, 3/4, 1, 3/4, 1/2])
|
593
|
+
xp_assert_close(windows.triang(6, True, xp=xp),
|
594
|
+
xp.asarray([1/6, 1/2, 5/6, 5/6, 1/2, 1/6], dtype=xp.float64))
|
595
|
+
xp_assert_close(windows.triang(7, xp=xp),
|
596
|
+
xp.asarray([1/4, 1/2, 3/4, 1, 3/4, 1/2, 1/4], dtype=xp.float64))
|
597
|
+
xp_assert_close(windows.triang(6, sym=False, xp=xp),
|
598
|
+
xp.asarray([1/4, 1/2, 3/4, 1, 3/4, 1/2], dtype=xp.float64))
|
530
599
|
|
531
600
|
|
532
601
|
tukey_data = {
|
@@ -543,10 +612,10 @@ tukey_data = {
|
|
543
612
|
1.0, 0.69134171618254492, 0.0]),
|
544
613
|
(5, 1.0, True): array([0.0, 0.5, 1.0, 0.5, 0.0]),
|
545
614
|
|
546
|
-
(6, 0): [1, 1, 1, 1, 1, 1],
|
547
|
-
(7, 0): [1, 1, 1, 1, 1, 1, 1],
|
548
|
-
(6, .25): [0, 1, 1, 1, 1, 0],
|
549
|
-
(7, .25): [0, 1, 1, 1, 1, 1, 0],
|
615
|
+
(6, 0): [1.0, 1, 1, 1, 1, 1],
|
616
|
+
(7, 0): [1.0, 1, 1, 1, 1, 1, 1],
|
617
|
+
(6, .25): [0.0, 1, 1, 1, 1, 0],
|
618
|
+
(7, .25): [0.0, 1, 1, 1, 1, 1, 0],
|
550
619
|
(6,): [0, 0.9045084971874737, 1.0, 1.0, 0.9045084971874735, 0],
|
551
620
|
(7,): [0, 0.75, 1.0, 1.0, 1.0, 0.75, 0],
|
552
621
|
(6, .75): [0, 0.5522642316338269, 1.0, 1.0, 0.5522642316338267, 0],
|
@@ -560,24 +629,30 @@ tukey_data = {
|
|
560
629
|
|
561
630
|
class TestTukey:
|
562
631
|
|
563
|
-
def test_basic(self):
|
632
|
+
def test_basic(self, xp):
|
564
633
|
# Test against hardcoded data
|
565
634
|
for k, v in tukey_data.items():
|
566
635
|
if v is None:
|
567
|
-
assert_raises(ValueError, windows.tukey, *k)
|
636
|
+
assert_raises(ValueError, windows.tukey, *k, xp=xp)
|
568
637
|
else:
|
569
|
-
|
570
|
-
|
638
|
+
if is_torch(xp) and k in [(6,), (6, .75), (7, .75), (6,1)]:
|
639
|
+
atol_rtol = {'rtol': 3e-8, 'atol': 1e-8}
|
640
|
+
else:
|
641
|
+
atol_rtol = {'rtol': 1e-15, 'atol': 1e-15 }
|
642
|
+
|
643
|
+
win = windows.tukey(*k, xp=xp)
|
644
|
+
xp_assert_close(win, xp.asarray(v),
|
645
|
+
check_dtype=False, **atol_rtol)
|
571
646
|
|
572
|
-
def test_extremes(self):
|
647
|
+
def test_extremes(self, xp):
|
573
648
|
# Test extremes of alpha correspond to boxcar and hann
|
574
|
-
tuk0 = windows.tukey(100, 0)
|
575
|
-
box0 = windows.boxcar(100)
|
576
|
-
|
649
|
+
tuk0 = windows.tukey(100, 0, xp=xp)
|
650
|
+
box0 = windows.boxcar(100, xp=xp)
|
651
|
+
xp_assert_close(tuk0, box0)
|
577
652
|
|
578
|
-
tuk1 = windows.tukey(100, 1)
|
579
|
-
han1 = windows.hann(100)
|
580
|
-
|
653
|
+
tuk1 = windows.tukey(100, 1, xp=xp)
|
654
|
+
han1 = windows.hann(100, xp=xp)
|
655
|
+
xp_assert_close(tuk1, han1)
|
581
656
|
|
582
657
|
|
583
658
|
dpss_data = {
|
@@ -591,46 +666,47 @@ dpss_data = {
|
|
591
666
|
}
|
592
667
|
|
593
668
|
|
669
|
+
@skip_xp_backends(np_only=True, reason='banded linear algebra is numpy-only')
|
594
670
|
class TestDPSS:
|
595
671
|
|
596
|
-
def test_basic(self):
|
672
|
+
def test_basic(self, xp):
|
597
673
|
# Test against hardcoded data
|
598
674
|
for k, v in dpss_data.items():
|
599
|
-
win, ratios = windows.dpss(*k, return_ratios=True)
|
600
|
-
|
601
|
-
|
675
|
+
win, ratios = windows.dpss(*k, return_ratios=True, xp=xp)
|
676
|
+
xp_assert_close(win, v[0], atol=1e-7, err_msg=k)
|
677
|
+
xp_assert_close(ratios, v[1], rtol=1e-5, atol=1e-7, err_msg=k)
|
602
678
|
|
603
|
-
def test_unity(self):
|
679
|
+
def test_unity(self, xp):
|
604
680
|
# Test unity value handling (gh-2221)
|
605
681
|
for M in range(1, 21):
|
606
682
|
# corrected w/approximation (default)
|
607
|
-
win = windows.dpss(M, M / 2.1)
|
683
|
+
win = windows.dpss(M, M / 2.1, xp=xp)
|
608
684
|
expected = M % 2 # one for odd, none for even
|
609
|
-
|
685
|
+
xp_assert_equal(np.isclose(win, 1.).sum(), expected,
|
610
686
|
err_msg=f'{win}')
|
611
687
|
# corrected w/subsample delay (slower)
|
612
|
-
win_sub = windows.dpss(M, M / 2.1, norm='subsample')
|
688
|
+
win_sub = windows.dpss(M, M / 2.1, norm='subsample', xp=xp)
|
613
689
|
if M > 2:
|
614
690
|
# @M=2 the subsample doesn't do anything
|
615
|
-
|
691
|
+
xp_assert_equal(np.isclose(win_sub, 1.).sum(), expected,
|
616
692
|
err_msg=f'{win_sub}')
|
617
|
-
|
693
|
+
xp_assert_close(win, win_sub, rtol=0.03) # within 3%
|
618
694
|
# not the same, l2-norm
|
619
|
-
win_2 = windows.dpss(M, M / 2.1, norm=2)
|
695
|
+
win_2 = windows.dpss(M, M / 2.1, norm=2, xp=xp)
|
620
696
|
expected = 1 if M == 1 else 0
|
621
|
-
|
697
|
+
xp_assert_equal(np.isclose(win_2, 1.).sum(), expected,
|
622
698
|
err_msg=f'{win_2}')
|
623
699
|
|
624
|
-
def test_extremes(self):
|
700
|
+
def test_extremes(self, xp):
|
625
701
|
# Test extremes of alpha
|
626
|
-
lam = windows.dpss(31, 6, 4, return_ratios=True)[1]
|
627
|
-
|
628
|
-
lam = windows.dpss(31, 7, 4, return_ratios=True)[1]
|
629
|
-
|
630
|
-
lam = windows.dpss(31, 8, 4, return_ratios=True)[1]
|
631
|
-
|
632
|
-
|
633
|
-
def test_degenerate(self):
|
702
|
+
lam = windows.dpss(31, 6, 4, return_ratios=True, xp=xp)[1]
|
703
|
+
xp_assert_close(lam, xp.ones_like(lam))
|
704
|
+
lam = windows.dpss(31, 7, 4, return_ratios=True, xp=xp)[1]
|
705
|
+
xp_assert_close(lam, xp.ones_like(lam))
|
706
|
+
lam = windows.dpss(31, 8, 4, return_ratios=True, xp=xp)[1]
|
707
|
+
xp_assert_close(lam, xp.ones_like(lam))
|
708
|
+
|
709
|
+
def test_degenerate(self, xp):
|
634
710
|
# Test failures
|
635
711
|
assert_raises(ValueError, windows.dpss, 4, 1.5, -1) # Bad Kmax
|
636
712
|
assert_raises(ValueError, windows.dpss, 4, 1.5, -5)
|
@@ -640,10 +716,31 @@ class TestDPSS:
|
|
640
716
|
assert_raises(ValueError, windows.dpss, 3, 0, 3)
|
641
717
|
assert_raises(ValueError, windows.dpss, -1, 1, 3) # negative M
|
642
718
|
|
719
|
+
@skip_xp_backends(np_only=True)
|
720
|
+
def test_degenerate_signle_samples(self, xp):
|
721
|
+
# Single samples
|
722
|
+
w = windows.dpss(1, 1.)
|
723
|
+
xp_assert_equal(w, [1.])
|
724
|
+
w, ratio = windows.dpss(1, 1., return_ratios=True)
|
725
|
+
xp_assert_equal(w, [1.])
|
726
|
+
assert ratio == 1.
|
727
|
+
w, ratio = windows.dpss(1, 1., Kmax=4, return_ratios=True)
|
728
|
+
xp_assert_equal(w, [1.])
|
729
|
+
assert isinstance(ratio, np.ndarray)
|
730
|
+
xp_assert_equal(ratio, [1.])
|
731
|
+
|
732
|
+
assert_raises(ValueError, windows.dpss, 4, 1.5, -1, xp=xp) # Bad Kmax
|
733
|
+
assert_raises(ValueError, windows.dpss, 4, 1.5, -5, xp=xp)
|
734
|
+
assert_raises(TypeError, windows.dpss, 4, 1.5, 1.1, xp=xp)
|
735
|
+
assert_raises(ValueError, windows.dpss, 3, 1.5, 3, xp=xp) # NW must be < N/2.
|
736
|
+
assert_raises(ValueError, windows.dpss, 3, -1, 3, xp=xp) # NW must be pos
|
737
|
+
assert_raises(ValueError, windows.dpss, 3, 0, 3, xp=xp)
|
738
|
+
assert_raises(ValueError, windows.dpss, -1, 1, 3, xp=xp) # negative M
|
739
|
+
|
643
740
|
|
644
741
|
class TestLanczos:
|
645
742
|
|
646
|
-
def test_basic(self):
|
743
|
+
def test_basic(self, xp):
|
647
744
|
# Analytical results:
|
648
745
|
# sinc(x) = sinc(-x)
|
649
746
|
# sinc(pi) = 0, sinc(0) = 1
|
@@ -652,151 +749,189 @@ class TestLanczos:
|
|
652
749
|
# sinc(pi / 3) = 0.826993343
|
653
750
|
# sinc(3 pi / 5) = 0.504551152
|
654
751
|
# sinc(pi / 5) = 0.935489284
|
655
|
-
|
656
|
-
[0., 0.413496672,
|
657
|
-
|
658
|
-
|
752
|
+
xp_assert_close(windows.lanczos(6, sym=False, xp=xp),
|
753
|
+
xp.asarray([0., 0.413496672,
|
754
|
+
0.826993343, 1., 0.826993343,
|
755
|
+
0.413496672], dtype=xp.float64),
|
659
756
|
atol=1e-9)
|
660
|
-
|
661
|
-
[0., 0.504551152,
|
662
|
-
|
663
|
-
|
757
|
+
xp_assert_close(windows.lanczos(6, xp=xp),
|
758
|
+
xp.asarray([0., 0.504551152,
|
759
|
+
0.935489284, 0.935489284,
|
760
|
+
0.504551152, 0.], dtype=xp.float64),
|
664
761
|
atol=1e-9)
|
665
|
-
|
666
|
-
[0., 0.413496672,
|
667
|
-
|
668
|
-
|
762
|
+
xp_assert_close(windows.lanczos(7, sym=True, xp=xp),
|
763
|
+
xp.asarray([0., 0.413496672,
|
764
|
+
0.826993343, 1., 0.826993343,
|
765
|
+
0.413496672, 0.], dtype=xp.float64),
|
669
766
|
atol=1e-9)
|
670
767
|
|
671
|
-
def test_array_size(self):
|
768
|
+
def test_array_size(self, xp):
|
672
769
|
for n in [0, 10, 11]:
|
673
|
-
|
674
|
-
|
770
|
+
assert windows.lanczos(n, sym=False, xp=xp).shape[0] == n
|
771
|
+
assert windows.lanczos(n, sym=True, xp=xp).shape[0] == n
|
675
772
|
|
676
773
|
|
677
774
|
class TestGetWindow:
|
678
775
|
|
679
|
-
def test_boxcar(self):
|
680
|
-
w = windows.get_window('boxcar', 12)
|
681
|
-
|
776
|
+
def test_boxcar(self, xp):
|
777
|
+
w = windows.get_window('boxcar', 12, xp=xp)
|
778
|
+
xp_assert_equal(w, xp.ones_like(w))
|
682
779
|
|
683
780
|
# window is a tuple of len 1
|
684
|
-
w = windows.get_window(('boxcar',), 16)
|
685
|
-
|
781
|
+
w = windows.get_window(('boxcar',), 16, xp=xp)
|
782
|
+
xp_assert_equal(w, xp.ones_like(w))
|
686
783
|
|
687
|
-
|
784
|
+
@skip_xp_backends('jax.numpy', reason='item assignment')
|
785
|
+
@skip_xp_backends('dask.array', reason='data-dependent output shapes')
|
786
|
+
def test_cheb_odd(self, xp):
|
688
787
|
with suppress_warnings() as sup:
|
689
788
|
sup.filter(UserWarning, "This window is not suitable")
|
690
|
-
w = windows.get_window(('chebwin', -40), 53, fftbins=False)
|
691
|
-
assert_array_almost_equal(
|
789
|
+
w = windows.get_window(('chebwin', -40), 53, fftbins=False, xp=xp)
|
790
|
+
assert_array_almost_equal(
|
791
|
+
w, xp.asarray(cheb_odd_true, dtype=xp.float64), decimal=4
|
792
|
+
)
|
692
793
|
|
693
|
-
|
794
|
+
@skip_xp_backends('jax.numpy', reason='item assignment')
|
795
|
+
@skip_xp_backends('dask.array', reason='data-dependent output shapes')
|
796
|
+
def test_cheb_even(self, xp):
|
694
797
|
with suppress_warnings() as sup:
|
695
798
|
sup.filter(UserWarning, "This window is not suitable")
|
696
|
-
w = windows.get_window(('chebwin', 40), 54, fftbins=False)
|
697
|
-
assert_array_almost_equal(w, cheb_even_true, decimal=4)
|
799
|
+
w = windows.get_window(('chebwin', 40), 54, fftbins=False, xp=xp)
|
800
|
+
assert_array_almost_equal(w, xp.asarray(cheb_even_true), decimal=4)
|
698
801
|
|
699
|
-
|
700
|
-
|
701
|
-
|
802
|
+
@skip_xp_backends(cpu_only=True, reason='eigh_tridiagonal is CPU-only')
|
803
|
+
def test_dpss(self, xp):
|
804
|
+
win1 = windows.get_window(('dpss', 3), 64, fftbins=False, xp=xp)
|
805
|
+
win2 = windows.dpss(64, 3, xp=xp)
|
702
806
|
assert_array_almost_equal(win1, win2, decimal=4)
|
703
807
|
|
704
|
-
def test_kaiser_float(self):
|
705
|
-
win1 = windows.get_window(7.2, 64)
|
706
|
-
win2 = windows.kaiser(64, 7.2, False)
|
707
|
-
|
808
|
+
def test_kaiser_float(self, xp):
|
809
|
+
win1 = windows.get_window(7.2, 64, xp=xp)
|
810
|
+
win2 = windows.kaiser(64, 7.2, False, xp=xp)
|
811
|
+
xp_assert_close(win1, win2)
|
708
812
|
|
709
|
-
def test_invalid_inputs(self):
|
813
|
+
def test_invalid_inputs(self, xp):
|
710
814
|
# Window is not a float, tuple, or string
|
711
|
-
assert_raises(ValueError, windows.get_window, set('hann'), 8)
|
815
|
+
assert_raises(ValueError, windows.get_window, set('hann'), 8, xp=xp)
|
712
816
|
|
713
817
|
# Unknown window type error
|
714
|
-
assert_raises(ValueError, windows.get_window, 'broken', 4)
|
818
|
+
assert_raises(ValueError, windows.get_window, 'broken', 4, xp=xp)
|
715
819
|
|
716
|
-
|
717
|
-
|
820
|
+
@xfail_xp_backends(np_only=True, reason='TODO: make resample array API ready')
|
821
|
+
def test_array_as_window(self, xp):
|
822
|
+
# github issue 3603
|
718
823
|
osfactor = 128
|
719
|
-
sig =
|
824
|
+
sig = xp.arange(128)
|
720
825
|
|
721
|
-
win = windows.get_window(('kaiser', 8.0), osfactor // 2)
|
722
|
-
with assert_raises(ValueError, match='
|
826
|
+
win = windows.get_window(('kaiser', 8.0), osfactor // 2, xp=xp)
|
827
|
+
with assert_raises(ValueError, match='^window.shape='):
|
723
828
|
resample(sig, len(sig) * osfactor, window=win)
|
724
829
|
|
725
|
-
def test_general_cosine(self):
|
726
|
-
|
727
|
-
[0.4, 0.3, 1, 0.3])
|
728
|
-
|
830
|
+
def test_general_cosine(self, xp):
|
831
|
+
xp_assert_close(get_window(('general_cosine', xp.asarray([0.5, 0.3, 0.2])), 4),
|
832
|
+
xp.asarray([0.4, 0.3, 1, 0.3], dtype=xp.float64))
|
833
|
+
xp_assert_close(get_window(('general_cosine', xp.asarray([0.5, 0.3, 0.2])), 4,
|
729
834
|
fftbins=False),
|
730
|
-
[0.4, 0.55, 0.55, 0.4])
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
[0
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
835
|
+
xp.asarray([0.4, 0.55, 0.55, 0.4], dtype=xp.float64))
|
836
|
+
|
837
|
+
with pytest.raises(ValueError):
|
838
|
+
get_window(('general_cosine', [0.5, 0.3, 0.2]), 4, xp=xp)
|
839
|
+
|
840
|
+
def test_general_hamming(self, xp):
|
841
|
+
xp_assert_close(get_window(('general_hamming', 0.7), 5, xp=xp),
|
842
|
+
xp.asarray([0.4, 0.6072949, 0.9427051, 0.9427051, 0.6072949],
|
843
|
+
dtype=xp.float64))
|
844
|
+
xp_assert_close(get_window(('general_hamming', 0.7), 5, fftbins=False, xp=xp),
|
845
|
+
xp.asarray([0.4, 0.7, 1.0, 0.7, 0.4], dtype=xp.float64))
|
846
|
+
|
847
|
+
def test_lanczos(self, xp):
|
848
|
+
xp_assert_close(get_window('lanczos', 6, xp=xp),
|
849
|
+
xp.asarray([0., 0.413496672, 0.826993343, 1., 0.826993343,
|
850
|
+
0.413496672], dtype=xp.float64), atol=1e-9)
|
851
|
+
xp_assert_close(get_window('lanczos', 6, fftbins=False, xp=xp),
|
852
|
+
xp.asarray([0., 0.504551152, 0.935489284, 0.935489284,
|
853
|
+
0.504551152, 0.], dtype=xp.float64), atol=1e-9)
|
854
|
+
xp_assert_close(get_window('lanczos', 6, xp=xp),
|
855
|
+
get_window('sinc', 6, xp=xp))
|
856
|
+
|
857
|
+
def test_xp_default(self, xp):
|
858
|
+
# no explicit xp= argument, default to numpy
|
859
|
+
win = get_window('lanczos', 6)
|
860
|
+
assert isinstance(win, np.ndarray)
|
861
|
+
|
862
|
+
win = get_window('lanczos', 6, xp=xp)
|
863
|
+
if not is_numpy(xp):
|
864
|
+
assert not isinstance(win, np.ndarray)
|
865
|
+
|
866
|
+
|
867
|
+
@skip_xp_backends("dask.array", reason="https://github.com/dask/dask/issues/2620")
|
868
|
+
def test_windowfunc_basics(xp):
|
749
869
|
for window_name, params in window_funcs:
|
750
870
|
window = getattr(windows, window_name)
|
871
|
+
if is_jax(xp) and window_name in ['taylor', 'chebwin']:
|
872
|
+
pytest.skip(reason=f'{window_name = }: item assignment')
|
873
|
+
if window_name in ['dpss']:
|
874
|
+
if is_cupy(xp):
|
875
|
+
pytest.skip(reason='dpss window is not implemented for cupy')
|
876
|
+
if is_torch(xp) and SCIPY_DEVICE != 'cpu':
|
877
|
+
pytest.skip(reason='needs eight_tridiagonal which is CPU only')
|
878
|
+
|
751
879
|
with suppress_warnings() as sup:
|
752
880
|
sup.filter(UserWarning, "This window is not suitable")
|
753
881
|
# Check symmetry for odd and even lengths
|
754
|
-
w1 = window(8, *params, sym=True)
|
755
|
-
w2 = window(7, *params, sym=False)
|
756
|
-
|
882
|
+
w1 = window(8, *params, sym=True, xp=xp)
|
883
|
+
w2 = window(7, *params, sym=False, xp=xp)
|
884
|
+
xp_assert_close(w1[:-1], w2)
|
757
885
|
|
758
|
-
w1 = window(9, *params, sym=True)
|
759
|
-
w2 = window(8, *params, sym=False)
|
760
|
-
|
886
|
+
w1 = window(9, *params, sym=True, xp=xp)
|
887
|
+
w2 = window(8, *params, sym=False, xp=xp)
|
888
|
+
xp_assert_close(w1[:-1], w2)
|
761
889
|
|
762
890
|
# Check that functions run and output lengths are correct
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
891
|
+
assert window(6, *params, sym=True, xp=xp).shape[0] == 6
|
892
|
+
assert window(6, *params, sym=False, xp=xp).shape[0] == 6
|
893
|
+
assert window(7, *params, sym=True, xp=xp).shape[0] == 7
|
894
|
+
assert window(7, *params, sym=False, xp=xp).shape[0] == 7
|
767
895
|
|
768
896
|
# Check invalid lengths
|
769
|
-
assert_raises(ValueError, window, 5.5, *params)
|
770
|
-
assert_raises(ValueError, window, -7, *params)
|
897
|
+
assert_raises(ValueError, window, 5.5, *params, xp=xp)
|
898
|
+
assert_raises(ValueError, window, -7, *params, xp=xp)
|
771
899
|
|
772
900
|
# Check degenerate cases
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
901
|
+
xp_assert_equal(window(0, *params, sym=True, xp=xp),
|
902
|
+
xp.asarray([], dtype=xp.float64))
|
903
|
+
xp_assert_equal(window(0, *params, sym=False, xp=xp),
|
904
|
+
xp.asarray([], dtype=xp.float64))
|
905
|
+
xp_assert_equal(window(1, *params, sym=True, xp=xp),
|
906
|
+
xp.asarray([1.], dtype=xp.float64))
|
907
|
+
xp_assert_equal(window(1, *params, sym=False, xp=xp),
|
908
|
+
xp.asarray([1.], dtype=xp.float64))
|
777
909
|
|
778
910
|
# Check dtype
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
911
|
+
assert window(0, *params, sym=True, xp=xp).dtype == xp.float64
|
912
|
+
assert window(0, *params, sym=False, xp=xp).dtype == xp.float64
|
913
|
+
assert window(1, *params, sym=True, xp=xp).dtype == xp.float64
|
914
|
+
assert window(1, *params, sym=False, xp=xp).dtype == xp.float64
|
915
|
+
assert window(6, *params, sym=True, xp=xp).dtype == xp.float64
|
916
|
+
assert window(6, *params, sym=False, xp=xp).dtype == xp.float64
|
785
917
|
|
786
918
|
# Check normalization
|
787
|
-
|
788
|
-
|
789
|
-
|
790
|
-
|
919
|
+
assert xp.all(window(10, *params, sym=True, xp=xp) < 1.01)
|
920
|
+
assert xp.all(window(10, *params, sym=False, xp=xp) < 1.01)
|
921
|
+
assert xp.all(window(9, *params, sym=True, xp=xp) < 1.01)
|
922
|
+
assert xp.all(window(9, *params, sym=False, xp=xp) < 1.01)
|
791
923
|
|
792
924
|
# Check that DFT-even spectrum is purely real for odd and even
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
|
925
|
+
res = fft(window(10, *params, sym=False, xp=xp))
|
926
|
+
res = xp.imag(res)
|
927
|
+
xp_assert_close(res, xp.zeros_like(res), atol=1e-14)
|
928
|
+
|
929
|
+
res = fft(window(11, *params, sym=False, xp=xp))
|
930
|
+
res = xp.imag(res)
|
931
|
+
xp_assert_close(res, xp.zeros_like(res), atol=1e-14)
|
797
932
|
|
798
933
|
|
799
|
-
def test_needs_params():
|
934
|
+
def test_needs_params(xp):
|
800
935
|
for winstr in ['kaiser', 'ksr', 'kaiser_bessel_derived', 'kbd',
|
801
936
|
'gaussian', 'gauss', 'gss',
|
802
937
|
'general gaussian', 'general_gaussian',
|
@@ -804,43 +939,49 @@ def test_needs_params():
|
|
804
939
|
'dss', 'dpss', 'general cosine', 'general_cosine',
|
805
940
|
'chebwin', 'cheb', 'general hamming', 'general_hamming',
|
806
941
|
]:
|
807
|
-
assert_raises(ValueError, get_window, winstr, 7)
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
942
|
+
assert_raises(ValueError, get_window, winstr, 7, xp=xp)
|
943
|
+
|
944
|
+
|
945
|
+
_winstr = ['barthann',
|
946
|
+
'bartlett',
|
947
|
+
'blackman',
|
948
|
+
'blackmanharris',
|
949
|
+
'bohman',
|
950
|
+
'boxcar',
|
951
|
+
'cosine',
|
952
|
+
'flattop',
|
953
|
+
'hamming',
|
954
|
+
'nuttall',
|
955
|
+
'parzen',
|
956
|
+
'taylor',
|
957
|
+
'exponential',
|
958
|
+
'poisson',
|
959
|
+
'tukey',
|
960
|
+
'tuk',
|
961
|
+
'triangle',
|
962
|
+
'lanczos',
|
963
|
+
'sinc',
|
964
|
+
]
|
965
|
+
|
966
|
+
|
967
|
+
@pytest.mark.parametrize('winstr', _winstr)
|
968
|
+
def test_not_needs_params(xp, winstr):
|
969
|
+
if is_jax(xp) and winstr in ['taylor']:
|
970
|
+
pytest.skip(reason=f'{winstr}: item assignment')
|
971
|
+
win = get_window(winstr, 7, xp=xp)
|
972
|
+
assert win.shape[0] == 7
|
973
|
+
|
974
|
+
|
975
|
+
def test_symmetric(xp):
|
836
976
|
|
837
977
|
for win in [windows.lanczos]:
|
838
978
|
# Even sampling points
|
839
|
-
w = win(4096)
|
840
|
-
|
841
|
-
|
979
|
+
w = win(4096, xp=xp)
|
980
|
+
flip = array_namespace(w).flip
|
981
|
+
error = xp.max(xp.abs(w - flip(w)))
|
982
|
+
xp_assert_equal(error, xp.asarray(0.0), check_dtype=False, check_0d=False)
|
842
983
|
|
843
984
|
# Odd sampling points
|
844
|
-
w = win(4097)
|
845
|
-
error =
|
846
|
-
|
985
|
+
w = win(4097, xp=xp)
|
986
|
+
error = xp.max(xp.abs(w - flip(w)))
|
987
|
+
xp_assert_equal(error, xp.asarray(0.0), check_dtype=False, check_0d=False)
|