function output = callsparsepop(model)

% Retrieve needed data
options = model.options;
F_struc = model.F_struc;
c = model.c;
f = model.f;
K = model.K;
ub = model.ub;
lb = model.lb;
monoms = model.monomtable;

nvars = nnz(model.variabletype == 0);
monoms = monoms(:,model.variabletype == 0);

% Sparsepop exploit bounds
[lb,ub,cand_rows_eq,cand_rows_lp] = findlinearulb(F_struc,K,lb,ub,find(model.variabletype == 0));
lb = lb(find(model.variabletype==0));lb = lb(:)';
ub = ub(find(model.variabletype==0));ub = ub(:)';
F_struc(K.f+cand_rows_lp,:)=[];
F_struc(cand_rows_eq,:)=[];
K.l = K.l-length(cand_rows_lp);
K.f = K.f-length(cand_rows_eq);

obj.typeCone = 1;
obj.sizeCone = 1;
constraint = [];
if nnz(c)==0
obj.degree = 0;
obj.noTerms = 1;
obj.dimVar = nvars;
obj.coef = f;
obj.supports = [zeros(1,size(monoms,2))];
else
obj.degree = full(max(sum(monoms(find(c),:),2)));
obj.noTerms = nnz(c)+nnz(f);
obj.dimVar = nvars;
obj.coef = [f(find(f));c(find(c))];
obj.supports = monoms(find(c),:);
if find(f)
obj.supports = [zeros(1,size(monoms,2)); obj.supports];
end
end

for i = 1:K.f
f0 = F_struc(i,1);
f = F_struc(i,2:end);
constraint{i}.typeCone = -1;
constraint{i}.degree = full(max(sum(monoms(find(f),:),2)));
constraint{i}.noTerms = nnz(f)+nnz(f0);
constraint{i}.dimVar = nvars;
constraint{i}.coef = [f0(find(f0));f(find(f))'];
constraint{i}.supports = monoms(find(f),:);
if find(f0)
constraint{i}.supports = [zeros(1,size(monoms,2)); constraint{i}.supports];
end
end

for i = 1:K.l
f0 = F_struc(i+K.f,1);
f = F_struc(i+K.f,2:end);
constraint{i+K.f}.typeCone = 1;
constraint{i+K.f}.degree = full(max(sum(monoms(find(f),:),2)));
constraint{i+K.f}.noTerms = nnz(f)+nnz(f0);
constraint{i+K.f}.dimVar = nvars;
constraint{i+K.f}.coef = [f0(find(f0));f(find(f))'];
constraint{i+K.f}.supports = monoms(find(f),:);
if find(f0)
constraint{i+K.f}.supports = [zeros(1,size(monoms,2)); constraint{i+K.f}.supports];
end
end

paramin = options.sparsepop;

switch options.verbose
case 0
paramin.printLevel = [0 0];
case 1
paramin.printLevel = [1 0];
case 2
paramin.printLevel = [2 2];
end
if options.savedebug
save sparsepopdebug obj constraint paramin
end

% *********************************************
% Call sparsePOP
% *********************************************
if options.showprogress;showprogress(['Calling ' model.solver.tag],options.showprogress);end
problem = 0;
lb(isinf(lb)) = -1.0e10;
ub(isinf(ub)) = 1.0e10;

solvertime = tic;
if options.verbose==0
evalc('[param,SDPobjValue,POP,cpuTime,SDPsolverInfo,SDPinfo] = sparsePOP(obj,constraint,lb,ub,paramin);');
else
[param,SDPobjValue,POP,cpuTime,SDPsolverInfo,SDPinfo] = sparsePOP(obj,constraint,lb,ub,paramin);
end
solvertime = toc(solvertime);

if ~isempty(POP.xVect)
Primal = zeros(length(c),1);
Primal(model.variabletype==0) = POP.xVect;
else
Primal = [];
end

infostr = yalmiperror(problem,model.solver.tag);

% Save ALL data sent to solver
if options.savesolverinput
solverinput.obj = obj;
solverinput.constraint = constraint;
solverinput.lb = lb;
solverinput.ub = ub;
else
solverinput = [];
end

% Save ALL data from the solution?
if options.savesolveroutput
solveroutput.param =param;
solveroutput.SDPobjValue = SDPobjValue;
solveroutput.POP = POP;
solveroutput.cpuTime = cpuTime;
solveroutput.SDPsolverInfo = SDPsolverInfo;
solveroutput.SDPinfo = SDPinfo;
else
solveroutput = [];
end

% Standard interface
output = createOutputStructure(Primal,[],[],problem,infostr,solverinput,solveroutput,solvertime);