175 lines
4.4 KiB
Matlab
Executable File
175 lines
4.4 KiB
Matlab
Executable File
function output = callsparsecolo(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
|
|
|
|
A = -F_struc(:,2:end)';
|
|
C = F_struc(:,1);
|
|
b = -c;
|
|
|
|
if options.savedebug
|
|
ops = options.sparsecolo;
|
|
save sparsecolodebug K A C b
|
|
end
|
|
|
|
ops = options.sparsecolo;
|
|
ops.SDPsolver = lower(interfacedata.solver.sdpsolver.tag);
|
|
ops.SDPAoptions = options.sdpa;
|
|
ops.sedumipar = options.sedumi;
|
|
ops.sdpt3OPTIONS = options.sdpt3;
|
|
ops.sdpt3OPTIONS.printlevel = options.verbose;
|
|
ops.printlevel = options.verbose;
|
|
if options.verbose==0
|
|
ops.SDPAoptions.print = 'no';
|
|
else
|
|
ops.SDPAoptions.print = 'display';
|
|
end
|
|
|
|
if options.savedebug
|
|
save sparsecolodebug K A C b ops
|
|
end
|
|
|
|
if options.showprogress;showprogress(['Calling ' interfacedata.solver.tag],options.showprogress);end
|
|
solvertime = tic;
|
|
if options.verbose==0 % Sparsecolo does not run silent
|
|
evalc('[x,y,infoCoLO,cliqueDomain,cliqueRange,LOP] = sparseCoLO(A,b,C,K,[],ops);');
|
|
else
|
|
[x,y,infoCoLO,cliqueDomain,cliqueRange,LOP] = sparseCoLO(A,b,C,K,[],ops);
|
|
end
|
|
solvertime = toc(solvertime);
|
|
|
|
% Create YALMIP dual variable and slack
|
|
Dual = x;
|
|
Primal = y;
|
|
|
|
|
|
switch lower(interfacedata.solver.sdpsolver.tag)
|
|
case 'sdpt3'
|
|
switch infoCoLO.SDPsolver.termcode
|
|
case 0
|
|
problem = 0; % No problems detected
|
|
case {-1,-5}
|
|
problem = 5; % Lack of progress
|
|
case {-2,-3,-4,-7}
|
|
problem = 4; % Numerical problems
|
|
case -6
|
|
problem = 3; % Maximum iterations exceeded
|
|
case -10
|
|
problem = 7; % YALMIP sent incorrect input to solver
|
|
case 1
|
|
problem = 2; % Dual feasibility
|
|
case 2
|
|
problem = 1; % Primal infeasibility
|
|
otherwise
|
|
problem = -1; % Unknown error
|
|
end
|
|
case 'sedumi'
|
|
problem = sedumicode(infoCoLO.SDPsolver,options);
|
|
|
|
case 'sdpa'
|
|
switch (infoCoLO.SDPsolver.phasevalue)
|
|
case 'pdOPT'
|
|
problem = 0;
|
|
case {'noINFO','pFEAS','dFEAS','pdFEAS'}
|
|
problem = 3;
|
|
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
|
|
|
|
end
|
|
infostr = yalmiperror(problem,interfacedata.solver.tag);
|
|
|
|
if options.savesolveroutput
|
|
solveroutput.obj = obj;
|
|
solveroutput.X = X;
|
|
solveroutput.y = y;
|
|
solveroutput.Z = Z;
|
|
solveroutput.info = info;
|
|
solveroutput.runhist = runhist;
|
|
else
|
|
solveroutput = [];
|
|
end
|
|
|
|
if options.savesolverinput
|
|
solverinput.blk = blk;
|
|
solverinput.A = A;
|
|
solverinput.C = C;
|
|
solverinput.b = b;
|
|
solverinput.X0 = [];
|
|
solverinput.y0 = x0;
|
|
solverinput.Z0 = [];
|
|
solverinput.options = options.sdpt3;
|
|
else
|
|
solverinput = [];
|
|
end
|
|
|
|
% Standard interface
|
|
output = createOutputStructure(Primal,Dual,[],problem,infostr,solverinput,solveroutput,solvertime);
|
|
|
|
|
|
function problem = sedumicode(info,options)
|
|
temp = info.pinf;
|
|
pinf = info.dinf;
|
|
dinf = temp;
|
|
|
|
% Check for reported errors
|
|
if (pinf==0) & (dinf==0)
|
|
problem = 0; % No problems
|
|
end
|
|
|
|
% We can only report one error, use priorities
|
|
if (problem==0) & (pinf==1)
|
|
problem = 1; % Primal infeasability
|
|
end
|
|
|
|
if (problem==0) & (dinf==1)
|
|
problem = 2; % Dual infeasability
|
|
end
|
|
|
|
if (problem==0) & (info.numerr==1) | (info.numerr==2)
|
|
problem = 4; %Numerical problems
|
|
end
|
|
|
|
if (problem==0) & (info.iter >= options.sedumi.maxiter)
|
|
% Did we need exactly maxiter iterations to find optimum
|
|
if (pinf==0) & (dinf==0) & (info.numerr==0)
|
|
problem = 0; % Yes
|
|
else
|
|
problem = 3; % No, we are not optimal yet
|
|
end
|
|
end
|
|
|
|
if (problem==0) & (info.feasratio<0.98)
|
|
problem = 4;
|
|
end
|
|
|
|
% Fix for cases not really explained in documentation of sedumi?
|
|
if (abs(info.feasratio+1)<0.1) & (pinf==0) & (dinf==0)
|
|
problem = 1;
|
|
end
|
|
if (abs(info.feasratio+1)<0.1) & (pinf==0) & (dinf==0) & (c'*y_s<-1e10)
|
|
problem = 2;
|
|
end
|
|
|