atoms.linear_constraints

Module: atoms.linear_constraints

Inheritance diagram for regreg.atoms.linear_constraints:

digraph inheritance33cd2f1ad5 { rankdir=LR; size="8.0, 12.0"; "atoms.cones.cone" [URL="regreg.atoms.cones.html#regreg.atoms.cones.cone",fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=10,height=0.25,shape=box,style="setlinewidth(0.5)",target="_top",tooltip="A class that defines the API for cone constraints."]; "regreg.atoms.atom" -> "atoms.cones.cone" [arrowsize=0.5,style="setlinewidth(0.5)"]; "atoms.linear_constraints.linear_constraint" [URL="#regreg.atoms.linear_constraints.linear_constraint",fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=10,height=0.25,shape=box,style="setlinewidth(0.5)",target="_top",tooltip="This class allows specifications of linear constraints"]; "atoms.cones.cone" -> "atoms.linear_constraints.linear_constraint" [arrowsize=0.5,style="setlinewidth(0.5)"]; "atoms.linear_constraints.projection" [URL="#regreg.atoms.linear_constraints.projection",fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=10,height=0.25,shape=box,style="setlinewidth(0.5)",target="_top"]; "atoms.linear_constraints.linear_constraint" -> "atoms.linear_constraints.projection" [arrowsize=0.5,style="setlinewidth(0.5)"]; "atoms.linear_constraints.projection_complement" [URL="#regreg.atoms.linear_constraints.projection_complement",fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=10,height=0.25,shape=box,style="setlinewidth(0.5)",target="_top",tooltip="An atom representing a linear constraint."]; "atoms.linear_constraints.linear_constraint" -> "atoms.linear_constraints.projection_complement" [arrowsize=0.5,style="setlinewidth(0.5)"]; "problems.composite.composite" [URL="regreg.problems.composite.html#regreg.problems.composite.composite",fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=10,height=0.25,shape=box,style="setlinewidth(0.5)",target="_top",tooltip="A generic way to specify a problem in composite form."]; "problems.composite.nonsmooth" [URL="regreg.problems.composite.html#regreg.problems.composite.nonsmooth",fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=10,height=0.25,shape=box,style="setlinewidth(0.5)",target="_top",tooltip="A composite subclass that explicitly returns 0"]; "problems.composite.composite" -> "problems.composite.nonsmooth" [arrowsize=0.5,style="setlinewidth(0.5)"]; "regreg.atoms.atom" [URL="regreg.atoms.html#regreg.atoms.atom",fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=10,height=0.25,shape=box,style="setlinewidth(0.5)",target="_top",tooltip="A class that defines the API for support functions."]; "problems.composite.nonsmooth" -> "regreg.atoms.atom" [arrowsize=0.5,style="setlinewidth(0.5)"]; }

Classes

linear_constraint

class regreg.atoms.linear_constraints.linear_constraint(shape, basis, offset=None, initial=None, quadratic=None)

Bases: regreg.atoms.cones.cone

This class allows specifications of linear constraints of the form \(x \in ext{row}(L)\) by specifying an orthonormal basis for the rowspace of \(L\).

If the constraint is of the form \(Ax=0\), then this linear constraint can be created using the linear classmethod of the zero cone in regreg.cones.

__init__(shape, basis, offset=None, initial=None, quadratic=None)

Initialize self. See help(type(self)) for accurate signature.

classmethod affine(linear_operator, offset, diag=False, quadratic=None)
apply_offset(x)

If self.offset is not None, return x-self.offset, else return x.

static check_subgradient(atom, prox_center)

For a given seminorm, verify the KKT condition for the problem for the proximal problem

\[\text{minimize}_u \frac{1}{2} \|u-z\|^2_2 + h(z)\]

where \(z\) is the prox_center and \(h\) is atom.

This should return two values that are 0, one is the inner product of the minimizer and the residual, the other is just 0.

Parameters

atom : cone

A cone instance with a proximal method.

prox_center : np.ndarray(np.float)

