📄 selectsolver.m
字号:
function [solver,problem] = selectsolver(options,ProblemClass,solvers,socp_are_really_qc);
%SELECTSOLVER Internal function to select solver based on problem category
% Author Johan L鰂berg
% $Id: selectsolver.m,v 1.17 2008/02/14 08:21:31 joloef Exp $
problem = 0;
% UNDOCUMENTED
force_solver = yalmip('solver');
if length(force_solver)>0
options.solver = force_solver;
end
% ***************************************************
% Maybe the user is stubborn and wants to pick solver
% ***************************************************
if length(options.solver)>0 & isempty(findstr(options.solver,'*'))
% Create tags with version also
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
opsolver = lower(options.solver);
splits = findstr(opsolver,',');
if isempty(splits)
names{1} = opsolver;
else
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
index1 = [];
index2 = [];
for i = 1:length(names)
index1 = [index1 find(strcmp(lower({solvers.tag}),names{i}))];
index2 = [index1 find(strcmp(lower({temp.tag}),names{i}))];
end
if isempty(index1) & isempty(index2)
solver = [];
problem = -3;
return;
else
solvers = solvers(union(index1,index2));
end
end
% ************************************************
% Prune based on objective
% ************************************************
if ProblemClass.objective.sigmonial
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).objective.sigmonial;
end
solvers = solvers(find(keep));
end
if ProblemClass.objective.polynomial
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.equalities.quadratic | solvers(i).constraint.inequalities.elementwise.quadratic.nonconvex | solvers(i).objective.polynomial | solvers(i).objective.sigmonial;
end
solvers = solvers(find(keep));
end
if ProblemClass.objective.quadratic.nonconvex
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).objective.polynomial | solvers(i).objective.sigmonial | solvers(i).objective.quadratic.nonconvex;
end
solvers = solvers(find(keep));
end
if ProblemClass.objective.quadratic.convex
keep = ones(length(solvers),1);
for i = 1:length(solvers)
direct = solvers(i).objective.polynomial | solvers(i).objective.sigmonial | solvers(i).objective.quadratic.nonconvex | solvers(i).objective.quadratic.convex;
indirect = solvers(i).constraint.inequalities.semidefinite.linear | solvers(i).constraint.inequalities.secondordercone;
if direct | indirect
keep(i)=1;
else
keep(i)=0;
end
end
solvers = solvers(find(keep));
end
if ProblemClass.objective.linear
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).objective.polynomial | solvers(i).objective.sigmonial | solvers(i).objective.quadratic.nonconvex | solvers(i).objective.quadratic.convex | solvers(i).objective.linear;
end
solvers = solvers(find(keep));
end
if ProblemClass.objective.maxdet
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).objective.maxdet | solvers(i).constraint.inequalities.semidefinite.linear;
end
solvers = solvers(find(keep));
end
% ******************************************************
% Prune based on rank constraints
% ******************************************************
if ProblemClass.constraint.inequalities.rank
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.inequalities.rank;
end
solvers = solvers(find(keep));
end
% ******************************************************
% Prune based on semidefinite constraints
% ******************************************************
if ProblemClass.constraint.inequalities.semidefinite.sigmonial
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.inequalities.semidefinite.sigmonial;
end
solvers = solvers(find(keep));
end
if ProblemClass.constraint.inequalities.semidefinite.polynomial
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.inequalities.semidefinite.sigmonial | solvers(i).constraint.inequalities.semidefinite.polynomial;
end
solvers = solvers(find(keep));
end
if ProblemClass.constraint.inequalities.semidefinite.quadratic
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.inequalities.semidefinite.sigmonial | solvers(i).constraint.inequalities.semidefinite.polynomial | solvers(i).constraint.inequalities.semidefinite.quadratic;
end
solvers = solvers(find(keep));
end
if ProblemClass.constraint.inequalities.semidefinite.linear
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.inequalities.semidefinite.sigmonial | solvers(i).constraint.inequalities.semidefinite.polynomial | solvers(i).constraint.inequalities.semidefinite.quadratic | solvers(i).constraint.inequalities.semidefinite.linear;
end
solvers = solvers(find(keep));
end
% ******************************************************
% Prune based on second order cone constraints
% ******************************************************
if ProblemClass.constraint.inequalities.secondordercone & ~socp_are_really_qc
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.inequalities.secondordercone | solvers(i).constraint.inequalities.semidefinite.linear;
end
solvers = solvers(find(keep));
end
if ProblemClass.constraint.inequalities.rotatedsecondordercone
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.inequalities.rotatedsecondordercone | solvers(i).constraint.inequalities.secondordercone | solvers(i).constraint.inequalities.semidefinite.linear;
end
solvers = solvers(find(keep));
end
% ******************************************************
% Prune based on element-wise inequality constraints
% ******************************************************
if ProblemClass.constraint.inequalities.elementwise.sigmonial
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.inequalities.elementwise.sigmonial;
end
solvers = solvers(find(keep));
end
if ProblemClass.constraint.inequalities.elementwise.polynomial
keep = ones(length(solvers),1);
for i = 1:length(solvers)
keep(i) = solvers(i).constraint.inequalities.elementwise.quadratic.nonconvex | solvers(i).constraint.inequalities.elementwise.sigmonial | solvers(i).constraint.inequalities.elementwise.polynomial;
end
solvers = solvers(find(keep));
end
if ProblemClass.constraint.inequalities.elementwise.quadratic.nonconvex
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.elementwise.quadratic.nonconvex;
end
solvers = solvers(find(keep));
end
if ProblemClass.constraint.inequalities.elementwise.quadratic.convex | (ProblemClass.constraint.inequalities.secondordercone & socp_are_really_qc)
keep = ones(length(solvers),1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -