function solver = definesolvers

% ****************************
% Create a default solver
% ****************************
emptysolver.tag     = '';
emptysolver.version = '';
emptysolver.checkfor= {''};
emptysolver.testcode= {''};
emptysolver.call    = '';
emptysolver.subcall = '';
emptysolver.show    = 1;

emptysolver.objective.linear = 0;
emptysolver.objective.quadratic.convex = 0;
emptysolver.objective.quadratic.nonconvex = 0;
emptysolver.objective.polynomial = 0;
emptysolver.objective.maxdet = 0;
emptysolver.objective.sigmonial = 0;

emptysolver.constraint.equalities.linear     = 0;
emptysolver.constraint.equalities.quadratic  = 0;
emptysolver.constraint.equalities.polynomial = 0;
emptysolver.constraint.equalities.sigmonial  = 0;

emptysolver.constraint.inequalities.elementwise.linear = 0;
emptysolver.constraint.inequalities.elementwise.quadratic.convex = 0;
emptysolver.constraint.inequalities.elementwise.quadratic.nonconvex = 0;
emptysolver.constraint.inequalities.elementwise.polynomial = 0;
emptysolver.constraint.inequalities.elementwise.sigmonial = 0;

emptysolver.constraint.inequalities.semidefinite.linear = 0;
emptysolver.constraint.inequalities.semidefinite.quadratic = 0;
emptysolver.constraint.inequalities.semidefinite.polynomial = 0;
emptysolver.constraint.inequalities.semidefinite.sigmonial = 0;
emptysolver.constraint.inequalities.rank = 0;

emptysolver.constraint.inequalities.secondordercone = 0;
emptysolver.constraint.inequalities.rotatedsecondordercone = 0;

emptysolver.constraint.integer = 0;
emptysolver.constraint.binary = 0;

emptysolver.dual       = 0;
emptysolver.complex    = 0;
emptysolver.parametric = 0;
emptysolver.evaluation = 0;
emptysolver.uncertain  = 0;


% **************************************
% Some standard solvers to simplify code
% **************************************

% LP solver
lpsolver = emptysolver;
lpsolver.objective.linear = 1;
lpsolver.constraint.equalities.linear = 1;
lpsolver.constraint.inequalities.elementwise.linear = 1;
lpsolver.dual = 1;

% QP solver
qpsolver = emptysolver;
qpsolver.objective.linear = 1;
qpsolver.objective.quadratic.convex = 1;
qpsolver.constraint.equalities.linear = 1;
qpsolver.constraint.inequalities.elementwise.linear = 1;
qpsolver.dual = 1;

% SDP solver
sdpsolver = emptysolver;
sdpsolver.objective.linear = 1;
sdpsolver.constraint.equalities.linear = 1;
sdpsolver.constraint.inequalities.elementwise.linear = 1;
sdpsolver.constraint.inequalities.semidefinite.linear = 1;
sdpsolver.dual = 1;

% ****************************
% INITIALIZE COUNTER
% ****************************
i = 1;

% ****************************
% DEFINE SOLVERS
% ****************************

solver(i) = qpsolver;
solver(i).tag     = 'CPLEX';
solver(i).version = 'CPLEXINT';
solver(i).checkfor= {'cplexint'};
solver(i).call    = 'callcplexint';
solver(i).constraint.inequalities.elementwise.quadratic.convex = 1;
solver(i).constraint.integer = 1;
solver(i).constraint.binary = 1;
i = i+1;

solver(i) = lpsolver;
solver(i).tag     = 'GLPK';
solver(i).version = 'GLPKMEX';
solver(i).checkfor= {'glpkmex.m'};
solver(i).call    = 'callglpk';
solver(i).constraint.integer = 1;
i = i+1;

solver(i) = lpsolver;
solver(i).tag     = 'CDD';
solver(i).version = 'CDDMEX';
solver(i).checkfor= {'cddmex'};
solver(i).call    = 'callcdd';
i = i+1;

solver(i) = lpsolver;
solver(i).tag     = 'NAG';
solver(i).version = 'e04mbf';
solver(i).checkfor= {'e04mbf'};
solver(i).call    = 'callnage04mbf';
i = i+1;

solver(i) = qpsolver;
solver(i).tag     = 'NAG';
solver(i).version = 'e04naf';
solver(i).checkfor= {'e04naf'};
solver(i).call    = 'callnage04naf';
i = i+1;

solver(i) = lpsolver;
solver(i).tag     = 'CLP';
solver(i).version = 'CLPMEX-LP';
solver(i).checkfor= {'mexclp'};
solver(i).call    = 'callclp';
%solver(i).constraint.integer = 1;
i = i+1;

solver(i) = qpsolver;
solver(i).tag     = 'XPRESS';
solver(i).version = 'MEXPRESS 1.1';
solver(i).checkfor= {'xpress.m'};
solver(i).call    = 'callmexpress11';
solver(i).constraint.integer = 1;
solver(i).constraint.binary = 1;
i = i+1;

solver(i) = qpsolver;
solver(i).tag     = 'XPRESS';
solver(i).version = 'MEXPRESS 1.0';
solver(i).checkfor= {'mexpress.m'};
solver(i).call    = 'callmexpress';
solver(i).constraint.integer = 1;
solver(i).constraint.binary = 1;
i = i+1;

solver(i) = lpsolver;
solver(i).tag     = 'QSOPT';
solver(i).version = 'MEXQSOPT';
solver(i).checkfor= {'qsopt.m'};
solver(i).call    = 'callqsopt';
i = i+1;

solver(i) = lpsolver;
solver(i).tag     = 'LPSOLVE';
solver(i).version = 'MXLPSOLVE';
solver(i).checkfor= {'lp_solve.m'};
solver(i).call    = 'calllpsolve';
solver(i).constraint.integer = 1;
i = i+1;

solver(i) = qpsolver;
solver(i).tag     = 'MOSEK';
solver(i).version = 'LP/QP';
solver(i).checkfor= {'mosekopt'};
solver(i).call    = 'callmosek';
solver(i).constraint.integer = 1;
i = i+1;

solver(i) = lpsolver;
solver(i).tag     = 'MOSEK';
solver(i).version = 'SOCP';
solver(i).checkfor= {'mosekopt'};
solver(i).call    = 'callmosek';
solver(i).constraint.inequalities.secondordercone = 1;
i = i+1;

solver(i) = lpsolver;
solver(i).tag     = 'MOSEK';
solver(i).version = 'GEOMETRIC';
solver(i).checkfor= {'mosekopt'};
solver(i).call    = 'callmosek';
solver(i).objective.sigmonial = 1;
solver(i).constraint.inequalities.elementwise.sigmonial = 1;
solver(i).constraint.equalities.elementwise.nonlinear = 1;
i = i+1;

solver(i) = qpsolver;
solver(i).tag     = 'CPLEX';
solver(i).version = 'CPLEXMEX';
solver(i).checkfor= {'cplexmex'};
solver(i).call    = 'callcplexmex';
solver(i).constraint.inequalities.elementwise.quadratic.convex = 1;
solver(i).constraint.integer = 1;
solver(i).constraint.binary = 1;
i = i+1;

solver(i) = lpsolver;
solver(i).tag     = 'CPLEX';
solver(i).version = 'LP-CPLEXINT';
solver(i).checkfor= {'lp_cplex.m'};
solver(i).call    = 'calllp_cplex';
i = i+1;

solver(i) = qpsolver;
solver(i).tag     = 'CPLEX';
solver(i).version = 'QP-CPLEXINT';
solver(i).checkfor= {'qp_cplex.m'};
solver(i).call    = 'callqp_cplex';
i = i+1;

solver(i) = lpsolver;
solver(i).tag     = 'CPLEX';
solver(i).version = 'MILP-CPLEXINT';
solver(i).checkfor= {'milp_cplex.m'};
solver(i).call    = 'callmilp_cplex';
solver(i).constraint.integer = 1;
solver(i).constraint.binary = 1;
i = i+1;

solver(i) = qpsolver;
solver(i).tag     = 'CPLEX';
solver(i).version = 'MIQP-CPLEXINT';
solver(i).checkfor= {'miqp_cplex.m'};
solver(i).call    = 'callmiqp_cplex';
solver(i).constraint.integer = 1;
solver(i).constraint.binary = 1;
i = i+1;

solver(i) = lpsolver;
solver(i).tag     = 'LINPROG';
solver(i).version = '';
solver(i).checkfor= {'linprog'};
solver(i).call    = 'calllinprog';
i = i+1;

solver(i) = lpsolver;
solver(i).tag     = 'BINTPROG';
solver(i).version = '';
solver(i).checkfor= {'bintprog.m'};
solver(i).call    = 'callbintprog';
solver(i).constraint.binary = 1;
solver(i).constraint.integer = 1;
solver(i).dual = 0;
i = i+1;

solver(i) = qpsolver;
solver(i).tag     = 'BPMPD';
solver(i).version = '';
solver(i).checkfor= {'bp'};
solver(i).call    = 'callbpmpd';
i = i+1;

solver(i) = qpsolver;
solver(i).tag     = 'CLP';
solver(i).version = 'CLPMEX-QP';
solver(i).checkfor= {'clp.m'};
solver(i).call    = 'callclp';
%solver(i).constraint.integer = 1;
i = i+1;

solver(i) = qpsolver;
solver(i).tag     = 'QUADPROG';
solver(i).version = '';
solver(i).checkfor= {'quadprog'};
solver(i).call    = 'callquadprog';
i = i+1;

solver(i) = qpsolver;
solver(i).tag     = 'OOQP';
solver(i).version = '';
solver(i).checkfor= {'ooqp.m'};
solver(i).call    = 'callooqp';
i = i+1;

solver(i) = qpsolver;
solver(i).tag     = 'lindo';
solver(i).version = 'MIQP';
solver(i).checkfor= {'mxlindo'};
solver(i).call    = 'calllindo_miqp';
solver(i).constraint.integer = 1;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'SeDuMi';
solver(i).version = '1.1';
solver(i).checkfor= {'sedumi.m','ada_pcg.m','install_sedumi'};
solver(i).call    = 'callsedumi';
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.inequalities.secondordercone = 1;
solver(i).constraint.inequalities.rotatedsecondordercone = 1;
solver(i).complex = 1;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'SeDuMi';
solver(i).version = '1.05';
solver(i).checkfor= {'sedumi.m','ada_pcg.m','vecreal'};
solver(i).call    = 'callsedumi';
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.inequalities.secondordercone = 1;
solver(i).constraint.inequalities.rotatedsecondordercone = 1;
solver(i).complex = 1;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'SeDuMi';
solver(i).version = '1.03';
solver(i).checkfor= {'sedumi.m','doinfac.m'};
solver(i).call    = 'callsedumi';
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.inequalities.secondordercone = 1;
solver(i).constraint.inequalities.rotatedsecondordercone = 1;
solver(i).complex = 1;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'SDPT3';
solver(i).version = '4';
solver(i).checkfor= {'sqlp','skron','symqmr','blkbarrier'};
solver(i).call    = 'callsdpt34';
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.inequalities.secondordercone = 1;
solver(i).objective.maxdet = 1;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'SDPT3';
solver(i).version = '3.1';
solver(i).checkfor= {'sqlp','skron','symqmr'};
solver(i).call    = 'callsdpt331';
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.inequalities.secondordercone = 1;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'SDPT3';
solver(i).version = '3.02';
solver(i).checkfor= {'sqlp','skron','schursysolve'};
solver(i).call    = 'callsdpt3302';
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.inequalities.secondordercone = 1;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'SDPT3';
solver(i).version = '3.0';
solver(i).checkfor= {'sqlp','mexexec'};
solver(i).call    = 'callsdpt330';
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.inequalities.secondordercone = 1;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'SDPA';
solver(i).version = 'M';
solver(i).checkfor= {'sdpam.m'};
solver(i).call    = 'callsdpa';
solver(i).constraint.equalities.linear = 0;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'DSDP';
solver(i).version = '5';
solver(i).checkfor= {'dsdp','dvec'};
solver(i).call    = 'calldsdp5';
solver(i).constraint.equalities.linear = 0;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'DSDP';
solver(i).version = '4';
solver(i).checkfor= {'dsdp'};
solver(i).call    = 'calldsdp';
solver(i).constraint.equalities.linear = 0;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'SDPLR';
solver(i).version = '';
solver(i).checkfor= {'sdplr'};
solver(i).call    = 'callsdplr';
solver(i).constraint.equalities.linear = 0;

i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'CSDP';
solver(i).version = '';
solver(i).checkfor= {'csdp','readsol','writesdpa'};
solver(i).call    = 'callcsdp';
solver(i).constraint.equalities.linear = 0;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'MAXDET';
solver(i).version = '';
solver(i).checkfor= {'maxdet.m'};
solver(i).call    = 'callmaxdet';
solver(i).objective.maxdet = 1;
solver(i).dual = 0;
i = i+1;


% solver(i) = sdpsolver;
% solver(i).tag     = 'SPECSDP';
% solver(i).version = '';
% solver(i).checkfor= {'specsdp'};
% solver(i).call    = 'callspecsdp';
% solver(i).constraint.equalities.linear = 0; % Does not handle equality constraints
% solver(i).constraint.inequalities.semidefinite.quadratic = 1;
% i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'PENSDP';
solver(i).version = 'PENOPT';
solver(i).checkfor= {'pensdpm'};
solver(i).call    = 'callpensdpm';
solver(i).constraint.equalities.linear = 0;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'PENSDP';
solver(i).version = 'TOMLAB';
solver(i).checkfor= {'pensdp'};
solver(i).call    = 'callpensdp';
solver(i).constraint.equalities.linear = 0;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'PENBMI';
solver(i).version = 'PENOPT';
solver(i).checkfor= {'penbmim'};
solver(i).call    = 'callpenbmim';
solver(i).objective.quadratic.convex = 1;
solver(i).objective.quadratic.nonconvex = 1;
solver(i).constraint.equalities.linear = 0;
solver(i).constraint.inequalities.semidefinite.quadratic = 1;
solver(i).constraint.inequalities.semidefinite.polynomial = 1;
solver(i).constraint.inequalities.elementwise.quadratic.convex = 1;
solver(i).constraint.inequalities.elementwise.quadratic.nonconvex = 1;
solver(i).constraint.inequalities.elementwise.polynomial = 1;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'PENBMI';
solver(i).version = 'TOMLAB';
solver(i).checkfor= {'penbmi'};
solver(i).call    = 'callpenbmi';
solver(i).objective.quadratic.convex = 1;
solver(i).objective.quadratic.nonconvex = 1;
solver(i).constraint.equalities.linear = 0;
solver(i).constraint.inequalities.semidefinite.quadratic = 1;
solver(i).constraint.inequalities.elementwise.quadratic.convex = 1;
solver(i).constraint.inequalities.elementwise.quadratic.nonconvex = 1;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'LMILAB';
solver(i).version = '';
solver(i).checkfor= {'setlmis'};
solver(i).call    = 'calllmilab';
solver(i).dual = 0;
solver(i).constraint.equalities.linear = 0;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'LMIRANK';
solver(i).version = '';
solver(i).checkfor= {'lmirank'};
solver(i).call    = 'calllmirank';
solver(i).dual = 0;
solver(i).constraint.inequalities.rank = 1;
solver(i).objective.linear = 0;
solver(i).constraint.equalities.linear = 0;
i = i+1;

solver(i) = emptysolver;
solver(i).tag     = 'MPT';
solver(i).version = '';
solver(i).checkfor= {'mpt_mpqp'};
solver(i).call    = 'callmpt';
solver(i).objective.linear = 1;
solver(i).objective.quadratic.convex = 1;
solver(i).objective.quadratic.nonconvex = 1;
solver(i).constraint.inequalities.elementwise.linear = 1;
solver(i).constraint.equalities.linear = 1;
%solver(i).constraint.equalities.polynomial = 1;
%solver(i).constraint.equalities.quadratic = 1;
solver(i).parametric = 1;
solver(i).constraint.binary = 1;
i = i+1;

solver(i) = emptysolver;
solver(i).tag     = 'MPLCP';
solver(i).version = '';
solver(i).checkfor= {'mplcp.m'};
solver(i).call    = 'callmplcp';
solver(i).objective.linear = 1;
solver(i).objective.quadratic.convex = 1;
solver(i).objective.quadratic.nonconvex = 1;
solver(i).constraint.inequalities.elementwise.linear = 1;
solver(i).constraint.equalities.linear = 1;
solver(i).parametric = 1;
solver(i).constraint.binary = 1;
i = i+1;

solver(i) = sdpsolver;
solver(i).tag     = 'KYPD';
solver(i).version = '';
solver(i).checkfor= {'kypd_solver'};
solver(i).call    = 'callkypd';
i = i+1;

solver(i) = emptysolver;
solver(i).tag     = 'fmincon';
solver(i).version = 'geometric';
solver(i).checkfor= {'fmincon.m'};
solver(i).call    = 'callfmincongp';
solver(i).objective.sigmonial = 1;
solver(i).constraint.inequalities.elementwise.sigmonial = 1;
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.equalities.quadratic = 1;
solver(i).constraint.equalities.polynomial = 1;
solver(i).constraint.equalities.sigmonial = 1;
i = i+1;

solver(i) = emptysolver;
solver(i).tag     = 'fmincon';
solver(i).version = 'standard';
solver(i).checkfor= {'fmincon.m'};
solver(i).call    = 'callfmincon';
solver(i).objective.linear = 1;
solver(i).objective.quadratic.convex = 1;
solver(i).objective.quadratic.nonconvex = 1;
solver(i).objective.polynomial = 1;
solver(i).objective.sigmonial = 1;
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.equalities.quadratic = 1;
solver(i).constraint.equalities.polynomial = 1;
solver(i).constraint.equalities.sigmonial = 1;
solver(i).constraint.inequalities.elementwise.linear = 1;
solver(i).constraint.inequalities.elementwise.quadratic.convex = 1;
solver(i).constraint.inequalities.elementwise.quadratic.nonconvex = 1;
solver(i).constraint.inequalities.elementwise.polynomial = 1;
solver(i).constraint.inequalities.elementwise.sigmonial = 1;
solver(i).dual = 1;
solver(i).evaluation = 1;
i = i+1;

% solver(i) = emptysolver;
% solver(i).tag     = 'lindo';
% solver(i).version = 'geometric';
% solver(i).checkfor= {'mxlindo'};
% solver(i).call    = 'calllindo_geo';
% solver(i).objective.sigmonial = 1;
% solver(i).constraint.inequalities.elementwise.sigmonial = 1;
% solver(i).constraint.equalities.linear = 1;
% solver(i).constraint.equalities.quadratic = 1;
% solver(i).constraint.equalities.polynomial = 1;
% solver(i).constraint.equalities.sigmonial = 1;
% i = i+1;

solver(i) = emptysolver;
solver(i).tag     = 'lindo';
solver(i).version = 'NLP';
solver(i).checkfor= {'mxlindo'};
solver(i).call    = 'calllindo_nlp';
solver(i).objective.linear = 1;
solver(i).objective.quadratic.convex = 1;
solver(i).objective.quadratic.nonconvex = 1;
solver(i).objective.polynomial = 1;
solver(i).objective.sigmonial = 1;
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.equalities.quadratic = 1;
solver(i).constraint.equalities.polynomial = 1;
solver(i).constraint.equalities.sigmonial = 1;
solver(i).constraint.inequalities.elementwise.linear = 1;
solver(i).constraint.inequalities.elementwise.quadratic.convex = 1;
solver(i).constraint.inequalities.elementwise.quadratic.nonconvex = 1;
solver(i).constraint.inequalities.elementwise.polynomial = 1;
solver(i).constraint.inequalities.elementwise.sigmonial = 1;
solver(i).dual = 1;
solver(i).evaluation = 1;
solver(i).constraint.integer = 1;

i = i+1;


% solver(i) = emptysolver;
% solver(i).tag     = 'ipopt';
% solver(i).version = 'standard';
% solver(i).checkfor= {'Ipopt.m'};
% solver(i).call    = 'callipoptmex';
% solver(i).objective.linear = 1;
% solver(i).objective.quadratic.convex = 1;
% solver(i).objective.quadratic.nonconvex = 1;
% solver(i).objective.polynomial = 1;
% solver(i).objective.sigmonial = 1;
% solver(i).constraint.equalities.linear = 1;
% solver(i).constraint.equalities.quadratic = 1;
% solver(i).constraint.equalities.polynomial = 1;
% solver(i).constraint.equalities.sigmonial = 1;
% solver(i).constraint.inequalities.elementwise.linear = 1;
% solver(i).constraint.inequalities.elementwise.quadratic.convex = 1;
% solver(i).constraint.inequalities.elementwise.quadratic.nonconvex = 1;
% solver(i).constraint.inequalities.elementwise.polynomial = 1;
% solver(i).constraint.inequalities.elementwise.sigmonial = 1;
% solver(i).dual = 0;
% i = i+1;

solver(i) = lpsolver;
solver(i).tag     = 'GPPOSY';
solver(i).version = '';
solver(i).checkfor= {'gpposy'};
solver(i).call    = 'callgpposy';
solver(i).objective.sigmonial = 1;
solver(i).constraint.inequalities.elementwise.sigmonial = 1;
solver(i).constraint.equalities.elementwise.nonlinear = 1;
i = i+1;

% solver(i) = emptysolver;
% solver(i).tag     = 'pennlp';
% solver(i).version = 'standard';
% solver(i).checkfor= {'pennlp'};
% solver(i).call    = 'callpennlp';
% solver(i).objective.linear = 1;
% solver(i).objective.quadratic.convex = 1;
% solver(i).objective.quadratic.nonconvex = 1;
% solver(i).objective.polynomial = 1;
% solver(i).objective.sigmonial = 1;
% solver(i).constraint.equalities.linear = 1;
% solver(i).constraint.equalities.quadratic = 1;
% solver(i).constraint.equalities.polynomial = 1;
% solver(i).constraint.equalities.sigmonial = 1;
% solver(i).constraint.inequalities.elementwise.linear = 1;
% solver(i).constraint.inequalities.elementwise.quadratic.convex = 1;
% solver(i).constraint.inequalities.elementwise.quadratic.nonconvex = 1;
% solver(i).constraint.inequalities.elementwise.polynomial = 1;
% solver(i).constraint.inequalities.elementwise.sigmonial = 1;
% solver(i).dual = 1;
% i = i+1;

% solver(i) = qpsolver;
% solver(i).tag     = 'pennlp';
% solver(i).version = 'QP';
% solver(i).checkfor= {'pennlpm'};
% solver(i).call    = 'callpennlp';
% solver(i).objective.linear = 1;
% solver(i).objective.quadratic.convex = 1;
% solver(i).objective.quadratic.nonconvex = 0;
% solver(i).constraint.equalities.linear = 1;
% solver(i).constraint.inequalities.elementwise.linear = 1;
% solver(i).dual = 1;
% i = i+1;

% solver(i) = emptysolver;
% solver(i).tag     = 'pennlp';
% solver(i).version = 'standard';
% solver(i).checkfor= {'pennlpm'};
% solver(i).call    = 'callpennlp';
% solver(i).objective.linear = 1;
% solver(i).objective.quadratic.convex = 0;
% solver(i).objective.quadratic.nonconvex = 0;
% solver(i).objective.polynomial = 1;
% solver(i).objective.sigmonial = 1;
% solver(i).constraint.equalities.linear = 1;
% solver(i).constraint.equalities.quadratic = 1;
% solver(i).constraint.equalities.polynomial = 1;
% solver(i).constraint.equalities.sigmonial = 1;
% solver(i).constraint.inequalities.elementwise.linear = 1;
% solver(i).constraint.inequalities.elementwise.quadratic.convex = 1;
% solver(i).constraint.inequalities.elementwise.quadratic.nonconvex = 1;
% solver(i).constraint.inequalities.elementwise.polynomial = 1;
% solver(i).constraint.inequalities.elementwise.sigmonial = 1;
% solver(i).constraint.inequalities.semidefinite.linear = 0;
% solver(i).constraint.inequalities.semidefinite.quadratic = 0;
% solver(i).constraint.inequalities.semidefinite.polynomial = 0;
% solver(i).dual = 1;
% i = i+1;


solver(i) = emptysolver;
solver(i).tag     = 'fminsearch';
solver(i).version = '';
solver(i).checkfor= {'fminsearch.m'};
solver(i).call    = 'callfminsearch';
solver(i).objective.linear = 1;
solver(i).objective.quadratic.convex = 1;
solver(i).objective.quadratic.nonconvex = 1;
solver(i).objective.polynomial = 1;
solver(i).objective.sigmonial = 1;
solver(i).dual = 0;
i = i+1;

% solver(i) = emptysolver;
% solver(i).tag     = 'mpcvx';
% solver(i).tag     = 'mpcvx';
% solver(i).version = '';
% solver(i).checkfor= {'mpcvx'};
% solver(i).call    = 'mpcvx';
% solver(i).objective.linear = 1;
% solver(i).objective.quadratic.convex = 1;
% solver(i).objective.quadratic.nonconvex = 1;
% solver(i).constraint.inequalities.elementwise.linear = 1;
% solver(i).constraint.inequalities.secondordercone = 1;
% solver(i).constraint.inequalities.elementwise.polynomial = 1;
% solver(i).parametric = 1;
% i = i+1;

% % ***************************************
% % SOMEWHAT MORE COMPLEX DEFINITIONS OF
% % THE INTERNAL MICP SOLVER
% % ***************************************
solver(i) = emptysolver;
solver(i).tag     = 'BNB';
solver(i).version = '';
solver(i).checkfor= {'bnb'};
solver(i).call    = 'bnb';
solver(i).objective.linear = 1;
solver(i).objective.sigmonial = 1;
solver(i).objective.polynomial = 1;
solver(i).objective.quadratic.convex = 1;
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.inequalities.elementwise.linear = 1;
solver(i).constraint.inequalities.elementwise.sigmonial = 1;
solver(i).constraint.inequalities.elementwise.polynomial = 1;
solver(i).constraint.inequalities.semidefinite.linear = 1;
solver(i).constraint.inequalities.secondordercone = 1;
solver(i).constraint.inequalities.rotatedsecondordercone = 1;
solver(i).constraint.integer = 1;
solver(i).constraint.binary = 1;
solver(i).evaluation = 1;
i = i+1;


