📄 selectsolver.m
字号:
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.inequalities.elementwise.sigmonial | solvers(i).constraint.inequalities.elementwise.polynomial | solvers(i).constraint.inequalities.elementwise.quadratic.nonconvex | solvers(i).constraint.inequalities.elementwise.quadratic.convex | solvers(i).constraint.inequalities.secondordercone | solvers(i).constraint.inequalities.semidefinite.linear;
end
solvers = solvers(find(keep));
end
if ProblemClass.constraint.inequalities.elementwise.linear
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.inequalities.elementwise.sigmonial | solvers(i).constraint.inequalities.elementwise.polynomial | solvers(i).constraint.inequalities.semidefinite.quadratic | solvers(i).constraint.inequalities.elementwise.linear;
end
solvers = solvers(find(keep));
end
% ******************************************************
% Prune based on element-wise constraints
% ******************************************************
if ProblemClass.constraint.equalities.sigmonial
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.inequalities.elementwise.sigmonial | solvers(i).constraint.equalities.sigmonial;
end
solvers = solvers(find(keep));
end
if ProblemClass.constraint.equalities.polynomial
keep = ones(length(solvers),1);
for i = 1:length(solvers)
indirect = solvers(i).constraint.inequalities.elementwise.quadratic.nonconvex | solvers(i).constraint.inequalities.elementwise.sigmonial | solvers(i).constraint.inequalities.elementwise.polynomial;
indirect = indirect | solvers(i).constraint.inequalities.elementwise.sigmonial | solvers(i).constraint.inequalities.elementwise.polynomial;
direct = solvers(i).constraint.equalities.sigmonial | solvers(i).constraint.equalities.polynomial;
keep(i) = direct | indirect;
end
solvers = solvers(find(keep));
end
if ProblemClass.constraint.equalities.quadratic
keep = ones(length(solvers),1);
for i = 1:length(solvers)
indirect = solvers(i).constraint.inequalities.elementwise.sigmonial | solvers(i).constraint.inequalities.elementwise.polynomial | solvers(i).constraint.inequalities.elementwise.quadratic.nonconvex;
direct = solvers(i).constraint.equalities.sigmonial | solvers(i).constraint.equalities.polynomial | solvers(i).constraint.equalities.quadratic;
keep(i) = direct | indirect;
end
solvers = solvers(find(keep));
end
if ProblemClass.constraint.equalities.linear
keep = ones(length(solvers),1);
for i = 1:length(solvers)
indirect = solvers(i).constraint.inequalities.elementwise.linear | solvers(i).constraint.inequalities.elementwise.sigmonial | solvers(i).constraint.inequalities.elementwise.polynomial;
direct = solvers(i).constraint.equalities.linear | solvers(i).constraint.equalities.sigmonial | solvers(i).constraint.equalities.polynomial;
keep(i) = direct | indirect;
end
solvers = solvers(find(keep));
end
% ******************************************************
% Discrete data
% ******************************************************
if ProblemClass.constraint.integer
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.integer;
end
solvers = solvers(find(keep));
end
if ProblemClass.constraint.binary
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.integer | solvers(i).constraint.binary;
end
solvers = solvers(find(keep));
end
% ******************************************************
% Interval data
% ******************************************************
if ProblemClass.interval
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).interval;
end
solvers = solvers(find(keep));
end
% ******************************************************
% Parametric problem
% ******************************************************
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = (ProblemClass.parametric == solvers(i).parametric);
end
solvers = solvers(find(keep));
% ******************************************************
% General functions (exp, log,...)
% ******************************************************
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = (ProblemClass.evaluation <= solvers(i).evaluation);
end
solvers = solvers(find(keep));
% FIX : UUUUUUGLY
if isempty(solvers)
solver = [];
else
if length(options.solver)>0
solver = [];
% FIX : Re-use from above
opsolver = lower(options.solver);
splits = findstr(opsolver,',');
if isempty(splits)
names{1} = opsolver;
else
names = {};
start = 1;
for i = 1:length(splits)
names{i} = opsolver(start:splits(i)-1);
start = splits(i)+1;
end
names{end+1} = opsolver(start:end);
end
temp = solvers;
for i = 1:length(temp)
if length(temp(i).version)>0
temp(i).tag = lower([temp(i).tag '-' temp(i).version]);
end
end
for i = 1:length(names)
if isequal(names{i},'*')
solver = solvers(1);
break
else
j = find(strcmpi(lower({solvers.tag}),names{i}));
if ~isempty(j)
solver = solvers(j(1));
break
end
j = find(strcmpi(lower({temp.tag}),names{i}));
if ~isempty(j)
solver = solvers(j(1));
break
end
end
end
else
solver = solvers(1);
end
end
if isempty(solver)
if length(options.solver)>0 % User selected available solver, but it is not applicable
problem = -4;
else
problem = -2;
end
end
% FIX : Hack when chosing the wrong fmincon thingy
if ~isempty(solver)
c1 = (length(options.solver)==0 | isequal(lower(options.solver),'fmincon')) & isequal(lower(solver.tag),'fmincon') & isequal(solver.version,'geometric');
c2 = (length(options.solver)==0 | isequal(lower(options.solver),'snopt')) & isequal(lower(solver.tag),'snopt') & isequal(solver.version,'geometric');
if c1 | c2
if ~(ProblemClass.objective.sigmonial | ProblemClass.constraint.inequalities.elementwise.sigmonial)
solver.version = 'standard';
solver.call = strrep(solver.call,'gp','');
solver.objective.linear = 1;
solver.objective.quadratic.convex = 1;
solver.objective.quadratic.nonconvex = 1;
solver.objective.polynomial = 1;
solver.objective.sigmonial = 1;
solver.constraint.equalities.elementwise.linear = 1;
solver.constraint.equalities.elementwise.quadratic.convex = 1;
solver.constraint.equalities.elementwise.quadratic.nonconvex = 1;
solver.constraint.equalities.elementwise.polynomial = 1;
solver.constraint.equalities.elementwise.sigmonial = 1;
solver.constraint.inequalities.elementwise.linear = 1;
solver.constraint.inequalities.elementwise.quadratic.convex = 1;
solver.constraint.inequalities.elementwise.quadratic.nonconvex = 1;
solver.constraint.inequalities.elementwise.polynomial = 1;
solver.constraint.inequalities.elementwise.sigmonial = 1;
solver.constraint.inequalities.semidefinite.linear = 1;
solver.constraint.inequalities.semidefinite.quadratic = 1;
solver.constraint.inequalities.semidefinite.polynomial = 1;
solver.dual = 1;
end
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -