Failing to frame convex non-linear problem as SOCP

90 Views Asked by At

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.

1

There are 1 best solutions below

3
On

you can try to transform the SOCP problem to SDP problem and use the standard solver (such as CVX) to solve the SDP problem