pylops_mpi.proximal.optimization.primal.ADMML2#

pylops_mpi.proximal.optimization.primal.ADMML2(proxg, Op, b, A, x0, tau, niter=10, z0=None, gfirst=False, callback=None, show=False, kwargs_solver={})[source]#

Alternating Direction Method of Multipliers for L2 misfit term

Solves the following minimization problem using Alternating Direction Method of Multipliers:

\[\begin{split}\mathbf{x},\mathbf{z} = \arg\,min_{\mathbf{x},\mathbf{z}} \frac{1}{2}||\mathbf{Op}\mathbf{x} - \mathbf{b}||_2^2 + g(\mathbf{z}) \\ s.t. \; \mathbf{Ax}=\mathbf{z}\end{split}\]

where \(g(\mathbf{z})\) is any convex function that has a known proximal operator.

Parameters:
proxgpylops_mpi.proximal.MPIProxOperator

Proximal operator of g function

Oppylops_mpi.MPILinearOperator or pylops_mpi.MPIStackedLinearOperator

Linear operator of data misfit term

bpylops_mpi.DistributedArray or pylops_mpi.StackedDistributedArray

Data

Apylops_mpi.MPILinearOperator or pylops_mpi.MPIStackedLinearOperator

Linear operator of regularization term

x0pylops_mpi.DistributedArray or pylops_mpi.StackedDistributedArray

Initial vector

taufloat

Positive scalar weight, which should satisfy the following condition to guarantees convergence: \(\tau \in (0, 1/\lambda_{max}(\mathbf{A}^H\mathbf{A})]\).

niterint, optional

Number of iterations of iterative scheme

z0pylops_mpi.DistributedArray or pylops_mpi.StackedDistributedArray

Initial auxiliary vector. If None, initialized to A @ x0.

gfirstbool, optional

Apply Proximal of operator g first (True) or Proximal of operator f first (False)

tolfloat, optional

Tolerance on change of objective function (used as stopping criterion). If tol=None, run until niter is reached

callbackcallable, optional

Function with signature (callback(x)) to call after each iteration where x is the current model vector

showbool, optional

Display iterations log

**kwargs_solver

Arbitrary keyword arguments for pylops_mpi.optimization.basic.cgls used to solve the x-update

Returns:
xpylops_mpi.DistributedArray or pylops_mpi.StackedDistributedArray

Inverted model

zpylops_mpi.DistributedArray or pylops_mpi.StackedDistributedArray

Inverted second model

Raises:
ValueError

If both x0 and z0 are set to None or x0 is set to None

Notes

See pyproximal.optimization.primal.ADMML2