11from dataclasses import dataclass
2- from typing import Literal , Optional , Union
2+ from typing import Literal
33
44import mne
55import numpy as np
66from scipy .linalg import eigh
77from sklearn .covariance import OAS
88
99ArrayLike = np .ndarray
10- MNEObj = Union [ mne .io .BaseRaw , mne .Epochs , mne .Evoked , mne .EvokedArray ]
10+ MNEObj = mne .io .BaseRaw | mne .Epochs | mne .Evoked | mne .EvokedArray
1111
1212
1313# ============================
@@ -51,12 +51,12 @@ def _inv_sqrt_spd(Q: np.ndarray, d: np.ndarray) -> np.ndarray:
5151
5252@dataclass
5353class DenoiserBase :
54- sfreq : Optional [ float ] = None
54+ sfreq : float | None = None
5555 window_size : float = 0.5 # seconds
5656 step_frac : float = 0.5 # overlap = 1 - step_frac
5757 use_windows : bool = True # set False to process full signal
5858
59- def _ensure_sfreq (self , sfreq : Optional [ float ] ):
59+ def _ensure_sfreq (self , sfreq : float | None ):
6060 if self .sfreq is None :
6161 if sfreq is None :
6262 raise ValueError (
@@ -65,7 +65,7 @@ def _ensure_sfreq(self, sfreq: Optional[float]):
6565 self .sfreq = sfreq
6666
6767 # ---- public API on NumPy ----
68- def run (self , X : ArrayLike , sfreq : Optional [ float ] = None ) -> ArrayLike :
68+ def run (self , X : ArrayLike , sfreq : float | None = None ) -> ArrayLike :
6969 """
7070 X shape must be (n_channels, n_times).
7171 """
@@ -137,12 +137,12 @@ def _process_window(self, Xw: ArrayLike) -> ArrayLike:
137137
138138@dataclass
139139class LGSP (DenoiserBase ):
140- L : Optional [ np .ndarray ] = None # (m, n_sources)
140+ L : np .ndarray | None = None # (m, n_sources)
141141 sigma_prior : Literal ["identity" ] = "identity"
142142 lambda_ref : float = 1e-3 # ridge on C_ref
143143 alpha_model : float = 0.2 # blend with scaled I: Cref'=(1-a)Cref+a*trace(Cref)/m*I
144- rank : Optional [ int ] = None # keep r smallest generalized eigenvalues
145- tau : Optional [ float ] = None # or threshold on generalized eigenvalues
144+ rank : int | None = None # keep r smallest generalized eigenvalues
145+ tau : float | None = None # or threshold on generalized eigenvalues
146146 center : bool = True
147147 shrink_data : bool = True
148148
@@ -164,7 +164,7 @@ def _build_Cref(self, n_ch: int) -> np.ndarray:
164164 return Cref
165165
166166 def _gevd_brain_projector (
167- self , Cx : np .ndarray , Cref : np .ndarray , r : Optional [ int ] , tau : Optional [ float ]
167+ self , Cx : np .ndarray , Cref : np .ndarray , r : int | None , tau : float | None
168168 ) -> np .ndarray :
169169 """
170170 Return the sensor-space projector P onto the 'brain-like' subspace
@@ -214,7 +214,7 @@ def _process_window(self, Xw: ArrayLike) -> ArrayLike:
214214
215215@dataclass
216216class SRB (DenoiserBase ):
217- L : Optional [ np .ndarray ] = None # (m, n_sources) required for meaningful use
217+ L : np .ndarray | None = None # (m, n_sources) required for meaningful use
218218 mu : float = 1e-1 # Tikhonov on sources (||S||^2)
219219 beta : float = 0.5 # blend factor: X_clean = beta*L*W*X + (1-beta)*X
220220 center : bool = True
0 commit comments