通过圆锥程序区分
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
其中x
和s
是变量,A
,b
和c
是用户提供的问题数据,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).
此函数返回一个原-对偶解x
、y
和s
,以及
求导函数及其伴随函数(转置)。这些
函数分别计算导数的左乘和右乘
在A
,b
,和c
通过向量的解映射。
参数
参数A
、b
和c
对应于cone程序的问题数据。
A
必须是SciPy sparse CSC matrix。b
和c
必须是numpy数组。cone_dict
是定义凸锥的字典。warm_start
是一个可选元组(x, y, s)
,在该元组上可以暖启动scs。**kwargs
是转发给scs的关键字参数(例如,verbose=True
)。
这些输入必须符合问题数据的SCS convention。cone_dict
中的键对应于圆锥体,用
diffcp.ZERO
对于零锥,diffcp.POS
对于正正数,diffcp.SOC
对于soc锥的乘积,diffcp.PSD
对于psd锥的乘积,和diffcp.EXP
指数锥的乘积。
cone_dict
中的值表示每个圆锥体的大小;diffcp.SOC
、diffcp.PSD
和diffcp.EXP
的值应该是列表。A
行的顺序必须与上面给出的圆锥的顺序匹配。有关详细信息,请参阅SCS documentation。
返回值
函数solve_and_derivative
返回一个元组
(x,y,s,derivative,adjoint_derivative)
x
、y
和s
是原-对偶解。derivative
是将(A, b, c)
处的导数应用于扰动dA
、db
、dc
的函数。它有签名derivative(dA, db, dc) -> dx, dy, ds
,其中dA
是与A
具有相同稀疏模式的scipy稀疏csc矩阵,db
和dc
是numpy数组。{{CD55>},^ {CD56}},^ {< CD57>}为麻木阵列,近似于扰动引起的原始对偶解的变化。adjoint_derivative
是一个函数,它将导数的伴随应用于扰动dx
,dy
,ds
。它有签名adjoint_derivative(dx, dy, ds) -> dA, db, dc
,其中dx
、dy
和ds
是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
}