% % ***************************************
% % Experimental min-max solver
% % ***************************************
% solver(i) = emptysolver;
% solver(i).tag     = 'minmax';
% solver(i).version = '';
% solver(i).checkfor= {'callminmax'};
% solver(i).call    = 'callminmax';
% solver(i).objective.linear = 1;
% solver(i).objective.sigmonial = 0;
% solver(i).objective.polynomial = 0;
% solver(i).objective.quadratic.convex = 0;
% solver(i).constraint.equalities.linear = 1;
% solver(i).constraint.inequalities.elementwise.linear = 1;
% solver(i).constraint.inequalities.elementwise.sigmonial = 0;
% solver(i).constraint.inequalities.elementwise.polynomial = 0;
% solver(i).constraint.inequalities.semidefinite.linear = 0;
% solver(i).constraint.inequalities.secondordercone = 0;
% solver(i).constraint.inequalities.rotatedsecondordercone = 0;
% solver(i).constraint.integer = 0;
% solver(i).constraint.binary = 0;
% i = i+1;

% % ***************************************
% % SOMEWHAT MORE COMPLEX DEFINITIONS OF
% % THE INTERNAL MICP SOLVER
% % ***************************************
solver(i) = emptysolver;
solver(i).tag     = 'CUTSDP';
solver(i).version = '';
solver(i).checkfor= {'cutsdp'};
solver(i).call    = 'cutsdp';
solver(i).objective.linear = 1;
solver(i).objective.sigmonial = 0;
solver(i).objective.polynomial = 0;
solver(i).objective.quadratic.convex = 1;
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.inequalities.elementwise.linear = 1;
solver(i).constraint.inequalities.semidefinite.linear = 1;
solver(i).constraint.integer = 1;
solver(i).constraint.binary = 1;
solver(i).dual = 1;
i = i+1;

% ***************************************
% SOMEWHAT MORE COMPLEX DEFINITIONS OF
% THE INTERNAL GLOBAL BMI SOLVER
% ***************************************
solver(i) = emptysolver;
solver(i).tag     = 'BMIBNB';
solver(i).version = '';
solver(i).checkfor= {'bmibnb'};
solver(i).call    = 'bmibnb';
solver(i).objective.linear = 1;
solver(i).objective.quadratic.convex = 1;
solver(i).objective.quadratic.nonconvex = 1;
solver(i).objective.polynomial = 1;
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.equalities.polynomial = 1;
solver(i).constraint.inequalities.elementwise.linear = 1;
solver(i).constraint.inequalities.elementwise.quadratic.convex = 1;
solver(i).constraint.inequalities.elementwise.quadratic.nonconvex = 1;
solver(i).constraint.inequalities.elementwise.polynomial = 1;
solver(i).constraint.inequalities.semidefinite.linear = 1;
solver(i).constraint.inequalities.semidefinite.quadratic = 1;
solver(i).constraint.inequalities.semidefinite.polynomial = 1;
solver(i).constraint.inequalities.secondordercone = 1;
solver(i).constraint.inequalities.rotatedsecondordercone = 1;
solver(i).constraint.inequalities.rank = 0;
solver(i).constraint.binary  = 1;
solver(i).constraint.integer = 1;
solver(i).evaluation = 1;
i = i+1;

solver(i) = qpsolver;
solver(i).tag     = 'kktqp';
solver(i).version = '';
solver(i).checkfor= {'kktqp'};
solver(i).call    = 'kktqp';
solver(i).objective.linear = 1;
solver(i).objective.quadratic.convex = 1;
solver(i).objective.quadratic.nonconvex = 1;
solver(i).constraint.equalities.linear = 0;
solver(i).constraint.inequalities.elementwise.linear = 1;
i = i+1;

solver(i) = emptysolver;
solver(i).tag     = 'none';
solver(i).version = '';
solver(i).checkfor= {'callnone.m'};
solver(i).call    = 'callnone';
solver(i).objective.linear = 1;
solver(i).constraint.equalities.linear = 1;
solver(i).constraint.inequalities.elementwise.linear = 1;
solver(i).constraint.inequalities.elementwise.quadratic.convex = 1;
solver(i).constraint.inequalities.elementwise.quadratic.nonconvex = 1;
solver(i).constraint.inequalities.semidefinite.linear = 1;
solver(i).constraint.inequalities.semidefinite.quadratic = 1;
i = i+1;