Here’s my question. My model acts like

\min y^TQ_0y + q_0^T y + c_0

s.t. y^TQ_1y + q_1^T y + c_1 <=0

-(I_n I_n)<= x0

lb<= y <= ub

the QCQP problem using Gurobi can be solved since basically the feasible region is compact.

While, we use Y=yy^T and using lifting tech and we get a SDP problem like

\min Q_0\cdots Y + q_0^T y + c_0

s.t. Q_1\cdots Y + q_1^Ty + c_1<=0

-(I_n I_n)<= x0

lb<= y <= ub

Y\succeq yy^T

And test the QCQP and SDP with the same dataset, Gurobi_qcqp show ‘optimal’ and CVX_sdp remains ubounded. The following is my cvx code:

%========================================================================

cvx_begin sdp

cvx_precision low

variable Y(2*m,2*m)

variable y(2*m)*

minimize (trace(Qc_0 * Y) + q_0’ * y + c_0)

subject to

trace(Qc_1 * Y) + q_1’ * y + c_1 <=0;

-[eye(m) eye(m)] * y <= x0;

-[x0;x0]<=y<=zeros(2m,1);

[1 y’;y Y] == semidefinite(2*m+1);

cvx_end

%============================================================================

I wonder how can this be, lifting is common tech we use. The primal is feasible while the sdp problem is ‘Unbounded’

Your SDP formulation is unbounded, and is not equivalent to the QCQP. Instead, your SDP formulation is a very poor relaxation of the QCQP.

In your SDP formulation, there is nothing preventing `Y`

from getting arbitrarily large, despite the bound constraints on `y`

. Hence your SDP is unbounded.

The example on the last page of https://www.faculty.ece.vt.edu/kekatos/psoc/lecture3.pdf shows how to convert an SOCP to an SDP. You should be able to adapt that to your QCQP.

That said, are you doing this just for e4ducational purposes? It is better to solve SOCPs as SOCPs than as SDPs. It might be better numerically to solve QCQPs as SOCPs than as QCQPs - see On formulating quadratic functions in optimization models by @Erling

If you formulate an SDP in CVX, it will try to cobnvert it to an SOCP if it can, before providing the problem to the solver; CVX usually can do this for 2 by 2 matrices and block diagonal matrices which have any combination of 2 by 2 and 1 by 1 blocks on the diagonal.

And I recommend you never use the `cvx_precision`

command, no matter what solver you are using. It was a well intentioned capability which the collective wisdom of this forum has determined is not a good idea. Just leave it at its default value, i.e., do not use the command.