function output = calllindo_miqp(interfacedata)

global MY_LICENSE_FILE
lindo

% Retrieve needed data
options = interfacedata.options;
F_struc = interfacedata.F_struc;
c       = interfacedata.c;
K       = interfacedata.K;
x0      = interfacedata.x0;
Q       = interfacedata.Q;
lb      = interfacedata.lb;
ub      = interfacedata.ub;
monomtable = interfacedata.monomtable;

lindo;

if ~isempty(F_struc)
    A = -F_struc(:,2:end);
    b = F_struc(:,1);   
    csense = [repmat('E',1,K.f) repmat('L',1,K.l)];
else
    A = [];
    b = [];
    csense = [];
    
    A = ones(1,length(c));
    b = 1e6;
    csense = 'L';
end

% Specifying variable types...
vtype = repmat('C',1,length(c));
vtype(interfacedata.integer_variables) = 'I';

% Specifying the quadratic portion of the problem data 
[QCvar1,QCvar2,QCcoef] = find(triu(Q));
QCrows = zeros(1,length(QCvar1));
QCvar1 = QCvar1 - 1;
QCvar2 = QCvar2 - 1;

% Solve the problem using the generic QP/LP/MIP/MIQP solver (lmsolvemp.m)
objsen=LS_MIN;
solver=eval(options.lindo.LS_METHOD);

solvertime = clock;
if nnz(Q)>0
    [x,D_struc,s,dj,pobj,solstat,nErr]  = LMsolvem(A,full(b),full(c),csense,lb,ub,vtype,QCrows-1,QCvar1,QCvar2,2*QCcoef,objsen,solver,options.verbose);
else
    [x,D_struc,s,dj,pobj,solstat,nErr]  = LMsolvem(A,full(b),full(c),csense,lb,ub,vtype,[],[],[],[],objsen,solver,options.verbose);
end
if interfacedata.getsolvertime solvertime = etime(clock,solvertime);else solvertime = 0;end
    
switch solstat
    case {LS_STATUS_OPTIMAL,LS_STATUS_BASIC_OPTIMAL,7,8}
        problem = 0;
    case {LS_STATUS_INFEASIBLE}
        problem = 1;
    case {LS_STATUS_UNBOUNDED}
        problem = 2;
    otherwise
        problem = 11;
end
infostr = yalmiperror(problem,'LINDO-QP');

% Save all data sent to solver?
if options.savesolverinput
    solverinput.A = A;
    solverinput.b = b;
    solverinput.c = c;
    solverinput.csense = csense;
    solverinput.vtype = vtype;    
    solverinput.lb = lb;    
    solverinput.vtype = vtype;    
    solverinput.objsen = objsen;   
    solverinput.solver = solver;   
    solverinput.options = options.fmincon;
else
    solverinput = [];
end

% Save all data from the solver?
if options.savesolveroutput
    solveroutput.w = x;
    solveroutput.y = D_struc;
    solveroutput.s = s;
    solveroutput.pobj=pobj;
    solveroutput.solstat=solstat;
    solveroutput.nErr=nErr;
else
    solveroutput = [];
end

% Standard interface
output = createoutput(x,D_struc,[],problem,'LINDO',solverinput,solveroutput,solvertime);