ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CVXPY API 参考指南:从原子函数、表达式树到问题求解与归约系统的完整导航

CVXPY API 参考指南:从原子函数、表达式树到问题求解与归约系统的完整导航 科学计算【免费下载链接】cvxpyA Python-embedded modeling language for convex optimization problems.项目地址https://gitcode.com/gh_mirrors/cv/cvxpy点击查看免费下载CVXPY 是一个内嵌于 Python 的凸优化建模语言。本指南以官方 API 参考cvxpy.rst为主线系统梳理 CVXPY 的公开 API 命名空间、五大文档板块Atoms、Constraints、Expressions、Problems、Transforms、Reductions并结合仓库源码说明原子函数的实现机制、表达式树的结构、Problem 类的求解流程以及不承诺向后兼容的归约Reduction系统。读完本文你将能够按图索骥地查阅 CVXPY 的每一层 API并理解cp.solve()背后从建模到求解的完整调用链。API 参考的设计初衷面向习惯阅读技术文档的用户CVXPY 官方 API 参考文档开宗明义地指出CVXPY 的设计目标是足够直观以至于大多数用户不查阅 API 参考就能完成建模——官方教程tutorial足以让用户上手。API 参考是为习惯阅读技术文档的人准备的补充材料这一点在 cvxpy.rst 中有明确说明。这一设计哲学也贯穿于仓库的其他文档中教程与示例位于 doc/source/tutorial 与 doc/source/examples面向入门读者API 参考位于 doc/source/api_reference面向进阶读者与贡献者归约Reductions系统甚至明确声明不属于公开 API仅供贡献者与好奇心强的用户阅读详见下文。公开 API 命名空间cvxpy.symbol约定API 参考中最重要的一条约定是所有被文档化的类和函数都被导入到cvxpy命名空间。也就是说只要在 Python 源码中import cvxpy就可以直接通过cvxpy.symbol使用任意符号其中symbol是类或函数的名称。例如cvxpy.Problem、cvxpy.Variable、cvxpy.exp、cvxpy.lambda_max都是直接可用的。这一约定的直接依据是 cvxpy.rst 的原文说明同时也可以在仓库顶层的 cvxpy/init.py 中找到对应的导入逻辑——所有公开符号都在包初始化时统一汇总。文档的六大板块划分API 参考将全部文档分为六个部分cvxpy.rst板块文档文件内容Atomscvxpy.atoms.rst实现原子数学函数的类如exp、log、sqrtConstraintscvxpy.constraints.rst可施加在变量上的约束Expressionscvxpy.expressions.rst实现数学表达式树的类包括Variable与ParameterProblemscvxpy.problems.rstProblem类及相关类Transformscvxpy.transforms.rst操纵 CVXPY 对象的附加操作Reductionscvxpy.reductions.rst将问题从一种形式转换为等价形式的原理性操作下文将逐一深入每个板块。Atoms构建表达式树的原子函数什么是 Atom在 CVXPY 的术语中atom小写 a是可作用于Expression对象并返回Expression对象的数学函数。原子函数及其复合正是构建 CVXPY 数学表达式树的机制cvxpy.atoms.rst。每个 atom 都携带关于其定义域domain、符号sign、曲率curvature、log-log 曲率以及单调性monotonicity的标签信息。正是这些信息让 atom 实例能够推理自身是否符合 DCPDisciplined Convex Programming或 DGPDisciplined Geometric Programming规则。仓库中的实现证据位于 cvxpy/atoms/atom.pyis_atom_convex、is_atom_concave、is_atom_affine、is_atom_log_log_convex、is_atom_log_log_concave、is_atom_log_log_affine、is_incr、is_decr、grad、domain等方法全部定义在Atom基类上atom.py这正是文档中autoclass:: cvxpy.atoms.atom.Atom所列出的成员。Atom 的两种实现形态从实现角度看一个 atom 有两种形态cvxpy.atoms.rst形态一类构造器。大多数 atom 是一个类的构造函数。例如 atomX ↦ λ_max(X)通过构造cvxpy.atoms.lambda_max.lambda_max类的实例来应用该类直接继承自Atom间接继承自Expression。形态二包装函数。有些 atom 是一个包装器初始化并返回其他某个类的 Atom 实例。文档给出了一个经典的交互式示例import cvxpy as cp X cp.Variable(shape(2,2), symmetricTrue) expr cp.lambda_min(X) print(type(expr))运行结果是class cvxpy.atoms.affine.unary_operators.NegExpression这个结果乍看意外实则由三个事实决定CVXPY 将lambda_min实现为恒等式$$\lambda_{\min}(X) -\lambda_{\max}(-X),$$取负运算符本身是基于类的 atom即 cvxpy/atoms/affine/unary_operators.py 中的NegExpression类一个 Expression 的精确类型由最后作用于它的基于类的 atom 决定。也就是说调用cp.lambda_min(X)时真正返回的对象是NegExpression实例。这一细节对理解 CVXPY 表达式类型很有价值表达式的运行时类型并不总是与调用的原子函数同名。Atoms 的三个子板块Atoms 文档分为三个子板块cvxpy.atoms.rstAffine Atomscvxpy.atoms.affine.rst所有在此列出的 atom 对其参数都是仿射的包括AddExpression、MulExpression、DivExpression、bmat、block、conj、convolve、cumsum、diag、diff、einsum、hstack、imag、index、kron、matmul、multiply、outer、partial_trace、partial_transpose、promote、psd_wrap、real、reshape、vdot、sum、trace、transpose、broadcast_to、swapaxes、moveaxis、permute_dims、NegExpression、upper_tri、vec、vec_to_upper_tri、vstack、stack等。它们的实现分布在 cvxpy/atoms/affine 目录下的各模块中例如AddExpression位于 add_expr.pyMulExpression与DivExpression位于 binary_operators.py。Elementwise Atomscvxpy.atoms.elementwise.rst所有在此列出的 atom 逐元素地作用于表达式。例如exp对其输入表达式的每个条目做指数运算。该板块包含abs、entr、exp、huber、inv_pos、kl_div、log、log_normcdf、log1p、loggamma、logistic、maximum、minimum、neg、pos、power、rel_entr、scalene、sqrt、square、xexp以及基于 cvxpy/logic.py 的逻辑原子Not~x、Andx y、Orx | y、Xorx ^ y、impliesx y、iffx y。实现位于 cvxpy/atoms/elementwise 目录。Other Atomscvxpy.atoms.other_atoms.rst既非仿射也非逐元素的 atom包括cummax、cumprod、cvar、diff_pos、dotsort、eye_minus_inv、geo_mean、gmatmul、harmonic_mean、inv_prod、lambda_max、lambda_min、lambda_sum_largest、lambda_sum_smallest、log_det、log_sum_exp、matrix_frac、max、min、mixed_norm、norm、norm1、norm2、norm_inf、normNuc、one_minus_pos、perspective、pf_eigenvalue、pnorm、Pnorm、ptp、prod、quad_form、quad_over_lin、resolvent、sigma_max、std、sum_largest、sum_smallest、sum_squares、SuppFuncAtom、tr_inv、tv、var、von_neumann_entr等。实现分布于 cvxpy/atoms 目录的顶层模块中。关于每个 atom 的定义域、符号、曲率等属性的紧凑可读汇总文档建议查阅 doc/source/functions 页面cvxpy.atoms.rst。ExpressionsCVXPY 的表达式树表示CVXPY 将数学对象表示为表达式树expression tree。表达式树是由一个或多个 atom 连接起来的一批数学表达式编码为Expression类的实例。树中的每个Leaf叶子都是一个Variable、Parameter或Constantcvxpy.expressions.rst。Expressions 板块cvxpy.expressions.rst文档化了以下类类源码位置关键成员Expressioncvxpy/expressions/expression.pyvalue、grad、domain、name、curvature、is_constant、is_affine、is_convex、is_concave、is_dcp、is_log_log_affine、is_log_log_convex、is_log_log_concave、is_dgp、is_dqcp、is_dpp、sign、shape、size、ndim、T以及全套运算符重载__pow__、__add__、__mul__、__matmul__、__div__、__rshift__、__lshift__、__eq__、__le__、__ge__等Leafcvxpy/expressions/leaf.pyshape、size、ndim、T、value、project、project_and_assignVariablecvxpy/expressions/variable.py在Leaf基础上增加nameParametercvxpy/expressions/constants/parameter.py在Leaf基础上增加roundConstantcvxpy/expressions/constants/constant.pyshape、size、ndim、T、valueCallbackParamcvxpy/expressions/constants/callback_param.py在Parameter基础上支持回调参数值得注意的是Expression基类通过运算符重载实现了、-、*、、/、、、、、等语法——这正是 CVXPY 能让建模代码看起来像数学的底层机制。例如x y实际上构造了一个加法表达式节点x y则构造了一个约束对象。Constraints约束变量的七种约束类型约束constraint是限制优化问题定义域的等式或不等式。CVXPY 共有七种约束类型cvxpy.constraints.rstNonPos非正不等式—— cvxpy/constraints/nonpos.pyZero等式—— cvxpy/constraints/zero.pyPSD半正定—— cvxpy/constraints/psd.pySOC二阶锥—— cvxpy/constraints/second_order.pyExpCone指数锥—— cvxpy/constraints/exponential.pyPowCone3D / PowConeND3 维与 N 维幂锥—— cvxpy/constraints/power.py文档明确指出绝大多数用户只需要创建前三种约束NonPos、Zero、PSD而且多数用户除了如何创建约束之外无需了解更多。不过约束 API 仍为高级用户提供了有用的方法例如检查对偶变量值dual_value与残差violation。约束板块文档化的类及其成员如下cvxpy.constraints.rst类成员Constraint基类value、violation、is_dcpNonPosvalue、violation、is_dcp、shape、size、dual_valueZerovalue、violation、is_dcpPSDvalue、violation、is_dcpSOCvalue、violation、is_dcpExpConevalue、violation、is_dcpRelEntrConeQuadvalue、is_dcpPowCone3Dvalue、violation、is_dcpPowConeNDvalue、violation、is_dcpFiniteSetis_dcp、size、shape、ineq_form、violationOpRelEntrConeQuadvalue、is_dcp约束的基类Constraint定义于 cvxpy/constraints/constraint.pyFiniteSet定义于 cvxpy/constraints/finite_set.py。RelEntrConeQuad与OpRelEntrConeQuad位于 exponential.py分别代表相对熵锥的二次型与算子形式。Problems建模与求解的入口Problem 类封装目标与约束Problem类是指定并求解优化问题的入口。每个Problem实例封装一个优化问题即一个目标函数和一组约束cvxpy.problems.rst。其核心源码位于 cvxpy/problems/problem.py。Problem.solve()方法要么求解该实例编码的问题返回最优值并将变量值设为最优点要么报告问题不可行infeasible或无界unbounded。文档给出了完整的建模—求解—检查范式problem Problem(Minimize(expression), constraints) problem.solve() if problem.status not in [infeasible, unbounded]: # Otherwise, problem.value is inf or -inf, respectively. print(Optimal value: %s % problem.value) for variable in problem.variables(): print(Variable %s: value %s % (variable.name(), variable.value))这段代码对应了Problem类上的核心 APIsolveproblem.py、status、value、variables()、name()。从源码看Problem.solve接受*args, **kwargs这些参数最终会传递给求解链与具体的求解器后端。问题的不可变性ImmutabilityProblem 是不可变的唯一的例外是通过设置Parameter的值来改变问题。这意味着创建之后不能修改问题的目标或约束cvxpy.problems.rst。如果需要在已有问题上追加约束文档给出的标准惯用法是创建一个新问题problem Problem(Minimize(expression), constraints) problem Problem(problem.objective, problem.constraints new_constraints)这个重建而非原地修改的设计与Problem类的不可变语义一致同时也解释了为什么 CVXPY 会提供Parameter机制——通过parameter.value ...在保持问题结构不变的前提下实现参数化重求解。大多数用户需要的三个方法文档明确指出大多数用户除了实例化、调用solve、查询status与value之外无需了解Problem类的更多细节cvxpy.problems.rst。不过Problem类还提供了丰富的进阶 API完整成员列表见 cvxpy.problems.rst问题性质is_dcp、is_dgp、is_dqcp、is_qp、is_dpp对象遍历variables、parameters、constants、atoms、var_dictproblem.py灵敏性分析backwardproblem.py与derivativeproblem.py用于计算参数扰动对解的影响求解链接口get_problem_dataproblem.py、unpack_resultsproblem.py、register_solveproblem.py统计信息size_metrics、solver_stats、compilation_timeMinimize / Maximize 目标与统计类目标函数由Minimize与Maximize两个类表示均文档化了is_dcp与is_dgp两个方法实现位于 cvxpy/problems/objective.py。此外问题规模信息与最近一次求解的统计信息分别由两个类捕获SizeMetrics记录问题实例的规模信息可通过Problem.size_metrics属性访问SolverStats记录最近一次求解调用的统计信息可通过Problem.solver_stats属性访问。两者都定义于 cvxpy/problems/problem.py。Transforms超越原子函数的附加操作Transforms 提供原子函数之外的额外方式来操纵 CVXPY 对象。关键区别在于原子函数只作用于表达式而transforms 可以接收 Problem、Objective 或 Constraint 对象作为输入且 transforms 不必遵循任何特定 APIcvxpy.transforms.rst。Transforms 板块cvxpy.transforms.rst包含三类SuppFunc支撑函数SuppFunctransform 以某个 CVXPY Variable 的隐式表示描述一个凸集返回代表该凸集支撑函数的函数句柄。当该句柄被求值时返回一个SuppFuncAtom对象该对象可像任何其他 CVXPY Expression 一样用于凸优化建模。实现位于 cvxpy/transforms/suppfunc.pySuppFuncAtom原子位于 cvxpy/atoms/suppfunc.py。Scalarize标量化将一组目标转换为单个目标例如加权和。所有标量化对每个目标都是单调的这意味着在标量化目标上优化总是返回相对于原始目标列表的 Pareto 最优点而且除边界点外Pareto 曲线上的所有点都可以通过某种目标加权实现。该板块文档化了四种标量化方法cvxpy/transforms/scalarize.pyweighted_sum加权和max极大化log_sum_explog-sum-exp 平滑targets_and_priorities目标与优先级其他 transformsindicatorcvxpy/transforms/indicator.py约束的指示函数linearizecvxpy/transforms/linearize.py表达式的线性化partial_optimizecvxpy/transforms/partial_optimize.py部分变量优化的算子Reductions将问题重写为求解器可接受的形式什么是 ReductionReduction 是从一个问题到另一个等价问题的变换。两个问题等价当且仅当其中一个问题的解可以以不超过适度的工作量转换为另一个问题的解。CVXPY 使用 reductions 将问题重写为求解器接受的形式cvxpy.reductions.rst。例如Dcp2Cone将符合 DCP 规则的问题转换为锥规划conic形式Qp2SymbolicQp将具有二次/分段仿射目标、仿射等式约束与分段线性不等式约束的问题转换为更接近求解器输入的形式cvxpy.reductions.back_end.rst。转换后的输出还需经过一系列未在此文档化的 reduction 才能交给求解器。重要声明Reduction 不属于公开 APIReductions 文档附有明确的免责声明cvxpy.reductions.rst大多数用户不需要知道 CVXPY 归约系统的任何内容甚至不需要知道 reductions 的存在。为保证提升速度与能力的同时保留向后兼容的灵活性归约系统不被视为 CVXPY 公开 API 的一部分其各方面内容可能在未来的版本中不经通知地改变。这份文档面向的是CVXPY 贡献者、好奇心强的用户以及愿意构建在一个未来版本可能不可用的 API 之上的人。因此普通用户应通过Problem.solve()使用归约系统而不是直接调用 reduction 类。中间端Middle-End与后端Back-End归约借用软件编译器的术语CVXPY 将归约分为两类cvxpy.reductions.rst中间端归约middle-end reduction在不考虑目标求解器的情况下简化源问题。此类归约与求解器类型无关无论目标是二次规划求解器还是锥求解器都可应用。包括cvxpy.reductions.middle_end.rstComplex2Realcvxpy/reductions/complex2real/complex2real.py将复值问题转换为实值问题CvxAttr2Constrcvxpy/reductions/cvx_attr2constr.py将变量属性如 PSD、对称转换为约束Dgp2Dcpcvxpy/reductions/dgp2dcp/dgp2dcp.py将 DGPlog-log 凸问题转换为 DCP 问题EvalParamscvxpy/reductions/eval_params.py求值参数FlipObjectivecvxpy/reductions/flip_objective.py翻转目标最大化↔最小化后端归约back-end reduction将源问题转换为某类求解器可接受的形式。每个求解器连同其调用模式被称为一个back-end或target。当前支持两类后端锥求解器与二次规划求解器。当通过Problem.solve()求解问题时CVXPY 会尝试为问题找到最佳后端。包括cvxpy.reductions.back_end.rstDcp2Conecvxpy/reductions/dcp2cone/dcp2cone.pyQp2SymbolicQpcvxpy/reductions/qp2quad_form/qp2symbolic_qp.pyDualize与Slackscvxpy/reductions/cone2cone/affine2direct.py对锥问题施加对偶化与松弛变换归约系统的核心类归约系统通过以下核心类交换数据并运作cvxpy.reductions.rstSolutioncvxpy/reductions/solution.py求解器返回的解的载体携带最优值、变量值、对偶值及状态信息。Reductioncvxpy/reductions/reduction.py抽象基类核心方法为__init__、accepts判断是否接受某问题、reduce执行归约、retrieve、apply与invert将解映射回原问题空间。Chaincvxpy/reductions/chain.py按顺序组合多个 reduction 的容器。SolvingChaincvxpy/reductions/solvers/solving_chain.py一条完整的问题 → 归约 → 求解器 → 解链路Problem.solve()内部正是通过它完成从用户模型到求解器调用的全过程。后端求解器接口的实现位于 cvxpy/reductions/solvers 目录按锥求解器conic_solvers、二次规划求解器qp_solvers、非线性求解器nlp_solvers分类组织。总结如何高效使用这份 API 参考把六个板块串起来就得到了 CVXPY 的完整工作流建模用Variable、Parameter、Constant构造叶子用 atomsexp、log、norm、quad_form等组合成表达式树约束用、、等运算符重载创建NonPos、Zero、PSD等约束封装用Minimize/Maximize与约束列表构造Problem求解调用problem.solve()由 CVXPY 自动选择后端归约链Dcp2Cone → 锥求解器或 Qp2SymbolicQp → QP 求解器后处理通过problem.status、problem.value、problem.solver_stats检查结果用backward()/derivative()做灵敏性分析或用problem.get_problem_data()拿到送给求解器的原始数据。对于进阶用户建议结合 functions_table 快速查阅每个 atom 的曲率、符号与单调性属性对于想深入源码的读者本指南中给出的每个类都标注了对应的实现文件可以直接跳转阅读。最后提醒Reductions 板块是唯一被官方声明不属于公开 API的部分普通建模代码应始终通过Problem.solve()间接使用归约能力只有当你作为贡献者或确实需要构建在归约系统之上、且不介意未来版本变更时才应直接调用这些类。赞分享科学计算【免费下载链接】cvxpyA Python-embedded modeling language for convex optimization problems.项目地址https://gitcode.com/gh_mirrors/cv/cvxpy点击查看免费下载相关推荐CVXPY 表达式体系详解表达式树、叶节点与核心 API 参考指南CVXPY 表达式体系详解表达式树、叶节点与核心 API 参考指南 导读 CVXPY 是一个内嵌于 Python 的凸优化建模语言它的所有建模能力都建立在科学计算Hunk 测试体系全解跨模块、跨进程与终端边界的分层测试布局与命令指南Hunk 测试体系全解跨模块、跨进程与终端边界的分层测试布局与命令指南 本篇技术指南围绕 HunkReview first 终端 diff 查看器仓库的顶科学计算CPython 表达式语言参考精读从原子、推导式到运算符优先级的完整语法与求值语义CPython 表达式语言参考精读从原子、推导式到运算符优先级的完整语法与求值语义 本篇是 CPython 语言参考Language Reference中编程语言语言运行时解释器标准库上一篇Ark-Pets桌面宠物让明日方舟干员成为你的智能桌面伙伴下一篇Kubernetes 项目敏感沟通指南从信息分级到事件响应的一线实战规范创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表