pyproximal.optimization.primaldual.PrimalDual#

pyproximal.optimization.primaldual.PrimalDual(proxf, proxg, A, x0, tau, mu, y0=None, 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

x0numpy.ndarray

Initial 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)

z0numpy.ndarray

Initial auxiliary vector

znumpy.ndarray, optional

Additional vector

thetafloat

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
xnumpy.ndarray

Inverted model

Notes

The Primal-dual algorithm can be expressed by the following recursion (gfirst=True):

\[\begin{split}\mathbf{y}^{k+1} = \prox_{\mu g^*}(\mathbf{y}^{k} + \mu \mathbf{A}\bar{\mathbf{x}}^{k})\\ \mathbf{x}^{k+1} = \prox_{\tau f}(\mathbf{x}^{k} - \tau (\mathbf{A}^H \mathbf{y}^{k+1} + \mathbf{z})) \\ \bar{\mathbf{x}}^{k+1} = \mathbf{x}^{k+1} + \theta (\mathbf{x}^{k+1} - \mathbf{x}^k)\end{split}\]

where \(\tau \mu \lambda_{max}(\mathbf{A}^H\mathbf{A}) < 1\).

Alternatively for gfirst=False the scheme becomes:

\[\begin{split}\mathbf{x}^{k+1} = \prox_{\tau f}(\mathbf{x}^{k} - \tau (\mathbf{A}^H \mathbf{y}^{k} + \mathbf{z})) \\ \bar{\mathbf{x}}^{k+1} = \mathbf{x}^{k+1} + \theta (\mathbf{x}^{k+1} - \mathbf{x}^k) \\ \mathbf{y}^{k+1} = \prox_{\mu g^*}(\mathbf{y}^{k} + \mu \mathbf{A}\bar{\mathbf{x}}^{k+1})\end{split}\]
1

A., Chambolle, and T., Pock, “A first-order primal-dual algorithm for convex problems with applications to imaging”, Journal of Mathematical Imaging and Vision, 40, 8pp. 120-145. 2011.

Examples using pyproximal.optimization.primaldual.PrimalDual#

Adaptive Primal-Dual

Adaptive Primal-Dual

Basis Pursuit

Basis Pursuit

Denoising

Denoising

Image segmentation

Image segmentation

MRI Imaging and Segmentation of Brain

MRI Imaging and Segmentation of Brain