Reductions¶
一个Reduction是从一个问题到另一个等价问题的转换。如果一个问题的一个解可以以不超过中等努力的方式转换为另一个问题的解,那么这两个问题是等价的。CVXPY使用重写将问题转换为求解器可以接受的形式。
免责声明¶
大多数用户不需要了解CVXPY的简化系统。 事实上,大多数用户甚至不需要知道简化的存在!
为了确保我们在保持向后兼容性的同时,能够灵活地提高CVXPY的速度和功能,我们已经决定将简化系统不视为CVXPY公共API的一部分。因此,该系统的某些方面可能会在未来的版本中无预警地更改。
我们为CVXPY的贡献者、好奇者以及那些愿意基于一个可能在未来版本中不可用的API进行构建的人提供此文档。 如果您有一个需要直接访问Reduction系统的有趣应用,并且您关心与未来版本CVXPY的前向兼容性,请联系我们。
归约类型¶
Reductions 允许 CVXPY 支持不同的问题类别,例如凸优化和对数-对数凸优化。它们还帮助 CVXPY 针对不同类型的求解器,例如二次规划求解器和锥规划求解器。
借鉴软件编译器的术语,我们将简化分类为中端简化或后端简化。不考虑目标求解器而简化源问题的简化称为中端简化,而将源问题转换为可被一类求解器接受的形式的简化称为后端简化。每个求解器(及其调用模式)被称为后端或目标。
以下是CVXPY的简化过程分解:
核心类¶
Reductions 通过以下类交换数据和操作。 可以使用其他数据结构,例如以字符串为键的字典,但 这些是定义 Reduction 系统的主要类。
解决方案¶
- class cvxpy.reductions.solution.Solution(status, opt_val, primal_vars, dual_vars, attr)[source]¶
优化问题的解决方案。
归约¶
-
class cvxpy.reductions.reduction.Reduction(problem=
None)[源代码]¶ 用于归约的抽象基类。
归约是一种将一个问题转化为等价问题的行为。所谓等价,我们指的是两个问题的解之间存在映射关系:如果我们将问题\(A\)归约为另一个问题\(B\),然后找到\(B\)的解,我们可以将其转换为\(A\)的解,且只需付出适度的努力。
一个用非空问题实例化的归约提供了两个关键方法:reduce 和 retrieve。reduce() 方法将归约实例化时的问题转换为一个等价问题。retrieve() 方法以等价问题的解决方案作为参数,并返回归约所拥有问题的解决方案。
每个归约都提供了三种低级方法:accepts、apply 和 invert。 特定归约的 accepts 方法指定了它适用于的问题类型; apply 方法接受一个问题并将其归约为等效形式, 而 invert 方法将归约后问题的解决方案映射回其原始问题。
-
__init__(problem=
None)[源代码]¶ 构建一个用于减少问题的缩减。
如果 problem 不是 None,那么后续调用 reduce() 将会减少 problem 并返回一个等效的问题。
- abstract invert(solution, inverse_data)[源代码]¶
返回给定inverse_data的原始问题的解决方案。
-
__init__(problem=
链¶
-
class cvxpy.reductions.chain.Chain(problem=
None, reductions=None)[source]¶ 基础类:
Reduction将多个归约逻辑分组为单个归约。
- accepts(problem) bool[来源]¶
如果减少的序列是有效的,则问题被接受。
特别是,第i次归约必须接受第i-1次归约的输出,序列中的第一次归约(self.reductions[0])将提供的problem作为输入。
- invert(solution, inverse_data)[source]¶
返回给定inverse_data的原始问题的解决方案。
解决链¶
-
class cvxpy.reductions.solvers.solving_chain.SolvingChain(problem=
None, reductions=None)[source]¶ 基础:
Chain以求解器结束的简化链。
- prepend(chain) SolvingChain[source]¶
通过将链与此实例连接来创建并返回一个新的SolvingChain。
- solve(problem, warm_start: bool, verbose: bool, solver_opts)[源代码]¶
通过应用链来解决问题。
将链中的每个归约应用于问题,解决它,然后反转链以返回所提供问题的解决方案。
-
solve_via_data(problem, data, warm_start: bool =
False, verbose: bool =False, solver_opts={})[source]¶ 使用应用调用输出的数据来解决问题。
语义如下:
data, inverse_data = solving_chain.apply(problem) solution = solving_chain.invert(solver_chain.solve_via_data(data, ...))这相当于写作
solution = solving_chain.solve(problem, ...)