Center for the proximal map.

Returns

v1, v2 : float

Two values that should be equal if the proximal map is correct.

cone_prox(x)

Return (unique) minimizer

\[\beta^{\lambda}(u) = \text{argmin}_{\beta \in \mathbb{R}^p} \frac{1}{2} \|\beta-u\|^2_2 + \|\beta\|\]
property conjugate
constraint(x)

The constraint

\[\|\beta\|\]
property dual
get_conjugate()

Return the conjugate of an given atom.

>>> import regreg.api as rr
>>> penalty = rr.projection((4,), [[1,0,0,0],[0,1,0,0]])
>>> penalty.get_conjugate() 
projection_complement((4,), [[1,0,0,0],[0,1,0,0]], offset=None)
get_dual()

Return the dual of an atom. This dual is formed by making the substitution \(v=Ax\) where \(A\) is the self.linear_transform.

>>> import regreg.api as rr
>>> penalty = rr.nonnegative((30,))
>>> penalty 
nonnegative((30,), offset=None)
>>> penalty.dual 
(<regreg.affine.identity object at 0x...>, nonpositive((30,), offset=None))

If there is a linear part to the penalty, the linear_transform may not be identity:

>>> D = (np.identity(4) + np.diag(-np.ones(3),1))[:-1]
>>> D
array([[ 1., -1.,  0.,  0.],
       [ 0.,  1., -1.,  0.],
       [ 0.,  0.,  1., -1.]])
>>> linear_atom = rr.nonnegative.linear(D)
>>> linear_atom 
affine_cone(nonnegative((3,), offset=None), array([[ 1., -1.,  0.,  0.],
       [ 0.,  1., -1.,  0.],
       [ 0.,  0.,  1., -1.]]))
>>> linear_atom.dual 
(<regreg.affine.linear_transform object at 0x...>, nonpositive((3,), offset=None))
get_offset()
get_quadratic()

Get the quadratic part of the composite.

latexify(var=None, idx='')
classmethod linear(linear_operator, basis, diag=False, linear_term=None, offset=None)
property linear_transform

The linear transform applied before a penalty is computed. Defaults to regreg.affine.identity

>>> from regreg.api import l1norm
>>> penalty = l1norm(30, lagrange=3.4)
>>> type(penalty.linear_transform)
<class 'regreg.affine.identity'>
nonsmooth_objective(x, check_feasibility=False)
>>> import regreg.api as rr
>>> cone = rr.nonnegative(4)
>>> cone.nonsmooth_objective([3, 4, 5, 9])
0.0
objective(x, check_feasibility=False)
objective_template = '\\|%(var)s\\|'
objective_vars = {'coneklass': 'projection', 'dualconeklass': 'projection_complement', 'initargs': '(4,), [[1,0,0,0],[0,1,0,0]]', 'linear': 'D', 'offset': '\\alpha', 'shape': 'p', 'var': '\\beta'}
property offset
proximal(quadratic, prox_control=None)

The proximal operator.

\[v^{\lambda}(x) = \text{argmin}_{v \in \mathbb{R}^{p}} \frac{L}{2} \|x-\alpha - v\|^2_2 + \|\beta\| + \langle v, \eta \rangle\]

where \(\alpha\) is self.offset, \(\eta\) is quadratic.linear_term.

>>> import regreg.api as rr
>>> cone = rr.nonnegative((4,))
>>> Q = rr.identity_quadratic(1.5, [3, -4, -1, 1], 0, 0)
>>> np.allclose(cone.proximal(Q), [3, 0, 0, 1]) 
True
Parameters

quadratic : regreg.identity_quadratic.identity_quadratic

A quadratic added to the atom before minimizing.

prox_control : [None, dict]

This argument is ignored for seminorms, but otherwise is passed to regreg.algorithms.FISTA if the atom needs to be solved iteratively.

Returns

Z : np.ndarray(np.float)

The proximal map of the implied center of quadratic.

proximal_optimum(quadratic)
proximal_step(quadratic, prox_control=None)

