约束条件

约束是限制优化问题域的等式或不等式。CVXPY有七种类型的约束:非正、等式或零、半正定、二阶锥、指数锥、三维幂锥和N维幂锥。绝大多数用户只需要创建前三种类型的约束。此外,大多数用户除了如何创建约束外,不需要了解关于约束的其他任何信息。然而,约束API确实提供了一些高级用户可能会觉得有用的方法;例如,一些API允许您检查对偶变量值和残差。

约束

class cvxpy.constraints.constraint.Constraint(args, constr_id=None)[源代码]

基础类:Canonical

约束的基类。

约束是施加在数学表达式或其列表上的等式、不等式或更一般地,广义不等式。

Parameters:
args : list

表达式树的列表。

constr_id : int

约束的唯一标识符。

abstract is_dcp(dpp: bool = False) bool[source]

检查约束是否为DCP。

Returns:

如果约束是DCP,则为True,否则为False。

Return type:

布尔

value(tolerance: float = 1e-08)[source]

检查约束违规是否小于容差。

Parameters:
tolerance : float

对违规施加的绝对容忍度。

Returns:

如果违规小于 tolerance,则为 True,否则为 False。

Return type:

布尔

Raises:

ValueError – 如果约束表达式没有与之关联的值。

violation()[来源]

约束的数值残差。

违规被定义为约束表达式的值与其在约束域上的投影之间的距离:

\[||\Pi(v) - v||_2^2\]

其中 \(v\) 是约束表达式的值, \(\Pi\) 是约束域上的投影运算符。

Returns:

残值。

Return type:

NumPy.ndarray

Raises:

ValueError – 如果约束表达式没有与之关联的值。

NonPos

class cvxpy.constraints.nonpos.NonPos(expr, constr_id=None)[source]

基础类:Constraint

一个形式为 \(x \leq 0\) 的不等式约束。

创建不等式约束的首选方法是通过运算符重载。要将表达式 x 约束为非正数,请写 x <= 0;要将 x 约束为非负数,请写 x >= 0

与此约束相关的对偶变量是非负的,而不是非正的。因此,此约束的对偶变量属于极锥而不是对偶锥。

注意:严格不等式不受支持,因为它们在数值环境中没有意义。

Parameters:
expr : Expression

要约束的表达式。

constr_id : int

约束的唯一标识符。

property dual_value

对偶变量的值。

Type:

NumPy.ndarray

is_dcp(dpp: bool = False) bool[source]

如果参数是凸的,则NonPos约束是DCP。

property shape

约束表达式的形状。

Type:

整数

property size

约束表达式的大小。

Type:

整数

value(tolerance: float = 1e-08)

检查约束违规是否小于容差。

Parameters:
tolerance : float

对违规施加的绝对容忍度。

Returns:

如果违规小于 tolerance,则为 True,否则为 False。

Return type:

布尔

Raises:

ValueError – 如果约束表达式没有与之关联的值。

violation()[source]

约束的数值残差。

违规被定义为约束表达式的值与其在约束域上的投影之间的距离:

\[||\Pi(v) - v||_2^2\]

其中 \(v\) 是约束表达式的值, \(\Pi\) 是约束域上的投影运算符。

Returns:

残值。

Return type:

NumPy.ndarray

Raises:

ValueError – 如果约束表达式没有与之关联的值。

class cvxpy.constraints.zero.Zero(expr, constr_id=None)[source]

基础类:Constraint

形式为 \(x = 0\) 的约束。

创建Zero约束的首选方法是通过运算符重载。要将表达式x约束为零,只需编写x == 0。前者会创建一个以x为参数的Zero约束。

is_dcp(dpp: bool = False) bool[source]

如果其参数是仿射的,则零约束是DCP。

value(tolerance: float = 1e-08)

检查约束违规是否小于容差。

Parameters:
tolerance : float

对违规施加的绝对容忍度。

Returns:

如果违规小于 tolerance,则为 True,否则为 False。

Return type:

布尔

Raises:

ValueError – 如果约束表达式没有与之关联的值。

violation()

约束的数值残差。

违规被定义为约束表达式的值与其在约束域上的投影之间的距离:

\[||\Pi(v) - v||_2^2\]

