117 lines
2.9 KiB
Mathematica
117 lines
2.9 KiB
Mathematica
|
|
function output = callgpposy(interfacedata)
|
||
|
|
|
||
|
|
% Retrieve needed data
|
||
|
|
options = interfacedata.options;
|
||
|
|
F_struc = interfacedata.F_struc;
|
||
|
|
c = interfacedata.c;
|
||
|
|
Q = interfacedata.Q;
|
||
|
|
K = interfacedata.K;
|
||
|
|
extended_variables = interfacedata.extended_variables;
|
||
|
|
ub = interfacedata.ub;
|
||
|
|
lb = interfacedata.lb;
|
||
|
|
mt = interfacedata.monomtable;
|
||
|
|
variabletype = interfacedata.variabletype;
|
||
|
|
|
||
|
|
% *********************************
|
||
|
|
% What type of variables do we have
|
||
|
|
% *********************************
|
||
|
|
if isempty(variabletype)
|
||
|
|
linear_variables = find((sum(abs(mt),2)==1) & (any(mt==1,2)));
|
||
|
|
else
|
||
|
|
linear_variables = find(variabletype == 0);
|
||
|
|
end
|
||
|
|
|
||
|
|
% Same for fmincon,mosek,gpposy (for gpposy, we do not add bound constraints)
|
||
|
|
[prob,problem] = yalmip2geometric(options,F_struc,c,Q,K,[],[],mt,linear_variables,extended_variables);
|
||
|
|
|
||
|
|
if problem == 0
|
||
|
|
%
|
||
|
|
fixed = find(ub(linear_variables) == lb(linear_variables));
|
||
|
|
if ~isempty(fixed)
|
||
|
|
prob.G = [prob.G;-sparse(1:length(fixed),fixed,1,length(fixed),length(linear_variables))];
|
||
|
|
prob.h = [prob.h;lb(linear_variables(fixed))];
|
||
|
|
end
|
||
|
|
ub(linear_variables(fixed)) = inf;
|
||
|
|
lb(linear_variables(fixed)) = -inf;
|
||
|
|
|
||
|
|
% Account for numerical problems in gpposy
|
||
|
|
if ~isempty(lb);
|
||
|
|
lb=lb(linear_variables);
|
||
|
|
lb(lb<0)=1e-100;
|
||
|
|
lb(lb==0) = 1e-100;
|
||
|
|
end
|
||
|
|
if ~isempty(ub);
|
||
|
|
ub=ub(linear_variables);
|
||
|
|
ub(isinf(ub))=1e100;
|
||
|
|
end
|
||
|
|
|
||
|
|
% Convert to gpposy
|
||
|
|
A=prob.A;
|
||
|
|
b=prob.b;
|
||
|
|
G = prob.G;
|
||
|
|
h = prob.h;
|
||
|
|
szs=[];
|
||
|
|
for i=0:max(prob.map)
|
||
|
|
szs=[szs;nnz(find(i==prob.map))];
|
||
|
|
end
|
||
|
|
|
||
|
|
if szs(1) == 0
|
||
|
|
% Feasibility problem not supported by GPPOSY
|
||
|
|
% Just minimize sum of all variables
|
||
|
|
A = [eye(size(A,2));A];
|
||
|
|
b = [ones(size(A,2),1);b];
|
||
|
|
szs(1) = size(A,2);
|
||
|
|
end
|
||
|
|
|
||
|
|
if options.savedebug
|
||
|
|
save gpposydebug A b szs
|
||
|
|
end
|
||
|
|
|
||
|
|
solvertime = tic;
|
||
|
|
[x,status,lambda,nu] = gpposy(A,b,szs,G,h,lb,ub,double(options.verbose)==0);
|
||
|
|
solvertime = toc(solvertime);
|
||
|
|
|
||
|
|
Primal = zeros(length(c),1);
|
||
|
|
|
||
|
|
% Check, currently not exhaustive...
|
||
|
|
switch lower(status)
|
||
|
|
case 'solved'
|
||
|
|
problem = 0;
|
||
|
|
Primal(linear_variables) = x;
|
||
|
|
case 'infeasible'
|
||
|
|
problem = 1;
|
||
|
|
case 'failed'
|
||
|
|
problem = 4;
|
||
|
|
otherwise
|
||
|
|
problem = 9;
|
||
|
|
end
|
||
|
|
else
|
||
|
|
Primal = [];
|
||
|
|
solvertime = [];
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
% Internal format for duals
|
||
|
|
Dual = [];
|
||
|
|
|
||
|
|
|
||
|
|
infostr = yalmiperror(problem,interfacedata.solver.tag);
|
||
|
|
|
||
|
|
if options.savesolverinput
|
||
|
|
solverinput.A = A;
|
||
|
|
solverinput.b = b;
|
||
|
|
solverinput.szs = szs;
|
||
|
|
else
|
||
|
|
solverinput = [];
|
||
|
|
end
|
||
|
|
|
||
|
|
% Save all data from the solver?
|
||
|
|
if options.savesolveroutput
|
||
|
|
solveroutput.x = x;
|
||
|
|
solveroutput.status = status;
|
||
|
|
else
|
||
|
|
solveroutput = [];
|
||
|
|
end
|
||
|
|
|
||
|
|
% Standard interface
|
||
|
|
output = createOutputStructure(Primal,Dual,[],problem,infostr,solverinput,solveroutput,solvertime);
|