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

89 lines
2.2 KiB
Matlab
Executable File

function output = calllmirank(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
pars = options.lmirank;
pars.fid = double(options.verbose);
if ~options.usex0
interfacedata.options.verbose = max(0,interfacedata.options.verbose - 1);
initialsolver = eval(['@' interfacedata.solver.initialsolver.call]);
start = K.l;
b = zeros(size(F_struc,2)-1,1);
for j=1:length(K.s)
if K.s(j)~=K.rank(j)
ind = find(speye(K.s(j)));
for i=1:size(F_struc,2)-1
b(i,1) = b(i,1) + sum(F_struc(start+ind,1+i));
end
end
start=start+K.s(j)^2;
end
interfacedata.c = b;
interfacedata.solver = interfacedata.solver.initialsolver;
output = feval(initialsolver,interfacedata);
if output.problem ~= 1
options.usex0 = 1;
x0 = output.Primal;
else
return;
end
end
if options.savedebug
At = -F_struc(:,2:end);
C = F_struc(:,1);
save lmirankdebug C At K pars x0
end
if options.showprogress;showprogress(['Calling ' interfacedata.solver.tag],options.showprogress);end
solvertime = tic;
if options.usex0
[y,info] = lmirank(-F_struc(:,2:end),F_struc(:,1),K,pars,x0);
else
[y,info] = lmirank(-F_struc(:,2:end),F_struc(:,1),K,pars);
end
solvertime = toc(solvertime);
x = y;
switch info.solved
case 1
problem = 0;
otherwise
problem = 11;
end
% Save ALL data sent to solver
if options.savesolverinput
solverinput.At = -F_struc(:,2:end);
solverinput.c = F_struc(:,1);
solverinput.K = K;
solverinput.pars = pars;
solverinput.x0 = x0;
else
solverinput = [];
end
% Save ALL data from the solution?
if options.savesolveroutput
solveroutput.y = y;
solveroutput.info = info;
else
solveroutput = [];
end
% Standard interface
infostr = yalmiperror(problem,interfacedata.solver.tag);
output = createOutputStructure(x,[],[],problem,infostr,solverinput,solveroutput,solvertime);