148 lines
3.8 KiB
Mathematica
148 lines
3.8 KiB
Mathematica
|
|
function output = callsnopt(model)
|
||
|
|
|
||
|
|
% Build trees etc. This common format is used for fmincon, snopt and ipopt
|
||
|
|
% interfaces
|
||
|
|
model = yalmip2nonlinearsolver(model);
|
||
|
|
|
||
|
|
if ~model.derivative_available
|
||
|
|
disp('Derivate-free call to snopt not yet implemented')
|
||
|
|
error('Derivate-free call to snopt not yet implemented')
|
||
|
|
end
|
||
|
|
|
||
|
|
% Figure out which variables are artificially introduced to normalize
|
||
|
|
% arguments in callback operators to simplify chain rules etc. We can do
|
||
|
|
% our function evaluations and gradient computations in our lifted world,
|
||
|
|
% but only expose the model in the original variables to the nonlinear
|
||
|
|
% solver.
|
||
|
|
% model = compressLifted(model);
|
||
|
|
|
||
|
|
if model.options.savedebug
|
||
|
|
save snoptdebug model
|
||
|
|
end
|
||
|
|
|
||
|
|
showprogress('Calling SNOPT',model.options.showprogress);
|
||
|
|
|
||
|
|
x0 = model.x0;
|
||
|
|
solveopt = 1;
|
||
|
|
xlow = model.lb;
|
||
|
|
xupp = model.ub;
|
||
|
|
xmul = zeros(length(xupp),1);
|
||
|
|
xstate = zeros(length(xupp),1);
|
||
|
|
|
||
|
|
Fupp = [ inf;
|
||
|
|
repmat(0,length(model.bnonlinineq),1);
|
||
|
|
repmat(0,nnz(model.K.q),1);
|
||
|
|
repmat(0,length(model.bnonlineq),1);
|
||
|
|
repmat(0,length(model.b),1);
|
||
|
|
repmat(0,length(model.beq),1)];
|
||
|
|
|
||
|
|
Flow = [ -inf;
|
||
|
|
repmat(-inf,length(model.bnonlinineq),1);
|
||
|
|
repmat(-inf,nnz(model.K.q),1);
|
||
|
|
repmat(0,length(model.bnonlineq),1);
|
||
|
|
repmat(-inf,length(model.b),1);
|
||
|
|
repmat(0,length(model.beq),1)];
|
||
|
|
|
||
|
|
Fmul = zeros(length(Fupp),1);
|
||
|
|
Fstate = zeros(length(Fupp),1);
|
||
|
|
ObjAdd = 0;
|
||
|
|
ObjRow = 1;
|
||
|
|
A = [];
|
||
|
|
iAfun = [];
|
||
|
|
jAvar = [];
|
||
|
|
% Sparsity pattern of jacobian
|
||
|
|
if ~isempty(Fupp)
|
||
|
|
G = jacobiansparsityfromnonlinear(model);
|
||
|
|
else
|
||
|
|
G = [];
|
||
|
|
end
|
||
|
|
% Add a row for objective. No sparsity declared
|
||
|
|
G = [ones(1,size(G,2));G];
|
||
|
|
[iGfun,jGvar] = find(G);
|
||
|
|
model.sparsityElements = find(G);
|
||
|
|
|
||
|
|
usrf = 'snopt_callback';
|
||
|
|
snopt_callback([],model);
|
||
|
|
if model.options.verbose == 0
|
||
|
|
snscreen('off')
|
||
|
|
else
|
||
|
|
snscreen('on');
|
||
|
|
end
|
||
|
|
snseti('Minimize',1)
|
||
|
|
|
||
|
|
global latest_xevaled
|
||
|
|
global latest_x_xevaled
|
||
|
|
latest_xevaled = [];
|
||
|
|
latest_x_xevaled = [];
|
||
|
|
|
||
|
|
solvertime = tic;
|
||
|
|
if strcmpi(model.solver.version,'cmex')
|
||
|
|
% Some old interface? Keep for safety
|
||
|
|
[xout,F,xmul,Fmul,inform, xstate, Fstate, ns, ninf, sinf, mincw, miniw, minrw] = snoptcmex( solveopt, x0, xlow, xupp, xmul, xstate, Flow, Fupp, Fmul, Fstate,ObjAdd, ObjRow, A, iAfun(:), jAvar(:),iGfun(:), jGvar(:), usrf );
|
||
|
|
else
|
||
|
|
[xout,F,inform,xmul,Fmul] = snopt(x0, xlow, xupp, xmul, xstate,Flow, Fupp, Fmul, Fstate, usrf,ObjAdd, ObjRow,A, iAfun, jAvar, iGfun, jGvar);
|
||
|
|
end
|
||
|
|
|
||
|
|
solvertime = toc(solvertime);
|
||
|
|
|
||
|
|
lambda = Fmul(2:end);
|
||
|
|
|
||
|
|
if ~isempty(xout) && ~isempty(model.lift);
|
||
|
|
x = zeros(length(model.linearindicies),1);
|
||
|
|
x(model.lift.linearIndex) = xout;
|
||
|
|
x(model.lift.liftedIndex) = model.lift.T*xout + model.lift.d;
|
||
|
|
x = RecoverNonlinearSolverSolution(model,x);
|
||
|
|
else
|
||
|
|
x = RecoverNonlinearSolverSolution(model,xout);
|
||
|
|
end
|
||
|
|
|
||
|
|
problem = 0;
|
||
|
|
|
||
|
|
% Internal format for duals
|
||
|
|
D_struc = [];
|
||
|
|
|
||
|
|
% Check, currently not exhaustive...
|
||
|
|
switch inform
|
||
|
|
case {1}
|
||
|
|
problem = 0;
|
||
|
|
case {11,12,13,14,40,43,91} % 1 is sent when I test
|
||
|
|
problem = 1;
|
||
|
|
case 21
|
||
|
|
problem = 2;
|
||
|
|
case {31,32}
|
||
|
|
problem = 3;
|
||
|
|
case {2,3,33,41,42,43,44}
|
||
|
|
problem = 4;
|
||
|
|
case {71,72,73,74}
|
||
|
|
problem = 16;
|
||
|
|
otherwise
|
||
|
|
problem = 11;
|
||
|
|
end
|
||
|
|
|
||
|
|
% Save all data sent to solver?
|
||
|
|
if model.options.savesolverinput
|
||
|
|
solverinput.model = model;
|
||
|
|
else
|
||
|
|
solverinput = [];
|
||
|
|
end
|
||
|
|
|
||
|
|
% Save all data from the solver?
|
||
|
|
if model.options.savesolveroutput
|
||
|
|
solveroutput.x = x;
|
||
|
|
solveroutput.F = F;
|
||
|
|
solveroutput.xmul = xmul;
|
||
|
|
solveroutput.inform=inform;
|
||
|
|
solveroutput.Fstate=Fstate;
|
||
|
|
solveroutput.ns = ns;
|
||
|
|
solveroutput.ninf = ninf;
|
||
|
|
solveroutput.sinf = sinf;
|
||
|
|
solveroutput.mincw = mincw;
|
||
|
|
solveroutput.miniw = miniw;
|
||
|
|
solveroutput.miniw = miniw;
|
||
|
|
|
||
|
|
else
|
||
|
|
solveroutput = [];
|
||
|
|
end
|
||
|
|
|
||
|
|
% Standard interface
|
||
|
|
output = createoutput(x,D_struc,[],problem,'SNOPT',solverinput,solveroutput,solvertime);
|