95 lines
2.1 KiB
Matlab
Executable File
95 lines
2.1 KiB
Matlab
Executable File
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); |