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

95 lines
2.1 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
function output = callsdpa(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;
% Bounded variables converted to constraints
if ~isempty(ub)
[F_struc,K] = addStructureBounds(F_struc,K,ub,lb);
end
% Convert from internal (sedumi) format
[mDIM,nBLOCK,bLOCKsTRUCT,c,F] = sedumi2sdpa(F_struc,c,K);
if options.verbose==0
options.sdpa.print = 'no';
else
options.sdpa.print = 'display';
end
if options.savedebug
ops = options.sdpa;
save sdpadebug mDIM nBLOCK bLOCKsTRUCT c F ops
end
if options.showprogress;showprogress(['Calling ' interfacedata.solver.tag],options.showprogress);end
solvertime = tic;
[objVal,x,X,Y,INFO]=sdpam(mDIM,nBLOCK,bLOCKsTRUCT,c,F,[],[],[],options.sdpa);
solvertime = toc(solvertime);
% Create variables in YALMIP internal format
Primal = x;
Dual = [];
for i = 1:length(Y)
Dual = [Dual;Y{i}(:)];
end
Slack = [];
if options.saveduals
for i = 1:length(X)
Slack = [Slack;X{i}(:)];
end
end
switch (INFO.phasevalue)
case 'pdOPT'
problem = 0;
case {'noINFO','pFEAS','dFEAS'}
problem = 3;
case {'pdFEAS'}
problem = 4;
case 'pFEAS_dINF'
problem = 2;
case 'pINF_dFEAS'
problem = 1;
case 'pUNBD'
problem = 2;
case 'dUNBD'
problem = 1;
case 'pdINF'
problem = 12;
otherwise
problem = -1;
end
infostr = yalmiperror(problem,interfacedata.solver.tag);
if options.savesolveroutput
solveroutput.objVal = objVal;
solveroutput.x = x;
solveroutput.X = X;
solveroutput.Y = Y;
solveroutput.INFO = INFO;
else
solveroutput = [];
end
if options.savesolverinput
solverinput.mDIM = mDIM;
solverinput.nBLOCK=nBLOCK;
solverinput.bLOCKsTRUCT=bLOCKsTRUCT;
solverinput.c=c;
solverinput.F=F;
else
solverinput = [];
end
% Standard interface
output = createOutputStructure(Primal,Dual,[],problem,infostr,solverinput,solveroutput,solvertime);