其中 \(v\) 是约束表达式的值, \(\Pi\) 是约束域上的投影运算符。

Returns:

残值。

Return type:

NumPy.ndarray

Raises:

ValueError – 如果约束表达式没有与之关联的值。

PSD

class cvxpy.constraints.psd.PSD(expr, constr_id=None)[源代码]

基础类:Cone

一个形式为 \(\frac{1}{2}(X + X^T) \succcurlyeq_{S_n^+} 0\) 的约束

对二维表达式 X 应用 PSD 约束,约束其对称部分为半正定:即,它约束 X 使得

\[z^T(X + X^T)z \geq 0,\]

对于所有的 \(z\)

创建PSD约束的首选方法是通过运算符重载。要将表达式X约束为PSD,请写X >> 0;要将其约束为负半定,请写X << 0。不提供严格的定值约束,因为它们在数值环境中没有意义。

Parameters:
expr : Expression.

要约束的表达式;必须是二维的。

constr_id : int

约束的唯一标识符。

is_dcp(dpp: bool = False) bool[source]

如果约束表达式是仿射的,则PSD约束是DCP。

value(tolerance: float = 1e-08)

检查约束违规是否小于容差。

Parameters:
tolerance : float

对违规施加的绝对容忍度。

Returns:

如果违规小于 tolerance,则为 True,否则为 False。

Return type:

布尔

Raises:

ValueError – 如果约束表达式没有与之关联的值。

violation()

约束的数值残差。

违规被定义为约束表达式的值与其在约束域上的投影之间的距离:

\[||\Pi(v) - v||_2^2\]

其中 \(v\) 是约束表达式的值, \(\Pi\) 是约束域上的投影运算符。

Returns:

残值。

Return type:

NumPy.ndarray

Raises:

ValueError – 如果约束表达式没有与之关联的值。

SOC

class cvxpy.constraints.second_order.SOC(t, X, axis: int = 0, constr_id=None)[source]

基础类:Cone

每行/每列的二阶锥约束。

假设 t 是一个与 X 的列(行)长度相同的向量,适用于 axis == 0 (1)。

t

二阶约束的标量部分。

X

一个矩阵,其行/列都是锥体。

axis

按列0或行1切片。

is_dcp(dpp: bool = False) bool[source]

如果每个参数都是仿射的,则SOC约束是DCP。

value(tolerance: float = 1e-08)

检查约束违规是否小于容差。

Parameters:
tolerance : float

对违规施加的绝对容忍度。

Returns:

如果违规小于 tolerance,则为 True,否则为 False。

Return type:

布尔

Raises:

ValueError – 如果约束表达式没有与之关联的值。

violation()

约束的数值残差。

违规被定义为约束表达式的值与其在约束域上的投影之间的距离:

\[||\Pi(v) - v||_2^2\]

其中 \(v\) 是约束表达式的值, \(\Pi\) 是约束域上的投影运算符。

Returns:

残值。

Return type:

NumPy.ndarray

Raises:

ValueError – 如果约束表达式没有与之关联的值。

ExpCone

class cvxpy.constraints.exponential.ExpCone(x: Expression, y: Expression, z: Expression, constr_id=None)[source]

基础类:Cone

重新表述的指数锥约束。

\(x, y, z\) 进行元素操作。

原始圆锥体:

\[K = \{(x,y,z) \mid y > 0, ye^{x/y} <= z\} \cup \{(x,y,z) \mid x \leq 0, y = 0, z \geq 0\}\]

重新表述的锥体:

\[K = \{(x,y,z) \mid y, z > 0, y\log(y) + x \leq y\log(z)\} \cup \{(x,y,z) \mid x \leq 0, y = 0, z \geq 0\}\]
Parameters:
x : Expression

x 在指数锥中。

y : Expression

y 在指数锥中。

z : Expression

z 在指数锥中。

is_dcp(dpp: bool = False) bool[source]

如果每个参数都是仿射的,则指数约束是DCP。

value(tolerance: float = 1e-08)

检查约束违规是否小于容差。

Parameters:
tolerance : float

对违规施加的绝对容忍度。

Returns:

如果违规小于 tolerance,则为 True,否则为 False。

Return type:

