function output = callcplexmex(interfacedata)

% Author Johan Löfberg 
% $Id: callcplexmex.m,v 1.4 2006-05-03 07:58:45 joloef Exp $

% Retrieve needed data
options = interfacedata.options;
F_struc = interfacedata.F_struc;
c       = interfacedata.c;
Q       = interfacedata.Q;
K       = interfacedata.K;
x0      = interfacedata.x0;
integer_variables = interfacedata.integer_variables;
binary_variables = interfacedata.binary_variables;
LB      = interfacedata.lb;
UB      = interfacedata.ub;

showprogress('Calling CPLEXMEX',options.showprogress);

if ~isempty(LB)
    LB(isinf(LB)) = -1e12;
    UB(isinf(UB)) = 1e12;
end

SENSE = 1;   
C = c(:);
if ~isempty(F_struc)
    A =-F_struc(:,2:end);
    B = full(F_struc(:,1));
else
    A = zeros(1,length(c));A(1)=1;
    B = 1e6;
end

H = 2*full(Q);
if nnz(H)==0
    H = [];
end

CTYPE = repmat('L',K.l+K.f,1);  % Standard variables
CTYPE(1:K.f) = 'E';             % Equality constrained variables
VARTYPE = repmat('C',size(A,2),1);
VARTYPE(binary_variables)  = 'B';
VARTYPE(integer_variables) = 'I';

options.cplexmex.msglev = options.verbose;
if options.cplexmex.msglev>1
    options.cplexmex.msglev = 1;
end

% Call mex-interface
solvertime = clock; 
if options.savedebug
save cplexmexdebug
end

[x,OPT,STATUS,EXTRA]= cplexmex(SENSE,H,C,A,B,CTYPE,LB,UB,VARTYPE,x0,options.cplexmex);
solvertime = etime(clock,solvertime);
problem = 0;

D_struc = -EXTRA.lambda;

% Check, currently not exhaustive...
switch STATUS
    case {1,101,102}
        problem = 0;
    case {3,103}
        problem = 1;
    case {2,118}
        problem = 2;
    case {4,119}
        problem = 12;
    otherwise
        problem = -1;
end
infostr = yalmiperror(problem,'CPLEXMEX');	

% Save all data sent to solver?
if options.savesolverinput
    solverinput.SENSE = SENSE;    
    solverinput.H = H;
	solverinput.A = A;
	solverinput.C = C;
	solverinput.B = B;
	solverinput.CTYPE = CTYPE;
	solverinput.LB = LB;
	solverinput.UB = UB;
	solverinput.VARTYPE = VARTYPE;
    solverinput.x0 = x0;    
    solverinput.param = options.cplexmex;
else
	solverinput = [];
end

% Save all data from the solver?
if options.savesolveroutput
	solveroutput.X = x;
    solveroutput.OPT = OPT;
    solveroutput.STATUS = STATUS;
    solveroutput.EXTRA = EXTRA; 
else
	solveroutput = [];
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;