function output = calllmilab(interfacedata) % Author Johan Löfberg % $Id: calllmilab.m,v 1.4 2005/05/07 13:53:20 joloef Exp $ % 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] = addbounds(F_struc,K,ub,lb); end % Define lmilab variables (is this the way to do it?) setlmis([]) for i = 1:length(c) [X,ndec,Xdec] = lmivar(2,[1 1]); end % Can't linear constraints be defined more easily? lmicount = 1; top = 1; if K.l>0 for i = 1:K.l lmiterm([-lmicount 1 1 0],F_struc(i,1)); for j = 1:length(c) lmiterm([-lmicount 1 1 j],F_struc(i,j+1),1); end lmicount = lmicount+1; end top = top + K.l; end % The LMIs if K.s(1)>0 for i = 1:length(K.s) n = K.s(i); lmiterm([-lmicount 1 1 0],full(reshape(F_struc(top:top+n^2-1,1),n,n))); for j = 1:length(c) lmiterm([-lmicount 1 1 j],full(reshape(F_struc(top:top+n^2-1,j+1),n,n)),1); end top = top+n^2; lmicount = lmicount+1; end end lmisys=getlmis; % Convert options ops = struct2cell(options.lmilab);ops = [ops{1:end}]; if options.verbose>0 ops = [ops 0]; else ops = [ops 1]; end if options.savedebug save lmilabdebug lmisys c ops end % Solve... if options.showprogress;showprogress(['Calling ' interfacedata.solver.tag],options.showprogress);end solvertime = clock; if nnz(c)==0 [copt,x]=feasp(lmisys,ops); else [copt,x]=mincx(lmisys,full(c),ops); end solvertime = etime(clock,solvertime); % No status if isempty(x) problem = 1; x = repmat(nan,length(c),1); else problem = 0; end infostr = yalmiperror(problem,interfacedata.solver.tag); % No duals... D_struc = []; if options.savesolveroutput solveroutput.copt = copt; solveroutput.x = x; else solveroutput = []; end if options.savesolverinput solverinput.lmisys = lmisys; solverinput.c = c; solverinput.ops = ops; else solverinput = []; end % Standard interface output.Primal = x; output.Dual = D_struc; output.Slack = []; output.problem = problem; output.infostr = infostr; output.solverinput = solverinput; output.solveroutput= solveroutput; output.solvertime = solvertime;