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原子 convolveNonPos 锥使用与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 接口

通用系统改进

  • 支持本地二次形式(x.T @ P @ x

  • OpRelEntrConeQuad 约束类是我们改进量子信息建模支持的第一个重要组成部分(GSOC 项目

  • 连续性能基准测试(GSOC 项目

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:近似伽玛函数的对数的 atom

  • 1.1.14: 添加了 rel_entr:与 SciPy 的 “rel_entr” 具有相同语义的 atom

  • 1.1.8: 添加了 log_normcdf:近似高斯分布的累积分布函数的对数的 atom

  • 1.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.maxcp.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(与之前的标准行为相同)。

版本 1.1.6
  • ECOS_BB 求解器(在 1.1.0 中被删除)已经重新添加为一个选项。但是 ECOS_BB 不会被自动调用; 如果您想使用这个求解器,您必须显式调用 prob.solve(solver='ECOS_BB')。 有关更多信息,请参考我们的 混合整数模型文档

  • MOSEK 接口已被重写,并且现在会对所有连续问题进行对偶化。请参考我们的 求解器文档, 了解我们这样做的技术原因,以及如何管理 MOSEK 求解器选项,以应对这个改变可能带来的求解时间增加的情况。

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 字段给出。

  • VariableParameterreshape 构造函数的形状参数必须是一个元组。创建一个形状为 (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。

  • vstackhstack 原子现在接受列表作为输入。例如,应该写成 vstack([x, y]) 而不是 vstack(x, y)

变换

变换(Transforms)提供了在CVXPY对象中进行操作的额外方法,超过了原子函数。 例如, indicator 变换将一系列约束转换为一个表示凸函数的表达式, 该表达式在约束成立时取值为0,在其被违反时取值为 \(\infty\)。请参阅 转换 获取完整的新变换列表。