0

Let's say that I want to solve the following problem.

minimize Tr(CY)
s.t. Y = xxT
x is 0 or 1.

where xxT indicates an outer product of n-1 dimension vector x. C is a n-1 by n-1 square matrix. To convert this problem to a problem with a single matrix variable, I can write down the code as follows by using cvxpy.

import cvxpy as cp
import numpy as np

n = 8
np.random.seed(1)

S = np.zeros(shape=(int(n), int(n)))
S[int(n-1), int(n-1)] = 1

C = np.zeros(shape=(n,n))
C[:n-1, :n-1] = np.random.randn(n-1, n-1)

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

constraints=[]
constraints.append(cp.trace(S @ X) == 1)
for i in range(n-1):
    Q = np.zeros(shape=(n,n))
    Q[i,i] = 1
    Q[-1,i] = -0.5
    Q[i,-1] = -0.5
    const = cp.trace(Q @ X) == 0
    constraints.append(const)

prob = cp.Problem(cp.Minimize(cp.trace(C @ X)),constraints)
prob.solve(solver=cp.MOSEK)

print("X is")
print(X.value)
print("C is")
print(C)

To satisfy the binary constraint that the entries of the vector x should be one or zero, I added some constraints for the matrix variable X.

X = [Y x; xT 1]
Tr(QX) == 0

There are n-1 Q matrices which are forcing the vector x's entries to be 0 or 1.

However, when I ran this simple code, the constraints are violated severely.

Looking forward to see any suggestion or comments on this.

StandTall
  • 13
  • 1
  • 4
  • If no one answers, repost on [OR SE](https://or.stackexchange.com/questions/tagged/cvxpy), where you can use MathJax. – Rodrigo de Azevedo Sep 08 '22 at 14:23
  • I think you severely misunderstand the concept of semidefinite relaxation of a rank 1 constraint. Nothing guarantees that the diagonal entries are actually squares of the border entries. It is just a relaxation of that condition. The condition X[i,i]=X[i,-1] is satisfied but that's all. – Michal Adamaszek Sep 09 '22 at 07:57

0 Answers0