gpt4 book ai didi

python - 在 CVXPY 中对变量矩阵的部分转置设置约束

转载 作者:太空宇宙 更新时间:2023-11-03 19:41:50 36 4
gpt4 key购买 nike

我正在使用 CVXPY 在 Python 中计算 SDP 问题,我想设置约束,不仅我的变量矩阵是正半定 (psd),而且它在某个轴上的部分转置也是 psd。我不知道如何设置这个要求。我的代码如下所示

#Set the variable matrix
P_0 = cp.Variable((d,d), symmetric=True)

现在我想定义类似的东西

def PT(d1, d2, rho):
"""Return rho^{T_1}, the partial trace of the density operator rho on C^{d_1} \ot C^{d_2} along the first system."""
assert rho.shape == (d1 * d2, d1 * d2)

# reshape into a 4-tensor (2 ket indices and 2 bra indices)
rho = rho.reshape(d1, d2, d1, d2)

# transpose the first subsystem
rho = rho.transpose((0,3,2,1))

# reshape back into a density operator
return rho.reshape(d1 * d2, d1 * d2)

然后设置要求PT(3,3, P_0) >> 0即是psd。但这在cvxpy中是不允许的。我还可以为我的具体情况定义一个新的矩阵,例如

P_0_tp = [[P_0[[0,0]], P_0[[1, 0]], P_0[[2, 0]], P_0[[0, 3]], P_0[[1, 3]], P_0[[2, 3]], 
P_0[[0, 6]], P_0[[1, 6]], P_0[[2, 6]]], [P_0[[0, 1]], P_0[[1, 1]], P_0[[2, 1]],
P_0[[0, 4]], P_0[[1, 4]], P_0[[2, 4]], P_0[[0, 7]], P_0[[1, 7]],
P_0[[2, 7]]], [P_0[[0, 2]], P_0[[1, 2]], P_0[[2, 2]], P_0[[0, 5]], P_0[[1, 5]],
P_0[[2, 5]], P_0[[0, 8]], P_0[[1, 8]], P_0[[2, 8]]], [P_0[[3, 0]], P_0[[4, 0]],
P_0[[5, 0]], P_0[[3, 3]], P_0[[4, 3]], P_0[[5, 3]], P_0[[3, 6]], P_0[[4, 6]],
P_0[[5, 6]]], [P_0[[3, 1]], P_0[[4, 1]], P_0[[5, 1]], P_0[[3, 4]], P_0[[4, 4]],
P_0[[5, 4]], P_0[[3, 7]], P_0[[4, 7]], P_0[[5, 7]]], [P_0[[3, 2]], P_0[[4, 2]],
P_0[[5, 2]], P_0[[3, 5]], P_0[[4, 5]], P_0[[5, 5]], P_0[[3, 8]], P_0[[4, 8]],
P_0[[5, 8]]], [P_0[[6, 0]], P_0[[7, 0]], P_0[[8, 0]], P_0[[6, 3]], P_0[[7, 3]],
P_0[[8, 3]], P_0[[6, 6]], P_0[[7, 6]], P_0[[8, 6]]], [P_0[[6, 1]], P_0[[7, 1]],
P_0[[8, 1]], P_0[[6, 4]], P_0[[7, 4]], P_0[[8, 4]], P_0[[6, 7]], P_0[[7, 7]],
P_0[[8, 7]]], [P_0[[6, 2]], P_0[[7, 2]], P_0[[8, 2]], P_0[[6, 5]], P_0[[7, 5]],
P_0[[8, 5]], P_0[[6, 8]], P_0[[7, 8]], P_0[[8, 8]]]]

这是一个 9x9 矩阵,现在在第二个第三维中部分转置。但是我如何将其设置为 cvxpy 中的变量?

提前致谢,

最佳答案

我今天遇到了和你一样的问题:我想创建一个新的矩阵,其中包含我之前定义的变量的组合。我在this answer中找到了我的问题的答案。第二种方法(数组 P_0_tp)的问题在于它不是使用 cvxpy 操作创建的。您可以使用 cvxpy.vstackcvxpy.hstack 或您可以找到的其他可用函数来构造它 here (似乎还有一个reshape功能......)。

在我提出的问题中here ,你可以看到我最终是如何实现它的。为了完整起见,我将其复制到此处:

import cvxpy as cp

X = cp.Variable((3,3), PSD=True)

row_1 = cp.hstack((0, 1, X[0,0]))
row_2 = cp.hstack((1, 0, X[1,2]))
row_3 = cp.hstack((X[0,0], X[1,2], 0))

W = cp.vstack((row_1, row_2, row_3))
constraint = [W >> 0]

正如你所看到的,我没有将 W 定义为变量,但现在它是一个 cvxpy 对象:

In [1] W
Out[1]: Expression(AFFINE, UNKNOWN, (3, 3))

关于python - 在 CVXPY 中对变量矩阵的部分转置设置约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60380342/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com