布尔

Raises:

ValueError – 如果约束表达式没有与之关联的值。

violation()

约束的数值残差。

违规被定义为约束表达式的值与其在约束域上的投影之间的距离:

\[||\Pi(v) - v||_2^2\]

其中 \(v\) 是约束表达式的值, \(\Pi\) 是约束域上的投影运算符。

Returns:

残值。

Return type:

NumPy.ndarray

Raises:

ValueError – 如果约束表达式没有与之关联的值。

RelEntrConeQuad

class cvxpy.constraints.exponential.RelEntrConeQuad(x: Expression, y: Expression, z: Expression, m: int, k: int, constr_id=None)[source]

基础类:Cone

标量相对熵锥的近似构造

定义:

\[K_{re}=\text{cl}\{(x,y,z)\in\mathbb{R}_{++}\times \mathbb{R}_{++}\times\mathbb{R}_{++}\:x\log(x/y)\leq z\}\]

由于上述定义与ExpCone非常相似,我们提供了一个转换方法。

关于近似的更多细节可以在论文第10页的定理3中找到: 半定矩阵对数的近似。

Parameters:
x : Expression

x 在(近似)标量相对熵锥中

y : Expression

y 在(近似)标量相对熵锥中

z : Expression

z 在(近似)标量相对熵锥中

m : Parameter directly related to the number of generated nodes for the quadrature

algorithm : approximation used in the

k : Another parameter controlling the approximation

is_dcp(dpp: bool = False) bool[source]

如果每个参数都是仿射的,则指数约束是DCP。

value(tolerance: float = 1e-08)

检查约束违规是否小于容差。

Parameters:
tolerance : float

对违规施加的绝对容忍度。

Returns:

如果违规小于 tolerance,则为 True,否则为 False。

Return type:

布尔

Raises:

ValueError – 如果约束表达式没有与之关联的值。

PowCone3D

class cvxpy.constraints.power.PowCone3D(x, y, z, alpha, constr_id=None)[source]

基础类:Cone

一个表示3D功率锥约束集合的对象

x[i]**alpha[i] * y[i]**(1-alpha[i]) >= |z[i]| 对于所有 i x >= 0, y >= 0

如果参数 alpha 是一个标量,它将被提升为一个与 x、y、z 的(共同)大小匹配的向量。alpha 的数值(或在向量情况下的其分量)必须是开区间 (0, 1) 中的一个数字。

我们将参数(x, y, z, 和 alpha)的扁平化表示存储为 Expression 对象。我们针对这些扁平化表示构造对偶变量。

is_dcp(dpp: bool = False) bool[来源]

检查约束是否为DCP。

Returns:

如果约束是DCP,则为True,否则为False。

Return type:

布尔

value(tolerance: float = 1e-08)

检查约束违规是否小于容差。

Parameters:
tolerance : float

对违规施加的绝对容忍度。

Returns:

如果违规小于 tolerance,则为 True,否则为 False。

Return type:

布尔

Raises:

ValueError – 如果约束表达式没有与之关联的值。

violation()

约束的数值残差。

违规被定义为约束表达式的值与其在约束域上的投影之间的距离:

\[||\Pi(v) - v||_2^2\]

其中 \(v\) 是约束表达式的值, \(\Pi\) 是约束域上的投影运算符。

Returns:

残值。

Return type:

NumPy.ndarray

Raises:

ValueError – 如果约束表达式没有与之关联的值。

PowConeND

class cvxpy.constraints.power.PowConeND(W, z, alpha, axis: int = 0, constr_id=None)[source]

基础类:Cone

表示一组N维幂锥约束,这些约束在数学上等同于以下代码片段(该片段在cvxpy对象上错误地使用了numpy函数):

np.prod(np.power(W, alpha), axis=axis) >= np.abs(z), W >= 0

所有参数必须是类似Expression的,并且z必须满足 z.ndim <= 1。当axis=0(axis=1)时,alpha的列(行)必须总和为1。

注意:与PowCone3D不同,我们不会尝试将alpha提升为适当的形状。W和alpha的维度必须完全匹配。

注意:目前尚未为此类约束实现对偶变量。

is_dcp(dpp: bool = False) bool[来源]

