通过圆锥程序区分

diffcp的Python项目详细描述


差异

diffcp是一个python包,用于计算凸锥程序相对于其问题数据的导数。导数被实现为一个抽象的线性映射,它的前向应用和伴随方法。

该实现是基于本文中的计算Differentiating through a cone program

安装

diffcp在pip上可用。

pipinstalldiffcp

要求如下:

如果您需要python 2支持,请提交github问题。

圆锥程序

diffcp通过原始双锥程序对进行区分。原始问题必须表示为

minimize        c'x
subject to      Ax + s = b
                s in K

其中xs是变量,Abc是用户提供的问题数据,K是用户定义的凸锥。相应的对偶问题是

minimize        b'y
subject to      A'y + c == 0
                y in K^*

具有双变量y

使用量

diffcp公开函数

solve_and_derivative(A,b,c,cone_dict,warm_start=None,**kwargs).

此函数返回一个原-对偶解xys,以及 求导函数及其伴随函数(转置)。这些 函数分别计算导数的左乘和右乘 在Ab,和c通过向量的解映射。

参数

参数Abc对应于cone程序的问题数据。

  • A必须是SciPy sparse CSC matrix
  • bc必须是numpy数组。
  • cone_dict是定义凸锥的字典。
  • warm_start是一个可选元组(x, y, s),在该元组上可以暖启动scs。
  • **kwargs是转发给scs的关键字参数(例如,verbose=True)。

这些输入必须符合问题数据的SCS conventioncone_dict中的键对应于圆锥体,用

  • diffcp.ZERO对于零锥,
  • diffcp.POS对于正正数,
  • diffcp.SOC对于soc锥的乘积,
  • diffcp.PSD对于psd锥的乘积,和
  • diffcp.EXP指数锥的乘积。

cone_dict中的值表示每个圆锥体的大小;diffcp.SOCdiffcp.PSDdiffcp.EXP的值应该是列表。A行的顺序必须与上面给出的圆锥的顺序匹配。有关详细信息,请参阅SCS documentation

返回值

函数solve_and_derivative返回一个元组

(x,y,s,derivative,adjoint_derivative)
  • xys是原-对偶解。

  • derivative是将(A, b, c)处的导数应用于扰动dAdbdc的函数。它有签名 derivative(dA, db, dc) -> dx, dy, ds,其中dA是与A具有相同稀疏模式的scipy稀疏csc矩阵,dbdc是numpy数组。{{CD55>},^ {CD56}},^ {< CD57>}为麻木阵列,近似于扰动引起的原始对偶解的变化。

  • adjoint_derivative是一个函数,它将导数的伴随应用于扰动dxdyds。它有签名 adjoint_derivative(dx, dy, ds) -> dA, db, dc,其中dxdyds是numpy数组。

示例

importnumpyasnpfromscipyimportsparseimportdiffcpcone_dict={diffcp.ZERO:3,diffcp.POS:3,diffcp.SOC:[5]}m=3+3+5n=5A,b,c=diffcp.utils.random_cone_prog(m,n,cone_dict)x,y,s,D,DT=diffcp.solve_and_derivative(A,b,c,cone_dict)# evaluate the derivativenonzeros=A.nonzero()data=1e-4*np.random.randn(A.size)dA=sparse.csc_matrix((data,nonzeros),shape=A.shape)db=1e-4*np.random.randn(m)dc=1e-4*np.random.randn(n)dx,dy,ds=D(dA,db,dc)# evaluate the adjoint of the derivativedx=cdy=np.zeros(m)ds=np.zeros(m)dA,db,dc=DT(dx,dy,ds)

有关更多示例,包括本文中描述的sdp示例,请参见^{}目录。

引用

如果您想引用diffcp,请使用以下bibtex:

@article{diffcp2019,
    author       = {Agrawal, A. and Barratt, S. and Boyd, S. and Busseti, E. and Moursi, W.},
    title        = {Differentiation Through a Cone Program},
    journal      = {arXiv preprint arXiv:1904.09043},
    year         = {2019},
}

@misc{diffcp,
    author       = {Agrawal, A. and Barratt, S. and Boyd, S. and Busseti, E. and Moursi, W.},
    title        = {{diffcp}: differentiation of a cone program, version 1.0},
    howpublished = {\url{https://github.com/cvxgrp/diffcp}},
    year         = 2019
}

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java泛型和基类   ProcessBuilder或DefaultExecutor启动的“RunAs”子进程的java读取标准输出   java应用程序在尝试登录时突然停止   Java:神秘的Java未捕获异常处理程序[带代码]   java JavaFX NumberAxis自动范围无限循环   最新版本和旧版本冲突的java双Maven依赖关系   java如何导入带有部署变量类名的静态函数?   编译器构造不同的JDK更新会产生不同的Java字节码吗?   java无法在struts 1.1中上载任何超过250 MB大小的文件   java调整jcombobox下拉菜单的宽度   java如何在某些情况下忽略@SQLDelete注释   在Eclipse for Java EE developers edition中禁用HTML警告   java HttpUrlConnection重置请求属性   java@Provider资源未在rest应用程序中注册   java TOP N使用JPA连接   java在使用反射调用方法时区分int和Integer参数