I'm trying to reproduce an equation from equation 5 in the paper here:
https://web.stanford.edu/~boyd/papers/pdf/rob_downlink_bf.pdf
The equation is an SOCP of the form:
$\sqrt{1+\frac{1}{\gamma}}*\Re(\bar{h_i^*}\omega_i) \ge \sqrt{\sum_{j=1}^{m}|\bar{h_i^*}\omega_j|+\sigma^2}$ (1)
$\Im(\bar{h_i^*}\omega_i) == 0$ (2)
Where $\sigma$ is a constant and $\omega$ is a complex matrix to optimize over. The RHS of equation (1) is just the 2-norm of that vector.
Gurobi only takes SOCP problems of the form:
$x^Tx \le y^2$
As mentioned here: http://www.gurobi.com/documentation/6.0/refman/cs_grbmodel_addqconstr.html
So I need to convert the form above into that. I squared each side such that $x^Tx$ is now simply the magnitude of each element, or $(\Re(\bar{h_i^*}\omega_j)^2 + \Im(\bar{h_i^*}\omega_j)^2$, where $\bar{h_i^*}\omega_j$ is a symbolic expression. Similarly, for the RHS to be in the form of $y^2$ I set
$y = (1+1/\gamma)\Re(\bar{h_i^*}\omega_i)^2$
$\gamma$ is a constant, and again $\bar{h_i^*}\omega_i$ is a symbolic matrix. Since Gurobi doesn't support complex numbers, my matrix looks like this for the 2x2 case:
$\omega = \left\lgroup \matrix{\omega{x}_{00} + \omega{y}_{00}i & \omega{x}_{01} + \omega{y}_{01}i\cr \omega{x}_{10} + \omega{y}_{10}i & \omega{x}_{11} + \omega{y}_{11}i} \right\rgroup$
Where x are the real variables and y are complex. My h matrix looks like this:
$h = \left\lgroup \matrix{-0.1288 - 0.3574i & -0.0605 + 0.5454i\cr -1.0419 + 0.3075i & -0.7424 - 1.4344i} \right\rgroup$
When multiplying out the symbolic matrices and feeding it into Gurobi, it reports that the Q matrix is not positive semi-definite. This is odd first of all because Gurobi thinks it's a QP problem and not SOCP. When I look at the equations I'm passing in from the LP file, Q is indeed not positive semidefinite.
qp0: - 0.3574 w_x_0_0 - 0.1288 w_y_0_0 + 0.5454 w_x_1_0 - 0.0605 w_y_1_0 = 0
qp1: [ - 0.0234610110401747 w_x_0_0 ^ 2 + 0.130201325244696 w_x_0_0 * w_y_0_0 - 0.0220402355268722 w_x_0_0 * w_x_1_0 - 0.19868999101415 w_x_0_0 * w_y_1_0 - 0.180644229978472 w_y_0_0 ^ 2 + 0.0611582311902494 w_y_0_0 * w_x_1_0 + 0.551333872581191 w_y_0_0 * w_y_1_0 + 0.1443242 w_x_0_1 ^ 2 - 0.37426712 w_x_0_1 * w_x_1_1 + 0.18374044 w_x_0_1 * w_y_1_1 + 0.1443242 w_y_0_1 ^ 2 - 0.18374044 w_y_0_1 * w_x_1_1 - 0.37426712 w_y_0_1 * w_y_1_1 - 0.00517637519167612 w_x_1_0 ^2 - 0.0933287613071126 w_x_1_0 * w_y_1_0 - 0.420673606751233 w_y_1_0 ^ 2 + 0.30112141 w_x_1_1 ^ 2 + 0.30112141 w_y_1_1 ^ 2 ] <= -1
qp2: 0.3075 w_x_0_1 - 1.0419 w_y_0_1 - 1.4344 w_x_1_1 - 0.7424 w_y_1_1 = 0
qp3: [ 1.18011186 w_x_0_0 ^ 2 + 0.66485712 w_x_0_0 * w_x_1_0 - 3.44557872 w_x_0_0 * w_y_1_0 + 1.18011186 w_y_0_0 ^ 2 + 3.44557872 w_y_0_0 * w_x_1_0 + 0.66485712 w_y_0_0 * w_y_1_0 - 1.5352074663722 w_x_0_1 ^ 2 - 0.906183503041465 w_x_0_1 * w_y_0_1 - 2.18780693547312 w_x_0_1 * w_x_1_1 + 4.22708818459407 w_x_0_1 * w_y_1_1 - 0.133722731157141 w_y_0_1 ^ 2 - 0.645695971454058 w_y_0_1 * w_x_1_1 + 1.2475569793288 w_y_0_1 * w_y_1_1 + 2.60866112 w_x_1_0 ^ 2 + 2.60866112 w_y_1_0 ^ 2 - 0.7794547791991751 w_x_1_1 ^ 2 + 3.01198797220716 w_x_1_1 * w_y_1_1 - 2.90974915634021 w_y_1_1 ^ 2 ] <= -1
Does anyone have an idea of where I can debug this going wrong? When I feed the same problem into CVX (but using things like norm()) it finds a valid solution, but the transformation of the problem is very slow. I would like to go directly to the solver and skip the transformation step if possible.
you can try to transform the SOCP problem to SDP problem and use the standard solver (such as CVX) to solve the SDP problem