diff --git a/.mypyignore-todo b/.mypyignore-todo index 757c7182..3015446b 100644 --- a/.mypyignore-todo +++ b/.mypyignore-todo @@ -1,28 +1,5 @@ -scipy\.signal\._bsplines -scipy\.signal\._spectral -scipy\.signal\.(_?filter_design\.)?__all__ -scipy\.signal\.(_?filter_design\.)?freqz_sos -scipy\.signal\.(_?signaltools\.)?__all__ -scipy\.signal\.(_?signaltools\.)?cmplx_sort -scipy\.signal\.(_?signaltools\.)?envelope -scipy\.signal\.(_spectral_py\.)?lombscargle -scipy\.signal\.(_?waveforms\.)?chirp -scipy\.signal\.(_?wavelets\.)?__all__ -scipy\.signal\.(_?wavelets\.)?cascade -scipy\.signal\.(_?wavelets\.)?cwt -scipy\.signal\.(_?wavelets\.)?daub -scipy\.signal\.(_?wavelets\.)?morlet2? -scipy\.signal\.(_?wavelets\.)?qmf -scipy\.signal\.(_?wavelets\.)?ricker -scipy\.signal\.(spectral\.)?lombscargle -scipy\.signal\._?spline\.(c|q)spline2d -scipy\.signal\._?spline\.symiirorder(1|2) -scipy\.signal\._spline\.symiirorder1_ic -scipy\.signal\._spline\.symiirorder2_ic_(bwd|fwd) -scipy\.signal\.(spline|wavelets)\.__all__ -scipy\.signal\.wavelets\.convolve - scipy\.sparse\.__all__ +scipy\.sparse\._sputils\.__all__ scipy\.sparse\._(data\._data|compressed\._cs)_matrix\.__init__ scipy\.sparse\._(base\._sp|bsr\._bsr_|coo\._coo_|dia\._dia_|dok\._dok_|lil\._lil_)base\.__init__ scipy\.sparse\._(base\._sp|coo\._coo_|dia\._dia_|dok\._dok_|lil\._lil_)base\.count_nonzero @@ -30,33 +7,34 @@ scipy\.sparse\.((_?base|_matrix|bsr|coo|csc|csr|dia|dok)\.)?spmatrix\.todense scipy\.sparse\.(_?construct\.)?rand(om(_array)?)? scipy\.sparse\._coo\._coo_base\.tensordot scipy\.sparse\._data\._minmax_mixin\.(arg|nan)?(max|min) -scipy\.sparse\._sputils\.__all__ scipy\.sparse\._sputils\.broadcast_shapes scipy\.sparse\.(_sputils|base|compressed|bsr|coo|dia|dok)\.check_shape scipy\.sparse\.(_sputils|compressed|bsr|coo|dia|dok)\.isshape -scipy\.sparse\.csgraph\.(_matching\.)?min_weight_full_bipartite_matching scipy\.sparse\.get_index_dtype +scipy\.sparse\.safely_cast_index_arrays + +scipy\.sparse\.csgraph\.(_matching\.)?min_weight_full_bipartite_matching + scipy\.sparse\.linalg\._dsolve\.linsolve\.__all__ scipy\.sparse\.linalg\._dsolve\.linsolve\.is_sptriangular scipy\.sparse\.linalg\._dsolve\.linsolve\.spbandwidth scipy\.sparse\.linalg\.(_dsolve\.(linsolve\.)?)?splu scipy\.sparse\.linalg\.(_?eigen\.(_svds\.)?)?svds -scipy\.sparse\.safely_cast_index_arrays + scipy\.spatial\.distance\.directed_hausdorff scipy\.spatial\.transform\.(_?rotation\.)?Rotation\.random + +scipy\.special\.(cython_special\.)?btdtri? +scipy\.special\.(assoc_)?legendre_p(_all)? +scipy\.special\.sph_(harm_y|legendre_p)(_all)? scipy\.special\.(_basic\.)?__all__ -scipy\.special\.(_?basic\.)?factorial -scipy\.special\.(_?basic\.)?factorial2 -scipy\.special\.(_?basic\.)?factorialk scipy\.special\.(_basic\.)?softplus -scipy\.special\.(cython_special\.)?btdtr -scipy\.special\.(cython_special\.)?btdtri +scipy\.special\.(_?basic\.)?factorial(2|k)? scipy\.special\._spherical_bessel\.spherical_kn_reflection scipy\.special\._spherical_bessel\.use_reflection -scipy\.special\.(assoc_)?legendre_p(_all)? -scipy\.special\.sph_(harm_y|legendre_p)(_all)? + scipy\.stats\.__all__ scipy\.stats\.distributions\.__all__ diff --git a/scipy-stubs/signal/__init__.pyi b/scipy-stubs/signal/__init__.pyi index a0496bea..d58c1e6f 100644 --- a/scipy-stubs/signal/__init__.pyi +++ b/scipy-stubs/signal/__init__.pyi @@ -11,22 +11,131 @@ from . import ( wavelets, windows, ) -from ._bsplines import * -from ._czt import * -from ._filter_design import * -from ._fir_filter_design import * -from ._lti_conversion import * -from ._ltisys import * +from ._czt import CZT, ZoomFFT, czt, czt_points, zoom_fft +from ._filter_design import ( + BadCoefficients, + band_stop_obj, + bessel, + besselap, + bilinear, + bilinear_zpk, + buttap, + butter, + buttord, + cheb1ap, + cheb1ord, + cheb2ap, + cheb2ord, + cheby1, + cheby2, + ellip, + ellipap, + ellipord, + findfreqs, + freqs, + freqs_zpk, + freqz, + freqz_sos, + freqz_zpk, + gammatone, + group_delay, + iircomb, + iirdesign, + iirfilter, + iirnotch, + iirpeak, + lp2bp, + lp2bp_zpk, + lp2bs, + lp2bs_zpk, + lp2hp, + lp2hp_zpk, + lp2lp, + lp2lp_zpk, + normalize, + sos2tf, + sos2zpk, + sosfreqz, + tf2sos, + tf2zpk, + zpk2sos, + zpk2tf, +) +from ._fir_filter_design import firls, firwin, firwin2, kaiser_atten, kaiser_beta, kaiserord, minimum_phase, remez +from ._lti_conversion import abcd_normalize, cont2discrete, ss2tf, ss2zpk, tf2ss, zpk2ss +from ._ltisys import ( + StateSpace, + TransferFunction, + ZerosPolesGain, + bode, + dbode, + dfreqresp, + dimpulse, + dlsim, + dlti, + dstep, + freqresp, + impulse, + lsim, + lti, + place_poles, + step, +) from ._max_len_seq import max_len_seq -from ._peak_finding import * +from ._peak_finding import argrelextrema, argrelmax, argrelmin, find_peaks, find_peaks_cwt, peak_prominences, peak_widths from ._savitzky_golay import savgol_coeffs, savgol_filter -from ._short_time_fft import * -from ._signaltools import * -from ._spectral_py import * -from ._spline import cspline2d, qspline2d, sepfir2d, symiirorder1, symiirorder2 +from ._short_time_fft import ShortTimeFFT +from ._signaltools import ( + choose_conv_method, + convolve, + convolve2d, + correlate, + correlate2d, + correlation_lags, + decimate, + deconvolve, + detrend, + envelope, + fftconvolve, + filtfilt, + hilbert, + hilbert2, + invres, + invresz, + lfilter, + lfilter_zi, + lfiltic, + medfilt, + medfilt2d, + oaconvolve, + order_filter, + resample, + resample_poly, + residue, + residuez, + sosfilt, + sosfilt_zi, + sosfiltfilt, + unique_roots, + vectorstrength, + wiener, +) +from ._spectral_py import check_COLA, check_NOLA, coherence, csd, istft, lombscargle, periodogram, spectrogram, stft, welch +from ._spline import sepfir2d +from ._spline_filters import ( + cspline1d, + cspline1d_eval, + cspline2d, + gauss_spline, + qspline1d, + qspline1d_eval, + qspline2d, + spline_filter, + symiirorder1, + symiirorder2, +) from ._upfirdn import upfirdn -from ._waveforms import * -from ._wavelets import * +from ._waveforms import chirp, gausspulse, sawtooth, square, sweep_poly, unit_impulse from .windows import get_window __all__ = [ @@ -51,7 +160,6 @@ __all__ = [ "buttap", "butter", "buttord", - "cascade", "cheb1ap", "cheb1ord", "cheb2ap", @@ -62,7 +170,6 @@ __all__ = [ "check_NOLA", "chirp", "choose_conv_method", - "cmplx_sort", "coherence", "cont2discrete", "convolve", @@ -74,10 +181,8 @@ __all__ = [ "cspline1d", "cspline1d_eval", "cspline2d", - "cwt", "czt", "czt_points", - "daub", "dbode", "decimate", "deconvolve", @@ -90,6 +195,7 @@ __all__ = [ "ellip", "ellipap", "ellipord", + "envelope", "fftconvolve", "filter_design", "filtfilt", @@ -104,6 +210,7 @@ __all__ = [ "freqs", "freqs_zpk", "freqz", + "freqz_sos", "freqz_zpk", "gammatone", "gauss_spline", @@ -144,8 +251,6 @@ __all__ = [ "medfilt", "medfilt2d", "minimum_phase", - "morlet", - "morlet2", "normalize", "oaconvolve", "order_filter", @@ -153,7 +258,6 @@ __all__ = [ "peak_widths", "periodogram", "place_poles", - "qmf", "qspline1d", "qspline1d_eval", "qspline2d", @@ -162,7 +266,6 @@ __all__ = [ "resample_poly", "residue", "residuez", - "ricker", "savgol_coeffs", "savgol_filter", "sawtooth", diff --git a/scipy-stubs/signal/_bsplines.pyi b/scipy-stubs/signal/_bsplines.pyi deleted file mode 100644 index f01f3ca4..00000000 --- a/scipy-stubs/signal/_bsplines.pyi +++ /dev/null @@ -1,34 +0,0 @@ -from typing import Any, overload -from typing_extensions import TypeVar - -import numpy as np -import optype.numpy as onp -from numpy._typing import _ArrayLike - -__all__ = ["cspline1d", "cspline1d_eval", "gauss_spline", "qspline1d", "qspline1d_eval", "spline_filter"] - -_SCT_fc = TypeVar("_SCT_fc", bound=np.inexact[Any]) - -@overload -def gauss_spline(x: onp.ToIntND | onp.SequenceND[float], n: onp.ToInt) -> onp.ArrayND[np.float64]: ... -@overload -def gauss_spline(x: onp.SequenceND[complex], n: onp.ToInt) -> onp.ArrayND[np.complex128 | np.float64]: ... -@overload -def gauss_spline(x: _ArrayLike[_SCT_fc], n: onp.ToInt) -> onp.ArrayND[_SCT_fc]: ... - -# -def spline_filter(Iin: _ArrayLike[_SCT_fc], lmbda: onp.ToFloat = 5.0) -> onp.ArrayND[_SCT_fc]: ... -def cspline1d(signal: onp.ArrayND[_SCT_fc], lamb: onp.ToFloat = 0.0) -> onp.ArrayND[_SCT_fc]: ... -def qspline1d(signal: onp.ArrayND[_SCT_fc], lamb: onp.ToFloat = 0.0) -> onp.ArrayND[_SCT_fc]: ... -def cspline1d_eval( - cj: onp.ArrayND[_SCT_fc], - newx: onp.ToFloatND, - dx: onp.ToFloat = 1.0, - x0: onp.ToInt = 0, -) -> onp.ArrayND[_SCT_fc]: ... -def qspline1d_eval( - cj: onp.ArrayND[_SCT_fc], - newx: onp.ToFloatND, - dx: onp.ToFloat = 1.0, - x0: onp.ToInt = 0, -) -> onp.ArrayND[_SCT_fc]: ... diff --git a/scipy-stubs/signal/_filter_design.pyi b/scipy-stubs/signal/_filter_design.pyi index 1eb452ef..372a6c2a 100644 --- a/scipy-stubs/signal/_filter_design.pyi +++ b/scipy-stubs/signal/_filter_design.pyi @@ -29,6 +29,7 @@ __all__ = [ "freqs", "freqs_zpk", "freqz", + "freqz_sos", "freqz_zpk", "gammatone", "group_delay", @@ -161,20 +162,22 @@ def group_delay( # @overload # worN: real -def sosfreqz( +def freqz_sos( sos: onp.ToFloat2D, worN: op.CanIndex | onp.ToFloat1D = 512, whole: op.CanBool = False, fs: onp.ToFloat = ..., # 2 * pi ) -> tuple[_Float1D, _Complex1D]: ... @overload # worN: real -def sosfreqz( +def freqz_sos( sos: onp.ToFloat2D, worN: onp.ToComplex1D, whole: op.CanBool = False, fs: onp.ToFloat = ..., # 2 * pi ) -> tuple[_Inexact1D, _Complex1D]: ... +sosfreqz = freqz_sos + # TODO(jorenham): https://github.com/jorenham/scipy-stubs/issues/99 def tf2zpk(b: Untyped, a: Untyped) -> Untyped: ... diff --git a/scipy-stubs/signal/_signaltools.pyi b/scipy-stubs/signal/_signaltools.pyi index 8205823b..ca7d8804 100644 --- a/scipy-stubs/signal/_signaltools.pyi +++ b/scipy-stubs/signal/_signaltools.pyi @@ -1,12 +1,12 @@ -from typing import Literal -from typing_extensions import deprecated +from typing import Any, Literal, TypeAlias, overload +import numpy as np import optype.numpy as onp -from scipy._typing import Untyped, UntypedArray +from scipy._typing import CorrelateMode, Untyped, UntypedArray +from ._ltisys import dlti __all__ = [ "choose_conv_method", - "cmplx_sort", "convolve", "convolve2d", "correlate", @@ -15,6 +15,7 @@ __all__ = [ "decimate", "deconvolve", "detrend", + "envelope", "fftconvolve", "filtfilt", "hilbert", @@ -40,35 +41,86 @@ __all__ = [ "wiener", ] -def correlate(in1: Untyped, in2: Untyped, mode: str = "full", method: str = "auto") -> Untyped: ... -def correlation_lags(in1_len: Untyped, in2_len: Untyped, mode: str = "full") -> Untyped: ... -def fftconvolve(in1: Untyped, in2: Untyped, mode: str = "full", axes: Untyped | None = None) -> Untyped: ... -def oaconvolve(in1: Untyped, in2: Untyped, mode: str = "full", axes: Untyped | None = None) -> Untyped: ... -def choose_conv_method(in1: Untyped, in2: Untyped, mode: str = "full", measure: bool = False) -> Untyped: ... -def convolve(in1: Untyped, in2: Untyped, mode: str = "full", method: str = "auto") -> Untyped: ... +_CorrelateMethod: TypeAlias = Literal["auto", "direct", "fft"] +_BoundaryConditions: TypeAlias = Literal["fill", "wrap", "symm"] +_ResidueType: TypeAlias = Literal["avg", "min", "max"] +_RootType: TypeAlias = Literal[_ResidueType, "maximum", "avg", "mean"] +_Domain: TypeAlias = Literal["time", "freq"] +_TrendType: TypeAlias = Literal["linear", "constant"] +_PadType: TypeAlias = Literal["constant", "line", "mean", "median", "maximum", "minimum", "symmetric", "reflect", "edge", "wrap"] +_FiltFiltPadType: TypeAlias = Literal["odd", "even", "constant"] +_ResidualKind: TypeAlias = Literal["lowpass", "all"] +_FilterType: TypeAlias = Literal["iir", "fir"] | dlti + +### + +# TODO(jorenham): deprecate `longdouble` and `object_` input +def choose_conv_method(in1: Untyped, in2: Untyped, mode: CorrelateMode = "full", measure: bool = False) -> Untyped: ... +def correlate(in1: Untyped, in2: Untyped, mode: CorrelateMode = "full", method: _CorrelateMethod = "auto") -> Untyped: ... +def convolve(in1: Untyped, in2: Untyped, mode: CorrelateMode = "full", method: _CorrelateMethod = "auto") -> Untyped: ... +def lfilter(b: Untyped, a: Untyped, x: Untyped, axis: int = -1, zi: Untyped | None = None) -> Untyped: ... +def sosfilt(sos: Untyped, x: Untyped, axis: int = -1, zi: Untyped | None = None) -> Untyped: ... + +# +def correlation_lags(in1_len: Untyped, in2_len: Untyped, mode: CorrelateMode = "full") -> Untyped: ... +def fftconvolve(in1: Untyped, in2: Untyped, mode: CorrelateMode = "full", axes: Untyped | None = None) -> Untyped: ... +def oaconvolve(in1: Untyped, in2: Untyped, mode: CorrelateMode = "full", axes: Untyped | None = None) -> Untyped: ... + +# def order_filter(a: Untyped, domain: Untyped, rank: Untyped) -> Untyped: ... + +# def medfilt(volume: Untyped, kernel_size: Untyped | None = None) -> Untyped: ... -def wiener(im: Untyped, mysize: Untyped | None = None, noise: Untyped | None = None) -> Untyped: ... -def convolve2d(in1: Untyped, in2: Untyped, mode: str = "full", boundary: str = "fill", fillvalue: int = 0) -> Untyped: ... -def correlate2d(in1: Untyped, in2: Untyped, mode: str = "full", boundary: str = "fill", fillvalue: int = 0) -> Untyped: ... def medfilt2d(input: Untyped, kernel_size: int = 3) -> Untyped: ... -def lfilter(b: Untyped, a: Untyped, x: Untyped, axis: int = -1, zi: Untyped | None = None) -> Untyped: ... + +# +def wiener(im: Untyped, mysize: Untyped | None = None, noise: Untyped | None = None) -> Untyped: ... + +# +def convolve2d( + in1: Untyped, + in2: Untyped, + mode: CorrelateMode = "full", + boundary: _BoundaryConditions = "fill", + fillvalue: onp.ToComplex = 0, +) -> Untyped: ... +def correlate2d( + in1: Untyped, + in2: Untyped, + mode: CorrelateMode = "full", + boundary: _BoundaryConditions = "fill", + fillvalue: onp.ToComplex = 0, +) -> Untyped: ... + +# def lfiltic(b: Untyped, a: Untyped, y: Untyped, x: Untyped | None = None) -> Untyped: ... + +# def deconvolve(signal: Untyped, divisor: Untyped) -> Untyped: ... + +# def hilbert(x: Untyped, N: Untyped | None = None, axis: int = -1) -> Untyped: ... def hilbert2(x: Untyped, N: Untyped | None = None) -> Untyped: ... -def unique_roots(p: Untyped, tol: float = 0.001, rtype: str = "min") -> Untyped: ... -def invres(r: Untyped, p: Untyped, k: Untyped, tol: float = 0.001, rtype: str = "avg") -> Untyped: ... -def residue(b: Untyped, a: Untyped, tol: float = 0.001, rtype: str = "avg") -> Untyped: ... -def residuez(b: Untyped, a: Untyped, tol: float = 0.001, rtype: str = "avg") -> Untyped: ... -def invresz(r: Untyped, p: Untyped, k: Untyped, tol: float = 0.001, rtype: str = "avg") -> Untyped: ... + +# +def unique_roots(p: Untyped, tol: float = 0.001, rtype: _RootType = "min") -> Untyped: ... + +# +def residue(b: Untyped, a: Untyped, tol: float = 0.001, rtype: _ResidueType = "avg") -> Untyped: ... +def residuez(b: Untyped, a: Untyped, tol: float = 0.001, rtype: _ResidueType = "avg") -> Untyped: ... + +# +def invres(r: Untyped, p: Untyped, k: Untyped, tol: float = 0.001, rtype: _ResidueType = "avg") -> Untyped: ... +def invresz(r: Untyped, p: Untyped, k: Untyped, tol: float = 0.001, rtype: _ResidueType = "avg") -> Untyped: ... + +# def resample( x: Untyped, num: Untyped, t: Untyped | None = None, axis: int = 0, window: Untyped | None = None, - domain: str = "time", + domain: _Domain = "time", ) -> Untyped: ... def resample_poly( x: Untyped, @@ -76,38 +128,76 @@ def resample_poly( down: Untyped, axis: int = 0, window: Untyped = ("kaiser", 5.0), - padtype: str = "constant", + padtype: _PadType = "constant", cval: Untyped | None = None, ) -> Untyped: ... + +# def vectorstrength(events: Untyped, period: Untyped) -> Untyped: ... + +# def detrend( data: UntypedArray, axis: int = -1, - type: Literal["linear", "constant"] = "linear", + type: _TrendType = "linear", bp: onp.ToJustInt | onp.ToJustIntND = 0, overwrite_data: bool = False, ) -> UntypedArray: ... + +# def lfilter_zi(b: Untyped, a: Untyped) -> Untyped: ... def sosfilt_zi(sos: Untyped) -> Untyped: ... + +# def filtfilt( b: Untyped, a: Untyped, x: Untyped, axis: int = -1, - padtype: str = "odd", - padlen: Untyped | None = None, - method: str = "pad", - irlen: Untyped | None = None, + padtype: _FiltFiltPadType = "odd", + padlen: int | None = None, + method: Literal["pad", "gust"] = "pad", + irlen: int | None = None, ) -> Untyped: ... -def sosfilt(sos: Untyped, x: Untyped, axis: int = -1, zi: Untyped | None = None) -> Untyped: ... -def sosfiltfilt(sos: Untyped, x: Untyped, axis: int = -1, padtype: str = "odd", padlen: Untyped | None = None) -> Untyped: ... + +# +def sosfiltfilt( + sos: Untyped, + x: Untyped, + axis: int = -1, + padtype: _FiltFiltPadType = "odd", + padlen: int | None = None, +) -> Untyped: ... + +# def decimate( x: Untyped, - q: Untyped, - n: Untyped | None = None, - ftype: str = "iir", + q: int, + n: int | None = None, + ftype: _FilterType = "iir", axis: int = -1, zero_phase: bool = True, ) -> Untyped: ... -@deprecated("Will be removed in SciPy 1.5") -def cmplx_sort(p: Untyped) -> tuple[Untyped, Untyped]: ... + +# + +@overload +def envelope( + z: onp.ArrayND[np.floating[Any]], + bp_in: tuple[int | None, int | None] = (1, None), + *, + n_out: int | None = None, + squared: bool = False, + residual: _ResidualKind | None = "lowpass", + axis: int = -1, +) -> onp.ArrayND[np.floating[Any]]: ... +@overload +def envelope( + z: onp.ArrayND[np.inexact[Any]], + bp_in: tuple[int | None, int | None] = (1, None), + *, + n_out: int | None = None, + squared: bool = False, + residual: _ResidualKind | None = "lowpass", + axis: int = -1, +) -> onp.ArrayND[np.inexact[Any]]: ... diff --git a/scipy-stubs/signal/_spectral.pyi b/scipy-stubs/signal/_spectral.pyi deleted file mode 100644 index 9a71f9bf..00000000 --- a/scipy-stubs/signal/_spectral.pyi +++ /dev/null @@ -1 +0,0 @@ -__pythran__: tuple[str, str] = ... diff --git a/scipy-stubs/signal/_spectral_py.pyi b/scipy-stubs/signal/_spectral_py.pyi index 10959593..83d6e316 100644 --- a/scipy-stubs/signal/_spectral_py.pyi +++ b/scipy-stubs/signal/_spectral_py.pyi @@ -7,7 +7,18 @@ import optype as op import optype.numpy as onp from .windows._windows import _Window, _WindowNeedsParams -__all__ = ["check_COLA", "check_NOLA", "coherence", "csd", "istft", "lombscargle", "periodogram", "spectrogram", "stft", "welch"] +__all__ = [ + "check_COLA", + "check_NOLA", + "coherence", + "csd", + "istft", + "lombscargle", + "periodogram", + "spectrogram", + "stft", + "welch", +] _Float1D: TypeAlias = onp.Array1D[np.float64] _FloatND: TypeAlias = onp.ArrayND[np.float64] @@ -25,12 +36,17 @@ _Boundary: TypeAlias = Literal["even", "odd", "constant", "zeros"] | None ### def lombscargle( - x: onp.ToFloatND, - y: onp.ToFloatND, - freqs: onp.ToFloatND, + x: onp.ToFloat1D, + y: onp.ToFloat1D, + freqs: onp.ToFloat1D, precenter: op.CanBool = False, normalize: op.CanBool = False, + *, + weights: onp.ToFloat1D | None = None, + floating_mean: bool = False, ) -> _Float1D: ... + +# def periodogram( x: onp.ToComplexND, fs: onp.ToFloat = 1.0, @@ -41,6 +57,8 @@ def periodogram( scaling: _Scaling = "density", axis: op.CanIndex = -1, ) -> tuple[_FloatND, _FloatingND]: ... + +# def welch( x: onp.ToComplexND, fs: onp.ToFloat = 1.0, @@ -54,6 +72,8 @@ def welch( axis: op.CanIndex = -1, average: _Average = "mean", ) -> tuple[_FloatND, _FloatingND]: ... + +# def csd( x: onp.ToComplexND, y: onp.ToComplexND, diff --git a/scipy-stubs/signal/_spline.pyi b/scipy-stubs/signal/_spline.pyi index 3b710490..8fd007f7 100644 --- a/scipy-stubs/signal/_spline.pyi +++ b/scipy-stubs/signal/_spline.pyi @@ -1,13 +1,34 @@ -from typing import TypeAlias +from typing import TypeAlias, overload import numpy as np import optype.numpy as onp -from scipy._typing import Untyped -_Array_fc: TypeAlias = onp.ArrayND[np.float32 | np.float64 | np.complex64 | np.complex128] +_Float: TypeAlias = np.float32 | np.float64 +_Complex: TypeAlias = np.complex64 | np.complex128 -def qspline2d(signal: Untyped, lamb: float = 0.0, precision: float = -1.0) -> Untyped: ... -def cspline2d(signal: Untyped, lamb: float = 0.0, precision: float = -1.0) -> Untyped: ... -def sepfir2d(input: _Array_fc, hrow: _Array_fc, hcol: _Array_fc) -> _Array_fc: ... -def symiirorder1(signal: Untyped, c0: Untyped, z1: Untyped, precision: float = -1.0) -> Untyped: ... -def symiirorder2(input: Untyped, r: Untyped, omega: Untyped, precision: float = -1.0) -> Untyped: ... +_ToFloat: TypeAlias = float | _Float + +_FloatND: TypeAlias = onp.ArrayND[_Float] +_ComplexND: TypeAlias = onp.ArrayND[_Complex] +_InexactND: TypeAlias = onp.ArrayND[_Float | _Complex] + +### + +@overload +def sepfir2d(input: _FloatND, hrow: _FloatND, hcol: _FloatND) -> _FloatND: ... +@overload +def sepfir2d(input: _ComplexND, hrow: _ComplexND, hcol: _ComplexND) -> _ComplexND: ... +@overload +def sepfir2d(input: _InexactND, hrow: _InexactND, hcol: _InexactND) -> _InexactND: ... + +# +@overload +def symiirorder1_ic(signal: _FloatND, c0: _ToFloat, z1: _ToFloat, precision: _ToFloat) -> _FloatND: ... +@overload +def symiirorder1_ic(signal: _ComplexND, c0: _ToFloat, z1: _ToFloat, precision: _ToFloat) -> _ComplexND: ... +@overload +def symiirorder1_ic(signal: _InexactND, c0: _ToFloat, z1: _ToFloat, precision: _ToFloat) -> _InexactND: ... + +# +def symiirorder2_ic_fwd(signal: _FloatND, r: _ToFloat, omega: _ToFloat, precision: _ToFloat) -> _FloatND: ... +def symiirorder2_ic_bwd(signal: _FloatND, r: _ToFloat, omega: _ToFloat, precision: _ToFloat) -> _FloatND: ... diff --git a/scipy-stubs/signal/_spline_filters.pyi b/scipy-stubs/signal/_spline_filters.pyi new file mode 100644 index 00000000..44bc9b74 --- /dev/null +++ b/scipy-stubs/signal/_spline_filters.pyi @@ -0,0 +1,129 @@ +from typing import Any, TypeAlias, overload +from typing_extensions import TypeVar + +import numpy as np +import optype.numpy as onp + +__all__ = [ + "cspline1d", + "cspline1d_eval", + "cspline2d", + "gauss_spline", + "qspline1d", + "qspline1d_eval", + "qspline2d", + "spline_filter", + "symiirorder1", + "symiirorder2", +] + +_SubFloat64: TypeAlias = np.bool_ | np.integer[Any] | np.float16 | np.float32 + +_FloatD: TypeAlias = np.float32 | np.float64 +_FloatQ: TypeAlias = np.float64 | np.longdouble +_ComplexD: TypeAlias = np.complex64 | np.complex128 +_ComplexQ: TypeAlias = np.complex128 | np.clongdouble +_InexactD: TypeAlias = _FloatD | _ComplexD +_InexactQ: TypeAlias = _FloatQ | _ComplexQ +_Inexact: TypeAlias = np.inexact[Any] + +_FloatDT = TypeVar("_FloatDT", bound=_FloatD) +_InexactDT = TypeVar("_InexactDT", bound=_InexactD) +_InexactQT = TypeVar("_InexactQT", bound=_InexactQ) +_InexactT = TypeVar("_InexactT", bound=_Inexact) +_ShapeT = TypeVar("_ShapeT", bound=tuple[int, ...]) + +### + +# +def spline_filter(Iin: onp.ArrayND[_FloatDT], lmbda: onp.ToFloat = 5.0) -> onp.Array2D[_FloatDT]: ... + +# +@overload +def gauss_spline(x: onp.ArrayND[_SubFloat64, _ShapeT], n: onp.ToFloat) -> onp.ArrayND[np.float64, _ShapeT]: ... +@overload +def gauss_spline(x: onp.ArrayND[_InexactQT, _ShapeT], n: onp.ToFloat) -> onp.ArrayND[_InexactQT, _ShapeT]: ... +@overload +def gauss_spline(x: onp.ToFloatStrict1D, n: onp.ToFloat) -> onp.Array1D[_FloatQ]: ... +@overload +def gauss_spline(x: onp.ToFloatStrict2D, n: onp.ToFloat) -> onp.Array2D[_FloatQ]: ... +@overload +def gauss_spline(x: onp.ToFloatStrict3D, n: onp.ToFloat) -> onp.Array3D[_FloatQ]: ... +@overload +def gauss_spline(x: onp.ToFloatND, n: onp.ToFloat) -> onp.ArrayND[_FloatQ]: ... +@overload +def gauss_spline(x: onp.ToComplexStrict1D, n: onp.ToFloat) -> onp.Array1D[_InexactQ]: ... +@overload +def gauss_spline(x: onp.ToComplexStrict2D, n: onp.ToFloat) -> onp.Array2D[_InexactQ]: ... +@overload +def gauss_spline(x: onp.ToComplexStrict3D, n: onp.ToFloat) -> onp.Array3D[_InexactQ]: ... +@overload +def gauss_spline(x: onp.ToComplexND, n: onp.ToFloat) -> onp.ArrayND[_InexactQ]: ... + +# +@overload +def cspline1d(signal: onp.ArrayND[_InexactQT], lamb: onp.ToFloat = 0.0) -> onp.Array1D[_InexactQT]: ... +@overload +def cspline1d(signal: onp.ToFloatND, lamb: onp.ToFloat = 0.0) -> onp.Array1D[_FloatQ]: ... +@overload +def cspline1d(signal: onp.ToComplexND, lamb: onp.ToFloat = 0.0) -> onp.Array1D[_InexactQ]: ... + +# +@overload +def qspline1d(signal: onp.ArrayND[_InexactQT], lamb: onp.ToFloat = 0.0) -> onp.Array1D[_InexactQT]: ... +@overload +def qspline1d(signal: onp.ToFloatND, lamb: onp.ToFloat = 0.0) -> onp.Array1D[_FloatQ]: ... +@overload +def qspline1d(signal: onp.ToComplexND, lamb: onp.ToFloat = 0.0) -> onp.Array1D[_InexactQ]: ... + +# +@overload +def cspline2d(signal: onp.ToFloatND, lamb: onp.ToFloat = 0.0, precision: onp.ToFloat = -1.0) -> onp.Array1D[np.float64]: ... +@overload +def cspline2d( + signal: onp.ToComplexND, + lamb: onp.ToFloat = 0.0, + precision: onp.ToFloat = -1.0, +) -> onp.Array1D[np.float64 | np.complex128]: ... + +# +@overload +def qspline2d(signal: onp.ToFloatND, lamb: onp.ToFloat = 0.0, precision: onp.ToFloat = -1.0) -> onp.Array1D[np.float64]: ... +@overload +def qspline2d( + signal: onp.ToComplexND, + lamb: onp.ToFloat = 0.0, + precision: onp.ToFloat = -1.0, +) -> onp.Array1D[np.float64 | np.complex128]: ... + +# +def cspline1d_eval( + cj: onp.Array1D[_InexactT], + newx: onp.ToFloatND, + dx: onp.ToFloat = 1.0, + x0: onp.ToFloat = 0, +) -> onp.Array1D[_InexactT]: ... + +# +def qspline1d_eval( + cj: onp.Array1D[_InexactQT], + newx: onp.ToFloatND, + dx: onp.ToFloat = 1.0, + x0: onp.ToFloat = 0, +) -> onp.Array1D[_InexactQT]: ... + +# +def symiirorder1( + signal: onp.ArrayND[_InexactDT, _ShapeT], + c0: onp.ToComplex, + z1: onp.ToComplex, + precision: onp.ToFloat = -1.0, +) -> onp.ArrayND[_InexactDT, _ShapeT]: ... + +# +def symiirorder2( + input: onp.ArrayND[_FloatDT, _ShapeT], + r: onp.ToFloat, + omega: onp.ToFloat, + precision: onp.ToFloat = -1.0, +) -> onp.ArrayND[_FloatDT, _ShapeT]: ... diff --git a/scipy-stubs/signal/_waveforms.pyi b/scipy-stubs/signal/_waveforms.pyi index 9e7221fc..edf475e1 100644 --- a/scipy-stubs/signal/_waveforms.pyi +++ b/scipy-stubs/signal/_waveforms.pyi @@ -7,23 +7,45 @@ import optype.numpy as onp from numpy._typing import _DTypeLike from scipy._typing import AnyShape -__all__ = ["chirp", "gausspulse", "sawtooth", "square", "sweep_poly", "unit_impulse"] +__all__ = [ + "chirp", + "gausspulse", + "sawtooth", + "square", + "sweep_poly", + "unit_impulse", +] _SCT = TypeVar("_SCT", bound=np.generic) _Truthy: TypeAlias = Literal[1, True] _Falsy: TypeAlias = Literal[0, False] -_ArrayLikeFloat: TypeAlias = onp.ToFloat | onp.ToFloatND -_Array_f: TypeAlias = onp.ArrayND[np.floating[Any]] -_Array_f8: TypeAlias = onp.ArrayND[np.float64] + +_ToFloat0ND: TypeAlias = onp.ToFloat | onp.ToFloatND +_FloatingND: TypeAlias = onp.ArrayND[np.floating[Any]] +_FloatND: TypeAlias = onp.ArrayND[np.float64] _ChirpMethod: TypeAlias = Literal["linear", "quadratic", "logarithmic", "hyperbolic"] -def sawtooth(t: _ArrayLikeFloat, width: _ArrayLikeFloat = 1) -> _Array_f8: ... -def square(t: _ArrayLikeFloat, duty: _ArrayLikeFloat = 0.5) -> _Array_f8: ... +### + +def sawtooth(t: _ToFloat0ND, width: _ToFloat0ND = 1) -> _FloatND: ... +def square(t: _ToFloat0ND, duty: _ToFloat0ND = 0.5) -> _FloatND: ... # -@overload # Arrays +@overload # real scalars +def chirp( + t: onp.ToFloat, + f0: onp.ToFloat, + t1: onp.ToFloat, + f1: onp.ToFloat, + method: _ChirpMethod = "linear", + phi: onp.ToFloat = 0, + vertex_zero: op.CanBool = True, + *, + complex: _Falsy = False, +) -> np.floating[Any]: ... +@overload # real arrays def chirp( t: onp.ToFloatND, f0: onp.ToFloat, @@ -32,8 +54,10 @@ def chirp( method: _ChirpMethod = "linear", phi: onp.ToFloat = 0, vertex_zero: op.CanBool = True, -) -> _Array_f: ... -@overload # Scalars + *, + complex: _Falsy = False, +) -> _FloatingND: ... +@overload # complex scalars def chirp( t: onp.ToFloat, f0: onp.ToFloat, @@ -42,14 +66,28 @@ def chirp( method: _ChirpMethod = "linear", phi: onp.ToFloat = 0, vertex_zero: op.CanBool = True, -) -> np.floating[Any]: ... + *, + complex: _Truthy, +) -> np.complexfloating[Any, Any]: ... +@overload # complex arrays +def chirp( + t: onp.ToFloatND, + f0: onp.ToFloat, + t1: onp.ToFloat, + f1: onp.ToFloat, + method: _ChirpMethod = "linear", + phi: onp.ToFloat = 0, + vertex_zero: op.CanBool = True, + *, + complex: _Truthy, +) -> onp.ArrayND[np.complexfloating[Any, Any]]: ... # def sweep_poly( - t: _ArrayLikeFloat, + t: _ToFloat0ND, poly: onp.ToFloatND | np.poly1d, phi: onp.ToFloat = 0, -) -> _Array_f8: ... +) -> _FloatND: ... # @overload # dtype is not given @@ -57,7 +95,7 @@ def unit_impulse( shape: AnyShape, idx: op.CanIndex | Iterable[op.CanIndex] | Literal["mid"] | None = None, dtype: type[float] = ..., -) -> _Array_f8: ... +) -> _FloatND: ... @overload # dtype is given def unit_impulse( shape: AnyShape, @@ -162,7 +200,7 @@ def gausspulse( tpr: onp.ToFloat = -60, retquad: _Falsy = False, retenv: _Falsy = False, -) -> _Array_f8: ... +) -> _FloatND: ... @overload # retquad: False = ..., retenv: True (keyword) def gausspulse( t: onp.ToFloatND, @@ -173,7 +211,7 @@ def gausspulse( retquad: _Falsy = False, *, retenv: _Truthy, -) -> tuple[_Array_f8, _Array_f8]: ... +) -> tuple[_FloatND, _FloatND]: ... @overload # retquad: False (positional), retenv: False (positional) def gausspulse( t: onp.ToFloatND, @@ -183,7 +221,7 @@ def gausspulse( tpr: onp.ToFloat, retquad: _Falsy, retenv: _Truthy, -) -> tuple[_Array_f8, _Array_f8]: ... +) -> tuple[_FloatND, _FloatND]: ... @overload # retquad: True (positional), retenv: False = ... def gausspulse( t: onp.ToFloatND, @@ -193,7 +231,7 @@ def gausspulse( tpr: onp.ToFloat, retquad: _Truthy, retenv: _Falsy = False, -) -> tuple[_Array_f8, _Array_f8]: ... +) -> tuple[_FloatND, _FloatND]: ... @overload # retquad: True (keyword), retenv: False = ... def gausspulse( t: onp.ToFloatND, @@ -204,7 +242,7 @@ def gausspulse( *, retquad: _Truthy, retenv: _Falsy = False, -) -> tuple[_Array_f8, _Array_f8]: ... +) -> tuple[_FloatND, _FloatND]: ... @overload # retquad: True (positional), retenv: True (positional/keyword) def gausspulse( t: onp.ToFloatND, @@ -214,7 +252,7 @@ def gausspulse( tpr: onp.ToFloat, retquad: _Truthy, retenv: _Truthy, -) -> tuple[_Array_f8, _Array_f8, _Array_f8]: ... +) -> tuple[_FloatND, _FloatND, _FloatND]: ... @overload # retquad: True (keyword), retenv: True def gausspulse( t: onp.ToFloatND, @@ -225,4 +263,4 @@ def gausspulse( *, retquad: _Truthy, retenv: _Truthy, -) -> tuple[_Array_f8, _Array_f8, _Array_f8]: ... +) -> tuple[_FloatND, _FloatND, _FloatND]: ... diff --git a/scipy-stubs/signal/_wavelets.pyi b/scipy-stubs/signal/_wavelets.pyi index 3b0dfb11..f93c5705 100644 --- a/scipy-stubs/signal/_wavelets.pyi +++ b/scipy-stubs/signal/_wavelets.pyi @@ -1,25 +1 @@ -__all__ = ["cascade", "cwt", "daub", "morlet", "morlet2", "qmf", "ricker"] - -from collections.abc import Callable -from typing_extensions import deprecated - -@deprecated("will be removed in SciPy 1.15") -def daub(p: int) -> object: ... -@deprecated("will be removed in SciPy 1.15") -def qmf(hk: object) -> object: ... -@deprecated("will be removed in SciPy 1.15") -def cascade(hk: object, J: int = 7) -> tuple[object, object, object]: ... -@deprecated("will be removed in SciPy 1.15") -def morlet(M: int, w: float = 5.0, s: float = 1.0, complete: bool = True) -> object: ... -@deprecated("will be removed in SciPy 1.15") -def ricker(points: int, a: object) -> object: ... -@deprecated("will be removed in SciPy 1.15") -def morlet2(M: int, s: float, w: float = 5) -> object: ... -@deprecated("will be removed in SciPy 1.15") -def cwt( - data: object, - wavelet: Callable[..., object], - widths: object, - dtype: object | None = None, - **kwargs: object, -) -> object: ... +# nothing to see here diff --git a/scipy-stubs/signal/bsplines.pyi b/scipy-stubs/signal/bsplines.pyi index 657413df..5e152975 100644 --- a/scipy-stubs/signal/bsplines.pyi +++ b/scipy-stubs/signal/bsplines.pyi @@ -1,16 +1,7 @@ # This module is not meant for public use and will be removed in SciPy v2.0.0. from typing_extensions import deprecated -__all__ = [ - "cspline1d", - "cspline1d_eval", - "cspline2d", - "gauss_spline", - "qspline1d", - "qspline1d_eval", - "sepfir2d", - "spline_filter", -] +__all__ = ["cspline1d", "cspline1d_eval", "cspline2d", "gauss_spline", "qspline1d", "qspline1d_eval", "sepfir2d", "spline_filter"] @deprecated("will be removed in SciPy v2.0.0") def cspline1d(signal: object, lamb: object = ...) -> object: ... diff --git a/scipy-stubs/signal/filter_design.pyi b/scipy-stubs/signal/filter_design.pyi index ccf20f27..169cf128 100644 --- a/scipy-stubs/signal/filter_design.pyi +++ b/scipy-stubs/signal/filter_design.pyi @@ -24,6 +24,7 @@ __all__ = [ "freqs", "freqs_zpk", "freqz", + "freqz_sos", "freqz_zpk", "gammatone", "group_delay", @@ -74,7 +75,10 @@ def freqz_zpk(z: object, p: object, k: object, worN: object = ..., whole: object @deprecated("will be removed in SciPy v2.0.0") def group_delay(system: object, w: object = ..., whole: object = ..., fs: object = ...) -> object: ... @deprecated("will be removed in SciPy v2.0.0") -def sosfreqz(sos: object, worN: object = ..., whole: object = ..., fs: object = ...) -> object: ... +def freqz_sos(sos: object, worN: object = ..., whole: object = ..., fs: object = ...) -> object: ... + +sosfreqz = freqz_sos # pyright: ignore[reportDeprecated] + @deprecated("will be removed in SciPy v2.0.0") def tf2zpk(b: object, a: object) -> object: ... @deprecated("will be removed in SciPy v2.0.0") diff --git a/scipy-stubs/signal/signaltools.pyi b/scipy-stubs/signal/signaltools.pyi index 1954fb70..c650848e 100644 --- a/scipy-stubs/signal/signaltools.pyi +++ b/scipy-stubs/signal/signaltools.pyi @@ -4,7 +4,6 @@ from typing_extensions import Self, deprecated __all__ = [ "cheby1", "choose_conv_method", - "cmplx_sort", "convolve", "convolve2d", "correlate", @@ -199,5 +198,3 @@ def decimate( axis: object = ..., zero_phase: object = ..., ) -> object: ... -@deprecated("will be removed in SciPy v1.15.0") -def cmplx_sort(p: object) -> object: ... diff --git a/scipy-stubs/signal/spectral.pyi b/scipy-stubs/signal/spectral.pyi index c333e7cb..559e5a9b 100644 --- a/scipy-stubs/signal/spectral.pyi +++ b/scipy-stubs/signal/spectral.pyi @@ -61,7 +61,16 @@ def istft( scaling: object = ..., ) -> object: ... @deprecated("will be removed in SciPy v2.0.0") -def lombscargle(x: object, y: object, freqs: object, precenter: object = ..., normalize: object = ...) -> object: ... +def lombscargle( + x: object, + y: object, + freqs: object, + precenter: object = ..., + normalize: object = ..., + *, + weights: object | None = None, + floating_mean: bool = False, +) -> object: ... @deprecated("will be removed in SciPy v2.0.0") def periodogram( x: object, diff --git a/scipy-stubs/signal/spline.pyi b/scipy-stubs/signal/spline.pyi index 9efd1170..ce854e90 100644 --- a/scipy-stubs/signal/spline.pyi +++ b/scipy-stubs/signal/spline.pyi @@ -1,18 +1,8 @@ # This module is not meant for public use and will be removed in SciPy v2.0.0. -from typing_extensions import deprecated -__all__ = ["cspline2d", "qspline2d", "sepfir2d", "symiirorder1", "symiirorder2"] +from typing_extensions import deprecated -# _spline_filters -@deprecated("will be removed in SciPy v2.0.0") -def qspline2d(signal: object, lamb: object = ..., precision: object = ...) -> object: ... -@deprecated("will be removed in SciPy v2.0.0") -def cspline2d(signal: object, lamb: object = ..., precision: object = ...) -> object: ... -@deprecated("will be removed in SciPy v2.0.0") -def symiirorder1(signal: object, c0: object, z1: object, precision: object = ...) -> object: ... -@deprecated("will be removed in SciPy v2.0.0") -def symiirorder2(input: object, r: object, omega: object, precision: object = ...) -> object: ... +__all__ = ["sepfir2d"] -# _spline @deprecated("will be removed in SciPy v2.0.0") def sepfir2d(input: object, hrow: object, hcol: object) -> object: ... diff --git a/scipy-stubs/signal/waveforms.pyi b/scipy-stubs/signal/waveforms.pyi index 21c13e37..e71a4040 100644 --- a/scipy-stubs/signal/waveforms.pyi +++ b/scipy-stubs/signal/waveforms.pyi @@ -1,4 +1,5 @@ # This module is not meant for public use and will be removed in SciPy v2.0.0. + from typing_extensions import deprecated __all__ = ["chirp", "gausspulse", "sawtooth", "square", "sweep_poly", "unit_impulse"] @@ -26,6 +27,8 @@ def chirp( method: object = ..., phi: object = ..., vertex_zero: object = ..., + *, + complex: object = False, ) -> object: ... @deprecated("will be removed in SciPy v2.0.0") def sweep_poly(t: object, poly: object, phi: object = ...) -> object: ... diff --git a/scipy-stubs/signal/wavelets.pyi b/scipy-stubs/signal/wavelets.pyi index 91d1216f..1a67e605 100644 --- a/scipy-stubs/signal/wavelets.pyi +++ b/scipy-stubs/signal/wavelets.pyi @@ -1,21 +1,2 @@ -# This module is not meant for public use and will be removed in SciPy v1.15.0. -from typing_extensions import deprecated - -__all__ = ["cascade", "convolve", "cwt", "daub", "morlet", "morlet2", "qmf", "ricker"] - -@deprecated("will be removed in SciPy v1.15.0") -def convolve(in1: object, in2: object, mode: object = ..., method: object = ...) -> object: ... -@deprecated("will be removed in SciPy v1.15.0") -def cwt(data: object, wavelet: object, widths: object, dtype: object = ..., **kwargs: object) -> object: ... -@deprecated("will be removed in SciPy v1.15.0") -def cascade(hk: object, J: object = ...) -> object: ... -@deprecated("will be removed in SciPy v1.15.0") -def morlet(M: object, w: object = ..., s: object = ..., complete: object = ...) -> object: ... -@deprecated("will be removed in SciPy v1.15.0") -def daub(p: object) -> object: ... -@deprecated("will be removed in SciPy v1.15.0") -def morlet2(M: object, s: object, w: object = ...) -> object: ... -@deprecated("will be removed in SciPy v1.15.0") -def qmf(hk: object) -> object: ... -@deprecated("will be removed in SciPy v1.15.0") -def ricker(points: object, a: object) -> object: ... +# This file is not meant for public use and will be removed in SciPy v2.0.0. +__all__: list[str] = []