- Fixed element-wise variance accumulation in
pylops.optimization.cls_basic.LSQRandpylops.lsqr, which previously assigned the same value to every entry ofvar(#639)
- Added cubic spline interpolation operator via
pylops.signalprocessing.interpspline.InterpCubicSpline(also interfaceable viapylops.signalprocessing.interp.Interp(..., kind="cubic_spline") - Added
pylops.medical.MRI2Doperator - Added
pylops.basicoperators.SmoothingNDoperator - Added 3d extension to
pylops.utils.signalprocessing.pwd_slope_estimate - Fixed unwanted upcasting in
pylops.avo.AVOLinearModelling,pylops.Laplacian,pylops.signalprocessing.Bilinear,pylops.signalprocessing.Interp,pylops.signalprocessing.NonStationaryFilters2D,pylops.signalprocessing.Seislet,pylops.signalprocessing.Sliding1D,pylops.signalprocessing.Sliding2D,pylops.signalprocessing.Sliding3D,pylops.basicoperators.Smoothing1D,pylops.basicoperators.Smoothing2D, andpylops.waveeqprocessing.Marchenko - Improved typing annotations across all operators (and enforced use of Literal for parameters with multiple options)
- Added
pylops.medicalmodule andpylops.medical.CT2Doperator - Added
pylops.utils.signalprocessing.pwd_slope_estimateandpylops.signalprocessing.PWSprayer2Dandpylops.signalprocessing.PWSmoother2Doperators - Added support for multithreading to
pylops.basicoperators.Block,pylops.basicoperators.BlockDiag,pylops.basicoperators.HStack, andpylops.basicoperators.VStack(andparallel_kindparameter) - Added
kwargs_ffttopylops.waveeqprocessing.BlendingContinuous,pylops.waveeqprocessing.BlendingGroup, andpylops.waveeqprocessing.BlendingHalf - Added
nttottopylops.waveeqprocessing.BlendingContinuous - Added
fftenginetopylops.waveeqprocessing.PhaseShift - Added
mkl_fftengine topylops.signalprocessing.FFT,pylops.signalprocessing.FFT2D, andpylops.signalprocessing.FFTND - Added JAX backend to
pylops.signalprocessing.ChirpRadon2Dandpylops.signalprocessing.ChirpRadon3Doperators. - Added
pylops.optimization.callback.CostNanInfCallback,pylops.optimization.callback.CostToDataCallback, andpylops.optimization.callback.CostToInitialCallbackcallbacks, and andrtolandrtol1parameters in all solvers - Optimized internal handling of
pylops.basicoperators.Zerooperators inpylops.basicoperators.BlockDiag,pylops.basicoperators.HStack, andpylops.basicoperators.VStack - Homogenize error/warning/info messages across the library by switching to
logging/warning - Fixed initialization of
randrwinpylops.optimization.cls_sparsity.IRLS - Fixed
pylops.optimization.cls_sparsity._halfthresholdfor complex valued CuPy arrays - Fixed initialization of
decayin sparse solvers to correctly solve complex-valued problems - Fixed bug when calling
__pow__of a linear operator with CuPy arrays - Fixed dtype handling in
pylops.optimization.cls_sparsity.ISTAandpylops.optimization.cls_sparsity.FISTA
- Added
cudaengine topylops.waveeqprocessing.Kirchhoffoperator - Added
Opbasisandoptimal_coefftopylops.optimization.cls_sparsity.OMP - Added
solverto the input parameters of the_oneshotinternal methods ofpylops.waveeqprocessing.AcousticWave2Dto avoid recreating it for every shot - Added
kwargs_ffttopylops.signalprocessing.FFT,pylops.signalprocessing.FFT2D, andpylops.signalprocessing.FFTND - Fixed bug in
pylops.waveeqprocessing.MDDwhen using CuPy arrays forGanddwithtwosided=Trueandadd_negative=True - Fixed bug in
pylops.signalprocessing.FourierRadon3Din the default choice ofnum_threads_per_blocks - Fixed bug in
pylops.signalprocessing.Convolve1Din the definition ofpadandpaddwhen applying the operator to a CuPy array - Fixed bug in
pylops.optimization.cls_sparsity.OMPavoiding passingexplicitin the creation of_ColumnLinearOperator - Fixed bug in
pylops.optimization.cls_sparsity.OMPcallback method ascolswas not passed not allowingxto be properly reconstructed - Fixed bug in
pylops.waveeqprocessing.SeismicInterpolationin calculation ofsamplingwhen not passed
- Added
pylops.signalprocessing.FourierRadon2dandpylops.signalprocessing.FourierRadon3doperators - Added
pylops.PyTensorOperatoroperator - Added
pylops.ToCupyoperator - Added
pylops.utils.seismicevents.parabolic3dmethod - Fixed bug in
pylops.Restrictionwhen passing iava as cupy array
- Fixed bug in
pylops.utils.backend(see Issue #606)
- Added
pylops.JaxOperator,pylops.signalprocessing.DWTND, andpylops.signalprocessing.DTCWToperators. - Added
updatesrcmethod topylops.waveeqprocessing.AcousticWave2D. - Added
verbtopylops.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_ffttopylops.signalprocessing.FFTND. - Added
cosinetapertopylops.utils.tapers.cosinetaper. - Added
kindtopylops.waveeqprocessing.Deghosting. - Modified all methods in
pylops.utils.backendto enable jax integration. - Modified implementations of
pylops.signalprocessing.Sliding1D,pylops.signalprocessing.Sliding2D,pylops.signalprocessing.Sliding3D,pylops.signalprocessing.Patch2D, andpylops.signalprocessing.Patch3Dto being directly implemented instead of relying on other PyLops operators. Added alsosavetaperparameter and an option to apply the operatorOpsimultaneously to all windows. - Modified
pylops.waveeqprocessing.AcousticWave2D._born_oneshotandpylops.waveeqprocessing.AcousticWave2D._born_allshotsto avoid recreating the devito solver for each shot (and enabling internal caching...) - Modified
dtypeofpylops.signalprocessing.Shiftto be that of the input vector. - Modified
pylops.waveeqprocessing.BlendingContinuousto usematvec/rmatvecinstead of@/.H @for compatibility with pylops solvers. - Removed
cusignalas 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
nttotinpylops.waveeqprocessing.BlendingContinuous - Fixed bug in
pylops.utils.signalprocessing.dip_estimate(see Issue #572)
- Added
pylops.signalprocessing.NonStationaryConvolve3Doperator - Added nd-array capabilities to
pylops.basicoperators.Identityandpylops.basicoperators.Zero - Added second implementation in
pylops.waveeqprocessing.BlendingContinuouswhich is more performant when dealing with small number of receivers - Added
forceflatproperty 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
dynamicmode ofpylops.waveeqprocessing.Kirchhoffoperator - Modified
pylops.signalprocessing.Convolve1Dto allow both filters that are both shorter and longer of the input vector - Modified all solvers to use
matvec/rmatvecinstead of@/.H @to improve performance
- Added
pylops.signalprocessing.DCT,pylops.signalprocessing.NonStationaryConvolve1D,pylops.signalprocessing.NonStationaryConvolve2D,pylops.signalprocessing.NonStationaryFilters1D, andpylops.signalprocessing.NonStationaryFilters2Doperators - Added
pylops.waveeqprocessing.BlendingContinuous,pylops.waveeqprocessing.BlendingGroup, andpylops.waveeqprocessing.BlendingHalfoperators - Added
kind='datamodel'topylops.optimization.cls_sparsity.IRLS - Improved inner working of
pylops.waveeqprocessing.Kirchhoffoperator significantly reducing the memory usage related to storing traveltime, angle, and amplitude tables. - Improved handling of
haxesinpylops.signalprocessing.Radon2Dandpylops.signalprocessing.Radon3Doperators - Added possibility to feed ND-arrays to
pylops.TorchOperator - Removed
pylops.LinearOperatorinheritance and added__call__method topylops.TorchOperator - Removed
scipy.sparse.linalg.LinearOperatorand addedabc.ABCinheritance topylops.LinearOperator - All operators are now classes of
pylops.LinearOperatortype
PyLops has undergone significant changes in this release, including new LinearOperators, 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/dimsdproperties. Users do not need to use.raveland.reshapeas 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_designorpatchXd_designfunctions 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
LinearOperatorfrom 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.FISTAto 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.Deghostingintroduced in commit 7e596d4
- Refractored
pylops.utils.dottest, and added two new optional input parameters (atolandrtol) - Added optional parameter
densesolvertopylops.LinearOperator.div
- !DELETED! due to a mistake in the release process
- Added
NMOexample to gallery - Extended
pylops.basicoperators.Laplacianto N-dimensional arrays - Added
forwardkind topylops.basicoperators.SecondDerivativeandpylops.basicoperators.Laplacian - Added
chirp-slidingkind topylops.waveeqprocessing.seismicinterpolation.SeismicInterpolation - Fixed bug due to the new internal structure of
LinearOperatorsubmodule introduced inscipy1.8.0
- Added
pylops.utils.describe.describemethod - Added
fftenginetopylops.waveeqprocessing.Marchenko - Added
ifftshift_beforeandfftshift_afteroptional input parameters inpylops.signalprocessing.FFT - Added
normoptional input parameter topylops.signalprocessing.FFT2Dandpylops.signalprocessing.FFTND - Added
scipybackend topylops.signalprocessing.FFTandpylops.signalprocessing.FFT2Dandpylops.signalprocessing.FFTND - Added
epsoptional input parameter inpylops.utils.signalprocessing.slope_estimate - Added pre-commit hooks
- Improved pre-commit hooks
- Vectorized
pylops.utils.signalprocessing.slope_estimate - Handlexd
nfft<ntcase inpylops.signalprocessing.FFTandpylops.signalprocessing.FFT2Dandpylops.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.FFTandpylops.signalprocessing.FFT2Dandpylops.signalprocessing.FFTND - Reduced warnings in test suite
- Reduced computational time of
test_wavedecompositionin the test suite - Fixed bug in
pylops.signalprocessing.Sliding1D,pylops.signalprocessing.Sliding2Dandpylops.signalprocessing.Sliding3Dwhere thedtypeof the Restriction operator is inffered fromOp - Fixed bug in
pylops.signalprocessing.Radon2Dandpylops.signalprocessing.Radon3Dwhen using centered spatial axes - Fixed scaling in
pylops.signalprocessing.FFTwithreal=Trueto pass the dot-test
- Added
pylops.utils.estimatorsmodule for trace estimation - Added
x0inpylops.optimization.sparsity.ISTAandpylops.optimization.sparsity.FISTAto handle non-zero initial guess - Modified
pylops.optimization.sparsity.ISTAandpylops.optimization.sparsity.FISTAto handle multiple right hand sides - Modified creation of
haxisinpylops.signalprocessing.Radon2Dandpylops.signalprocessing.Radon3Dto allow for uncentered spatial axes - Fixed
_rmatvecfor explicit inpylops.LinearOperator._ColumnLinearOperator
- Added
pylops.signalprocessing.Shiftoperator. - Added option to choose derivative kind in
pylops.avo.poststack.PoststackInversionandpylops.avo.prestack.PrestackInversion - Improved efficiency of adjoint of
pylops.signalprocessing.Fredholm1by applying complex conjugation to the vectors. - Added
vsvptopylops.avo.prestack.PrestackInversionallowing to use user defined VS/VP ratio. - Added
kindtopylops.basicoperators.CausalIntegrationallowingfull,half, ortrapezoidalintegration - Fixed
_hardthreshold_percentileinpylops.optimization.sparsity- Issue #249. - Fixed r2norm in
pylops.optimization.solver.cgls
- Added
pylops.optimization.solver.lsqrsolver - Added utility routine
pylops.utils.scalability_testfor scalability tests when usingmultiprocessing - Added
pylops.avo.avo.psAVO modelling option and restructuredpylops.avo.prestack.PrestackLinearModellingto allow passing any function handle that can perform AVO modelling apart from those directly available - Added R-linear operators (when setting the property
clinear=Falseof 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.Blockpylops.basicoperators.BlockDiag, andpylops.signalprocessing.Sliding3Dusingmultiprocessing - Added dtype to vector
Xwhen usingscipy.sparse.linalg.lobpcgineigsmethod ofpylops.LinearOperator - Use
kind=forwardfot FirstDerivative inpylops.avo.poststack.PoststackInversioninversion when dealing with L1 regularized inversion as it makes the inverse problem more stable (no ringing in solution) - Changed
costinpylops.optimization.solver.cgandpylops.optimization.solver.cglsto be L2 norms of residuals - Fixed
pylops.utils.dottest.dottestfor imaginary vectors and to ensureuandvvectors are of same dtype of the operator
- Added
pylops.signalprocessing.Sliding1Dandpylops.signalprocessing.Patch2Doperators - Added
pylops.basicoperators.MemoizeOperatoroperator - Added decay and analysis option in
pylops.optimization.sparsity.ISTAandpylops.optimization.sparsity.FISTAsolvers - Added
torealandtoimagmethods topylops.LinearOperator - Make
nrandncoptional inpylops.utils.dottest.dottest - Fixed complex check in
pylops.basicoperators.MatrixMultwhen 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
eigsandsolversubmodules tooptimization - Added
depsandbackendsubmodules toutils - Fixed bug in
pylops.signalprocessing.Convolve2Dandpylops.signalprocessing.ConvolveNDwhen dealing with filters that have less dimensions than the input vector.
- Fixed import of
pyfttwwhen not available inpylops.signalprocessing.ChirpRadon3D
- Added
pylops.signalprocessing.ChirpRadon2Dandpylops.signalprocessing.ChirpRadon3Doperators. - 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.HStackto allow automatic inference from dtypes of input operator. - Modified dtype of
pylops.waveeqprocessing.Marchenkooperator to ensure that outputs of forward and adjoint are real arrays. - Reverted to previous complex-friendly implementation of
pylops.optimization.sparsity._softthresholdto avoid division by 0.
- Added
tosparsemethod topylops.LinearOperator. - Added
kind=linearinpylops.signalprocessing.Seisletoperator. - Added
kindtopylops.basicoperators.FirstDerivative. operator to perform forward and backward (as well as centered) derivatives. - Added
kindtopylops.optimization.sparsity.IRLSsolver to choose between data or model sparsity. - Added possibility to use
scipy.sparse.linalg.lobpcginpylops.LinearOperator.eigsandpylops.LinearOperator.cond. - Added possibility to use
scipy.signal.oaconvolveinpylops.signalprocessing.Convolve1D. - Added
NRegstopylops.optimization.leastsquares.NormalEquationsInversionto allow providing regularization terms directly in the form ofH^T H.
- Changed internal behaviour of
pylops.sparsity.OMPwhenniter_inner=0. Automatically reverts to Matching Pursuit algorithm. - Changed handling of
dtypeinpylops.signalprocessing.FFTandpylops.signalprocessing.FFT2Dto ensure that the type of the input vector is retained when applying forward and adjoint. - Added
dtypeparameter to theFFTcalls in the definition of thepylops.waveeqprocessing.MDDoperation. This ensure that the type of the real part ofGinput is enforced to the output vectors of the forward and adjoint operations.
- Added
pylops.waveeqprocessing.Deghostingandpylops.signalprocessing.Seisletoperators - Added hard and half thresholds in
pylops.optimization.sparsity.ISTAandpylops.optimization.sparsity.FISTAsolvers - Added
prescaledinput parameter topylops.waveeqprocessing.MDCandpylops.waveeqprocessing.Marchenko - Added sinc interpolation to
pylops.signalprocessing.Interp(kind == 'sinc') - Modified
pylops.waveeqprocessing.marchenko.directwaveto to model analytical responses from both sources of volume injection (derivative=False) and source of volume injection rate (derivative=True) - Added
pylops.LinearOperator.asoperatormethod topylops.LinearOperator - Added
pylops.utils.signalprocessing.slope_estimatefunction - Fixed bug in
pylops.signalprocessing.Radon2Dandpylops.signalprocessing.Radon3Dwhenonthefly=Truereturning the same result as whenonthefly=False
- Added
todensemethod topylops.LinearOperator - Added
pylops.signalprocessing.Bilinear,pylops.signalprocessing.DWT, andpylops.signalprocessing.DWT2operators - Added
pylops.waveeqprocessing.PressureToVelocity,pylops.waveeqprocessing.UpDownComposition3Doperator, andpylops.waveeqprocessing.PhaseShiftoperators - Fixed bug in
pylops.basicoperators.Kronecker(see Issue #125)
- Added
pylops.basicoperators.Gradient,pylops.basicoperators.Sum,pylops.basicoperators.FirstDirectionalDerivative, andpylops.basicoperators.SecondDirectionalDerivativeoperators - Added
pylops._ColumnLinearOperatorprivate operator - Added possibility to directly mix Linear operators and numpy/scipy
2d arrays in
pylops.basicoperators.VStackandpylops.basicoperators.HStackandpylops.basicoperators.BlockDiagonaloperators - Added
pylops.optimization.sparsity.OMPsolver
- Added
pylops.signalprocessing.ConvolveNDoperator - Added
pylops.utils.signalprocessing.nonstationary_convmtxto 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.MDCto allow calling different operators (e.g., from pylops-distributed or pylops-gpu) within the method
- Added
conjmethod topylops.LinearOperator - Added
pylops.basicoperators.Kronecker,pylops.basicoperators.Roll, andpylops.basicoperators.Transposeoperators - Added
pylops.signalprocessing.Fredholm1operator - Added
pylops.optimization.sparsity.SPGL1andpylops.optimization.sparsity.SplitBregmansolvers - Sped up
pylops.signalprocessing.Convolve1Dusingscipy.signal.fftconvolvefor multi-dimensional signals - Changes in implementation of
pylops.waveeqprocessing.MDCandpylops.waveeqprocessing.Marchenkoto take advantage of primitives operators - Added
epsRL1option topylops.avo.poststack.PoststackInversionandpylops.avo.prestack.PrestackInversionto include TV-regularization terms by means ofpylops.optimization.sparsity.SplitBregmansolver
- Added
numbaengine topylops.basicoperators.Spreadandpylops.basicoperators.Radon2Doperators - Added
pylops.signalprocessing.Radon3Doperator - Added
pylops.signalprocessing.Sliding2Dandpylops.signalprocessing.Sliding3Doperators - Added
pylops.signalprocessing.FFTNDoperator - Added
pylops.signalprocessing.Radon3Doperator - Added
niteroption to ``pylops.LinearOperator.eigs` method - Added
showoption topylops.optimization.sparsity.ISTAandpylops.optimization.sparsity.FISTAsolvers - Added
pylops.waveeqprocessing.seismicinterpolation,pylops.waveequprocessing.waveeqdecomposition` andpylops.waveequprocessing.lsm`` submodules - Added tests for
enginein various operators - Added documentation regarding usage of
pylopsDocker container
- Added
fftwengine toFFToperator - Added
ISTAandFISTAsparse solvers - Added possibility to broadcast (handle multi-dimensional arrays)
to
DiagonalandRestrictionoperators - Added
Interpoperator - Added
Spreadoperator - Added
Radon2Doperator
- Added
eigsandcondmethods toLinearOperatorto estimate eigenvalues and conditioning number using scipy wrapping of ARPACK - Modified default
dtypefor all operators to befloat64(orcomplex128) to be consistent with default dtypes used by numpy (and scipy) for real and complex floating point numbers. - Added
Flipoperator - Added
Symmetrizeoperator - Added
Blockoperator - Added
Regressionoperator performing polynomial regression and modifiedLinearRegressionto be a simple wrapper of the former whenorder=1 - Modified
pylops.basicoperators.MatrixMultoperator to work with both numpy ndarrays and scipy sparse matrices - Added
pylops.avo.prestack.PrestackInversionroutine - Added data weight optional input to
NormalEquationsInversionandRegularizedInversionsolvers - Added
IRLSsolver
- Added
CausalIntegrationoperator.
- Changed module from
lopstopylopsfor consistency with library name (and pip install). - Removed quickplots from utilities and
matplotlibfrom requirements of PyLops.
- First official release.