Source code for pyproximal.utils.moreau
import numpy as np
from pyproximal.ProxOperator import _check_tau
[docs]def moreau(prox, x, tau, tol=1e-5, raiseerror=True, verb=False):
r"""Moreau Identity.
The Moreau identity defines a relation between the vector :math:`\mathbf{u}`,
its proximal operator and its dual proximal operator and can be used to
estimate one of the two operators given the knowledge of the other.
Parameters
----------
prox : :obj:`pyprox.ProxOperator`
Proximal operator
x : :obj:`np.ndarray`
Vector
tau : :obj:`float`
Positive scalar weight
tol : :obj:`float`, optional
Moreau identity tolerance
raiseerror : :obj:`bool`, optional
Raise error or simply return ``False`` when Moreau identity is not
satisfied
verb : :obj:`bool`, optional
Verbosity
Notes
-----
The Moreau decomposition (or identity) is defined as:
.. math::
\mathbf{x} = \prox_{\tau f} (\mathbf{x}) +
\tau \prox_{\frac{1}{\tau} f^*} (\frac{\mathbf{x}}{\tau})
This routine is used to evaluate if the prox and dualprox implementations
of a ``pyprox.ProxOperator`` satisfy such identity.
"""
# compute prox
p = prox.prox(x, tau)
# compute dualprox
pdual = tau * prox.proxdual(x / tau, 1. / tau)
if verb:
print('x: ', x)
print('p + pdual: ', p + pdual)
print('error: ', x - (p + pdual))
if np.allclose(x, p + pdual, atol=tol):
return True
else:
if raiseerror:
raise ValueError('Moreau identity not verified')
return False