scipy 1.15.2__cp311-cp311-macosx_12_0_arm64.whl → 1.16.0rc1__cp311-cp311-macosx_12_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/.dylibs/libscipy_openblas.dylib +0 -0
- scipy/__config__.py +7 -7
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-311-darwin.so +0 -0
- scipy/_lib/_array_api.py +497 -161
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_bunch.py +4 -0
- scipy/_lib/_ccallback_c.cpython-311-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_ccallback.cpython-311-darwin.so +0 -0
- scipy/_lib/_test_deprecation_call.cpython-311-darwin.so +0 -0
- scipy/_lib/_test_deprecation_def.cpython-311-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-311-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 +169 -34
- scipy/_lib/tests/test_bunch.py +7 -0
- scipy/_lib/tests/test_ccallback.py +2 -10
- scipy/_lib/tests/test_public_api.py +13 -0
- scipy/cluster/_hierarchy.cpython-311-darwin.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-311-darwin.so +0 -0
- scipy/cluster/_vq.cpython-311-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-311-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-311-darwin.so +0 -0
- scipy/integrate/_ivp/common.py +3 -3
- scipy/integrate/_ivp/ivp.py +9 -2
- scipy/integrate/_ivp/tests/test_ivp.py +19 -0
- scipy/integrate/_lsoda.cpython-311-darwin.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-311-darwin.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-311-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 +57 -54
- scipy/integrate/_test_odeint_banded.cpython-311-darwin.so +0 -0
- scipy/integrate/_vode.cpython-311-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 +61 -43
- scipy/interpolate/__init__.py +70 -58
- scipy/interpolate/_bary_rational.py +22 -22
- scipy/interpolate/_bsplines.py +119 -66
- scipy/interpolate/_cubic.py +65 -50
- scipy/interpolate/_dfitpack.cpython-311-darwin.so +0 -0
- scipy/interpolate/_dierckx.cpython-311-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-311-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-311-darwin.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-311-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-311-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-311-darwin.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-311-darwin.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-311-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-311-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-311-darwin.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-311-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-311-darwin.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-311-darwin.so +0 -0
- scipy/linalg/_flapack.cpython-311-darwin.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-311-darwin.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-311-darwin.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-311-darwin.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-311-darwin.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-311-darwin.so +0 -0
- scipy/linalg/cython_lapack.cpython-311-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_interpolative.py +17 -0
- scipy/linalg/tests/test_lapack.py +115 -7
- scipy/linalg/tests/test_matfuncs.py +157 -102
- scipy/linalg/tests/test_procrustes.py +0 -7
- scipy/linalg/tests/test_solve_toeplitz.py +1 -1
- scipy/linalg/tests/test_special_matrices.py +1 -5
- scipy/ndimage/__init__.py +1 -0
- scipy/ndimage/_cytest.cpython-311-darwin.so +0 -0
- scipy/ndimage/_delegators.py +8 -2
- scipy/ndimage/_filters.py +433 -5
- scipy/ndimage/_interpolation.py +36 -6
- scipy/ndimage/_measurements.py +4 -2
- scipy/ndimage/_morphology.py +5 -0
- scipy/ndimage/_nd_image.cpython-311-darwin.so +0 -0
- scipy/ndimage/_ndimage_api.py +2 -1
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-311-darwin.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-311-darwin.so +0 -0
- scipy/ndimage/_support_alternative_backends.py +18 -6
- scipy/ndimage/tests/test_filters.py +351 -259
- scipy/ndimage/tests/test_fourier.py +7 -9
- scipy/ndimage/tests/test_interpolation.py +68 -61
- scipy/ndimage/tests/test_measurements.py +18 -35
- scipy/ndimage/tests/test_morphology.py +143 -131
- scipy/ndimage/tests/test_splines.py +1 -3
- scipy/odr/__odrpack.cpython-311-darwin.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-311-darwin.so +0 -0
- scipy/optimize/_bracket.py +46 -26
- scipy/optimize/_chandrupatla.py +9 -10
- scipy/optimize/_cobyla_py.py +104 -123
- scipy/optimize/_constraints.py +14 -10
- scipy/optimize/_differentiable_functions.py +371 -230
- scipy/optimize/_differentialevolution.py +4 -3
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_highspy/_highs_wrapper.py +6 -4
- scipy/optimize/_lbfgsb.cpython-311-darwin.so +0 -0
- scipy/optimize/_lbfgsb_py.py +57 -16
- scipy/optimize/_linprog_doc.py +2 -2
- scipy/optimize/_linprog_highs.py +11 -11
- scipy/optimize/_linprog_ip.py +25 -10
- scipy/optimize/_linprog_util.py +18 -19
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-311-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-311-darwin.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-311-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/_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-311-darwin.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-311-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-311-darwin.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-311-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 +71 -46
- scipy/optimize/tests/test_chandrupatla.py +133 -135
- scipy/optimize/tests/test_cobyla.py +74 -45
- scipy/optimize/tests/test_constraints.py +1 -1
- scipy/optimize/tests/test_differentiable_functions.py +226 -6
- scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
- scipy/optimize/tests/test_least_squares.py +125 -13
- scipy/optimize/tests/test_linear_assignment.py +3 -3
- scipy/optimize/tests/test_linprog.py +3 -3
- scipy/optimize/tests/test_lsq_linear.py +5 -5
- scipy/optimize/tests/test_minimize_constrained.py +2 -2
- scipy/optimize/tests/test_minpack.py +4 -4
- scipy/optimize/tests/test_nnls.py +43 -3
- scipy/optimize/tests/test_nonlin.py +36 -0
- scipy/optimize/tests/test_optimize.py +95 -17
- scipy/optimize/tests/test_slsqp.py +36 -4
- scipy/optimize/tests/test_zeros.py +34 -1
- scipy/signal/__init__.py +12 -23
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +459 -241
- scipy/signal/_fir_filter_design.py +262 -90
- scipy/signal/_lti_conversion.py +3 -2
- scipy/signal/_ltisys.py +118 -91
- scipy/signal/_peak_finding_utils.cpython-311-darwin.so +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_short_time_fft.py +553 -76
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +719 -396
- scipy/signal/_sigtools.cpython-311-darwin.so +0 -0
- scipy/signal/_sosfilt.cpython-311-darwin.so +0 -0
- scipy/signal/_spectral_py.py +221 -50
- 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-311-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 +5 -182
- scipy/signal/tests/test_bsplines.py +114 -79
- scipy/signal/tests/test_cont2discrete.py +9 -2
- scipy/signal/tests/test_filter_design.py +721 -481
- scipy/signal/tests/test_fir_filter_design.py +332 -140
- scipy/signal/tests/test_savitzky_golay.py +4 -3
- scipy/signal/tests/test_short_time_fft.py +231 -5
- scipy/signal/tests/test_signaltools.py +2149 -1348
- scipy/signal/tests/test_spectral.py +19 -6
- scipy/signal/tests/test_splines.py +161 -96
- scipy/signal/tests/test_upfirdn.py +84 -50
- scipy/signal/tests/test_waveforms.py +20 -0
- scipy/signal/tests/test_windows.py +607 -466
- scipy/signal/windows/_windows.py +287 -148
- scipy/sparse/__init__.py +23 -4
- scipy/sparse/_base.py +269 -120
- scipy/sparse/_bsr.py +7 -4
- scipy/sparse/_compressed.py +59 -234
- scipy/sparse/_construct.py +90 -38
- scipy/sparse/_coo.py +115 -181
- scipy/sparse/_csc.py +4 -4
- scipy/sparse/_csparsetools.cpython-311-darwin.so +0 -0
- scipy/sparse/_csr.py +2 -2
- scipy/sparse/_data.py +48 -48
- scipy/sparse/_dia.py +105 -21
- scipy/sparse/_dok.py +0 -23
- scipy/sparse/_index.py +4 -4
- scipy/sparse/_matrix.py +23 -0
- scipy/sparse/_sparsetools.cpython-311-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-311-darwin.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-311-darwin.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-311-darwin.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-311-darwin.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-311-darwin.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-311-darwin.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-311-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-311-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-311-darwin.so +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +28 -20
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
- scipy/sparse/linalg/_expm_multiply.py +8 -3
- scipy/sparse/linalg/_interface.py +29 -26
- scipy/sparse/linalg/_isolve/_gcrotmk.py +6 -5
- scipy/sparse/linalg/_isolve/iterative.py +51 -45
- scipy/sparse/linalg/_isolve/lgmres.py +6 -6
- scipy/sparse/linalg/_isolve/minres.py +5 -5
- scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
- scipy/sparse/linalg/_isolve/utils.py +2 -8
- scipy/sparse/linalg/_matfuncs.py +1 -1
- scipy/sparse/linalg/_norm.py +1 -1
- scipy/sparse/linalg/_propack/_cpropack.cpython-311-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-311-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-311-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-311-darwin.so +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
- scipy/sparse/linalg/tests/test_expm_multiply.py +10 -0
- scipy/sparse/linalg/tests/test_interface.py +35 -0
- scipy/sparse/linalg/tests/test_pydata_sparse.py +18 -0
- scipy/sparse/tests/test_arithmetic1d.py +5 -2
- scipy/sparse/tests/test_base.py +217 -40
- scipy/sparse/tests/test_common1d.py +17 -12
- scipy/sparse/tests/test_construct.py +1 -1
- scipy/sparse/tests/test_coo.py +272 -4
- scipy/sparse/tests/test_sparsetools.py +5 -0
- scipy/sparse/tests/test_sputils.py +36 -7
- scipy/spatial/_ckdtree.cpython-311-darwin.so +0 -0
- scipy/spatial/_hausdorff.cpython-311-darwin.so +0 -0
- scipy/spatial/_qhull.cpython-311-darwin.so +0 -0
- scipy/spatial/_voronoi.cpython-311-darwin.so +0 -0
- scipy/spatial/distance.py +49 -42
- scipy/spatial/tests/test_distance.py +3 -1
- scipy/spatial/tests/test_kdtree.py +1 -0
- scipy/spatial/tests/test_qhull.py +106 -2
- scipy/spatial/transform/__init__.py +5 -3
- scipy/spatial/transform/_rigid_transform.cpython-311-darwin.so +0 -0
- scipy/spatial/transform/_rotation.cpython-311-darwin.so +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +1342 -790
- scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
- scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
- scipy/special/__init__.py +1 -47
- scipy/special/_add_newdocs.py +34 -772
- scipy/special/_basic.py +22 -25
- scipy/special/_comb.cpython-311-darwin.so +0 -0
- scipy/special/_ellip_harm_2.cpython-311-darwin.so +0 -0
- scipy/special/_gufuncs.cpython-311-darwin.so +0 -0
- scipy/special/_logsumexp.py +83 -69
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-311-darwin.so +0 -0
- scipy/special/_special_ufuncs.cpython-311-darwin.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-311-darwin.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-311-darwin.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-311-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-311-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 +23 -2
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_logsumexp.py +220 -64
- scipy/special/tests/test_mpmath.py +1 -0
- scipy/special/tests/test_nan_inputs.py +1 -1
- scipy/special/tests/test_orthogonal.py +17 -18
- scipy/special/tests/test_sf_error.py +3 -2
- scipy/special/tests/test_sph_harm.py +6 -7
- scipy/special/tests/test_support_alternative_backends.py +211 -76
- scipy/stats/__init__.py +4 -1
- scipy/stats/_ansari_swilk_statistics.cpython-311-darwin.so +0 -0
- scipy/stats/_axis_nan_policy.py +4 -3
- scipy/stats/_biasedurn.cpython-311-darwin.so +0 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +296 -319
- scipy/stats/_covariance.py +6 -3
- scipy/stats/_discrete_distns.py +39 -32
- scipy/stats/_distn_infrastructure.py +39 -12
- scipy/stats/_distribution_infrastructure.py +900 -238
- scipy/stats/_entropy.py +7 -8
- scipy/{_lib → stats}/_finite_differences.py +1 -1
- scipy/stats/_hypotests.py +82 -49
- scipy/stats/_kde.py +53 -49
- scipy/stats/_ksstats.py +1 -1
- scipy/stats/_levy_stable/__init__.py +7 -15
- scipy/stats/_levy_stable/levyst.cpython-311-darwin.so +0 -0
- scipy/stats/_morestats.py +112 -67
- scipy/stats/_mstats_basic.py +13 -17
- scipy/stats/_mstats_extras.py +8 -8
- scipy/stats/_multivariate.py +89 -113
- scipy/stats/_new_distributions.py +97 -20
- scipy/stats/_page_trend_test.py +12 -5
- scipy/stats/_probability_distribution.py +265 -43
- scipy/stats/_qmc.py +14 -9
- scipy/stats/_qmc_cy.cpython-311-darwin.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-311-darwin.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-311-darwin.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-311-darwin.so +0 -0
- scipy/stats/_stats.cpython-311-darwin.so +0 -0
- scipy/stats/_stats_mstats_common.py +19 -2
- scipy/stats/_stats_py.py +534 -460
- scipy/stats/_unuran/unuran_wrapper.cpython-311-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
- scipy/stats/_variation.py +5 -7
- scipy/stats/_wilcoxon.py +13 -7
- scipy/stats/tests/common_tests.py +6 -4
- scipy/stats/tests/test_axis_nan_policy.py +62 -24
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +379 -60
- scipy/stats/tests/test_continuous_basic.py +18 -12
- scipy/stats/tests/test_discrete_basic.py +14 -8
- scipy/stats/tests/test_discrete_distns.py +16 -16
- scipy/stats/tests/test_distributions.py +117 -75
- scipy/stats/tests/test_entropy.py +40 -48
- scipy/stats/tests/test_fit.py +4 -3
- scipy/stats/tests/test_hypotests.py +153 -24
- scipy/stats/tests/test_kdeoth.py +109 -41
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_morestats.py +79 -47
- scipy/stats/tests/test_mstats_basic.py +3 -3
- scipy/stats/tests/test_multivariate.py +434 -83
- scipy/stats/tests/test_qmc.py +13 -10
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +119 -112
- scipy/stats/tests/test_resampling.py +47 -56
- scipy/stats/tests/test_sampling.py +9 -4
- scipy/stats/tests/test_stats.py +799 -939
- scipy/stats/tests/test_variation.py +8 -6
- scipy/version.py +2 -2
- {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/LICENSE.txt +1 -1
- {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/METADATA +9 -9
- {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/RECORD +558 -565
- scipy-1.16.0rc1.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-311-darwin.so +0 -0
- scipy/optimize/_cobyla.cpython-311-darwin.so +0 -0
- scipy/optimize/_cython_nnls.cpython-311-darwin.so +0 -0
- scipy/optimize/_slsqp.cpython-311-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-311-darwin.so +0 -0
- scipy-1.15.2.dist-info/WHEEL +0 -4
@@ -83,9 +83,10 @@ def compare_coeffs_to_alt(window_length, order):
|
|
83
83
|
for pos in [None] + list(range(window_length)):
|
84
84
|
h1 = savgol_coeffs(window_length, order, pos=pos, use='dot')
|
85
85
|
h2 = alt_sg_coeffs(window_length, order, pos=pos)
|
86
|
-
xp_assert_close(
|
87
|
-
|
88
|
-
|
86
|
+
xp_assert_close(
|
87
|
+
h1, h2, atol=1e-10,
|
88
|
+
err_msg=f"window_length = {window_length}, order = {order}, pos = {pos}"
|
89
|
+
)
|
89
90
|
|
90
91
|
|
91
92
|
def test_sg_coeffs_compare():
|
@@ -26,11 +26,11 @@ import pytest
|
|
26
26
|
from scipy._lib._array_api import xp_assert_close, xp_assert_equal
|
27
27
|
from scipy.fft import fftshift
|
28
28
|
from scipy.stats import norm as normal_distribution # type: ignore
|
29
|
-
from scipy.signal import get_window, welch, stft, istft, spectrogram
|
29
|
+
from scipy.signal import check_COLA, get_window, welch, stft, istft, spectrogram
|
30
30
|
|
31
31
|
from scipy.signal._short_time_fft import FFT_MODE_TYPE, \
|
32
|
-
_calc_dual_canonical_window, ShortTimeFFT, PAD_TYPE
|
33
|
-
from scipy.signal.windows import gaussian
|
32
|
+
_calc_dual_canonical_window, closest_STFT_dual_window, ShortTimeFFT, PAD_TYPE
|
33
|
+
from scipy.signal.windows import blackman, gaussian, hamming, nuttall, triang
|
34
34
|
|
35
35
|
|
36
36
|
def test__calc_dual_canonical_window_roundtrip():
|
@@ -59,6 +59,132 @@ def test__calc_dual_canonical_window_exceptions():
|
|
59
59
|
with pytest.raises(ValueError, match="Parameter 'win' cannot be of int.*"):
|
60
60
|
_calc_dual_canonical_window(np.ones(4, dtype=int), 1)
|
61
61
|
|
62
|
+
def test_closest_STFT_dual_window_exceptions():
|
63
|
+
"""Raise all exceptions in `closest_STFT_dual_window`."""
|
64
|
+
with pytest.raises(ValueError, match="Parameters `win` and `desired_dual` are.*"):
|
65
|
+
closest_STFT_dual_window(np.ones(4), 2, np.ones(5))
|
66
|
+
with pytest.raises(ValueError, match="Parameters `win` and `desired_dual` are.*"):
|
67
|
+
closest_STFT_dual_window(np.ones((4, 1)), 2, np.ones(4))
|
68
|
+
with pytest.raises(ValueError, match="Parameter win must have finite entries!"):
|
69
|
+
closest_STFT_dual_window(np.ones(4)*np.nan, 2, np.ones(4))
|
70
|
+
with pytest.raises(ValueError, match="Parameter desired_dual must have finite.*"):
|
71
|
+
closest_STFT_dual_window(np.ones(4), 2, np.ones(4)*np.nan)
|
72
|
+
with pytest.raises(ValueError, match="Parameter hop=20 is not an integer.*"):
|
73
|
+
closest_STFT_dual_window(np.ones(4), 20, np.ones(4))
|
74
|
+
with pytest.raises(ValueError, match="Parameter hop=2.0 is not an integer.*"):
|
75
|
+
# noinspection PyTypeChecker
|
76
|
+
closest_STFT_dual_window(np.ones(4), 2., np.ones(4))
|
77
|
+
|
78
|
+
with pytest.raises(ValueError, match="Unable to calculate scaled closest dual.*"):
|
79
|
+
closest_STFT_dual_window(np.ones(4), 2, np.zeros(4), scaled=True)
|
80
|
+
|
81
|
+
|
82
|
+
@pytest.mark.parametrize("scaled", (True, False))
|
83
|
+
@pytest.mark.parametrize('sym_win', (False, True))
|
84
|
+
@pytest.mark.parametrize('hop', (8, 9))
|
85
|
+
@pytest.mark.parametrize('m', (16, 17))
|
86
|
+
@pytest.mark.parametrize('win_name', ('hann', 'hamming'))
|
87
|
+
def test_closest_STFT_dual_window_roundtrip(win_name, m, hop, sym_win, scaled):
|
88
|
+
"""Do roundtrip, i.e., compare dual of dual windows.
|
89
|
+
|
90
|
+
The default for parameter `desired_dual` is also verified.
|
91
|
+
"""
|
92
|
+
win = get_window(win_name, m, not sym_win)
|
93
|
+
d1, s1 = closest_STFT_dual_window(win, hop, np.ones_like(win), scaled=scaled)
|
94
|
+
d2, s2 = closest_STFT_dual_window(win, hop, scaled=scaled) # equals d1, s1
|
95
|
+
d3, s3 = closest_STFT_dual_window(d1, hop, win * s1, scaled=True) # roundtrip
|
96
|
+
|
97
|
+
# Validate default for parameter `desired_dual` works (hard coded => assert ok):
|
98
|
+
xp_assert_equal(d2, d1, err_msg="Default for parameter `desired_dual` is not ok!")
|
99
|
+
assert s2 == s1, "Default for parameter `desired_dual` is not ok!"
|
100
|
+
|
101
|
+
res = np.finfo(win.dtype).resolution * 5
|
102
|
+
xp_assert_close(s1*s3, 1., atol=res, err_msg="Invalid Scale factors")
|
103
|
+
xp_assert_close(d3, win, atol=res, err_msg="Roundtrip failed!")
|
104
|
+
|
105
|
+
if scaled: # check that scaling factor is correct:
|
106
|
+
d3, _ = closest_STFT_dual_window(win, hop, np.ones(m) * s1, scaled=False)
|
107
|
+
xp_assert_close(d3, d1, atol=res, err_msg="Roundtrip failed!")
|
108
|
+
|
109
|
+
|
110
|
+
@pytest.mark.parametrize('scaled', (False, True))
|
111
|
+
def test_closest_STFT_dual_window_STFT_roundtrip(scaled):
|
112
|
+
"""STFT Roundtrip correctness of closest dual window. """
|
113
|
+
np.random.seed(5613830)
|
114
|
+
n, m_num, hop = 15, 7, 3
|
115
|
+
w, desires_dual = hamming(m_num), triang(m_num)
|
116
|
+
d, _ = closest_STFT_dual_window(w, hop, desires_dual, scaled=scaled)
|
117
|
+
|
118
|
+
SFT = ShortTimeFFT(w, hop=hop, dual_win=d, fs=1, scale_to=None, phase_shift=None)
|
119
|
+
x = 10 * np.random.randn(n)
|
120
|
+
Sx = SFT.stft(x)
|
121
|
+
y = SFT.istft(Sx, 0, n)
|
122
|
+
|
123
|
+
atol = np.finfo(w.dtype).resolution * 10
|
124
|
+
xp_assert_close(y, x, atol=atol, err_msg="Invalid closest window")
|
125
|
+
|
126
|
+
|
127
|
+
@pytest.mark.parametrize('scaled', (False, True))
|
128
|
+
def test_closest_STFT_dual_window_STFT_roundtrip_complex(scaled):
|
129
|
+
"""STFT Roundtrip correctness of closest dual window with complex values. """
|
130
|
+
np.random.seed(34905436)
|
131
|
+
n, m_num, hop = 15, 7, 3
|
132
|
+
win = 1j*hamming(m_num) + nuttall(m_num)
|
133
|
+
desires_dual = 1j*triang(m_num) + blackman(m_num)
|
134
|
+
dual, s = closest_STFT_dual_window(win, hop, desires_dual, scaled=scaled)
|
135
|
+
|
136
|
+
SFT = ShortTimeFFT(win, hop=hop, dual_win=dual, fs=1, fft_mode='twosided',
|
137
|
+
scale_to=None, phase_shift=None)
|
138
|
+
x = 10 * np.random.randn(n) + 10j * np.random.randn(n)
|
139
|
+
Sx = SFT.stft(x)
|
140
|
+
y = SFT.istft(Sx, 0, n)
|
141
|
+
|
142
|
+
atol = np.finfo(win.dtype).resolution * 10
|
143
|
+
xp_assert_close(y, x, atol=atol, err_msg=f"Invalid complex closest window ({s=})")
|
144
|
+
|
145
|
+
|
146
|
+
@pytest.mark.parametrize("win_name, nperseg, noverlap, scale_fac", ([
|
147
|
+
('boxcar', 16, 8, 1/2),
|
148
|
+
('boxcar', 18, 12, 1/3),
|
149
|
+
('boxcar', 16, 12, 1/4),
|
150
|
+
('bartlett', 16, 8, 1.),
|
151
|
+
('bartlett', 16, 12, 1/2),
|
152
|
+
('bartlett', 30, 25, 1/3),
|
153
|
+
('hann', 16, 8, 1.),
|
154
|
+
('hann', 18, 12, 2/3),
|
155
|
+
('hann', 16, 12, 1/2),
|
156
|
+
('blackman', 9, 6, 50/63),
|
157
|
+
('boxcar', 8, 7, 1/8)])) # hop = 1
|
158
|
+
def test_closest_STFT_dual_window_cola(win_name, nperseg, noverlap, scale_fac):
|
159
|
+
"""Test if `closest_STFT_dual_window` generalizes `check_COLA`.
|
160
|
+
|
161
|
+
The parameters were taken from the `check_COLA` documentation.
|
162
|
+
Note that `check_COLA` only guarantees the existence of a dual window with constant
|
163
|
+
values but not that those values are unity (which is clear, when investigating the
|
164
|
+
'boxcar' examples). The values for `scale_fac` were determined empirically.
|
165
|
+
"""
|
166
|
+
desired_dual = get_window(win_name, nperseg, fftbins=True)
|
167
|
+
assert check_COLA(desired_dual, nperseg, noverlap), "COLA cond. violated!"
|
168
|
+
|
169
|
+
win = np.ones(nperseg) # check scaled window:
|
170
|
+
d_s, s = closest_STFT_dual_window(win, nperseg-noverlap, desired_dual, scaled=True)
|
171
|
+
|
172
|
+
res = np.finfo(desired_dual.dtype).resolution
|
173
|
+
rel_tol_d = max(abs(d_s))*res*3
|
174
|
+
xp_assert_close(s, scale_fac, atol=res*10,
|
175
|
+
err_msg=f"Scale factor off by {s/scale_fac}")
|
176
|
+
xp_assert_close(d_s, desired_dual*scale_fac, atol=res*10, rtol=rel_tol_d,
|
177
|
+
err_msg="Calculated incorrect scaled window!")
|
178
|
+
|
179
|
+
# check unscaled window:
|
180
|
+
d_u, u = closest_STFT_dual_window(win * scale_fac, nperseg - noverlap,
|
181
|
+
desired_dual, scaled=False)
|
182
|
+
|
183
|
+
# this should be hard-coded not computed, so no need for allclose
|
184
|
+
assert u == 1., "Scaling factor not 1 for parameter `scaled=True`!"
|
185
|
+
xp_assert_close(d_u, desired_dual, atol=res*10, rtol=rel_tol_d,
|
186
|
+
err_msg="Calculated incorrect unscaled window!")
|
187
|
+
|
62
188
|
|
63
189
|
def test_invalid_initializer_parameters():
|
64
190
|
"""Verify that exceptions get raised on invalid parameters when
|
@@ -180,6 +306,7 @@ def test_exceptions_fft_mode_complex_win(m: FFT_MODE_TYPE):
|
|
180
306
|
def test_invalid_fft_mode_RuntimeError():
|
181
307
|
"""Ensure exception gets raised when property `fft_mode` is invalid. """
|
182
308
|
SFT = ShortTimeFFT(np.ones(8), hop=4, fs=1)
|
309
|
+
# noinspection PyTypeChecker
|
183
310
|
SFT._fft_mode = 'invalid_typ'
|
184
311
|
|
185
312
|
with pytest.raises(RuntimeError):
|
@@ -222,6 +349,78 @@ def test_from_window(win_params, Nx: int):
|
|
222
349
|
assert v2 == v0, f"SFT2.{n_}={v2} does not equal SFT0.{n_}={v0}"
|
223
350
|
|
224
351
|
|
352
|
+
def test_from_win_equals_dual_exceptions():
|
353
|
+
"""Raise all occurring exceptions in `ShortTimeFFT.from_closest_win_equals_dual`.
|
354
|
+
"""
|
355
|
+
with pytest.raises(ValueError, match="Parameter desired_win is not 1d, but.*"):
|
356
|
+
ShortTimeFFT.from_win_equals_dual(np.ones((3, 4)), hop=1, fs=1)
|
357
|
+
with pytest.raises(ValueError, match="Parameter desired_win cannot be of int.*"):
|
358
|
+
ShortTimeFFT.from_win_equals_dual(np.ones(4, dtype=int), hop=1, fs=1)
|
359
|
+
with pytest.raises(ValueError, match="Parameter desired_win is not 1d, but.*"):
|
360
|
+
ShortTimeFFT.from_win_equals_dual(np.array([]), hop=1, fs=1)
|
361
|
+
with pytest.raises(ValueError, match="Parameter desired_win must have finite.*"):
|
362
|
+
ShortTimeFFT.from_win_equals_dual(np.ones(3) * np.inf, hop=1, fs=1)
|
363
|
+
with pytest.raises(ValueError, match="Parameter hop=0 is not an integer .*"):
|
364
|
+
ShortTimeFFT.from_win_equals_dual(np.ones(4), hop=0, fs=1)
|
365
|
+
with pytest.raises(ValueError, match="Parameter hop=5 is not an integer .*"):
|
366
|
+
ShortTimeFFT.from_win_equals_dual(np.ones(4), hop=5, fs=1)
|
367
|
+
|
368
|
+
with pytest.raises(ValueError, match="P.+ desired_win does not have valid.*"):
|
369
|
+
w = np.array([1, 0, 1, 0, 1], dtype=float)
|
370
|
+
ShortTimeFFT.from_win_equals_dual(w, hop=2, fs=1)
|
371
|
+
with pytest.raises(ValueError, match="Parameter scale_to='invalid' not in.*"):
|
372
|
+
# noinspection PyTypeChecker
|
373
|
+
ShortTimeFFT.from_win_equals_dual(w, hop=2, fs=1, scale_to='invalid')
|
374
|
+
|
375
|
+
@pytest.mark.parametrize('fft_bins', (True, False))
|
376
|
+
@pytest.mark.parametrize('m, hop', [(16, 8), (16, 7), (17, 8), (17, 9), (16, 16)])
|
377
|
+
def test_from_win_equals_dual_params(m, hop, fft_bins):
|
378
|
+
"""Test windows parameterizations for `ShortTimeFFT.from_closest_win_equals_dual`.
|
379
|
+
|
380
|
+
The flattop window is used since it also has negative values.
|
381
|
+
"""
|
382
|
+
desired_win = get_window('flattop', m, fftbins=fft_bins)
|
383
|
+
SFT0 = ShortTimeFFT.from_win_equals_dual(desired_win, hop, fs=1)
|
384
|
+
xp_assert_close(SFT0.dual_win, SFT0.win, err_msg="win must equals dual window!")
|
385
|
+
|
386
|
+
SFT1 = ShortTimeFFT(SFT0.win, hop, fs=1)
|
387
|
+
xp_assert_close(SFT1.dual_win, SFT0.win, err_msg="dual win isn't canonical win!")
|
388
|
+
|
389
|
+
|
390
|
+
@pytest.mark.parametrize('fft_bins', (True, False))
|
391
|
+
@pytest.mark.parametrize('m, hop', [(16, 8), (16, 7), (17, 8), (17, 9), (16, 16)])
|
392
|
+
@pytest.mark.parametrize('scale_to', (None, 'unitary'))
|
393
|
+
def test_from_win_equals_dual_roundtrip(m, hop, fft_bins, scale_to):
|
394
|
+
"""Testing roundtrip verifies that the dual window is correct.
|
395
|
+
"""
|
396
|
+
desired_win = get_window('flattop', m, fftbins=fft_bins)
|
397
|
+
SFT0 = ShortTimeFFT.from_win_equals_dual(desired_win, hop, fs=1)
|
398
|
+
|
399
|
+
x = np.cos(np.arange(2*m)**2)
|
400
|
+
x1 = SFT0.istft(SFT0.stft(x), 0, len(x))
|
401
|
+
xp_assert_close(x1, x, err_msg="Roundtrip for win equaling its dual failed!")
|
402
|
+
|
403
|
+
|
404
|
+
def test_from_win_equals_dual_unitary():
|
405
|
+
"""Check that STFT can be unitary mapping. """
|
406
|
+
m, hop = 8, 4
|
407
|
+
des_win = get_window('hann', m)
|
408
|
+
SFT = ShortTimeFFT.from_win_equals_dual(des_win, hop, 1, fft_mode='twosided',
|
409
|
+
scale_to='unitary')
|
410
|
+
# Orthogonal signals:
|
411
|
+
x, y = np.tile([-1, -1, 1, 1], 4), np.tile([1, -1, -1, 1], 4)
|
412
|
+
Sxx, Sxy = SFT.spectrogram(x), SFT.spectrogram(x, y)
|
413
|
+
|
414
|
+
atol = np.finfo(Sxx.dtype).resolution
|
415
|
+
assert sum(x * y) == 0
|
416
|
+
xp_assert_close(np.sum(Sxx), np.sum(x ** 2, dtype=Sxx.dtype), atol=atol,
|
417
|
+
err_msg="Energies do not match!")
|
418
|
+
xp_assert_close(np.sum(Sxy), 0.0j, atol=atol,
|
419
|
+
err_msg="STFT scalar product of Sx and Sy not 0!")
|
420
|
+
xp_assert_close(SFT.dual_win, SFT.win*SFT.m_num, atol=atol,
|
421
|
+
err_msg="Wrong factor for dual_win/win!")
|
422
|
+
|
423
|
+
|
225
424
|
def test_dual_win_roundtrip():
|
226
425
|
"""Verify the duality of `win` and `dual_win`.
|
227
426
|
|
@@ -332,7 +531,11 @@ def test_border_values():
|
|
332
531
|
assert SFT.p_max(10) == 4
|
333
532
|
assert SFT.k_max(10) == 16
|
334
533
|
assert SFT.upper_border_begin(10) == (4, 2)
|
335
|
-
|
534
|
+
# Raise exceptions:
|
535
|
+
with pytest.raises(ValueError, match="^Parameter n must be"):
|
536
|
+
SFT.upper_border_begin(3)
|
537
|
+
with pytest.raises(ValueError, match="^Parameter n must be"):
|
538
|
+
SFT._post_padding(3)
|
336
539
|
|
337
540
|
def test_border_values_exotic():
|
338
541
|
"""Ensure that the border calculations are correct for windows with
|
@@ -342,7 +545,11 @@ def test_border_values_exotic():
|
|
342
545
|
assert SFT.lower_border_end == (0, 0)
|
343
546
|
|
344
547
|
SFT = ShortTimeFFT(np.flip(w), hop=20, fs=1)
|
345
|
-
assert SFT.upper_border_begin(4) == (
|
548
|
+
assert SFT.upper_border_begin(4) == (16, 1)
|
549
|
+
assert SFT.upper_border_begin(5) == (16, 1)
|
550
|
+
assert SFT.upper_border_begin(23) == (36, 2)
|
551
|
+
assert SFT.upper_border_begin(24) == (36, 2)
|
552
|
+
assert SFT.upper_border_begin(25) == (36, 2)
|
346
553
|
|
347
554
|
SFT._hop = -1 # provoke unreachable line
|
348
555
|
with pytest.raises(RuntimeError):
|
@@ -508,6 +715,25 @@ def test_minimal_length_signal(m_num):
|
|
508
715
|
SFT.istft(Sx[:, :-1], k1=n)
|
509
716
|
|
510
717
|
|
718
|
+
def test_compare_stft_detrend():
|
719
|
+
"""Test the detrending in `ShortTimeFFT.stft_detrend()`. """
|
720
|
+
SFT = ShortTimeFFT(np.ones(4), 4, fs=1)
|
721
|
+
x0 = np.zeros(4) # signal without trend
|
722
|
+
x1 = x0 + 3 # signal with constant trend
|
723
|
+
x2 = x0 + np.arange(len(x0)) # signal with linear trend
|
724
|
+
|
725
|
+
kw = dict(k_offset=2, p1=1) # we want only one slice
|
726
|
+
Sx0 = SFT.stft(x0, **kw) # no trend
|
727
|
+
Sx1 = SFT.stft_detrend(x1, detr='constant', **kw)
|
728
|
+
Sx2 = SFT.stft_detrend(x2, detr='linear', **kw)
|
729
|
+
Sx3 = SFT.stft_detrend(x1, detr=lambda x: x - np.mean(x), **kw)
|
730
|
+
|
731
|
+
atol = np.finfo(Sx0.dtype).resolution * 5 # needed to compare with array of zeros
|
732
|
+
xp_assert_close(Sx1, Sx0, atol=atol, err_msg="Constant detrending failed!")
|
733
|
+
xp_assert_close(Sx0, Sx2, atol=atol, err_msg="Linear detrending failed!")
|
734
|
+
xp_assert_close(Sx0, Sx3, atol=atol, err_msg="Detrending using a function failed!")
|
735
|
+
|
736
|
+
|
511
737
|
def test_tutorial_stft_sliding_win():
|
512
738
|
"""Verify example in "Sliding Windows" subsection from the "User Guide".
|
513
739
|
|