Compute the proximal optimization

Parameters

prox_control: [None, dict]

If not None, then a dictionary of parameters for the prox procedure

property quadratic

Quadratic part of the object, instance of regreg.identity_quadratic.identity_quadratic.

set_offset(value)
set_quadratic(quadratic)

Set the quadratic part of the composite.

smooth_objective(x, mode='both', check_feasibility=False)

The zero function.

smoothed(smoothing_quadratic)

Add quadratic smoothing term

solve(quadratic=None, return_optimum=False, **fit_args)
tol = 1e-05

projection

class regreg.atoms.linear_constraints.projection(shape, basis, offset=None, initial=None, quadratic=None)

Bases: regreg.atoms.linear_constraints.linear_constraint

__init__(shape, basis, offset=None, initial=None, quadratic=None)

Initialize self. See help(type(self)) for accurate signature.

classmethod affine(linear_operator, offset, diag=False, quadratic=None)
apply_offset(x)

If self.offset is not None, return x-self.offset, else return x.

static check_subgradient(atom, prox_center)

For a given seminorm, verify the KKT condition for the problem for the proximal problem

\[\text{minimize}_u \frac{1}{2} \|u-z\|^2_2 + h(z)\]

where \(z\) is the prox_center and \(h\) is atom.

This should return two values that are 0, one is the inner product of the minimizer and the residual, the other is just 0.

Parameters

atom : cone

A cone instance with a proximal method.

prox_center : np.ndarray(np.float)

Center for the proximal map.

Returns

v1, v2 : float

Two values that should be equal if the proximal map is correct.

cone_prox(x, lipschitz=1)

Return (unique) minimizer

\[\beta^{\lambda}(u) = \text{argmin}_{\beta \in \mathbb{R}^p} \frac{1}{2} \|\beta-u\|^2_2 + \|\beta\|\]
property conjugate
constraint(x)

The constraint

\[\|\beta\|\]
property dual
get_conjugate()

Return the conjugate of an given atom.

>>> import regreg.api as rr
>>> penalty = rr.projection((4,), [[1,0,0,0],[0,1,0,0]])
>>> penalty.get_conjugate() 
projection_complement((4,), [[1,0,0,0],[0,1,0,0]], offset=None)
get_dual()

Return the dual of an atom. This dual is formed by making the substitution \(v=Ax\) where \(A\) is the self.linear_transform.

>>> import regreg.api as rr
>>> penalty = rr.projection((4,), [[1,0,0,0],[0,1,0,0]])
>>> penalty 
projection((4,), [[1,0,0,0],[0,1,0,0]], offset=None)
>>> penalty.dual 
(<regreg.affine.identity object at 0x...>, projection_complement((4,), [[1,0,0,0],[0,1,0,0]], offset=None))

If there is a linear part to the penalty, the linear_transform may not be identity:

>>> D = (np.identity(4) + np.diag(-np.ones(3),1))[:-1]
>>> D
array([[ 1., -1.,  0.,  0.],
       [ 0.,  1., -1.,  0.],
       [ 0.,  0.,  1., -1.]])
>>> linear_atom = rr.nonnegative.linear(D)
>>> linear_atom 
affine_cone(nonnegative((3,), offset=None), array([[ 1., -1.,  0.,  0.],
       [ 0.,  1., -1.,  0.],
       [ 0.,  0.,  1., -1.]]))
>>> linear_atom.dual 
(<regreg.affine.linear_transform object at 0x...>, nonpositive((3,), offset=None))
get_offset()
get_quadratic()

Get the quadratic part of the composite.

latexify(var=None, idx='')
classmethod linear(linear_operator, basis, diag=False, linear_term=None, offset=None)
property linear_transform

The linear transform applied before a penalty is computed. Defaults to regreg.affine.identity

