pyproximal.optimization.cls_primal.HQS

class pyproximal.optimization.cls_primal.HQS(callbacks: Callbacks = None)[source]

Half Quadratic splitting

Solves the following minimization problem using Half Quadratic splitting algorithm:

\[\begin{split}\mathbf{x},\mathbf{z} = \argmin_{\mathbf{x},\mathbf{z}} f(\mathbf{x}) + g(\mathbf{z}) \\ s.t. \; \mathbf{x}=\mathbf{z}\end{split}\]

where \(f(\mathbf{x})\) and \(g(\mathbf{z})\) are any convex function that has a known proximal operator.

Notes

The HQS algorithm can be expressed by the following recursion [1]:

\[\begin{split}\mathbf{z}^{k+1} = \prox_{\tau g}(\mathbf{x}^{k}) \\ \mathbf{x}^{k+1} = \prox_{\tau f}(\mathbf{z}^{k+1})\end{split}\]

for gfirst=False, or

\[\begin{split}\mathbf{x}^{k+1} = \prox_{\tau f}(\mathbf{z}^{k}) \\ \mathbf{z}^{k+1} = \prox_{\tau g}(\mathbf{x}^{k+1})\end{split}\]

for gfirst=False. Note that x and z converge to each other, however if iterations are stopped too early x is guaranteed to belong to the domain of f while z is guaranteed to belong to the domain of g. Depending on the problem either of the two may be the best solution.

[1]

D., Geman, and C., Yang, “Nonlinear image recovery with halfquadratic regularization”, IEEE Transactions on Image Processing, 4, 7, pp. 932-946, 1995.

Methods

__init__([callbacks])

callback(x, *args, **kwargs)

Callback routine

finalize([nbar, show])

Finalize solver

memory_usage()

Compute memory usage of the solver

run(x, z[, niter, show, itershow])

Run solver

setup(proxf, proxg, x0, tau[, z0, gfirst, ...])

Setup solver

solve(proxf, proxg, x0, tau[, z0, gfirst, ...])

Run entire solver

step(x, z[, show])

Run one step of solver