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]

优化问题的解决方案。

status

状态码。

Type:

字符串

opt_val

最优值。

Type:

浮点数

primal_vars

从变量ID到最优值的映射。

Type:

id到NumPy ndarray的字典

dual_vars

从约束ID到对偶值的映射。

Type:

id到NumPy ndarray的字典

attr

从求解器传播上来的杂项信息。

Type:

字典

归约

class cvxpy.reductions.reduction.Reduction(problem=None)[源代码]

用于归约的抽象基类。

归约是一种将一个问题转化为等价问题的行为。所谓等价,我们指的是两个问题的解之间存在映射关系:如果我们将问题\(A\)归约为另一个问题\(B\),然后找到\(B\)的解,我们可以将其转换为\(A\)的解,且只需付出适度的努力。

一个用非空问题实例化的归约提供了两个关键方法:reduceretrievereduce() 方法将归约实例化时的问题转换为一个等价问题。retrieve() 方法以等价问题的解决方案作为参数,并返回归约所拥有问题的解决方案。

每个归约都提供了三种低级方法:accepts、apply 和 invert。 特定归约的 accepts 方法指定了它适用于的问题类型; apply 方法接受一个问题并将其归约为等效形式, 而 invert 方法将归约后问题的解决方案映射回其原始问题。

Parameters:
problem : Problem

此归约所拥有的问题;可能为None。

__init__(problem=None)[源代码]

构建一个用于减少问题的缩减。

如果 problem 不是 None,那么后续调用 reduce() 将会减少 problem 并返回一个等效的问题。

accepts(problem)[source]

判断是否接受问题的减少。

Parameters:
problem : Problem

要检查的问题。

Returns:

如果可以应用减少,则为True,否则为False。

Return type:

布尔

abstract apply(problem)[source]

将归约应用于问题并返回等价问题。

Parameters:
problem : Problem

将应用归约的问题。

Returns:

  • 问题或字典 – 一个等价的问题,编码为问题或字典。

  • 逆数据、列表或字典 – 为了反转此特定应用,减少所需的数据。

abstract invert(solution, inverse_data)[源代码]

返回给定inverse_data的原始问题的解决方案。

Parameters:
solution : Solution

生成逆数据的问题的解决方案。

inverse_data

编码原始问题的数据。

Returns:

原始问题的解决方案。

Return type:

Solution

reduce()[source]

将拥有的问题简化为一个等价的问题。

Returns:

一个等价的问题,编码为Problem或dict。

Return type:

Problem 或 dict

Raises:

ValueError – 如果此Reduction是在没有Problem的情况下构建的。

retrieve(solution)[source]

检索拥有的问题的解决方案。

Parameters:
solution : Solution

解决由reduce()引发的问题的解决方案。

Returns:

解决拥有问题的一个方案。

Return type:

Solution

Raises:

ValueError – 如果 self.problem 为 None,或者如果之前没有调用 reduce()

class cvxpy.reductions.chain.Chain(problem=None, reductions=None)[source]

基础类: Reduction

将多个归约逻辑分组为单个归约。

reductions

减少的列表。

Type:

列表[Reduction]

accepts(problem) bool[来源]

如果减少的序列是有效的,则问题被接受。

特别是,第i次归约必须接受第i-1次归约的输出,序列中的第一次归约(self.reductions[0])将提供的problem作为输入。

Parameters:
problem : Problem

要检查的问题。

Returns:

如果链可以应用,则为True,否则为False。

Return type:

布尔

apply(problem, verbose: bool = False)[source]

将链应用于问题并返回等效问题。

Parameters:
problem : Problem

链将应用于的问题。

verbose : bool, optional

是否打印详细输出。

Returns:

  • Problem 或 dict – 通过依次应用 self.reductions[0] 开始的缩减所产生的问题。

  • list – 每个缩减所产生的逆数据。

invert(solution, inverse_data)[source]

返回给定inverse_data的原始问题的解决方案。

解决链

class cvxpy.reductions.solvers.solving_chain.SolvingChain(problem=None, reductions=None)[source]

基础:Chain

以求解器结束的简化链。

Parameters:
reductions : list[Reduction]

一系列缩减操作。列表中的最后一个缩减操作必须是一个求解器实例。

reductions

减少的列表。

Type:

列表[Reduction]

solver

求解器,即 reductions[-1]。

Type:

求解器

prepend(chain) SolvingChain[source]

通过将链与此实例连接来创建并返回一个新的SolvingChain。

solve(problem, warm_start: bool, verbose: bool, solver_opts)[源代码]

通过应用链来解决问题。

将链中的每个归约应用于问题,解决它,然后反转链以返回所提供问题的解决方案。

Parameters:
problem : Problem

要解决的问题。

warm_start : bool

是否要预热启动求解器。

verbose : bool

是否启用求解器的详细输出。

solver_opts : dict

求解器特定选项。

Returns:

解决方案 – 问题的解决方案。

Return type:

Solution

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, ...)
Parameters:
problem : Problem

要解决的问题。

data : map

求解器的数据。

warm_start : bool

是否要预热启动求解器。

verbose : bool

是否启用求解器的详细输出。

solver_opts : dict

求解器特定选项。

Returns:

求解器返回的信息;这不一定是解决方案对象。

Return type:

原始求解器解决方案