>>> from regreg.api import l1norm
>>> penalty = l1norm(30, lagrange=3.4)
>>> type(penalty.linear_transform)
<class 'regreg.affine.identity'>
nonsmooth_objective(x, check_feasibility=False)
>>> import regreg.api as rr
>>> cone = rr.nonnegative(4)
>>> cone.nonsmooth_objective([3, 4, 5, 9])
0.0
objective(x, check_feasibility=False)
objective_template = '\\|%(var)s\\|'
objective_vars = {'coneklass': 'projection', 'dualconeklass': 'projection_complement', 'initargs': '(4,), [[1,0,0,0],[0,1,0,0]]', 'linear': 'D', 'offset': '\\alpha', 'shape': 'p', 'var': '\\beta'}
property offset
proximal(proxq, prox_control=None)

The proximal operator.

\[v^{\lambda}(x) = \text{argmin}_{v \in \mathbb{R}^{p}} \frac{L}{2} \|x-\alpha - v\|^2_2 + \|\beta\| + \langle v, \eta \rangle\]

where \(\alpha\) is self.offset, \(\eta\) is quadratic.linear_term.

>>> import regreg.api as rr
>>> cone = rr.nonnegative((4,))
>>> Q = rr.identity_quadratic(1.5, [3, -4, -1, 1], 0, 0)
>>> np.allclose(cone.proximal(Q), [3, 0, 0, 1]) 
True
Parameters

quadratic : regreg.identity_quadratic.identity_quadratic

A quadratic added to the atom before minimizing.

prox_control : [None, dict]

This argument is ignored for seminorms, but otherwise is passed to regreg.algorithms.FISTA if the atom needs to be solved iteratively.

Returns

Z : np.ndarray(np.float)

The proximal map of the implied center of quadratic.

proximal_optimum(quadratic)
proximal_step(quadratic, prox_control=None)

Compute the proximal optimization

Parameters

prox_control: [None, dict]

If not None, then a dictionary of parameters for the prox procedure

property quadratic

Quadratic part of the object, instance of regreg.identity_quadratic.identity_quadratic.

set_offset(value)
set_quadratic(quadratic)

Set the quadratic part of the composite.

smooth_objective(x, mode='both', check_feasibility=False)

The zero function.

smoothed(smoothing_quadratic)

Add quadratic smoothing term

solve(quadratic=None, return_optimum=False, **fit_args)
tol = 1e-05

projection_complement

class regreg.atoms.linear_constraints.projection_complement(shape, basis, offset=None, initial=None, quadratic=None)

Bases: regreg.atoms.linear_constraints.linear_constraint

An atom representing a linear constraint. The orthogonal complement of projection, it is specified with an orthonormal basis for the complement

__init__(shape, basis, offset=None, initial=None, quadratic=None)

Initialize self. See help(type(self)) for accurate signature.

classmethod affine(linear_operator, offset, diag=False, quadratic=None)
apply_offset(x)

If self.offset is not None, return x-self.offset, else return x.

static check_subgradient(atom, prox_center)

For a given seminorm, verify the KKT condition for the problem for the proximal problem

\[\text{minimize}_u \frac{1}{2} \|u-z\|^2_2 + h(z)\]

where \(z\) is the prox_center and \(h\) is atom.

This should return two values that are 0, one is the inner product of the minimizer and the residual, the other is just 0.

Parameters

atom : cone

A cone instance with a proximal method.

prox_center : np.ndarray(np.float)

Center for the proximal map.

Returns

v1, v2 : float

Two values that should be equal if the proximal map is correct.

cone_prox(x, lipschitz=1)

Return (unique) minimizer

\[\beta^{\lambda}(u) = \text{argmin}_{\beta \in \mathbb{R}^p} \frac{1}{2} \|\beta-u\|^2_2 + \|\beta\|\]
property conjugate
constraint(x)

The constraint

\[\|\beta\|\]
property dual
get_conjugate()

Return the conjugate of an given atom.

>>> import regreg.api as rr
>>> penalty = rr.projection_complement((4,), [[1,0,0,0],[0,1,0,0]])
>>> penalty.get_conjugate() 
projection((4,), [[1,0,0,0],[0,1,0,0]], offset=None)
get_dual()

