Hello everyone,
I want to know how to write a constraint that diag(x*x’), which means x in {-1;1}^n. Thank you so much!
Here is my code:
A=[1 0 2; 0 -1 0; 2 0 3];
b=[1; 0; 1];
n=3;
cvx_begin sdp
variable x(n);
variable X(n,n) symmetric;
maximize (trace(X’*A)+b’x )
subject to
diag(X)==1;
diag(xx’)==1;
[1 x’; x X] == semidefinite(n+1);
cvx_end
Warning: A non-empty cvx problem already exists in this scope.
It is being overwritten.
In cvxprob (line 28)
In cvx_begin (line 41)
Error using * (line 126)
Disciplined convex programming error:
Only scalar quadratic forms can be specified in CVX
As written, it is a non-convex constraint. But it is MIDCP representable by using binary variables.
xb(n) binary
x = 2*xb - 1; % don't declare x as variable
CVX will accept, but not solve, the problem. No solver under CVX is capable of solving it (Mosek handles Mixed-Integer for all cone type combinations except semidefinite).
Your options under MATLAB are to
- Use brute force enumeration (separate CVX problems) for each of the
2^n
possibilities, which is reasonable for n = 3, but not for very large n
or
- Use YALMIP
a) bnb as solver combined with Mosek or other semidefinite solver as uppersolver
or
b) cutsdp as solver
or
- Use SCIP MISDP capability, if you can figure out how to use its MATLAB interface
2 Likes