Source code for pyproximal.projection.Simplex
import numpy as np
from pyproximal.projection import HyperPlaneBoxProj
[docs]class SimplexProj():
r"""Simplex 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 a Simplex set defined as:
.. math::
\Delta_n(r) = \{ \mathbf{x}: \sum_i x_i = r,\; x_i \geq 0 \}
its orthogonal projection is simply given by projection of the intersection
between a hyperplane and a box with chosen radius and bounds equal to 0
and inf (see :class:`pyproximal.projection.HyperPlaneBoxProj` for more
details).
"""
def __init__(self, n, radius, maxiter=100, xtol=1e-5):
self.simplex = HyperPlaneBoxProj(np.ones(n), radius,
lower=0, upper=np.inf,
maxiter=maxiter, xtol=xtol)
def __call__(self, x):
"""Apply Simplex projection
Parameters
----------
x : :obj:`np.ndarray`
Vector
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`
"""
return self.simplex(x)