Return the dual of an atom. This dual is formed by making the substitution \(v=Ax\) where \(A\) is the self.linear_transform.

>>> import regreg.api as rr
>>> penalty = rr.projection_complement((4,), [[1,0,0,0],[0,1,0,0]])
>>> penalty 
projection_complement((4,), [[1,0,0,0],[0,1,0,0]], offset=None)
>>> penalty.dual 
(<regreg.affine.identity object at 0x...>, projection((4,), [[1,0,0,0],[0,1,0,0]], offset=None))

If there is a linear part to the penalty, the linear_transform may not be identity:

>>> D = (np.identity(4) + np.diag(-np.ones(3),1))[:-1]
>>> D
array([[ 1., -1.,  0.,  0.],
       [ 0.,  1., -1.,  0.],
       [ 0.,  0.,  1., -1.]])
>>> linear_atom = rr.nonnegative.linear(D)
>>> linear_atom 
affine_cone(nonnegative((3,), offset=None), array([[ 1., -1.,  0.,  0.],
       [ 0.,  1., -1.,  0.],
       [ 0.,  0.,  1., -1.]]))
>>> linear_atom.dual 
(<regreg.affine.linear_transform object at 0x...>, nonpositive((3,), offset=None))
get_offset()
get_quadratic()

Get the quadratic part of the composite.

latexify(var=None, idx='')
classmethod linear(linear_operator, basis, diag=False, linear_term=None, offset=None)
property linear_transform

The linear transform applied before a penalty is computed. Defaults to regreg.affine.identity

>>> from regreg.api import l1norm
>>> penalty = l1norm(30, lagrange=3.4)
>>> type(penalty.linear_transform)
<class 'regreg.affine.identity'>
nonsmooth_objective(x, check_feasibility=False)
>>> import regreg.api as rr
>>> cone = rr.nonnegative(4)
>>> cone.nonsmooth_objective([3, 4, 5, 9])
0.0
objective(x, check_feasibility=False)
objective_template = '\\|%(var)s\\|'
objective_vars = {'coneklass': 'projection_complement', 'dualconeklass': 'projection', 'initargs': '(4,), [[1,0,0,0],[0,1,0,0]]', 'linear': 'D', 'offset': '\\alpha', 'shape': 'p', 'var': '\\beta'}
property offset
proximal(proxq, prox_control=None)

The proximal operator.

\[v^{\lambda}(x) = \text{argmin}_{v \in \mathbb{R}^{p}} \frac{L}{2} \|x-\alpha - v\|^2_2 + \|\beta\| + \langle v, \eta \rangle\]

where \(\alpha\) is self.offset, \(\eta\) is quadratic.linear_term.

>>> import regreg.api as rr
>>> cone = rr.nonnegative((4,))
>>> Q = rr.identity_quadratic(1.5, [3, -4, -1, 1], 0, 0)
>>> np.allclose(cone.proximal(Q), [3, 0, 0, 1]) 
True
Parameters

quadratic : regreg.identity_quadratic.identity_quadratic

A quadratic added to the atom before minimizing.

prox_control : [None, dict]

This argument is ignored for seminorms, but otherwise is passed to regreg.algorithms.FISTA if the atom needs to be solved iteratively.

Returns

Z : np.ndarray(np.float)

The proximal map of the implied center of quadratic.

proximal_optimum(quadratic)
proximal_step(quadratic, prox_control=None)

Compute the proximal optimization

Parameters

prox_control: [None, dict]

If not None, then a dictionary of parameters for the prox procedure

property quadratic

Quadratic part of the object, instance of regreg.identity_quadratic.identity_quadratic.

set_offset(value)
set_quadratic(quadratic)

Set the quadratic part of the composite.

smooth_objective(x, mode='both', check_feasibility=False)

The zero function.

smoothed(smoothing_quadratic)

Add quadratic smoothing term

solve(quadratic=None, return_optimum=False, **fit_args)
tol = 1e-05