如果每个参数都是仿射的,则幂锥约束是DCP。

value(tolerance: float = 1e-08)

检查约束违规是否小于容差。

Parameters:
tolerance : float

对违规施加的绝对容忍度。

Returns:

如果违规小于 tolerance,则为 True,否则为 False。

Return type:

布尔

Raises:

ValueError – 如果约束表达式没有与之关联的值。

violation()

约束的数值残差。

违规被定义为约束表达式的值与其在约束域上的投影之间的距离:

\[||\Pi(v) - v||_2^2\]

其中 \(v\) 是约束表达式的值, \(\Pi\) 是约束域上的投影运算符。

Returns:

残值。

Return type:

NumPy.ndarray

Raises:

ValueError – 如果约束表达式没有与之关联的值。

FiniteSet

class cvxpy.constraints.finite_set.FiniteSet(expre, vec, ineq_form: bool = False, constr_id=None)[源代码]

基础类:Constraint

将表达式的每个条目限制在给定的实数集合中取值。

Parameters:
expre : Expression

给定的表达式需要被约束。这个表达式必须是仿射的。 如果expre有多个元素,那么约束将分别应用于每个元素。也就是说,在解决带有此约束的问题后,我们应该有:

for e in expre.flatten():
    print(e.value in vec) # => True

vec : Union[Expression, np.ndarray, set]

每个expre条目被约束到的有限值集合。

ineq_form : bool

控制此约束如何规范化为混合整数线性约束。

如果为True,则我们使用一个包含vec.size - 1个不等式约束、一个等式约束和vec.size - 1个二进制变量的公式,用于expre的每个元素。

如果为False,则我们使用一个包含vec.size个二进制变量和两个等式约束的公式,用于expre的每个元素。

默认为False。对于使用简单分支定界方法的混合整数求解器,ineq_form=True的情况可能会加快求解速度。

property ineq_form : bool

在两种约束方法之间选择,使用ineq_form=False时,与Parameter类型一起工作。

is_dcp(dpp: bool = False) bool[源代码]

如果约束表达式是仿射的,则FiniteSet约束是DCP。

property shape

约束表达式的形状。

Type:

整数

property size

约束表达式的大小。

Type:

整数

violation()

约束的数值残差。

违规被定义为约束表达式的值与其在约束域上的投影之间的距离:

\[||\Pi(v) - v||_2^2\]

其中 \(v\) 是约束表达式的值, \(\Pi\) 是约束域上的投影运算符。

Returns:

残值。

Return type:

NumPy.ndarray

Raises:

ValueError – 如果约束表达式没有与之关联的值。

OpRelEntrConeQuad

class cvxpy.constraints.exponential.OpRelEntrConeQuad(X: Expression, Y: Expression, Z: Expression, m: int, k: int, constr_id=None)[source]

基础类:Cone

算子相对熵锥的近似构造

定义:

\[K_{re}^n=\text{cl}\{(X,Y,T)\in\mathbb{H}^n_{++}\times \mathbb{H}^n_{++}\times\mathbb{H}^n_{++}\:D_{\text{op}}\succeq T\}\]

关于近似的更多细节可以在论文第10页的定理3中找到: 半定矩阵对数的近似。

Parameters:
X : Expression

x 在(近似)算子相对熵锥中

Y : Expression

y 在(近似)算子相对熵锥中

Z : Expression

Z 在(近似)算子相对熵锥中

m : int

必须为正数。控制用于矩阵对数局部近似中的正交节点数。增加此值会提高局部近似的质量,但不会显著扩大近似有效的输入区域。

k : int

必须为正数。设置执行正交近似的缩放点数量。增加此值将扩大近似有效的输入区域。

:param 这个近似使用了 \(m + k\) 个半定约束。:

is_dcp(dpp: bool = False) bool[source]

当 (A, b, C) 是仿射时,运算符相对圆锥约束是 DCP

value(tolerance: float = 1e-08)

检查约束违规是否小于容差。

Parameters:
tolerance : float

对违规施加的绝对容忍度。

Returns:

如果违规小于 tolerance,则为 True,否则为 False。

Return type:

布尔

Raises:

ValueError – 如果约束表达式没有与之关联的值。