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.


Proximal operator of f function


Proximal operator of g function


Linear operator of g


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)


Initial auxiliary vector

znumpy.ndarray, optional

Additional vector


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


Inverted model


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}\]

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



Image segmentation

Image segmentation

MRI Imaging and Segmentation of Brain

MRI Imaging and Segmentation of Brain