From 8b0a75f392f56355a51eea25a41e607f9c795c7f Mon Sep 17 00:00:00 2001 From: mrava87 Date: Sat, 10 Aug 2024 00:21:22 +0200 Subject: [PATCH 01/35] build: added separate requirement file for torch --- .github/workflows/build.yaml | 3 ++- .github/workflows/codacy-coverage-reporter.yaml | 3 ++- .readthedocs.yaml | 1 + Makefile | 3 ++- azure-pipelines.yml | 2 ++ requirements-dev.txt | 2 -- requirements-torch.txt | 2 ++ 7 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 requirements-torch.txt diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index a0887beb..bd034554 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -24,7 +24,8 @@ jobs: run: | python -m pip install --upgrade pip setuptools pip install flake8 pytest - if [ -f requirements.txt ]; then pip install -r requirements-dev.txt; fi + pip install -r requirements-dev.txt + pip install -r requirements-torch.txt - name: Install pylops run: | python -m setuptools_scm diff --git a/.github/workflows/codacy-coverage-reporter.yaml b/.github/workflows/codacy-coverage-reporter.yaml index 0e610bb1..ed90ca30 100644 --- a/.github/workflows/codacy-coverage-reporter.yaml +++ b/.github/workflows/codacy-coverage-reporter.yaml @@ -26,7 +26,8 @@ jobs: run: | python -m pip install --upgrade pip pip install flake8 pytest - if [ -f requirements.txt ]; then pip install -r requirements-dev.txt; fi + pip install -r requirements-dev.txt + pip install -r requirements-torch.txt - name: Install pylops run: | pip install . diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 202c29ca..88f7e618 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -19,5 +19,6 @@ sphinx: python: install: - requirements: requirements-doc.txt + - requirements: requirements-torch.txt - method: pip path: . diff --git a/Makefile b/Makefile index 35cf0e1e..14a0a26b 100755 --- a/Makefile +++ b/Makefile @@ -21,7 +21,8 @@ install: dev-install: make pipcheck - $(PIP) install -r requirements-dev.txt && $(PIP) install -e . + $(PIP) install -r requirements-dev.txt &&\ + $(PIP) install -r requirements-torch.txt && $(PIP) install -e . install_conda: conda env create -f environment.yml && conda activate pylops && pip install . diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 00db3746..ab636d61 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -61,6 +61,7 @@ jobs: - script: | python -m pip install --upgrade pip setuptools wheel django pip install -r requirements-dev.txt + pip install -r requirements-torch.txt pip install . displayName: 'Install prerequisites and library' @@ -90,6 +91,7 @@ jobs: - script: | python -m pip install --upgrade pip setuptools wheel django pip install -r requirements-dev.txt + pip install -r requirements-torch.txt pip install . displayName: 'Install prerequisites and library' diff --git a/requirements-dev.txt b/requirements-dev.txt index 6ce1fb00..2fca40dd 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,7 +1,5 @@ numpy>=1.21.0 scipy>=1.11.0 ---extra-index-url https://download.pytorch.org/whl/cpu -torch>=1.2.0 jax numba pyfftw diff --git a/requirements-torch.txt b/requirements-torch.txt new file mode 100644 index 00000000..54b487ca --- /dev/null +++ b/requirements-torch.txt @@ -0,0 +1,2 @@ +--extra-index-url https://download.pytorch.org/whl/cpu +torch>=1.2.0 From 80e159366ff15471006d8426a79e7b6bc5e3387a Mon Sep 17 00:00:00 2001 From: Carlos da Costa Date: Sun, 18 Aug 2024 19:25:31 -0700 Subject: [PATCH 02/35] Use --index-url instead of --extra-index-url in requirements-torch.txt --- requirements-torch.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-torch.txt b/requirements-torch.txt index 54b487ca..f2c3b105 100644 --- a/requirements-torch.txt +++ b/requirements-torch.txt @@ -1,2 +1,2 @@ ---extra-index-url https://download.pytorch.org/whl/cpu +--index-url https://download.pytorch.org/whl/cpu torch>=1.2.0 From dc2a3e8bff11d8c98d84ebb1e61abf556424cda4 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Fri, 30 Aug 2024 22:11:06 -0500 Subject: [PATCH 03/35] feat: added FourierRadon2d operator --- CHANGELOG.md | 2 +- docs/source/api/index.rst | 1 + examples/plot_fourierradon.py | 130 ++++++++ pylops/signalprocessing/__init__.py | 4 + .../signalprocessing/_fourierradon2d_cuda.py | 86 +++++ .../signalprocessing/_fourierradon2d_numba.py | 30 ++ pylops/signalprocessing/fourierradon2d.py | 293 ++++++++++++++++++ pylops/signalprocessing/radon2d.py | 2 +- pylops/utils/estimators.py | 6 +- pytests/test_fourierradon.py | 152 +++++++++ pytests/test_radon.py | 114 ++++--- 11 files changed, 755 insertions(+), 65 deletions(-) create mode 100644 examples/plot_fourierradon.py create mode 100755 pylops/signalprocessing/_fourierradon2d_cuda.py create mode 100755 pylops/signalprocessing/_fourierradon2d_numba.py create mode 100755 pylops/signalprocessing/fourierradon2d.py create mode 100755 pytests/test_fourierradon.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 09d6c06b..1f1c6780 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ Changelog ========= # 2.3.1 -* Fixed bug in :py:mod:`pylops.utils.backend` (see [Issue #606](https://github.com/PyLops/pylops/issues/606)) +* Fixed bug in `pylops.utils.backend` (see [Issue #606](https://github.com/PyLops/pylops/issues/606)) # 2.3.0 diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst index 1d77dc15..7b540e90 100755 --- a/docs/source/api/index.rst +++ b/docs/source/api/index.rst @@ -109,6 +109,7 @@ Signal processing Seislet Radon2D Radon3D + FourierRadon2D ChirpRadon2D ChirpRadon3D Sliding1D diff --git a/examples/plot_fourierradon.py b/examples/plot_fourierradon.py new file mode 100644 index 00000000..c59d21bb --- /dev/null +++ b/examples/plot_fourierradon.py @@ -0,0 +1,130 @@ +r""" +Fourier Radon Transform +======================= +This example shows how to use the :py:class:`pylops.signalprocessing.FourierRadon2D` +operator to apply the linear and parabolic Radon Transform to 2-dimensional signals. + +This operator provides a transformation equivalent to that of +:py:class:`pylops.signalprocessing.Radon2D`, however since the shift-and-sum step +is performed in the frequency domain, this is analytically correct (compared to +performing to shifting the data via nearest or linear interpolation). + +""" +import matplotlib.pyplot as plt +import numpy as np + +import pylops + +plt.close("all") + +############################################################################### +# Let's start by creating a empty 2d matrix of size :math:`n_x \times n_t` +# with a single linear event. + +par = { + "ot": 0, + "dt": 0.004, + "nt": 51, + "ox": -250, + "dx": 10, + "nx": 51, + "oy": -250, + "dy": 10, + "ny": 51, + "f0": 40, +} +theta = [10.0] +t0 = [0.1] +amp = [1.0] + +# Create axes +t, t2, x, y = pylops.utils.seismicevents.makeaxis(par) +dt, dx, dy = par["dt"], par["dx"], par["dy"] + +# Create wavelet +wav, _, wav_c = pylops.utils.wavelets.ricker(t[:41], f0=par["f0"]) + +# Generate data +_, d = pylops.utils.seismicevents.linear2d(x, t, 1500.0, t0, theta, amp, wav) + + +############################################################################### +# We can now define our operators and apply the forward, adjoint and inverse +# steps. +nfft = int(2 ** np.ceil(np.log2(par["nt"]))) +npx, pxmax = 2 * par["nx"], 5e-4 +px = np.linspace(-pxmax, pxmax, npx) + +R2Op = pylops.signalprocessing.FourierRadon2D( + t, x, px, nfft, kind="linear", engine="numpy", dtype="float64" +) +dL_chirp = R2Op.H * d +dadj_chirp = R2Op * dL_chirp + +fig, axs = plt.subplots(1, 3, figsize=(12, 4), sharey=True) +axs[0].imshow(d.T, vmin=-1, vmax=1, cmap="bwr_r", extent=(x[0], x[-1], t[-1], t[0])) +axs[0].set(xlabel=r"$x$ [m]", ylabel=r"$t$ [s]", title="Input linear") +axs[0].axis("tight") +axs[1].imshow( + dL_chirp.T, + cmap="bwr_r", + vmin=-dL_chirp.max(), + vmax=dL_chirp.max(), + extent=(1e3 * px[0], 1e3 * px[-1], t[-1], t[0]), +) +axs[1].scatter(1e3 * np.sin(np.deg2rad(theta[0])) / 1500.0, t0[0], s=50, color="r") +axs[1].set(xlabel=r"$p$ [s/km]", title="Radon") +axs[1].axis("tight") +axs[2].imshow( + dadj_chirp.T, + cmap="bwr_r", + vmin=-dadj_chirp.max(), + vmax=dadj_chirp.max(), + extent=(x[0], x[-1], t[-1], t[0]), +) +axs[2].set(xlabel=r"$x$ [m]", title="Adj Radon") +axs[2].axis("tight") +plt.tight_layout() + + +############################################################################### +# We repeat now the same with a parabolic event + +# Generate data +pxx = [1e-6] +_, d = pylops.utils.seismicevents.parabolic2d(x, t, t0, 0, np.array(pxx), amp, wav) + +# Radon transform +npx, pxmax = 2 * par["nx"], 5e-6 +px = np.linspace(-pxmax, pxmax, npx) + +R2Op = pylops.signalprocessing.FourierRadon2D( + t, x, px, nfft, kind="parabolic", engine="numpy", dtype="float64" +) +dL_chirp = R2Op.H * d +dadj_chirp = R2Op * dL_chirp + +fig, axs = plt.subplots(1, 3, figsize=(12, 4), sharey=True) +axs[0].imshow(d.T, vmin=-1, vmax=1, cmap="bwr_r", extent=(x[0], x[-1], t[-1], t[0])) +axs[0].set(xlabel=r"$x$ [m]", ylabel=r"$t$ [s]", title="Input parabolic") +axs[0].axis("tight") +axs[1].imshow( + dL_chirp.T, + cmap="bwr_r", + vmin=-dL_chirp.max(), + vmax=dL_chirp.max(), + extent=(1e3 * px[0], 1e3 * px[-1], t[-1], t[0]), +) +axs[1].scatter(1e3 * pxx[0], t0[0], s=50, color="r") +axs[1].set(xlabel=r"$p$ [s/km]", title="Radon") +axs[1].axis("tight") +axs[2].imshow( + dadj_chirp.T, + cmap="bwr_r", + vmin=-dadj_chirp.max(), + vmax=dadj_chirp.max(), + extent=(x[0], x[-1], t[-1], t[0]), +) +axs[2].set(xlabel=r"$x$ [m]", title="Adj Radon") +axs[2].axis("tight") +plt.tight_layout() diff --git a/pylops/signalprocessing/__init__.py b/pylops/signalprocessing/__init__.py index a8e5ed65..65c0c22e 100755 --- a/pylops/signalprocessing/__init__.py +++ b/pylops/signalprocessing/__init__.py @@ -28,6 +28,9 @@ DTCWT Dual-Tree Complex Wavelet Transform. Radon2D Two dimensional Radon transform. Radon3D Three dimensional Radon transform. + FourierRadon2D Two dimensional Fourier Radon transform. + ChirpRadon2D Two dimensional Chirp Radon transform. + ChirpRadon3D Three dimensional Chirp Radon transform. Seislet Two dimensional Seislet operator. Sliding1D 1D Sliding transform operator. Sliding2D 2D Sliding transform operator. @@ -52,6 +55,7 @@ from .bilinear import * from .radon2d import * from .radon3d import * +from .fourierradon2d import * from .chirpradon2d import * from .chirpradon3d import * from .sliding1d import * diff --git a/pylops/signalprocessing/_fourierradon2d_cuda.py b/pylops/signalprocessing/_fourierradon2d_cuda.py new file mode 100755 index 00000000..56c14963 --- /dev/null +++ b/pylops/signalprocessing/_fourierradon2d_cuda.py @@ -0,0 +1,86 @@ +from cmath import exp +from math import pi + +from numba import cuda + + +@cuda.jit() +def _radon_inner_2d_kernel(x, y, f, px, h, flim0, flim1, npx, nh): + """Cuda kernels for FourierRadon2D operator + + Cuda implementation of the on-the-fly kernel creation and application for the + FourierRadon2D operator. See :class:`pylops.signalprocessing.FourierRadon2D` + for details about input parameters. + + """ + ih, ifr = cuda.grid(2) + if ih < nh and ifr >= flim0 and ifr <= flim1: + for ipx in range(npx): + y[ih, ifr] += x[ipx, ifr] * exp(-1j * 2 * pi * f[ifr] * px[ipx] * h[ih]) + + +@cuda.jit() +def _aradon_inner_2d_kernel(x, y, f, px, h, flim0, flim1, npx, nh): + """Cuda kernels for FourierRadon2D operator + + Cuda implementation of the on-the-fly kernel creation and application for the + FourierRadon2D operator. See :class:`pylops.signalprocessing.FourierRadon2D` + for details about input parameters. + + """ + ipx, ifr = cuda.grid(2) + if ipx < npx and ifr >= flim0 and ifr <= flim1: + for ih in range(nh): + x[ipx, ifr] += y[ih, ifr] * exp(1j * 2 * pi * f[ifr] * px[ipx] * h[ih]) + + +def _radon_inner_2d_cuda( + x, + y, + f, + px, + h, + flim0, + flim1, + npx, + nh, + num_blocks=(32, 32), + num_threads_per_blocks=(32, 32), +): + """Caller for FourierRadon2D operator + + Caller for cuda implementation of matvec kernel for FourierRadon2D operator. + See :class:`pylops.signalprocessing.FourierRadon2D` for details about + input parameters. + + """ + _radon_inner_2d_kernel[num_blocks, num_threads_per_blocks]( + x, y, f, px, h, flim0, flim1, npx, nh + ) + return y + + +def _aradon_inner_2d_cuda( + x, + y, + f, + px, + h, + flim0, + flim1, + npx, + nh, + num_blocks=(32, 32), + num_threads_per_blocks=(32, 32), +): + """Caller for FourierRadon2D operator + + Caller for cuda implementation of rmatvec kernel for FourierRadon2D operator. + See :class:`pylops.signalprocessing.FourierRadon2D` for details about + input parameters. + + """ + _aradon_inner_2d_kernel[num_blocks, num_threads_per_blocks]( + x, y, f, px, h, flim0, flim1, npx, nh + ) + return x diff --git a/pylops/signalprocessing/_fourierradon2d_numba.py b/pylops/signalprocessing/_fourierradon2d_numba.py new file mode 100755 index 00000000..1853c741 --- /dev/null +++ b/pylops/signalprocessing/_fourierradon2d_numba.py @@ -0,0 +1,30 @@ +import os + +import numpy as np +from numba import jit, prange + +# detect whether to use parallel or not +numba_threads = int(os.getenv("NUMBA_NUM_THREADS", "1")) +parallel = True if numba_threads != 1 else False + + +@jit(nopython=True, parallel=parallel, nogil=True, cache=True, fastmath=True) +def _radon_inner_2d(X, Y, f, px, h, flim0, flim1, npx, nh): + for ih in prange(nh): + for ifr in range(flim0, flim1): + for ipx in range(npx): + Y[ih, ifr] += X[ipx, ifr] * np.exp( + -1j * 2 * np.pi * f[ifr] * px[ipx] * h[ih] + ) + return Y + + +@jit(nopython=True, parallel=parallel, nogil=True, cache=True, fastmath=True) +def _aradon_inner_2d(X, Y, f, px, h, flim0, flim1, npx, nh): + for ipx in prange(npx): + for ifr in range(flim0, flim1): + for ih in range(nh): + X[ipx, ifr] += Y[ih, ifr] * np.exp( + 1j * 2 * np.pi * f[ifr] * px[ipx] * h[ih] + ) + return X diff --git a/pylops/signalprocessing/fourierradon2d.py b/pylops/signalprocessing/fourierradon2d.py new file mode 100755 index 00000000..7a883321 --- /dev/null +++ b/pylops/signalprocessing/fourierradon2d.py @@ -0,0 +1,293 @@ +__all__ = ["FourierRadon2D"] + +import logging +from typing import Optional, Tuple + +import numpy as np +import scipy as sp + +from pylops import LinearOperator +from pylops.utils import deps +from pylops.utils.backend import get_array_module, get_complex_dtype +from pylops.utils.decorators import reshaped +from pylops.utils.typing import DTypeLike, NDArray + +jit_message = deps.numba_import("the radon2d module") + +if jit_message is None: + + from ._fourierradon2d_cuda import _aradon_inner_2d_cuda, _radon_inner_2d_cuda + from ._fourierradon2d_numba import _aradon_inner_2d, _radon_inner_2d + +logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.WARNING) + + +class FourierRadon2D(LinearOperator): + r"""2D Fourier Radon transform + + Apply Radon forward (and adjoint) transform using Fast + Fourier Transform to a 2-dimensional array of size + :math:`[n_x \times n_t]` (both in forward and adjoint mode). + + Note that forward and adjoint follow the same convention of the time-space + implementation in :class:`pylops.signalprocessing.Radon2D`. + + Parameters + ---------- + taxis : :obj:`np.ndarray` + Time axis + haxis : :obj:`np.ndarray` + Spatial axis + pxaxis : :obj:`np.ndarray` + Axis of scanning variable :math:`p_x` of parametric curve + nfft : :obj:`int` + Number of samples in Fourier transform + flims : :obj:`tuple`, optional + Indices of lower and upper limits of Fourier axis to be used in + the application of the Radon matrix (if ``None``, use entire axis) + kind : :obj:`str`, optional + Curve to be used for stacking/spreading (``linear``, ``parabolic``) + engine : :obj:`str`, optional + Engine used for computation (``numpy`` or ``numba`` or ``cuda``) + num_threads_per_blocks : :obj:`tuple`, optional + Number of threads in each block (only when ``engine=cuda``) + dtype : :obj:`str`, optional + Type of elements in input array. + name : :obj:`str`, optional + Name of operator (to be used by :func:`pylops.utils.describe.describe`) + + Attributes + ---------- + shape : :obj:`tuple` + Operator shape + explicit : :obj:`bool` + Operator contains a matrix that can be solved explicitly (``True``) or + not (``False``) + + Notes + ----- + The FourierRadon2D operator applies the Radon transform in the frequency domain. + After transforming a 2-dimensional array of size + :math:`[n_x \times n_t]` into the frequency domain, the following linear + transformation is applied to each frequency component in adjoint mode: + + .. math:: + \begin{bmatrix} + \mathbf{m}(p_{x,1}, \omega_i) \\ + \mathbf{m}(p_{x,2}, \omega_i) \\ + \vdots \\ + \mathbf{m}(p_{x,N_p}, \omega_i) + \end{bmatrix} + = + \begin{bmatrix} + e^{-j \omega_i p_{x,1} x^l_1} & e^{-j \omega_i p_{x,1} x^l_2} & \ldots & e^{-j \omega_i p_{x,2} x^l_{N_x}} \\ + e^{-j \omega_i p_{x,2} x^l_1} & e^{-j \omega_i p_{x,2} x^l_2} & \ldots & e^{-j \omega_i p_{x,2} x^l_{N_x}} \\ + \vdots & \vdots & \ddots & \vdots \\ + e^{-j \omega_i p_{x,N_p} x^l_1} & e^{-j \omega_i p_{x,N_p} x^l_2} & \ldots & e^{-j \omega_i p_{x,N_p} x^l_{N_x}} \\ + \end{bmatrix} + \begin{bmatrix} + \mathbf{d}(x_1, \omega_i) \\ + \mathbf{d}(x_2, \omega_i) \\ + \vdots \\ + \mathbf{d}(x_{N_x}, \omega_i) + \end{bmatrix} + + where :math:`l=1,2`. Similarly the forward mode is implemented by applying the + transpose and complex conjugate of the above matrix to the model transformed to + the Fourier domain. + + Refer to [1]_ for more theoretical and implementation details. + + .. [1] Sacchi, M. "Statistical and Transform Methods for + Geophysical Signal Processing", 2007. + + """ + + def __init__( + self, + taxis: NDArray, + haxis: NDArray, + pxaxis: NDArray, + nfft: int, + flims: Optional[Tuple[int, int]] = None, + kind: Optional[str] = "linear", + engine: Optional[str] = "numpy", + num_threads_per_blocks: Tuple[int, int] = (32, 32), + dtype: Optional[DTypeLike] = "float64", + name: Optional[str] = "C", + ) -> None: + # engine + if engine not in ["numpy", "numba", "cuda"]: + raise KeyError("engine must be numpy or numba or cuda") + if engine == "numba" and jit_message is not None: + engine = "numpy" + + # dimensions and super + dims = len(pxaxis), len(taxis) + dimsd = len(haxis), len(taxis) + super().__init__(dtype=np.dtype(dtype), dims=dims, dimsd=dimsd, name=name) + + # other input params + self.taxis, self.haxis = taxis, haxis + self.nh, self.nt = self.dimsd + self.px = pxaxis + self.npx, self.nfft = self.dims[0], nfft + self.dt = taxis[1] - taxis[0] + self.dh = haxis[1] - haxis[0] + self.f = np.fft.rfftfreq(self.nfft, d=self.dt) + self.nfft2 = self.f.size + self.cdtype = get_complex_dtype(dtype) + + self.flims = flims + if flims is None: + self.flims = (0, self.nfft2) + + if kind == "parabolic": + self.haxis = self.haxis**2 + + # create additional input parameters for engine=cuda + if engine == "cuda": + self.num_threads_per_blocks = num_threads_per_blocks + ( + num_threads_per_blocks_hpx, + num_threads_per_blocks_f, + ) = num_threads_per_blocks + num_blocks_px = ( + self.dims[0] + num_threads_per_blocks_hpx - 1 + ) // num_threads_per_blocks_hpx + num_blocks_h = ( + self.dimsd[0] + num_threads_per_blocks_hpx - 1 + ) // num_threads_per_blocks_hpx + num_blocks_f = ( + self.dims[1] + num_threads_per_blocks_f - 1 + ) // num_threads_per_blocks_f + self.num_blocks_matvec = (num_blocks_h, num_blocks_f) + self.num_blocks_rmatvec = (num_blocks_px, num_blocks_f) + self._register_multiplications(engine) + + def _register_multiplications(self, engine: str) -> None: + if engine == "numba" and jit_message is None: + self._matvec = self._matvec_numba + self._rmatvec = self._rmatvec_numba + elif engine == "cuda": + self._matvec = self._matvec_cuda + self._rmatvec = self._rmatvec_cuda + else: + self._matvec = self._matvec_numpy + self._rmatvec = self._rmatvec_numpy + + @reshaped + def _matvec_numpy(self, x: NDArray) -> NDArray: + ncp = get_array_module(x) + x = ncp.fft.rfft(x, n=self.nfft, axis=-1) + + H, PX, F = ncp.meshgrid( + self.haxis, self.px, self.f[self.flims[0] : self.flims[1]], indexing="ij" + ) + y = ncp.zeros((self.nh, self.nfft2), dtype=self.cdtype) + y[:, self.flims[0] : self.flims[1]] = ncp.einsum( + "ijk,jk->ik", + ncp.exp(-1j * 2 * ncp.pi * F * PX * H), + x[:, self.flims[0] : self.flims[1]], + ) + y = ncp.real(ncp.fft.irfft(y, n=self.nfft, axis=-1))[:, : self.nt] + return y + + @reshaped + def _rmatvec_numpy(self, y: NDArray) -> NDArray: + ncp = get_array_module(y) + y = ncp.fft.rfft(y, n=self.nfft, axis=-1) + + PX, H, F = ncp.meshgrid( + self.px, self.haxis, self.f[self.flims[0] : self.flims[1]], indexing="ij" + ) + x = ncp.zeros((self.npx, self.nfft2), dtype=self.cdtype) + x[:, self.flims[0] : self.flims[1]] = ncp.einsum( + "ijk,jk->ik", + ncp.exp(1j * 2 * ncp.pi * F * PX * H), + y[:, self.flims[0] : self.flims[1]], + ) + x = ncp.real(ncp.fft.irfft(x, n=self.nfft, axis=-1))[:, : self.nt] + return x + + @reshaped + def _matvec_cuda(self, x: NDArray) -> NDArray: + ncp = get_array_module(x) + y = ncp.zeros((self.nh, self.nfft2), dtype=self.cdtype) + + x = ncp.fft.rfft(x, n=self.nfft, axis=-1) + y = _radon_inner_2d_cuda( + x, + y, + ncp.asarray(self.f), + self.px, + self.haxis, + self.flims[0], + self.flims[1], + self.npx, + self.nh, + num_blocks=self.num_blocks_matvec, + num_threads_per_blocks=self.num_threads_per_blocks, + ) + y = ncp.real(ncp.fft.irfft(y, n=self.nfft, axis=-1))[:, : self.nt] + return y + + @reshaped + def _rmatvec_cuda(self, y: NDArray) -> NDArray: + ncp = get_array_module(y) + x = ncp.zeros((self.npx, self.nfft2), dtype=self.cdtype) + + y = ncp.fft.rfft(y, n=self.nfft, axis=-1) + x = _aradon_inner_2d_cuda( + x, + y, + ncp.asarray(self.f), + self.px, + self.haxis, + self.flims[0], + self.flims[1], + self.npx, + self.nh, + num_blocks=self.num_blocks_rmatvec, + num_threads_per_blocks=self.num_threads_per_blocks, + ) + x = ncp.real(ncp.fft.irfft(x, n=self.nfft, axis=-1))[:, : self.nt] + return x + + @reshaped + def _matvec_numba(self, x: NDArray) -> NDArray: + y = np.zeros((self.nh, self.nfft2), dtype=self.cdtype) + + x = sp.fft.rfft(x, n=self.nfft, axis=-1) + y = _radon_inner_2d( + x, + y, + self.f, + self.px, + self.haxis, + self.flims[0], + self.flims[1], + self.npx, + self.nh, + ) + y = np.real(sp.fft.irfft(y, n=self.nfft, axis=-1))[:, : self.nt] + return y + + @reshaped + def _rmatvec_numba(self, y: NDArray) -> NDArray: + x = np.zeros((self.npx, self.nfft2), dtype=self.cdtype) + + y = sp.fft.rfft(y, n=self.nfft, axis=-1) + x = _aradon_inner_2d( + x, + y, + self.f, + self.px, + self.haxis, + self.flims[0], + self.flims[1], + self.npx, + self.nh, + ) + x = np.real(sp.fft.irfft(x, n=self.nfft, axis=-1))[:, : self.nt] + return x diff --git a/pylops/signalprocessing/radon2d.py b/pylops/signalprocessing/radon2d.py index d045eb8a..a76696b4 100644 --- a/pylops/signalprocessing/radon2d.py +++ b/pylops/signalprocessing/radon2d.py @@ -218,7 +218,7 @@ def Radon2D( ----- The Radon2D operator applies the following linear transform in adjoint mode to the data after reshaping it into a 2-dimensional array of - size :math:`[n_x \times n_t]` in adjoint mode: + size :math:`[n_x \times n_t]`: .. math:: m(p_x, t_0) = \int{d(x, t = f(p_x, x, t))} \,\mathrm{d}x diff --git a/pylops/utils/estimators.py b/pylops/utils/estimators.py index 887fac3f..5e73f686 100644 --- a/pylops/utils/estimators.py +++ b/pylops/utils/estimators.py @@ -87,7 +87,7 @@ def trace_hutchinson( Operator trace. Raises - ------- + ------ ValueError If ``neval`` is smaller than 3. @@ -194,7 +194,7 @@ def trace_hutchpp( Operator trace. Raises - ------- + ------ ValueError If ``neval`` is smaller than 3. @@ -294,7 +294,7 @@ def trace_nahutchpp( Operator trace. Raises - ------- + ------ ValueError If ``neval`` not large enough to accomodate ``c1`` and ``c2``. diff --git a/pytests/test_fourierradon.py b/pytests/test_fourierradon.py new file mode 100755 index 00000000..36f3f7b6 --- /dev/null +++ b/pytests/test_fourierradon.py @@ -0,0 +1,152 @@ +import multiprocessing + +import numpy as np +import pytest +from numpy.testing import assert_array_almost_equal + +from pylops.optimization.sparsity import fista +from pylops.signalprocessing import FourierRadon2D +from pylops.utils import dottest + +par1 = { + "nt": 11, + "nhx": 21, + "nhy": 10, + "npx": 21, + "npy": 17, + "pymax": 1e-2, + "pxmax": 2e-2, + "centeredh": True, + "kind": "linear", + "interp": True, + "engine": "numpy", +} # linear, centered, linear interp, numpy +par2 = { + "nt": 11, + "nhx": 21, + "nhy": 10, + "npx": 21, + "npy": 17, + "pymax": 1e-2, + "pxmax": 2e-2, + "centeredh": False, + "kind": "linear", + "interp": True, + "engine": "numpy", +} # linear, uncentered, linear interp, numpy +par3 = { + "nt": 11, + "nhx": 21, + "nhy": 10, + "npx": 21, + "npy": 17, + "pymax": 1e-2, + "pxmax": 2e-2, + "centeredh": True, + "kind": "linear", + "interp": True, + "engine": "numba", +} # linear, centered, linear interp, numba +par4 = { + "nt": 11, + "nhx": 21, + "nhy": 10, + "npx": 21, + "npy": 17, + "pymax": 1e-2, + "pxmax": 2e-2, + "centeredh": False, + "kind": "linear", + "interp": False, + "engine": "numba", +} # linear, uncentered, linear interp, numba +par5 = { + "nt": 11, + "nhx": 21, + "nhy": 10, + "npx": 21, + "npy": 17, + "pymax": 8e-3, + "pxmax": 7e-3, + "centeredh": True, + "kind": "parabolic", + "interp": False, + "engine": "numpy", +} # parabolic, centered, no interp, numpy +par6 = { + "nt": 11, + "nhx": 21, + "nhy": 10, + "npx": 21, + "npy": 17, + "pymax": 8e-3, + "pxmax": 7e-3, + "centeredh": False, + "kind": "parabolic", + "interp": True, + "engine": "numba", +} # parabolic, uncentered, interp, numba +par7 = { + "nt": 11, + "nhx": 21, + "nhy": 10, + "npx": 21, + "npy": 17, + "pymax": 9e-2, + "pxmax": 8e-2, + "centeredh": True, + "kind": "hyperbolic", + "interp": True, + "engine": "numpy", +} # hyperbolic, centered, interp, numpy +par8 = { + "nt": 11, + "nhx": 21, + "nhy": 10, + "npx": 21, + "npy": 17, + "pymax": 7e-2, + "pxmax": 8e-2, + "centeredh": False, + "kind": "hyperbolic", + "interp": False, + "engine": "numba", +} # hyperbolic, uncentered, interp, numba + + +def test_unknown_engine(): + """Check error is raised if unknown engine is passed""" + with pytest.raises(KeyError): + _ = FourierRadon2D(None, None, None, None, engine="foo") + + +@pytest.mark.parametrize( + "par", [(par1), (par2), (par3), (par4), (par5), (par6), (par7), (par8)] +) +def test_FourierRadon2D(par): + """Dot-test and sparse inverse for FourierRadon2D operator""" + dt, dh = 0.005, 1 + t = np.arange(par["nt"]) * dt + h = np.arange(par["nhx"]) * dh + px = np.linspace(0, par["pxmax"], par["npx"]) + nfft = int(2 ** np.ceil(np.log2(par["nt"]))) + + x = np.zeros((par["npx"], par["nt"])) + x[2, par["nt"] // 2] = 1 + + Rop = FourierRadon2D( + t, + h, + px, + nfft, + kind=par["kind"], + engine=par["engine"], + dtype="float64", + ) + assert dottest(Rop, par["nhx"] * par["nt"], par["npx"] * par["nt"], rtol=1e-3) + + y = Rop * x.ravel() + + if par["engine"] == "numba": # as numpy is too slow here... + xinv, _, _ = fista(Rop, y, niter=200, eps=3e0) + assert_array_almost_equal(x.ravel(), xinv, decimal=1) diff --git a/pytests/test_radon.py b/pytests/test_radon.py index cc4b8054..26d08ba1 100755 --- a/pytests/test_radon.py +++ b/pytests/test_radon.py @@ -1,5 +1,3 @@ -import multiprocessing - import numpy as np import pytest from numpy.testing import assert_array_almost_equal @@ -176,63 +174,59 @@ def test_Radon2D(par): "par", [(par1), (par2), (par3), (par4), (par5), (par6), (par7), (par8)] ) def test_Radon3D(par): - """Dot-test, forward and adjoint consistency check + """Dot-test, forward and adjoint consistency check (for onthefly parameter), and sparse inverse for Radon3D operator """ - if ( - par["engine"] == "numpy" or multiprocessing.cpu_count() >= 4 - ): # avoid timeout in travis for numba - - dt, dhy, dhx = 0.005, 1, 1 - t = np.arange(par["nt"]) * dt - hy = np.arange(par["nhy"]) * dhy - hx = np.arange(par["nhx"]) * dhx - py = np.linspace(0, par["pymax"], par["npy"]) - px = np.linspace(0, par["pxmax"], par["npx"]) - x = np.zeros((par["npy"], par["npx"], par["nt"])) - x[3, 2, par["nt"] // 2] = 1 - - Rop = Radon3D( - t, - hy, - hx, - py, - px, - centeredh=par["centeredh"], - interp=par["interp"], - kind=par["kind"], - onthefly=False, - engine=par["engine"], - dtype="float64", - ) - R1op = Radon3D( - t, - hy, - hx, - py, - px, - centeredh=par["centeredh"], - interp=par["interp"], - kind=par["kind"], - onthefly=True, - engine=par["engine"], - dtype="float64", - ) - - assert dottest( - Rop, - par["nhy"] * par["nhx"] * par["nt"], - par["npy"] * par["npx"] * par["nt"], - rtol=1e-3, - ) - y = Rop * x.ravel() - y1 = R1op * x.ravel() - assert_array_almost_equal(y, y1, decimal=4) - - xadj = Rop.H * y - xadj1 = R1op.H * y - assert_array_almost_equal(xadj, xadj1, decimal=4) - - if Rop.engine == "numba": # as numpy is too slow here... - xinv, _, _ = fista(Rop, y, niter=200, eps=3e0) - assert_array_almost_equal(x.ravel(), xinv, decimal=1) + dt, dhy, dhx = 0.005, 1, 1 + t = np.arange(par["nt"]) * dt + hy = np.arange(par["nhy"]) * dhy + hx = np.arange(par["nhx"]) * dhx + py = np.linspace(0, par["pymax"], par["npy"]) + px = np.linspace(0, par["pxmax"], par["npx"]) + x = np.zeros((par["npy"], par["npx"], par["nt"])) + x[3, 2, par["nt"] // 2] = 1 + + Rop = Radon3D( + t, + hy, + hx, + py, + px, + centeredh=par["centeredh"], + interp=par["interp"], + kind=par["kind"], + onthefly=False, + engine=par["engine"], + dtype="float64", + ) + R1op = Radon3D( + t, + hy, + hx, + py, + px, + centeredh=par["centeredh"], + interp=par["interp"], + kind=par["kind"], + onthefly=True, + engine=par["engine"], + dtype="float64", + ) + + assert dottest( + Rop, + par["nhy"] * par["nhx"] * par["nt"], + par["npy"] * par["npx"] * par["nt"], + rtol=1e-3, + ) + y = Rop * x.ravel() + y1 = R1op * x.ravel() + assert_array_almost_equal(y, y1, decimal=4) + + xadj = Rop.H * y + xadj1 = R1op.H * y + assert_array_almost_equal(xadj, xadj1, decimal=4) + + if Rop.engine == "numba": # as numpy is too slow here... + xinv, _, _ = fista(Rop, y, niter=200, eps=3e0) + assert_array_almost_equal(x.ravel(), xinv, decimal=1) From 427c014e805eff30e1d3c6ed150b146c6a7a6209 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Wed, 4 Sep 2024 03:21:35 +0300 Subject: [PATCH 04/35] feat: added FourierRadon3D --- docs/source/api/index.rst | 1 + pylops/signalprocessing/__init__.py | 3 + .../signalprocessing/_fourierradon3d_numba.py | 42 +++ .../_nonstatconvolve2d_cuda.py | 4 +- pylops/signalprocessing/fourierradon2d.py | 18 +- pylops/signalprocessing/fourierradon3d.py | 327 ++++++++++++++++++ 6 files changed, 384 insertions(+), 11 deletions(-) create mode 100755 pylops/signalprocessing/_fourierradon3d_numba.py create mode 100755 pylops/signalprocessing/fourierradon3d.py diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst index 7b540e90..59e40e51 100755 --- a/docs/source/api/index.rst +++ b/docs/source/api/index.rst @@ -110,6 +110,7 @@ Signal processing Radon2D Radon3D FourierRadon2D + FourierRadon3D ChirpRadon2D ChirpRadon3D Sliding1D diff --git a/pylops/signalprocessing/__init__.py b/pylops/signalprocessing/__init__.py index 65c0c22e..e6a9e89d 100755 --- a/pylops/signalprocessing/__init__.py +++ b/pylops/signalprocessing/__init__.py @@ -56,6 +56,7 @@ from .radon2d import * from .radon3d import * from .fourierradon2d import * +from .fourierradon3d import * from .chirpradon2d import * from .chirpradon3d import * from .sliding1d import * @@ -89,6 +90,8 @@ "Bilinear", "Radon2D", "Radon3D", + "FourierRadon2D", + "FourierRadon3D", "ChirpRadon2D", "ChirpRadon3D", "Sliding1D", diff --git a/pylops/signalprocessing/_fourierradon3d_numba.py b/pylops/signalprocessing/_fourierradon3d_numba.py new file mode 100755 index 00000000..5b1e2383 --- /dev/null +++ b/pylops/signalprocessing/_fourierradon3d_numba.py @@ -0,0 +1,42 @@ +import os + +import numpy as np +from numba import jit, prange + +# detect whether to use parallel or not +numba_threads = int(os.getenv("NUMBA_NUM_THREADS", "1")) +parallel = True if numba_threads != 1 else False + + +@jit(nopython=True, parallel=parallel, nogil=True, cache=True, fastmath=True) +def _radon_inner_3d(X, Y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, nhx): + for ihy in prange(nhy): + for ihx in prange(nhx): + for ifr in range(flim0, flim1): + for ipy in range(npy): + for ipx in range(npx): + Y[ihy, ihx, ifr] += X[ipy, ipx, ifr] * np.exp( + -1j + * 2 + * np.pi + * f[ifr] + * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) + ) + return Y + + +@jit(nopython=True, parallel=parallel, nogil=True, cache=True, fastmath=True) +def _aradon_inner_3d(X, Y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, nhx): + for ipy in prange(npy): + for ipx in range(npx): + for ifr in range(flim0, flim1): + for ihy in range(nhy): + for ihx in range(nhx): + X[ipy, ipx, ifr] += Y[ihy, ihx, ifr] * np.exp( + 1j + * 2 + * np.pi + * f[ifr] + * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) + ) + return X diff --git a/pylops/signalprocessing/_nonstatconvolve2d_cuda.py b/pylops/signalprocessing/_nonstatconvolve2d_cuda.py index 5de400bb..feba8ed2 100644 --- a/pylops/signalprocessing/_nonstatconvolve2d_cuda.py +++ b/pylops/signalprocessing/_nonstatconvolve2d_cuda.py @@ -100,9 +100,9 @@ def _matvec_rmatvec_call( ): """Caller for NonStationaryConvolve2D operator - Caller for cuda implementation of matvec and rmatvec for NonStationaryConvolve2D operato, with same signature + Caller for cuda implementation of matvec and rmatvec for NonStationaryConvolve2D operator, with same signature as numpy/numba counterparts. See :class:`pylops.signalprocessing.NonStationaryConvolve2D` for details about - input parameters. + input parameters. """ _matvec_rmatvec[num_blocks, num_threads_per_blocks]( diff --git a/pylops/signalprocessing/fourierradon2d.py b/pylops/signalprocessing/fourierradon2d.py index 7a883321..6c4bac97 100755 --- a/pylops/signalprocessing/fourierradon2d.py +++ b/pylops/signalprocessing/fourierradon2d.py @@ -26,8 +26,8 @@ class FourierRadon2D(LinearOperator): r"""2D Fourier Radon transform Apply Radon forward (and adjoint) transform using Fast - Fourier Transform to a 2-dimensional array of size - :math:`[n_x \times n_t]` (both in forward and adjoint mode). + Fourier Transform to a 2-dimensional array of size :math:`[n_{p_x} \times n_t]` + (and :math:`[n_x \times n_t]`). Note that forward and adjoint follow the same convention of the time-space implementation in :class:`pylops.signalprocessing.Radon2D`. @@ -73,23 +73,23 @@ class FourierRadon2D(LinearOperator): .. math:: \begin{bmatrix} - \mathbf{m}(p_{x,1}, \omega_i) \\ - \mathbf{m}(p_{x,2}, \omega_i) \\ + m(p_{x,1}, \omega_i) \\ + m(p_{x,2}, \omega_i) \\ \vdots \\ - \mathbf{m}(p_{x,N_p}, \omega_i) + m(p_{x,N_p}, \omega_i) \end{bmatrix} = \begin{bmatrix} - e^{-j \omega_i p_{x,1} x^l_1} & e^{-j \omega_i p_{x,1} x^l_2} & \ldots & e^{-j \omega_i p_{x,2} x^l_{N_x}} \\ + e^{-j \omega_i p_{x,1} x^l_1} & e^{-j \omega_i p_{x,1} x^l_2} & \ldots & e^{-j \omega_i p_{x,1} x^l_{N_x}} \\ e^{-j \omega_i p_{x,2} x^l_1} & e^{-j \omega_i p_{x,2} x^l_2} & \ldots & e^{-j \omega_i p_{x,2} x^l_{N_x}} \\ \vdots & \vdots & \ddots & \vdots \\ e^{-j \omega_i p_{x,N_p} x^l_1} & e^{-j \omega_i p_{x,N_p} x^l_2} & \ldots & e^{-j \omega_i p_{x,N_p} x^l_{N_x}} \\ \end{bmatrix} \begin{bmatrix} - \mathbf{d}(x_1, \omega_i) \\ - \mathbf{d}(x_2, \omega_i) \\ + d(x_1, \omega_i) \\ + d(x_2, \omega_i) \\ \vdots \\ - \mathbf{d}(x_{N_x}, \omega_i) + d(x_{N_x}, \omega_i) \end{bmatrix} where :math:`l=1,2`. Similarly the forward mode is implemented by applying the diff --git a/pylops/signalprocessing/fourierradon3d.py b/pylops/signalprocessing/fourierradon3d.py new file mode 100755 index 00000000..f7f5be87 --- /dev/null +++ b/pylops/signalprocessing/fourierradon3d.py @@ -0,0 +1,327 @@ +__all__ = ["FourierRadon3D"] + +import logging +from typing import Optional, Tuple + +import numpy as np +import scipy as sp + +from pylops import LinearOperator +from pylops.utils import deps +from pylops.utils.backend import get_array_module, get_complex_dtype +from pylops.utils.decorators import reshaped +from pylops.utils.typing import DTypeLike, NDArray + +jit_message = deps.numba_import("the radon2d module") + +if jit_message is None: + + # from ._fourierradon3d_cuda import _aradon_inner_3d_cuda, _radon_inner_3d_cuda + from ._fourierradon3d_numba import _aradon_inner_3d, _radon_inner_3d + +logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.WARNING) + + +class FourierRadon3D(LinearOperator): + r"""3D Fourier Radon transform + + Apply Radon forward (and adjoint) transform using Fast + Fourier Transform to a 3-dimensional array of size :math:`[n_{p_y} \times n_{p_x} \times n_t]` + (and :math:`[n_y \times n_x \times n_t]`). + + Note that forward and adjoint follow the same convention of the time-space + implementation in :class:`pylops.signalprocessing.Radon3D`. + + Parameters + ---------- + taxis : :obj:`np.ndarray` + Time axis + hxaxis : :obj:`np.ndarray` + Fast patial axis + hyaxis : :obj:`np.ndarray` + Slow spatial axis + pyaxis : :obj:`np.ndarray` + Axis of scanning variable :math:`p_y` of parametric curve + pxaxis : :obj:`np.ndarray` + Axis of scanning variable :math:`p_x` of parametric curve + nfft : :obj:`int` + Number of samples in Fourier transform + flims : :obj:`tuple`, optional + Indices of lower and upper limits of Fourier axis to be used in + the application of the Radon matrix (if ``None``, use entire axis) + kind : :obj:`tuple`, optional + Curves to be used for stacking/spreading along the y- and x- axes + (``linear``, ``parabolic``) + engine : :obj:`str`, optional + Engine used for computation (``numpy`` or ``numba`` or ``cuda``) + num_threads_per_blocks : :obj:`tuple`, optional + Number of threads in each block (only when ``engine=cuda``) + dtype : :obj:`str`, optional + Type of elements in input array. + name : :obj:`str`, optional + Name of operator (to be used by :func:`pylops.utils.describe.describe`) + + Attributes + ---------- + shape : :obj:`tuple` + Operator shape + explicit : :obj:`bool` + Operator contains a matrix that can be solved explicitly (``True``) or + not (``False``) + + Notes + ----- + The FourierRadon3D operator applies the Radon transform in the frequency domain. + After transforming a 3-dimensional array of size + :math:`[n_y \times n_x \times n_t]` into the frequency domain, the following linear + transformation is applied to each frequency component in adjoint mode: + + .. math:: + \begin{bmatrix} + \mathbf{m}(p_{y,1}, \mathbf{p}_{x}, \omega_i) \\ + \mathbf{m}(p_{y,2}, \mathbf{p}_{x}, \omega_i) \\ + \vdots \\ + \mathbf{m}(p_{y,N_{py}}, \mathbf{p}_{x}, \omega_i) + \end{bmatrix} + = + \begin{bmatrix} + e^{-j \omega_i (p_{y,1} y^l_1 + \mathbf{p}_x \cdot \mathbf{x}^l)} & e^{-j \omega_i (p_{y,1} y^l_2 + \mathbf{p}_x \cdot \mathbf{x}^l)} & \ldots & e^{-j \omega_i (p_{y,1} y^l_{N_y} + \mathbf{p}_x \cdot \mathbf{x}^l)} \\ + e^{-j \omega_i (p_{y,2} y^l_1 + \mathbf{p}_x \cdot \mathbf{x}^l)} & e^{-j \omega_i (p_{y,2} y^l_2 + \mathbf{p}_x \cdot \mathbf{x}^l)} & \ldots & e^{-j \omega_i (p_{y,2} y^l_{N_y} + \mathbf{p}_x \cdot \mathbf{x}^l)} \\ + \vdots & \vdots & \ddots & \vdots \\ + e^{-j \omega_i (p_{y,N_{py}} y^l_1 + \mathbf{p}_x \cdot \mathbf{x}^l)} & e^{-j \omega_i (p_{y,N_{py}} y^l_2 + \mathbf{p}_x \cdot \mathbf{x}^l)} & \ldots & e^{-j \omega_i (p_{y,N_{py}} y^l_{N_y} + \mathbf{p}_x \cdot \mathbf{x}^l)} \\ + \end{bmatrix} + \begin{bmatrix} + \mathbf{d}(y_1, \mathbf{x}, \omega_i) \\ + \mathbf{d}(y_2, \mathbf{x}, \omega_i) \\ + \vdots \\ + \mathbf{d}(y_{N_y}, \mathbf{x}, \omega_i) + \end{bmatrix} + + where :math:`\cdot` represents the element-wise multiplication of two vectors and + math:`l=1,2`. Similarly the forward mode is implemented by applying the + transpose and complex conjugate of the above matrix to the model transformed to + the Fourier domain. + + Refer to [1]_ for more theoretical and implementation details. + + .. [1] Sacchi, M. "Statistical and Transform Methods for + Geophysical Signal Processing", 2007. + """ + + def __init__( + self, + taxis: NDArray, + hyaxis: NDArray, + hxaxis: NDArray, + pxaxis: NDArray, + pyaxis: NDArray, + nfft: int, + flims: Optional[Tuple[int, int]] = None, + kind: Optional[str] = "linear", + engine: Optional[str] = "numpy", + num_threads_per_blocks: Tuple[int, int] = (32, 32), + dtype: Optional[DTypeLike] = "float64", + name: Optional[str] = "C", + ) -> None: + # engine + if engine not in ["numpy", "numba", "cuda"]: + raise KeyError("engine must be numpy or numba or cuda") + if engine == "numba" and jit_message is not None: + engine = "numpy" + + # dimensions and super + dims = len(pyaxis), len(pxaxis), len(taxis) + dimsd = len(hyaxis), len(hxaxis), len(taxis) + super().__init__(dtype=np.dtype(dtype), dims=dims, dimsd=dimsd, name=name) + + # other input params + self.taxis, self.hyaxis, self.hxaxis = taxis, hyaxis, hxaxis + self.nhy, self.nhx, self.nt = self.dimsd + self.py, self.px = pyaxis, pxaxis + self.npy, self.npx, self.nfft = self.dims[0], self.dims[1], nfft + self.dt = taxis[1] - taxis[0] + self.dhy = hyaxis[1] - hyaxis[0] + self.dhx = hxaxis[1] - hxaxis[0] + self.f = np.fft.rfftfreq(self.nfft, d=self.dt) + self.nfft2 = self.f.size + self.cdtype = get_complex_dtype(dtype) + + self.flims = flims + if flims is None: + self.flims = (0, self.nfft2) + + if kind[0] == "parabolic": + self.hyaxis = self.hyaxis**2 + if kind[1] == "parabolic": + self.hxaxis = self.hxaxis**2 + + # create additional input parameters for engine=cuda + """ + if engine == "cuda": + self.num_threads_per_blocks = num_threads_per_blocks + ( + num_threads_per_blocks_hpx, + num_threads_per_blocks_f, + ) = num_threads_per_blocks + num_blocks_px = ( + self.dims[0] + num_threads_per_blocks_hpx - 1 + ) // num_threads_per_blocks_hpx + num_blocks_h = ( + self.dimsd[0] + num_threads_per_blocks_hpx - 1 + ) // num_threads_per_blocks_hpx + num_blocks_f = ( + self.dims[1] + num_threads_per_blocks_f - 1 + ) // num_threads_per_blocks_f + self.num_blocks_matvec = (num_blocks_h, num_blocks_f) + self.num_blocks_rmatvec = (num_blocks_px, num_blocks_f) + """ + self._register_multiplications(engine) + + def _register_multiplications(self, engine: str) -> None: + if engine == "numba" and jit_message is None: + self._matvec = self._matvec_numba + self._rmatvec = self._rmatvec_numba + elif engine == "cuda": + self._matvec = self._matvec_cuda + self._rmatvec = self._rmatvec_cuda + else: + self._matvec = self._matvec_numpy + self._rmatvec = self._rmatvec_numpy + + @reshaped + def _matvec_numpy(self, x: NDArray) -> NDArray: + ncp = get_array_module(x) + x = ncp.fft.rfft(x.reshape(-1, self.dims[-1]), n=self.nfft, axis=-1) + + HY, HX = ncp.meshgrid(self.hyaxis, self.hxaxis, indexing="ij") + PY, PX = ncp.meshgrid(self.py, self.px, indexing="ij") + + HYY, PYY, F = ncp.meshgrid( + HY.ravel(), PY.ravel(), self.f[self.flims[0] : self.flims[1]], indexing="ij" + ) + HXX, PXX, _ = ncp.meshgrid( + HX.ravel(), PX.ravel(), self.f[self.flims[0] : self.flims[1]], indexing="ij" + ) + + y = ncp.zeros((self.nhy * self.nhx, self.nfft2), dtype=self.cdtype) + y[:, self.flims[0] : self.flims[1]] = ncp.einsum( + "ijk,jk->ik", + ncp.exp(-1j * 2 * ncp.pi * F * (PYY * HYY + PXX * HXX)), + x[:, self.flims[0] : self.flims[1]], + ) + y = ncp.real(ncp.fft.irfft(y, n=self.nfft, axis=-1))[:, : self.nt] + return y + + @reshaped + def _rmatvec_numpy(self, y: NDArray) -> NDArray: + ncp = get_array_module(y) + y = ncp.fft.rfft(y.reshape(-1, self.dimsd[-1]), n=self.nfft, axis=-1) + + HY, HX = ncp.meshgrid(self.hyaxis, self.hxaxis, indexing="ij") + PY, PX = ncp.meshgrid(self.py, self.px, indexing="ij") + + PYY, HYY, F = ncp.meshgrid( + PY.ravel(), HY.ravel(), self.f[self.flims[0] : self.flims[1]], indexing="ij" + ) + PXX, HXX, _ = ncp.meshgrid( + PX.ravel(), HX.ravel(), self.f[self.flims[0] : self.flims[1]], indexing="ij" + ) + + x = ncp.zeros((self.npy * self.npx, self.nfft2), dtype=self.cdtype) + x[:, self.flims[0] : self.flims[1]] = ncp.einsum( + "ijk,jk->ik", + ncp.exp(1j * 2 * ncp.pi * F * (PYY * HYY + PXX * HXX)), + y[:, self.flims[0] : self.flims[1]], + ) + x = ncp.real(ncp.fft.irfft(x, n=self.nfft, axis=-1))[:, : self.nt] + return x + + @reshaped + def _matvec_cuda(self, x: NDArray) -> NDArray: + ncp = get_array_module(x) + y = ncp.zeros((self.nh, self.nfft2), dtype=self.cdtype) + + x = ncp.fft.rfft(x, n=self.nfft, axis=-1) + y = _radon_inner_2d_cuda( + x, + y, + ncp.asarray(self.f), + self.px, + self.haxis, + self.flims[0], + self.flims[1], + self.npx, + self.nh, + num_blocks=self.num_blocks_matvec, + num_threads_per_blocks=self.num_threads_per_blocks, + ) + y = ncp.real(ncp.fft.irfft(y, n=self.nfft, axis=-1))[:, : self.nt] + return y + + @reshaped + def _rmatvec_cuda(self, y: NDArray) -> NDArray: + ncp = get_array_module(y) + x = ncp.zeros((self.npx, self.nfft2), dtype=self.cdtype) + + y = ncp.fft.rfft(y, n=self.nfft, axis=-1) + x = _aradon_inner_2d_cuda( + x, + y, + ncp.asarray(self.f), + self.px, + self.haxis, + self.flims[0], + self.flims[1], + self.npx, + self.nh, + num_blocks=self.num_blocks_rmatvec, + num_threads_per_blocks=self.num_threads_per_blocks, + ) + x = ncp.real(ncp.fft.irfft(x, n=self.nfft, axis=-1))[:, : self.nt] + return x + + @reshaped + def _matvec_numba(self, x: NDArray) -> NDArray: + y = np.zeros((self.nhy, self.nhx, self.nfft2), dtype=self.cdtype) + + x = sp.fft.rfft(x, n=self.nfft, axis=-1) + y = _radon_inner_3d( + x, + y, + self.f, + self.py, + self.px, + self.hyaxis, + self.hxaxis, + self.flims[0], + self.flims[1], + self.npy, + self.npx, + self.nhy, + self.nhx, + ) + y = np.real(sp.fft.irfft(y, n=self.nfft, axis=-1))[:, : self.nt] + return y + + @reshaped + def _rmatvec_numba(self, y: NDArray) -> NDArray: + x = np.zeros((self.npy, self.npx, self.nfft2), dtype=self.cdtype) + + y = sp.fft.rfft(y, n=self.nfft, axis=-1) + x = _aradon_inner_3d( + x, + y, + self.f, + self.py, + self.px, + self.hyaxis, + self.hxaxis, + self.flims[0], + self.flims[1], + self.npy, + self.npx, + self.nhy, + self.nhx, + ) + x = np.real(sp.fft.irfft(x, n=self.nfft, axis=-1))[:, : self.nt] + return x From 26566bed69f7238a73914feb90758d396812a3c7 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Wed, 4 Sep 2024 03:42:12 +0300 Subject: [PATCH 05/35] feat: added cuda backend for FourierRadon3D --- .../signalprocessing/_fourierradon3d_cuda.py | 100 ++++++++++++++++++ pylops/signalprocessing/fourierradon3d.py | 50 +++++---- 2 files changed, 132 insertions(+), 18 deletions(-) create mode 100755 pylops/signalprocessing/_fourierradon3d_cuda.py diff --git a/pylops/signalprocessing/_fourierradon3d_cuda.py b/pylops/signalprocessing/_fourierradon3d_cuda.py new file mode 100755 index 00000000..ffa923db --- /dev/null +++ b/pylops/signalprocessing/_fourierradon3d_cuda.py @@ -0,0 +1,100 @@ +from cmath import exp +from math import pi + +from numba import cuda + + +@cuda.jit() +def _radon_inner_3d_kernel(x, y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, nhx): + """Cuda kernels for FourierRadon3D operator + + Cuda implementation of the on-the-fly kernel creation and application for the + FourierRadon3D operator. See :class:`pylops.signalprocessing.FourierRadon3D` + for details about input parameters. + + """ + ihy, ihx, ifr = cuda.grid(3) + if ihy < nhy and ihx < nhx and ifr >= flim0 and ifr <= flim1: + for ipy in range(npy): + for ipx in range(npx): + y[ihy, ihx, ifr] += x[ipy, ipx, ifr] * exp( + -1j * 2 * pi * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) + ) + + +@cuda.jit() +def _aradon_inner_3d_kernel(x, y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, nhx): + """Cuda kernels for FourierRadon3D operator + + Cuda implementation of the on-the-fly kernel creation and application for the + FourierRadon3D operator. See :class:`pylops.signalprocessing.FourierRadon3D` + for details about input parameters. + + """ + ipy, ipx, ifr = cuda.grid(3) + if ipy < npy and ipx < npx and ifr >= flim0 and ifr <= flim1: + for ihy in range(nhy): + for ihx in range(nhx): + x[ipy, ipx, ifr] += y[ihy, ihx, ifr] * exp( + 1j * 2 * pi * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) + ) + + +def _radon_inner_3d_cuda( + x, + y, + f, + py, + px, + hy, + hx, + flim0, + flim1, + npy, + npx, + nhy, + nhx, + num_blocks=(8, 8), + num_threads_per_blocks=(8, 8), +): + """Caller for FourierRadon2D operator + + Caller for cuda implementation of matvec kernel for FourierRadon3D operator. + See :class:`pylops.signalprocessing.FourierRadon3D` for details about + input parameters. + + """ + _radon_inner_3d_kernel[num_blocks, num_threads_per_blocks]( + x, y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, nhx + ) + return y + + +def _aradon_inner_3d_cuda( + x, + y, + f, + py, + px, + hy, + hx, + flim0, + flim1, + npy, + npx, + nhy, + nhx, + num_blocks=(8, 8), + num_threads_per_blocks=(8, 8), +): + """Caller for FourierRadon3D operator + + Caller for cuda implementation of rmatvec kernel for FourierRadon3D operator. + See :class:`pylops.signalprocessing.FourierRadon3D` for details about + input parameters. + + """ + _aradon_inner_3d_kernel[num_blocks, num_threads_per_blocks]( + x, y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, nhx + ) + return x diff --git a/pylops/signalprocessing/fourierradon3d.py b/pylops/signalprocessing/fourierradon3d.py index f7f5be87..aa3c2b13 100755 --- a/pylops/signalprocessing/fourierradon3d.py +++ b/pylops/signalprocessing/fourierradon3d.py @@ -16,7 +16,7 @@ if jit_message is None: - # from ._fourierradon3d_cuda import _aradon_inner_3d_cuda, _radon_inner_3d_cuda + from ._fourierradon3d_cuda import _aradon_inner_3d_cuda, _radon_inner_3d_cuda from ._fourierradon3d_numba import _aradon_inner_3d, _radon_inner_3d logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.WARNING) @@ -117,7 +117,7 @@ def __init__( pyaxis: NDArray, nfft: int, flims: Optional[Tuple[int, int]] = None, - kind: Optional[str] = "linear", + kind: Optional[str] = ("linear", "linear"), engine: Optional[str] = "numpy", num_threads_per_blocks: Tuple[int, int] = (32, 32), dtype: Optional[DTypeLike] = "float64", @@ -156,25 +156,31 @@ def __init__( self.hxaxis = self.hxaxis**2 # create additional input parameters for engine=cuda - """ if engine == "cuda": self.num_threads_per_blocks = num_threads_per_blocks ( + num_threads_per_blocks_hpy, num_threads_per_blocks_hpx, num_threads_per_blocks_f, ) = num_threads_per_blocks + num_blocks_py = ( + self.dims[0] + num_threads_per_blocks_hpy - 1 + ) // num_threads_per_blocks_hpx num_blocks_px = ( - self.dims[0] + num_threads_per_blocks_hpx - 1 + self.dims[1] + num_threads_per_blocks_hpx - 1 + ) // num_threads_per_blocks_hpx + num_blocks_hy = ( + self.dimsd[0] + num_threads_per_blocks_hpy - 1 ) // num_threads_per_blocks_hpx - num_blocks_h = ( - self.dimsd[0] + num_threads_per_blocks_hpx - 1 + num_blocks_hx = ( + self.dimsd[1] + num_threads_per_blocks_hpx - 1 ) // num_threads_per_blocks_hpx num_blocks_f = ( - self.dims[1] + num_threads_per_blocks_f - 1 + self.dims[2] + num_threads_per_blocks_f - 1 ) // num_threads_per_blocks_f - self.num_blocks_matvec = (num_blocks_h, num_blocks_f) - self.num_blocks_rmatvec = (num_blocks_px, num_blocks_f) - """ + self.num_blocks_matvec = (num_blocks_hy, num_blocks_hx, num_blocks_f) + self.num_blocks_rmatvec = (num_blocks_py, num_blocks_px, num_blocks_f) + self._register_multiplications(engine) def _register_multiplications(self, engine: str) -> None: @@ -239,19 +245,23 @@ def _rmatvec_numpy(self, y: NDArray) -> NDArray: @reshaped def _matvec_cuda(self, x: NDArray) -> NDArray: ncp = get_array_module(x) - y = ncp.zeros((self.nh, self.nfft2), dtype=self.cdtype) + y = ncp.zeros((self.nhy, self.nhx, self.nfft2), dtype=self.cdtype) x = ncp.fft.rfft(x, n=self.nfft, axis=-1) - y = _radon_inner_2d_cuda( + y = _radon_inner_3d_cuda( x, y, ncp.asarray(self.f), + self.py, self.px, - self.haxis, + self.hyaxis, + self.hxaxis, self.flims[0], self.flims[1], + self.npy, self.npx, - self.nh, + self.nhy, + self.nhx, num_blocks=self.num_blocks_matvec, num_threads_per_blocks=self.num_threads_per_blocks, ) @@ -261,19 +271,23 @@ def _matvec_cuda(self, x: NDArray) -> NDArray: @reshaped def _rmatvec_cuda(self, y: NDArray) -> NDArray: ncp = get_array_module(y) - x = ncp.zeros((self.npx, self.nfft2), dtype=self.cdtype) + x = ncp.zeros((self.npy, self.npx, self.nfft2), dtype=self.cdtype) y = ncp.fft.rfft(y, n=self.nfft, axis=-1) - x = _aradon_inner_2d_cuda( + x = _aradon_inner_3d_cuda( x, y, ncp.asarray(self.f), + self.py, self.px, - self.haxis, + self.hyaxis, + self.hxaxis, self.flims[0], self.flims[1], + self.npy, self.npx, - self.nh, + self.nhy, + self.nhx, num_blocks=self.num_blocks_rmatvec, num_threads_per_blocks=self.num_threads_per_blocks, ) From 69ca79659e65e9bc8a6a8ce059955ce3d3711989 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Thu, 5 Sep 2024 22:22:03 +0300 Subject: [PATCH 06/35] feat: added parabolic3d method --- docs/source/api/others.rst | 1 + examples/plot_seismicevents.py | 35 +++++++- pylops/signalprocessing/fourierradon2d.py | 7 +- pylops/signalprocessing/fourierradon3d.py | 20 ++++- pylops/utils/seismicevents.py | 103 +++++++++++++++++++++- 5 files changed, 157 insertions(+), 9 deletions(-) diff --git a/docs/source/api/others.rst b/docs/source/api/others.rst index a26d0cd7..82f5a7b1 100755 --- a/docs/source/api/others.rst +++ b/docs/source/api/others.rst @@ -118,6 +118,7 @@ Synthetics seismicevents.parabolic2d seismicevents.hyperbolic2d seismicevents.linear3d + seismicevents.parabolic3d seismicevents.hyperbolic3d .. currentmodule:: pylops.waveeqprocessing diff --git a/examples/plot_seismicevents.py b/examples/plot_seismicevents.py index 27b6e9fc..03ebaaf5 100644 --- a/examples/plot_seismicevents.py +++ b/examples/plot_seismicevents.py @@ -106,11 +106,21 @@ ############################################ # Let's finally repeat the same exercise in 3d phi = [20, 0, -10] +py = [0, 0, 0] +pyy = [3e-5, 1e-5, 5e-6] mlin, mlinwav = pylops.utils.seismicevents.linear3d( x, y, t, v, t0, theta, phi, amp, wav ) +mpar, mparwav = pylops.utils.seismicevents.parabolic3d( + x, y, t, t0, px, py, pxx, pyy, amp, wav +) + +mhyp, mhypwav = pylops.utils.seismicevents.hyperbolic3d( + x, y, t, t0, vrms, vrms, amp, wav +) + fig, axs = plt.subplots(1, 2, figsize=(7, 5), sharey=True) fig.suptitle("Linear events in 3d", fontsize=12, fontweight="bold", y=0.95) axs[0].imshow( @@ -135,9 +145,30 @@ ) axs[1].set_xlabel(r"$y(m)$") -mhyp, mhypwav = pylops.utils.seismicevents.hyperbolic3d( - x, y, t, t0, vrms, vrms, amp, wav +fig, axs = plt.subplots(1, 2, figsize=(7, 5), sharey=True) +fig.suptitle("Parabolic events in 3d", fontsize=12, fontweight="bold", y=0.95) +axs[0].imshow( + mparwav[par["ny"] // 2].T, + aspect="auto", + interpolation="nearest", + vmin=-2, + vmax=2, + cmap="gray", + extent=(x.min(), x.max(), t.max(), t.min()), +) +axs[0].set_xlabel(r"$x(m)$") +axs[0].set_ylabel(r"$t(s)$") +axs[1].imshow( + mparwav[:, par["nx"] // 2].T, + aspect="auto", + interpolation="nearest", + vmin=-2, + vmax=2, + cmap="gray", + extent=(y.min(), y.max(), t.max(), t.min()), ) +axs[1].set_xlabel(r"$y(m)$") + fig, axs = plt.subplots(1, 2, figsize=(7, 5), sharey=True) fig.suptitle("Hyperbolic events in 3d", fontsize=12, fontweight="bold", y=0.95) diff --git a/pylops/signalprocessing/fourierradon2d.py b/pylops/signalprocessing/fourierradon2d.py index 6c4bac97..7a3be701 100755 --- a/pylops/signalprocessing/fourierradon2d.py +++ b/pylops/signalprocessing/fourierradon2d.py @@ -64,6 +64,11 @@ class FourierRadon2D(LinearOperator): Operator contains a matrix that can be solved explicitly (``True``) or not (``False``) + Raises + ------ + NotImplementedError + If ``engine`` is neither ``numpy``, ``numba``, nor ``cuda``. + Notes ----- The FourierRadon2D operator applies the Radon transform in the frequency domain. @@ -118,7 +123,7 @@ def __init__( ) -> None: # engine if engine not in ["numpy", "numba", "cuda"]: - raise KeyError("engine must be numpy or numba or cuda") + raise NotImplementedError("engine must be numpy or numba or cuda") if engine == "numba" and jit_message is not None: engine = "numpy" diff --git a/pylops/signalprocessing/fourierradon3d.py b/pylops/signalprocessing/fourierradon3d.py index aa3c2b13..3c207a8a 100755 --- a/pylops/signalprocessing/fourierradon3d.py +++ b/pylops/signalprocessing/fourierradon3d.py @@ -37,7 +37,7 @@ class FourierRadon3D(LinearOperator): taxis : :obj:`np.ndarray` Time axis hxaxis : :obj:`np.ndarray` - Fast patial axis + Fast spatial axis hyaxis : :obj:`np.ndarray` Slow spatial axis pyaxis : :obj:`np.ndarray` @@ -51,7 +51,8 @@ class FourierRadon3D(LinearOperator): the application of the Radon matrix (if ``None``, use entire axis) kind : :obj:`tuple`, optional Curves to be used for stacking/spreading along the y- and x- axes - (``linear``, ``parabolic``) + (``("linear", "linear")``, ``("linear", "parabolic")``, + ``("parabolic", "linear")``, or ``("parabolic", "parabolic")``) engine : :obj:`str`, optional Engine used for computation (``numpy`` or ``numba`` or ``cuda``) num_threads_per_blocks : :obj:`tuple`, optional @@ -69,6 +70,13 @@ class FourierRadon3D(LinearOperator): Operator contains a matrix that can be solved explicitly (``True``) or not (``False``) + Raises + ------ + NotImplementedError + If ``engine`` is neither ``numpy``, ``numba``, nor ``cuda``. + ValueError + If ``kind`` is not a tuple of two elements. + Notes ----- The FourierRadon3D operator applies the Radon transform in the frequency domain. @@ -117,7 +125,7 @@ def __init__( pyaxis: NDArray, nfft: int, flims: Optional[Tuple[int, int]] = None, - kind: Optional[str] = ("linear", "linear"), + kind: Optional[tuple] = ("linear", "linear"), engine: Optional[str] = "numpy", num_threads_per_blocks: Tuple[int, int] = (32, 32), dtype: Optional[DTypeLike] = "float64", @@ -125,10 +133,14 @@ def __init__( ) -> None: # engine if engine not in ["numpy", "numba", "cuda"]: - raise KeyError("engine must be numpy or numba or cuda") + raise NotImplementedError("engine must be numpy or numba or cuda") if engine == "numba" and jit_message is not None: engine = "numpy" + # kind + if not isinstance(kind, (tuple, list)) and len(kind) != 2: + raise ValueError("kind must be a tuple of two elements") + # dimensions and super dims = len(pyaxis), len(pxaxis), len(taxis) dimsd = len(hyaxis), len(hxaxis), len(taxis) diff --git a/pylops/utils/seismicevents.py b/pylops/utils/seismicevents.py index 1844c82d..1c03743e 100755 --- a/pylops/utils/seismicevents.py +++ b/pylops/utils/seismicevents.py @@ -4,6 +4,7 @@ "parabolic2d", "hyperbolic2d", "linear3d", + "parabolic3d", "hyperbolic3d", ] @@ -160,7 +161,7 @@ def parabolic2d( r"""Parabolic 2D events Create 2d parabolic events given intercept time, - slowness, curvature, and amplitude of each event + slowness, curvature, and amplitude of each event. Parameters ---------- @@ -330,7 +331,7 @@ def linear3d( v : :obj:`float` propagation velocity t0 : :obj:`tuple` or :obj:`float` - intercept time at :math:`x=0` of each linear event + intercept time at :math:`x=0` and :math:`y=0` of each linear event theta : :obj:`tuple` or :obj:`float` angle in x direction (in degrees) of each linear event phi : :obj:`tuple` or :obj:`float` @@ -397,6 +398,104 @@ def linear3d( return d, dwav +def parabolic3d( + x: npt.NDArray, + y: npt.NDArray, + t: npt.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]: + r"""Parabolic 3D events + + Create 3d parabolic events given intercept time, + slowness, curvature, and amplitude of each event. + + Parameters + ---------- + x : :obj:`numpy.ndarray` + space axis in x direction + y : :obj:`numpy.ndarray` + space axis in y direction + t : :obj:`numpy.ndarray` + time axis + t0 : :obj:`tuple` or :obj:`float` + intercept time at :math:`x=0` and :math:`y=0` of each parabolic event + px : :obj:`tuple` or :obj:`float` + slowness of each parabolic event in x direction + py : :obj:`tuple` or :obj:`float` + slowness of each parabolic event in y direction + pxx : :obj:`tuple` or :obj:`float` + curvature of each parabolic event + amp : :obj:`tuple` or :obj:`float` + amplitude of each linear event + wav : :obj:`numpy.ndarray` + wavelet to be applied to data + + Returns + ------- + d : :obj:`numpy.ndarray` + data without wavelet of size + :math:`[n_y \times n_x \times n_t]` + dwav : :obj:`numpy.ndarray` + data with wavelet of size + :math:`[n_y \times n_x \times n_t]` + + Notes + ----- + Each event is created using the following relation: + + .. math:: + t_i(x, y) = t_{0,i} + p_{x,i} x + p_{y,i} x + p_{xx,i} x^2 + p_{yy,i} y^2 + + """ + if isinstance(t0, (float, int)): + t0 = (t0,) + if isinstance(px, (float, int)): + px = (px,) + if isinstance(py, (float, int)): + py = (py,) + if isinstance(pxx, (float, int)): + pxx = (pxx,) + if isinstance(pyy, (float, int)): + pyy = (pyy,) + + # identify dimensions + dt = t[1] - t[0] + wcenter = int(len(wav) / 2) + nx = np.size(x) + ny = np.size(y) + nt = np.size(t) + wcenter + nevents = np.size(t0) + + # create events + d = np.zeros((ny, nx, nt)) + for ievent in range(nevents): + for iy in range(ny): + tevent = ( + t0[ievent] + + px[ievent] * x + + py[ievent] * y[iy] + + pxx[ievent] * x**2 + + pyy[ievent] * y[iy] ** 2 + ) + tevent = (tevent - t[0]) / dt + itevent = tevent.astype(int) + dtevent = tevent - itevent + for ix in range(nx): + if itevent[ix] < nt - 1 and itevent[ix] >= 0: + d[iy, ix, itevent[ix]] += amp[ievent] * (1 - dtevent[ix]) + d[iy, ix, itevent[ix] + 1] += amp[ievent] * dtevent[ix] + + # filter events with certain wavelet + d, dwav = _filterdata(d, nt, wav, wcenter) + return d, dwav + + def hyperbolic3d( x: npt.NDArray, y: npt.NDArray, From 66f4b0f0ca9a9ede3a70123a09ea4cb5cef27946 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Fri, 6 Sep 2024 20:50:54 +0300 Subject: [PATCH 07/35] test: added tests for FourierRadon operators --- docs/source/gpu.rst | 8 + examples/plot_fourierradon.py | 238 ++++++++++++++++++++-- pylops/signalprocessing/fourierradon2d.py | 2 + pylops/signalprocessing/fourierradon3d.py | 16 +- pylops/signalprocessing/radon3d.py | 4 +- pytests/test_fourierradon.py | 127 +++++------- 6 files changed, 292 insertions(+), 103 deletions(-) diff --git a/docs/source/gpu.rst b/docs/source/gpu.rst index a2d7d9f1..ecc87120 100755 --- a/docs/source/gpu.rst +++ b/docs/source/gpu.rst @@ -281,6 +281,14 @@ Signal processing: - |:white_check_mark:| - |:red_circle:| - |:red_circle:| + * - :class:`pylops.signalprocessing.FourierRadon2D` + - |:white_check_mark:| + - |:white_check_mark:| + - |:red_circle:| + * - :class:`pylops.signalprocessing.FourierRadon3D` + - |:white_check_mark:| + - |:white_check_mark:| + - |:red_circle:| * - :class:`pylops.signalprocessing.ChirpRadon2D` - |:white_check_mark:| - |:white_check_mark:| diff --git a/examples/plot_fourierradon.py b/examples/plot_fourierradon.py index c59d21bb..0ab32f71 100644 --- a/examples/plot_fourierradon.py +++ b/examples/plot_fourierradon.py @@ -2,12 +2,14 @@ Fourier Radon Transform ======================= This example shows how to use the :py:class:`pylops.signalprocessing.FourierRadon2D` -operator to apply the linear and parabolic Radon Transform to 2-dimensional signals. +and :py:class:`pylops.signalprocessing.FourierRadon3D` operators to apply the linear +and parabolic Radon Transform to 2-dimensional or 3-dimensional signals, respectively. -This operator provides a transformation equivalent to that of -:py:class:`pylops.signalprocessing.Radon2D`, however since the shift-and-sum step -is performed in the frequency domain, this is analytically correct (compared to -performing to shifting the data via nearest or linear interpolation). +These operators provides transformations equivalent to those of +:py:class:`pylops.signalprocessing.Radon2D` and :py:class:`pylops.signalprocessing.Radon3D`, +however since the shift-and-sum step is performed in the frequency domain, +this is analytically correct (compared to performing to shifting the data via +nearest or linear interpolation). """ import matplotlib.pyplot as plt @@ -49,7 +51,7 @@ ############################################################################### -# We can now define our operators and apply the forward, adjoint and inverse +# We can now define our operators and apply the forward and adjoint # steps. nfft = int(2 ** np.ceil(np.log2(par["nt"]))) npx, pxmax = 2 * par["nx"], 5e-4 @@ -58,28 +60,28 @@ R2Op = pylops.signalprocessing.FourierRadon2D( t, x, px, nfft, kind="linear", engine="numpy", dtype="float64" ) -dL_chirp = R2Op.H * d -dadj_chirp = R2Op * dL_chirp +dL = R2Op.H * d +dadj = R2Op * dL fig, axs = plt.subplots(1, 3, figsize=(12, 4), sharey=True) axs[0].imshow(d.T, vmin=-1, vmax=1, cmap="bwr_r", extent=(x[0], x[-1], t[-1], t[0])) axs[0].set(xlabel=r"$x$ [m]", ylabel=r"$t$ [s]", title="Input linear") axs[0].axis("tight") axs[1].imshow( - dL_chirp.T, + dL.T, cmap="bwr_r", - vmin=-dL_chirp.max(), - vmax=dL_chirp.max(), + vmin=-dL.max(), + vmax=dL.max(), extent=(1e3 * px[0], 1e3 * px[-1], t[-1], t[0]), ) axs[1].scatter(1e3 * np.sin(np.deg2rad(theta[0])) / 1500.0, t0[0], s=50, color="r") axs[1].set(xlabel=r"$p$ [s/km]", title="Radon") axs[1].axis("tight") axs[2].imshow( - dadj_chirp.T, + dadj.T, cmap="bwr_r", - vmin=-dadj_chirp.max(), - vmax=dadj_chirp.max(), + vmin=-dadj.max(), + vmax=dadj.max(), extent=(x[0], x[-1], t[-1], t[0]), ) axs[2].set(xlabel=r"$x$ [m]", title="Adj Radon") @@ -101,30 +103,222 @@ R2Op = pylops.signalprocessing.FourierRadon2D( t, x, px, nfft, kind="parabolic", engine="numpy", dtype="float64" ) -dL_chirp = R2Op.H * d -dadj_chirp = R2Op * dL_chirp +dL = R2Op.H * d +dadj = R2Op * dL fig, axs = plt.subplots(1, 3, figsize=(12, 4), sharey=True) axs[0].imshow(d.T, vmin=-1, vmax=1, cmap="bwr_r", extent=(x[0], x[-1], t[-1], t[0])) axs[0].set(xlabel=r"$x$ [m]", ylabel=r"$t$ [s]", title="Input parabolic") axs[0].axis("tight") axs[1].imshow( - dL_chirp.T, + dL.T, cmap="bwr_r", - vmin=-dL_chirp.max(), - vmax=dL_chirp.max(), + vmin=-dL.max(), + vmax=dL.max(), extent=(1e3 * px[0], 1e3 * px[-1], t[-1], t[0]), ) axs[1].scatter(1e3 * pxx[0], t0[0], s=50, color="r") axs[1].set(xlabel=r"$p$ [s/km]", title="Radon") axs[1].axis("tight") axs[2].imshow( - dadj_chirp.T, + dadj.T, cmap="bwr_r", - vmin=-dadj_chirp.max(), - vmax=dadj_chirp.max(), + vmin=-dadj.max(), + vmax=dadj.max(), extent=(x[0], x[-1], t[-1], t[0]), ) axs[2].set(xlabel=r"$x$ [m]", title="Adj Radon") axs[2].axis("tight") plt.tight_layout() + +############################################################################### +# Finally we repeat the same exercise with 3d data. + +par = { + "ot": 0, + "dt": 0.004, + "nt": 51, + "ox": -100, + "dx": 10, + "nx": 21, + "oy": -200, + "dy": 10, + "ny": 41, + "f0": 20, +} +theta = [30] +phi = [10] +t0 = [0.1] +amp = [1.0] + +# Create axes +t, t2, x, y = pylops.utils.seismicevents.makeaxis(par) +dt, dx, dy = par["dt"], par["dx"], par["dy"] + +# Generate linear data +pxx = np.sin(np.deg2rad(theta[0])) * np.cos(np.deg2rad(phi[0])) / 1500.0 +pyy = np.sin(np.deg2rad(theta[0])) * np.sin(np.deg2rad(phi[0])) / 1500.0 +_, d = pylops.utils.seismicevents.linear3d(x, y, t, 1500.0, t0, theta, phi, amp, wav) + +# Linear Radon +npy, pymax = par["ny"], 5e-4 +npx, pxmax = par["nx"], 5e-4 +py = np.linspace(-pymax, pymax, npy) +px = np.linspace(-pxmax, pxmax, npx) + +R3Op = pylops.signalprocessing.FourierRadon3D( + t, y, x, py, px, nfft, kind=("linear", "linear"), engine="numpy", dtype="float64" +) +dL = R3Op.H * d +dadj = R3Op * dL + +fig, axs = plt.subplots(1, 3, figsize=(12, 4), sharey=True) +axs[0].imshow( + d[par["ny"] // 2].T, + vmin=-1, + vmax=1, + cmap="bwr_r", + extent=(x[0], x[-1], t[-1], t[0]), +) +axs[0].set(xlabel=r"$x$ [m]", ylabel=r"$t$ [s]", title="Input linear 3d - y") +axs[0].axis("tight") +axs[1].imshow( + dL[np.argmin(np.abs(pyy - py))].T, + cmap="bwr_r", + vmin=-dL.max(), + vmax=dL.max(), + extent=(1e3 * px[0], 1e3 * px[-1], t[-1], t[0]), +) +axs[1].scatter(1e3 * pxx, t0[0], s=50, color="r") +axs[1].set(xlabel=r"$p_x$ [s/km]", title="Radon 3d - y") +axs[1].axis("tight") +axs[2].imshow( + dadj[par["ny"] // 2].T, + cmap="bwr_r", + vmin=-dadj.max(), + vmax=dadj.max(), + extent=(x[0], x[-1], t[-1], t[0]), +) +axs[2].set(xlabel=r"$x$ [m]", title="Adj Radon 3d - y") +axs[2].axis("tight") +plt.tight_layout() + +fig, axs = plt.subplots(1, 3, figsize=(12, 4), sharey=True) +axs[0].imshow( + d[:, par["nx"] // 2].T, + vmin=-1, + vmax=1, + cmap="bwr_r", + extent=(x[0], x[-1], t[-1], t[0]), +) +axs[0].set(xlabel=r"$y$ [m]", ylabel=r"$t$ [s]", title="Input linear 3d - x") +axs[0].axis("tight") +axs[1].imshow( + dL[:, np.argmin(np.abs(pxx - px))].T, + cmap="bwr_r", + vmin=-dL.max(), + vmax=dL.max(), + extent=(1e3 * py[0], 1e3 * py[-1], t[-1], t[0]), +) +axs[1].scatter(1e3 * pyy, t0[0], s=50, color="r") +axs[1].set(xlabel=r"$p_y$ [s/km]", title="Radon 3d - x") +axs[1].axis("tight") +axs[2].imshow( + dadj[:, par["nx"] // 2].T, + cmap="bwr_r", + vmin=-dadj.max(), + vmax=dadj.max(), + extent=(x[0], x[-1], t[-1], t[0]), +) +axs[2].set(xlabel=r"$y$ [m]", title="Adj Radon 3d - x") +axs[2].axis("tight") +plt.tight_layout() + +# Generate parabolic data +pxx = [1e-6] +pyy = [2e-6] +_, d = pylops.utils.seismicevents.parabolic3d( + x, y, t, t0, 0, 0, np.array(pxx), np.array(pyy), amp, wav +) + +# Parabolic Radon +npy, pymax = par["ny"], 5e-6 +npx, pxmax = par["nx"], 5e-6 +py = np.linspace(-pymax, pymax, npy) +px = np.linspace(-pxmax, pxmax, npx) + +R3Op = pylops.signalprocessing.FourierRadon3D( + t, + y, + x, + py, + px, + nfft, + kind=("parabolic", "parabolic"), + engine="numpy", + dtype="float64", +) +dL = R3Op.H * d +dadj = R3Op * dL + +fig, axs = plt.subplots(1, 3, figsize=(12, 4), sharey=True) +axs[0].imshow( + d[par["ny"] // 2].T, + vmin=-1, + vmax=1, + cmap="bwr_r", + extent=(x[0], x[-1], t[-1], t[0]), +) +axs[0].set(xlabel=r"$x$ [m]", ylabel=r"$t$ [s]", title="Input parabolic 3d - y") +axs[0].axis("tight") +axs[1].imshow( + dL[np.argmin(np.abs(pyy - py))].T, + cmap="bwr_r", + vmin=-dL.max(), + vmax=dL.max(), + extent=(1e3 * px[0], 1e3 * px[-1], t[-1], t[0]), +) +axs[1].scatter(1e3 * pxx[0], t0[0], s=50, color="r") +axs[1].set(xlabel=r"$p_x$ [s/km]", title="Radon 3d - y") +axs[1].axis("tight") +axs[2].imshow( + dadj[par["ny"] // 2].T, + cmap="bwr_r", + vmin=-dadj.max(), + vmax=dadj.max(), + extent=(x[0], x[-1], t[-1], t[0]), +) +axs[2].set(xlabel=r"$x$ [m]", title="Adj Radon 3d - y") +axs[2].axis("tight") +plt.tight_layout() + +fig, axs = plt.subplots(1, 3, figsize=(12, 4), sharey=True) +axs[0].imshow( + d[:, par["nx"] // 2].T, + vmin=-1, + vmax=1, + cmap="bwr_r", + extent=(x[0], x[-1], t[-1], t[0]), +) +axs[0].set(xlabel=r"$y$ [m]", ylabel=r"$t$ [s]", title="Input parabolic 3d - x") +axs[0].axis("tight") +axs[1].imshow( + dL[:, np.argmin(np.abs(pxx - px))].T, + cmap="bwr_r", + vmin=-dL.max(), + vmax=dL.max(), + extent=(1e3 * py[0], 1e3 * py[-1], t[-1], t[0]), +) +axs[1].scatter(1e3 * pyy[0], t0[0], s=50, color="r") +axs[1].set(xlabel=r"$p_y$ [s/km]", title="Radon 3d - x") +axs[1].axis("tight") +axs[2].imshow( + dadj[:, par["nx"] // 2].T, + cmap="bwr_r", + vmin=-dadj.max(), + vmax=dadj.max(), + extent=(x[0], x[-1], t[-1], t[0]), +) +axs[2].set(xlabel=r"$y$ [m]", title="Adj Radon 3d - x") +axs[2].axis("tight") +plt.tight_layout() diff --git a/pylops/signalprocessing/fourierradon2d.py b/pylops/signalprocessing/fourierradon2d.py index 7a3be701..b2868fcf 100755 --- a/pylops/signalprocessing/fourierradon2d.py +++ b/pylops/signalprocessing/fourierradon2d.py @@ -184,6 +184,7 @@ def _register_multiplications(self, engine: str) -> None: @reshaped def _matvec_numpy(self, x: NDArray) -> NDArray: ncp = get_array_module(x) + self.f = ncp.asarray(self.f) x = ncp.fft.rfft(x, n=self.nfft, axis=-1) H, PX, F = ncp.meshgrid( @@ -201,6 +202,7 @@ def _matvec_numpy(self, x: NDArray) -> NDArray: @reshaped def _rmatvec_numpy(self, y: NDArray) -> NDArray: ncp = get_array_module(y) + self.f = ncp.asarray(self.f) y = ncp.fft.rfft(y, n=self.nfft, axis=-1) PX, H, F = ncp.meshgrid( diff --git a/pylops/signalprocessing/fourierradon3d.py b/pylops/signalprocessing/fourierradon3d.py index 3c207a8a..895ee9e2 100755 --- a/pylops/signalprocessing/fourierradon3d.py +++ b/pylops/signalprocessing/fourierradon3d.py @@ -36,10 +36,10 @@ class FourierRadon3D(LinearOperator): ---------- taxis : :obj:`np.ndarray` Time axis - hxaxis : :obj:`np.ndarray` - Fast spatial axis hyaxis : :obj:`np.ndarray` Slow spatial axis + hxaxis : :obj:`np.ndarray` + Fast spatial axis pyaxis : :obj:`np.ndarray` Axis of scanning variable :math:`p_y` of parametric curve pxaxis : :obj:`np.ndarray` @@ -121,8 +121,8 @@ def __init__( taxis: NDArray, hyaxis: NDArray, hxaxis: NDArray, - pxaxis: NDArray, pyaxis: NDArray, + pxaxis: NDArray, nfft: int, flims: Optional[Tuple[int, int]] = None, kind: Optional[tuple] = ("linear", "linear"), @@ -209,6 +209,7 @@ def _register_multiplications(self, engine: str) -> None: @reshaped def _matvec_numpy(self, x: NDArray) -> NDArray: ncp = get_array_module(x) + self.f = ncp.asarray(self.f) x = ncp.fft.rfft(x.reshape(-1, self.dims[-1]), n=self.nfft, axis=-1) HY, HX = ncp.meshgrid(self.hyaxis, self.hxaxis, indexing="ij") @@ -233,6 +234,7 @@ def _matvec_numpy(self, x: NDArray) -> NDArray: @reshaped def _rmatvec_numpy(self, y: NDArray) -> NDArray: ncp = get_array_module(y) + self.f = ncp.asarray(self.f) y = ncp.fft.rfft(y.reshape(-1, self.dimsd[-1]), n=self.nfft, axis=-1) HY, HX = ncp.meshgrid(self.hyaxis, self.hxaxis, indexing="ij") @@ -277,7 +279,7 @@ def _matvec_cuda(self, x: NDArray) -> NDArray: num_blocks=self.num_blocks_matvec, num_threads_per_blocks=self.num_threads_per_blocks, ) - y = ncp.real(ncp.fft.irfft(y, n=self.nfft, axis=-1))[:, : self.nt] + y = ncp.real(ncp.fft.irfft(y, n=self.nfft, axis=-1))[:, :, : self.nt] return y @reshaped @@ -303,7 +305,7 @@ def _rmatvec_cuda(self, y: NDArray) -> NDArray: num_blocks=self.num_blocks_rmatvec, num_threads_per_blocks=self.num_threads_per_blocks, ) - x = ncp.real(ncp.fft.irfft(x, n=self.nfft, axis=-1))[:, : self.nt] + x = ncp.real(ncp.fft.irfft(x, n=self.nfft, axis=-1))[:, :, : self.nt] return x @reshaped @@ -326,7 +328,7 @@ def _matvec_numba(self, x: NDArray) -> NDArray: self.nhy, self.nhx, ) - y = np.real(sp.fft.irfft(y, n=self.nfft, axis=-1))[:, : self.nt] + y = np.real(sp.fft.irfft(y, n=self.nfft, axis=-1))[:, :, : self.nt] return y @reshaped @@ -349,5 +351,5 @@ def _rmatvec_numba(self, y: NDArray) -> NDArray: self.nhy, self.nhx, ) - x = np.real(sp.fft.irfft(x, n=self.nfft, axis=-1))[:, : self.nt] + x = np.real(sp.fft.irfft(x, n=self.nfft, axis=-1))[:, :, : self.nt] return x diff --git a/pylops/signalprocessing/radon3d.py b/pylops/signalprocessing/radon3d.py index 4357b983..939c14ba 100644 --- a/pylops/signalprocessing/radon3d.py +++ b/pylops/signalprocessing/radon3d.py @@ -189,10 +189,10 @@ def Radon3D( ---------- taxis : :obj:`np.ndarray` Time axis - hxaxis : :obj:`np.ndarray` - Fast patial axis hyaxis : :obj:`np.ndarray` Slow spatial axis + hxaxis : :obj:`np.ndarray` + False spatial axis pyaxis : :obj:`np.ndarray` Axis of scanning variable :math:`p_y` of parametric curve pxaxis : :obj:`np.ndarray` diff --git a/pytests/test_fourierradon.py b/pytests/test_fourierradon.py index 36f3f7b6..accbf257 100755 --- a/pytests/test_fourierradon.py +++ b/pytests/test_fourierradon.py @@ -1,11 +1,9 @@ -import multiprocessing - import numpy as np import pytest from numpy.testing import assert_array_almost_equal from pylops.optimization.sparsity import fista -from pylops.signalprocessing import FourierRadon2D +from pylops.signalprocessing import FourierRadon2D, FourierRadon3D from pylops.utils import dottest par1 = { @@ -20,7 +18,7 @@ "kind": "linear", "interp": True, "engine": "numpy", -} # linear, centered, linear interp, numpy +} # linear, numpy par2 = { "nt": 11, "nhx": 21, @@ -29,38 +27,10 @@ "npy": 17, "pymax": 1e-2, "pxmax": 2e-2, - "centeredh": False, - "kind": "linear", - "interp": True, - "engine": "numpy", -} # linear, uncentered, linear interp, numpy -par3 = { - "nt": 11, - "nhx": 21, - "nhy": 10, - "npx": 21, - "npy": 17, - "pymax": 1e-2, - "pxmax": 2e-2, - "centeredh": True, - "kind": "linear", - "interp": True, - "engine": "numba", -} # linear, centered, linear interp, numba -par4 = { - "nt": 11, - "nhx": 21, - "nhy": 10, - "npx": 21, - "npy": 17, - "pymax": 1e-2, - "pxmax": 2e-2, - "centeredh": False, "kind": "linear", - "interp": False, "engine": "numba", -} # linear, uncentered, linear interp, numba -par5 = { +} # linear, numba +par3 = { "nt": 11, "nhx": 21, "nhy": 10, @@ -68,12 +38,10 @@ "npy": 17, "pymax": 8e-3, "pxmax": 7e-3, - "centeredh": True, "kind": "parabolic", - "interp": False, "engine": "numpy", -} # parabolic, centered, no interp, numpy -par6 = { +} # parabolic, numpy +par4 = { "nt": 11, "nhx": 21, "nhy": 10, @@ -81,48 +49,24 @@ "npy": 17, "pymax": 8e-3, "pxmax": 7e-3, - "centeredh": False, "kind": "parabolic", - "interp": True, - "engine": "numba", -} # parabolic, uncentered, interp, numba -par7 = { - "nt": 11, - "nhx": 21, - "nhy": 10, - "npx": 21, - "npy": 17, - "pymax": 9e-2, - "pxmax": 8e-2, - "centeredh": True, - "kind": "hyperbolic", - "interp": True, - "engine": "numpy", -} # hyperbolic, centered, interp, numpy -par8 = { - "nt": 11, - "nhx": 21, - "nhy": 10, - "npx": 21, - "npy": 17, - "pymax": 7e-2, - "pxmax": 8e-2, - "centeredh": False, - "kind": "hyperbolic", - "interp": False, "engine": "numba", -} # hyperbolic, uncentered, interp, numba +} # parabolic, numba -def test_unknown_engine(): +def test_unknown_engine2D(): """Check error is raised if unknown engine is passed""" - with pytest.raises(KeyError): + with pytest.raises(NotImplementedError): _ = FourierRadon2D(None, None, None, None, engine="foo") -@pytest.mark.parametrize( - "par", [(par1), (par2), (par3), (par4), (par5), (par6), (par7), (par8)] -) +def test_unknown_engine3D(): + """Check error is raised if unknown engine is passed""" + with pytest.raises(NotImplementedError): + _ = FourierRadon3D(None, None, None, None, None, None, engine="foo") + + +@pytest.mark.parametrize("par", [(par1), (par2), (par3), (par4)]) def test_FourierRadon2D(par): """Dot-test and sparse inverse for FourierRadon2D operator""" dt, dh = 0.005, 1 @@ -150,3 +94,42 @@ def test_FourierRadon2D(par): if par["engine"] == "numba": # as numpy is too slow here... xinv, _, _ = fista(Rop, y, niter=200, eps=3e0) assert_array_almost_equal(x.ravel(), xinv, decimal=1) + + +@pytest.mark.parametrize("par", [(par1), (par2), (par3), (par4)]) +def test_FourierRadon3D(par): + """Dot-test and sparse inverse for FourierRadon3D operator""" + dt, dhy, dhx = 0.005, 1, 1 + t = np.arange(par["nt"]) * dt + hy = np.arange(par["nhy"]) * dhy + hx = np.arange(par["nhx"]) * dhx + py = np.linspace(0, par["pymax"], par["npy"]) + px = np.linspace(0, par["pxmax"], par["npx"]) + nfft = int(2 ** np.ceil(np.log2(par["nt"]))) + + x = np.zeros((par["npy"], par["npx"], par["nt"])) + x[3, 2, par["nt"] // 2] = 1 + + Rop = FourierRadon3D( + t, + hy, + hx, + py, + px, + nfft, + kind=(par["kind"], par["kind"]), + engine=par["engine"], + dtype="float64", + ) + assert dottest( + Rop, + par["nhy"] * par["nhx"] * par["nt"], + par["npy"] * par["npx"] * par["nt"], + rtol=1e-3, + ) + + y = Rop * x.ravel() + + if par["engine"] == "numba": # as numpy is too slow here... + xinv, _, _ = fista(Rop, y, niter=200, eps=1e1) + assert_array_almost_equal(x.ravel(), xinv, decimal=1) From ae354eea6efa191f5c052f3b4ed305096319a66c Mon Sep 17 00:00:00 2001 From: mrava87 Date: Fri, 13 Sep 2024 15:28:26 +0300 Subject: [PATCH 08/35] fix: import normalize_axis_index differently based on numpy version --- pylops/basicoperators/firstderivative.py | 9 +++- pylops/basicoperators/laplacian.py | 53 +++++++++++++++++------ pylops/basicoperators/secondderivative.py | 10 +++-- pylops/basicoperators/transpose.py | 4 +- pylops/signalprocessing/_baseffts.py | 11 +++-- pylops/signalprocessing/convolvend.py | 6 ++- pylops/signalprocessing/shift.py | 4 +- pylops/utils/backend.py | 21 +++++++++ 8 files changed, 90 insertions(+), 28 deletions(-) diff --git a/pylops/basicoperators/firstderivative.py b/pylops/basicoperators/firstderivative.py index f8bd208e..9117eeff 100644 --- a/pylops/basicoperators/firstderivative.py +++ b/pylops/basicoperators/firstderivative.py @@ -3,7 +3,6 @@ from typing import Callable, Union import numpy as np -from numpy.core.multiarray import normalize_axis_index from pylops import LinearOperator from pylops.utils._internal import _value_or_sized_to_tuple @@ -11,6 +10,14 @@ from pylops.utils.decorators import reshaped from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray +# need to check numpy version since the namespace of normalize_axis_index +# changed from numpy>=2.0.0 +np_version = np.__version__.split(".") +if int(np_version[0]) > 1: + from numpy.lib.array_utils import normalize_axis_index +else: + from numpy.core.multiarray import normalize_axis_index + class FirstDerivative(LinearOperator): r"""First derivative. diff --git a/pylops/basicoperators/laplacian.py b/pylops/basicoperators/laplacian.py index d2f3e64c..99afd457 100644 --- a/pylops/basicoperators/laplacian.py +++ b/pylops/basicoperators/laplacian.py @@ -2,13 +2,20 @@ from typing import Tuple -from pylops.utils.typing import NDArray -from numpy.core.multiarray import normalize_axis_index +import numpy as np from pylops import LinearOperator from pylops.basicoperators import SecondDerivative -from pylops.utils.typing import DTypeLike, InputDimsLike +from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray + +# need to check numpy version since the namespace of normalize_axis_index +# changed from numpy>=2.0.0 +np_version = np.__version__.split(".") +if int(np_version[0]) > 1: + from numpy.lib.array_utils import normalize_axis_index +else: + from numpy.core.multiarray import normalize_axis_index class Laplacian(LinearOperator): @@ -58,13 +65,17 @@ class Laplacian(LinearOperator): """ - def __init__(self, dims: InputDimsLike, - axes: InputDimsLike = (-2, -1), - weights: Tuple[float, ...] = (1, 1), - sampling: Tuple[float, ...] = (1, 1), - edge: bool = False, - kind: str = "centered", - dtype: DTypeLike = "float64", name: str = "L"): + def __init__( + self, + dims: InputDimsLike, + axes: InputDimsLike = (-2, -1), + weights: Tuple[float, ...] = (1, 1), + sampling: Tuple[float, ...] = (1, 1), + edge: bool = False, + kind: str = "centered", + dtype: DTypeLike = "float64", + name: str = "L", + ): axes = tuple(normalize_axis_index(ax, len(dims)) for ax in axes) if not (len(axes) == len(weights) == len(sampling)): raise ValueError("axes, weights, and sampling have different size") @@ -73,8 +84,15 @@ def __init__(self, dims: InputDimsLike, self.sampling = sampling self.edge = edge self.kind = kind - Op = self._calc_l2op(dims=dims, axes=axes, sampling=sampling, edge=edge, kind=kind, dtype=dtype, - weights=weights) + Op = self._calc_l2op( + dims=dims, + axes=axes, + sampling=sampling, + edge=edge, + kind=kind, + dtype=dtype, + weights=weights, + ) super().__init__(Op=Op, name=name) def _matvec(self, x: NDArray) -> NDArray: @@ -84,8 +102,15 @@ def _rmatvec(self, x: NDArray) -> NDArray: return super()._rmatvec(x) @staticmethod - def _calc_l2op(dims: InputDimsLike, axes: InputDimsLike, weights: Tuple[float, ...], sampling: Tuple[float, ...], - edge: bool, kind: str, dtype: DTypeLike): + def _calc_l2op( + dims: InputDimsLike, + axes: InputDimsLike, + weights: Tuple[float, ...], + sampling: Tuple[float, ...], + edge: bool, + kind: str, + dtype: DTypeLike, + ): l2op = SecondDerivative( dims, axis=axes[0], sampling=sampling[0], edge=edge, kind=kind, dtype=dtype ) diff --git a/pylops/basicoperators/secondderivative.py b/pylops/basicoperators/secondderivative.py index 8433987d..d7fe7b8b 100644 --- a/pylops/basicoperators/secondderivative.py +++ b/pylops/basicoperators/secondderivative.py @@ -3,11 +3,15 @@ from typing import Callable, Union import numpy as np -from numpy.core.multiarray import normalize_axis_index from pylops import LinearOperator from pylops.utils._internal import _value_or_sized_to_tuple -from pylops.utils.backend import get_array_module, inplace_add, inplace_set +from pylops.utils.backend import ( + get_array_module, + get_normalize_axis_index, + inplace_add, + inplace_set, +) from pylops.utils.decorators import reshaped from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray @@ -86,7 +90,7 @@ def __init__( dims = _value_or_sized_to_tuple(dims) super().__init__(dtype=np.dtype(dtype), dims=dims, dimsd=dims, name=name) - self.axis = normalize_axis_index(axis, len(self.dims)) + self.axis = get_normalize_axis_index()(axis, len(self.dims)) self.sampling = sampling self.kind = kind self.edge = edge diff --git a/pylops/basicoperators/transpose.py b/pylops/basicoperators/transpose.py index 0ccf05f0..88c99514 100644 --- a/pylops/basicoperators/transpose.py +++ b/pylops/basicoperators/transpose.py @@ -1,10 +1,10 @@ __all__ = ["Transpose"] import numpy as np -from numpy.core.multiarray import normalize_axis_index from pylops import LinearOperator from pylops.utils._internal import _value_or_sized_to_tuple +from pylops.utils.backend import get_normalize_axis_index from pylops.utils.decorators import reshaped from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray @@ -64,7 +64,7 @@ def __init__( ) -> None: dims = _value_or_sized_to_tuple(dims) ndims = len(dims) - self.axes = [normalize_axis_index(ax, ndims) for ax in axes] + self.axes = [get_normalize_axis_index()(ax, ndims) for ax in axes] # find out if all axes are present only once in axes if len(np.unique(self.axes)) != ndims: diff --git a/pylops/signalprocessing/_baseffts.py b/pylops/signalprocessing/_baseffts.py index cb8c1b41..18a4cce2 100644 --- a/pylops/signalprocessing/_baseffts.py +++ b/pylops/signalprocessing/_baseffts.py @@ -4,7 +4,6 @@ from typing import Optional, Sequence, Union import numpy as np -from numpy.core.multiarray import normalize_axis_index from pylops import LinearOperator from pylops.utils._internal import ( @@ -12,7 +11,11 @@ _value_or_sized_to_array, _value_or_sized_to_tuple, ) -from pylops.utils.backend import get_complex_dtype, get_real_dtype +from pylops.utils.backend import ( + get_complex_dtype, + get_normalize_axis_index, + get_real_dtype, +) from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.WARNING) @@ -46,7 +49,7 @@ def __init__( axes = _value_or_sized_to_array(axis) _raise_on_wrong_dtype(axes, np.integer, "axis") - self.axis = normalize_axis_index(axes[0], self.ndim) + self.axis = get_normalize_axis_index()(axes[0], self.ndim) if nfft is None: self.nfft = dims[self.axis] @@ -152,7 +155,7 @@ def __init__( axes = _value_or_sized_to_array(axes) _raise_on_wrong_dtype(axes, np.integer, "axes") - self.axes = np.array([normalize_axis_index(d, self.ndim) for d in axes]) + self.axes = np.array([get_normalize_axis_index()(d, self.ndim) for d in axes]) self.naxes = len(self.axes) if self.naxes != len(np.unique(self.axes)): warnings.warn( diff --git a/pylops/signalprocessing/convolvend.py b/pylops/signalprocessing/convolvend.py index c2fcb563..14ea6e24 100644 --- a/pylops/signalprocessing/convolvend.py +++ b/pylops/signalprocessing/convolvend.py @@ -3,7 +3,6 @@ from typing import Optional, Union import numpy as np -from numpy.core.multiarray import normalize_axis_index from pylops import LinearOperator from pylops.utils._internal import _value_or_sized_to_tuple @@ -11,6 +10,7 @@ get_array_module, get_convolve, get_correlate, + get_normalize_axis_index, to_cupy_conditional, ) from pylops.utils.decorators import reshaped @@ -78,7 +78,9 @@ def __init__( self.axes = ( np.arange(len(self.dims)) if axes is None - else np.array([normalize_axis_index(ax, len(self.dims)) for ax in axes]) + else np.array( + [get_normalize_axis_index()(ax, len(self.dims)) for ax in axes] + ) ) self.h = h hshape = np.array(self.h.shape) diff --git a/pylops/signalprocessing/shift.py b/pylops/signalprocessing/shift.py index b7d17ed7..c94b878e 100644 --- a/pylops/signalprocessing/shift.py +++ b/pylops/signalprocessing/shift.py @@ -4,11 +4,11 @@ import numpy as np import numpy.typing as npt -from numpy.core.multiarray import normalize_axis_index from pylops.basicoperators import Diagonal from pylops.signalprocessing import FFT from pylops.utils._internal import _value_or_sized_to_array +from pylops.utils.backend import get_normalize_axis_index from pylops.utils.typing import DTypeLike @@ -113,7 +113,7 @@ def Shift( Sop = Diagonal(shift, dims=dimsdiag, axis=axis, dtype=Fop.cdtype) else: # add dimensions to shift to match dimensions of model and data - axis = normalize_axis_index(axis, len(dims)) + axis = get_normalize_axis_index()(axis, len(dims)) fdims = np.ones(shift.ndim + 1, dtype=int) fdims[axis] = Fop.f.size f = Fop.f.reshape(fdims) diff --git a/pylops/utils/backend.py b/pylops/utils/backend.py index 50da7faa..9b7d3b2d 100644 --- a/pylops/utils/backend.py +++ b/pylops/utils/backend.py @@ -2,6 +2,7 @@ "get_module", "get_module_name", "get_array_module", + "get_normalize_axis_index", "get_convolve", "get_fftconvolve", "get_oaconvolve", @@ -59,6 +60,14 @@ from jax.scipy.signal import convolve as j_convolve from jax.scipy.signal import fftconvolve as j_fftconvolve +# need to check numpy version since the namespace of normalize_axis_index +# changed from numpy>=2.0.0 +np_version = np.__version__.split(".") +if int(np_version[0]) > 1: + from numpy.lib.array_utils import normalize_axis_index +else: + from numpy.core.multiarray import normalize_axis_index + def get_module(backend: str = "numpy") -> ModuleType: """Returns correct numerical module based on backend string @@ -138,6 +147,18 @@ def get_array_module(x: npt.ArrayLike) -> ModuleType: return np +def get_normalize_axis_index() -> Callable: + """Returns correct normalize_axis_index module based on numpy version + + Returns + ------- + f : :obj:`func` + Function to be used to process array + + """ + return normalize_axis_index + + def get_convolve(x: npt.ArrayLike) -> Callable: """Returns correct convolve module based on input From e9353eadc20b23fc308db69d2d11c078c36cb515 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Fri, 13 Sep 2024 15:30:41 +0300 Subject: [PATCH 09/35] fix: import same fix for other files --- pylops/basicoperators/firstderivative.py | 17 +++++++---------- pylops/basicoperators/laplacian.py | 13 ++----------- pylops/basicoperators/restriction.py | 17 +++++++---------- 3 files changed, 16 insertions(+), 31 deletions(-) diff --git a/pylops/basicoperators/firstderivative.py b/pylops/basicoperators/firstderivative.py index 9117eeff..c19a2650 100644 --- a/pylops/basicoperators/firstderivative.py +++ b/pylops/basicoperators/firstderivative.py @@ -6,18 +6,15 @@ from pylops import LinearOperator from pylops.utils._internal import _value_or_sized_to_tuple -from pylops.utils.backend import get_array_module, inplace_add, inplace_set +from pylops.utils.backend import ( + get_array_module, + get_normalize_axis_index, + inplace_add, + inplace_set, +) from pylops.utils.decorators import reshaped from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray -# need to check numpy version since the namespace of normalize_axis_index -# changed from numpy>=2.0.0 -np_version = np.__version__.split(".") -if int(np_version[0]) > 1: - from numpy.lib.array_utils import normalize_axis_index -else: - from numpy.core.multiarray import normalize_axis_index - class FirstDerivative(LinearOperator): r"""First derivative. @@ -102,7 +99,7 @@ def __init__( dims = _value_or_sized_to_tuple(dims) super().__init__(dtype=np.dtype(dtype), dims=dims, dimsd=dims, name=name) - self.axis = normalize_axis_index(axis, len(self.dims)) + self.axis = get_normalize_axis_index()(axis, len(self.dims)) self.sampling = sampling self.kind = kind self.edge = edge diff --git a/pylops/basicoperators/laplacian.py b/pylops/basicoperators/laplacian.py index 99afd457..f8f836a5 100644 --- a/pylops/basicoperators/laplacian.py +++ b/pylops/basicoperators/laplacian.py @@ -3,20 +3,11 @@ from typing import Tuple -import numpy as np - 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 -# need to check numpy version since the namespace of normalize_axis_index -# changed from numpy>=2.0.0 -np_version = np.__version__.split(".") -if int(np_version[0]) > 1: - from numpy.lib.array_utils import normalize_axis_index -else: - from numpy.core.multiarray import normalize_axis_index - class Laplacian(LinearOperator): r"""Laplacian. @@ -76,7 +67,7 @@ def __init__( dtype: DTypeLike = "float64", name: str = "L", ): - axes = tuple(normalize_axis_index(ax, len(dims)) for ax in axes) + axes = tuple(get_normalize_axis_index()(ax, len(dims)) for ax in axes) if not (len(axes) == len(weights) == len(sampling)): raise ValueError("axes, weights, and sampling have different size") self.axes = axes diff --git a/pylops/basicoperators/restriction.py b/pylops/basicoperators/restriction.py index 1a745b30..2595c971 100644 --- a/pylops/basicoperators/restriction.py +++ b/pylops/basicoperators/restriction.py @@ -6,17 +6,14 @@ import numpy as np import numpy.ma as np_ma -# need to check numpy version since normalize_axis_index will be -# soon moved from numpy.core.multiarray to from numpy.lib.array_utils -np_version = np.__version__.split(".") -if int(np_version[0]) < 2: - from numpy.core.multiarray import normalize_axis_index -else: - from numpy.lib.array_utils import normalize_axis_index - from pylops import LinearOperator from pylops.utils._internal import _value_or_sized_to_tuple -from pylops.utils.backend import get_array_module, inplace_set, to_cupy_conditional +from pylops.utils.backend import ( + get_array_module, + get_normalize_axis_index, + inplace_set, + to_cupy_conditional, +) from pylops.utils.typing import DTypeLike, InputDimsLike, IntNDArray, NDArray logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.WARNING) @@ -119,7 +116,7 @@ def __init__( ) -> None: ncp = get_array_module(iava) dims = _value_or_sized_to_tuple(dims) - axis = normalize_axis_index(axis, len(dims)) + axis = get_normalize_axis_index()(axis, len(dims)) dimsd = list(dims) # data dimensions dimsd[axis] = len(iava) From 196a150266ac518ac7c8fcaf3747361862088817 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Fri, 13 Sep 2024 21:48:08 +0300 Subject: [PATCH 10/35] doc: fix vlims of ilsm tutorial --- tutorials/ilsm.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/tutorials/ilsm.py b/tutorials/ilsm.py index 1f394bfc..8759efe2 100755 --- a/tutorials/ilsm.py +++ b/tutorials/ilsm.py @@ -164,14 +164,14 @@ dpsf[ns // 2, :, :].T, extent=(rx[0], rx[-1], t[-1], t[0]), cmap="gray", - vmin=-200, - vmax=200, + vmin=-1e1, + vmax=1e1, ) axs[0].axis("tight") axs[0].set_xlabel("x [m]"), axs[0].set_ylabel("t [m]") axs[0].set_title(r"$d_{psf}$") axs[1].imshow( - mmigpsf.T, cmap="gray", extent=(x[0], x[-1], z[-1], z[0]), vmin=-200, vmax=200 + mmigpsf.T, cmap="gray", extent=(x[0], x[-1], z[-1], z[0]), vmin=-5e0, vmax=5e0 ) axs[1].scatter(Psfx.ravel() * dx, Psfz.ravel() * dz, c="r") axs[1].set_xlabel("x [m]"), axs[1].set_ylabel("z [m]") @@ -196,16 +196,16 @@ axs[0].imshow( psfs[:, 0].reshape(len(psfx) * psfsize[0], psfsize[1]).T, cmap="gray", - vmin=-200, - vmax=200, + vmin=-5e0, + vmax=5e0, ) axs[0].set_title(r"$m_{psf}$ iz=0") axs[0].axis("tight") axs[1].imshow( psfs[:, 1].reshape(len(psfx) * psfsize[0], psfsize[1]).T, cmap="gray", - vmin=-200, - vmax=200, + vmin=-5e0, + vmax=5e0, ) axs[1].set_title(r"$m_{psf}$ iz=1") axs[1].axis("tight") @@ -219,12 +219,12 @@ fig, axs = plt.subplots(1, 2, figsize=(10, 5)) axs[0].imshow( - mmig.T, cmap="gray", extent=(x[0], x[-1], z[-1], z[0]), vmin=-1e3, vmax=1e3 + mmig.T, cmap="gray", extent=(x[0], x[-1], z[-1], z[0]), vmin=-5e1, vmax=5e1 ) axs[0].set_title(r"$m_{mig}$") axs[0].axis("tight") axs[1].imshow( - mmigpsf.T, cmap="gray", extent=(x[0], x[-1], z[-1], z[0]), vmin=-1e3, vmax=1e3 + mmigpsf.T, cmap="gray", extent=(x[0], x[-1], z[-1], z[0]), vmin=-5e1, vmax=5e1 ) axs[1].set_title(r"$m_{mig, psf}$") axs[1].axis("tight") @@ -235,13 +235,17 @@ # reflectivity using the :py:func:`pylops.optimization.sparsity.fista` solver. minv, _, resnorm = pylops.optimization.sparsity.fista( - Cop, mmig.ravel(), eps=1e5, niter=100, eigsdict=dict(niter=5, tol=1e-2), show=True + Cop, mmig.ravel(), eps=1e2, niter=100, eigsdict=dict(niter=5, tol=1e-2), show=True ) minv = minv.reshape(nx, nz) fig, axs = plt.subplots(1, 2, figsize=(10, 5)) axs[0].imshow( - mmig.T, cmap="gray", extent=(x[0], x[-1], z[-1], z[0]), vmin=-500, vmax=500 + mmig.T, + cmap="gray", + extent=(x[0], x[-1], z[-1], z[0]), + vmin=-5e1, + vmax=5e1, ) axs[0].set_title(r"$m_{mig}$") axs[0].axis("tight") From df7d002e880a3768fe3963f6d517695dd2bb68e8 Mon Sep 17 00:00:00 2001 From: Carlos da Costa Date: Wed, 2 Oct 2024 19:34:39 -0700 Subject: [PATCH 11/35] fix: point color to black to not conflict with colormap --- examples/plot_fourierradon.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/plot_fourierradon.py b/examples/plot_fourierradon.py index 0ab32f71..abe94819 100644 --- a/examples/plot_fourierradon.py +++ b/examples/plot_fourierradon.py @@ -12,6 +12,7 @@ nearest or linear interpolation). """ + import matplotlib.pyplot as plt import numpy as np @@ -74,7 +75,7 @@ vmax=dL.max(), extent=(1e3 * px[0], 1e3 * px[-1], t[-1], t[0]), ) -axs[1].scatter(1e3 * np.sin(np.deg2rad(theta[0])) / 1500.0, t0[0], s=50, color="r") +axs[1].scatter(1e3 * np.sin(np.deg2rad(theta[0])) / 1500.0, t0[0], s=50, color="k") axs[1].set(xlabel=r"$p$ [s/km]", title="Radon") axs[1].axis("tight") axs[2].imshow( @@ -117,7 +118,7 @@ vmax=dL.max(), extent=(1e3 * px[0], 1e3 * px[-1], t[-1], t[0]), ) -axs[1].scatter(1e3 * pxx[0], t0[0], s=50, color="r") +axs[1].scatter(1e3 * pxx[0], t0[0], s=50, color="k") axs[1].set(xlabel=r"$p$ [s/km]", title="Radon") axs[1].axis("tight") axs[2].imshow( @@ -189,7 +190,7 @@ vmax=dL.max(), extent=(1e3 * px[0], 1e3 * px[-1], t[-1], t[0]), ) -axs[1].scatter(1e3 * pxx, t0[0], s=50, color="r") +axs[1].scatter(1e3 * pxx, t0[0], s=50, color="k") axs[1].set(xlabel=r"$p_x$ [s/km]", title="Radon 3d - y") axs[1].axis("tight") axs[2].imshow( @@ -220,7 +221,7 @@ vmax=dL.max(), extent=(1e3 * py[0], 1e3 * py[-1], t[-1], t[0]), ) -axs[1].scatter(1e3 * pyy, t0[0], s=50, color="r") +axs[1].scatter(1e3 * pyy, t0[0], s=50, color="k") axs[1].set(xlabel=r"$p_y$ [s/km]", title="Radon 3d - x") axs[1].axis("tight") axs[2].imshow( @@ -278,7 +279,7 @@ vmax=dL.max(), extent=(1e3 * px[0], 1e3 * px[-1], t[-1], t[0]), ) -axs[1].scatter(1e3 * pxx[0], t0[0], s=50, color="r") +axs[1].scatter(1e3 * pxx[0], t0[0], s=50, color="k") axs[1].set(xlabel=r"$p_x$ [s/km]", title="Radon 3d - y") axs[1].axis("tight") axs[2].imshow( @@ -309,7 +310,7 @@ vmax=dL.max(), extent=(1e3 * py[0], 1e3 * py[-1], t[-1], t[0]), ) -axs[1].scatter(1e3 * pyy[0], t0[0], s=50, color="r") +axs[1].scatter(1e3 * pyy[0], t0[0], s=50, color="k") axs[1].set(xlabel=r"$p_y$ [s/km]", title="Radon 3d - x") axs[1].axis("tight") axs[2].imshow( From f93dfe1b51706032685b85933737a4beb2d65bdc Mon Sep 17 00:00:00 2001 From: Carlos da Costa Date: Wed, 2 Oct 2024 20:30:24 -0700 Subject: [PATCH 12/35] fix: improve typing, remove wrong optional --- pylops/signalprocessing/fourierradon2d.py | 28 +++++++++------------ pylops/signalprocessing/fourierradon3d.py | 30 ++++++++++------------- 2 files changed, 25 insertions(+), 33 deletions(-) diff --git a/pylops/signalprocessing/fourierradon2d.py b/pylops/signalprocessing/fourierradon2d.py index b2868fcf..1d7b524c 100755 --- a/pylops/signalprocessing/fourierradon2d.py +++ b/pylops/signalprocessing/fourierradon2d.py @@ -15,7 +15,6 @@ jit_message = deps.numba_import("the radon2d module") if jit_message is None: - from ._fourierradon2d_cuda import _aradon_inner_2d_cuda, _radon_inner_2d_cuda from ._fourierradon2d_numba import _aradon_inner_2d, _radon_inner_2d @@ -44,16 +43,16 @@ class FourierRadon2D(LinearOperator): Number of samples in Fourier transform flims : :obj:`tuple`, optional Indices of lower and upper limits of Fourier axis to be used in - the application of the Radon matrix (if ``None``, use entire axis) - kind : :obj:`str`, optional + the application of the Radon matrix (when ``None``, use entire axis) + kind : :obj:`str` Curve to be used for stacking/spreading (``linear``, ``parabolic``) - engine : :obj:`str`, optional + engine : :obj:`str` Engine used for computation (``numpy`` or ``numba`` or ``cuda``) - num_threads_per_blocks : :obj:`tuple`, optional + num_threads_per_blocks : :obj:`tuple` Number of threads in each block (only when ``engine=cuda``) - dtype : :obj:`str`, optional + dtype : :obj:`str` Type of elements in input array. - name : :obj:`str`, optional + name : :obj:`str` Name of operator (to be used by :func:`pylops.utils.describe.describe`) Attributes @@ -115,11 +114,11 @@ def __init__( pxaxis: NDArray, nfft: int, flims: Optional[Tuple[int, int]] = None, - kind: Optional[str] = "linear", - engine: Optional[str] = "numpy", + kind: str = "linear", + engine: str = "numpy", num_threads_per_blocks: Tuple[int, int] = (32, 32), - dtype: Optional[DTypeLike] = "float64", - name: Optional[str] = "C", + dtype: DTypeLike = "float64", + name: str = "R", ) -> None: # engine if engine not in ["numpy", "numba", "cuda"]: @@ -140,12 +139,9 @@ def __init__( self.dt = taxis[1] - taxis[0] self.dh = haxis[1] - haxis[0] self.f = np.fft.rfftfreq(self.nfft, d=self.dt) - self.nfft2 = self.f.size + self.nfft2 = len(self.f) self.cdtype = get_complex_dtype(dtype) - - self.flims = flims - if flims is None: - self.flims = (0, self.nfft2) + self.flims = (0, self.nfft2) if flims is None else flims if kind == "parabolic": self.haxis = self.haxis**2 diff --git a/pylops/signalprocessing/fourierradon3d.py b/pylops/signalprocessing/fourierradon3d.py index 895ee9e2..8b1e9fea 100755 --- a/pylops/signalprocessing/fourierradon3d.py +++ b/pylops/signalprocessing/fourierradon3d.py @@ -15,7 +15,6 @@ jit_message = deps.numba_import("the radon2d module") if jit_message is None: - from ._fourierradon3d_cuda import _aradon_inner_3d_cuda, _radon_inner_3d_cuda from ._fourierradon3d_numba import _aradon_inner_3d, _radon_inner_3d @@ -48,18 +47,18 @@ class FourierRadon3D(LinearOperator): Number of samples in Fourier transform flims : :obj:`tuple`, optional Indices of lower and upper limits of Fourier axis to be used in - the application of the Radon matrix (if ``None``, use entire axis) - kind : :obj:`tuple`, optional + the application of the Radon matrix (when ``None``, use entire axis) + kind : :obj:`tuple` Curves to be used for stacking/spreading along the y- and x- axes (``("linear", "linear")``, ``("linear", "parabolic")``, ``("parabolic", "linear")``, or ``("parabolic", "parabolic")``) - engine : :obj:`str`, optional + engine : :obj:`str` Engine used for computation (``numpy`` or ``numba`` or ``cuda``) - num_threads_per_blocks : :obj:`tuple`, optional + num_threads_per_blocks : :obj:`tuple` Number of threads in each block (only when ``engine=cuda``) - dtype : :obj:`str`, optional + dtype : :obj:`str` Type of elements in input array. - name : :obj:`str`, optional + name : :obj:`str` Name of operator (to be used by :func:`pylops.utils.describe.describe`) Attributes @@ -125,11 +124,11 @@ def __init__( pxaxis: NDArray, nfft: int, flims: Optional[Tuple[int, int]] = None, - kind: Optional[tuple] = ("linear", "linear"), - engine: Optional[str] = "numpy", + kind: Tuple[str, str] = ("linear", "linear"), + engine: str = "numpy", num_threads_per_blocks: Tuple[int, int] = (32, 32), - dtype: Optional[DTypeLike] = "float64", - name: Optional[str] = "C", + dtype: DTypeLike = "float64", + name: str = "R", ) -> None: # engine if engine not in ["numpy", "numba", "cuda"]: @@ -138,7 +137,7 @@ def __init__( engine = "numpy" # kind - if not isinstance(kind, (tuple, list)) and len(kind) != 2: + if len(kind) != 2: raise ValueError("kind must be a tuple of two elements") # dimensions and super @@ -155,12 +154,9 @@ def __init__( self.dhy = hyaxis[1] - hyaxis[0] self.dhx = hxaxis[1] - hxaxis[0] self.f = np.fft.rfftfreq(self.nfft, d=self.dt) - self.nfft2 = self.f.size + self.nfft2 = len(self.f) self.cdtype = get_complex_dtype(dtype) - - self.flims = flims - if flims is None: - self.flims = (0, self.nfft2) + self.flims = (0, self.nfft2) if flims is None else flims if kind[0] == "parabolic": self.hyaxis = self.hyaxis**2 From 99b18ecccffed7050fafbc1d61b57fef4846bb32 Mon Sep 17 00:00:00 2001 From: Carlos da Costa Date: Wed, 2 Oct 2024 20:33:34 -0700 Subject: [PATCH 13/35] fix: add FourierRadon3D to init --- pylops/signalprocessing/__init__.py | 40 ++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/pylops/signalprocessing/__init__.py b/pylops/signalprocessing/__init__.py index e6a9e89d..405002e5 100755 --- a/pylops/signalprocessing/__init__.py +++ b/pylops/signalprocessing/__init__.py @@ -29,6 +29,7 @@ Radon2D Two dimensional Radon transform. Radon3D Three dimensional Radon transform. FourierRadon2D Two dimensional Fourier Radon transform. + FourierRadon3D Three dimensional Fourier Radon transform. ChirpRadon2D Two dimensional Chirp Radon transform. ChirpRadon3D Three dimensional Chirp Radon transform. Seislet Two dimensional Seislet operator. @@ -41,37 +42,36 @@ """ +from .bilinear import * +from .chirpradon2d import * +from .chirpradon3d import * +from .convolve1d import * +from .convolve2d import * +from .convolvend import * +from .dct import * +from .dtcwt import * +from .dwt import * +from .dwt2d import * +from .dwtnd import * from .fft import * from .fft2d import * from .fftnd import * -from .convolve1d import * -from .convolvend import * -from .convolve2d import * +from .fourierradon2d import * +from .fourierradon3d import * +from .fredholm1 import * +from .interp import * from .nonstatconvolve1d import * from .nonstatconvolve2d import * from .nonstatconvolve3d import * -from .shift import * -from .interp import * -from .bilinear import * +from .patch2d import * +from .patch3d import * from .radon2d import * from .radon3d import * -from .fourierradon2d import * -from .fourierradon3d import * -from .chirpradon2d import * -from .chirpradon3d import * +from .seislet import * +from .shift import * from .sliding1d import * from .sliding2d import * from .sliding3d import * -from .patch2d import * -from .patch3d import * -from .fredholm1 import * -from .dwt import * -from .dwt2d import * -from .dwtnd import * -from .seislet import * -from .dct import * -from .dtcwt import * - __all__ = [ "FFT", From 3b567839179f4fe632aac4d3d9d9f0bc5bc11698 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Thu, 3 Oct 2024 21:15:31 +0300 Subject: [PATCH 14/35] fix: reorder signalprocessing init due to circular import issue --- pylops/signalprocessing/__init__.py | 38 ++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/pylops/signalprocessing/__init__.py b/pylops/signalprocessing/__init__.py index 405002e5..d8a5a4cc 100755 --- a/pylops/signalprocessing/__init__.py +++ b/pylops/signalprocessing/__init__.py @@ -42,36 +42,36 @@ """ -from .bilinear import * -from .chirpradon2d import * -from .chirpradon3d import * -from .convolve1d import * -from .convolve2d import * -from .convolvend import * -from .dct import * -from .dtcwt import * -from .dwt import * -from .dwt2d import * -from .dwtnd import * from .fft import * from .fft2d import * from .fftnd import * -from .fourierradon2d import * -from .fourierradon3d import * -from .fredholm1 import * -from .interp import * +from .convolve1d import * +from .convolvend import * +from .convolve2d import * from .nonstatconvolve1d import * from .nonstatconvolve2d import * from .nonstatconvolve3d import * -from .patch2d import * -from .patch3d import * +from .shift import * +from .interp import * +from .bilinear import * from .radon2d import * from .radon3d import * -from .seislet import * -from .shift import * +from .fourierradon2d import * +from .fourierradon3d import * +from .chirpradon2d import * +from .chirpradon3d import * from .sliding1d import * from .sliding2d import * from .sliding3d import * +from .patch2d import * +from .patch3d import * +from .fredholm1 import * +from .dwt import * +from .dwt2d import * +from .dwtnd import * +from .seislet import * +from .dct import * +from .dtcwt import * __all__ = [ "FFT", From 7e2cec11e4491dc5914579dc706a6a85a9deeb11 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Thu, 3 Oct 2024 21:23:22 +0300 Subject: [PATCH 15/35] minor: changed np.pi/np.exp into pi/exp --- pylops/signalprocessing/_fourierradon2d_numba.py | 10 ++++------ pylops/signalprocessing/_fourierradon3d_numba.py | 10 ++++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pylops/signalprocessing/_fourierradon2d_numba.py b/pylops/signalprocessing/_fourierradon2d_numba.py index 1853c741..e2139c6b 100755 --- a/pylops/signalprocessing/_fourierradon2d_numba.py +++ b/pylops/signalprocessing/_fourierradon2d_numba.py @@ -1,4 +1,6 @@ import os +from cmath import exp +from math import pi import numpy as np from numba import jit, prange @@ -13,9 +15,7 @@ def _radon_inner_2d(X, Y, f, px, h, flim0, flim1, npx, nh): for ih in prange(nh): for ifr in range(flim0, flim1): for ipx in range(npx): - Y[ih, ifr] += X[ipx, ifr] * np.exp( - -1j * 2 * np.pi * f[ifr] * px[ipx] * h[ih] - ) + Y[ih, ifr] += X[ipx, ifr] * exp(-1j * 2 * pi * f[ifr] * px[ipx] * h[ih]) return Y @@ -24,7 +24,5 @@ def _aradon_inner_2d(X, Y, f, px, h, flim0, flim1, npx, nh): for ipx in prange(npx): for ifr in range(flim0, flim1): for ih in range(nh): - X[ipx, ifr] += Y[ih, ifr] * np.exp( - 1j * 2 * np.pi * f[ifr] * px[ipx] * h[ih] - ) + X[ipx, ifr] += Y[ih, ifr] * exp(1j * 2 * pi * f[ifr] * px[ipx] * h[ih]) return X diff --git a/pylops/signalprocessing/_fourierradon3d_numba.py b/pylops/signalprocessing/_fourierradon3d_numba.py index 5b1e2383..43571db5 100755 --- a/pylops/signalprocessing/_fourierradon3d_numba.py +++ b/pylops/signalprocessing/_fourierradon3d_numba.py @@ -1,4 +1,6 @@ import os +from cmath import exp +from math import pi import numpy as np from numba import jit, prange @@ -15,10 +17,10 @@ def _radon_inner_3d(X, Y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, nhx): for ifr in range(flim0, flim1): for ipy in range(npy): for ipx in range(npx): - Y[ihy, ihx, ifr] += X[ipy, ipx, ifr] * np.exp( + Y[ihy, ihx, ifr] += X[ipy, ipx, ifr] * exp( -1j * 2 - * np.pi + * pi * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) ) @@ -32,10 +34,10 @@ def _aradon_inner_3d(X, Y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, nhx): for ifr in range(flim0, flim1): for ihy in range(nhy): for ihx in range(nhx): - X[ipy, ipx, ifr] += Y[ihy, ihx, ifr] * np.exp( + X[ipy, ipx, ifr] += Y[ihy, ihx, ifr] * exp( 1j * 2 - * np.pi + * pi * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) ) From 75e0bd4a07feb36f7f036a2ea2f427e2062fe26d Mon Sep 17 00:00:00 2001 From: mrava87 Date: Thu, 3 Oct 2024 21:25:29 +0300 Subject: [PATCH 16/35] minor: removed unneeded returns in fourierradon numba methods --- pylops/signalprocessing/_fourierradon2d_numba.py | 2 -- pylops/signalprocessing/_fourierradon3d_numba.py | 2 -- pylops/signalprocessing/fourierradon2d.py | 4 ++-- pylops/signalprocessing/fourierradon3d.py | 4 ++-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/pylops/signalprocessing/_fourierradon2d_numba.py b/pylops/signalprocessing/_fourierradon2d_numba.py index e2139c6b..4657cd92 100755 --- a/pylops/signalprocessing/_fourierradon2d_numba.py +++ b/pylops/signalprocessing/_fourierradon2d_numba.py @@ -16,7 +16,6 @@ def _radon_inner_2d(X, Y, f, px, h, flim0, flim1, npx, nh): for ifr in range(flim0, flim1): for ipx in range(npx): Y[ih, ifr] += X[ipx, ifr] * exp(-1j * 2 * pi * f[ifr] * px[ipx] * h[ih]) - return Y @jit(nopython=True, parallel=parallel, nogil=True, cache=True, fastmath=True) @@ -25,4 +24,3 @@ def _aradon_inner_2d(X, Y, f, px, h, flim0, flim1, npx, nh): for ifr in range(flim0, flim1): for ih in range(nh): X[ipx, ifr] += Y[ih, ifr] * exp(1j * 2 * pi * f[ifr] * px[ipx] * h[ih]) - return X diff --git a/pylops/signalprocessing/_fourierradon3d_numba.py b/pylops/signalprocessing/_fourierradon3d_numba.py index 43571db5..1ba1ef3a 100755 --- a/pylops/signalprocessing/_fourierradon3d_numba.py +++ b/pylops/signalprocessing/_fourierradon3d_numba.py @@ -24,7 +24,6 @@ def _radon_inner_3d(X, Y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, nhx): * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) ) - return Y @jit(nopython=True, parallel=parallel, nogil=True, cache=True, fastmath=True) @@ -41,4 +40,3 @@ def _aradon_inner_3d(X, Y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, nhx): * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) ) - return X diff --git a/pylops/signalprocessing/fourierradon2d.py b/pylops/signalprocessing/fourierradon2d.py index 1d7b524c..83bc1d94 100755 --- a/pylops/signalprocessing/fourierradon2d.py +++ b/pylops/signalprocessing/fourierradon2d.py @@ -262,7 +262,7 @@ def _matvec_numba(self, x: NDArray) -> NDArray: y = np.zeros((self.nh, self.nfft2), dtype=self.cdtype) x = sp.fft.rfft(x, n=self.nfft, axis=-1) - y = _radon_inner_2d( + _radon_inner_2d( x, y, self.f, @@ -281,7 +281,7 @@ def _rmatvec_numba(self, y: NDArray) -> NDArray: x = np.zeros((self.npx, self.nfft2), dtype=self.cdtype) y = sp.fft.rfft(y, n=self.nfft, axis=-1) - x = _aradon_inner_2d( + _aradon_inner_2d( x, y, self.f, diff --git a/pylops/signalprocessing/fourierradon3d.py b/pylops/signalprocessing/fourierradon3d.py index 8b1e9fea..135dece2 100755 --- a/pylops/signalprocessing/fourierradon3d.py +++ b/pylops/signalprocessing/fourierradon3d.py @@ -309,7 +309,7 @@ def _matvec_numba(self, x: NDArray) -> NDArray: y = np.zeros((self.nhy, self.nhx, self.nfft2), dtype=self.cdtype) x = sp.fft.rfft(x, n=self.nfft, axis=-1) - y = _radon_inner_3d( + _radon_inner_3d( x, y, self.f, @@ -332,7 +332,7 @@ def _rmatvec_numba(self, y: NDArray) -> NDArray: x = np.zeros((self.npy, self.npx, self.nfft2), dtype=self.cdtype) y = sp.fft.rfft(y, n=self.nfft, axis=-1) - x = _aradon_inner_3d( + _aradon_inner_3d( x, y, self.f, From eae55b8651033a2735a5363e8a3ef968cbf9fed5 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Thu, 3 Oct 2024 21:33:43 +0300 Subject: [PATCH 17/35] minor: remove unused numpy in _fourierradon2d_numba and _fourierradon3d_numba --- pylops/signalprocessing/_fourierradon2d_numba.py | 1 - pylops/signalprocessing/_fourierradon3d_numba.py | 1 - 2 files changed, 2 deletions(-) diff --git a/pylops/signalprocessing/_fourierradon2d_numba.py b/pylops/signalprocessing/_fourierradon2d_numba.py index 4657cd92..8f09724e 100755 --- a/pylops/signalprocessing/_fourierradon2d_numba.py +++ b/pylops/signalprocessing/_fourierradon2d_numba.py @@ -2,7 +2,6 @@ from cmath import exp from math import pi -import numpy as np from numba import jit, prange # detect whether to use parallel or not diff --git a/pylops/signalprocessing/_fourierradon3d_numba.py b/pylops/signalprocessing/_fourierradon3d_numba.py index 1ba1ef3a..e217fe95 100755 --- a/pylops/signalprocessing/_fourierradon3d_numba.py +++ b/pylops/signalprocessing/_fourierradon3d_numba.py @@ -2,7 +2,6 @@ from cmath import exp from math import pi -import numpy as np from numba import jit, prange # detect whether to use parallel or not From 6e2456be2d1d2ddd70d680e25719bb037d70cbd8 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Thu, 3 Oct 2024 22:12:37 +0300 Subject: [PATCH 18/35] minor: force f to have same type of operator for fourierradon operators --- pylops/signalprocessing/fourierradon2d.py | 2 +- pylops/signalprocessing/fourierradon3d.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pylops/signalprocessing/fourierradon2d.py b/pylops/signalprocessing/fourierradon2d.py index 83bc1d94..f8296d78 100755 --- a/pylops/signalprocessing/fourierradon2d.py +++ b/pylops/signalprocessing/fourierradon2d.py @@ -138,7 +138,7 @@ def __init__( self.npx, self.nfft = self.dims[0], nfft self.dt = taxis[1] - taxis[0] self.dh = haxis[1] - haxis[0] - self.f = np.fft.rfftfreq(self.nfft, d=self.dt) + self.f = np.fft.rfftfreq(self.nfft, d=self.dt).astype(self.dtype) self.nfft2 = len(self.f) self.cdtype = get_complex_dtype(dtype) self.flims = (0, self.nfft2) if flims is None else flims diff --git a/pylops/signalprocessing/fourierradon3d.py b/pylops/signalprocessing/fourierradon3d.py index 135dece2..75622c85 100755 --- a/pylops/signalprocessing/fourierradon3d.py +++ b/pylops/signalprocessing/fourierradon3d.py @@ -153,7 +153,7 @@ def __init__( self.dt = taxis[1] - taxis[0] self.dhy = hyaxis[1] - hyaxis[0] self.dhx = hxaxis[1] - hxaxis[0] - self.f = np.fft.rfftfreq(self.nfft, d=self.dt) + self.f = np.fft.rfftfreq(self.nfft, d=self.dt).astype(self.dtype) self.nfft2 = len(self.f) self.cdtype = get_complex_dtype(dtype) self.flims = (0, self.nfft2) if flims is None else flims From 402bd31d202b302ab60d944b68352e2d83733f9b Mon Sep 17 00:00:00 2001 From: mrava87 Date: Thu, 3 Oct 2024 22:13:44 +0300 Subject: [PATCH 19/35] minor: removed all isinstance occurences in seismicevents --- pylops/utils/seismicevents.py | 72 +++++++++++++---------------------- 1 file changed, 26 insertions(+), 46 deletions(-) diff --git a/pylops/utils/seismicevents.py b/pylops/utils/seismicevents.py index 1c03743e..b061734e 100755 --- a/pylops/utils/seismicevents.py +++ b/pylops/utils/seismicevents.py @@ -14,6 +14,8 @@ import numpy.typing as npt import scipy.signal as filt +from pylops.utils._internal import _value_or_sized_to_array + def _filterdata( d: npt.NDArray, nt: int, wav: npt.ArrayLike, wcenter: int @@ -117,12 +119,9 @@ def linear2d( where :math:`p_{x,i}=\sin( \theta_i)/v` """ - if isinstance(t0, (float, int)): - t0 = (t0,) - if isinstance(theta, (float, int)): - theta = (theta,) - if isinstance(amp, (float, int)): - amp = (amp,) + t0 = _value_or_sized_to_array(t0) + theta = _value_or_sized_to_array(theta) + amp = _value_or_sized_to_array(amp) # identify dimensions dt = t[1] - t[0] @@ -197,14 +196,10 @@ def parabolic2d( t_i(x) = t_{0,i} + p_{x,i} x + p_{xx,i} x^2 """ - if isinstance(t0, (float, int)): - t0 = (t0,) - if isinstance(px, (float, int)): - px = (px,) - if isinstance(pxx, (float, int)): - pxx = (pxx,) - if isinstance(amp, (float, int)): - amp = (amp,) + t0 = _value_or_sized_to_array(t0) + px = _value_or_sized_to_array(px) + pxx = _value_or_sized_to_array(pxx) + amp = _value_or_sized_to_array(amp) # identify dimensions dt = t[1] - t[0] @@ -273,12 +268,9 @@ def hyperbolic2d( t_i(x) = \sqrt{t_{0,i}^2 + \frac{x^2}{v_{\text{rms},i}^2}} """ - if isinstance(t0, (float, int)): - t0 = (t0,) - if isinstance(vrms, (float, int)): - vrms = (vrms,) - if isinstance(amp, (float, int)): - amp = (amp,) + t0 = _value_or_sized_to_array(t0) + vrms = _value_or_sized_to_array(vrms) + amp = _value_or_sized_to_array(amp) # identify dimensions dt = t[1] - t[0] @@ -361,14 +353,10 @@ def linear3d( and :math:`p_{x,i}=\frac{1}{v} \sin( \theta_i)\sin( \phi_i)`. """ - if isinstance(t0, (float, int)): - t0 = (t0,) - if isinstance(theta, (float, int)): - theta = (theta,) - if isinstance(phi, (float, int)): - phi = (phi,) - if isinstance(amp, (float, int)): - amp = (amp,) + t0 = _value_or_sized_to_array(t0) + theta = _value_or_sized_to_array(theta) + phi = _value_or_sized_to_array(phi) + amp = _value_or_sized_to_array(amp) # identify dimensions dt = t[1] - t[0] @@ -453,16 +441,12 @@ def parabolic3d( t_i(x, y) = t_{0,i} + p_{x,i} x + p_{y,i} x + p_{xx,i} x^2 + p_{yy,i} y^2 """ - if isinstance(t0, (float, int)): - t0 = (t0,) - if isinstance(px, (float, int)): - px = (px,) - if isinstance(py, (float, int)): - py = (py,) - if isinstance(pxx, (float, int)): - pxx = (pxx,) - if isinstance(pyy, (float, int)): - pyy = (pyy,) + t0 = _value_or_sized_to_array(t0) + px = _value_or_sized_to_array(px) + py = _value_or_sized_to_array(py) + pxx = _value_or_sized_to_array(pxx) + pyy = _value_or_sized_to_array(pyy) + amp = _value_or_sized_to_array(amp) # identify dimensions dt = t[1] - t[0] @@ -550,14 +534,10 @@ def hyperbolic3d( simply control the curvature of the hyperboloid along the spatial axes. """ - if isinstance(t0, (float, int)): - t0 = (t0,) - if isinstance(vrms_x, (float, int)): - vrms_x = (vrms_x,) - if isinstance(vrms_y, (float, int)): - vrms_y = (vrms_y,) - if isinstance(amp, (float, int)): - amp = (amp,) + t0 = _value_or_sized_to_array(t0) + vrms_x = _value_or_sized_to_array(vrms_x) + vrms_y = _value_or_sized_to_array(vrms_y) + amp = _value_or_sized_to_array(amp) # identify dimensions dt = t[1] - t[0] From ce4b83da432b03b7e7d95663653d3b701daaf81d Mon Sep 17 00:00:00 2001 From: mrava87 Date: Fri, 4 Oct 2024 21:04:41 +0300 Subject: [PATCH 20/35] bug: fix chirpradon3d pyfftw import Remove any direct access to pyfftw and instead use pyfftw_message to check if the library is installed and correctly imported. --- pylops/signalprocessing/chirpradon3d.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pylops/signalprocessing/chirpradon3d.py b/pylops/signalprocessing/chirpradon3d.py index 1f544926..f1153ce5 100755 --- a/pylops/signalprocessing/chirpradon3d.py +++ b/pylops/signalprocessing/chirpradon3d.py @@ -101,7 +101,7 @@ def __init__( @reshaped def _matvec(self, x: NDArray) -> NDArray: - if self.engine == "fftw" and pyfftw is not None: + if self.engine == "fftw" and pyfftw_message is None: return _chirp_radon_3d_fftw( x, self.dt, self.dy, self.dx, self.pmax, mode="f", **self.kwargs_fftw ) @@ -109,7 +109,7 @@ def _matvec(self, x: NDArray) -> NDArray: @reshaped def _rmatvec(self, x: NDArray) -> NDArray: - if self.engine == "fftw" and pyfftw is not None: + if self.engine == "fftw" and pyfftw_message is None: return _chirp_radon_3d_fftw( x, self.dt, self.dy, self.dx, self.pmax, mode="a", **self.kwargs_fftw ) @@ -117,7 +117,7 @@ def _rmatvec(self, x: NDArray) -> NDArray: def inverse(self, x: NDArray) -> NDArray: x = x.reshape(self.dimsd) - if self.engine == "fftw" and pyfftw is not None: + if self.engine == "fftw" and pyfftw_message is None: y = _chirp_radon_3d_fftw( x, self.dt, self.dy, self.dx, self.pmax, mode="i", **self.kwargs_fftw ) From eb204dfa39d827eecbcb0b1af49ecea4f189fb4d Mon Sep 17 00:00:00 2001 From: mrava87 Date: Fri, 4 Oct 2024 21:10:07 +0300 Subject: [PATCH 21/35] minor: remove unused import of pyfftw --- pylops/signalprocessing/chirpradon3d.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pylops/signalprocessing/chirpradon3d.py b/pylops/signalprocessing/chirpradon3d.py index f1153ce5..193d41be 100755 --- a/pylops/signalprocessing/chirpradon3d.py +++ b/pylops/signalprocessing/chirpradon3d.py @@ -14,8 +14,6 @@ pyfftw_message = deps.pyfftw_import("the chirpradon3d module") if pyfftw_message is None: - import pyfftw - from ._chirpradon3d import _chirp_radon_3d_fftw logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.WARNING) From 2b33f43327f40d54509353ec8c61f204ac0afc2e Mon Sep 17 00:00:00 2001 From: mrava87 Date: Sun, 6 Oct 2024 09:21:04 +0300 Subject: [PATCH 22/35] bug: fix nans in Spread This commit fixes a problem introduced in Spread with latest versions of numba. This is due to the way we used to handle nans, a much cleaner way is used now with math.isnan without having to first convert to integrers. --- pylops/basicoperators/_spread_numba.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/pylops/basicoperators/_spread_numba.py b/pylops/basicoperators/_spread_numba.py index 2416d67b..84012593 100644 --- a/pylops/basicoperators/_spread_numba.py +++ b/pylops/basicoperators/_spread_numba.py @@ -1,3 +1,4 @@ +import math import os from numba import jit, prange @@ -21,8 +22,8 @@ def _matvec_numba_table(x, y, dims, interp, table, dtable): dindices = dtable[ix0, it] for i, indexfloat in enumerate(indices): - index = int(indexfloat) - if index != -9223372036854775808: # =int(np.nan) + if not math.isnan(indexfloat): + index = int(indexfloat) if not interp: y[i, index] += x[ix0, it] else: @@ -45,8 +46,8 @@ def _rmatvec_numba_table(x, y, dims, dimsd, interp, table, dtable): dindices = dtable[ix0, it] for i, indexfloat in enumerate(indices): - index = int(indexfloat) - if index != -9223372036854775808: # =int(np.nan) + if not math.isnan(indexfloat): + index = int(indexfloat) if not interp: y[ix0, it] += x[i, index] else: @@ -71,8 +72,8 @@ def _matvec_numba_onthefly(x, y, dims, interp, fh): else: indices, dindices = fh(ix0, it) for i, indexfloat in enumerate(indices): - index = int(indexfloat) - if index != -9223372036854775808: # =int(np.nan) + if not math.isnan(indexfloat): + index = int(indexfloat) if not interp: y[i, index] += x[ix0, it] else: @@ -95,8 +96,8 @@ def _rmatvec_numba_onthefly(x, y, dims, dimsd, interp, fh): else: indices, dindices = fh(ix0, it) for i, indexfloat in enumerate(indices): - index = int(indexfloat) - if index != -9223372036854775808: # =int(np.nan) + if not math.isnan(indexfloat): + index = int(indexfloat) if not interp: y[ix0, it] += x[i, index] else: From 91fcabc0cf8da40172d6bbea490e60740ee90c96 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Mon, 7 Oct 2024 20:51:56 +0300 Subject: [PATCH 23/35] Remove parenthesis for cuda.jit --- pylops/signalprocessing/_fourierradon2d_cuda.py | 4 ++-- pylops/signalprocessing/_fourierradon3d_cuda.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pylops/signalprocessing/_fourierradon2d_cuda.py b/pylops/signalprocessing/_fourierradon2d_cuda.py index 56c14963..2a0d35ba 100755 --- a/pylops/signalprocessing/_fourierradon2d_cuda.py +++ b/pylops/signalprocessing/_fourierradon2d_cuda.py @@ -4,7 +4,7 @@ from numba import cuda -@cuda.jit() +@cuda.jit def _radon_inner_2d_kernel(x, y, f, px, h, flim0, flim1, npx, nh): """Cuda kernels for FourierRadon2D operator @@ -19,7 +19,7 @@ def _radon_inner_2d_kernel(x, y, f, px, h, flim0, flim1, npx, nh): y[ih, ifr] += x[ipx, ifr] * exp(-1j * 2 * pi * f[ifr] * px[ipx] * h[ih]) -@cuda.jit() +@cuda.jit def _aradon_inner_2d_kernel(x, y, f, px, h, flim0, flim1, npx, nh): """Cuda kernels for FourierRadon2D operator diff --git a/pylops/signalprocessing/_fourierradon3d_cuda.py b/pylops/signalprocessing/_fourierradon3d_cuda.py index ffa923db..16f94f7e 100755 --- a/pylops/signalprocessing/_fourierradon3d_cuda.py +++ b/pylops/signalprocessing/_fourierradon3d_cuda.py @@ -4,7 +4,7 @@ from numba import cuda -@cuda.jit() +@cuda.jit def _radon_inner_3d_kernel(x, y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, nhx): """Cuda kernels for FourierRadon3D operator @@ -22,7 +22,7 @@ def _radon_inner_3d_kernel(x, y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, ) -@cuda.jit() +@cuda.jit def _aradon_inner_3d_kernel(x, y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, nhx): """Cuda kernels for FourierRadon3D operator From 127620ba6a4dda3ea1c371533cc9e22815223576 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Sat, 26 Oct 2024 13:05:49 +0300 Subject: [PATCH 24/35] bug: fix problem in Restriction when passing iava as cupy array --- pylops/basicoperators/restriction.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pylops/basicoperators/restriction.py b/pylops/basicoperators/restriction.py index 2595c971..362d82de 100644 --- a/pylops/basicoperators/restriction.py +++ b/pylops/basicoperators/restriction.py @@ -13,6 +13,7 @@ get_normalize_axis_index, inplace_set, to_cupy_conditional, + to_numpy, ) from pylops.utils.typing import DTypeLike, InputDimsLike, IntNDArray, NDArray @@ -146,7 +147,7 @@ def __init__( # explicitly create a list of indices in the n-dimensional # model space which will be used in _rmatvec to place the input if ncp != np: - self.iavamask = _compute_iavamask(self.dims, axis, iava, ncp) + self.iavamask = _compute_iavamask(self.dims, axis, to_numpy(iava), ncp) self.inplace = inplace self.axis = axis self.iavareshape = iavareshape @@ -173,7 +174,6 @@ def _rmatvec(self, x: NDArray) -> NDArray: ) else: if not hasattr(self, "iavamask"): - self.iava = to_cupy_conditional(x, self.iava) self.iavamask = _compute_iavamask(self.dims, self.axis, self.iava, ncp) y = ncp.zeros(int(self.shape[-1]), dtype=self.dtype) y = inplace_set(x.ravel(), y, self.iavamask) From 71dc191ef0f3c1fe56d055e30e38dfba9a868da6 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Sat, 26 Oct 2024 14:33:34 +0300 Subject: [PATCH 25/35] minor: removed unused import --- pylops/basicoperators/restriction.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pylops/basicoperators/restriction.py b/pylops/basicoperators/restriction.py index 362d82de..c2fceab7 100644 --- a/pylops/basicoperators/restriction.py +++ b/pylops/basicoperators/restriction.py @@ -12,7 +12,6 @@ get_array_module, get_normalize_axis_index, inplace_set, - to_cupy_conditional, to_numpy, ) from pylops.utils.typing import DTypeLike, InputDimsLike, IntNDArray, NDArray From ac68e3eded110eeeff641c638b0d7df4828a698c Mon Sep 17 00:00:00 2001 From: Matteo Ravasi Date: Sun, 27 Oct 2024 22:24:50 +0300 Subject: [PATCH 26/35] rtd: force devito version (#619) --- requirements-doc.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/requirements-doc.txt b/requirements-doc.txt index 74fea77d..2e62dea7 100644 --- a/requirements-doc.txt +++ b/requirements-doc.txt @@ -1,5 +1,7 @@ # Currently we force rdt to use numpy<2.0.0 to build the documentation -# since the dtcwt and spgl1 are not yet compatible with numpy=2.0.0 +# since the dtcwt is not yet compatible with numpy=2.0.0. For the +# same reason, we force devito==4.8.7 as later versions of devito +# require numpy>=2.0.0 numpy>=1.21.0,<2.0.0 scipy>=1.11.0 jax @@ -11,7 +13,7 @@ PyWavelets spgl1 scikit-fmm sympy -devito +devito==4.8.6 dtcwt matplotlib ipython From d832ec68fd45a17bc4d14466414652885197ebc8 Mon Sep 17 00:00:00 2001 From: Carlos da Costa Date: Tue, 19 Nov 2024 17:41:45 -0800 Subject: [PATCH 27/35] Adds interoperability with PyTensor (and PyMC) (#621) * feat: implement PyTensorOperator * fix: add __pycache__ to gitignore * fix: docs * fix: add to docs * fix: formatting * fix: remove options not available to pydata_sphinx_theme * fix: math formatting * fix: math formatting * fix: add intersphinx * feature: Bayesian Linear Regression * fix: change thumbnail * fix: use == to compare string literal * fix: do not test on mac * fix: test new versions for dev deps * fix: test new versions for dev deps * fix: test new versions for dev deps * fix: test new versions for dev deps * fix: test new versions for dev deps * fix: test new versions for dev deps * fix: test new versions for dev deps * fix: test new versions for dev deps * fix: test new versions for dev deps * lock all * fix: test new versions for dev deps * fix: test on darwin * fix: revert to old docutils * fix: passing on mac * fix: bump arviz version * fix: use old scipy * fix: remove gtraphviz (requies binary), use pytensor instead of pymc for dev dependencies, include pytensor as doc dependency * fix: improve descriptions, fix thumbnail * fix: typo * fix: improve workinng, add MAP, make chains shorter * fix: remove pytensor from yamls --- .gitignore | 1 + docs/source/conf.py | 18 +- docs/source/gpu.rst | 4 +- examples/plot_bayeslinearregr.py | 235 +++++++++++++++++++++++++++ examples/plot_slopeest.py | 6 +- pylops/__init__.py | 1 + pylops/basicoperators/matrixmult.py | 14 +- pylops/basicoperators/regression.py | 2 +- pylops/basicoperators/restriction.py | 2 +- pylops/pytensoroperator.py | 85 ++++++++++ pylops/utils/deps.py | 19 +++ pylops/waveeqprocessing/marchenko.py | 17 +- pytests/test_oneway.py | 4 +- pytests/test_pytensoroperator.py | 51 ++++++ requirements-dev.txt | 3 +- requirements-doc.txt | 4 +- requirements-torch.txt | 2 +- tutorials/torchop.py | 19 ++- 18 files changed, 444 insertions(+), 43 deletions(-) create mode 100644 examples/plot_bayeslinearregr.py create mode 100644 pylops/pytensoroperator.py create mode 100755 pytests/test_pytensoroperator.py diff --git a/.gitignore b/.gitignore index 42f9cc53..0365f10d 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ build dist pylops.egg-info/ .eggs/ +__pycache__ # setuptools_scm generated # pylops/version.py diff --git a/docs/source/conf.py b/docs/source/conf.py index c5e6536d..75680cac 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,8 +1,10 @@ # -*- coding: utf-8 -*- -import sys -import os import datetime +import os +import sys + from sphinx_gallery.sorting import ExampleTitleSortKey + from pylops import __version__ # Sphinx needs to be able to import the package to use autodoc and get the version number @@ -37,6 +39,8 @@ "matplotlib": ("https://matplotlib.org/", None), "pyfftw": ("https://pyfftw.readthedocs.io/en/latest/", None), "spgl1": ("https://spgl1.readthedocs.io/en/latest/", None), + "pymc": ("https://www.pymc.io/", None), + "arviz": ("https://python.arviz.org/en/latest/", None), } # Generate autodoc stubs with summaries from code @@ -103,9 +107,7 @@ # These enable substitutions using |variable| in the rst files rst_epilog = """ .. |year| replace:: {year} -""".format( - year=year -) +""".format(year=year) html_static_path = ["_static"] html_last_updated_fmt = "%b %d, %Y" html_title = "PyLops" @@ -122,15 +124,15 @@ # Theme config html_theme = "pydata_sphinx_theme" html_theme_options = { - "logo_only": True, - "display_version": True, + # "logo_only": True, + # "display_version": True, "logo": { "image_light": "pylops_b.png", "image_dark": "pylops.png", } } html_css_files = [ - 'css/custom.css', + "css/custom.css", ] html_context = { diff --git a/docs/source/gpu.rst b/docs/source/gpu.rst index ecc87120..a37597e9 100755 --- a/docs/source/gpu.rst +++ b/docs/source/gpu.rst @@ -462,5 +462,5 @@ Again, the code is almost unchanged apart from the fact that we now use ``jax`` .. note:: - More examples for the CuPy and JAX backends be found `here `_ - and `here `_. \ No newline at end of file + More examples for the CuPy and JAX backends be found `here `__ + and `here `__. \ No newline at end of file diff --git a/examples/plot_bayeslinearregr.py b/examples/plot_bayeslinearregr.py new file mode 100644 index 00000000..42417eb1 --- /dev/null +++ b/examples/plot_bayeslinearregr.py @@ -0,0 +1,235 @@ +r""" +Bayesian Linear Regression +========================== + +In the :ref:`sphx_glr_gallery_plot_linearregr.py` example, we +performed linear regression by applying a variety of solvers to the +:py:class:`pylops.LinearRegression` operator. + +In this example, we will apply linear regression the Bayesian way. +In Bayesian inference, we are not looking for a "best" estimate +of the linear regression parameters; rather, we are looking for +all possible parameters and their associated (posterior) probability, +that is, how likely that those are the parameters that generated our data. + +To do this, we will leverage the probabilistic programming library +`PyMC `_. + +In the Bayesian formulation, we write the problem in the following manner: + + .. math:: + y_i \sim N(x_0 + x_1 t_i, \sigma) \qquad \forall i=0,1,\ldots,N-1 + +where :math:`x_0` is the intercept and :math:`x_1` is the gradient. +This notation means that the obtained measurements :math:`y_i` are normally distributed around +mean :math:`x_0 + x_1 t_i` with a standard deviation of :math:`\sigma`. +We can also express this problem in a matrix form, which makes it clear that we +can use a PyLops operator to describe this relationship. + + .. math:: + \mathbf{y} \sim N(\mathbf{A} \mathbf{x}, \sigma) + +In this example, we will combine the Bayesian power of PyMC with the linear language of +PyLops. +""" + +import arviz as az +import matplotlib.pyplot as plt +import numpy as np +import pymc as pm + +import pylops + +plt.close("all") +np.random.seed(10) + +############################################################################### +# Define the input parameters: number of samples along the t-axis (``N``), +# linear regression coefficients (``x``), and standard deviation of noise +# to be added to data (``sigma``). +N = 30 +x = np.array([1.0, 0.5]) +sigma = 0.25 + +############################################################################### +# Let's create the time axis and initialize the +# :py:class:`pylops.LinearRegression` operator +t = np.linspace(0, 1, N) +LRop = pylops.LinearRegression(t, dtype=t.dtype) + +############################################################################### +# We can then apply the operator in forward mode to compute our data points +# along the x-axis (``y``). We will also generate some random gaussian noise +# and create a noisy version of the data (``yn``). +y = LRop @ x +yn = y + np.random.normal(0, sigma, N) + +############################################################################### +# The deterministic solution is to solve the +# :math:`\mathbf{y} = \mathbf{A} \mathbf{x}` in a least-squares sense. +# Using PyLops, the ``/`` operator solves the iteratively (i.e., +# :py:func:`scipy.sparse.linalg.lsqr`). +# In Bayesian terminology, this estimator is known as the maximulum likelihood +# estimation (MLE). +x_mle = LRop / yn +noise_mle = np.sqrt(np.sum((yn - LRop @ x_mle) ** 2) / (N - 1)) + +############################################################################### +# Alternatively, we may regularize the problem. In this case we will condition +# the solution towards smaller magnitude parameters, we can use a regularized +# least squares approach. Since the weight is pretty small, we expect the +# result to be very similar to the one above. +sigma_prior = 20 +eps = 1 / np.sqrt(2) / sigma_prior +x_map, *_ = pylops.optimization.basic.lsqr(LRop, yn, damp=eps) +noise_map = np.sqrt(np.sum((yn - LRop @ x_map) ** 2) / (N - 1)) + +############################################################################### +# Let's plot the best fitting line for the case of noise free and noisy data +fig, ax = plt.subplots(figsize=(8, 4)) +for est, est_label, c in zip( + [x, x_mle, x_map], ["True", "MLE", "MAP"], ["k", "C0", "C1"] +): + ax.plot( + np.array([t.min(), t.max()]), + np.array([t.min(), t.max()]) * est[1] + est[0], + color=c, + ls="--" if est_label == "MAP" else "-", + lw=4, + label=rf"{est_label}: $x_0$ = {est[0]:.2f}, $x_1$ = {est[1]:.2f}", + ) +ax.scatter(t, y, c="r", s=70) +ax.scatter(t, yn, c="g", s=70) +ax.legend() +fig.tight_layout() + +############################################################################### +# Let's solve this problem the Bayesian way, which consists in obtaining the +# posterior probability :math:`p(\mathbf{x}\,|\,\mathbf{y})` via Bayes theorem: +# +# .. math:: +# \underbrace{p(\mathbf{x} \,|\, \mathbf{y})}_{\text{posterior}} +# \propto \overbrace{p(\mathbf{y} \,|\, \mathbf{x})}^{\text{likelihood}}\; +# \overbrace{p(\mathbf{x})}^{\text{prior}} +# +# To do so, we need to define the priors and the likelihood. +# +# As hinted above, priors in Bayesian analysis can be interpreted as the +# probabilistic equivalent to regularization. Finding the maximum a posteriori +# (MAP) estimate to a least-squares problem with a Gaussian prior on the +# parameters is equivalent to applying a Tikhonov (L2) regularization to these +# parameters. A Laplace prior is equivalent to a sparse (L1) regularization. +# In addition, the weight of the regularization is controlled by the "scale" of +# the distribution of the prior; the standard deviation (in the case of a Gaussian) +# is inversely proportional strength of the regularization. So if we use the same +# sigma_prior above as the standard deviation of our prior distribition, we +# should get the same MAP out of them. In practice, in Bayesian analysis we are +# not only interested in point estimates like MAP, but rather, the whole +# posterior distribution. If you want the MAP only, there are better, +# methods to obtain them, such as the one shown above. +# +# In this problem we will use weak, not very informative priors, by setting +# their prior to accept a wide range of probable values. This is equivalent to +# setting the "weights" to be small, as shown above: +# +# .. math:: +# x_0 \sim N(0, 20) +# +# x_1 \sim N(0, 20) +# +# \sigma \sim \text{HalfCauchy}(10) +# +# The (log) likelihood in Bayesian analysis is the equivalent of the cost +# function in deterministic inverse problems. In this case we have already +# seen this likelihood: +# +# .. math:: +# p(\mathbf{y}\,|\,\mathbf{x}) \sim N(\mathbf{A}\mathbf{x}, \sigma) +# + +# Construct a PyTensor `Op` which can be used in a PyMC model. +pytensor_lrop = pylops.PyTensorOperator(LRop) +dims = pytensor_lrop.dims # Inherits dims, dimsd and shape from LRop + +# Construct the PyMC model +with pm.Model() as model: + y_data = pm.Data("y_data", yn) + + # Define priors + sp = pm.HalfCauchy("σ", beta=10) + xp = pm.Normal("x", 0, sigma=sigma_prior, shape=dims) + mu = pm.Deterministic("mu", pytensor_lrop(xp)) + + # Define likelihood + likelihood = pm.Normal("y", mu=mu, sigma=sp, observed=y_data) + + # Inference! + idata = pm.sample(500, tune=200, chains=2) + +############################################################################### +# The plot below is known as the "trace" plot. The left column displays the +# posterior distributions of all latent variables in the model. The top-left +# plot has multiple colored posteriors, one for each parameter of the latent +# vector :math:`\mathbf{x}`. The bottom left plot displays the posterior of the +# estimated noise :math:`\sigma`. +# +# In these plots there are multiple distributions of the same color and +# multiple line styles. Each of these represents a "chain". A chain is a single +# run of a Monte Carlo algorithm. Generally, Monte Carlo methods run various +# chains to ensure that all regions of the posterior distribution are sampled. +# These chains are shown on the right hand plots. + +axes = az.plot_trace(idata, figsize=(10, 7), var_names=["~mu"]) +axes[0, 0].axvline(x[0], label="True Intercept", lw=2, color="k") +axes[0, 0].axvline(x_map[0], label="Intercept MAP", lw=2, color="C0", ls="--") +axes[0, 0].axvline(x[1], label="True Slope", lw=2, color="darkgray") +axes[0, 0].axvline(x_map[1], label="Slope MAP", lw=2, color="C1", ls="--") +axes[0, 1].axhline(x[0], label="True Intercept", lw=2, color="k") +axes[0, 1].axhline(x_map[0], label="Intercept MAP", lw=2, color="C0", ls="--") +axes[0, 1].axhline(x[1], label="True Slope", lw=2, color="darkgray") +axes[0, 1].axhline(x_map[1], label="Slope MAP", lw=2, color="C1", ls="--") +axes[1, 0].axvline(sigma, label="True Sigma", lw=2, color="k") +axes[1, 0].axvline(noise_map, label="Sigma MAP", lw=2, color="C0", ls="--") +axes[1, 1].axhline(sigma, label="True Sigma", lw=2, color="k") +axes[1, 1].axhline(noise_map, label="Sigma MAP", lw=2, color="C0", ls="--") +for ax in axes.ravel(): + ax.legend() +ax.get_figure().tight_layout() + +################################################################################ +# With this model, we can obtain an uncertainty measurement via the High Density +# Interval. To do that, we need to sample the "preditive posterior", that is, +# the posterior distribution of the data, given the model. What this does is +# sample the latent vetors from their posteriors (above), and use the model +# to construct realizations of the data given these realizations. They represent +# what the model thinks the data should look like, given everything it has +# already seen. + +with model: + pm.sample_posterior_predictive(idata, extend_inferencedata=True) + +############################################################################### +# sphinx_gallery_thumbnail_number = 3 +fig, ax = plt.subplots(figsize=(8, 4)) +az.plot_hdi( + t, + idata.posterior_predictive["y"], + fill_kwargs={"label": "95% HDI"}, + hdi_prob=0.95, + ax=ax, +) +for est, est_label, c in zip( + [x, x_mle, x_map], ["True", "MLE", "MAP"], ["k", "C0", "C1"] +): + ax.plot( + np.array([t.min(), t.max()]), + np.array([t.min(), t.max()]) * est[1] + est[0], + color=c, + ls="--" if est_label == "MAP" else "-", + lw=4, + label=rf"{est_label}: $x_0$ = {est[0]:.2f}, $x_1$ = {est[1]:.2f}", + ) +ax.scatter(t, y, c="r", s=70) +ax.scatter(t, yn, c="g", s=70) +ax.legend() +fig.tight_layout() diff --git a/examples/plot_slopeest.py b/examples/plot_slopeest.py index 89938a4a..22cf9096 100755 --- a/examples/plot_slopeest.py +++ b/examples/plot_slopeest.py @@ -14,7 +14,7 @@ precondition sparsity-promoting inverse problems. We will show examples of a variety of different settings, including a comparison -with the original implementation in [1]. +with the original implementation in [1]_. .. [1] van Vliet, L. J., Verbeek, P. W., "Estimators for orientation and anisotropy in digitized images", Journal ASCI Imaging Workshop. 1995. @@ -145,7 +145,7 @@ ############################################################################### # Concentric circles # ------------------ -# The original paper by van Vliet and Verbeek [1] has an example with concentric +# The original paper by van Vliet and Verbeek [1]_ has an example with concentric # circles. We recover their original images and compare our implementation with # theirs. @@ -215,7 +215,7 @@ def rgb2gray(rgb): ############################################################################### # Core samples # ------------------ -# The original paper by van Vliet and Verbeek [1] also has an example with images +# The original paper by van Vliet and Verbeek [1]_ also has an example with images # of core samples. Since the original paper does not have a scale with which to # plot the angles, we have chosen ours it to match their image as closely as # possible. diff --git a/pylops/__init__.py b/pylops/__init__.py index 7672fda4..b1ee04c8 100755 --- a/pylops/__init__.py +++ b/pylops/__init__.py @@ -48,6 +48,7 @@ from .config import * from .linearoperator import * from .torchoperator import * +from .pytensoroperator import * from .jaxoperator import * from .basicoperators import * from . import ( diff --git a/pylops/basicoperators/matrixmult.py b/pylops/basicoperators/matrixmult.py index a5f713ab..66b96c70 100644 --- a/pylops/basicoperators/matrixmult.py +++ b/pylops/basicoperators/matrixmult.py @@ -79,12 +79,14 @@ def __init__( else: otherdims = _value_or_sized_to_array(otherdims) self.otherdims = np.array(otherdims, dtype=int) - dims, dimsd = np.insert(self.otherdims, 0, self.A.shape[1]), np.insert( - self.otherdims, 0, self.A.shape[0] + dims, dimsd = ( + np.insert(self.otherdims, 0, self.A.shape[1]), + np.insert(self.otherdims, 0, self.A.shape[0]), + ) + self.dimsflatten, self.dimsdflatten = ( + np.insert([np.prod(self.otherdims)], 0, self.A.shape[1]), + np.insert([np.prod(self.otherdims)], 0, self.A.shape[0]), ) - self.dimsflatten, self.dimsdflatten = np.insert( - [np.prod(self.otherdims)], 0, self.A.shape[1] - ), np.insert([np.prod(self.otherdims)], 0, self.A.shape[0]) self.reshape = True explicit = False @@ -138,7 +140,7 @@ def inv(self) -> NDArray: r"""Return the inverse of :math:`\mathbf{A}`. Returns - ---------- + ------- Ainv : :obj:`numpy.ndarray` Inverse matrix. diff --git a/pylops/basicoperators/regression.py b/pylops/basicoperators/regression.py index dc51ded5..1160fe9b 100644 --- a/pylops/basicoperators/regression.py +++ b/pylops/basicoperators/regression.py @@ -124,7 +124,7 @@ def apply(self, t: npt.ArrayLike, x: NDArray) -> NDArray: Regression coefficients Returns - ---------- + ------- y : :obj:`numpy.ndarray` Values along y-axis diff --git a/pylops/basicoperators/restriction.py b/pylops/basicoperators/restriction.py index c2fceab7..e27610bf 100644 --- a/pylops/basicoperators/restriction.py +++ b/pylops/basicoperators/restriction.py @@ -189,7 +189,7 @@ def mask(self, x: NDArray) -> NDArray: Input array (can be either flattened or not) Returns - ---------- + ------- y : :obj:`numpy.ma.core.MaskedArray` Masked array. diff --git a/pylops/pytensoroperator.py b/pylops/pytensoroperator.py new file mode 100644 index 00000000..cdd04c04 --- /dev/null +++ b/pylops/pytensoroperator.py @@ -0,0 +1,85 @@ +import pylops +from pylops.utils import deps + +pytensor_message = deps.pytensor_import("the pytensor module") + +if pytensor_message is not None: + + class PyTensorOperator: + """PyTensor Op which applies a PyLops Linear Operator, including gradient support. + + This class "converts" a PyLops `LinearOperator` class into a PyTensor `Op`. + This applies the `LinearOperator` in "forward-mode" in `self.perform`, and applies + its adjoint when computing the vector-Jacobian product (`self.grad`), as that is + the analytically correct gradient for linear operators. This class should pass + `pytensor.gradient.verify_grad`. + + Parameters + ---------- + LOp : pylops.LinearOperator + """ + + def __init__(self, LOp: pylops.LinearOperator) -> None: + if not deps.pytensor_enabled: + raise NotImplementedError(pytensor_message) + +else: + import pytensor.tensor as pt + from pytensor.graph.basic import Apply + from pytensor.graph.op import Op + + class _PyTensorOperatorNoGrad(Op): + """PyTensor Op which applies a PyLops Linear Operator, excluding gradient support. + + This class "converts" a PyLops `LinearOperator` class into a PyTensor `Op`. + This applies the `LinearOperator` in "forward-mode" in `self.perform`. + + Parameters + ---------- + LOp : pylops.LinearOperator + """ + + __props__ = ("dims", "dimsd", "shape") + + def __init__(self, LOp: pylops.LinearOperator) -> None: + self._LOp = LOp + self.dims = self._LOp.dims + self.dimsd = self._LOp.dimsd + self.shape = self._LOp.shape + super().__init__() + + def make_node(self, x) -> Apply: + x = pt.as_tensor_variable(x) + inputs = [x] + outputs = [pt.tensor(dtype=x.type.dtype, shape=self._LOp.dimsd)] + return Apply(self, inputs, outputs) + + def perform( + self, node: Apply, inputs: list, output_storage: list[list[None]] + ) -> None: + (x,) = inputs + (yt,) = output_storage + yt[0] = self._LOp @ x + + class PyTensorOperator(_PyTensorOperatorNoGrad): + """PyTensor Op which applies a PyLops Linear Operator, including gradient support. + + This class "converts" a PyLops `LinearOperator` class into a PyTensor `Op`. + This applies the `LinearOperator` in "forward-mode" in `self.perform`, and applies + its adjoint when computing the vector-Jacobian product (`self.grad`), as that is + the analytically correct gradient for linear operators. This class should pass + `pytensor.gradient.verify_grad`. + + Parameters + ---------- + LOp : pylops.LinearOperator + """ + + def __init__(self, LOp: pylops.LinearOperator) -> None: + super().__init__(LOp) + self._gradient_op = _PyTensorOperatorNoGrad(self._LOp.H) + + def grad( + self, inputs: list[pt.TensorVariable], output_grads: list[pt.TensorVariable] + ): + return [self._gradient_op(output_grads[0])] diff --git a/pylops/utils/deps.py b/pylops/utils/deps.py index ecf69a95..df4a0d9e 100644 --- a/pylops/utils/deps.py +++ b/pylops/utils/deps.py @@ -10,6 +10,7 @@ "spgl1_enabled", "sympy_enabled", "torch_enabled", + "pytensor_enabled", ] import os @@ -223,6 +224,23 @@ def sympy_import(message: Optional[str] = None) -> str: return sympy_message +def pytensor_import(message: Optional[str] = None) -> str: + if pytensor_enabled: + try: + import_module("pytensor") # noqa: F401 + + pytensor_message = None + except Exception as e: + pytensor_message = f"Failed to import pytensor (error:{e})." + else: + pytensor_message = ( + f"pytensor package not installed. In order to be able to use " + f"{message} run " + f'"pip install pytensor" or "conda install -c conda-forge pytensor".' + ) + return pytensor_message + + # Set package availability booleans # cupy and jax: the package is imported to check everything is working correctly, # if not the package is disabled. We do this here as these libraries are used as drop-in @@ -245,3 +263,4 @@ def sympy_import(message: Optional[str] = None) -> str: spgl1_enabled = util.find_spec("spgl1") is not None sympy_enabled = util.find_spec("sympy") is not None torch_enabled = util.find_spec("torch") is not None +pytensor_enabled = util.find_spec("pytensor") is not None diff --git a/pylops/waveeqprocessing/marchenko.py b/pylops/waveeqprocessing/marchenko.py index bf8e3305..d810c70b 100644 --- a/pylops/waveeqprocessing/marchenko.py +++ b/pylops/waveeqprocessing/marchenko.py @@ -301,7 +301,7 @@ def apply_onepoint( greens: bool = False, dottest: bool = False, usematmul: bool = False, - **kwargs_solver + **kwargs_solver, ) -> Union[ Tuple[NDArray, NDArray, NDArray, NDArray, NDArray], Tuple[NDArray, NDArray, NDArray, NDArray], @@ -341,7 +341,7 @@ def apply_onepoint( for numpy and cupy `data`, respectively) Returns - ---------- + ------- f1_inv_minus : :obj:`numpy.ndarray` Inverted upgoing focusing function of size :math:`[n_r \times n_t]` f1_inv_plus : :obj:`numpy.ndarray` @@ -473,7 +473,7 @@ def apply_onepoint( Mop, d.ravel(), x0=self.ncp.zeros(2 * (2 * self.nt - 1) * self.nr, dtype=self.dtype), - **kwargs_solver + **kwargs_solver, )[0] f1_inv = f1_inv.reshape(2 * self.nt2, self.nr) @@ -486,8 +486,9 @@ def apply_onepoint( # Create Green's functions g_inv = Gop * f1_inv_tot.ravel() g_inv = g_inv.reshape(2 * self.nt2, self.ns) - g_inv_minus, g_inv_plus = -g_inv[: self.nt2].T, np.fliplr( - g_inv[self.nt2 :].T + g_inv_minus, g_inv_plus = ( + -g_inv[: self.nt2].T, + np.fliplr(g_inv[self.nt2 :].T), ) if rtm and greens: return f1_inv_minus, f1_inv_plus, p0_minus, g_inv_minus, g_inv_plus @@ -507,7 +508,7 @@ def apply_multiplepoints( greens: bool = False, dottest: bool = False, usematmul: bool = False, - **kwargs_solver + **kwargs_solver, ) -> Union[ Tuple[NDArray, NDArray, NDArray, NDArray, NDArray], Tuple[NDArray, NDArray, NDArray, NDArray], @@ -548,7 +549,7 @@ def apply_multiplepoints( for numpy and cupy `data`, respectively) Returns - ---------- + ------- f1_inv_minus : :obj:`numpy.ndarray` Inverted upgoing focusing function of size :math:`[n_r \times n_{vs} \times n_t]` @@ -695,7 +696,7 @@ def apply_multiplepoints( x0=self.ncp.zeros( 2 * (2 * self.nt - 1) * self.nr * nvs, dtype=self.dtype ), - **kwargs_solver + **kwargs_solver, )[0] f1_inv = f1_inv.reshape(2 * self.nt2, self.nr, nvs) diff --git a/pytests/test_oneway.py b/pytests/test_oneway.py index 48f73a9e..1f1b936c 100755 --- a/pytests/test_oneway.py +++ b/pytests/test_oneway.py @@ -96,7 +96,7 @@ def test_PhaseShift_3dsignal(par): @pytest.mark.parametrize("par", [(par1), (par2), (par1v), (par2v)]) def test_Deghosting_2dsignal(par, create_data2D): """Deghosting of 2d data""" - p2d, p2d_minus = create_data2D(1 if par["kind"] is "p" else -1) + p2d, p2d_minus = create_data2D(1 if par["kind"] == "p" else -1) p2d_minus_inv, p2d_plus_inv = Deghosting( p2d, @@ -111,7 +111,7 @@ def test_Deghosting_2dsignal(par, create_data2D): npad=0, ntaper=0, dtype=par["dtype"], - **dict(damp=1e-10, iter_lim=60) + **dict(damp=1e-10, iter_lim=60), ) assert np.linalg.norm(p2d_minus_inv - p2d_minus) / np.linalg.norm(p2d_minus) < 3e-1 diff --git a/pytests/test_pytensoroperator.py b/pytests/test_pytensoroperator.py new file mode 100755 index 00000000..9a59bc88 --- /dev/null +++ b/pytests/test_pytensoroperator.py @@ -0,0 +1,51 @@ +import numpy as np +import pytensor +import pytest +from numpy.testing import assert_array_equal + +from pylops import MatrixMult, PyTensorOperator + +par1 = {"ny": 11, "nx": 11, "dtype": np.float32} # square +par2 = {"ny": 21, "nx": 11, "dtype": np.float32} # overdetermined + +np.random.seed(0) +rng = np.random.default_rng() + + +@pytest.mark.parametrize("par", [(par1)]) +def test_PyTensorOperator(par): + """Verify output and gradient of PyTensor function obtained from a LinearOperator.""" + Dop = MatrixMult(np.random.normal(0.0, 1.0, (par["ny"], par["nx"]))) + pytensor_op = PyTensorOperator(Dop) + + # Check gradient + inp = np.random.randn(*pytensor_op.dims) + pytensor.gradient.verify_grad(pytensor_op, (inp,), rng=rng) + + # Check value + x = pytensor.tensor.dvector() + f = pytensor.function([x], pytensor_op(x)) + out = f(inp) + assert_array_equal(out, Dop @ inp) + + +@pytest.mark.parametrize("par", [(par1)]) +def test_PyTensorOperator_nd(par): + """Verify output and gradient of PyTensor function obtained from a LinearOperator + using an ND-array.""" + otherdims = rng.choice(range(1, 3), size=rng.choice(range(2, 8))) + Dop = MatrixMult( + np.random.normal(0.0, 1.0, (par["ny"], par["nx"])), otherdims=otherdims + ) + pytensor_op = PyTensorOperator(Dop) + + # Check gradient + inp = np.random.randn(*pytensor_op.dims) + pytensor.gradient.verify_grad(pytensor_op, (inp,), rng=rng) + + # Check value + tensor = pytensor.tensor.TensorType(dtype="float64", shape=(None,) * inp.ndim) + x = tensor() + f = pytensor.function([x], pytensor_op(x)) + out = f(inp) + assert_array_equal(out, Dop @ inp) diff --git a/requirements-dev.txt b/requirements-dev.txt index 2fca40dd..8eb9f87d 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,4 +1,4 @@ -numpy>=1.21.0 +numpy>=1.21.0,<2 scipy>=1.11.0 jax numba @@ -28,3 +28,4 @@ isort black flake8 mypy +pytensor diff --git a/requirements-doc.txt b/requirements-doc.txt index 2e62dea7..e13ad06e 100644 --- a/requirements-doc.txt +++ b/requirements-doc.txt @@ -3,7 +3,7 @@ # same reason, we force devito==4.8.7 as later versions of devito # require numpy>=2.0.0 numpy>=1.21.0,<2.0.0 -scipy>=1.11.0 +scipy>=1.11.0,<1.13 jax --extra-index-url https://download.pytorch.org/whl/cpu torch>=1.2.0 @@ -34,3 +34,5 @@ isort black flake8 mypy +pytensor +pymc diff --git a/requirements-torch.txt b/requirements-torch.txt index f2c3b105..3f94f19f 100644 --- a/requirements-torch.txt +++ b/requirements-torch.txt @@ -1,2 +1,2 @@ --index-url https://download.pytorch.org/whl/cpu -torch>=1.2.0 +torch>=1.2.0,<2.5 diff --git a/tutorials/torchop.py b/tutorials/torchop.py index 9e73d7b3..a18ff2ef 100755 --- a/tutorials/torchop.py +++ b/tutorials/torchop.py @@ -14,6 +14,7 @@ modelling operators. """ + import matplotlib.pyplot as plt import numpy as np import torch @@ -30,24 +31,24 @@ # In this example we consider a simple multidimensional functional: # # .. math:: -# \mathbf{y} = \mathbf{A} sin(\mathbf{x}) +# \mathbf{y} = \mathbf{A} \sin(\mathbf{x}) # # and we use AD to compute the gradient with respect to the input vector # evaluated at :math:`\mathbf{x}=\mathbf{x}_0` : -# :math:`\mathbf{g} = d\mathbf{y} / d\mathbf{x} |_{\mathbf{x}=\mathbf{x}_0}`. +# :math:`\mathbf{g} = \partial\mathbf{y} / \partial\mathbf{x} |_{\mathbf{x}=\mathbf{x}_0}`. # # Let's start by defining the Jacobian: # # .. math:: # \textbf{J} = \begin{bmatrix} -# dy_1 / dx_1 & ... & dy_1 / dx_M \\ -# ... & ... & ... \\ -# dy_N / dx_1 & ... & dy_N / dx_M +# \frac{\partial y_1}{\partial x_1} & \cdots & \frac{\partial y_1}{\partial x_M} \\ +# \vdots & \ddots & \vdots \\ +# \frac{\partial y_N}{\partial x_1} & \cdots & \frac{\partial y_N}{\partial x_M} # \end{bmatrix} = \begin{bmatrix} -# a_{11} cos(x_1) & ... & a_{1M} cos(x_M) \\ -# ... & ... & ... \\ -# a_{N1} cos(x_1) & ... & a_{NM} cos(x_M) -# \end{bmatrix} = \textbf{A} cos(\mathbf{x}) +# a_{11} \cos(x_1) & \cdots & a_{1M} \cos(x_M) \\ +# \vdots & \ddots & \vdots \\ +# a_{N1} \cos(x_1) & \cdots & a_{NM} \cos(x_M) +# \end{bmatrix} = \textbf{A} \cos(\mathbf{x}) # # Since both input and output are multidimensional, # PyTorch ``backward`` actually computes the product between the transposed From 317a80467bf66916e0a112e9f2aabcf453911fae Mon Sep 17 00:00:00 2001 From: Matteo Ravasi Date: Thu, 21 Nov 2024 07:52:03 +0300 Subject: [PATCH 28/35] doc: added info to install pytensor and pymc (#623) * doc: added info to install pytensor and pymc * minor: fix typo * fix: add a note about numpy version --------- Co-authored-by: Carlos da Costa --- docs/source/installation.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 094f09bd..800b1092 100755 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -437,6 +437,25 @@ You may need to set the environment variable ``NUMBA_NUM_THREADS`` define how ma It can also be checked dynamically with ``numba.config.NUMBA_DEFAULT_NUM_THREADS``. +PyMC and PyTensor +----------------- +`PyTensor `_ is used to allow seamless integration between PyLops and +`PyMC `_ operators. +Install both of them via ``conda`` with: + +.. code-block:: bash + + conda install -c conda-forge pytensor pymc + +or via ``pip`` with + +.. code-block:: bash + + >> pip install pytensor pymc + +.. note:: + PyTensor does not support NumPy 2 yet, so make sure you use NumPy 1.x with PyTensor and PyMC. + PyWavelets ---------- `PyWavelets `_ is used to implement the wavelet operators. From 2d749a2f72346fe563f9c0e0db317679ff95aad5 Mon Sep 17 00:00:00 2001 From: Matteo Ravasi Date: Sun, 24 Nov 2024 21:41:15 +0300 Subject: [PATCH 29/35] feat: ToCupy operator (#622) * feat: ToCupy operator * minor: fix typo * test: added tests for ToCupy * minor: small change to doc * doc: added graphics of cpu-gpu scenarios --- docs/source/_static/cupy_diagram.png | Bin 0 -> 47292 bytes docs/source/_static/numpy_cupy_bd_diagram.png | Bin 0 -> 345588 bytes docs/source/_static/numpy_cupy_vs_diagram.png | Bin 0 -> 268390 bytes docs/source/api/index.rst | 2 + docs/source/gpu.rst | 226 +++++++++++++----- pylops/basicoperators/__init__.py | 4 + pylops/basicoperators/blockdiag.py | 22 +- pylops/basicoperators/hstack.py | 23 +- pylops/basicoperators/tocupy.py | 60 +++++ pylops/basicoperators/vstack.py | 23 +- pylops/optimization/cls_basic.py | 21 +- pylops/utils/backend.py | 44 ++++ pytests/test_basicoperators.py | 16 ++ 13 files changed, 369 insertions(+), 72 deletions(-) create mode 100755 docs/source/_static/cupy_diagram.png create mode 100755 docs/source/_static/numpy_cupy_bd_diagram.png create mode 100755 docs/source/_static/numpy_cupy_vs_diagram.png create mode 100644 pylops/basicoperators/tocupy.py diff --git a/docs/source/_static/cupy_diagram.png b/docs/source/_static/cupy_diagram.png new file mode 100755 index 0000000000000000000000000000000000000000..7eafad98e085d51867de12aa42d85be0c15dd8f5 GIT binary patch literal 47292 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≫3jZmb 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�KRT%KI@(9aH=P|_Aj*(+{0m!8T+ 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/numpy_cupy_vs_diagram.png b/docs/source/_static/numpy_cupy_vs_diagram.png new file mode 100755 index 0000000000000000000000000000000000000000..96e3b47093940dccc5824a1a46b568d2d968388a GIT binary patch literal 268390 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

)trv~THl#>;CAc`r>DV5;-iSRC+g^4j{}Tvx?_ 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

6f^OZjC zVd9hCD?)?xPVjtG?Ar^F6rcgzf45EfGKicKyNlV4v_N&KEzBnm$;* zdHAyR{<^@Rl?EF|e70vZja71slfT z7&Qzc!b>R>9ypB`(2~;zblN~=18q13xWga0x43p@L>%7>vp>o3q`Nm)YecBvn_*3+45U-sX)4eeOi<$3=?TeDU;A?n85pKK(9cIHRZaiHPq5*d= zTS3~Y(f9Jqx{)E;mat<}!DV6Hxy(lpH|De>Q740ym^T{8Qdp`qV1k4T=rk++sB7|o zK&I<$E6C4Q+r=nQv{g6RnV7(i!zfUUVpAyyY>|*I-gk;mw~e?<)D5w0byt}4C~Sm> zNKfLfcwrWQ4aqY@cH{~ElzT^)F`FrteA2DR+W{E&6nr}!COiaPi5ofikBaEbe9zFJjX}fk-n{jh*oEj$M{Ef#r!Ly?Hb^#zoOo9GN=~IyO_PTG zuBA_#DlNJ+JcN8=rHs(fK>EQrq=5V`_kk&dSRen|rP}j6yeuVd+#KSPySOIF4mr80 zh|Ga0451U)$S^|_PCCCma#lLTuItqyR9P9h_=0QGRX;eq@;$vYu+yYW#%>P$Euo3Ylt-9jR_yao?Xw)w*J?0P2G%686 zx3-1;ELWp>#iKl(y8(TH*>uxMK1V49h&tneNzxG0Q3;w~IPz<8hO_}6+1Y^z<7~kP z28!Y3T$I{mb%?Z!w?K>$h3_lU{z-;iznPOlywshXQ@m8Gp7?Y0R)Gb5p-}TXXA9!t zTTi`~*{2q?;{OEn!6ubc@%HSczT8^5CZzUDDQ`+$u>JyROOyW;cXh zjdMiS8k1EK<7r?`qJi;S1b@FNXm=F4*#M@3pB-r$57=stN8ZGoo1i5k4l?hpe?bQv z-?Ob~JOunkv;u)48eqZ^DqLddK|Wz@-CK`Sy@unyz*;K|I%EpvFt{M1guqZ5lZ&JS zk#FX(&FLXRKI>DeQqGphNHIo%dP_wqS9-#4$=w9S8QksTwyapMlt z5OW;7Aij`@0`F~_&(Tx?!h1M#BXme7)b#2W85Z^xUoQXH54y0ho(w~i&);tq$FsFw z0%r~Nfq4%>li0|RZnHC4V`A3eC}IVMBXT$qDifHaaCDo!GQQxc!;9Dvjy0m?H z_LFQRU%B%posUQj-csYKKrrgNy}19Yt?4Jk{rI{tSJB?&ag$DF?feiX35-!CE8;?( zlQhn{(#UYvrx^~+7S9_*oM53ixqvf#(M+=duL(-uV}C|2U)2ra;am|Z;b_9lceDgD zc?WSN+%w;a72)1a)FyHktl%nCo4&L8t<7Y?^SEa1Za(7~V=d+o5?NempVR( z+2GD2!ehXybWDd4Qbulg*`HA;ZJ7JZ*kx7YK(&lh&O9In4uIj4yJ6OrS%lsht5`s*IJ7wP8$9G6{*mt<7!74R4j>z(jM#7Eq%sspsj&M_ouO;#i8wq>MKMmozvI8YidzbrdHV`7_`Wn5L&(_$)tZ{7h3{3gNkdZD8 z+uWPwD;bx?F#UKyB+an_E%eP4)^Zj(7G~qZG5u>w!Daou)!0% zMuZ>wiG?s^11JC(OPg0ZJFrz&G~#xiVorjm3MlX5US~f$22;La#Qj&VOWb57dbrs3 zfo8hMXG5rel4E1I&kGN`t{JCiTH6;A{>4ih;~<<6_fPi0P*j}QU)8`;OB;!=_Gaq8 zX`JI^lVrC0JW$b20hZWljn@9_?MexBF?PaSnpKnhj{l&kdbG z$l>+^LCeqCB%)W+KB#7T_RDmJH>MkBf_y}l@Lmb~_g2n7_he{>&IwqB+^m88!u9pA zF(*5drslvNry3uLEk6U%S+wPUeAyK75p^Qm93{b^?2I=4#}}Fk3_{meyT;DV#4}s* ze|mAH0X8JA>ssKMB>G=ph{iG2#QxsG+W)l!u(c;dKz?3);(QLZ|8cLFf8f~w#63kF zIXIuO?f?El1vJnG7FFH3+x0)4>Ri-d)Nwi#$|vxDg6skoAw~pW2-Q0$p8plXVmd&| z^fxvpovHc%6=Xg>xDXt{(b)g;SUeWr-Q6o%B?p9KB^Ei9e9mGaR08ypAt_OBa0uF$ zzn3dNX^h)a8QlL_;w87-pZ#GF_E|=g%)acO(0QAHIi#~VAN3!Hq#^Z{({b)#vGaub;yTVTc62a31WopHX6fBYb-KMta?W`%1N3uQ3VqkM`vvJT zy(Y=o*JX|VcqRr{n@wQ3lcq}*e`0hquer6SZXT6tcCZ`AcW3QOoj>kc+EM7-%T79l zMmqnHr1s^T4&4IIw4#m2wq>5C$GdC8^7`(-*)2TX)+v#9Z~PashDiFj98E_T2rn66 z{x~4qRkAr^PQFn^fKr^CzI)z{p4X{0o?Qkhuw9}2>1tv5NN^!-PZpH%v4;(mAy@o=|NY|&kaWiWVhskqGUFJXoZ;X36v0??PqU%LD}!RK zo?97ADLORXC&yKy%fC7ooKA`+ap#Y8QhV)18Z>`sx*Z8uw?kd7MF!yQ25a>j-*;l`3On;+{$TQx8=R*k&E7UM z?SDY&0z`8Z)xtuhrupF3>}NgY@y@pox|Ic zW__~D$}MbNOAoal6>z-1?|rXHK853{gb+LFBZQ(xsSX0Fq|SCU%rmE_LHOXmvO($v zgeo#sQ1V<&|C<@`F8I0#A1U49(6JhexU1n3&SVUCb`ue_dN;CLr#uBkhks7DP8}(N zGYbc&CZ8Fke*zf~`#r{ou)kxD^9N!1_)ueCzY#efA1hS)#KGG*@0hyDU8{a;3R!1I zLF)qNAKlhGMGh6mxS9Opfxx^x#mKh*y4lV0W(~MPOy>Me8y1=9fXF@}SD8T%ctiA* z+qzMnYWl}2er_GFwqEr3lQ;hWHt=_av8M7iggrw3LC1!7OFa5S`6l(I zjRIsi1h=9nBzB`o^-p!{P}|X~SucZS#_J6UijIx_KA*e}!qBzzx)9?Bvk2>yh0d6$ z_j{HyP5O7TT(@3)an`ON{ZpjST)}9?Z$Z6Gf0Dc}Gw1#Y-}b<1W7r;rizcuA4qQw4 zW1!b+otCgM{^Jf9i3{=i8jl1{nUnValUS`bg)&uO_4WF%>@=$>ps z;K{L7qOP}%ol5UcvDeGBop($p9RdpNa&)M~*;w@FEiV<0MEG6IZ38DR zj!YdG9Cpo&4}R8{zJIctUDysJjw#^q?N$$XN1z(TTAhVADXXH0yQ2+Vv7mSAV1bIB zPAiq?L6cno>J1%(c6{oQVtIJ7S*IFjZdjOHZPsI zd4DGikpoQB-D@O?>rV=X$Q#c6PIegaD-P6#Ob%sU$|xq=%6(*~tkH;C!^u-A$X8M8 z=DajiIKcMllBTH}WwCZvy-l-MOMcUHCvmd!EvMz~F_VtR-cwOovm5scj(SrBV~w4> zi{STlst_IOtyAxx`iFK+hlh5Q!AH!xs>dID&%Ak_T>I>0uNFJuFKA)?(XR&O=G*2Y z^n259H;&b;2P(uJzBxgi>K4cog*@_--g6BI)7AZk?VXWgDM!bsyvvoBMQ3pJ!(X>{JG4Eroz<yj(&ZZreM}qV&k##22TIuMOCe{zxNxL0teVJ_0bbD8P+~vmvatNKm=Tdu*K4+$imW= zO7`(!g=4Mz0bQ9>56Aezcb9cO^YJz+^I=V4BD=mtmtKe^C)&5}eV3mLVeD*6kSUAj zlq>F$!kk$bL9sXcg!5Wgj2YZ@BlnE{)j#5Y0lQw|91~#M`iqU=EM_>(ZHu)FX*O4M3?_KFybGZI*VbZcllQ){ z8V?_im3L@8<@1u4lPlLf(yI*phl%7Pq7Kaca?4E+qxriZ(aZp`^FHv~e@y=|zNg9a zRCwLzv#tN-){p!6!u5CUTV6PgZ8y0zMP4y>d({>dmX>90N?ye-S^=51Bd=x#%e4RbJ zLiwI>!wAI5{!I>Nf8p7IEq+5Cz25%=xITS2F@>58R>L+wsE|#BaK>ns=%L?QI4tUn zbcp(+03Mwl^;DoGm^gCcS6TvBaF^twiQ4aT9;~oCh`0S7d%V_XbAtq^6>4yZm1|&QN&>8_aCtV z{=%-uX!0Lb5Aqc=e{p6M^Kev8SNhcj4H+I}WLZ70V@Q#H*aEtmOx`{t7rr-wy-k5= z@ZN8#uB(bv(!Tng*GgBi4z4^mL!d|gATx)Zl`EKjIx_DvKeq8pnBpjpT-GwydWc^2!%y&>k)W8!+<@OO^Vt2R_BJ zrKRtjj9%2@RaomAtPB^$$TC6q!>nMITk zPkXWH!>$#y{SVT)fRzaL;Ys{=asmkTydM_!N}|eo;*;RiIbxv^2Mw{nRi<;r_ zceioZ;pxXgrn4U4_H285@v>VBe?<%bLnb_cat>+#u4(~(4xSq>tOUPE@nF49af5AL zn|D9=&efHn{*B_PzT{U&)>ZYhTjJ$56TA^07rt@m))>O)t0N(xIo`f3vsUxd`^xVt zcm3xWu6GOE4qtu0KhO%M7%?yQW?Am2hGoIoEZYA;zwM&HL#2Gx4ss%YN6cnX^9&tB z1&MmTq6CEty(Uc6zH632f&OI|3srGyUeRTGa;{A2BK${I$|IF`%A$JB>O&`2j#A~j zPdMK~c`HpkpM80=-_s3WR8}@^P0EU&2%-MneX4i8FRs{5w^UP!YY1dQ{xH|^Fp>X} zJfeR@INERc0%2RRr=G8=4t8?exZ63Di85<)A?jNiY^dA3a%ZE#zru;A;#PadPxoT) z*D^5yC>Odeh5|$oGyIcPA}jqV`mycTU*5cwLRxHSp8@y&0=piuOL%%UJfX3l2Z`HGSt@{97*R7&b2)8ee@ks?*_@_~J zk2Y;y>t4u1*79uN>&HK`Q5shKy}0^*ulu+g6ubP1GfH5cy4*DShlr=?!|qMu=4dFq zrkN?ZDFo!X{}Vz@ZoMqsrye<*Q&Kk?Gbt8VC>zNYRN z+*H>tRXZWNhmMB4O640n50_&^T#&Bn7iWtGU3i$Zbn4?uS?knRCd&P8vR$V$>wO6a z)w1F*d-d2a9y#__6$}j^R(wN3))QW`bb-+MpP1Fc(L50>xRm-2+hH4snM|(_HU(sB zMUQ@e@Aw&!Vy|BpG}ml5_K-fS*Ho?2l$1@cFxZ3ZF|_KW0j^dM)whG?Kxu4zU z>(^E>v`~>D0&J@*Yu;JTOqDj}ReWcv@vM`H-8aA5xq0RJ1P#RT8m zNQZ`NfhA${D|-6N(<5IkHA&qhH@B_cI|&vA@X}QuR;`m9o<52%CdT*oX0xm+)VOUm zWhs!({VRG481U9h@Nz zKEJ)JwF07pnmAW0-HwWp$bp*B7AXxHeKp8vBe7-86aPvq2yc1t!*{HOc)TnaF; zcSs8de)HW>^&2wwPX5F;o{{IZU+rG(j@VeQMCFc+AWs*s+N3aip>FGm2-b17C@`PO zEE@c*B%NqRqRLgKCztYA=Z;ltlBv2@ZEKstvCF1_)y%D)73p-baIL4~ed-tIB6Bz* z9F4^Rm6NWOpKuOT%MSlNh7kqtg0##4L zK@fZ<#M|YjPf!TnsbF$5mY3AJc0V$3xJF+4(P0W`@Lppb5uSQuF-LK*sWC?n@ysWO zdiA#^hiAsEmdYCka{QQFwf~M@Fbpf4bZ^4i%^#Y1)}8eMM)CkGzyX z|7!?TyNn^-2sC8g7$M?dx<6z(tztr4Slf6Y>Gwp0Z_8*zzQ&}1JVE8c42XaOW6+ny zQ2&(u)r3sfIk&doED@#`aNk|(9;Nm^HcG6Ws&{+swm)W;<${=scT3-$N!CaWzlcK4 zyUGv>Ze>IjYx1={+<2KH?5&^TKJUzzn(j^dIltPx^s(FT1>`S5Y!pUFxZNk}MN6in z!<6jXoaGkkQnM5HllbR&$4Xx}b(L4Di3^7$TI4I>1m5}(?$y9=v7=gIx^rou+)Af3 z!2&wTrqI=mkC64Rl4D(cb^mEk43+ETr!uQPQJXFDA?8lt{hEVcJhwoX9TuGadQlt7 zZj1_nZhzBkh%TxxFEwo{j*RxUE^*_p3uQ(w$2N85z2zF$bI?wK+xr6*5Y;B>J$?ID zCAQ~@=g}edr}xMQ(F{H!xgg8?{)puFF-B_CV+xKaG%Uq|0KwROHASR_XW{gA+O(7i zC~CcWVR!kbRt9alP>qoNG16hFxzT!YtwyQN_G#^2isYSd`eXW~CXL5OKY96vNr;KR zq`8NPHFo`i9de8{7#C0qxIYV_7GT9^P>`|?&rnWRR?E}O3tV@3*QrK-|NgK`@T?Tx zffkJ}icq-ROrW0p$?(;DgNHI`#H1aVaGBDrE>wM$Tk%Qji!|5KW?SW&SE?auPj*HN zWBgWtg^-0zLz#{rxJ*)MD#*&lCT_Uv|K>RPR(6LYv{8qa_VeinOt5af(UQia`hlWB zp(Tz@qw!{V&Q$o7IV?Uq2B-B6u9z+ZAp}c@8Ee7DbLH|u_|de7&5xQFr2|Dy#x^PJ zkAYHf`+8edW4%3La9|s@pX<+7v@yYFr6fd0!~oOv)r z?vVW)lfvF^p&F`?uCEG-kA?$V<_>l{=AIP!UEWqVJe``{{*uTc6}rEdg&>ieZ`ASc z2vQI(o26 zl#P3G2RxY`_g@&yduG!pm^;N+JTB~Z^unWkwaJ_J(gC&mEL*K(hrRiPXD%8yL<(ig ztHVBa+Alb=aK!m+Seu1RDEU!WOMz962jUor_Iv#Ni~ek7!+mDhV$wcdoKZ#Dr+wmr zqkG2%snU}#{pPoMzL{*cx7iSCHEa)$Y>)BYSm;4E#d=VqQ+Mwir9HA1d>$BuU|g_t zjwRJcfwYA5_9=cp1QY{lgF-e7=F7A`A_17pYX)h|PmEmrDlQ^OZ{=ML8{+eyn?A~J z8t$B$6!<21M3{81GdyXa5iObd6sco! z*x6LkGAPiQ_$dEV&+99Vr>&m`(D}n5Gu`V!ts+}(1|MU!<%+^RsNE*_i)<@1>)7*r zz4qAmzl;dqFD$xE4@Srhkd(JrsuwfDz4tSmd7Orm6L^Z~!1&A#^3LP>sW`IHxde}e z%m;LevFe3Wj8Ok4=2lJY@WfIVp(CZih(o@H)yb;oo{LIlw%?rB(}UVbqfrRT?4B;B z+!!Aho?!AX1BhO2CH6-kCI55>c69Vv=*T*0(CUGvMALDe^@EqW0*N7%0!)4NyB}1o zMiunE=4AOic*e%`nEZhv0vY_x9h~V+5b4zbE)BY~@5`A@@Pwp&ooVdzp8v$OyMDL2 zL6vLKy%hQO&d$XP#E)Z>SY1M35-A?D`qB!ruYqlO)QIl<>5%oHrt#$vxFo|!5*wli zPV;#O1!6KcIqri{XfclhDJw8HKB9lCS!fn#vkP!J&kkA~PM@~QjGVa0Zgpx% zL5(?QI;ULPn~6hZM!a0cs$^Abm5Ux!4Wa7$3~It^i|25MS~1~;mXBGzuVpRqcdT%o zs#&usWz<$*2%Pk|2y^t^_NxAcep9jbL|L2sBI>6ZN9C`P2{KD{uLW4cLaRV(ba7KE zZTVth7{WV&Jydw7(eV-08%08~Tr84;-S1C%$72YpI;#T-*Ic5XkpxzB_I}jhjp?+5 zw;pCKaJkH1gxtmGNiou&ggFsONwgQ=3$nThA17pz6Gqe~%99l|Jvls;m6jbK=ds*JCfixnxN<2^u`cI3 zh2Lmp;?*djr&J{kPxY$j>+)H?-ljR-|GAj??8D=N{7U=1sS%4gczBnk>cDS-OTfZ- zC#U1m^#*q*XNt1>9cUp{5E&dv-y#+)e>e@L za5N>da@^)ZHyzkUEIh^aJ2Hr_v@G_Pm+cEHZhIb0fpC|H89+mIy(hS~#|7Z+c3r1Y zjzMH6`NShv*O>_6F3CFUAA(q3ux7#UjzI0G#)L&!9d0Vo8icg22^%oeuwT##LxqBls#9)g zaeLKzuSBu!`g}pCq{pM_INOV{Acf+Trz3*Yt*g7twe>wvJZ4byFmG#G`$63wP^TDDEqoL z_jb*Ll~AN5-=5Wx-m;ROc;NSTWNH&5+;jW0Dx*f{Cs^5rZnmoZ;dJonDAhg2STLj=g0q{*s*)5soFy%=o(1`55pXyx z#|P$@G4Y`0qox<0!`Ro(gQGr+kPRXF#J%?P$2A*03*$NEyB@>Evdx|;+pD1w4jV~T zf^s?)(Rl$|%*w<7)t9G~^+UzfGqs=%*Usmu{s>Fz`2#$veyZTvcp@Vjp<5Ami zE$5!Cx%L^T$%sMZ!VY1IgFA@azXMt+d@;5DsdG`PNjDKSEph9bpu#|8=oG8$qUT+< zgyGjPa_&gaxz5tjQ^e~uQ_oW-B*~>3F8_z+g;%|lT5GfisJ>7zn z#|G3ReVGV(6*)!C|2!HK@=YbEM}D)*Hf}sMG*bb2OgAPlQ;t!sKt1|rj)KPmXHOz; ztXV2l-5t5Ht^}Rhz!l&vW(T3}*DyJiTc4xHohbPA^ffpI+2pi`IIMK8>Bb^%t8{&| z`;|I-`=tOO_K}MPdm`_#MSiVzu=aLWH_3IK@9tIl!^vP470bx3IX$qvO|F`G>BCNZ zqL}q~UQg&yFA3MvOADspVOyS-y0t3)v>38ErB-1bgn&S7nc)`oL(|q5@#WJle6Kd+ zGBdMH1$thz*7bEov9sS9e-z%>z%LcsTljtQ%d|DgVoCbRa=rbIe0-xGUPVgl5q zSb)x!D|5*UL;sJnw~mW)i`s@IBrH?}L|PD}mF^G$Dd|ongdwGK21G@XP!NztX@-(+ zu;`HPkY->Qx&~&xJ$TM@&hdHQ@Av(_zYfBjx%a*I+AFSgt+n8~Z^g><#$rL|oQxC! zh(QNuOX0Y~TZhqx79D-WrnOe9ca?1B_EOLI*ba#QOZ-r>qqW##kg~g4e$AyILH9x= zL?{{nFiP2bU8){FH?B)RExbT~Se2XLYOUPf(4{Sza?v?&B)DnuR#D8rk9(_sW&BNi2r|AqHs(HMUWdT|51u@cz zRzQV4a+Hg}0UZ8My50etpf<4aNVbPQvIly};Wv~7+#9rZNxEX>p0fBF|8Tuv)q0G= zf`(FLL$KB2`^~JY{cI7t-Wma$_?8OKHldC!1DT4jc=71{eDRtCh+n_CeK`RFaZuEV zE$=5l+7KW_h9>en(JaU!}=w89|&}~p&aNP?3tX?F$5ASkN>cSW`J|YfAjOvWYFx~;+ z3jTJ@PYzI&A&wUd>k&7GoaTx*f&EU&`7UUkMfF(Qw9|Q zM;TAYYW((SGQ$0COf-5``frc=ZM9A^FT7-u%m9&*l||%GU#%N6wP+4p!hOkuZxJ48 zJw0WbLf@WyGF)KDF71Evx(;(}>DtpJH~;d>)~_f^4|LXwB<5jssoY^oCNWOC_|4}86{a^K^AU9WJ&i@K5MEFMl17z={aJe%#Opt= zS!DVC&9Edf#&edwl}OPCBF7y5VYprqJLHbXc2Y(r^&`QU)(O$2;bynM-@znu*Xoz=SDvknqpV3GMEn(ME{$R zfc=}0U~Ez!As?r30r~O#(hY5-lSa`?9H%2U-zfPdu!&!o0C|*l__ZF0$h`>PLqD- z%n)`H=M1E=Q2Q%9{Z@iX^TfHpnstLj;lgM?ryE?u?#{QwD-*Gd>Ent&gq#i7#4DWI z_ewX58i}JL=|x$F_f}cdm>c%9Bi!38J6-V-giI4& zxXLfTM)8A+*ADvu>GkWwh{L!8TQc2{P>P8lFZCxRg2__Rf}#j$2f|4s`^#maX2QVHaTGrey4qe%$071tHiiulwZ*CD*N;%zyM z%d1)v;&SpPayqKkiS{<+CCn_FIb*b4ODn^uHJ(KBo__5Qorf< zH%{YHd>O`~)Tl1s&>+4l=+t#EMZ6%(Gk!l9z2BY+cQgAcu_`($ot-4kc0P=HBqG-; zm#?qHkxdl#rBrq|^UY$b+BaY2zES>&5EpynuAIizmqC0B!wi#S*yUfrt{odvuCrB` zNbzpHyx5M$lOv3elx4jQvPKI)ZT;$pp}I+qkP25w7Pi|lvGm6p%^+l;1U4^>&%}K> z;zaR*xyC~t2g1EINtSdch62gy7KR#G8a6;6w!u4+EmcapKd^?x3lOtU?}#zPNYS*?pW0>8`A0iKe`-ac1LuC^(bm@b0ETRRQFt9&+{ z*PZp^Elu~nc);r2PQFSLOw@;sB5J%Is|&{lI#1;5Ml8*IsCHR**Cbet$W@#Uijsyw zBW>~+?h+NF8j)kPPu%r$bmVJxmU$^S^HQWV&tDnG z8_%0shYp=M`KcX$*BR!G_~BJ&w4mtRm{Gvna9@dCw3R5*U~d|ZAk$T_NY<=Awl(TWwr+39VAB#C?4QwU&{ zu%#EdK|>N_ zEs~CM9PbaOGRK-2%d=Z59h5Y4`9!&ao7pX@*)9zJ+wgSp_9A9FUCy; zOHDo=JxFQ3t5f5>`DsO@n{Z%emz-?k=98=H_HW|Y^<~X`x3yPXmIQlW>E@xpFV z68ql+T(_PdPC{4g>?&@JJmH<>((LUWvlId8juqhv&&CNCG{IFWbBS@DrSMEtw%V~F z4vrix?Wh~b=QzgD^r*CO`aO`dl#v2+KT!=3(Qnv7Voc&vS2niQ?eV3{g!n+dJ%%XG zKZ7ffpD-1Jr1@w`KxDo_In(er?EbsNlCH8&4`OMG4;3z{{vtMW(u(G@*?KMpgvXq~ zsjG!m!i`i`qBdRE?mx@j_#fg+VJ?D{kK*mEP;bm*FKWk-ryVPh(KIw1+2 zL6oPfRa#3UDA@BrpTAhY$OK_xt-xOX{^)Du^d7O(Ux zqa#peytc)@Jv>H~zP-?q&H1>KGV(2b0CC%MQ8?F=bOup(ndXS6*cE!gG)&B9ND47M zY)T-l@P;m6&8$eV*FMuZH6+L`yO5n3z_syvzX(UX2nmklcyy|k?% zq~7SjD)xS+Vv9WiB^5P~SE24GehqQI37tD3P5P;bIBxyYFVY8(lRPgQ>zf){Dxek3 zPj1$W3rCecxvC~FgP}!FG{=sL^zu#uUf%<3pi?#96 zejRAxXPuLe1n3O^AMIHZ=4UG$rx-08Fb1=;q2q;=^P83>09r(vY-Z)FCQB3`2ltkppQVVccuDBt26D#s!?X?|?) z4FECg1wu7=Gh?k`*#1fzdDsp(jUByn+3vL?k0C@DDh4Ub zJ(*;sz_-UMUV;`VB`t#LM2r!f*Ce?Qj^nHGkf@V{U)iDo?vh59^3gtuFC1 z*9ICZ<%CFSbx(g@hsD?oWO=qWVCH;NSERX&O&oKmsmYrI*u10SvU`+1KmPp4 zeJF_o|KlwgY1;rvVgflbe4sj?9?9v_rfSXq6%=i2pCbF6OSSwJB@ zE3edUAWO2OB}ZPYu$Q%lDYqyL#hk9TJ5Q-Wu!#lapwTL5c*0)D-6t>a&7?@x;axz z7FnY%1ywNk62P6X!-CsDN-049N0)`RA&2YTkZ*+ z>i*#ux=SN)?B)Kn8jeq~fjy3td&h>_ERx(^9~IuEG+*$B? zD!qI6t}jzjI$mVmuYVn)F&X3T6CJBns%NV2*~W$QK#^%jsc`)fy^9+IJlir-2X~4U z?d^KA((AUmm$a&tcO|56g6u81+Zigtuk~1$pwLf`ZoBliVxZEiiVWA;5p3_ZP~Ey= z!=pN%leH#Oq(l00pYq7w22lC|RTo4cCf}WU~z;Pgj@GzC{>KENQt{#B1Sx_Lz`4~qVreC=Z_D!Mb~nPrdsT_ z{cZ#|r(}HZCoKUmrz6ETg{dsSLep7-t3YxOC%T1Kq1@x1oi!_cOP7<{g z2&D*$bQ`dm#et^1IC`49p%1-rnR~eV+Ecj0FqeJm67kX*;EH?(5Om9P9pI14g5odV z%O)%dr?qS|HBF^GQmaP~oz||r3SQak*Fb%B8muS{;NSN8+D2aTxb3*pv4sqB=Ad%% zlYai+y#QX6(tgwW?5b-wP?pKQu558)bmDsa;(W`4(paQPZoAH2iP%NeyP#ExfVAa> zMe#(Vvh^7UP3`KMT^hsg3Tcn6s@%FFd^O{W7};;m*LG*_q44DHCtEJ$39@jAEm_!#h8zTF z>&l5)n28@=RP z$M&hzDqkXp7EdEDkR~Fjv%mKSplHq@Bv1LRM1VXg2G#kC3B7%iwc1*{TVr&NQb1Zx z*sGbPt@S7Nid?-L@Sf0LCDoo>-Q{oYxIxgHlJ)iO-K(Zm#T5zP`xj-M9A%lWQ<;C| z=*ac<-;5e_eGR4685UYjwdkjGTnHy?i~*U0=x)=UQd6DYwz-zpFDHI(d7%=7&&)uy zv&_qci!8x1f`AwhdqYRcL6p4GTOPjG3i&z4@h@^9M7Zetc!d+obim#-+7U747QADS zvt#nxr`v14n@b2BFWeWR!bR}`qxL^#IDv75TZokr3mVl*x8@&IaTRp6BRJl(S0b;e z0Gr!5<_kw*?71SCkG9|4N*MgeBe#yqCJ*jw`FIC~RZ&yxr5n1Y-SKmk{@xvmP9}{E zgCrqg$w6OI1>_~EOO(8tT2n_>VFM)w3g-23m|9+`ji+!CTKooFVlG)w@st2WA_1}x zO|`7uWvvj>1H01L2M|a?Zm7GZ=K&Z{tNN6p%E>_8QG)jwA}Eld(O(HP-_I>D>uSJx zGvz*j;m=qMP*D6;-=DzOX*C8Z-R+^cvD47mpKAu0Z5ixwN0QU82qRbGWCI=QdXOsa zR^mxiD{PYsCtypKjP^OsXGk(lkX)6DNaZ!HVbSC7D!!yi*>QDF}VN7LIGpr&H)M zY~NkiW{!%|wpyH6$f^SFLJVhYOaxK__G-)>bVQdA^Hj$ia#w3yhMtwsZoM6 z3I$)7WWoq-X zhtHfe)ty}L#zb)GJTM-B5Y<)`%isAmPl_bK%k$QJGdf49>vK)Y^&rp_TU9kX=A8ye z-h~`-!gjfiLzwzn-1`vLg2xw|%Z>s68HnF&AbxDVm`PzVv375-qnI&;uvA+!{3%dv z@hjNx0YG-kcIT~&Au(HhC58b=CQqbj&TmKq(0oXe>}6E|q#=yI7?*#vSVeml_a3;8 zJ>GLG27(`?e0OZ^#s(_YSN!OhRbI%4Qbu1&uI)G;)h@Y@O%ZJH{-V0lm)^*o;)2NF z!aAB&@IlgjyT-J#r@(fK2R;5V3%YJfRha{>t@r$^T?W%o%0b??bp!0m^XLesxXOa= z%nzThH469dD9u^zcNb)Fpv~M0au$vxmC9EI-!G^vCgzE_TNHs5n(Vo2w=LR1iWJvb zfN*;-9eK)WOu;p^;#i(O8N9k-9*}x6?VBgBZF9^D(iZV3rJhz1XReb5jq#C*SSSN} zm3FiypvcZ#@Va@rue|m|Ow+Z!8gZF!*oGCRYb^5BVavD>C;pq@`LXl&DwQWzj27gVcK1T zRXZ_X1L>SXn-yca;mr?r&3--F-O16*Uyp8)&~=DA!55GPv9SF;)!qGRe=|>~@wE{` zcFnx7mSBV)N>?8?psXay28s8+ivRH@z$H2Kqqf1>05@I{GzFq7ZyL*X3$fAqXu>Y) zec)a3GFdc{3r7e5$(XTOH>zWvZ1U)m7)_dRnxUv84>#!T{c3%TI>2ol$0}7Udhr)XE9eQC-xoY5n2$Qk*@p*D$@yaRv+sHzSZ%yx_^G)_1qS^?`-^2bVx$^>g%ITJ;+Gai;BGYc^1nRpKaHr*60<#fN*Rn0ufLPi;4>%Y zc)sq$B5;q9@XE$V;2V*B7QKeUQDvGy%A9E8*3(+qzc`$L#;vK+sGd~wQwIi}lSJqd zY#E-9yIlxN9K|ID+Fy`6UEJeg}jAgMxznSARj5BNfpFd){-H9oYSqZsj0RG!Ft63u` ze6y$)_lj3__u(bvms~qpr>mr3_gQ50s1rn!We; zbtln~?fhr|G4;2fFTXdu2&C{KixZ`zt_{Z&z{lx8v{=T1f(l zlGq78NFaMpeABT!{QkwxRjpx8qt&n9ftv3D+YfCxLkrrO9diKwy7{4~2<{{Tv+=7X z={hWq8ovUV4$!8W)v;7?OyX>pA~5iZ?`EdyrK&04CX7-VlL+@3RH!JTUh?4BRky{Xa+R^Y5l;hk89e(|C&1AI+j7%rT3^%WCJiu37N zf&cVtdYe>Iy0BYjz$0bMBrIf9v2xpERk&~caC<+s0}v(bw%xz%lnEU6)C-6D-jRtb zr1PldNwQb%(t#buhj0_emFl?wNV>YhS+Qeb$+>1uwvuSClwNLMl$BMlklw$ZM+Mjl zuE+^~<=Tu!Phw{8omQr5RK+9L*#k|-E4y#y=WIGDduK0S5W^dUZTAaI+wLBEpp<^6n>eMlCLXyRO*YBF&~Or!Bn^`? zo_IR_fORtr^4*W%$p3hX7+g>XYjZO> z-IPc|+9$dD$Z`Dv*o3g-*g(3kT)}mBi5ioW9bW z?n&%jk;!3O`!_<#8LFeM3N#TN72Gsd$h?K-+F@8+SlES*xe4g>+(YT_7KTcfs0Df8 z%*@W!iVY_d$LsgY$D4QU=M&ZoG877GT;=1;wA!k&o<99?>+W6Iy|oF}+KU~HVVR%} zXZASRWWn&@r$PeKAPrDUK=K0KDtfAYs{q`-TxjC5CR{wN>)P|JNCjf#8*#DFto&J- zbH7LnUqrkIL^s9{b)6LzuoZ0yEcb4zafVO!YNil7FW?KSdrv=WaSMB>`WJxgY+n$>*#I3@2taMhOe5} z-RHTL+|m6&JDSJ|_{YIMd@XKlIj-Ij& zHrC}Hqk^3$Mq>gllRNt7SKAJI z@e}QuE?wbvP+O;pHXF=+5q3B$uPsq21L|!ub=nRlLUFkOaQT7(x^zi|>3t>u`|LF8 z1ADWlKvk*n6IwdDTiQ^lam`+%@gAMXtR9`7xFF~az)Ism#Y1bY`y5!Y10}%kRo|ec z1bzA*f-=OwS{8xR{-cb-K^2bU%0*`DWC@FUu$(2u`}ben5TO@eJdeyZo62~hlW(G% zxP-Jg42@Z6QF=39NJHG7pxYsl*PvQ`4uBC1?G%$He!^*UvgQFO70r%$c;>XJ8bky3 zJ>0AP8#cgjAk4=+6Cwy{>(PcrCx-0Dg1o=)LNP)DWYE-JhlTAZ2k1NlZV8~qc~WdG zbg)?~*H$7FAI(Ls*XXbaH6z75cCVaPD!P~f&)x@a!82NFFK#)y`^lB#SJ<9_uctld zLPrd)Tqxhekit-G>HLaMS3t?5?T1f1+sZp9D=)=Xn)$RIR1(Ac=0oMd4PXTBAF=zT z*TDT_e=E&sET8@x^KX@9WaHWfZ)1D}p)lifgJy{OiQc>Z4yDYbyUx`iI^}_=sXpuV_)x92D zkd$y&dLF@3;`&9nnX{4JQbscI5)BC<$WJL+n35TR&<#VrF?o#xo6P)IuN1}%!Ymqs z%9N}My22<&#cn^Na7P97&^K!O;dC3hJg>L=%lsO8T&9fMPt;>TX1@L1H)0lUK|$k_ z&+?(lZCchDKC64cHR7yy4B^odVP!R@c6P{#ACoI;)U{DN(ai!m%u8#a!zbBV49GUg zckLBHIxiI&!V5RG)s4!LEZpG?Ft))$d&Nl}z(TclGx=;4wCVQ|mv0(!8kEvyWu8OX z>)qy1ZjXiE2DHm}HU(oU=!d5A1@toiE~pKfp{UApJAXLeVXn%iQK+i4GFe~GzW$K$ z=BKoYr`wFDbocPVIJSaIfo;nw{ZspZss!KK>l`w{$BCP$aZv8w=zIwE56Lk z-cmuki@KIS_j9(?Ydrd#{oZZKq2n7obBaJP_lxVUnb)qRIu(z}+wae{qo!@We0>wH zaZ>W;(SpvIzl9O^ta~cBE*a%)?%S;xGnkt0`@05HrN-jpktb=0X?n<^k06aCKn7>$ zLSJ$GhNN)+*E2(K#Vs0q%jizOE9lPUSK-_@5o{V-?!UeU^<9e_`$&(kp@NJC4+?U* zI&y+tnUH@>>NT|foIq1&HYeN-yfbu^`Fune`J=& zJ1ZNS<{tF(9_d^9zGzgZudvO2r<13!V+SndN#j~P|58%?w5VGT8>+iA#mcZ0`sTRd zY3*^jed<6iIlE;`5))N89fI%M5K^hca>-0-%uQo&jbF--Ov%ZtLBL7JJb~K2Psl#O z_OQ%(+@!|C4z=YY$!%a{#KEcO_`Y1BHi|5>^@|+H(mV)d`TVFZ^P!`WV05p73-gqL zdL@Ted#}!DiDTujN^{S=p7j&g8H>>S3eQ!(5pDLRK_%_Rv*NA4|6-pMw~c#|8|s_m zc3j~Z4R|qXQG2W%>ls#Ut(_GEA79_yb@BR!sq4*Fxp&V**EC`qcid9!F0=Pj{I`D4 zYER0AW9h3NZN11kMzm^Rksqh7fS#bZ0|5STDj`W8x_>f*`?rw%4z>aVQ_tu0dOZoR z?j2~a=Fe(%vE(p}admZF_{cULB|Mel6c4TN|5Y{e;ao6+tNbB_N>#(C?nx0r7YRYky8=5k9Hj>c2V+39I%S&WDL9SQRjjko&yOXm;urK0Tk zp>I#x6dl^foO4z@d+3E^QoJ{aRtD3fPn_Z^BI(qDPV!ct!T`!9SDts<2Q-79+zqy& zN^>uKWY4k zufQBa_LeHO#h{;+Q}M%2qxT`sk)r906vc%p{|@jUb)=p$IRN}|(J`++_EQ_i%) z?)qOnbgtWzybq$I71}4sFyjVJ=|5vsl(VwbAT<-TmSrE6OP9Fg3QwBbREh$OK=0=m z{ng>_6m02*>%Qf6Hph3GlHWfG`wIIt&7gwT?v4|lI_%2~tl2#d(T?bdR$y$9>p9Qm zQL!kFuKg8BS2B8?)ErX^ofGO{A||7Y`SQe^lgj)l>;d&tc-i?FJ)j{HoLr$*X;~K&y||x4pw}j;_d9_s#V*a4(s9R?K=y)rT*&sT&+;wBZbxT*?29?tqrerf1C9-Z}kQFdTH3+@R}#P%4Ek> zFk5^3AgoHK!Jmo31a`Qa>-y!uPrm#$jtfs1+N9nw+}^APi%)>Zwu)@;NM-r+{iCH! zsK86qP~1B8u>SdVosI>nK`u7XCE>1G4cp2J)pT4>78rz~5z=xDgw}Pno>z3jyfk3O07N7{c%nQ2M{%K$b`l=7eI~py-n`wL^wt)g2tlGHBIeMt zKBxCXwsnm!T@Ug=U$e~bpUQqhWtn_vbCsTw6@7^|_9D!|ODq)DRwB4H(ZSG`zHe?1 z6RW_TLMp{|w@tdJgjgm}qWiXLiZzVzn3GJCw7xzaiwEk+*3iOpR z&{uvP$!YX|Y>+O`+Yv^yhwGkE?yG$d!PU3!91T_-K3Fa_yfl0XHJKjmzxk!K?^gzh zy7H-|Y0_&MypJ!2Xve@XgZPop5JTI>SRuOsne_&bXC~4s_^$<@-5z@H6xMAHIuA`? zisG#G`|#{5x~4^&bC6L{S4l4osT*V~AXc?FnO&rJPo7x)45Y7_jFl)~M04-g<(Q%Z zcE{AVkogP?U$?tmz5V6Ib?%&WC$@B$R))nre=d?ZD=#n47tnmq=O}aEx}`fn2%S%( zE`==&y8%tuSsDD1@WULZptH|Of3m zRx-mkv%mHF-+!w!vN(v(ZckAwU1(jGFR>kh%@0zozZ*8I(Fgol=e+&OQkcL(ZWx>` ziMf&Ia0ImLiJ|c~QjZs&^AP<(GPT-QGhGShX|&V$DwvNpU}&oMBRC!K5eSxD#9&Ns zbL3e{fAq^7hAYc`y>lxij|UYdc}6R-#lT8+m8qXCT?*K)=?|}>?rTj`9_#Z3Ur56TgKFsQ$Rq6)lA4pk9t41C^*gM^QI;K6aFj92vvHZm}bcE zCDqq&M;D3oFeKcg`TOPu8G-w3wptl@?k}r_3qNq4j!ukB&fOcR(H5uJv(xoV1x7-- z8)ekgqa|*YKJH$1S8|}chkjhz$@<<`(`8Id!s<4+8q4ItwDr6$FG07pWqz(N$QqCI zWct1a)ARA$yVo@PzpeH`h?#G|jI$Y5ycbsjGE}lFYP93G9zRC3CKgTbwoglef}L@x zj!ehF2t)G*4uXf0)nB(ZH$Rt*9Bkf4S9FzIH>Q>jY|Y^zAM)WuU;3H`*6-kuxJM-E z<9D(|Rh*Oa+YN#MU29fQmqh!w4f_3uG}f~z0mn9)+LK}lixUkzZ6TfZUT{9DNID2L zo|F01XoZoNq)01mUw2!Zhv$d>0PY0ADD^2Ht*_s{CB>Gmui57ZOckjMuV!^k&*f4J zjSq!?Q;aZf96JstA*&oMw3RCmoo;mY(*A7P97(ygeO~pD!aA(h;zLeT16)b%HFjdI z67mM#i%5N#m_Dh}abbN1)B;UOu~kka6@a&ac@J8tdhNRajT`>gO%uL6^z zUHPW{FHhaTLGQ0Rg)O30l~q&<3}YMV)FIZT z$oA%xdg4qD0>o|@`vR{7N>!i7Q9DZwZUfHeqN42X%ZEdc7(9L<`Ot9v%ul&X1;bVC z1|env9EnG}D~L^!4iz5S!i#xDM%&p7QslOIYm>jc2`}e32BFvMv<5H51i}HMsdR-4?&vj0!oifJxJs&-se@D@(YpdF9p;*%S|s(VP0X=w zf19F$LRCN^(eA2UWLsxn-^;u*cz%**L|)MVCI;$u1L zHREDvcE~I4xgHI7^1tU)vwD^qx|qwi)(LfOPMhj0P^pC^njP!}Np|ReDL`erqZoI| zXYW_OJnpr$>jO-fz<;*x_re0j@dvTIm(~Yf{;xi|-i&EO?+V&8vVyUe{pMT!TjeFd z-BUO-N%Dy%$eluimxn#KT}4zPF8#{VC9;F*OJ3Q+`sur=uvxu$7bNpT^@1T}vZ!tm!g_qPet82!?(Kf8SEv~3L%u#S1{^l?Ptc_nr(M; zQIgyjukP5F=pAA+q-@g6eXb185P~vbS{8Lt|xlO(x5GIdP zDYy2EQqgamGv`&Qjfzby^vFvg z&+mS_?B9<&-3^(h^8?5Dj(F;q{=~$qd(5+$i|RFC*5s9@q|E7Su|}HG3O_T;S1XrG=oTHZ_L1KLD3BvwGsP7T z3~Y097>K~kj=x>A-#@wN2fjnBhiaY&^6VAEh0o;YmtBwkH^% zo6A*W61H76U9KP?Nyu}#DXdQ4fV!a#m8TXqb9*OoJYWo_LO5y*w0!6ezy>k*@x{>a4Ce0z^j zyCFR+1}@z0Y%eT2hP;DK2BffoGF2poDVQ|R{t<4d+P|NlqY;?q`{Mq!Kh9}GF$lyX zki?jT*pJ}ZK9i0;tsj|Nk|;LY10Xefi)!R*9@_my3}S0gzrL`*J-RUrov_0lT1I&d)v*J&cVUg9y2e#zCSe!WP@@+J$H=4pP-T}j@CgSA5T5-Y zWc<%s;DPCawbF-=BXY`{O_h9n4qeCVdE2rRJlae}r)b)Dkb^&T!cEdm$s{l@uTfDY z?umAIAMWf}F{1Y8ZhF1_hfTt3xys(d`y?&fTB_O=N`zk5D?&KfRkX|V3Sm^R< z>`Q4$h<6oGdwAVG)X)Bg=VIeM zxKQJ#PIhcOD|u0X4)Djsxbm`IqlD)MUaO6InCb# zw*GalFme$~4c^xzWYPYXlJ4lToj8xa_4l7$dmPEFf!gZJleYvsqu2n2rhw5$=E(U)w?LF%BA0D}WaeJ-{3zqJ+Chh3i z)w5e&owr;Mt4bHbg6cEvqF=@`qO-Vb?-$e;DwI)OFO295_EO*Ca8}%9!L{r9mn1a# zfg|xl)qk}4a@Rc7f1O7MYl%k-eZP|+ zVq8rAI0UG+=t7YmovaGJdvbCMlfw+Lcyeq?uWc@Fb6FN_v8BK&^L?4Ve7Q=lt;ok$ z+Ob6&@H&hn&W=Hn^Gfq{JIn63kVxrN%fl+Sl-F?)QGQOT%iT=x{~X=W#L~2bV!iq= zH0JbO@a1RL$5~t7%GPsEPS{%3uN#_Uj6q|rX6014(8He~T&X^+c?u{5BOefxF(8l} z?dX|e2VS|`O5MVFQ}6Zo1!2h}Dc|ohhs%wTDjFJZ6a7P)nI*-91X%7nHE!}99`#enhkyNFJq9%l!NX%H=7CrKufscoM-#NX zd^^!`Rl(goV;9~68!VfvxkjGem{ph`VD@G)d|~(&L)$9vB&P>m(lq9J`DCNB@Zr|n zlJ%5ukqW2fm{-i#ulKB1>b$t^BaQh?4x}SYXhrqh+r^r5d`$CNAE@;fJ{v_f9=`DD08$4vi0!6*iVpRL9qeC6eWWSa73DdbPv zggG^A)RkHx;>=vC6(s!h9e*Piwyr$!VQ|;Io_c;q$|| z8dh1wfQ-J95auxM8U>X-JjdZ^XYFS84eeHQ*IzCxlcl8aneHyAI6NWbZ{20Kw(g&KR*m24c?Z@)xS#ZGA5p8$>^R^%@#SLs_BZ{}+ z568wuE-n5p#}THskVpK}cLQk&;bD?I@#_KRdOz1y>U}+|C(eH3VyHEh`kV{3O3NzI zXNU<65A?OMiMZ0)9o3mnt72APRr5*e^XJ~d8mH=nuP1$P6bz(d&(mO+zQ2}u{fZ>| zvSpsvU!5TTS=1m{Pkqe`QRzR9rRQAEOi3-CN2+6fbSQkrqwa2>SwJ1r-SS%DiL;1* z3@h#@!U&xE-d&%S`Oo+MUw?8scUi}aJZ$#=`hkD`5X3B_A?dO%$o;2A_^;VLy&Ept zfoU~~7T11PlKme(@Xrk*p#|3}$gRkZ{lD-0hZlGH&%i`rN+$`^Pia#Brw{z|JDC}h z%Q|F9erhUzfW-g3yua`A#5EB7vtIx4|KX!xAPFd!nXotd-_t<;*{Z*On#q#MNnBu$ z_-j?Vj2a-JBr7Yc>%#glC=hin2Z~E2?h|^0njCpM6jc=}g43#}K~9JwJT&y}#>SmQ z3E0GpGMzV-xxt)%sPBQ+H=W5$Az>>)Vmzb}vw$^m)jO2eOYo zt0kX%6M9P`Y`FO1IT}2+w4bb7kjZqI59ziZcf z6IjTwe56utk`#S&h5-LdLYnW>M}=eqNgSX}04IJ8CVzFmFbQ;7I!F&JlwLjxm##<_ zVwzC}i*i5tF)I2$A?5mcAp6r{%)ceVMTN1U(C53RFQx32%FFC)ariaRv{hc{sP~N* zf#>lby}PKIdCs+8^?%-?v~U`2vzjA_A4BzXm)Nv1_c%s`0Kef@+A47kX4bgiQ^jvF z@NPTw z^z11OqmZ~sZfPXTM+B%ZGS%p^{�kWQu(Af63VixbN`k51hYoi7J_n=FeBJP(Dt7 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 Af&c&j literal 0 HcmV?d00001 diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst index 59e40e51..da9beb36 100755 --- a/docs/source/api/index.rst +++ b/docs/source/api/index.rst @@ -62,6 +62,8 @@ Basic operators Real Imag Conj + ToCupy + Smoothing and derivatives ~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/gpu.rst b/docs/source/gpu.rst index a37597e9..842770b2 100755 --- a/docs/source/gpu.rst +++ b/docs/source/gpu.rst @@ -29,6 +29,172 @@ provide data vectors to the solvers, e.g., when using For JAX, apart from following the same procedure described for CuPy, the PyLops operator must be also wrapped into a :class:`pylops.JaxOperator`. +See below for a comphrensive list of supported operators and additional functionalities for both the +``cupy`` and ``jax`` backends. + + +Examples +-------- + +Let's now briefly look at some use cases. + +End-to-end GPU powered inverse problems +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +First we consider the most common scenario when both the model and data +vectors fit onto the GPU memory. We can therefore simply replace all our +``numpy`` arrays with ``cupy`` arrays and solve the inverse problem of +interest end-to-end on the GPU. + +.. image:: _static/cupy_diagram.png + :width: 600 + :align: center + +Let's first write a code snippet using ``numpy`` arrays, which PyLops +will run on your CPU: + +.. code-block:: python + + ny, nx = 400, 400 + G = np.random.normal(0, 1, (ny, nx)).astype(np.float32) + x = np.ones(nx, dtype=np.float32) + + # Create operator + Gop = MatrixMult(G, dtype='float32') + + # Create data and invert + y = Gop @ x + xest = Gop / y + +Now we write a code snippet using ``cupy`` arrays, which PyLops will run on +your GPU: + +.. code-block:: python + + ny, nx = 400, 400 + G = cp.random.normal(0, 1, (ny, nx)).astype(np.float32) + x = cp.ones(nx, dtype=np.float32) + + # Create operator + Gop = MatrixMult(G, dtype='float32') + + # Create data and invert + y = Gop @ x + xest = Gop / y + +The code is almost unchanged apart from the fact that we now use ``cupy`` arrays, +PyLops will figure this out. + +Similarly, we write a code snippet using ``jax`` arrays which PyLops will run on +your GPU/TPU: + +.. code-block:: python + + ny, nx = 400, 400 + G = jnp.array(np.random.normal(0, 1, (ny, nx)).astype(np.float32)) + x = jnp.ones(nx, dtype=np.float32) + + # Create operator + Gop = JaxOperator(MatrixMult(G, dtype='float32')) + + # Create data and invert + y = Gop @ x + xest = Gop / y + + # Adjoint via AD + xadj = Gop.rmatvecad(x, y) + +Again, the code is almost unchanged apart from the fact that we now use ``jax`` arrays. + + +Mixed CPU-GPU powered inverse problems +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Let us now consider a more intricate scenario where we have access to +a GPU-powered operator, however the model and/or data vectors are too large +to fit onto the GPU memory (or VRAM). + +For the sake of clarity, we consider a problem where +the operator can be written as a :class:`pylops.BlockDiag` of +PyLops operators. Note how, by simply sandwiching any of the GPU-powered +operator within two :class:`pylops.ToCupy` operators, we are +able to tell PyLops to transfer to the GPU only the part of the model vector +required by a given operator and transfer back the output to the CPU before +forming the combine output vector (i.e., the output vector of the +:class:`pylops.BlockDiag`). + +.. image:: _static/numpy_cupy_bd_diagram.png + :width: 1000 + :align: center + +.. code-block:: python + + nops, n = 5, 4 + Ms = [np.diag((i + 1) * np.ones(n, dtype=dtype)) \ + for i in range(nops)] + Ms = [M.T @ M for M in Ms] + + # Create operator + Mops = [] + for iop in range(nops): + Mop = MatrixMult(cp.asarray(Ms[iop], dtype=dtype)) + Top = ToCupy(Mop.dims, dtype=dtype) + Top1 = ToCupy(Mop.dimsd, dtype=dtype) + Mop = Top1.H @ Mop @ Top + Mops.append(Mop) + Mops = BlockDiag(Mops, forceflat=True) + + # Create data and invert + x = np.ones(n * nops, dtype=dtype) + y = Mops @ x.ravel() + xest = Mops / y + + +Finally, let us consider a problem where +the operator can be written as a :class:`pylops.VStack` of +PyLops operators and the model vector can be fully transferred to the GPU. +We can use again the :class:`pylops.ToCupy` operator, however this +time we will only use it to move the output of each operator to the CPU. +Since we are now in a special scenario, where the input of the overall +operator sits on the GPU and the output on the +CPU, we need to inform the :class:`pylops.VStack` operator about this. +This can be easily done using the additional ``inoutengine`` parameter. Let's +see this with an example. + +.. image:: _static/numpy_cupy_vs_diagram.png + :width: 1000 + :align: center + +.. code-block:: python + + nops, n, m = 3, 4, 5 + Ms = [np.random.normal(0, 1, (n, m)) for _ in range(nops)] + + # Create operator + Mops = [] + for iop in range(nops): + Mop = MatrixMult(cp.asarray(Ms[iop]), dtype=dtype) + Top1 = ToCupy(Mop.dimsd, dtype=dtype) + Mop = Top1.H @ Mop + Mops.append(Mop) + Mops = VStack(Mops, inoutengine=("numpy", "cupy")) + + # Create data and invert + x = cp.ones(m, dtype=dtype) + y = Mops @ x.ravel() + xest = pylops_cgls(Mops, y, x0=cp.zeros_like(x))[0] + +These features are currently not available for ``jax`` arrays. + + +.. note:: + + More examples for the CuPy and JAX backends be found at `link1 `_ + and `link2 `_. + + +Supported Operators +------------------- In the following, we provide a list of methods in :class:`pylops.LinearOperator` with their current status (available on CPU, GPU with CuPy, and GPU with JAX): @@ -195,6 +361,7 @@ Smoothing and derivatives: - |:white_check_mark:| - |:white_check_mark:| + Signal processing: .. list-table:: @@ -322,6 +489,7 @@ Signal processing: - |:white_check_mark:| - |:white_check_mark:| + Wave-Equation processing .. list-table:: @@ -369,6 +537,7 @@ Wave-Equation processing - |:red_circle:| - |:red_circle:| + Geophysical subsurface characterization: .. list-table:: @@ -407,60 +576,3 @@ Geophysical subsurface characterization: operator currently works only with ``explicit=True`` due to the same issue as in point 1 for the :class:`pylops.signalprocessing.Convolve1D` operator employed when ``explicit=False``. - - -Example -------- - -Finally, let's briefly look at an example. First we write a code snippet using -``numpy`` arrays which PyLops will run on your CPU: - -.. code-block:: python - - ny, nx = 400, 400 - G = np.random.normal(0, 1, (ny, nx)).astype(np.float32) - x = np.ones(nx, dtype=np.float32) - - Gop = MatrixMult(G, dtype='float32') - y = Gop * x - xest = Gop / y - -Now we write a code snippet using ``cupy`` arrays which PyLops will run on -your GPU: - -.. code-block:: python - - ny, nx = 400, 400 - G = cp.random.normal(0, 1, (ny, nx)).astype(np.float32) - x = cp.ones(nx, dtype=np.float32) - - Gop = MatrixMult(G, dtype='float32') - y = Gop * x - xest = Gop / y - -The code is almost unchanged apart from the fact that we now use ``cupy`` arrays, -PyLops will figure this out. - -Similarly, we write a code snippet using ``jax`` arrays which PyLops will run on -your GPU/TPU: - -.. code-block:: python - - ny, nx = 400, 400 - G = jnp.array(np.random.normal(0, 1, (ny, nx)).astype(np.float32)) - x = jnp.ones(nx, dtype=np.float32) - - Gop = JaxOperator(MatrixMult(G, dtype='float32')) - y = Gop * x - xest = Gop / y - - # Adjoint via AD - xadj = Gop.rmatvecad(x, y) - - -Again, the code is almost unchanged apart from the fact that we now use ``jax`` arrays, - -.. note:: - - More examples for the CuPy and JAX backends be found `here `__ - and `here `__. \ No newline at end of file diff --git a/pylops/basicoperators/__init__.py b/pylops/basicoperators/__init__.py index d654e50d..5d3a3d3e 100755 --- a/pylops/basicoperators/__init__.py +++ b/pylops/basicoperators/__init__.py @@ -38,6 +38,7 @@ Gradient Gradient. FirstDirectionalDerivative First Directional derivative. SecondDirectionalDerivative Second Directional derivative. + ToCupy Convert to CuPy. """ from .functionoperator import * @@ -72,6 +73,8 @@ from .laplacian import * from .gradient import * from .directionalderivative import * +from .tocupy import * + __all__ = [ "FunctionOperator", @@ -107,4 +110,5 @@ "Gradient", "FirstDirectionalDerivative", "SecondDirectionalDerivative", + "ToCupy", ] diff --git a/pylops/basicoperators/blockdiag.py b/pylops/basicoperators/blockdiag.py index 166ae137..4d9fbc36 100644 --- a/pylops/basicoperators/blockdiag.py +++ b/pylops/basicoperators/blockdiag.py @@ -21,7 +21,7 @@ from pylops import LinearOperator from pylops.basicoperators import MatrixMult -from pylops.utils.backend import get_array_module, inplace_set +from pylops.utils.backend import get_array_module, get_module, inplace_set from pylops.utils.typing import DTypeLike, NDArray @@ -48,6 +48,12 @@ class BlockDiag(LinearOperator): .. versionadded:: 2.2.0 Force an array to be flattened after matvec and rmatvec. + inoutengine : :obj:`tuple`, optional + .. versionadded:: 2.4.0 + + Type of output vectors of `matvec` and `rmatvec. If ``None``, this is + inferred directly from the input vectors. Note that this is ignored + if ``nproc>1``. dtype : :obj:`str`, optional Type of elements in input array. @@ -113,6 +119,7 @@ def __init__( ops: Sequence[LinearOperator], nproc: int = 1, forceflat: bool = None, + inoutengine: Optional[tuple] = None, dtype: Optional[DTypeLike] = None, ) -> None: self.ops = ops @@ -149,6 +156,7 @@ def __init__( if self.nproc > 1: self.pool = mp.Pool(processes=nproc) + self.inoutengine = inoutengine dtype = _get_dtype(ops) if dtype is None else np.dtype(dtype) clinear = all([getattr(oper, "clinear", True) for oper in self.ops]) super().__init__( @@ -172,7 +180,11 @@ def nproc(self, nprocnew: int) -> None: self._nproc = nprocnew def _matvec_serial(self, x: NDArray) -> NDArray: - ncp = get_array_module(x) + ncp = ( + get_array_module(x) + if self.inoutengine is None + else get_module(self.inoutengine[0]) + ) y = ncp.zeros(self.nops, dtype=self.dtype) for iop, oper in enumerate(self.ops): y = inplace_set( @@ -183,7 +195,11 @@ def _matvec_serial(self, x: NDArray) -> NDArray: return y def _rmatvec_serial(self, x: NDArray) -> NDArray: - ncp = get_array_module(x) + ncp = ( + get_array_module(x) + if self.inoutengine is None + else get_module(self.inoutengine[1]) + ) y = ncp.zeros(self.mops, dtype=self.dtype) for iop, oper in enumerate(self.ops): y = inplace_set( diff --git a/pylops/basicoperators/hstack.py b/pylops/basicoperators/hstack.py index b71e8723..4cd450d5 100644 --- a/pylops/basicoperators/hstack.py +++ b/pylops/basicoperators/hstack.py @@ -21,7 +21,7 @@ from pylops import LinearOperator from pylops.basicoperators import MatrixMult -from pylops.utils.backend import get_array_module, inplace_add, inplace_set +from pylops.utils.backend import get_array_module, get_module, inplace_add, inplace_set from pylops.utils.typing import NDArray @@ -48,6 +48,12 @@ class HStack(LinearOperator): .. versionadded:: 2.2.0 Force an array to be flattened after matvec. + inoutengine : :obj:`tuple`, optional + .. versionadded:: 2.4.0 + + Type of output vectors of `matvec` and `rmatvec. If ``None``, this is + inferred directly from the input vectors. Note that this is ignored + if ``nproc>1``. dtype : :obj:`str`, optional Type of elements in input array. @@ -112,6 +118,7 @@ def __init__( ops: Sequence[LinearOperator], nproc: int = 1, forceflat: bool = None, + inoutengine: Optional[tuple] = None, dtype: Optional[str] = None, ) -> None: self.ops = ops @@ -139,6 +146,8 @@ def __init__( self.pool = None if self.nproc > 1: self.pool = mp.Pool(processes=nproc) + + self.inoutengine = inoutengine dtype = _get_dtype(self.ops) if dtype is None else np.dtype(dtype) clinear = all([getattr(oper, "clinear", True) for oper in self.ops]) super().__init__( @@ -162,7 +171,11 @@ def nproc(self, nprocnew: int): self._nproc = nprocnew def _matvec_serial(self, x: NDArray) -> NDArray: - ncp = get_array_module(x) + ncp = ( + get_array_module(x) + if self.inoutengine is None + else get_module(self.inoutengine[0]) + ) y = ncp.zeros(self.nops, dtype=self.dtype) for iop, oper in enumerate(self.ops): y = inplace_add( @@ -173,7 +186,11 @@ def _matvec_serial(self, x: NDArray) -> NDArray: return y def _rmatvec_serial(self, x: NDArray) -> NDArray: - ncp = get_array_module(x) + ncp = ( + get_array_module(x) + if self.inoutengine is None + else get_module(self.inoutengine[1]) + ) y = ncp.zeros(self.mops, dtype=self.dtype) for iop, oper in enumerate(self.ops): y = inplace_set( diff --git a/pylops/basicoperators/tocupy.py b/pylops/basicoperators/tocupy.py new file mode 100644 index 00000000..8a3a7c6b --- /dev/null +++ b/pylops/basicoperators/tocupy.py @@ -0,0 +1,60 @@ +__all__ = ["ToCupy"] + +from typing import Union + +import numpy as np + +from pylops import LinearOperator +from pylops.utils._internal import _value_or_sized_to_tuple +from pylops.utils.backend import to_cupy, to_numpy +from pylops.utils.typing import DTypeLike, InputDimsLike, NDArray + + +class ToCupy(LinearOperator): + r"""Convert to CuPy. + + Convert an input array to CuPy in forward mode, + and convert back to NumPy in adjoint mode. + + Parameters + ---------- + dims : :obj:`list` or :obj:`int` + Number of samples for each dimension + dtype : :obj:`str`, optional + Type of elements in input array. + name : :obj:`str`, optional + Name of operator (to be used by :func:`pylops.utils.describe.describe`) + + Attributes + ---------- + shape : :obj:`tuple` + Operator shape + explicit : :obj:`bool` + Operator contains a matrix that can be solved explicitly + (``True``) or not (``False``) + + Notes + ----- + The ToCupy operator is a special operator that does not perform + any transformation on the input arrays other than converting + them from NumPy to CuPy. This operator can be used when one + is interested to create a chain of operators where only one + (or some of them) act on CuPy arrays, whilst other operate + on NumPy arrays. + + """ + + def __init__( + self, + dims: Union[int, InputDimsLike], + dtype: DTypeLike = "float64", + name: str = "C", + ) -> None: + dims = _value_or_sized_to_tuple(dims) + super().__init__(dtype=np.dtype(dtype), dims=dims, dimsd=dims, name=name) + + def _matvec(self, x: NDArray) -> NDArray: + return to_cupy(x) + + def _rmatvec(self, x: NDArray) -> NDArray: + return to_numpy(x) diff --git a/pylops/basicoperators/vstack.py b/pylops/basicoperators/vstack.py index 0d66642e..55341411 100644 --- a/pylops/basicoperators/vstack.py +++ b/pylops/basicoperators/vstack.py @@ -21,7 +21,7 @@ from pylops import LinearOperator from pylops.basicoperators import MatrixMult -from pylops.utils.backend import get_array_module, inplace_add, inplace_set +from pylops.utils.backend import get_array_module, get_module, inplace_add, inplace_set from pylops.utils.typing import DTypeLike, NDArray @@ -48,6 +48,12 @@ class VStack(LinearOperator): .. versionadded:: 2.2.0 Force an array to be flattened after rmatvec. + inoutengine : :obj:`tuple`, optional + .. versionadded:: 2.4.0 + + Type of output vectors of `matvec` and `rmatvec. If ``None``, this is + inferred directly from the input vectors. Note that this is ignored + if ``nproc>1``. dtype : :obj:`str`, optional Type of elements in input array. @@ -112,6 +118,7 @@ def __init__( ops: Sequence[LinearOperator], nproc: int = 1, forceflat: bool = None, + inoutengine: Optional[tuple] = None, dtype: Optional[DTypeLike] = None, ) -> None: self.ops = ops @@ -139,6 +146,8 @@ def __init__( self.pool = None if self.nproc > 1: self.pool = mp.Pool(processes=nproc) + + self.inoutengine = inoutengine dtype = _get_dtype(self.ops) if dtype is None else np.dtype(dtype) clinear = all([getattr(oper, "clinear", True) for oper in self.ops]) super().__init__( @@ -162,7 +171,11 @@ def nproc(self, nprocnew: int): self._nproc = nprocnew def _matvec_serial(self, x: NDArray) -> NDArray: - ncp = get_array_module(x) + ncp = ( + get_array_module(x) + if self.inoutengine is None + else get_module(self.inoutengine[0]) + ) y = ncp.zeros(self.nops, dtype=self.dtype) for iop, oper in enumerate(self.ops): y = inplace_set( @@ -171,7 +184,11 @@ def _matvec_serial(self, x: NDArray) -> NDArray: return y def _rmatvec_serial(self, x: NDArray) -> NDArray: - ncp = get_array_module(x) + ncp = ( + get_array_module(x) + if self.inoutengine is None + else get_module(self.inoutengine[1]) + ) y = ncp.zeros(self.mops, dtype=self.dtype) for iop, oper in enumerate(self.ops): y = inplace_add( diff --git a/pylops/optimization/cls_basic.py b/pylops/optimization/cls_basic.py index 2e848fcf..b7c98e0a 100644 --- a/pylops/optimization/cls_basic.py +++ b/pylops/optimization/cls_basic.py @@ -10,7 +10,12 @@ import numpy as np from pylops.optimization.basesolver import Solver -from pylops.utils.backend import get_array_module, to_numpy +from pylops.utils.backend import ( + get_array_module, + to_cupy_conditional, + to_numpy, + to_numpy_conditional, +) from pylops.utils.typing import NDArray if TYPE_CHECKING: @@ -131,10 +136,10 @@ def step(self, x: NDArray, show: bool = False) -> NDArray: Updated model vector """ - Opc = self.Op.matvec(self.c) + Opc = self.Op.matvec(to_cupy_conditional(x, self.c)) cOpc = self.ncp.abs(self.c.dot(Opc.conj())) a = self.kold / cOpc - x += a * self.c + x += to_cupy_conditional(x, a) * to_cupy_conditional(x, self.c) self.r -= a * Opc k = self.ncp.abs(self.r.dot(self.r.conj())) b = k / self.kold @@ -386,7 +391,7 @@ def step(self, x: NDArray, show: bool = False) -> NDArray: self.q.dot(self.q.conj()) + self.damp * self.c.dot(self.c.conj()) ) x = x + a * self.c - self.s = self.s - a * self.q + self.s = self.s - to_numpy_conditional(self.q, a) * self.q r = self.Op.rmatvec(self.s) - self.damp * x k = self.ncp.abs(r.dot(r.conj())) b = k / self.kold @@ -773,7 +778,9 @@ def step(self, x: NDArray, show: bool = False) -> NDArray: # next beta, u, alfa, v. These satisfy the relations # beta*u = Op*v - alfa*u, # alfa*v = Op'*u - beta*v' - self.u = self.Op.matvec(self.v) - self.alfa * self.u + self.u = ( + self.Op.matvec(self.v) - to_numpy_conditional(self.u, self.alfa) * self.u + ) self.beta = self.ncp.linalg.norm(self.u) if self.beta > 0: self.u = self.u / self.beta @@ -812,7 +819,9 @@ def step(self, x: NDArray, show: bool = False) -> NDArray: self.w = self.v + self.t2 * self.w self.ddnorm = self.ddnorm + self.ncp.linalg.norm(self.dk) ** 2 if self.calc_var: - self.var = self.var + self.ncp.dot(self.dk, self.dk) + self.var = self.var + to_numpy_conditional( + self.var, self.ncp.dot(self.dk, self.dk) + ) # use a plane rotation on the right to eliminate the # super-diagonal element (theta) of the upper-bidiagonal matrix. diff --git a/pylops/utils/backend.py b/pylops/utils/backend.py index 9b7d3b2d..31836265 100644 --- a/pylops/utils/backend.py +++ b/pylops/utils/backend.py @@ -17,8 +17,10 @@ "get_sp_fft", "get_complex_dtype", "get_real_dtype", + "to_cupy", "to_numpy", "to_cupy_conditional", + "to_numpy_conditional", "inplace_set", "inplace_add", "inplace_multiply", @@ -484,6 +486,26 @@ def get_real_dtype(dtype: DTypeLike) -> DTypeLike: return np.real(np.ones(1, dtype)).dtype +def to_cupy(x: NDArray) -> NDArray: + """Convert x to cupy array + + Parameters + ---------- + x : :obj:`numpy.ndarray` or :obj:`cupy.ndarray` + Array to evaluate + + Returns + ------- + x : :obj:`numpy.ndarray` + Converted array + + """ + if deps.cupy_enabled: + if cp.get_array_module(x) == np: + x = cp.asarray(x) + return x + + def to_numpy(x: NDArray) -> NDArray: """Convert x to numpy array @@ -527,6 +549,28 @@ def to_cupy_conditional(x: npt.ArrayLike, y: npt.ArrayLike) -> NDArray: return y +def to_numpy_conditional(x: npt.ArrayLike, y: npt.ArrayLike) -> NDArray: + """Convert y to numpy array conditional to x being a numpy array + + Parameters + ---------- + x : :obj:`numpy.ndarray` or :obj:`cupy.ndarray` + Array to evaluate + y : :obj:`numpy.ndarray` + Array to convert + + Returns + ------- + y : :obj:`cupy.ndarray` + Converted array + + """ + if deps.cupy_enabled: + if cp.get_array_module(x) == np and cp.get_array_module(y) == cp: + y = cp.asnumpy(y) + return y + + def inplace_set(x: npt.ArrayLike, y: npt.ArrayLike, idx: list) -> NDArray: """Perform inplace set based on input diff --git a/pytests/test_basicoperators.py b/pytests/test_basicoperators.py index 8f3f0528..f12c8c68 100755 --- a/pytests/test_basicoperators.py +++ b/pytests/test_basicoperators.py @@ -16,6 +16,7 @@ Roll, Sum, Symmetrize, + ToCupy, Zero, ) from pylops.utils import dottest @@ -601,3 +602,18 @@ def test_Conj(par): assert_array_equal(x, xadj) assert_array_equal(y, np.conj(x)) assert_array_equal(xadj, np.conj(y)) + + +@pytest.mark.parametrize("par", [(par1), (par2), (par1j), (par2j), (par3)]) +def test_ToCupy(par): + """Forward and adjoint for ToCupy operator (checking that it works also + when cupy is not available) + """ + Top = ToCupy(par["nx"], dtype=par["dtype"]) + + np.random.seed(10) + x = np.random.randn(par["nx"]) + par["imag"] * np.random.randn(par["nx"]) + y = Top * x + xadj = Top.H * y + assert_array_equal(x, xadj) + assert_array_equal(y, x) From 21025332d531a2f20c169243793578040c1cb15e Mon Sep 17 00:00:00 2001 From: mrava87 Date: Mon, 25 Nov 2024 11:53:51 +0300 Subject: [PATCH 30/35] bug: ensure array shape consistency in leastsquares solvers PyLops solvers output the solution as a nd-shaped array if the initial model is fed as nd-arrays or if the initial model is not fed (x0=0) and the operator has forceflat=False. As a side effect, if x0 is NOT passed as a kwarg (but just as the third arg of the solver) and the operator forceflat=False, the output is reshaped even if x0 is a flattened array. I fix this inconsistency making x0 a kwarg when basic solvers are called within a leastsquares solver. --- pylops/optimization/cls_leastsquares.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pylops/optimization/cls_leastsquares.py b/pylops/optimization/cls_leastsquares.py index 64526f81..e824c86f 100644 --- a/pylops/optimization/cls_leastsquares.py +++ b/pylops/optimization/cls_leastsquares.py @@ -248,7 +248,7 @@ def run( xinv = cg( self.Op_normal, self.y_normal, - self.ncp.zeros(self.Op_normal.shape[1], dtype=self.Op_normal.dtype), + x0=self.ncp.zeros(self.Op_normal.shape[1], dtype=self.Op_normal.dtype), **kwargs_solver, )[0] istop = None @@ -594,7 +594,7 @@ def run( xinv, istop, itn, r1norm, r2norm = cgls( self.RegOp, self.datatot, - self.ncp.zeros(self.RegOp.shape[1], dtype=self.RegOp.dtype), + x0=self.ncp.zeros(self.RegOp.shape[1], dtype=self.RegOp.dtype), **kwargs_solver, )[0:5] else: @@ -816,7 +816,7 @@ def run( pinv, istop, itn, r1norm, r2norm = cgls( self.POp, self.y, - self.ncp.zeros(self.POp.shape[1], dtype=self.POp.dtype), + x0=self.ncp.zeros(self.POp.shape[1], dtype=self.POp.dtype), **kwargs_solver, )[0:5] # force it 1d as we decorate this method with disable_ndarray_multiplication From 8971c22a54bd9ffc1bdf5d5a7bc2e065b0bbee0d Mon Sep 17 00:00:00 2001 From: mrava87 Date: Sun, 1 Dec 2024 21:36:57 +0300 Subject: [PATCH 31/35] doc: add pytensor to doc and warning about osx error --- docs/source/api/index.rst | 1 + docs/source/installation.rst | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst index da9beb36..0c23cf9a 100755 --- a/docs/source/api/index.rst +++ b/docs/source/api/index.rst @@ -28,6 +28,7 @@ Templates LinearOperator FunctionOperator MemoizeOperator + PyTensorOperator TorchOperator JaxOperator diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 800b1092..c0eff42d 100755 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -456,6 +456,10 @@ or via ``pip`` with .. note:: PyTensor does not support NumPy 2 yet, so make sure you use NumPy 1.x with PyTensor and PyMC. +.. note:: + OSX users may experience a ``CompileError`` error when using PyTensor. This can be solved by adding + ``pytensor.config.gcc__cxxflags = "-Wno-c++11-narrowing"`` after ``import pytensor``. + PyWavelets ---------- `PyWavelets `_ is used to implement the wavelet operators. From 490a6dd454ae16f90249553868477f5fec3ddefe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dieter=20Werthm=C3=BCller?= Date: Wed, 4 Dec 2024 09:29:37 +0100 Subject: [PATCH 32/35] Add button to GitHub Repo I personally dislike it a lot when I come to the documentation of a source code, but there is no easy/quick link to the repo, which means I have to google to find the repo ;-) Adding the `"github_url" to the "html_theme_options" should add a GitHub-link-button on the top-right corner, next to the switch for light/dark theme. --- docs/source/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/conf.py b/docs/source/conf.py index 75680cac..7c98f203 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -124,6 +124,7 @@ # Theme config html_theme = "pydata_sphinx_theme" html_theme_options = { + "github_url": "https://github.com/PyLops/pylops", # "logo_only": True, # "display_version": True, "logo": { From 94abe4c2cadab1d5a11c4ffd8d6eeb318d7c6446 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Mon, 9 Dec 2024 09:26:00 +0300 Subject: [PATCH 33/35] feat: speedup fourierradon with engine=cuda --- .../signalprocessing/_fourierradon2d_cuda.py | 17 +++++++++++-- .../signalprocessing/_fourierradon3d_cuda.py | 24 +++++++++++++++---- pylops/signalprocessing/fourierradon2d.py | 6 +++-- pylops/signalprocessing/fourierradon3d.py | 6 +++-- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/pylops/signalprocessing/_fourierradon2d_cuda.py b/pylops/signalprocessing/_fourierradon2d_cuda.py index 2a0d35ba..f74390ff 100755 --- a/pylops/signalprocessing/_fourierradon2d_cuda.py +++ b/pylops/signalprocessing/_fourierradon2d_cuda.py @@ -1,8 +1,13 @@ from cmath import exp from math import pi +import cupy as cp from numba import cuda +TWO_PI_MINUS = cp.float32(-2.0 * pi) +TWO_PI_PLUS = cp.float32(2.0 * pi) +I = cp.complex64(1j) + @cuda.jit def _radon_inner_2d_kernel(x, y, f, px, h, flim0, flim1, npx, nh): @@ -16,7 +21,11 @@ def _radon_inner_2d_kernel(x, y, f, px, h, flim0, flim1, npx, nh): ih, ifr = cuda.grid(2) if ih < nh and ifr >= flim0 and ifr <= flim1: for ipx in range(npx): - y[ih, ifr] += x[ipx, ifr] * exp(-1j * 2 * pi * f[ifr] * px[ipx] * h[ih]) + # slow computation of exp(1j * x) + # y[ih, ifr] += x[ipx, ifr] * exp(TWO_PI_MINUS * f[ifr] * px[ipx] * h[ih]) + # fast computation of exp(1j * x) - see https://stackoverflow.com/questions/9860711/cucomplex-h-and-exp/9863048#9863048 + s, c = cuda.libdevice.sincosf(TWO_PI_MINUS * f[ifr] * px[ipx] * h[ih]) + y[ih, ifr] += x[ipx, ifr] * (c + I * s) @cuda.jit @@ -31,7 +40,11 @@ def _aradon_inner_2d_kernel(x, y, f, px, h, flim0, flim1, npx, nh): ipx, ifr = cuda.grid(2) if ipx < npx and ifr >= flim0 and ifr <= flim1: for ih in range(nh): - x[ipx, ifr] += y[ih, ifr] * exp(1j * 2 * pi * f[ifr] * px[ipx] * h[ih]) + # slow computation of exp(1j * x) + # x[ipx, ifr] += y[ih, ifr] * exp(TWO_PI_I_PLUS * f[ifr] * px[ipx] * h[ih]) + # fast computation of exp(1j * x) - see https://stackoverflow.com/questions/9860711/cucomplex-h-and-exp/9863048#9863048 + s, c = cuda.libdevice.sincosf(TWO_PI_PLUS * f[ifr] * px[ipx] * h[ih]) + x[ipx, ifr] += y[ih, ifr] * (c + I * s) def _radon_inner_2d_cuda( diff --git a/pylops/signalprocessing/_fourierradon3d_cuda.py b/pylops/signalprocessing/_fourierradon3d_cuda.py index 16f94f7e..2481abe2 100755 --- a/pylops/signalprocessing/_fourierradon3d_cuda.py +++ b/pylops/signalprocessing/_fourierradon3d_cuda.py @@ -1,8 +1,13 @@ from cmath import exp from math import pi +import cupy as cp from numba import cuda +TWO_PI_MINUS = cp.float32(-2.0 * pi) +TWO_PI_PLUS = cp.float32(2.0 * pi) +I = cp.complex64(1j) + @cuda.jit def _radon_inner_3d_kernel(x, y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, nhx): @@ -17,9 +22,15 @@ def _radon_inner_3d_kernel(x, y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, if ihy < nhy and ihx < nhx and ifr >= flim0 and ifr <= flim1: for ipy in range(npy): for ipx in range(npx): - y[ihy, ihx, ifr] += x[ipy, ipx, ifr] * exp( - -1j * 2 * pi * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) + # slow computation of exp(1j * x) + # y[ihy, ihx, ifr] += x[ipy, ipx, ifr] * exp( + # TWO_PI_MINUS * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) + # ) + # fast computation of exp(1j * x) - see https://stackoverflow.com/questions/9860711/cucomplex-h-and-exp/9863048#9863048 + s, c = cuda.libdevice.sincosf( + TWO_PI_MINUS * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) ) + y[ihy, ihx, ifr] += x[ipy, ipx, ifr] * (c + I * s) @cuda.jit @@ -35,9 +46,14 @@ def _aradon_inner_3d_kernel(x, y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy if ipy < npy and ipx < npx and ifr >= flim0 and ifr <= flim1: for ihy in range(nhy): for ihx in range(nhx): - x[ipy, ipx, ifr] += y[ihy, ihx, ifr] * exp( - 1j * 2 * pi * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) + # slow computation of exp(1j * x) + # x[ipy, ipx, ifr] += y[ihy, ihx, ifr] * exp( + # TWO_PI_I_PLUS * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) + # ) + s, c = cuda.libdevice.sincosf( + TWO_PI_PLUS * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) ) + x[ipy, ipx, ifr] += y[ihy, ihx, ifr] * (c + I * s) def _radon_inner_3d_cuda( diff --git a/pylops/signalprocessing/fourierradon2d.py b/pylops/signalprocessing/fourierradon2d.py index f8296d78..37439dda 100755 --- a/pylops/signalprocessing/fourierradon2d.py +++ b/pylops/signalprocessing/fourierradon2d.py @@ -13,10 +13,12 @@ from pylops.utils.typing import DTypeLike, NDArray jit_message = deps.numba_import("the radon2d module") +cupy_message = deps.cupy_import("the radon2d module") if jit_message is None: - from ._fourierradon2d_cuda import _aradon_inner_2d_cuda, _radon_inner_2d_cuda from ._fourierradon2d_numba import _aradon_inner_2d, _radon_inner_2d +if jit_message is None and cupy_message is None: + from ._fourierradon2d_cuda import _aradon_inner_2d_cuda, _radon_inner_2d_cuda logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.WARNING) @@ -167,7 +169,7 @@ def __init__( self._register_multiplications(engine) def _register_multiplications(self, engine: str) -> None: - if engine == "numba" and jit_message is None: + if engine == "numba": self._matvec = self._matvec_numba self._rmatvec = self._rmatvec_numba elif engine == "cuda": diff --git a/pylops/signalprocessing/fourierradon3d.py b/pylops/signalprocessing/fourierradon3d.py index 75622c85..b6c8a309 100755 --- a/pylops/signalprocessing/fourierradon3d.py +++ b/pylops/signalprocessing/fourierradon3d.py @@ -13,10 +13,12 @@ from pylops.utils.typing import DTypeLike, NDArray jit_message = deps.numba_import("the radon2d module") +cupy_message = deps.cupy_import("the radon2d module") if jit_message is None: - from ._fourierradon3d_cuda import _aradon_inner_3d_cuda, _radon_inner_3d_cuda from ._fourierradon3d_numba import _aradon_inner_3d, _radon_inner_3d +if jit_message is None and cupy_message is None: + from ._fourierradon3d_cuda import _aradon_inner_3d_cuda, _radon_inner_3d_cuda logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.WARNING) @@ -192,7 +194,7 @@ def __init__( self._register_multiplications(engine) def _register_multiplications(self, engine: str) -> None: - if engine == "numba" and jit_message is None: + if engine == "numba": self._matvec = self._matvec_numba self._rmatvec = self._rmatvec_numba elif engine == "cuda": From 02cfddd533e43b66c14a5d770118136ee8c0f05d Mon Sep 17 00:00:00 2001 From: mrava87 Date: Mon, 9 Dec 2024 09:33:58 +0300 Subject: [PATCH 34/35] minor: fix flake8 --- pylops/signalprocessing/_fourierradon2d_cuda.py | 7 +++---- pylops/signalprocessing/_fourierradon3d_cuda.py | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/pylops/signalprocessing/_fourierradon2d_cuda.py b/pylops/signalprocessing/_fourierradon2d_cuda.py index f74390ff..4a641524 100755 --- a/pylops/signalprocessing/_fourierradon2d_cuda.py +++ b/pylops/signalprocessing/_fourierradon2d_cuda.py @@ -1,4 +1,3 @@ -from cmath import exp from math import pi import cupy as cp @@ -6,7 +5,7 @@ TWO_PI_MINUS = cp.float32(-2.0 * pi) TWO_PI_PLUS = cp.float32(2.0 * pi) -I = cp.complex64(1j) +IMG = cp.complex64(1j) @cuda.jit @@ -25,7 +24,7 @@ def _radon_inner_2d_kernel(x, y, f, px, h, flim0, flim1, npx, nh): # y[ih, ifr] += x[ipx, ifr] * exp(TWO_PI_MINUS * f[ifr] * px[ipx] * h[ih]) # fast computation of exp(1j * x) - see https://stackoverflow.com/questions/9860711/cucomplex-h-and-exp/9863048#9863048 s, c = cuda.libdevice.sincosf(TWO_PI_MINUS * f[ifr] * px[ipx] * h[ih]) - y[ih, ifr] += x[ipx, ifr] * (c + I * s) + y[ih, ifr] += x[ipx, ifr] * (c + IMG * s) @cuda.jit @@ -44,7 +43,7 @@ def _aradon_inner_2d_kernel(x, y, f, px, h, flim0, flim1, npx, nh): # x[ipx, ifr] += y[ih, ifr] * exp(TWO_PI_I_PLUS * f[ifr] * px[ipx] * h[ih]) # fast computation of exp(1j * x) - see https://stackoverflow.com/questions/9860711/cucomplex-h-and-exp/9863048#9863048 s, c = cuda.libdevice.sincosf(TWO_PI_PLUS * f[ifr] * px[ipx] * h[ih]) - x[ipx, ifr] += y[ih, ifr] * (c + I * s) + x[ipx, ifr] += y[ih, ifr] * (c + IMG * s) def _radon_inner_2d_cuda( diff --git a/pylops/signalprocessing/_fourierradon3d_cuda.py b/pylops/signalprocessing/_fourierradon3d_cuda.py index 2481abe2..607f2e74 100755 --- a/pylops/signalprocessing/_fourierradon3d_cuda.py +++ b/pylops/signalprocessing/_fourierradon3d_cuda.py @@ -1,4 +1,3 @@ -from cmath import exp from math import pi import cupy as cp @@ -6,7 +5,7 @@ TWO_PI_MINUS = cp.float32(-2.0 * pi) TWO_PI_PLUS = cp.float32(2.0 * pi) -I = cp.complex64(1j) +IMG = cp.complex64(1j) @cuda.jit @@ -30,7 +29,7 @@ def _radon_inner_3d_kernel(x, y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy, s, c = cuda.libdevice.sincosf( TWO_PI_MINUS * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) ) - y[ihy, ihx, ifr] += x[ipy, ipx, ifr] * (c + I * s) + y[ihy, ihx, ifr] += x[ipy, ipx, ifr] * (c + IMG * s) @cuda.jit @@ -53,7 +52,7 @@ def _aradon_inner_3d_kernel(x, y, f, py, px, hy, hx, flim0, flim1, npy, npx, nhy s, c = cuda.libdevice.sincosf( TWO_PI_PLUS * f[ifr] * (py[ipy] * hy[ihy] + px[ipx] * hx[ihx]) ) - x[ipy, ipx, ifr] += y[ihy, ihx, ifr] * (c + I * s) + x[ipy, ipx, ifr] += y[ihy, ihx, ifr] * (c + IMG * s) def _radon_inner_3d_cuda( From ed2215af50f85fdfdb5c018d18adea9bf5605190 Mon Sep 17 00:00:00 2001 From: mrava87 Date: Wed, 11 Dec 2024 10:02:20 +0300 Subject: [PATCH 35/35] doc: prepare for release v2.4.0 --- CHANGELOG.md | 10 ++++++++-- docs/source/changelog.rst | 14 +++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f1c6780..8989f305 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,18 @@ Changelog ========= +# 2.4.0 +* Added `pylops.signalprocessing.FourierRadon2d` and + `pylops.signalprocessing.FourierRadon3d` operators +* Added `pylops.PyTensorOperator` operator +* Added `pylops.ToCupy` operator +* Added `pylops.utils.seismicevents.parabolic3d` method +* Fix bug in `pylops.Restriction` when passing iava as cupy array + # 2.3.1 * Fixed bug in `pylops.utils.backend` (see [Issue #606](https://github.com/PyLops/pylops/issues/606)) # 2.3.0 - * Added `pylops.JaxOperator`, `pylops.signalprocessing.DWTND`, and `pylops.signalprocessing.DTCWT` operators. * Added `updatesrc` method to `pylops.waveeqprocessing.AcousticWave2D`. * Added `verb` to `pylops.signalprocessing.Sliding1D.sliding1d_design`, `pylops.signalprocessing.Sliding2D.sliding2d_design`, `pylops.signalprocessing.Sliding3D.sliding3d_design`, `pylops.signalprocessing.Patch2D.patch2d_design`, and `pylops.signalprocessing.Patch3D.patch3d_design`. @@ -29,7 +36,6 @@ is now unmantained and merged into `cupy`). # 2.2.0 - * Added `pylops.signalprocessing.NonStationaryConvolve3D` operator * Added nd-array capabilities to `pylops.basicoperators.Identity` and `pylops.basicoperators.Zero` * Added second implementation in `pylops.waveeqprocessing.BlendingContinuous` which is more diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index b5854475..43d59cac 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -3,7 +3,19 @@ Changelog ========= +Version 2.4.0 +------------- + +*Released on: 11/12/2024* + +* Added :py:class:`pylops.signalprocessing.FourierRadon2d` and + :py:class:`pylops.signalprocessing.FourierRadon3d` operators +* Added :py:class:`pylops.PyTensorOperator` operator +* Added :py:class:`pylops.ToCupy` operator +* Added :py:class:`pylops.utils.seismicevents.parabolic3d` method +* Fix bug in :py:class:`pylops.Restriction` when passing iava as cupy array + Version 2.3.1 ------------- @@ -511,7 +523,7 @@ Version 1.3.0 * Added :py:func:`pylops.optimization.sparsity.ISTA` and :py:func:`pylops.optimization.sparsity.FISTA` sparse solvers * Added possibility to broadcast (handle multi-dimensional arrays) - to :py:class:`pylops.Diagonal` and :py:func:`pylops..Restriction` operators + to :py:class:`pylops.Diagonal` and :py:class:`pylops.Restriction` operators * Added :py:class:`pylops.signalprocessing.Interp` operator * Added :py:class:`pylops.Spread` operator * Added :py:class:`pylops.signalprocessing.Radon2D` operator