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:
- proxf
pyproximal.ProxOperator Proximal operator of f function
- proxg
pyproximal.ProxOperator Proximal operator of g function
- A
pylops.LinearOperator Linear operator of g
- x0
pylops_mpi.DistributedArray Initial vector
- y0
pylops_mpi.DistributedArray Initial auxiliary vector.
- tau
floatornp.ndarray Stepsize of subgradient of \(f\). This can be constant or function of iterations (in the latter cases provided as np.ndarray)
- mu
floatornp.ndarray Stepsize of subgradient of \(g^*\). This can be constant or function of iterations (in the latter cases provided as np.ndarray)
- z
pylops_mpi.DistributedArray, optional Additional vector
- theta
float, optional Scalar between 0 and 1 that defines the update of the \(\bar{\mathbf{x}}\) variable - note that
theta=0is a special case that represents the semi-implicit classical Arrow-Hurwicz algorithm- niter
int, optional Number of iterations of iterative scheme
- gfirst
bool, optional Apply Proximal of operator
gfirst (True) or Proximal of operatorffirst (False)- callback
callable, optional Function with signature (
callback(x)) to call after each iteration wherexis the current model vector- callbacky
bool, optional Modify callback signature to (
callback(x, y)) whencallbacky=True- returny
bool, optional Return also
y- show
bool, optional Display iterations log
- proxf
- Returns:
- x
pylops_mpi.DistributedArray Inverted model
- y
pylops_mpi.DistributedArray, optional Inverted second model, only returned if
returny=True
- x
Notes
See
pyproximal.optimization.primaldual.PrimalDual