I just ran into some problems for writing conic constraints in GAMS. I was trying to test the second-order cone programming (SOCP) duality by the following problem from the Stanford course:
min 2 * x1 + x2 + x3
s.t. x1 + x2 + x3 = 1
sqr(x1) =g= sqr(x2) + sqr(x3)
And the dual of this SOCP is
max y
s.t. y + s1 = 2
y + s2 = 1
y + s3 = 1
sqr(s1) =g= sqr(s2) + sqr(s3)
Seems simple right? Here is the code I wrote for the two programs, and I used Mosek as the solver.
Code: Select all
free variable
x1, x2, x3;
free variable
y, obj, obj2;
equations
eq1
eq2
eq3
eq10;
eq1.. obj =e= 2 * x1 + x2 + x3;
eq2.. x1 + x2 + x3 =e= 1;
eq3.. sqr(x1) =g= sqr(x2) + sqr(x3);
option qcp = mosek;
model test /eq1, eq2, eq3/;
solve test using qcp minimizing obj;
free variable
s1, s2, s3;
equations
eq4
eq5
eq6
eq7
eq8;
eq4.. obj2 =e= y;
eq5.. y + s1 =e= 2;
eq6.. y + s2 =e= 1;
eq7.. y + s3 =e= 1;
eq8.. sqr(s1) =g= sqr(s2) + sqr(s3);
model test2 /eq4, eq5, eq6, eq7, eq8/;
solve test2 using qcp maximizing obj2;
Code: Select all
Return code - 1293 [MSK_RES_ERR_CON_Q_NOT_PSD]: The quadratic constraint matrix is not PSD
However, when I changed the notation of eq3 and eq8 to:
Code: Select all
eq3.. x1 =c= x2 + x3;
Code: Select all
eq8.. s1 =c= s2 + s3;
Then I moved to Gurobi and Cplex, then found that the =c= operator is only valid in Mosek. But I still heard that Gurobi and Cplex CAN solve SOCP problems. So my question is, how can I code correctly by using =g= instead of =c= for a SOCP problem?
Thanks in advance!
![Very Happy :D](./images/smilies/icon_e_biggrin.gif)
Gabriel