CVXPY 变更内容
本页面按照时间顺序记录了 CVXPY 的变更内容,最新的变更排在前面。当前,CVXPY 的项目维护人员提供对 CVXPY 1.4 和 1.3 的支持。
CVXPY 1.4
本版本与我们的语义化版本保持一致。它增加了许多新功能,修复了一些错误,并提升了性能。CVXPY 1.4支持Python 3.8到3.12,并且是我们首个支持Python 3.12的版本。在开发下一个版本的同时,我们继续官方支持CVXPY 1.3 和 1.4。
新功能
新原子: convolve
新原子: mean
新原子: outer
新原子: ptp
新原子: std
新原子: var
新原子: vec_to_upper_tri
向CVXPY表达式添加了类似于NumPy ndarrays的
.sum()
,.max()
, 和.mean()
等方法新求解器接口:
PIQP
为Clarabel接口添加了SDP支持
添加了对OR-Tools 9.7的支持
移除了对OR-Tools 9.4的支持
PowerConeND
现在支持提取其对偶变量reshape
现在支持将-1
作为维度,与NumPy中的含义相同使用浮点数索引CVXPY表达式现在会引发适当的错误
更清晰的错误消息,适用于一些常见错误
perspective 原子现在支持
s=0
SCIPY后端的性能改进
规范化参数化QP的性能改进
使用稀疏矩阵进行二次形式的性能改进
更好地支持静态类型
ECOS不推荐使用
CVXPY多年来一直使用ECOS作为默认求解器;然而,在极端情况下,ECOS已知存在性能和数值稳定性问题。最近,已经开始开发了一种名为Clarabel的新求解器,该求解器改进了ECOS的算法和实现。
在1.5版本中,CVXPY计划默认情况下开始使用Clarabel来替代ECOS解决某些问题类别。 在1.6版本中,我们计划不再将ECOS作为CVXPY的依赖进行安装。 我们没有移除调用ECOS作为求解器的支持的计划。 作为过渡的一部分,CVXPY 1.4将在默认情况下调用ECOS时引发警告。 我们鼓励您尝试并使用Clarabel,但如果您依赖于ECOS的确切行为,请明确指定它作为求解器。
conv
不推荐使用
CVXPY的原子 conv
与NumPy的卷积函数不一致。我们正在将其标记为不推荐使用,但在短期内没有移除它的计划。
我们鼓励所有用户改为使用CVXPY原子 convolve
。 NonPos
锥使用与CVXPY的其他锥相反的双变量符号约定,
NonPos(expr)
约束与 NonNeg(-expr)
约束相同。
我们正在弃用 NonPos
,但短期内没有删除它的计划。
我们鼓励用户转而使用 NonNeg
。
CVXPY 1.3
CVXPY 1.3 带来了许多新功能、错误修复和性能改进。它引入了一个新的基于 SciPy 的后端,并将 CVXPY 的公共 API 正式定义为从 cvxpy
命名空间直接导入的所有内容。
我们计划引入一个 cvxpy.experimental
命名空间,用于开发中的功能,在其中 API 尚未固定。明确声明,无论 atoms 是由函数还是类实现,例如我们不认为将当前作为类的 cvxpy.power
替换为函数是一个破坏性变更,或将作为函数的 cp.quad_form
替换为类是一个破坏性变更。
形如 cvxpy.power(a, b)
的代码保证会继续正常工作。
约束和 atoms
Solver 接口
新接口: COPT, SDPA, Clarabel 和 proxqp
通用系统改进
CVXPY 1.2
我们正迈向 语义化版本管理! 我们的新版本策略是在引入新功能时递增次要版本号(即 “CVXPY 1.x.y” 中的 “x”)。 补丁号(即 “CVXPY 1.x.y” 中的 “y”)仅在修复 bug 时递增。 我们将同时支持 CVXPY 的多个次要发布版本。 破坏性的 API 更改将需要递增主要版本号(即移到 CVXPY 2.x.y)。
这个版本策略与我们过去的做法非常不同。 许多新功能是在 CVXPY 1.1.0 之后但在 CVXPY 1.2.0 之前添加的。 这些功能积累在 CVXPY 1.1.1 和 1.1.18 之间的版本上。 我们将在下面回顾这些功能以及 CVXPY 1.2.0 中的新功能。
约束和 atoms
1.2.0: 添加了进行 局部迹 和偏转置的 atoms,它们是量子信息中重要的线性算子
1.2.0: 更新了
kron
,使在kron(A, B)
中的任意一个参数都可以是非常数的仿射表达式,只要另一个参数是常量。我们之前要求A
是常量。1.2.0: 添加了
xexp
:一个实现 \(\texttt{xexp}(x) = x e^{x}\) 的 atom。1.1.14: 添加了
loggamma
:近似伽玛函数的对数的 atom1.1.14: 添加了
rel_entr
:与 SciPy 的 “rel_entr” 具有相同语义的 atom1.1.8: 添加了
log_normcdf
:近似高斯分布的累积分布函数的对数的 atom1.1.8: 添加了 power cone 约束
求解器接口
1.2.0:通过OR-Tools 支持 PDLP 和 GLOP
1.1.17:支持 SCS 3.0
1.1.14:支持 HiGHS (和其他随 SciPy 一起提供的线性规划求解器)
1.1.12:ECOS、ECOS_BB 和 SCS 报告求解器统计数据
1.1.12:支持使用 GUROBI 进行热启动
1.1.8:增加了一个机制,允许用户在不修改 CVXPY 源代码的情况下创建求解器接口
1.1.6:重写了 MOSEK 接口;现在它将所有连续问题进行对偶化
1.1.4:支持 FICO XPRESS
1.1.2:支持 SCIP
1.1.2:用户可以自己提供一个用于与 CVXOPT 一起使用的 KKT 求解器实现
一般系统改进
1.1.18:新增了一个问题状态 “不可行或无界”,只在特定情况下由某些求解器使用
1.1.11:增加了详细日志记录
1.1.11:对 CVXPY 的 C++ 后端重写系统 “cvxcore” 进行了若干改进。 特别是,CVXPY 现在可以通过启用 openmp 选项从源代码进行编译,以便利用多线程来进行规范化。
1.1.6:新增了一个 “Dualize” 降低
CVXPY 1.1
亮点
形式化参数化编程 (或称为规范化参数化编程)是一个用于构建参数化问题的规则集,可以缩短 CVXPY 重复规范化参数化问题所需的时间。 DPP 还为不同iatingiating至优化问题的解的映射提供了基础。
CVXPY 提供了一个 API,允许某些求解器对优化问题的参数映射到其最优解进行不iatingiating。目前这种区分性能力仅在使用 SCS 作为求解器时可使用。 这一特性允许进行比仅使用对偶变量更一般的敏感性分析。它还为 cvxpylayers 提供了基础。 请参阅 导数教程 和随附的 论文 papers
自版本0.4起,CVXPY 使用 *
来执行矩阵乘法。从版本1.1开始,官方不再支持此行为。现在应该使用 Python 标准的 @
运算符进行矩阵乘法。
如果在操作数不是标量的情况下使用了 *
,CVXPY 将会发出警告。
新的原子和变换
CVXPY 长期以来一直提供了简化指定优化问题的抽象(”原子”和”变换”)。CVXPY 1.1 的发布伴随着以下新的抽象:
一个用于规范凸规划中的 “支撑函数” 变换。
一个 “标量乘积” 原子,适用于所有问题类别。
一个 “gmatmul” 原子,捕获到DGP中与矩阵乘法相等的部分。
原子
cp.max
和cp.min
已扩展用于DQCP。现在在DGP中允许使用Python内置的
sum
函数。
重大更改
我们不再支持Python 2或Python 3.4。
CVXPY 1.1.0删除了SuperSCS和ECOS_BB求解器。
Note
我们在版本1.1.6中重新添加了ECOS_BB。从CVXPY 1.2.0开始,任何不向后兼容的更改,比如删除求解器接口,都需要递增CVXPY的主版本号(例如,从系列1.X到2.X)。
错误修复
CVXPY 1.1显著改进了对恢复对偶变量的支持。高级用户应该能够将对偶变量恢复到任何锥约束,包括指数锥和二阶锥约束。
此版本解决了在检测问题是否属于“规范拟凸编程”(DQCP)范畴时的错误。
已知问题
具有许多CVXPY参数的DPP问题可能需要很长时间来编译。
谨慎的凸规划 (Disciplined quasiconvex programming, DQCP)不支持 DPP。
XPRESS 接口目前不可用(在 CVXPY 1.1.4 中已修复)。
自 CVXPY 1.1.0 以来的值得注意的修补补丁
- 版本 1.1.10
当 NumPy 1.20 发布时,许多用户在安装或导入 CVXPY 时遇到错误。用户会看到类似于
RuntimeError: module compiled against API version 0xe but this version of numpy is 0xd
的错误。 我们修改了构建文件以解决此问题,并且在 CVXPY 1.1.10 中应该已经修复。欲了解更多信息, 您可以参考这个 GitHub 问题 。
- 版本 1.1.8
我们增加了对三维和 N 维幂锥约束的支持。尽管目前我们还没有任何可以利用此约束的原子, 但如果想在模型中使用此类型的约束,您需要手动实例化
PowCone3D
和/或PowConeND
对象。 目前还未为PowConeND
对象实现对偶变量。目前只有 SCS 和 MOSEK 支持幂锥约束。我们修复了在版本 1.1.6 中引入的 MOSEK 接口中的一个错误。之前无法正确处理 “unknown” 状态码, 导致抛出 ValueErrors 而不是 SolverErrors。现在,在 MOSEK 返回 “unknown” 状态码时, 用户可以期望收到一个 SolverError(与之前的标准行为相同)。
CVXPY 1.0
CVXPY 1.0 包括对 CVXPY 内部的重大重写,以及用户界面的一些更改。 在深入了解细节之前,让我们先对这些变化做一个概述。 我们只讨论可能会对用户感兴趣的变化。
我们已经创建了一个脚本,用于将使用CVXPY 0.4.11的代码转换为CVXPY 1.0,可以在 这里 找到。
概述
标准几何规划(DGP):从版本1.0.11开始,CVXPY允许您制定和求解对数-对数凸规划(log-log convex programs),这些规划是传统的几何规划和广义几何规划的推广。要开始使用DGP,请参阅 教程 并查阅 相应的论文 。
Reductions:CVXPY 1.0使用模块化的“reductions”系统将用户输入的问题转化为求解器所需的格式,这使得支持新的标准形式(如二次规划)和更高级的用户输入(如具有复杂变量的问题)变得很容易。有关详细信息,请参阅 简化 和 相应的论文 。
属性:变量和参数现在支持多种描述其符号属性的属性,例如非负性或对称性。这统一了变量和参数的符号属性处理,并替代了专用的变量类,如“Bool”和“Semidef”。
NumPy兼容性:CVXPY的接口已经更改以尽可能地类似于NumPy,包括对0D和1D数组的支持。
转换:新的转换类提供了除了原子函数之外的其他方式来操作CVXPY对象。原子函数仅对表达式进行操作,而转换还可以接受Problem、Objective或Constraint对象作为输入。
Reductions
Reductions是一种从一个问题到一个等价问题的转换。 如果一个问题的解可以在不费多少力气的情况下转换为另一个问题的解,则这两个问题是等价的。CVXPY 使用约简来将问题重写为求解器接受的形式。 基于约简的框架的实际好处是,CVXPY 1.0 支持二次规划作为目标求解器的标准形式,除了锥规划外,还有更多标准形式。 这还使得很容易添加通用问题转换,例如将具有复杂变量的问题转换为仅具有实变量的问题。
属性
属性描述了变量和参数的符号属性,并作为构造函数的参数指定。例如, Variable(nonneg=True)
创建一个被约束为非负数的标量变量。
属性取代了先前的特殊变量类的语法,如布尔变量的 Bool
和对称正半定变量的 Semidef
,
以及参数的符号规范(例如, Parameter(sign='positive')
)。
具体地说,用以下方式书写:
Variable(shape, boolean=True)
代替Bool(shape)
。Variable(shape, integer=True)
代替Int(shape)
。Variable((n, n), PSD=True)
代替Semidef(n)
。Variable((n, n), symmetric=True)
代替Symmetric(n)
。Variable(shape, nonneg=True)
代替NonNegative(shape)
。Parameter(shape, nonneg=True)
代替Parameter(shape, sign='positive')
。Parameter(shape, nonpos=True)
代替Parameter(shape, sign='negative')
。
有关支持的所有属性的完整列表,请参见 属性。未来将添加更多属性。
NumPy 兼容性
为了使 CVXPY 更加兼容 NumPy 语法,进行了以下接口更改:* CVXPY表达式的 value
字段现在返回NumPy ndarrays而不是NumPy matrices。
CVXPY表达式的维度由
shape
字段给出,size
字段给出总条目数。在CVXPY 0.4.11及之前的版本中,size
字段给出了维度,而shape
字段不存在。CVXPY表达式的维度不再总是2D。可以存在0D和1D表达式。我们将来会为任意维度的表达式添加支持。维度的数量由
ndim
字段给出。Variable
、Parameter
和reshape
构造函数的形状参数必须是一个元组。创建一个形状为(2, 3)
的参数,不再写成Parameter(2, 3)
,而是写成Parameter((2, 3))
。索引和其他操作可以将2D表达式映射到1D或0D表达式。例如,如果
X
的形状为(3, 2)
,那么X[:,0]
的形状为(3,)
。CVXPY的行为在所有情况下都遵循NumPy的语义,唯一的例外是当一个参数为0D时,广播才起作用。几个CVXPY原子名称已更名:
mul_elemwise
更名为multiply
max_entries
更名为max
sum_entries
更名为sum
max_elemwise
更名为maximum
min_elemwise
更名为minimum
由于名称的更改,我们现在强烈建议不再使用
from cvxpy import *
这种语法导入CVXPY。vstack
和hstack
原子现在接受列表作为输入。例如,应该写成vstack([x, y])
而不是vstack(x, y)
。
变换
变换(Transforms)提供了在CVXPY对象中进行操作的额外方法,超过了原子函数。
例如, indicator
变换将一系列约束转换为一个表示凸函数的表达式,
该表达式在约束成立时取值为0,在其被违反时取值为 \(\infty\)。请参阅 转换 获取完整的新变换列表。