Dynamic-Calibration/utils/YALMIP-master/solvers/calloptidsdp.m

89 lines
2.0 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
function output = calloptidsdp(interfacedata)
% Retrieve needed data
options = interfacedata.options;
F_struc = interfacedata.F_struc;
c = interfacedata.c;
K = interfacedata.K;
x0 = interfacedata.x0;
ub = interfacedata.ub;
lb = interfacedata.lb;
model = yalmip2optidsdp(interfacedata);
if options.showprogress;showprogress(['Calling ' interfacedata.solver.tag],options.showprogress);end
if options.savedebug
save dsdpdebug model
end
solvertime = tic;
[y,fvals,exitflag,stats,X] = dsdp(model.f,model.A,model.b,model.lb,model.ub,model.sdcone,model.y0,model.ops);
solvertime = toc(solvertime);
% Create dual variable in internal format
if options.saveduals
if K.l > 0
top = 1;
D_struc = X{1};
else
top = 0;
D_struc = [];
end
if K.s(1) > 0
for j = 1:length(K.s)
n = K.s(j);
Z = triu(ones(n));
i = find(Z);
Z(i) = X{j+top};
Z = Z + Z' - diag(diag(Z));
D_struc = [D_struc;Z(:)];
end
end
else
D_struc = [];
end
x = y; % Our notation do not coincide ...
switch exitflag
case 1
switch stats.pdflag
case 1
problem = 0;
case 3
problem = 2;
case 4
problem = 1;
otherwise
problem = 4;
end
case -6
problem = 6;
case {-2,-8,-9}
problem = 4;
case 7
problem = 16;
case {-3,-27}
problem = 3;
otherwise
problem = -1;
end
infostr = yalmiperror(problem,interfacedata.solver.tag);
if options.savesolveroutput
solveroutput.y = y;
solveroutput.fvals = fvals;
solveroutput.exitflag = exitflag;
solveroutput.stats = stats;
solveroutput.X = X;
else
solveroutput = [];
end
if options.savesolverinput
solverinput.model = model;
else
solverinput = [];
end
% Standard interface
output = createOutputStructure(x,D_struc,[],problem,infostr,solverinput,solveroutput,solvertime);