pylops_mpi.proximal.optimization.primaldual.PrimalDual#

pylops_mpi.proximal.optimization.primaldual.PrimalDual(proxf, proxg, A, x0, y0, tau, mu, z=None, theta=1.0, niter=10, gfirst=True, callback=None, callbacky=False, returny=False, show=False)[source]#

Primal-dual algorithm

Solves the following (possibly) nonlinear minimization problem using the general version of the first-order primal-dual algorithm of [1]_:

\[\min_{\mathbf{x} \in X} g(\mathbf{Ax}) + f(\mathbf{x}) + \mathbf{z}^T \mathbf{x}\]

where \(\mathbf{A}\) is a linear operator, \(f\) and \(g\) can be any convex functions that have a known proximal operator.

This functional is effectively minimized by solving its equivalent primal-dual problem (primal in \(f\), dual in \(g\)):

\[\min_{\mathbf{x} \in X} \max_{\mathbf{y} \in Y} \mathbf{y}^T(\mathbf{Ax}) + \mathbf{z}^T \mathbf{x} + f(\mathbf{x}) - g^*(\mathbf{y})\]

where \(\mathbf{y}\) is the so-called dual variable.

Parameters:
proxfpyproximal.ProxOperator

Proximal operator of f function

proxgpyproximal.ProxOperator

Proximal operator of g function

Apylops.LinearOperator

Linear operator of g

x0pylops_mpi.DistributedArray

Initial vector

y0pylops_mpi.DistributedArray

Initial auxiliary vector.

taufloat or np.ndarray

Stepsize of subgradient of \(f\). This can be constant or function of iterations (in the latter cases provided as np.ndarray)

mufloat or np.ndarray

Stepsize of subgradient of \(g^*\). This can be constant or function of iterations (in the latter cases provided as np.ndarray)

zpylops_mpi.DistributedArray, optional

Additional vector

thetafloat, optional

Scalar between 0 and 1 that defines the update of the \(\bar{\mathbf{x}}\) variable - note that theta=0 is a special case that represents the semi-implicit classical Arrow-Hurwicz algorithm

niterint, optional

Number of iterations of iterative scheme

gfirstbool, optional

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

callbackcallable, optional

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

callbackybool, optional

Modify callback signature to (callback(x, y)) when callbacky=True

returnybool, optional

Return also y

showbool, optional

Display iterations log

Returns:
xpylops_mpi.DistributedArray

Inverted model

ypylops_mpi.DistributedArray, optional

Inverted second model, only returned if returny=True

Notes

See pyproximal.optimization.primaldual.PrimalDual