Source code for pyproximal.projection.L1

import numpy as np
from pyproximal.projection import SimplexProj

[docs]class L1BallProj(): r""":math:`L_1` ball projection. Parameters ---------- n : :obj:`int` Number of elements of input vector radius : :obj:`float` Radius maxiter : :obj:`int`, optional Maximum number of iterations used by :func:`scipy.optimize.bisect` xtol : :obj:`float`, optional Absolute tolerance of :func:`scipy.optimize.bisect` Notes ----- Given an L1 ball defined as: .. math:: L1_{r} = \{ \mathbf{x}: ||\mathbf{x}||_1 \leq r \} its orthogonal projection is: .. math:: P_{L1_{r}} (\mathbf{x}) = sign(\mathbf{x}) P_{\operatorname{Simplex}(r)}(\mathbf{x}) Note that this is the proximal operator of the corresponding indicator function :math:`\mathcal{I}_{L1_{r}}`. """ def __init__(self, n, radius, maxiter=100, xtol=1e-5): self.n = n self.radius = radius self.simplex = SimplexProj(n, radius, maxiter, xtol) def __call__(self, x): if np.iscomplexobj(x): return np.exp(1j * np.angle(x)) * self.simplex(np.abs(x)) else: return np.sign(x) * self.simplex(np.abs(x))