From 04a8bf42565591654a3dc21c77d5d7868680924a Mon Sep 17 00:00:00 2001 From: mrava87 Date: Fri, 2 Jan 2026 23:07:49 +0000 Subject: [PATCH 1/9] doc: use literals in avo --- pylops/avo/avo.py | 4 ++-- pylops/avo/poststack.py | 6 +++--- pylops/avo/prestack.py | 17 +++++++++-------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/pylops/avo/avo.py b/pylops/avo/avo.py index 71eccfe9..45699bb8 100644 --- a/pylops/avo/avo.py +++ b/pylops/avo/avo.py @@ -9,7 +9,7 @@ "AVOLinearModelling", ] -from typing import List, Optional, Tuple, Union +from typing import List, Literal, Optional, Tuple, Union import numpy as np import numpy.typing as npt @@ -650,7 +650,7 @@ def __init__( vsvp: Union[float, NDArray] = 0.5, nt0: int = 1, spatdims: Optional[Union[int, Tuple[int]]] = None, - linearization: str = "akirich", + linearization: Literal["akirich", "fatti", "PS"] = "akirich", dtype: DTypeLike = "float64", name: str = "A", ) -> None: diff --git a/pylops/avo/poststack.py b/pylops/avo/poststack.py index 1b58ad60..5dcff56a 100644 --- a/pylops/avo/poststack.py +++ b/pylops/avo/poststack.py @@ -3,7 +3,7 @@ "PoststackInversion", ] -from typing import Optional, Tuple, Union +from typing import Literal, Optional, Tuple, Union import numpy as np import numpy.typing as npt @@ -141,7 +141,7 @@ def PoststackLinearModelling( spatdims: Optional[Union[int, ShapeLike]] = None, explicit: bool = False, sparse: bool = False, - kind: str = "centered", + kind: Literal["centered", "forward"] = "centered", name: Optional[str] = None, ) -> LinearOperator: r"""Post-stack linearized seismic modelling operator. @@ -173,7 +173,7 @@ def PoststackLinearModelling( Create a sparse matrix (``True``) or dense (``False``) when ``explicit=True`` kind : :obj:`str`, optional - Derivative kind (``forward`` or ``centered``). + Derivative kind (``centered`` or ``forward``). name : :obj:`str`, optional .. versionadded:: 2.0.0 diff --git a/pylops/avo/prestack.py b/pylops/avo/prestack.py index 79d0ebac..943d2c87 100644 --- a/pylops/avo/prestack.py +++ b/pylops/avo/prestack.py @@ -4,7 +4,7 @@ "PrestackInversion", ] -from typing import Optional, Tuple, Union +from typing import Callable, List, Literal, Optional, Tuple, Union import numpy as np from scipy.sparse.linalg import lsqr @@ -36,6 +36,7 @@ from pylops.utils.typing import NDArray, ShapeLike _linearizations = {"akirich": 3, "fatti": 3, "ps": 3} +LinearizationsType = Literal["akirich", "fatti", "PS"] def PrestackLinearModelling( @@ -44,9 +45,9 @@ def PrestackLinearModelling( vsvp: Union[float, NDArray] = 0.5, nt0: int = 1, spatdims: Optional[Union[int, ShapeLike]] = None, - linearization: str = "akirich", + linearization: LinearizationsType = "akirich", explicit: bool = False, - kind: str = "centered", + kind: Literal["centered", "forward"] = "centered", name: Optional[str] = None, ) -> LinearOperator: r"""Pre-stack linearized seismic modelling operator. @@ -90,7 +91,7 @@ def PrestackLinearModelling( or a ``MatrixMult`` linear operator with dense matrix (``True``, preferred for small data) kind : :obj:`str`, optional - Derivative kind (``forward`` or ``centered``). + Derivative kind (``centered`` or ``forward``). name : :obj:`str`, optional .. versionadded:: 2.0.0 @@ -228,7 +229,7 @@ def PrestackWaveletModelling( nwav: int, wavc: Optional[int] = None, vsvp: Union[float, NDArray] = 0.5, - linearization: str = "akirich", + linearization: Union[LinearizationsType, Callable] = "akirich", name: Optional[str] = None, ) -> LinearOperator: r"""Pre-stack linearized seismic modelling operator for wavelet. @@ -357,7 +358,7 @@ def PrestackInversion( theta: NDArray, wav: NDArray, m0: Optional[NDArray] = None, - linearization: str = "akirich", + linearization: Union[LinearizationsType, List[LinearizationsType]] = "akirich", explicit: bool = False, simultaneous: bool = False, epsI: Optional[float] = None, @@ -365,7 +366,7 @@ def PrestackInversion( dottest: bool = False, returnres: bool = False, epsRL1: Optional[float] = None, - kind: str = "centered", + kind: Literal["centered", "forward"] = "centered", vsvp: Union[float, NDArray] = 0.5, **kwargs_solver ) -> Union[NDArray, Tuple[NDArray, NDArray]]: @@ -421,7 +422,7 @@ def PrestackInversion( epsRL1 : :obj:`float`, optional Damping factor for additional blockiness regularization term kind : :obj:`str`, optional - Derivative kind (``forward`` or ``centered``). + Derivative kind (``centered`` or ``forward``). vsvp : :obj:`float` or :obj:`numpy.ndarray` :math:`V_S/V_P` ratio (constant or time/depth variant) **kwargs_solver From 037f92a71c71545613cd595a8440b0621474f6f0 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Sun, 11 Jan 2026 15:09:47 +0000 Subject: [PATCH 2/9] doc: started to add literals in basicoperators --- pylops/avo/avo.py | 6 ++-- pylops/avo/prestack.py | 9 +++-- pylops/basicoperators/block.py | 4 +-- pylops/basicoperators/blockdiag.py | 8 ++--- pylops/basicoperators/causalintegration.py | 4 +-- .../basicoperators/directionalderivative.py | 33 ++++++++++++++----- pylops/basicoperators/firstderivative.py | 4 +-- pylops/basicoperators/hstack.py | 4 +-- pylops/basicoperators/secondderivative.py | 4 +-- pylops/basicoperators/vstack.py | 4 +-- pylops/signalprocessing/sliding1d.py | 2 +- pylops/signalprocessing/sliding2d.py | 2 +- pylops/signalprocessing/sliding3d.py | 2 +- pylops/utils/typing.py | 8 ++++- 14 files changed, 57 insertions(+), 37 deletions(-) diff --git a/pylops/avo/avo.py b/pylops/avo/avo.py index 45699bb8..cd747b12 100644 --- a/pylops/avo/avo.py +++ b/pylops/avo/avo.py @@ -9,7 +9,7 @@ "AVOLinearModelling", ] -from typing import List, Literal, Optional, Tuple, Union +from typing import List, Optional, Tuple, Union import numpy as np import numpy.typing as npt @@ -19,7 +19,7 @@ from pylops.utils._internal import _value_or_sized_to_tuple from pylops.utils.backend import get_array_module from pylops.utils.decorators import reshaped -from pylops.utils.typing import DTypeLike, NDArray +from pylops.utils.typing import DTypeLike, NDArray, Tavolinearization def zoeppritz_scattering( @@ -650,7 +650,7 @@ def __init__( vsvp: Union[float, NDArray] = 0.5, nt0: int = 1, spatdims: Optional[Union[int, Tuple[int]]] = None, - linearization: Literal["akirich", "fatti", "PS"] = "akirich", + linearization: Tavolinearization = "akirich", dtype: DTypeLike = "float64", name: str = "A", ) -> None: diff --git a/pylops/avo/prestack.py b/pylops/avo/prestack.py index 943d2c87..d74ea6bb 100644 --- a/pylops/avo/prestack.py +++ b/pylops/avo/prestack.py @@ -33,10 +33,9 @@ inplace_set, ) from pylops.utils.signalprocessing import convmtx -from pylops.utils.typing import NDArray, ShapeLike +from pylops.utils.typing import NDArray, ShapeLike, Tavolinearization _linearizations = {"akirich": 3, "fatti": 3, "ps": 3} -LinearizationsType = Literal["akirich", "fatti", "PS"] def PrestackLinearModelling( @@ -45,7 +44,7 @@ def PrestackLinearModelling( vsvp: Union[float, NDArray] = 0.5, nt0: int = 1, spatdims: Optional[Union[int, ShapeLike]] = None, - linearization: LinearizationsType = "akirich", + linearization: Tavolinearization = "akirich", explicit: bool = False, kind: Literal["centered", "forward"] = "centered", name: Optional[str] = None, @@ -229,7 +228,7 @@ def PrestackWaveletModelling( nwav: int, wavc: Optional[int] = None, vsvp: Union[float, NDArray] = 0.5, - linearization: Union[LinearizationsType, Callable] = "akirich", + linearization: Union[Tavolinearization, Callable] = "akirich", name: Optional[str] = None, ) -> LinearOperator: r"""Pre-stack linearized seismic modelling operator for wavelet. @@ -358,7 +357,7 @@ def PrestackInversion( theta: NDArray, wav: NDArray, m0: Optional[NDArray] = None, - linearization: Union[LinearizationsType, List[LinearizationsType]] = "akirich", + linearization: Union[Tavolinearization, List[Tavolinearization]] = "akirich", explicit: bool = False, simultaneous: bool = False, epsI: Optional[float] = None, diff --git a/pylops/basicoperators/block.py b/pylops/basicoperators/block.py index e98f1cda..6b050b99 100644 --- a/pylops/basicoperators/block.py +++ b/pylops/basicoperators/block.py @@ -4,7 +4,7 @@ from pylops import LinearOperator from pylops.basicoperators import HStack, VStack -from pylops.utils.typing import DTypeLike, NDArray +from pylops.utils.typing import DTypeLike, NDArray, Tparallel_kind class _Block(LinearOperator): @@ -154,7 +154,7 @@ def __init__( ops: Iterable[Iterable[LinearOperator]], nproc: int = 1, forceflat: bool = None, - parallel_kind: str = "multiproc", + parallel_kind: Tparallel_kind = "multiproc", dtype: Optional[DTypeLike] = None, ): super().__init__( diff --git a/pylops/basicoperators/blockdiag.py b/pylops/basicoperators/blockdiag.py index f6833864..3ceaacd5 100644 --- a/pylops/basicoperators/blockdiag.py +++ b/pylops/basicoperators/blockdiag.py @@ -23,7 +23,7 @@ from pylops import LinearOperator from pylops.basicoperators import MatrixMult from pylops.utils.backend import get_array_module, get_module, inplace_set -from pylops.utils.typing import DTypeLike, NDArray +from pylops.utils.typing import DTypeLike, NDArray, Tinoutengine, Tparallel_kind def _matvec_rmatvec_map(op, x: NDArray) -> NDArray: @@ -142,9 +142,9 @@ def __init__( self, ops: Sequence[LinearOperator], nproc: int = 1, - forceflat: bool = None, - inoutengine: Optional[tuple] = None, - parallel_kind: str = "multiproc", + forceflat: Optional[bool] = None, + inoutengine: Optional[Tinoutengine] = None, + parallel_kind: Tparallel_kind = "multiproc", dtype: Optional[DTypeLike] = None, ) -> None: if parallel_kind not in ["multiproc", "multithread"]: diff --git a/pylops/basicoperators/causalintegration.py b/pylops/basicoperators/causalintegration.py index 7d028993..ef2a9cec 100644 --- a/pylops/basicoperators/causalintegration.py +++ b/pylops/basicoperators/causalintegration.py @@ -1,6 +1,6 @@ __all__ = ["CausalIntegration"] -from typing import Union +from typing import Literal, Union import numpy as np @@ -101,7 +101,7 @@ def __init__( dims: Union[int, InputDimsLike], axis: int = -1, sampling: float = 1, - kind: str = "full", + kind: Literal["full", "half", "trapezoidal"] = "full", removefirst: bool = False, dtype: DTypeLike = "float64", name: str = "C", diff --git a/pylops/basicoperators/directionalderivative.py b/pylops/basicoperators/directionalderivative.py index bf397ba6..c26dc7b9 100644 --- a/pylops/basicoperators/directionalderivative.py +++ b/pylops/basicoperators/directionalderivative.py @@ -5,7 +5,7 @@ from pylops import LinearOperator from pylops.basicoperators import Diagonal, Gradient, Sum -from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray +from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray, Tderivkind class FirstDirectionalDerivative(LinearOperator): @@ -79,7 +79,7 @@ def __init__( v: NDArray, sampling: int = 1, edge: bool = False, - kind: str = "centered", + kind: Tderivkind = "centered", dtype: DTypeLike = "float64", name: str = "F", ): @@ -88,7 +88,12 @@ def __init__( self.kind = kind self.v = v Op = self._calc_first_ddop( - dims=dims, sampling=sampling, edge=edge, kind=kind, dtype=dtype, v=v + dims=dims, + v=v, + sampling=sampling, + edge=edge, + kind=kind, + dtype=dtype, ) super().__init__(Op=Op, name=name) @@ -104,7 +109,7 @@ def _calc_first_ddop( v: NDArray, sampling: int, edge: bool, - kind: str, + kind: Tderivkind, dtype: DTypeLike, ): Gop = Gradient(dims, sampling=sampling, edge=edge, kind=kind, dtype=dtype) @@ -138,6 +143,10 @@ class SecondDirectionalDerivative(LinearOperator): edge : :obj:`bool`, optional Use reduced order derivative at edges (``True``) or ignore them (``False``). + kind : :obj:`str`, optional + .. versionadded:: 2.7.0 + + Derivative kind (``forward``, ``centered``, or ``backward``). dtype : :obj:`str`, optional Type of elements in input array. @@ -177,15 +186,16 @@ def __init__( v: NDArray, sampling: int = 1, edge: bool = False, + kind: Tderivkind = "centered", dtype: DTypeLike = "float64", name: str = "S", ): - self.dims = dims - self.v = v self.sampling = sampling self.edge = edge + self.kind = kind + self.v = v Op = self._calc_second_ddop( - dims=dims, v=v, sampling=sampling, edge=edge, dtype=dtype + dims=dims, v=v, sampling=sampling, edge=edge, kind=kind, dtype=dtype ) super().__init__(Op=Op, name=name) @@ -197,10 +207,15 @@ def _rmatvec(self, x: NDArray) -> NDArray: @staticmethod def _calc_second_ddop( - dims: InputDimsLike, v: NDArray, sampling: int, edge: bool, dtype: DTypeLike + dims: InputDimsLike, + v: NDArray, + sampling: int, + edge: bool, + kind: Tderivkind, + dtype: DTypeLike, ): Dop = FirstDirectionalDerivative( - dims=dims, v=v, sampling=sampling, edge=edge, dtype=dtype + dims=dims, v=v, sampling=sampling, edge=edge, kind=kind, dtype=dtype ) ddop = -Dop.H * Dop return ddop diff --git a/pylops/basicoperators/firstderivative.py b/pylops/basicoperators/firstderivative.py index 988b5304..0cc4bde2 100644 --- a/pylops/basicoperators/firstderivative.py +++ b/pylops/basicoperators/firstderivative.py @@ -13,7 +13,7 @@ inplace_set, ) from pylops.utils.decorators import reshaped -from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray +from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray, Tderivkind class FirstDerivative(LinearOperator): @@ -94,7 +94,7 @@ def __init__( dims: Union[int, InputDimsLike], axis: int = -1, sampling: float = 1.0, - kind: str = "centered", + kind: Tderivkind = "centered", edge: bool = False, order: int = 3, dtype: DTypeLike = "float64", diff --git a/pylops/basicoperators/hstack.py b/pylops/basicoperators/hstack.py index bf94a02a..633236c7 100644 --- a/pylops/basicoperators/hstack.py +++ b/pylops/basicoperators/hstack.py @@ -24,7 +24,7 @@ from pylops import LinearOperator from pylops.basicoperators import MatrixMult, Zero from pylops.utils.backend import get_array_module, get_module, inplace_add, inplace_set -from pylops.utils.typing import NDArray +from pylops.utils.typing import NDArray, Tinoutengine def _matvec_rmatvec_map(op, x: NDArray) -> NDArray: @@ -153,7 +153,7 @@ def __init__( ops: Sequence[LinearOperator], nproc: int = 1, forceflat: bool = None, - inoutengine: Optional[tuple] = None, + inoutengine: Optional[Tinoutengine] = None, parallel_kind: str = "multiproc", dtype: Optional[str] = None, ) -> None: diff --git a/pylops/basicoperators/secondderivative.py b/pylops/basicoperators/secondderivative.py index b1b6b0b1..475bc8e0 100644 --- a/pylops/basicoperators/secondderivative.py +++ b/pylops/basicoperators/secondderivative.py @@ -13,7 +13,7 @@ inplace_set, ) from pylops.utils.decorators import reshaped -from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray +from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray, Tderivkind class SecondDerivative(LinearOperator): @@ -86,7 +86,7 @@ def __init__( dims: Union[int, InputDimsLike], axis: int = -1, sampling: float = 1.0, - kind: str = "centered", + kind: Tderivkind = "centered", edge: bool = False, dtype: DTypeLike = "float64", name: str = "S", diff --git a/pylops/basicoperators/vstack.py b/pylops/basicoperators/vstack.py index c1dcb7bb..85b7b5b1 100644 --- a/pylops/basicoperators/vstack.py +++ b/pylops/basicoperators/vstack.py @@ -24,7 +24,7 @@ from pylops import LinearOperator from pylops.basicoperators import MatrixMult, Zero from pylops.utils.backend import get_array_module, get_module, inplace_add, inplace_set -from pylops.utils.typing import DTypeLike, NDArray +from pylops.utils.typing import DTypeLike, NDArray, Tinoutengine def _matvec_rmatvec_map(op: Callable, x: NDArray) -> NDArray: @@ -152,7 +152,7 @@ def __init__( ops: Sequence[LinearOperator], nproc: int = 1, forceflat: bool = None, - inoutengine: Optional[tuple] = None, + inoutengine: Optional[Tinoutengine] = None, parallel_kind: str = "multiproc", dtype: Optional[DTypeLike] = None, ) -> None: diff --git a/pylops/signalprocessing/sliding1d.py b/pylops/signalprocessing/sliding1d.py index c2af1b1e..4bd16046 100644 --- a/pylops/signalprocessing/sliding1d.py +++ b/pylops/signalprocessing/sliding1d.py @@ -143,7 +143,7 @@ class Sliding1D(LinearOperator): Attributes ---------- - taps: :obj:`numpy.ndarray` + taps : :obj:`numpy.ndarray` Set of tapers applied to each window (only if ``tapertype`` is not ``None``) simOp : :obj:`bool` Operator ``Op`` is applied to all windows simultaneously (``True``) diff --git a/pylops/signalprocessing/sliding2d.py b/pylops/signalprocessing/sliding2d.py index bbf9f086..fb3245d8 100644 --- a/pylops/signalprocessing/sliding2d.py +++ b/pylops/signalprocessing/sliding2d.py @@ -179,7 +179,7 @@ class Sliding2D(LinearOperator): Attributes ---------- - taps: :obj:`numpy.ndarray` + taps : :obj:`numpy.ndarray` Set of tapers applied to each window (only if ``tapertype`` is not ``None``) simOp : :obj:`bool` Operator ``Op`` is applied to all windows simultaneously (``True``) diff --git a/pylops/signalprocessing/sliding3d.py b/pylops/signalprocessing/sliding3d.py index 0d5f3425..e97bd942 100644 --- a/pylops/signalprocessing/sliding3d.py +++ b/pylops/signalprocessing/sliding3d.py @@ -168,7 +168,7 @@ class Sliding3D(LinearOperator): Attributes ---------- - taps: :obj:`numpy.ndarray` + taps : :obj:`numpy.ndarray` Set of tapers applied to each window (only if ``tapertype`` is not ``None``) simOp : :obj:`bool` Operator ``Op`` is applied to all windows simultaneously (``True``) diff --git a/pylops/utils/typing.py b/pylops/utils/typing.py index c0d193b1..20ca15d2 100644 --- a/pylops/utils/typing.py +++ b/pylops/utils/typing.py @@ -9,7 +9,7 @@ "TensorTypeLike", ] -from typing import Sequence, Tuple, Union +from typing import Literal, Sequence, Tuple, Union import numpy as np import numpy.typing as npt @@ -32,3 +32,9 @@ TensorTypeLike = torch.Tensor else: TensorTypeLike = None + +Tavolinearization = Literal["akirich", "fatti", "PS"] +Tderivkind = Literal["forward", "centered", "backward"] +Tengine = Literal["numpy", "cupy", "jax"] +Tinoutengine = Tuple[Tengine, Tengine] +Tparallel_kind = Literal["multiproc", "multithread"] From 70ce55e5b0a26b8f39ac17871285fe21e81e0c51 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Sun, 11 Jan 2026 19:34:06 +0000 Subject: [PATCH 3/9] doc: add literal to gradient --- pylops/basicoperators/gradient.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pylops/basicoperators/gradient.py b/pylops/basicoperators/gradient.py index c6d4e9a0..fcc25bfe 100644 --- a/pylops/basicoperators/gradient.py +++ b/pylops/basicoperators/gradient.py @@ -5,7 +5,7 @@ from pylops import LinearOperator from pylops.basicoperators import FirstDerivative, VStack from pylops.utils._internal import _value_or_sized_to_tuple -from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray +from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray, Tderivkind class Gradient(LinearOperator): @@ -81,7 +81,7 @@ def __init__( dims: Union[int, InputDimsLike], sampling: int = 1, edge: bool = False, - kind: str = "centered", + kind: Tderivkind = "centered", dtype: DTypeLike = "float64", name: str = "G", ): From 04b971a7ed6fedf8425401c1ac367787763d92ae Mon Sep 17 00:00:00 2001 From: mrava87 Date: Sun, 11 Jan 2026 21:47:18 +0000 Subject: [PATCH 4/9] doc: literal on hstack/vstack --- pylops/basicoperators/hstack.py | 4 ++-- pylops/basicoperators/laplacian.py | 4 ++-- pylops/basicoperators/vstack.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pylops/basicoperators/hstack.py b/pylops/basicoperators/hstack.py index 633236c7..e9e8e4dc 100644 --- a/pylops/basicoperators/hstack.py +++ b/pylops/basicoperators/hstack.py @@ -24,7 +24,7 @@ from pylops import LinearOperator from pylops.basicoperators import MatrixMult, Zero from pylops.utils.backend import get_array_module, get_module, inplace_add, inplace_set -from pylops.utils.typing import NDArray, Tinoutengine +from pylops.utils.typing import NDArray, Tinoutengine, Tparallel_kind def _matvec_rmatvec_map(op, x: NDArray) -> NDArray: @@ -154,7 +154,7 @@ def __init__( nproc: int = 1, forceflat: bool = None, inoutengine: Optional[Tinoutengine] = None, - parallel_kind: str = "multiproc", + parallel_kind: Tparallel_kind = "multiproc", dtype: Optional[str] = None, ) -> None: if parallel_kind not in ["multiproc", "multithread"]: diff --git a/pylops/basicoperators/laplacian.py b/pylops/basicoperators/laplacian.py index 3922f3c5..d2ec67bf 100644 --- a/pylops/basicoperators/laplacian.py +++ b/pylops/basicoperators/laplacian.py @@ -6,7 +6,7 @@ from pylops import LinearOperator from pylops.basicoperators import SecondDerivative from pylops.utils.backend import get_normalize_axis_index -from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray +from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray, Tderivkind class Laplacian(LinearOperator): @@ -80,7 +80,7 @@ def __init__( weights: Tuple[float, ...] = (1, 1), sampling: Tuple[float, ...] = (1, 1), edge: bool = False, - kind: str = "centered", + kind: Tderivkind = "centered", dtype: DTypeLike = "float64", name: str = "L", ): diff --git a/pylops/basicoperators/vstack.py b/pylops/basicoperators/vstack.py index 85b7b5b1..9f7263b7 100644 --- a/pylops/basicoperators/vstack.py +++ b/pylops/basicoperators/vstack.py @@ -24,7 +24,7 @@ from pylops import LinearOperator from pylops.basicoperators import MatrixMult, Zero from pylops.utils.backend import get_array_module, get_module, inplace_add, inplace_set -from pylops.utils.typing import DTypeLike, NDArray, Tinoutengine +from pylops.utils.typing import DTypeLike, NDArray, Tinoutengine, Tparallel_kind def _matvec_rmatvec_map(op: Callable, x: NDArray) -> NDArray: @@ -153,7 +153,7 @@ def __init__( nproc: int = 1, forceflat: bool = None, inoutengine: Optional[Tinoutengine] = None, - parallel_kind: str = "multiproc", + parallel_kind: Tparallel_kind = "multiproc", dtype: Optional[DTypeLike] = None, ) -> None: if parallel_kind not in ["multiproc", "multithread"]: From ea5f0a2f4b8464f23260d285af41e407dc9ee717 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Sun, 11 Jan 2026 21:52:16 +0000 Subject: [PATCH 5/9] doc: switch npt to types in typing utils --- pylops/avo/avo.py | 20 ++++---- pylops/avo/poststack.py | 4 +- pylops/basicoperators/linearregression.py | 8 +--- pylops/basicoperators/regression.py | 5 +- pylops/signalprocessing/bilinear.py | 2 +- pylops/signalprocessing/convolve1d.py | 3 +- pylops/signalprocessing/fft.py | 5 +- pylops/signalprocessing/fftnd.py | 6 +-- pylops/utils/_internal.py | 5 +- pylops/utils/estimators.py | 8 ++-- pylops/utils/metrics.py | 13 +++--- pylops/utils/seismicevents.py | 57 ++++++++++++----------- 12 files changed, 65 insertions(+), 71 deletions(-) diff --git a/pylops/avo/avo.py b/pylops/avo/avo.py index cd747b12..e443d2f4 100644 --- a/pylops/avo/avo.py +++ b/pylops/avo/avo.py @@ -29,7 +29,7 @@ def zoeppritz_scattering( vp0: float, vs0: float, rho0: float, - theta1: Union[float, npt.ArrayLike], + theta1: Union[float, NDArray], ) -> NDArray: r"""Zoeppritz solution. @@ -250,12 +250,12 @@ def zoeppritz_pp( def approx_zoeppritz_pp( - vp1: Union[List, Tuple, npt.ArrayLike], - vs1: Union[List, Tuple, npt.ArrayLike], - rho1: Union[List, Tuple, npt.ArrayLike], - vp0: Union[List, Tuple, npt.ArrayLike], - vs0: Union[List, Tuple, npt.ArrayLike], - rho0: Union[List, Tuple, npt.ArrayLike], + vp1: Union[List, Tuple, NDArray], + vs1: Union[List, Tuple, NDArray], + rho1: Union[List, Tuple, NDArray], + vp0: Union[List, Tuple, NDArray], + vs0: Union[List, Tuple, NDArray], + rho0: Union[List, Tuple, NDArray], theta1: Union[float, NDArray], ) -> NDArray: """PP reflection coefficient from the approximate Zoeppritz equation. @@ -335,7 +335,7 @@ def approx_zoeppritz_pp( def akirichards( - theta: npt.ArrayLike, + theta: NDArray, vsvp: Union[float, NDArray], n: int = 1, ) -> Tuple[NDArray, NDArray, NDArray]: @@ -409,7 +409,7 @@ def akirichards( def fatti( - theta: npt.ArrayLike, + theta: NDArray, vsvp: Union[float, NDArray], n: int = 1, ) -> Tuple[NDArray, NDArray, NDArray]: @@ -485,7 +485,7 @@ def fatti( def ps( - theta: npt.ArrayLike, + theta: NDArray, vsvp: Union[float, NDArray], n: int = 1, ) -> Tuple[NDArray, NDArray, NDArray]: diff --git a/pylops/avo/poststack.py b/pylops/avo/poststack.py index 5dcff56a..20a108d1 100644 --- a/pylops/avo/poststack.py +++ b/pylops/avo/poststack.py @@ -136,7 +136,7 @@ def _PoststackLinearModelling( def PoststackLinearModelling( - wav: npt.ArrayLike, + wav: NDArray, nt0: int, spatdims: Optional[Union[int, ShapeLike]] = None, explicit: bool = False, @@ -224,7 +224,7 @@ def PoststackLinearModelling( def PoststackInversion( data: NDArray, - wav: npt.ArrayLike, + wav: NDArray, m0: Optional[NDArray] = None, explicit: bool = False, simultaneous: bool = False, diff --git a/pylops/basicoperators/linearregression.py b/pylops/basicoperators/linearregression.py index b367aee7..278da381 100644 --- a/pylops/basicoperators/linearregression.py +++ b/pylops/basicoperators/linearregression.py @@ -1,9 +1,7 @@ __all__ = ["LinearRegression"] -import numpy.typing as npt - from pylops.basicoperators import Regression -from pylops.utils.typing import DTypeLike +from pylops.utils.typing import DTypeLike, NDArray class LinearRegression(Regression): @@ -70,7 +68,5 @@ class LinearRegression(Regression): ``order=1``. """ - def __init__( - self, taxis: npt.ArrayLike, dtype: DTypeLike = "float64", name: str = "L" - ): + def __init__(self, taxis: NDArray, dtype: DTypeLike = "float64", name: str = "L"): super().__init__(taxis=taxis, order=1, dtype=dtype, name=name) diff --git a/pylops/basicoperators/regression.py b/pylops/basicoperators/regression.py index 5af83743..3a114a89 100644 --- a/pylops/basicoperators/regression.py +++ b/pylops/basicoperators/regression.py @@ -1,7 +1,6 @@ __all__ = ["Regression"] import numpy as np -import numpy.typing as npt from pylops import LinearOperator from pylops.utils.backend import get_array_module @@ -78,7 +77,7 @@ class Regression(LinearOperator): def __init__( self, - taxis: npt.ArrayLike, + taxis: NDArray, order: int, dtype: DTypeLike = "float64", name: str = "R", @@ -104,7 +103,7 @@ def _rmatvec(self, x: NDArray) -> NDArray: return ncp.vstack([ncp.dot(self.taxis**i, x) for i in range(self.order + 1)]) - def apply(self, t: npt.ArrayLike, x: NDArray) -> NDArray: + def apply(self, t: NDArray, x: NDArray) -> NDArray: """Return values along y-axis given certain ``t`` location(s) along t-axis and regression coefficients ``x`` diff --git a/pylops/signalprocessing/bilinear.py b/pylops/signalprocessing/bilinear.py index 41208376..c003206b 100644 --- a/pylops/signalprocessing/bilinear.py +++ b/pylops/signalprocessing/bilinear.py @@ -13,7 +13,7 @@ logger = logging.getLogger(__name__) -def _checkunique(iava: npt.ArrayLike) -> None: +def _checkunique(iava: NDArray) -> None: """Check that vector as only unique values""" _, count = np.unique(iava, axis=1, return_counts=True) if np.any(count > 1): diff --git a/pylops/signalprocessing/convolve1d.py b/pylops/signalprocessing/convolve1d.py index 4346fc12..585b2b07 100644 --- a/pylops/signalprocessing/convolve1d.py +++ b/pylops/signalprocessing/convolve1d.py @@ -4,7 +4,6 @@ from typing import Callable, Tuple, Union import numpy as np -import numpy.typing as npt from pylops import LinearOperator from pylops.utils._internal import _value_or_sized_to_tuple @@ -20,7 +19,7 @@ def _choose_convfunc( - x: npt.ArrayLike, + x: NDArray, method: Union[None, str], dims: Union[int, InputDimsLike], axis: int = -1, diff --git a/pylops/signalprocessing/fft.py b/pylops/signalprocessing/fft.py index 42c36228..bfdabe7c 100644 --- a/pylops/signalprocessing/fft.py +++ b/pylops/signalprocessing/fft.py @@ -5,7 +5,6 @@ from typing import Optional, Union import numpy as np -import numpy.typing as npt import scipy.fft from pylops import LinearOperator @@ -134,7 +133,7 @@ def _rmatvec(self, x: NDArray) -> NDArray: y = y.astype(self.rdtype) return y - def __truediv__(self, y: npt.ArrayLike) -> npt.ArrayLike: + def __truediv__(self, y: NDArray) -> NDArray: if self.norm is not _FFTNorms.ORTHO: return self._rmatvec(y) / self._scale return self._rmatvec(y) @@ -393,7 +392,7 @@ def _rmatvec(self, x: NDArray) -> NDArray: y = np.real(y) return y - def __truediv__(self, y: npt.ArrayLike) -> npt.ArrayLike: + def __truediv__(self, y: NDArray) -> NDArray: if self.norm is _FFTNorms.ORTHO: return self._rmatvec(y) return self._rmatvec(y) / self._scale diff --git a/pylops/signalprocessing/fftnd.py b/pylops/signalprocessing/fftnd.py index 9707dfc6..1e1c60c6 100644 --- a/pylops/signalprocessing/fftnd.py +++ b/pylops/signalprocessing/fftnd.py @@ -120,7 +120,7 @@ def _rmatvec(self, x: NDArray) -> NDArray: y = ncp.fft.fftshift(y, axes=self.axes[self.ifftshift_before]) return y - def __truediv__(self, y: npt.ArrayLike) -> npt.ArrayLike: + def __truediv__(self, y: NDArray) -> NDArray: if self.norm is not _FFTNorms.ORTHO: return self._rmatvec(y) / self._scale return self._rmatvec(y) @@ -218,7 +218,7 @@ def _rmatvec(self, x: NDArray) -> NDArray: y = sp_fft.fftshift(y, axes=self.axes[self.ifftshift_before]) return y - def __truediv__(self, y: npt.ArrayLike) -> npt.ArrayLike: + def __truediv__(self, y: NDArray) -> NDArray: if self.norm is not _FFTNorms.ORTHO: return self._rmatvec(y) / self._scale return self._rmatvec(y) @@ -318,7 +318,7 @@ def _rmatvec(self, x: NDArray) -> NDArray: y = scipy.fft.fftshift(y, axes=self.axes[self.ifftshift_before]) return y - def __truediv__(self, y: npt.ArrayLike) -> npt.ArrayLike: + def __truediv__(self, y: NDArray) -> NDArray: if self.norm is not _FFTNorms.ORTHO: return self._rmatvec(y) / self._scale return self._rmatvec(y) diff --git a/pylops/utils/_internal.py b/pylops/utils/_internal.py index e6f250fe..cf8d2023 100644 --- a/pylops/utils/_internal.py +++ b/pylops/utils/_internal.py @@ -1,9 +1,8 @@ from typing import Sized, Tuple import numpy as np -import numpy.typing as npt -from pylops.utils.typing import DTypeLike, NDArray +from pylops.utils.typing import ArrayLike, DTypeLike, NDArray def _value_or_sized_to_array(value_or_sized, repeat: int = 1) -> NDArray: @@ -52,7 +51,7 @@ def _value_or_sized_to_tuple(value_or_sized, repeat: int = 1) -> Tuple: return tuple(_value_or_sized_to_array(value_or_sized, repeat=repeat)) -def _raise_on_wrong_dtype(arr: npt.ArrayLike, dtype: DTypeLike, name: str) -> None: +def _raise_on_wrong_dtype(arr: ArrayLike, dtype: DTypeLike, name: str) -> None: """Raises an error if dtype of `arr` is not a subdtype of `dtype`. Parameters diff --git a/pylops/utils/estimators.py b/pylops/utils/estimators.py index 5e73f686..c808e56c 100644 --- a/pylops/utils/estimators.py +++ b/pylops/utils/estimators.py @@ -9,20 +9,20 @@ from typing import Optional, Tuple import numpy -import numpy.typing as npt from pylops.utils.backend import get_module +from pylops.utils.typing import NDArray def _sampler_gaussian( m: float, batch_size: int, backend_module: ModuleType = numpy -) -> Tuple[float, npt.ArrayLike]: +) -> Tuple[float, NDArray]: return backend_module.random.randn(m, batch_size) def _sampler_rayleigh( m: float, batch_size: int, backend_module: ModuleType = numpy -) -> npt.ArrayLike: +) -> NDArray: z = backend_module.random.randn(m, batch_size) for i in range(batch_size): z[:, i] *= m / backend_module.dot(z[:, i].T, z[:, i]) @@ -31,7 +31,7 @@ def _sampler_rayleigh( def _sampler_rademacher( m: float, batch_size: int, backend_module: ModuleType = numpy -) -> npt.ArrayLike: +) -> NDArray: return 2 * backend_module.random.binomial(1, 0.5, size=(m, batch_size)) - 1 diff --git a/pylops/utils/metrics.py b/pylops/utils/metrics.py index 6393dec2..31ab5f87 100644 --- a/pylops/utils/metrics.py +++ b/pylops/utils/metrics.py @@ -8,10 +8,11 @@ from typing import Optional import numpy as np -import numpy.typing as npt +from pylops.utils.typing import ArrayLike -def mae(xref: npt.ArrayLike, xcmp: npt.ArrayLike) -> float: + +def mae(xref: ArrayLike, xcmp: ArrayLike) -> float: """Mean Absolute Error (MAE) Compute Mean Absolute Error between two vectors @@ -33,7 +34,7 @@ def mae(xref: npt.ArrayLike, xcmp: npt.ArrayLike) -> float: return mae -def mse(xref: npt.ArrayLike, xcmp: npt.ArrayLike) -> float: +def mse(xref: ArrayLike, xcmp: ArrayLike) -> float: """Mean Square Error (MSE) Compute Mean Square Error between two vectors @@ -55,7 +56,7 @@ def mse(xref: npt.ArrayLike, xcmp: npt.ArrayLike) -> float: return mse -def snr(xref: npt.ArrayLike, xcmp: npt.ArrayLike) -> float: +def snr(xref: ArrayLike, xcmp: ArrayLike) -> float: """Signal to Noise Ratio (SNR) Compute Signal to Noise Ratio between two vectors @@ -79,8 +80,8 @@ def snr(xref: npt.ArrayLike, xcmp: npt.ArrayLike) -> float: def psnr( - xref: npt.ArrayLike, - xcmp: npt.ArrayLike, + xref: ArrayLike, + xcmp: ArrayLike, xmax: Optional[float] = None, xmin: Optional[float] = 0.0, ) -> float: diff --git a/pylops/utils/seismicevents.py b/pylops/utils/seismicevents.py index b061734e..bf4ec66f 100755 --- a/pylops/utils/seismicevents.py +++ b/pylops/utils/seismicevents.py @@ -15,10 +15,11 @@ import scipy.signal as filt from pylops.utils._internal import _value_or_sized_to_array +from pylops.utils.typing import NDArray def _filterdata( - d: npt.NDArray, nt: int, wav: npt.ArrayLike, wcenter: int + d: NDArray, nt: int, wav: npt.ArrayLike, wcenter: int ) -> Tuple[npt.ArrayLike, npt.ArrayLike]: r"""Apply filtering to data with wavelet wav""" dwav = filt.lfilter(wav, 1, d, axis=-1) @@ -27,7 +28,7 @@ def _filterdata( return d, dwav -def makeaxis(par: Dict) -> Tuple[npt.NDArray, npt.NDArray, npt.NDArray, npt.NDArray]: +def makeaxis(par: Dict) -> Tuple[NDArray, NDArray, NDArray, NDArray]: r"""Create axes t, x, and y axes Create space and time axes from dictionary containing initial values ``ot``, ``ox``, ``oy``, @@ -70,14 +71,14 @@ def makeaxis(par: Dict) -> Tuple[npt.NDArray, npt.NDArray, npt.NDArray, npt.NDAr def linear2d( - x: npt.NDArray, - t: npt.NDArray, + x: NDArray, + t: NDArray, v: float, t0: Union[float, Tuple[float]], theta: Union[float, Tuple[float]], amp: Union[float, Tuple[float]], - wav: npt.NDArray, -) -> Tuple[npt.NDArray, npt.NDArray]: + wav: NDArray, +) -> Tuple[NDArray, NDArray]: r"""Linear 2D events Create 2d linear events given propagation velocity, intercept time, angle, @@ -149,14 +150,14 @@ def linear2d( def parabolic2d( - x: npt.NDArray, - t: npt.NDArray, + x: NDArray, + t: NDArray, t0: Union[float, Tuple[float]], px: Union[float, Tuple[float]], pxx: Union[float, Tuple[float]], amp: Union[float, Tuple[float]], - wav: npt.NDArray, -) -> Tuple[npt.NDArray, npt.NDArray]: + wav: NDArray, +) -> Tuple[NDArray, NDArray]: r"""Parabolic 2D events Create 2d parabolic events given intercept time, @@ -226,13 +227,13 @@ def parabolic2d( def hyperbolic2d( - x: npt.NDArray, - t: npt.NDArray, + x: NDArray, + t: NDArray, t0: Union[float, Tuple[float]], vrms: Union[float, Tuple[float]], amp: Union[float, Tuple[float]], - wav: npt.NDArray, -) -> Tuple[npt.NDArray, npt.NDArray]: + wav: NDArray, +) -> Tuple[NDArray, NDArray]: r"""Hyperbolic 2D events Create 2d hyperbolic events given intercept time, root-mean-square @@ -297,16 +298,16 @@ def hyperbolic2d( def linear3d( - x: npt.NDArray, - y: npt.NDArray, - t: npt.NDArray, + x: NDArray, + y: NDArray, + t: NDArray, v: Union[float, Tuple[float]], t0: Union[float, Tuple[float]], theta: Union[float, Tuple[float]], phi: Union[float, Tuple[float]], amp: Union[float, Tuple[float]], - wav: npt.NDArray, -) -> Tuple[npt.NDArray, npt.NDArray]: + wav: NDArray, +) -> Tuple[NDArray, NDArray]: r"""Linear 3D events Create 3d linear events given propagation velocity, intercept time, angles, @@ -387,17 +388,17 @@ def linear3d( def parabolic3d( - x: npt.NDArray, - y: npt.NDArray, - t: npt.NDArray, + x: NDArray, + y: NDArray, + t: NDArray, t0: Union[float, Tuple[float]], px: Union[float, Tuple[float]], py: Union[float, Tuple[float]], pxx: Union[float, Tuple[float]], pyy: Union[float, Tuple[float]], amp: Union[float, Tuple[float]], - wav: npt.NDArray, -) -> Tuple[npt.NDArray, npt.NDArray]: + wav: NDArray, +) -> Tuple[NDArray, NDArray]: r"""Parabolic 3D events Create 3d parabolic events given intercept time, @@ -481,14 +482,14 @@ def parabolic3d( def hyperbolic3d( - x: npt.NDArray, - y: npt.NDArray, - t: npt.NDArray, + x: NDArray, + y: NDArray, + t: NDArray, t0: Union[float, Tuple[float]], vrms_x: Union[float, Tuple[float]], vrms_y: Union[float, Tuple[float]], amp: Union[float, Tuple[float]], - wav: npt.NDArray, + wav: NDArray, ): r"""Hyperbolic 3D events From 04e91d4ce8fd5a175997748b5e4917c139fee764 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Sun, 11 Jan 2026 21:57:55 +0000 Subject: [PATCH 6/9] minor: remove unused imports of npt --- pylops/avo/avo.py | 1 - pylops/avo/poststack.py | 1 - pylops/signalprocessing/bilinear.py | 1 - pylops/signalprocessing/fftnd.py | 1 - 4 files changed, 4 deletions(-) diff --git a/pylops/avo/avo.py b/pylops/avo/avo.py index e443d2f4..a3e0e105 100644 --- a/pylops/avo/avo.py +++ b/pylops/avo/avo.py @@ -12,7 +12,6 @@ from typing import List, Optional, Tuple, Union import numpy as np -import numpy.typing as npt from numpy import cos, sin, tan from pylops import LinearOperator diff --git a/pylops/avo/poststack.py b/pylops/avo/poststack.py index 20a108d1..d08bb237 100644 --- a/pylops/avo/poststack.py +++ b/pylops/avo/poststack.py @@ -6,7 +6,6 @@ from typing import Literal, Optional, Tuple, Union import numpy as np -import numpy.typing as npt from scipy.sparse.linalg import lsqr from pylops import ( diff --git a/pylops/signalprocessing/bilinear.py b/pylops/signalprocessing/bilinear.py index c003206b..5f1c7e26 100644 --- a/pylops/signalprocessing/bilinear.py +++ b/pylops/signalprocessing/bilinear.py @@ -3,7 +3,6 @@ import logging import numpy as np -import numpy.typing as npt from pylops import LinearOperator from pylops.utils.backend import get_add_at, get_array_module, to_numpy diff --git a/pylops/signalprocessing/fftnd.py b/pylops/signalprocessing/fftnd.py index 1e1c60c6..4cc7e365 100644 --- a/pylops/signalprocessing/fftnd.py +++ b/pylops/signalprocessing/fftnd.py @@ -4,7 +4,6 @@ from typing import Optional, Sequence, Union import numpy as np -import numpy.typing as npt import scipy.fft from pylops import LinearOperator From 415dc1c3a63e70ebd3059fa1dd8068a54bfbd172 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Sun, 11 Jan 2026 22:00:43 +0000 Subject: [PATCH 7/9] doc: homogenize type hints to __truediv__ --- pylops/signalprocessing/fft.py | 4 ++-- pylops/signalprocessing/fft2d.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pylops/signalprocessing/fft.py b/pylops/signalprocessing/fft.py index bfdabe7c..2b8c9867 100644 --- a/pylops/signalprocessing/fft.py +++ b/pylops/signalprocessing/fft.py @@ -231,7 +231,7 @@ def _rmatvec(self, x: NDArray) -> NDArray: y = scipy.fft.fftshift(y, axes=self.axis) return y - def __truediv__(self, y): + def __truediv__(self, y: NDArray) -> NDArray: if self.norm is not _FFTNorms.ORTHO: return self._rmatvec(y) / self._scale return self._rmatvec(y) @@ -484,7 +484,7 @@ def _rmatvec(self, x: NDArray) -> NDArray: y = scipy.fft.fftshift(y, axes=self.axis) return y - def __truediv__(self, y): + def __truediv__(self, y: NDArray) -> NDArray: if self.norm is not _FFTNorms.ORTHO: return self._rmatvec(y) / self._scale return self._rmatvec(y) diff --git a/pylops/signalprocessing/fft2d.py b/pylops/signalprocessing/fft2d.py index cf5cc2b4..a4733e7c 100644 --- a/pylops/signalprocessing/fft2d.py +++ b/pylops/signalprocessing/fft2d.py @@ -131,7 +131,7 @@ def _rmatvec(self, x): y = ncp.fft.fftshift(y, axes=self.axes[self.ifftshift_before]) return y - def __truediv__(self, y): + def __truediv__(self, y: NDArray) -> NDArray: if self.norm is not _FFTNorms.ORTHO: return self._rmatvec(y) / self._scale return self._rmatvec(y) @@ -236,7 +236,7 @@ def _rmatvec(self, x): y = scipy.fft.fftshift(y, axes=self.axes[self.ifftshift_before]) return y - def __truediv__(self, y): + def __truediv__(self, y: NDArray) -> NDArray: if self.norm is not _FFTNorms.ORTHO: return self._rmatvec(y) / self._scale / self._scale return self._rmatvec(y) @@ -348,7 +348,7 @@ def _rmatvec(self, x): y = scipy.fft.fftshift(y, axes=self.axes[self.ifftshift_before]) return y - def __truediv__(self, y): + def __truediv__(self, y: NDArray) -> NDArray: if self.norm is not _FFTNorms.ORTHO: return self._rmatvec(y) / self._scale / self._scale return self._rmatvec(y) From 54a4b289b61b76ea83b37f1b14c321c4e318bbc6 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Sun, 11 Jan 2026 22:06:00 +0000 Subject: [PATCH 8/9] minor: fix missing import in fft2d --- pylops/signalprocessing/fft2d.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pylops/signalprocessing/fft2d.py b/pylops/signalprocessing/fft2d.py index a4733e7c..e66cd3fc 100644 --- a/pylops/signalprocessing/fft2d.py +++ b/pylops/signalprocessing/fft2d.py @@ -11,7 +11,7 @@ from pylops.utils import deps from pylops.utils.backend import get_array_module from pylops.utils.decorators import reshaped -from pylops.utils.typing import DTypeLike, InputDimsLike +from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray mkl_fft_message = deps.mkl_fft_import("the mkl fft module") From b1b9a26616d21e7bb94ca06fe119a5e0096646eb Mon Sep 17 00:00:00 2001 From: mrava87 Date: Fri, 23 Jan 2026 22:29:27 +0000 Subject: [PATCH 9/9] doc: finalized adding Literal to basicoperators --- pylops/basicoperators/block.py | 4 ++-- pylops/basicoperators/causalintegration.py | 2 +- pylops/basicoperators/directionalderivative.py | 18 +++++++++++------- pylops/basicoperators/firstderivative.py | 8 ++++---- pylops/basicoperators/gradient.py | 7 ++++--- pylops/basicoperators/hstack.py | 2 +- pylops/basicoperators/identity.py | 2 +- pylops/basicoperators/laplacian.py | 6 +++--- pylops/basicoperators/matrixmult.py | 2 +- pylops/basicoperators/restriction.py | 4 ++-- pylops/basicoperators/spread.py | 4 ++-- pylops/basicoperators/sum.py | 3 ++- pylops/basicoperators/vstack.py | 2 +- pylops/basicoperators/zero.py | 2 +- pylops/signalprocessing/bilinear.py | 3 ++- 15 files changed, 38 insertions(+), 31 deletions(-) diff --git a/pylops/basicoperators/block.py b/pylops/basicoperators/block.py index 6b050b99..19cc5b31 100644 --- a/pylops/basicoperators/block.py +++ b/pylops/basicoperators/block.py @@ -17,7 +17,7 @@ class _Block(LinearOperator): def __init__( self, ops: Iterable[Iterable[LinearOperator]], - forceflat: bool = None, + forceflat: Optional[bool] = None, dtype: Optional[DTypeLike] = None, _HStack=HStack, _VStack=VStack, @@ -153,7 +153,7 @@ def __init__( self, ops: Iterable[Iterable[LinearOperator]], nproc: int = 1, - forceflat: bool = None, + forceflat: Optional[bool] = None, parallel_kind: Tparallel_kind = "multiproc", dtype: Optional[DTypeLike] = None, ): diff --git a/pylops/basicoperators/causalintegration.py b/pylops/basicoperators/causalintegration.py index ef2a9cec..15042f00 100644 --- a/pylops/basicoperators/causalintegration.py +++ b/pylops/basicoperators/causalintegration.py @@ -100,7 +100,7 @@ def __init__( self, dims: Union[int, InputDimsLike], axis: int = -1, - sampling: float = 1, + sampling: float = 1.0, kind: Literal["full", "half", "trapezoidal"] = "full", removefirst: bool = False, dtype: DTypeLike = "float64", diff --git a/pylops/basicoperators/directionalderivative.py b/pylops/basicoperators/directionalderivative.py index c26dc7b9..fb12f6a7 100644 --- a/pylops/basicoperators/directionalderivative.py +++ b/pylops/basicoperators/directionalderivative.py @@ -3,6 +3,8 @@ "SecondDirectionalDerivative", ] +from typing import Union + from pylops import LinearOperator from pylops.basicoperators import Diagonal, Gradient, Sum from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray, Tderivkind @@ -25,8 +27,9 @@ class FirstDirectionalDerivative(LinearOperator): v : :obj:`numpy.ndarray`, optional Single direction (array of size :math:`n_\text{dims}`) or group of directions (array of size :math:`[n_\text{dims} \times n_{d_0} \times ... \times n_{d_{n_\text{dims}}}]`) - sampling : :obj:`tuple`, optional - Sampling steps for each direction. + sampling : :obj:`tuple` or :obj:`float`, optional + Sampling steps for each direction. If a single float + is provided, it is used for all directions. edge : :obj:`bool`, optional Use reduced order derivative at edges (``True``) or ignore them (``False``). @@ -77,7 +80,7 @@ def __init__( self, dims: InputDimsLike, v: NDArray, - sampling: int = 1, + sampling: Union[float, InputDimsLike] = 1.0, edge: bool = False, kind: Tderivkind = "centered", dtype: DTypeLike = "float64", @@ -107,7 +110,7 @@ def _rmatvec(self, x: NDArray) -> NDArray: def _calc_first_ddop( dims: InputDimsLike, v: NDArray, - sampling: int, + sampling: Union[float, InputDimsLike], edge: bool, kind: Tderivkind, dtype: DTypeLike, @@ -138,8 +141,9 @@ class SecondDirectionalDerivative(LinearOperator): v : :obj:`numpy.ndarray`, optional Single direction (array of size :math:`n_\text{dims}`) or group of directions (array of size :math:`[n_\text{dims} \times n_{d_0} \times ... \times n_{d_{n_\text{dims}}}]`) - sampling : :obj:`tuple`, optional - Sampling steps for each direction. + sampling : :obj:`tuple` or :obj:`float`, optional + Sampling steps for each direction. If a single float + is provided, it is used for all directions. edge : :obj:`bool`, optional Use reduced order derivative at edges (``True``) or ignore them (``False``). @@ -184,7 +188,7 @@ def __init__( self, dims: InputDimsLike, v: NDArray, - sampling: int = 1, + sampling: Union[float, InputDimsLike] = 1.0, edge: bool = False, kind: Tderivkind = "centered", dtype: DTypeLike = "float64", diff --git a/pylops/basicoperators/firstderivative.py b/pylops/basicoperators/firstderivative.py index 0cc4bde2..2bb650ad 100644 --- a/pylops/basicoperators/firstderivative.py +++ b/pylops/basicoperators/firstderivative.py @@ -1,6 +1,6 @@ __all__ = ["FirstDerivative"] -from typing import Callable, Union +from typing import Callable, Literal, Union import numpy as np @@ -96,7 +96,7 @@ def __init__( sampling: float = 1.0, kind: Tderivkind = "centered", edge: bool = False, - order: int = 3, + order: Literal[3, 5] = 3, dtype: DTypeLike = "float64", name: str = "F", ) -> None: @@ -122,8 +122,8 @@ def __init__( def _register_multiplications( self, - kind: str, - order: int, + kind: Tderivkind, + order: Literal[3, 5], ) -> None: # choose _matvec and _rmatvec kind self._hmatvec: Callable diff --git a/pylops/basicoperators/gradient.py b/pylops/basicoperators/gradient.py index fcc25bfe..cfbe3a86 100644 --- a/pylops/basicoperators/gradient.py +++ b/pylops/basicoperators/gradient.py @@ -20,8 +20,9 @@ class Gradient(LinearOperator): ---------- dims : :obj:`tuple` Number of samples for each dimension. - sampling : :obj:`tuple`, optional - Sampling steps for each direction. + sampling : :obj:`tuple` or :obj:`float`, optional + Sampling steps for each direction. If a single float + is provided, it is used for all directions. edge : :obj:`bool`, optional Use reduced order derivative at edges (``True``) or ignore them (``False``). @@ -79,7 +80,7 @@ class Gradient(LinearOperator): def __init__( self, dims: Union[int, InputDimsLike], - sampling: int = 1, + sampling: Union[float, InputDimsLike] = 1.0, edge: bool = False, kind: Tderivkind = "centered", dtype: DTypeLike = "float64", diff --git a/pylops/basicoperators/hstack.py b/pylops/basicoperators/hstack.py index e9e8e4dc..126c034a 100644 --- a/pylops/basicoperators/hstack.py +++ b/pylops/basicoperators/hstack.py @@ -152,7 +152,7 @@ def __init__( self, ops: Sequence[LinearOperator], nproc: int = 1, - forceflat: bool = None, + forceflat: Optional[bool] = None, inoutengine: Optional[Tinoutengine] = None, parallel_kind: Tparallel_kind = "multiproc", dtype: Optional[str] = None, diff --git a/pylops/basicoperators/identity.py b/pylops/basicoperators/identity.py index 884600a9..dbb604a2 100644 --- a/pylops/basicoperators/identity.py +++ b/pylops/basicoperators/identity.py @@ -122,7 +122,7 @@ def __init__( N: Union[int, InputDimsLike], M: Optional[Union[int, InputDimsLike]] = None, inplace: bool = True, - forceflat: bool = None, + forceflat: Optional[bool] = None, dtype: DTypeLike = "float64", name: str = "I", ) -> None: diff --git a/pylops/basicoperators/laplacian.py b/pylops/basicoperators/laplacian.py index d2ec67bf..367693a4 100644 --- a/pylops/basicoperators/laplacian.py +++ b/pylops/basicoperators/laplacian.py @@ -77,8 +77,8 @@ def __init__( self, dims: InputDimsLike, axes: InputDimsLike = (-2, -1), - weights: Tuple[float, ...] = (1, 1), - sampling: Tuple[float, ...] = (1, 1), + weights: Tuple[float, ...] = (1.0, 1.0), + sampling: Tuple[float, ...] = (1.0, 1.0), edge: bool = False, kind: Tderivkind = "centered", dtype: DTypeLike = "float64", @@ -116,7 +116,7 @@ def _calc_l2op( weights: Tuple[float, ...], sampling: Tuple[float, ...], edge: bool, - kind: str, + kind: Tderivkind, dtype: DTypeLike, ): l2op = SecondDerivative( diff --git a/pylops/basicoperators/matrixmult.py b/pylops/basicoperators/matrixmult.py index 897f6851..a0c7a85d 100644 --- a/pylops/basicoperators/matrixmult.py +++ b/pylops/basicoperators/matrixmult.py @@ -76,7 +76,7 @@ def __init__( self, A: NDArray, otherdims: Optional[Union[int, InputDimsLike]] = None, - forceflat: bool = None, + forceflat: Optional[bool] = None, dtype: DTypeLike = "float64", name: str = "M", ) -> None: diff --git a/pylops/basicoperators/restriction.py b/pylops/basicoperators/restriction.py index 1636874a..0eec18ce 100644 --- a/pylops/basicoperators/restriction.py +++ b/pylops/basicoperators/restriction.py @@ -1,7 +1,7 @@ __all__ = ["Restriction"] import logging -from typing import Sequence, Union +from typing import Optional, Sequence, Union import numpy as np import numpy.ma as np_ma @@ -120,7 +120,7 @@ def __init__( iava: Union[IntNDArray, Sequence[int]], axis: int = -1, inplace: bool = True, - forceflat: bool = None, + forceflat: Optional[bool] = None, dtype: DTypeLike = "float64", name: str = "R", ) -> None: diff --git a/pylops/basicoperators/spread.py b/pylops/basicoperators/spread.py index aa4b301e..ca0909e3 100644 --- a/pylops/basicoperators/spread.py +++ b/pylops/basicoperators/spread.py @@ -1,7 +1,7 @@ __all__ = ["Spread"] import logging -from typing import Callable, Optional +from typing import Callable, Literal, Optional import numpy as np @@ -172,7 +172,7 @@ def __init__( dtable: Optional[NDArray] = None, fh: Optional[Callable] = None, interp: Optional[bool] = None, - engine: str = "numpy", + engine: Literal["numpy", "numba"] = "numpy", dtype: DTypeLike = "float64", name: str = "S", ) -> None: diff --git a/pylops/basicoperators/sum.py b/pylops/basicoperators/sum.py index 8bb65be4..b0f2cce0 100644 --- a/pylops/basicoperators/sum.py +++ b/pylops/basicoperators/sum.py @@ -1,6 +1,7 @@ __all__ = ["Sum"] import logging +from typing import Optional import numpy as np @@ -76,7 +77,7 @@ def __init__( self, dims: InputDimsLike, axis: int = -1, - forceflat: bool = None, + forceflat: Optional[bool] = None, dtype: DTypeLike = "float64", name: str = "S", ) -> None: diff --git a/pylops/basicoperators/vstack.py b/pylops/basicoperators/vstack.py index 9f7263b7..66405b4d 100644 --- a/pylops/basicoperators/vstack.py +++ b/pylops/basicoperators/vstack.py @@ -151,7 +151,7 @@ def __init__( self, ops: Sequence[LinearOperator], nproc: int = 1, - forceflat: bool = None, + forceflat: Optional[bool] = None, inoutengine: Optional[Tinoutengine] = None, parallel_kind: Tparallel_kind = "multiproc", dtype: Optional[DTypeLike] = None, diff --git a/pylops/basicoperators/zero.py b/pylops/basicoperators/zero.py index c82b2381..d2f91039 100644 --- a/pylops/basicoperators/zero.py +++ b/pylops/basicoperators/zero.py @@ -71,7 +71,7 @@ def __init__( self, N: Union[int, InputDimsLike], M: Optional[Union[int, InputDimsLike]] = None, - forceflat: bool = None, + forceflat: Optional[bool] = None, dtype: DTypeLike = "float64", name: str = "Z", ) -> None: diff --git a/pylops/signalprocessing/bilinear.py b/pylops/signalprocessing/bilinear.py index 5f1c7e26..024ae949 100644 --- a/pylops/signalprocessing/bilinear.py +++ b/pylops/signalprocessing/bilinear.py @@ -1,6 +1,7 @@ __all__ = ["Bilinear"] import logging +from typing import Optional import numpy as np @@ -112,7 +113,7 @@ def __init__( self, iava: IntNDArray, dims: InputDimsLike, - forceflat: bool = None, + forceflat: Optional[bool] = None, dtype: DTypeLike = "float64", name: str = "B", ) -> None: