140 lines
2.8 KiB
Mathematica
140 lines
2.8 KiB
Mathematica
|
|
function output = calllsqlin(interfacedata)
|
||
|
|
|
||
|
|
K = interfacedata.K;
|
||
|
|
c = interfacedata.c;
|
||
|
|
CA = interfacedata.F_struc;
|
||
|
|
options = interfacedata.options;
|
||
|
|
|
||
|
|
% To begin with, with try to figure out if this is a simple non-negative
|
||
|
|
% least squares in disguise
|
||
|
|
if length(K.q)~=1
|
||
|
|
output = error_output;
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
% total number of variables, #x+1 since YALMIP has introduced an epi-graph
|
||
|
|
% variable to model norm(Cx-d)
|
||
|
|
n = size(CA,2)-1;
|
||
|
|
|
||
|
|
if nnz(c)~=1
|
||
|
|
output = error_output;
|
||
|
|
return
|
||
|
|
end
|
||
|
|
if c(end)~=1
|
||
|
|
output = error_output;
|
||
|
|
return
|
||
|
|
end
|
||
|
|
if c(end)~=1
|
||
|
|
output = error_output;
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
Cones = CA(K.f+K.l+1:end,:);
|
||
|
|
LPs = CA(1:K.l+K.f,:);
|
||
|
|
|
||
|
|
if any(LPs(:,end))
|
||
|
|
% Epigraph involved in LPs
|
||
|
|
output = error_output;
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
if isempty(LPs)
|
||
|
|
Aeq = [];
|
||
|
|
beq = [];
|
||
|
|
A = [];
|
||
|
|
b = [];
|
||
|
|
else
|
||
|
|
Aeq = -LPs(1:1:K.f,2:end-1);
|
||
|
|
beq = LPs(1:1:K.f,1);
|
||
|
|
A =-LPs(K.f+1:end,2:end-1);
|
||
|
|
b = LPs(K.f+1:end,1);
|
||
|
|
end
|
||
|
|
|
||
|
|
% Is it really cone(C*x-d,t)
|
||
|
|
if ~all(Cones(1,:) == [zeros(1,n) 1])
|
||
|
|
output = error_output;
|
||
|
|
return
|
||
|
|
end
|
||
|
|
if ~all(Cones(:,end) == [1;zeros(K.q-1,1)])
|
||
|
|
output = error_output;
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
model.d = -Cones(2:end,1);
|
||
|
|
model.C = Cones(2:end,2:end-1);
|
||
|
|
model.Aineq = A;
|
||
|
|
model.Aeq = Aeq;
|
||
|
|
model.bineq = b;
|
||
|
|
model.beq = beq;
|
||
|
|
model.x0 = [];
|
||
|
|
model.options = interfacedata.options.lsqlin;
|
||
|
|
model.solver = 'lsqlin';
|
||
|
|
|
||
|
|
if options.savedebug
|
||
|
|
save debugfile model
|
||
|
|
end
|
||
|
|
|
||
|
|
if options.showprogress;showprogress(['Calling ' interfacedata.solver.tag],options.showprogress);end
|
||
|
|
solvertime = tic;
|
||
|
|
[X,RESNORM,RESIDUAL,EXITFLAG,OUTPUT,LAMBDA] = lsqlin(model);
|
||
|
|
solvertime = toc(solvertime);
|
||
|
|
|
||
|
|
solveroutput.X = X;
|
||
|
|
solveroutput.RESNORM = RESNORM;
|
||
|
|
solveroutput.RESIDUAL = RESIDUAL;
|
||
|
|
solveroutput.EXITFLAG = EXITFLAG;
|
||
|
|
solveroutput.OUTPUT = OUTPUT;
|
||
|
|
solveroutput.LAMBDA = LAMBDA;
|
||
|
|
|
||
|
|
solution.x = [X;RESNORM];
|
||
|
|
solution.D_struc = [];
|
||
|
|
|
||
|
|
switch EXITFLAG
|
||
|
|
case 1
|
||
|
|
solution.problem = 0;
|
||
|
|
case 2
|
||
|
|
solution.problem = 1;
|
||
|
|
case 0
|
||
|
|
solution.problem = 3;
|
||
|
|
case {3,-4,-7}
|
||
|
|
solution.problem = 4;
|
||
|
|
otherwise
|
||
|
|
solution.problem = 9;
|
||
|
|
end
|
||
|
|
|
||
|
|
% Save all data sent to solver?
|
||
|
|
if ~options.savesolverinput
|
||
|
|
model = [];
|
||
|
|
end
|
||
|
|
|
||
|
|
% Save all data from the solver?
|
||
|
|
if ~options.savesolveroutput
|
||
|
|
solveroutput = [];
|
||
|
|
end
|
||
|
|
|
||
|
|
if ~options.savesolverinput
|
||
|
|
solverinput = [];
|
||
|
|
else
|
||
|
|
solverinput = model;
|
||
|
|
end
|
||
|
|
if ~options.savesolveroutput
|
||
|
|
solveroutput = [];
|
||
|
|
else
|
||
|
|
solveroutput = solveroutput;
|
||
|
|
end
|
||
|
|
|
||
|
|
% Standard interface
|
||
|
|
output = createOutputStructure(solution.x(:),solution.D_struc,[],solution.problem,yalmiperror(solution.problem,interfacedata.solver.tag),solverinput,solveroutput,solvertime);
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
function output = error_output
|
||
|
|
output.Primal = [];
|
||
|
|
output.Dual = [];
|
||
|
|
output.Slack = [];
|
||
|
|
output.problem = 9;
|
||
|
|
output.infostr = yalmiperror(-4,'LSQLIN');
|
||
|
|
output.solvertime = 0;
|
||
|
|
|
||
|
|
|