From a31e2fa6a07d10080fc50a0c81f700684a95fe7f Mon Sep 17 00:00:00 2001 From: Pavadol Yamsiri Date: Sat, 2 Nov 2024 14:55:01 +1100 Subject: [PATCH 01/12] `signal.windows`: Add type stubs for `_windows.pyi`. --- scipy-stubs/signal/windows/_windows.pyi | 181 +++++++++++++++++++----- 1 file changed, 149 insertions(+), 32 deletions(-) diff --git a/scipy-stubs/signal/windows/_windows.pyi b/scipy-stubs/signal/windows/_windows.pyi index 4c58a08d..cf325a60 100644 --- a/scipy-stubs/signal/windows/_windows.pyi +++ b/scipy-stubs/signal/windows/_windows.pyi @@ -1,4 +1,9 @@ -from scipy._typing import Untyped +from collections.abc import Sequence +from typing import Literal, TypeAlias, overload +from typing_extensions import Unpack + +import numpy as np +from scipy._typing import AnyReal __all__ = [ "barthann", @@ -29,36 +34,148 @@ __all__ = [ "tukey", ] -def general_cosine(M, a, sym: bool = True) -> Untyped: ... -def boxcar(M, sym: bool = True) -> Untyped: ... -def triang(M, sym: bool = True) -> Untyped: ... -def parzen(M, sym: bool = True) -> Untyped: ... -def bohman(M, sym: bool = True) -> Untyped: ... -def blackman(M, sym: bool = True) -> Untyped: ... -def nuttall(M, sym: bool = True) -> Untyped: ... -def blackmanharris(M, sym: bool = True) -> Untyped: ... -def flattop(M, sym: bool = True) -> Untyped: ... -def bartlett(M, sym: bool = True) -> Untyped: ... -def hann(M, sym: bool = True) -> Untyped: ... -def tukey(M, alpha: float = 0.5, sym: bool = True) -> Untyped: ... -def barthann(M, sym: bool = True) -> Untyped: ... -def general_hamming(M, alpha, sym: bool = True) -> Untyped: ... -def hamming(M, sym: bool = True) -> Untyped: ... -def kaiser(M, beta, sym: bool = True) -> Untyped: ... -def kaiser_bessel_derived(M, beta, *, sym: bool = True) -> Untyped: ... -def gaussian(M, std, sym: bool = True) -> Untyped: ... -def general_gaussian(M, p, sig, sym: bool = True) -> Untyped: ... -def chebwin(M, at, sym: bool = True) -> Untyped: ... -def cosine(M, sym: bool = True) -> Untyped: ... -def exponential(M, center: Untyped | None = None, tau: float = 1.0, sym: bool = True) -> Untyped: ... -def taylor(M, nbar: int = 4, sll: int = 30, norm: bool = True, sym: bool = True) -> Untyped: ... +_Array_f8_1d: TypeAlias = np.ndarray[tuple[int], np.dtype[np.float64]] +_Array_f8_2d: TypeAlias = np.ndarray[tuple[int, int], np.dtype[np.float64]] + +_Window: TypeAlias = Literal[ + "barthann", + "brthan", + "bth", + "bartlett", + "bart", + "brt", + "blackman", + "black", + "blk", + "blackmanharris", + "blackharr", + "bkh", + "bohman", + "bman", + "bmn", + "boxcar", + "box", + "ones", + "rect", + "rectangular", + "cosine", + "halfcosine", + "exponential", + "poisson", + "flattop", + "flat", + "flt", + "hamming", + "hamm", + "ham", + "hann", + "han", + "lanczos", + "sinc", + "nuttall", + "nutl", + "nut", + "parzen", + "parz", + "par", + "taylor", + "taylorwin", + "triangle", + "triang", + "tri", + "tukey", + "tuk", +] +_WindowNeedsParams: TypeAlias = Literal[ + "chebwin", + "cheb", + "dpss", + "gaussian", + "gauss", + "gss", + "general cosine", + "general_cosine", + "general gaussian", + "general_gaussian", + "general gauss", + "general_gauss", + "ggs", + "general hamming", + "general_hamming", + "kaiser", + "ksr", + "kaiser bessel derived", + "kbd", +] + +def general_cosine(M: int, a: Sequence[AnyReal], sym: bool = True) -> _Array_f8_1d: ... +def boxcar(M: int, sym: bool = True) -> _Array_f8_1d: ... +def triang(M: int, sym: bool = True) -> _Array_f8_1d: ... +def parzen(M: int, sym: bool = True) -> _Array_f8_1d: ... +def bohman(M: int, sym: bool = True) -> _Array_f8_1d: ... +def blackman(M: int, sym: bool = True) -> _Array_f8_1d: ... +def nuttall(M: int, sym: bool = True) -> _Array_f8_1d: ... +def blackmanharris(M: int, sym: bool = True) -> _Array_f8_1d: ... +def flattop(M: int, sym: bool = True) -> _Array_f8_1d: ... +def bartlett(M: int, sym: bool = True) -> _Array_f8_1d: ... +def hann(M: int, sym: bool = True) -> _Array_f8_1d: ... +def tukey(M: int, alpha: AnyReal = 0.5, sym: bool = True) -> _Array_f8_1d: ... +def barthann(M: int, sym: bool = True) -> _Array_f8_1d: ... +def general_hamming(M: int, alpha: AnyReal, sym: bool = True) -> _Array_f8_1d: ... +def hamming(M: int, sym: bool = True) -> _Array_f8_1d: ... +def kaiser(M: int, beta: AnyReal, sym: bool = True) -> _Array_f8_1d: ... +def kaiser_bessel_derived(M: int, beta: AnyReal, *, sym: bool = True) -> _Array_f8_1d: ... +def gaussian(M: int, std: AnyReal, sym: bool = True) -> _Array_f8_1d: ... +def general_gaussian(M: int, p: AnyReal, sig: AnyReal, sym: bool = True) -> _Array_f8_1d: ... +def chebwin(M: int, at: AnyReal, sym: bool = True) -> _Array_f8_1d: ... +def cosine(M: int, sym: bool = True) -> _Array_f8_1d: ... +def exponential(M: int, center: AnyReal | None = None, tau: AnyReal = 1.0, sym: bool = True) -> _Array_f8_1d: ... +def taylor(M: int, nbar: int = 4, sll: int = 30, norm: bool = True, sym: bool = True) -> _Array_f8_1d: ... +def lanczos(M: int, *, sym: bool = True) -> _Array_f8_1d: ... + +# +@overload def dpss( - M, - NW, - Kmax: Untyped | None = None, + *, + M: int, + NW: AnyReal, + Kmax: int = ..., sym: bool = True, - norm: Untyped | None = None, - return_ratios: bool = False, -) -> Untyped: ... -def lanczos(M, *, sym: bool = True) -> Untyped: ... -def get_window(window: Untyped, Nx: Untyped, fftbins: bool = True) -> Untyped: ... + norm: Literal[2, "approximate", "subsample "] | None = None, + return_ratios: Literal[False] = ..., +) -> _Array_f8_2d: ... +@overload +def dpss( + *, + M: int, + NW: AnyReal, + Kmax: None = ..., + sym: bool = True, + norm: Literal[2, "approximate", "subsample "] | None = None, + return_ratios: Literal[False] = ..., +) -> _Array_f8_1d: ... +@overload +def dpss( + *, + M: int, + NW: AnyReal, + Kmax: int = ..., + sym: bool = True, + norm: Literal[2, "approximate", "subsample "] | None = None, + return_ratios: Literal[True] = ..., +) -> tuple[_Array_f8_2d, _Array_f8_1d]: ... +@overload +def dpss( + *, + M: int, + NW: AnyReal, + Kmax: None = None, + sym: bool = True, + norm: Literal[2, "approximate", "subsample "] | None = None, + return_ratios: Literal[True] = ..., +) -> tuple[_Array_f8_1d, AnyReal]: ... + +# +def get_window( + window: _Window | AnyReal | tuple[_Window | _WindowNeedsParams, Unpack[tuple[object, ...]]], Nx: int, fftbins: bool = True +) -> _Array_f8_1d: ... From c0c28736bcad829c9ea4c381ee2c54576790e0b9 Mon Sep 17 00:00:00 2001 From: Pavadol Yamsiri Date: Sat, 2 Nov 2024 22:36:58 +1100 Subject: [PATCH 02/12] `signal.windows`: Use a `TypeAlias` for `norm`. In `_windows.pyi`. Makes it less verbose. --- scipy-stubs/signal/windows/_windows.pyi | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scipy-stubs/signal/windows/_windows.pyi b/scipy-stubs/signal/windows/_windows.pyi index baa49ceb..94c2eede 100644 --- a/scipy-stubs/signal/windows/_windows.pyi +++ b/scipy-stubs/signal/windows/_windows.pyi @@ -38,6 +38,7 @@ __all__ = [ _Array_f8_1d: TypeAlias = np.ndarray[tuple[int], np.dtype[np.float64]] _Array_f8_2d: TypeAlias = np.ndarray[tuple[int, int], np.dtype[np.float64]] +_Norm: TypeAlias = Literal[2, "approximate", "subsample "] _Window: TypeAlias = Literal[ "barthann", "brthan", @@ -142,7 +143,7 @@ def dpss( NW: AnyReal, Kmax: int = ..., sym: bool = True, - norm: Literal[2, "approximate", "subsample "] | None = None, + norm: _Norm | None = None, return_ratios: Literal[False] = ..., ) -> _Array_f8_2d: ... @overload @@ -152,7 +153,7 @@ def dpss( NW: AnyReal, Kmax: None = ..., sym: bool = True, - norm: Literal[2, "approximate", "subsample "] | None = None, + norm: _Norm | None = None, return_ratios: Literal[False] = ..., ) -> _Array_f8_1d: ... @overload @@ -162,7 +163,7 @@ def dpss( NW: AnyReal, Kmax: int = ..., sym: bool = True, - norm: Literal[2, "approximate", "subsample "] | None = None, + norm: _Norm | None = None, return_ratios: Literal[True] = ..., ) -> tuple[_Array_f8_2d, _Array_f8_1d]: ... @overload @@ -172,7 +173,7 @@ def dpss( NW: AnyReal, Kmax: None = None, sym: bool = True, - norm: Literal[2, "approximate", "subsample "] | None = None, + norm: _Norm | None = None, return_ratios: Literal[True] = ..., ) -> tuple[_Array_f8_1d, AnyReal]: ... From bbe37957b6af358e93d9eab793cc191a9e66ebc6 Mon Sep 17 00:00:00 2001 From: Pavadol Yamsiri Date: Sat, 2 Nov 2024 22:40:21 +1100 Subject: [PATCH 03/12] `signal.windows`: Use `op.CanBool` instead of `bool`. In `_windows.pyi`. --- scipy-stubs/signal/windows/_windows.pyi | 57 +++++++++++++------------ 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/scipy-stubs/signal/windows/_windows.pyi b/scipy-stubs/signal/windows/_windows.pyi index 94c2eede..eec2d558 100644 --- a/scipy-stubs/signal/windows/_windows.pyi +++ b/scipy-stubs/signal/windows/_windows.pyi @@ -3,6 +3,7 @@ from typing import Literal, TypeAlias, overload from typing_extensions import Unpack import numpy as np +import optype as op from scipy._typing import AnyReal __all__ = [ @@ -110,30 +111,30 @@ _WindowNeedsParams: TypeAlias = Literal[ "kbd", ] -def general_cosine(M: int, a: Sequence[AnyReal], sym: bool = True) -> _Array_f8_1d: ... -def boxcar(M: int, sym: bool = True) -> _Array_f8_1d: ... -def triang(M: int, sym: bool = True) -> _Array_f8_1d: ... -def parzen(M: int, sym: bool = True) -> _Array_f8_1d: ... -def bohman(M: int, sym: bool = True) -> _Array_f8_1d: ... -def blackman(M: int, sym: bool = True) -> _Array_f8_1d: ... -def nuttall(M: int, sym: bool = True) -> _Array_f8_1d: ... -def blackmanharris(M: int, sym: bool = True) -> _Array_f8_1d: ... -def flattop(M: int, sym: bool = True) -> _Array_f8_1d: ... -def bartlett(M: int, sym: bool = True) -> _Array_f8_1d: ... -def hann(M: int, sym: bool = True) -> _Array_f8_1d: ... -def tukey(M: int, alpha: AnyReal = 0.5, sym: bool = True) -> _Array_f8_1d: ... -def barthann(M: int, sym: bool = True) -> _Array_f8_1d: ... -def general_hamming(M: int, alpha: AnyReal, sym: bool = True) -> _Array_f8_1d: ... -def hamming(M: int, sym: bool = True) -> _Array_f8_1d: ... -def kaiser(M: int, beta: AnyReal, sym: bool = True) -> _Array_f8_1d: ... -def kaiser_bessel_derived(M: int, beta: AnyReal, *, sym: bool = True) -> _Array_f8_1d: ... -def gaussian(M: int, std: AnyReal, sym: bool = True) -> _Array_f8_1d: ... -def general_gaussian(M: int, p: AnyReal, sig: AnyReal, sym: bool = True) -> _Array_f8_1d: ... -def chebwin(M: int, at: AnyReal, sym: bool = True) -> _Array_f8_1d: ... -def cosine(M: int, sym: bool = True) -> _Array_f8_1d: ... -def exponential(M: int, center: AnyReal | None = None, tau: AnyReal = 1.0, sym: bool = True) -> _Array_f8_1d: ... -def taylor(M: int, nbar: int = 4, sll: int = 30, norm: bool = True, sym: bool = True) -> _Array_f8_1d: ... -def lanczos(M: int, *, sym: bool = True) -> _Array_f8_1d: ... +def general_cosine(M: int, a: Sequence[AnyReal], sym: op.CanBool = True) -> _Array_f8_1d: ... +def boxcar(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... +def triang(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... +def parzen(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... +def bohman(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... +def blackman(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... +def nuttall(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... +def blackmanharris(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... +def flattop(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... +def bartlett(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... +def hann(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... +def tukey(M: int, alpha: AnyReal = 0.5, sym: op.CanBool = True) -> _Array_f8_1d: ... +def barthann(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... +def general_hamming(M: int, alpha: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... +def hamming(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... +def kaiser(M: int, beta: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... +def kaiser_bessel_derived(M: int, beta: AnyReal, *, sym: op.CanBool = True) -> _Array_f8_1d: ... +def gaussian(M: int, std: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... +def general_gaussian(M: int, p: AnyReal, sig: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... +def chebwin(M: int, at: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... +def cosine(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... +def exponential(M: int, center: AnyReal | None = None, tau: AnyReal = 1.0, sym: op.CanBool = True) -> _Array_f8_1d: ... +def taylor(M: int, nbar: int = 4, sll: int = 30, norm: bool = True, sym: op.CanBool = True) -> _Array_f8_1d: ... +def lanczos(M: int, *, sym: op.CanBool = True) -> _Array_f8_1d: ... # @overload @@ -142,7 +143,7 @@ def dpss( M: int, NW: AnyReal, Kmax: int = ..., - sym: bool = True, + sym: op.CanBool = True, norm: _Norm | None = None, return_ratios: Literal[False] = ..., ) -> _Array_f8_2d: ... @@ -152,7 +153,7 @@ def dpss( M: int, NW: AnyReal, Kmax: None = ..., - sym: bool = True, + sym: op.CanBool = True, norm: _Norm | None = None, return_ratios: Literal[False] = ..., ) -> _Array_f8_1d: ... @@ -162,7 +163,7 @@ def dpss( M: int, NW: AnyReal, Kmax: int = ..., - sym: bool = True, + sym: op.CanBool = True, norm: _Norm | None = None, return_ratios: Literal[True] = ..., ) -> tuple[_Array_f8_2d, _Array_f8_1d]: ... @@ -172,7 +173,7 @@ def dpss( M: int, NW: AnyReal, Kmax: None = None, - sym: bool = True, + sym: op.CanBool = True, norm: _Norm | None = None, return_ratios: Literal[True] = ..., ) -> tuple[_Array_f8_1d, AnyReal]: ... From 21e252632d7435a95629c490aade5e8da0c46c64 Mon Sep 17 00:00:00 2001 From: Pavadol Yamsiri Date: Sat, 2 Nov 2024 22:46:44 +1100 Subject: [PATCH 04/12] `signal.windows`: Adjust the function overloads for `dpss` In `_windows.pyi`. --- scipy-stubs/signal/windows/_windows.pyi | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/scipy-stubs/signal/windows/_windows.pyi b/scipy-stubs/signal/windows/_windows.pyi index eec2d558..7b8958f9 100644 --- a/scipy-stubs/signal/windows/_windows.pyi +++ b/scipy-stubs/signal/windows/_windows.pyi @@ -142,41 +142,41 @@ def dpss( *, M: int, NW: AnyReal, - Kmax: int = ..., + Kmax: op.CanIndex, sym: op.CanBool = True, norm: _Norm | None = None, - return_ratios: Literal[False] = ..., + return_ratios: Literal[False] = False, ) -> _Array_f8_2d: ... @overload def dpss( *, M: int, NW: AnyReal, - Kmax: None = ..., + Kmax: None = None, sym: op.CanBool = True, norm: _Norm | None = None, - return_ratios: Literal[False] = ..., + return_ratios: Literal[False] = False, ) -> _Array_f8_1d: ... @overload def dpss( *, M: int, NW: AnyReal, - Kmax: int = ..., + Kmax: op.CanIndex, + return_ratios: Literal[True], sym: op.CanBool = True, norm: _Norm | None = None, - return_ratios: Literal[True] = ..., ) -> tuple[_Array_f8_2d, _Array_f8_1d]: ... @overload def dpss( *, M: int, NW: AnyReal, + return_ratios: Literal[True], Kmax: None = None, sym: op.CanBool = True, norm: _Norm | None = None, - return_ratios: Literal[True] = ..., -) -> tuple[_Array_f8_1d, AnyReal]: ... +) -> tuple[_Array_f8_1d, np.float64]: ... # def get_window( From 3cb47c24ee697cfe6eceb2097ae73d4ca40e462a Mon Sep 17 00:00:00 2001 From: Pavadol Yamsiri Date: Sat, 2 Nov 2024 22:50:47 +1100 Subject: [PATCH 05/12] `signal.windows`: Use type alias for allowed integers for `M` param In `_windows.pyi`. --- scipy-stubs/signal/windows/_windows.pyi | 57 +++++++++++++------------ 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/scipy-stubs/signal/windows/_windows.pyi b/scipy-stubs/signal/windows/_windows.pyi index 7b8958f9..cc78eee1 100644 --- a/scipy-stubs/signal/windows/_windows.pyi +++ b/scipy-stubs/signal/windows/_windows.pyi @@ -40,6 +40,7 @@ _Array_f8_1d: TypeAlias = np.ndarray[tuple[int], np.dtype[np.float64]] _Array_f8_2d: TypeAlias = np.ndarray[tuple[int, int], np.dtype[np.float64]] _Norm: TypeAlias = Literal[2, "approximate", "subsample "] +_WindowLength: TypeAlias = int | np.int16 | np.int32 | np.int64 _Window: TypeAlias = Literal[ "barthann", "brthan", @@ -111,36 +112,36 @@ _WindowNeedsParams: TypeAlias = Literal[ "kbd", ] -def general_cosine(M: int, a: Sequence[AnyReal], sym: op.CanBool = True) -> _Array_f8_1d: ... -def boxcar(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... -def triang(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... -def parzen(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... -def bohman(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... -def blackman(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... -def nuttall(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... -def blackmanharris(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... -def flattop(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... -def bartlett(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... -def hann(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... -def tukey(M: int, alpha: AnyReal = 0.5, sym: op.CanBool = True) -> _Array_f8_1d: ... -def barthann(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... -def general_hamming(M: int, alpha: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... -def hamming(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... -def kaiser(M: int, beta: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... -def kaiser_bessel_derived(M: int, beta: AnyReal, *, sym: op.CanBool = True) -> _Array_f8_1d: ... -def gaussian(M: int, std: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... -def general_gaussian(M: int, p: AnyReal, sig: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... -def chebwin(M: int, at: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... -def cosine(M: int, sym: op.CanBool = True) -> _Array_f8_1d: ... -def exponential(M: int, center: AnyReal | None = None, tau: AnyReal = 1.0, sym: op.CanBool = True) -> _Array_f8_1d: ... -def taylor(M: int, nbar: int = 4, sll: int = 30, norm: bool = True, sym: op.CanBool = True) -> _Array_f8_1d: ... -def lanczos(M: int, *, sym: op.CanBool = True) -> _Array_f8_1d: ... +def general_cosine(M: _WindowLength, a: Sequence[AnyReal], sym: op.CanBool = True) -> _Array_f8_1d: ... +def boxcar(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... +def triang(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... +def parzen(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... +def bohman(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... +def blackman(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... +def nuttall(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... +def blackmanharris(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... +def flattop(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... +def bartlett(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... +def hann(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... +def tukey(M: _WindowLength, alpha: AnyReal = 0.5, sym: op.CanBool = True) -> _Array_f8_1d: ... +def barthann(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... +def general_hamming(M: _WindowLength, alpha: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... +def hamming(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... +def kaiser(M: _WindowLength, beta: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... +def kaiser_bessel_derived(M: _WindowLength, beta: AnyReal, *, sym: op.CanBool = True) -> _Array_f8_1d: ... +def gaussian(M: _WindowLength, std: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... +def general_gaussian(M: _WindowLength, p: AnyReal, sig: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... +def chebwin(M: _WindowLength, at: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... +def cosine(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... +def exponential(M: _WindowLength, center: AnyReal | None = None, tau: AnyReal = 1.0, sym: op.CanBool = True) -> _Array_f8_1d: ... +def taylor(M: _WindowLength, nbar: int = 4, sll: int = 30, norm: bool = True, sym: op.CanBool = True) -> _Array_f8_1d: ... +def lanczos(M: _WindowLength, *, sym: op.CanBool = True) -> _Array_f8_1d: ... # @overload def dpss( *, - M: int, + M: _WindowLength, NW: AnyReal, Kmax: op.CanIndex, sym: op.CanBool = True, @@ -150,7 +151,7 @@ def dpss( @overload def dpss( *, - M: int, + M: _WindowLength, NW: AnyReal, Kmax: None = None, sym: op.CanBool = True, @@ -160,7 +161,7 @@ def dpss( @overload def dpss( *, - M: int, + M: _WindowLength, NW: AnyReal, Kmax: op.CanIndex, return_ratios: Literal[True], @@ -170,7 +171,7 @@ def dpss( @overload def dpss( *, - M: int, + M: _WindowLength, NW: AnyReal, return_ratios: Literal[True], Kmax: None = None, From 33febdbfee8e55c4641a80de37e1b7d2a2fd7c0c Mon Sep 17 00:00:00 2001 From: Pavadol Yamsiri Date: Sat, 2 Nov 2024 22:51:51 +1100 Subject: [PATCH 06/12] `signal.windows`: Remove `*` that made all arguments kw-only In `_windows.pyi`'s `dpss` function overloads --- scipy-stubs/signal/windows/_windows.pyi | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scipy-stubs/signal/windows/_windows.pyi b/scipy-stubs/signal/windows/_windows.pyi index cc78eee1..54b49baa 100644 --- a/scipy-stubs/signal/windows/_windows.pyi +++ b/scipy-stubs/signal/windows/_windows.pyi @@ -140,7 +140,6 @@ def lanczos(M: _WindowLength, *, sym: op.CanBool = True) -> _Array_f8_1d: ... # @overload def dpss( - *, M: _WindowLength, NW: AnyReal, Kmax: op.CanIndex, @@ -150,7 +149,6 @@ def dpss( ) -> _Array_f8_2d: ... @overload def dpss( - *, M: _WindowLength, NW: AnyReal, Kmax: None = None, @@ -160,7 +158,6 @@ def dpss( ) -> _Array_f8_1d: ... @overload def dpss( - *, M: _WindowLength, NW: AnyReal, Kmax: op.CanIndex, @@ -170,7 +167,6 @@ def dpss( ) -> tuple[_Array_f8_2d, _Array_f8_1d]: ... @overload def dpss( - *, M: _WindowLength, NW: AnyReal, return_ratios: Literal[True], From 67bcb42fa8fa4de2bba3e5e26822b1b744dfe6ec Mon Sep 17 00:00:00 2001 From: Pavadol Yamsiri Date: Sat, 2 Nov 2024 23:14:04 +1100 Subject: [PATCH 07/12] `signal.windows`: Use more general types In `_windows.pyi`. --- scipy-stubs/signal/windows/_windows.pyi | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/scipy-stubs/signal/windows/_windows.pyi b/scipy-stubs/signal/windows/_windows.pyi index 54b49baa..9f74ddc0 100644 --- a/scipy-stubs/signal/windows/_windows.pyi +++ b/scipy-stubs/signal/windows/_windows.pyi @@ -4,7 +4,7 @@ from typing_extensions import Unpack import numpy as np import optype as op -from scipy._typing import AnyReal +from scipy._typing import AnyInt, AnyReal __all__ = [ "barthann", @@ -35,7 +35,6 @@ __all__ = [ "tukey", ] - _Array_f8_1d: TypeAlias = np.ndarray[tuple[int], np.dtype[np.float64]] _Array_f8_2d: TypeAlias = np.ndarray[tuple[int, int], np.dtype[np.float64]] @@ -134,7 +133,9 @@ def general_gaussian(M: _WindowLength, p: AnyReal, sig: AnyReal, sym: op.CanBool def chebwin(M: _WindowLength, at: AnyReal, sym: op.CanBool = True) -> _Array_f8_1d: ... def cosine(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... def exponential(M: _WindowLength, center: AnyReal | None = None, tau: AnyReal = 1.0, sym: op.CanBool = True) -> _Array_f8_1d: ... -def taylor(M: _WindowLength, nbar: int = 4, sll: int = 30, norm: bool = True, sym: op.CanBool = True) -> _Array_f8_1d: ... +def taylor( + M: _WindowLength, nbar: AnyInt = 4, sll: AnyInt = 30, norm: op.CanBool = True, sym: op.CanBool = True +) -> _Array_f8_1d: ... def lanczos(M: _WindowLength, *, sym: op.CanBool = True) -> _Array_f8_1d: ... # @@ -177,5 +178,7 @@ def dpss( # def get_window( - window: _Window | AnyReal | tuple[_Window | _WindowNeedsParams, Unpack[tuple[object, ...]]], Nx: int, fftbins: bool = True -) -> _Array_f8_1d: ... \ No newline at end of file + window: _Window | AnyReal | tuple[_Window | _WindowNeedsParams, Unpack[tuple[object, ...]]], + Nx: _WindowLength, + fftbins: op.CanBool = True, +) -> _Array_f8_1d: ... From b473e3f61e7f8e7b6a6767467337d50b4da35fa4 Mon Sep 17 00:00:00 2001 From: Pavadol Yamsiri Date: Sun, 3 Nov 2024 15:52:22 +1100 Subject: [PATCH 08/12] `signal.windows`: Remove trailing space in `_Norm`. In `_windows.pyi`. --- scipy-stubs/signal/windows/_windows.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scipy-stubs/signal/windows/_windows.pyi b/scipy-stubs/signal/windows/_windows.pyi index 9f74ddc0..27b7118c 100644 --- a/scipy-stubs/signal/windows/_windows.pyi +++ b/scipy-stubs/signal/windows/_windows.pyi @@ -38,7 +38,7 @@ __all__ = [ _Array_f8_1d: TypeAlias = np.ndarray[tuple[int], np.dtype[np.float64]] _Array_f8_2d: TypeAlias = np.ndarray[tuple[int, int], np.dtype[np.float64]] -_Norm: TypeAlias = Literal[2, "approximate", "subsample "] +_Norm: TypeAlias = Literal[2, "approximate", "subsample"] _WindowLength: TypeAlias = int | np.int16 | np.int32 | np.int64 _Window: TypeAlias = Literal[ "barthann", From 57352aea0b74562602a2ca5a658126a8183574f6 Mon Sep 17 00:00:00 2001 From: Pavadol Yamsiri Date: Sun, 3 Nov 2024 16:17:40 +1100 Subject: [PATCH 09/12] `signal.windows`: Allow positional or keyword argument passing in `dpss`. In `_windows.pyi` and the `dpss` function. Allow callers to use positional or keyword argument passing for `Kmax` and `return_ratios`. --- scipy-stubs/signal/windows/_windows.pyi | 31 ++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/scipy-stubs/signal/windows/_windows.pyi b/scipy-stubs/signal/windows/_windows.pyi index 27b7118c..49825281 100644 --- a/scipy-stubs/signal/windows/_windows.pyi +++ b/scipy-stubs/signal/windows/_windows.pyi @@ -138,7 +138,7 @@ def taylor( ) -> _Array_f8_1d: ... def lanczos(M: _WindowLength, *, sym: op.CanBool = True) -> _Array_f8_1d: ... -# +# Overloads where `return_ratios` is `False`. @overload def dpss( M: _WindowLength, @@ -157,23 +157,52 @@ def dpss( norm: _Norm | None = None, return_ratios: Literal[False] = False, ) -> _Array_f8_1d: ... + +# Overloads where `return_ratios` is `True`. +# `return_ratios` as a positional argument @overload def dpss( M: _WindowLength, NW: AnyReal, Kmax: op.CanIndex, + sym: op.CanBool, + norm: _Norm | None, return_ratios: Literal[True], +) -> tuple[_Array_f8_2d, _Array_f8_1d]: ... + +# `return_ratios` as a keyword argument +@overload +def dpss( + M: _WindowLength, + NW: AnyReal, + Kmax: op.CanIndex, sym: op.CanBool = True, norm: _Norm | None = None, + *, + return_ratios: Literal[True], ) -> tuple[_Array_f8_2d, _Array_f8_1d]: ... + +# `return_ratios` as a positional argument @overload def dpss( M: _WindowLength, NW: AnyReal, + Kmax: None, + sym: op.CanBool, + norm: _Norm | None, return_ratios: Literal[True], +) -> tuple[_Array_f8_1d, np.float64]: ... + +# `return_ratios` as a keyword argument +@overload +def dpss( + M: _WindowLength, + NW: AnyReal, Kmax: None = None, sym: op.CanBool = True, norm: _Norm | None = None, + *, + return_ratios: Literal[True], ) -> tuple[_Array_f8_1d, np.float64]: ... # From 69cc2eafc20196801281ae2290c307b5830d53a0 Mon Sep 17 00:00:00 2001 From: Pavadol Yamsiri Date: Sun, 3 Nov 2024 16:24:08 +1100 Subject: [PATCH 10/12] tests: Add tests for the function `dpss` from `singal.windows`. This function has a few different overloads so it is nice to have tests for them. --- tests/signal/windows/test_windows.pyi | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 tests/signal/windows/test_windows.pyi diff --git a/tests/signal/windows/test_windows.pyi b/tests/signal/windows/test_windows.pyi new file mode 100644 index 00000000..7dbc5934 --- /dev/null +++ b/tests/signal/windows/test_windows.pyi @@ -0,0 +1,14 @@ +from typing import TypeAlias +from typing_extensions import assert_type + +import numpy as np +from scipy.signal.windows import dpss + +_Array_f8_1d: TypeAlias = np.ndarray[tuple[int], np.dtype[np.float64]] +_Array_f8_2d: TypeAlias = np.ndarray[tuple[int, int], np.dtype[np.float64]] + +# test dpss function overloads +assert_type(dpss(64, 3), _Array_f8_1d) +assert_type(dpss(64, 3, 2), _Array_f8_2d) +assert_type(dpss(64, 3, return_ratios=True), tuple[_Array_f8_1d, np.float64]) +assert_type(dpss(64, 3, 2, return_ratios=True), tuple[_Array_f8_2d, _Array_f8_1d]) From 8a3965a5b35fa6af60062e006325acd1630525cc Mon Sep 17 00:00:00 2001 From: Pavadol Yamsiri Date: Sun, 3 Nov 2024 22:05:56 +1100 Subject: [PATCH 11/12] `signal.windows`: Allow ndarrays for `a` param in `general_cosine`. In `_windows.pyi`. This is because `ndarray` is not a `Sequence`. --- scipy-stubs/signal/windows/_windows.pyi | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scipy-stubs/signal/windows/_windows.pyi b/scipy-stubs/signal/windows/_windows.pyi index 49825281..b16dc937 100644 --- a/scipy-stubs/signal/windows/_windows.pyi +++ b/scipy-stubs/signal/windows/_windows.pyi @@ -1,5 +1,5 @@ from collections.abc import Sequence -from typing import Literal, TypeAlias, overload +from typing import Any, Literal, TypeAlias, overload from typing_extensions import Unpack import numpy as np @@ -37,6 +37,12 @@ __all__ = [ _Array_f8_1d: TypeAlias = np.ndarray[tuple[int], np.dtype[np.float64]] _Array_f8_2d: TypeAlias = np.ndarray[tuple[int, int], np.dtype[np.float64]] +_Weights: TypeAlias = ( + Sequence[AnyReal] + | np.ndarray[tuple[int], np.dtype[np.floating[Any]]] + | np.ndarray[tuple[int], np.dtype[np.integer[Any]]] + | np.ndarray[tuple[int], np.dtype[np.bool_]] +) _Norm: TypeAlias = Literal[2, "approximate", "subsample"] _WindowLength: TypeAlias = int | np.int16 | np.int32 | np.int64 @@ -111,7 +117,7 @@ _WindowNeedsParams: TypeAlias = Literal[ "kbd", ] -def general_cosine(M: _WindowLength, a: Sequence[AnyReal], sym: op.CanBool = True) -> _Array_f8_1d: ... +def general_cosine(M: _WindowLength, a: _Weights, sym: op.CanBool = True) -> _Array_f8_1d: ... def boxcar(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... def triang(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... def parzen(M: _WindowLength, sym: op.CanBool = True) -> _Array_f8_1d: ... From 8cc7c34bfd111cabaf4de5a694e337d3ddd21b0e Mon Sep 17 00:00:00 2001 From: Pavadol Yamsiri Date: Sun, 3 Nov 2024 23:14:20 +1100 Subject: [PATCH 12/12] `signal.windows`: Don't used shaped arrays for input params In `_windows.pyi`. --- scipy-stubs/signal/windows/_windows.pyi | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/scipy-stubs/signal/windows/_windows.pyi b/scipy-stubs/signal/windows/_windows.pyi index b16dc937..7cd32db5 100644 --- a/scipy-stubs/signal/windows/_windows.pyi +++ b/scipy-stubs/signal/windows/_windows.pyi @@ -3,6 +3,7 @@ from typing import Any, Literal, TypeAlias, overload from typing_extensions import Unpack import numpy as np +import numpy.typing as npt import optype as op from scipy._typing import AnyInt, AnyReal @@ -37,12 +38,7 @@ __all__ = [ _Array_f8_1d: TypeAlias = np.ndarray[tuple[int], np.dtype[np.float64]] _Array_f8_2d: TypeAlias = np.ndarray[tuple[int, int], np.dtype[np.float64]] -_Weights: TypeAlias = ( - Sequence[AnyReal] - | np.ndarray[tuple[int], np.dtype[np.floating[Any]]] - | np.ndarray[tuple[int], np.dtype[np.integer[Any]]] - | np.ndarray[tuple[int], np.dtype[np.bool_]] -) +_Weights: TypeAlias = Sequence[AnyReal] | npt.NDArray[np.floating[Any]] | npt.NDArray[np.integer[Any]] | npt.NDArray[np.bool_] _Norm: TypeAlias = Literal[2, "approximate", "subsample"] _WindowLength: TypeAlias = int | np.int16 | np.int32 | np.int64