Description
Test of correctness of solving a simple conic program (PSD and SOC cones) by using the semidefinite programming example sdo1 from the Mosek manual. http://docs.mosek.com/7.0/capi/Semidefinite_optimization.html The problem is min 2*(barX(0,0) + barX(1,0) + barX(1,1) + barX(2,1) + barX(2,2)) + x0 s.t. barX(0,0) + barX(1,1) + barX(2,2) + x0 = 1 barX(0,0) + barX(1,1) + barX(2,2) + 2*(barX(1,0) + barX(2,0) + barX(2,1)) + x1 + x2 = 0.5 x0 >= sqrt(x1^2 + x2^2) barX symmetric and positive semidefinite
Small Model of Type : QCP
Category : GAMS Test library
Main file : sdp01.gms
$title Test of correct solving a simple conic program (PSD and SOC cones). (SDP01,SEQ=630)
$onText
Test of correctness of solving a simple conic program (PSD and SOC cones)
by using the semidefinite programming example sdo1 from the Mosek manual.
http://docs.mosek.com/7.0/capi/Semidefinite_optimization.html
The problem is
min 2*(barX(0,0) + barX(1,0) + barX(1,1) + barX(2,1) + barX(2,2)) + x0
s.t. barX(0,0) + barX(1,1) + barX(2,2) + x0 = 1
barX(0,0) + barX(1,1) + barX(2,2) + 2*(barX(1,0) + barX(2,0) + barX(2,1)) + x1 + x2 = 0.5
x0 >= sqrt(x1^2 + x2^2)
barX symmetric and positive semidefinite
$offText
$if not set TESTTOL $set TESTTOL 1e-6
Set i / 0 * 2 /;
alias(i, ip);
Variables barX(i,i) PSDMATRIX
x(i) scalar variables
z objective variable
;
x.lo('0') = 0;
Parameters barAobj(i,i) coefficients of barX in objective
barAe1(i,i) coefficients of barX in e1
barAe2(i,i) coefficients of barX in e2
;
Table barAobj(i,i)
0 1 2
0 2.0 1.0 0.0
1 1.0 2.0 1.0
2 0.0 1.0 2.0
;
* identity matrix
barAe1(i,i) = 1.0;
* all-one matrix
barAe2(i,ip) = 1.0;
Equations obj, e1, e2, e3;
obj.. z =e= sum((i,ip), barAobj(i,ip) * barX(i,ip)) + x('0');
e1.. 1 =e= sum((i,ip), barAe1(i,ip) * barX(i,ip)) + x('0');
e2.. 0.5 =e= sum((i,ip), barAe2(i,ip) * barX(i,ip)) + x('1') + x('2');
e3.. - sqr(x('0')) + sqr(x('1')) + sqr(x('2')) =l= 0;
Model m / all /;
option qcp = mosek;
m.dictfile = 1;
m.optfile = 1;
$echo SDPSOLUFILE sdpsol.gdx > mosek.opt
Solve m minimizing z using QCP;
display barX.l;
parameter zobj optimal value / 7.0571048621e-01 /;
abort$(m.modelstat <> %modelStat.optimal%) 'Not solved to optimality';
abort$(abs(z.l - zobj) > %TESTTOL%) 'Optimal value wrong';
Parameters A(i,i) 'an i x i matrix as parameter'
ev(i) 'eigenvalues of a i x i matrix'
;
* check whether barX.l from GAMS solution is psd
* (should work in this example as all PSD matrix entries appear in constraints)
A(i,ip) = barX.l(i,ip);
executeTool.checkErrorLevel 'linalg.eigenvalue i A ev'
* Symbol ev has been loaded implicitly by executeTool.checkErrorLevel. The compiler instruction
* in the next line supresses errors about presumably unassigned symbols
$onImplicitAssign
display ev;
abort$(smin(i, ev(i)) < -%TESTTOL%) 'barX.l not PSD'
* check whether barX.l and barX.m from GDX solution file are psd
execute_loadpoint 'sdpsol.gdx';
display barX.l;
A(i,ip) = barX.l(i,ip);
executeTool.checkErrorLevel 'linalg.eigenvalue i A ev'
display ev;
abort$(smin(i, ev(i)) < -%TESTTOL%) 'barX.l from GDX solution file not PSD'
display barX.m;
A(i,ip) = barX.m(i,ip);
executeTool.checkErrorLevel 'linalg.eigenvalue i A ev'
display ev;
abort$(smin(i, ev(i)) < -%TESTTOL%) 'barX.m from GDX solution file not PSD'