- Fixed bug in
pylops.utils.backend
(see Issue #606)
- Added
pylops.JaxOperator
,pylops.signalprocessing.DWTND
, andpylops.signalprocessing.DTCWT
operators. - Added
updatesrc
method topylops.waveeqprocessing.AcousticWave2D
. - Added
verb
topylops.signalprocessing.Sliding1D.sliding1d_design
,pylops.signalprocessing.Sliding2D.sliding2d_design
,pylops.signalprocessing.Sliding3D.sliding3d_design
,pylops.signalprocessing.Patch2D.patch2d_design
, andpylops.signalprocessing.Patch3D.patch3d_design
. - Added
kwargs_fft
topylops.signalprocessing.FFTND
. - Added
cosinetaper
topylops.utils.tapers.cosinetaper
. - Added
kind
topylops.waveeqprocessing.Deghosting
. - Modified all methods in
pylops.utils.backend
to enable jax integration. - Modified implementations of
pylops.signalprocessing.Sliding1D
,pylops.signalprocessing.Sliding2D
,pylops.signalprocessing.Sliding3D
,pylops.signalprocessing.Patch2D
, andpylops.signalprocessing.Patch3D
to being directly implemented instead of relying on other PyLops operators. Added alsosavetaper
parameter and an option to apply the operatorOp
simultaneously to all windows. - Modified
pylops.waveeqprocessing.AcousticWave2D._born_oneshot
andpylops.waveeqprocessing.AcousticWave2D._born_allshots
to avoid recreating the devito solver for each shot (and enabling internal caching...) - Modified
dtype
ofpylops.signalprocessing.Shift
to be that of the input vector. - Modified
pylops.waveeqprocessing.BlendingContinuous
to usematvec/rmatvec
instead of@/.H @
for compatibility with pylops solvers. - Removed
cusignal
as optional dependency andcupy
's equivalent methods (since the library is now unmantained and merged intocupy
). - Fixed ImportError of optional dependencies when installed but not correctly functioning (see Issue #548)
- Fixed bug in
pylops.utils.deps.to_cupy_conditional
(see Issue #579) - Fixed bug in the definition of
nttot
inpylops.waveeqprocessing.BlendingContinuous
- Fixed bug in
pylops.utils.signalprocessing.dip_estimate
(see Issue #572)
- Added
pylops.signalprocessing.NonStationaryConvolve3D
operator - Added nd-array capabilities to
pylops.basicoperators.Identity
andpylops.basicoperators.Zero
- Added second implementation in
pylops.waveeqprocessing.BlendingContinuous
which is more performant when dealing with small number of receivers - Added
forceflat
property to operators with ambiguousrmatvec
(pylops.basicoperators.Block
,pylops.basicoperators.Bilinear
,pylops.basicoperators.BlockDiag
,pylops.basicoperators.HStack
,pylops.basicoperators.MatrixMult
,pylops.basicoperators.VStack
, andpylops.basicoperators.Zero
) - Improved
dynamic
mode ofpylops.waveeqprocessing.Kirchhoff
operator - Modified
pylops.signalprocessing.Convolve1D
to allow both filters that are both shorter and longer of the input vector - Modified all solvers to use
matvec/rmatvec
instead of@/.H @
to improve performance
- Added
pylops.signalprocessing.DCT
,pylops.signalprocessing.NonStationaryConvolve1D
,pylops.signalprocessing.NonStationaryConvolve2D
,pylops.signalprocessing.NonStationaryFilters1D
, andpylops.signalprocessing.NonStationaryFilters2D
operators - Added
pylops.waveeqprocessing.BlendingContinuous
,pylops.waveeqprocessing.BlendingGroup
, andpylops.waveeqprocessing.BlendingHalf
operators - Added
kind='datamodel'
topylops.optimization.cls_sparsity.IRLS
- Improved inner working of
pylops.waveeqprocessing.Kirchhoff
operator significantly reducing the memory usage related to storing traveltime, angle, and amplitude tables. - Improved handling of
haxes
inpylops.signalprocessing.Radon2D
andpylops.signalprocessing.Radon3D
operators - Added possibility to feed ND-arrays to
pylops.TorchOperator
- Removed
pylops.LinearOperator
inheritance and added__call__
method topylops.TorchOperator
- Removed
scipy.sparse.linalg.LinearOperator
and addedabc.ABC
inheritance topylops.LinearOperator
- All operators are now classes of
pylops.LinearOperator
type
PyLops has undergone significant changes in this release, including new LinearOperator
s, more features, new examples and bugfixes.
To aid users in navigating the breaking changes, we provide the following document MIGRATION_V1_V2.md.
- Multiplication of linear operators by N-dimensional arrays is now supported via the new
dims
/dimsd
properties. Users do not need to use.ravel
and.reshape
as often anymore. See the migration guide for more information. - Typing annotations for several submodules (
avo
,basicoperators
,signalprocessing
,utils
,optimization
,waveeqprocessing
) - New pylops.TorchOperator wraps a Pylops operator into a PyTorch function
- New pylops.signalprocessing.Patch3D applies a linear operator repeatedly to patches of the model vector
- Each of Sliding1D,
Sliding2D,
Sliding3D,
Patch2D and
Patch3D have an associated
slidingXd_design
orpatchXd_design
functions associated with them to aid the user in designing the windows - FirstDerivative and SecondDerivative, and therefore other derivative operators which rely on the (e.g., Gradient) support higher order stencils
- pylops.waveeqprocessing.Kirchhoff substitutes pylops.waveeqprocessing.Demigration and incorporates a variety of new functionalities
- New pylops.waveeqprocessing.AcousticWave2D wraps the Devito acoutic wave propagator providing a wave-equation based Born modeling operator with a reverse-time migration adjoint
- Solvers can now be implemented via the pylops.optimization.basesolver.Solver class. They can now be used through a functional interface with lowercase name (e.g., splitbregman) or via class interface with CamelCase name (e.g., SplitBregman). Moreover, solvers now accept callbacks defined by the Callbacks interface (see e.g., MetricsCallback).
- Metrics such as mean absolute error (mae), mean squared error (mse) and others
- New pylops.utils.signalprocessing.dip_estimate estimates local dips in an image (measured in radians) in a stabler way than pylops.utils.signalprocessing.dip_estimate did for slopes.
- New pylops.utils.tapers.tapernd for N-dimensional tapers
- New wavelets Klauder and Ormsby
- Installation has been revamped
- Revamped guide on how to implement a new
LinearOperator
from scratch - New guide on how to implement a new solver from scratch
- New tutorials:
- New gallery examples:
- Fixed
pylops.optimization.basic.lsqr
,pylops.optimization.sparsity.ISTA
, andpylops.optimization.sparsity.FISTA
to work with cupy arrays. This change was required by how recent cupy versions handle scalars, which are not converted directly into float types, rather kept as cupy arrays. - Fixed bug in
pylops.waveeqprocessing.Deghosting
introduced in commit 7e596d4
- Refractored
pylops.utils.dottest
, and added two new optional input parameters (atol
andrtol
) - Added optional parameter
densesolver
topylops.LinearOperator.div
- !DELETED! due to a mistake in the release process
- Added
NMO
example to gallery - Extended
pylops.basicoperators.Laplacian
to N-dimensional arrays - Added
forward
kind topylops.basicoperators.SecondDerivative
andpylops.basicoperators.Laplacian
- Added
chirp-sliding
kind topylops.waveeqprocessing.seismicinterpolation.SeismicInterpolation
- Fixed bug due to the new internal structure of
LinearOperator
submodule introduced inscipy1.8.0
- Added
pylops.utils.describe.describe
method - Added
fftengine
topylops.waveeqprocessing.Marchenko
- Added
ifftshift_before
andfftshift_after
optional input parameters inpylops.signalprocessing.FFT
- Added
norm
optional input parameter topylops.signalprocessing.FFT2D
andpylops.signalprocessing.FFTND
- Added
scipy
backend topylops.signalprocessing.FFT
andpylops.signalprocessing.FFT2D
andpylops.signalprocessing.FFTND
- Added
eps
optional input parameter inpylops.utils.signalprocessing.slope_estimate
- Added pre-commit hooks
- Improved pre-commit hooks
- Vectorized
pylops.utils.signalprocessing.slope_estimate
- Handlexd
nfft<nt
case inpylops.signalprocessing.FFT
andpylops.signalprocessing.FFT2D
andpylops.signalprocessing.FFTND
- Introduced automatic casting of dtype in `pylops.MatrixMult
- Improved documentation and definition of optinal parameters
of
pylops.Spread
- Major clean up of documentation and mathematical formulas
- Major refractoring of the inner structure of
pylops.signalprocessing.FFT
andpylops.signalprocessing.FFT2D
andpylops.signalprocessing.FFTND
- Reduced warnings in test suite
- Reduced computational time of
test_wavedecomposition
in the test suite - Fixed bug in
pylops.signalprocessing.Sliding1D
,pylops.signalprocessing.Sliding2D
andpylops.signalprocessing.Sliding3D
where thedtype
of the Restriction operator is inffered fromOp
- Fixed bug in
pylops.signalprocessing.Radon2D
andpylops.signalprocessing.Radon3D
when using centered spatial axes - Fixed scaling in
pylops.signalprocessing.FFT
withreal=True
to pass the dot-test
- Added
pylops.utils.estimators
module for trace estimation - Added
x0
inpylops.optimization.sparsity.ISTA
andpylops.optimization.sparsity.FISTA
to handle non-zero initial guess - Modified
pylops.optimization.sparsity.ISTA
andpylops.optimization.sparsity.FISTA
to handle multiple right hand sides - Modified creation of
haxis
inpylops.signalprocessing.Radon2D
andpylops.signalprocessing.Radon3D
to allow for uncentered spatial axes - Fixed
_rmatvec
for explicit inpylops.LinearOperator._ColumnLinearOperator
- Added
pylops.signalprocessing.Shift
operator. - Added option to choose derivative kind in
pylops.avo.poststack.PoststackInversion
andpylops.avo.prestack.PrestackInversion
- Improved efficiency of adjoint of
pylops.signalprocessing.Fredholm1
by applying complex conjugation to the vectors. - Added
vsvp
topylops.avo.prestack.PrestackInversion
allowing to use user defined VS/VP ratio. - Added
kind
topylops.basicoperators.CausalIntegration
allowingfull
,half
, ortrapezoidal
integration - Fixed
_hardthreshold_percentile
inpylops.optimization.sparsity
- Issue #249. - Fixed r2norm in
pylops.optimization.solver.cgls
- Added
pylops.optimization.solver.lsqr
solver - Added utility routine
pylops.utils.scalability_test
for scalability tests when usingmultiprocessing
- Added
pylops.avo.avo.ps
AVO modelling option and restructuredpylops.avo.prestack.PrestackLinearModelling
to allow passing any function handle that can perform AVO modelling apart from those directly available - Added R-linear operators (when setting the property
clinear=False
of a linear operator).pylops.basicoperators.Real
,pylops.basicoperators.Imag
, andpylops.basicoperators.Conj
- Added possibility to run operators
pylops.basicoperators.HStack
,pylops.basicoperators.VStack
,pylops.basicoperators.Block
pylops.basicoperators.BlockDiag
, andpylops.signalprocessing.Sliding3D
usingmultiprocessing
- Added dtype to vector
X
when usingscipy.sparse.linalg.lobpcg
ineigs
method ofpylops.LinearOperator
- Use
kind=forward
fot FirstDerivative inpylops.avo.poststack.PoststackInversion
inversion when dealing with L1 regularized inversion as it makes the inverse problem more stable (no ringing in solution) - Changed
cost
inpylops.optimization.solver.cg
andpylops.optimization.solver.cgls
to be L2 norms of residuals - Fixed
pylops.utils.dottest.dottest
for imaginary vectors and to ensureu
andv
vectors are of same dtype of the operator
- Added
pylops.signalprocessing.Sliding1D
andpylops.signalprocessing.Patch2D
operators - Added
pylops.basicoperators.MemoizeOperator
operator - Added decay and analysis option in
pylops.optimization.sparsity.ISTA
andpylops.optimization.sparsity.FISTA
solvers - Added
toreal
andtoimag
methods topylops.LinearOperator
- Make
nr
andnc
optional inpylops.utils.dottest.dottest
- Fixed complex check in
pylops.basicoperators.MatrixMult
when working with complex-valued cupy arrays - Fixed bug in data reshaping in check in
pylops.avo.prestack.PrestackInversion
- Fixed loading error when using old cupy and/or cusignal
- Modified all operators and solvers to work with cupy arrays
- Added
eigs
andsolver
submodules tooptimization
- Added
deps
andbackend
submodules toutils
- Fixed bug in
pylops.signalprocessing.Convolve2D
andpylops.signalprocessing.ConvolveND
when dealing with filters that have less dimensions than the input vector.
- Fixed import of
pyfttw
when not available inpylops.signalprocessing.ChirpRadon3D
- Added
pylops.signalprocessing.ChirpRadon2D
andpylops.signalprocessing.ChirpRadon3D
operators. - Fixed bug in the inferred dimensions for regularization data creation
in
pylops.optimization.leastsquares.NormalEquationsInversion
,pylops.optimization.leastsquares.RegularizedInversion
, andpylops.optimization.sparsity.SplitBregman
. - Changed dtype of
pylops.HStack
to allow automatic inference from dtypes of input operator. - Modified dtype of
pylops.waveeqprocessing.Marchenko
operator to ensure that outputs of forward and adjoint are real arrays. - Reverted to previous complex-friendly implementation of
pylops.optimization.sparsity._softthreshold
to avoid division by 0.
- Added
tosparse
method topylops.LinearOperator
. - Added
kind=linear
inpylops.signalprocessing.Seislet
operator. - Added
kind
topylops.basicoperators.FirstDerivative
. operator to perform forward and backward (as well as centered) derivatives. - Added
kind
topylops.optimization.sparsity.IRLS
solver to choose between data or model sparsity. - Added possibility to use
scipy.sparse.linalg.lobpcg
inpylops.LinearOperator.eigs
andpylops.LinearOperator.cond
. - Added possibility to use
scipy.signal.oaconvolve
inpylops.signalprocessing.Convolve1D
. - Added
NRegs
topylops.optimization.leastsquares.NormalEquationsInversion
to allow providing regularization terms directly in the form ofH^T H
.
- Changed internal behaviour of
pylops.sparsity.OMP
whenniter_inner=0
. Automatically reverts to Matching Pursuit algorithm. - Changed handling of
dtype
inpylops.signalprocessing.FFT
andpylops.signalprocessing.FFT2D
to ensure that the type of the input vector is retained when applying forward and adjoint. - Added
dtype
parameter to theFFT
calls in the definition of thepylops.waveeqprocessing.MDD
operation. This ensure that the type of the real part ofG
input is enforced to the output vectors of the forward and adjoint operations.
- Added
pylops.waveeqprocessing.Deghosting
andpylops.signalprocessing.Seislet
operators - Added hard and half thresholds in
pylops.optimization.sparsity.ISTA
andpylops.optimization.sparsity.FISTA
solvers - Added
prescaled
input parameter topylops.waveeqprocessing.MDC
andpylops.waveeqprocessing.Marchenko
- Added sinc interpolation to
pylops.signalprocessing.Interp
(kind == 'sinc'
) - Modified
pylops.waveeqprocessing.marchenko.directwave
to to model analytical responses from both sources of volume injection (derivative=False
) and source of volume injection rate (derivative=True
) - Added
pylops.LinearOperator.asoperator
method topylops.LinearOperator
- Added
pylops.utils.signalprocessing.slope_estimate
function - Fix bug in
pylops.signalprocessing.Radon2D
andpylops.signalprocessing.Radon3D
whenonthefly=True
returning the same result as whenonthefly=False
- Added
todense
method topylops.LinearOperator
- Added
pylops.signalprocessing.Bilinear
,pylops.signalprocessing.DWT
, andpylops.signalprocessing.DWT2
operators - Added
pylops.waveeqprocessing.PressureToVelocity
,pylops.waveeqprocessing.UpDownComposition3Doperator
, andpylops.waveeqprocessing.PhaseShift
operators - Fix bug in
pylops.basicoperators.Kronecker
(see Issue #125)
- Added
pylops.basicoperators.Gradient
,pylops.basicoperators.Sum
,pylops.basicoperators.FirstDirectionalDerivative
, andpylops.basicoperators.SecondDirectionalDerivative
operators - Added
pylops._ColumnLinearOperator
private operator - Added possibility to directly mix Linear operators and numpy/scipy
2d arrays in
pylops.basicoperators.VStack
andpylops.basicoperators.HStack
andpylops.basicoperators.BlockDiagonal
operators - Added
pylops.optimization.sparsity.OMP
solver
- Added
pylops.signalprocessing.ConvolveND
operator - Added
pylops.utils.signalprocessing.nonstationary_convmtx
to create matrix for non-stationary convolution - Added possibility to perform seismic modelling (and inversion) with
non-stationary wavelet in
pylops.avo.poststack.PoststackLinearModelling
- Create private methods for
pylops.basicoperators.Block
,pylops.avo.poststack.PoststackLinearModelling
,pylops.waveeqprocessing.MDC
to allow calling different operators (e.g., from pylops-distributed or pylops-gpu) within the method
- Added
conj
method topylops.LinearOperator
- Added
pylops.basicoperators.Kronecker
,pylops.basicoperators.Roll
, andpylops.basicoperators.Transpose
operators - Added
pylops.signalprocessing.Fredholm1
operator - Added
pylops.optimization.sparsity.SPGL1
andpylops.optimization.sparsity.SplitBregman
solvers - Sped up
pylops.signalprocessing.Convolve1D
usingscipy.signal.fftconvolve
for multi-dimensional signals - Changes in implementation of
pylops.waveeqprocessing.MDC
andpylops.waveeqprocessing.Marchenko
to take advantage of primitives operators - Added
epsRL1
option topylops.avo.poststack.PoststackInversion
andpylops.avo.prestack.PrestackInversion
to include TV-regularization terms by means ofpylops.optimization.sparsity.SplitBregman
solver
- Added
numba
engine topylops.basicoperators.Spread
andpylops.basicoperators.Radon2D
operators - Added
pylops.signalprocessing.Radon3D
operator - Added
pylops.signalprocessing.Sliding2D
andpylops.signalprocessing.Sliding3D
operators - Added
pylops.signalprocessing.FFTND
operator - Added
pylops.signalprocessing.Radon3D
operator - Added
niter
option to ``pylops.LinearOperator.eigs` method - Added
show
option topylops.optimization.sparsity.ISTA
andpylops.optimization.sparsity.FISTA
solvers - Added
pylops.waveeqprocessing.seismicinterpolation
,pylops.waveequprocessing.waveeqdecomposition` and
pylops.waveequprocessing.lsm`` submodules - Added tests for
engine
in various operators - Added documentation regarding usage of
pylops
Docker container
- Added
fftw
engine toFFT
operator - Added
ISTA
andFISTA
sparse solvers - Added possibility to broadcast (handle multi-dimensional arrays)
to
Diagonal
andRestriction
operators - Added
Interp
operator - Added
Spread
operator - Added
Radon2D
operator
- Added
eigs
andcond
methods toLinearOperator
to estimate eigenvalues and conditioning number using scipy wrapping of ARPACK - Modified default
dtype
for all operators to befloat64
(orcomplex128
) to be consistent with default dtypes used by numpy (and scipy) for real and complex floating point numbers. - Added
Flip
operator - Added
Symmetrize
operator - Added
Block
operator - Added
Regression
operator performing polynomial regression and modifiedLinearRegression
to be a simple wrapper of the former whenorder=1
- Modified
pylops.basicoperators.MatrixMult
operator to work with both numpy ndarrays and scipy sparse matrices - Added
pylops.avo.prestack.PrestackInversion
routine - Added data weight optional input to
NormalEquationsInversion
andRegularizedInversion
solvers - Added
IRLS
solver
- Added
CausalIntegration
operator.
- Changed module from
lops
topylops
for consistency with library name (and pip install). - Removed quickplots from utilities and
matplotlib
from requirements of PyLops.
- First official release.