📄 compileinterfacedata.m
字号:
temp_options = options;
temp_options.solver = options.mpcvx.solver;
tempProblemClass = ProblemClass;
tempProblemClass.objective.quadratic.convex = tempProblemClass.objective.quadratic.convex | tempProblemClass.objective.quadratic.nonconvex;
tempProblemClass.objective.quadratic.nonconvex = 0;
tempProblemClass.parametric = 0;
localsolver = selectsolver(temp_options,tempProblemClass,solvers,socp_are_really_qc);
if isempty(localsolver) | strcmpi(localsolver.tag,'bnb') | strcmpi(localsolver.tag,'kktqp')
diagnostic.solvertime = 0;
diagnostic.info = yalmiperror(-2,'YALMIP');
diagnostic.problem = -2;
return
end
solver.lower = localsolver;
end
% *************************************************************************
%% DID WE SELECT THE INTERNAL EXPERIMENTAL KKT SOLVER
% IN THAT CASE, SELECT SOLVER TO SOLVE THE MILP PROBLEM
% *************************************************************************
localsolver.qc = 0;
localsolver = solver;
if strcmpi(solver.tag,'kktqp')
temp_options = options;
temp_options.solver = '';
tempProblemClass = ProblemClass;
tempProblemClass.constraint.binary = 1;
tempProblemClass.objective.quadratic.convex = 0;
tempProblemClass.objective.quadratic.nonconvex = 0;
localsolver = selectsolver(temp_options,tempProblemClass,solvers,socp_are_really_qc);
if isempty(localsolver) | strcmpi(localsolver.tag,'bnb') | strcmpi(localsolver.tag,'kktqp')
diagnostic.solvertime = 0;
diagnostic.info = yalmiperror(-2,'YALMIP');
diagnostic.problem = -2;
return
end
solver.lower = localsolver;
end
% *************************************************************************
%% DID WE SELECT THE LMIRANK?
% FIND SDP SOLVER FOR INITIAL SOLUTION
% *************************************************************************
if strcmpi(solver.tag,'lmirank')
temp_options = options;
temp_options.solver = options.lmirank.solver;
tempProblemClass = ProblemClass;
tempProblemClass.constraint.inequalities.rank = 0;
tempProblemClass.constraint.inequalities.semidefinite.linear = 1;
tempProblemClass.objective.linear = 1;
initialsolver = selectsolver(temp_options,tempProblemClass,solvers,socp_are_really_qc);
if isempty(initialsolver) | strcmpi(initialsolver.tag,'lmirank')
diagnostic.solvertime = 0;
diagnostic.info = yalmiperror(-2,'YALMIP');
diagnostic.problem = -2;
return
end
solver.initialsolver = initialsolver;
end
% *************************************************************************
%% DID WE SELECT THE VSDP SOLVER? Define a solver for VSDP to use
% *************************************************************************
if findstr(solver.tag,'VSDP')
temp_options = options;
temp_options.solver = options.vsdp.solver;
tempProblemClass = ProblemClass;
tempProblemClass.interval = 0;
tempProblemClass.constraint.inequalities.semidefinite.linear = tempProblemClass.constraint.inequalities.semidefinite.linear | tempProblemClass.objective.quadratic.convex;
tempProblemClass.constraint.inequalities.semidefinite.linear = tempProblemClass.constraint.inequalities.semidefinite.linear | tempProblemClass.constraint.inequalities.secondordercone;
tempProblemClass.constraint.inequalities.secondordercone = 0;
tempProblemClass.objective.quadratic.convex = 0;
initialsolver = selectsolver(temp_options,tempProblemClass,solvers,socp_are_really_qc);
if isempty(initialsolver) | strcmpi(initialsolver.tag,'vsdp')
diagnostic.solvertime = 0;
diagnostic.info = yalmiperror(-2,'YALMIP');
diagnostic.problem = -2;
return
end
solver.solver = initialsolver;
end
% *************************************************************************
%% DID WE SELECT THE INTERNAL BMIBNB SOLVER? SELECT UPPER/LOWER SOLVERs
% (UNLESS ALREADY SPECIFIED IN OPTIONS)
% *************************************************************************
if strcmpi(solver.tag,'bmibnb')
% Relax problem for lower solver
tempProblemClass = ProblemClass;
sdp = tempProblemClass.constraint.inequalities.semidefinite;
tempProblemClass.constraint.inequalities.semidefinite.linear = sdp.linear | sdp.quadratic | sdp.polynomial;
tempProblemClass.constraint.inequalities.semidefinite.quadratic = 0;
tempProblemClass.constraint.inequalities.semidefinite.polynomial = 0;
lp = tempProblemClass.constraint.inequalities.elementwise;
tempProblemClass.constraint.inequalities.elementwise.linear = lp.linear | lp.quadratic.convex | lp.quadratic.nonconvex | sdp.polynomial;
tempProblemClass.constraint.inequalities.elementwise.quadratic.convex = 0;
tempProblemClass.constraint.inequalities.elementwise.quadratic.nonconvex = 0;
tempProblemClass.constraint.inequalities.elementwise.polynomial = 0;
tempProblemClass.constraint.inequalities.elementwise.sigmonial = 0;
equ = tempProblemClass.constraint.equalities;
tempProblemClass.constraint.equalities.linear = equ.linear | equ.quadratic | equ.polynomial;
tempProblemClass.constraint.equalities.quadratic = 0;
tempProblemClass.constraint.equalities.polynomial = 0;
tempProblemClass.constraint.equalities.sigmonial = 0;
% if nnz(quad_info.Q) > 0
% if all(eig(quad_info.Q) > -1e-12)
% tempProblemClass.objective.quadratic.convex = 0;
% tempProblemClass.objective.quadratic.nonconvex = 0;
% else
% tempProblemClass.objective.quadratic.convex = 0;
tempProblemClass.objective.quadratic.nonconvex = 0;
tempProblemClass.objective.polynomial = 0;
tempProblemClass.objective.sigmonial = 0;
% end
% end
tempProblemClass.constraint.inequalities.rank = 0;
tempProblemClass.evaluation = 0;
temp_options = options;
temp_options.solver = options.bmibnb.lowersolver;
% If the problem actually is quadratic, try to get a convex problem
% this will typically allow us to solver better lower bounding problems
% (we don't have to linearize the cost)
[lowersolver,problem] = selectsolver(temp_options,tempProblemClass,solvers,socp_are_really_qc);
if isempty(lowersolver)| strcmpi(lowersolver.tag,'bmibnb') | strcmpi(lowersolver.tag,'bnb')
% No, probably non-convex cost. Pick a linear solver instead and go
% for lower bound based on a complete "linearization"
tempProblemClass.objective.quadratic.convex = 0;
[lowersolver,problem] = selectsolver(temp_options,tempProblemClass,solvers,socp_are_really_qc);
end
if isempty(lowersolver)| strcmpi(lowersolver.tag,'bmibnb') | strcmpi(lowersolver.tag,'bnb')
tempbinary = tempProblemClass.constraint.binary;
tempinteger = tempProblemClass.constraint.integer;
tempProblemClass.constraint.binary = 0;
tempProblemClass.constraint.integer = 0;
[lowersolver,problem] = selectsolver(temp_options,tempProblemClass,solvers,socp_are_really_qc);
tempProblemClass.constraint.binary = tempbinary;
tempProblemClass.constraint.integer = tempinteger;
end
if isempty(lowersolver) | strcmpi(lowersolver.tag,'bmibnb') | strcmpi(lowersolver.tag,'bnb')
diagnostic.solvertime = 0;
diagnostic.info = yalmiperror(-2,'YALMIP');
diagnostic.problem = -2;
return
end
solver.lowercall = lowersolver.call;
solver.lowersolver = lowersolver;
temp_options = options;
temp_options.solver = options.bmibnb.uppersolver;
temp_ProblemClass = ProblemClass;
temp_ProblemClass.constraint.binary = 0;
temp_ProblemClass.constraint.integer = 0;
% temp_ProblemClass.objective.quadratic.convex = 0;
% temp_ProblemClass.objective.quadratic.nonconvex = 0;
[uppersolver,problem] = selectsolver(temp_options,temp_ProblemClass,solvers,socp_are_really_qc);
% if ~isempty(uppersolver) & strcmpi(uppersolver.tag,'fmincon-geometric')
%
% [uppersolver,problem] = selectsolver(temp_options,temp_ProblemClass,solvers,socp_are_really_qc);
% end
if ~isempty(uppersolver) & strcmpi(uppersolver.tag,'bnb')
temp_options.solver = 'none';
[uppersolver,problem] = selectsolver(temp_options,temp_ProblemClass,solvers,socp_are_really_qc);
end
if isempty(uppersolver) | strcmpi(uppersolver.tag,'bmibnb')
diagnostic.solvertime = 0;
diagnostic.info = yalmiperror(-2,'YALMIP');
diagnostic.problem = -2;
return
end
if isequal(uppersolver.version,'geometric') & isequal(uppersolver.tag,'fmincon')
uppersolver.version = 'standard';
uppersolver.call = 'callfmincon';
end
if isequal(uppersolver.version,'geometric') & isequal(uppersolver.tag,'ipopt')
uppersolver.version = 'standard';
uppersolver.call = 'callipoptmex';
end
if isequal(uppersolver.version,'geometric') & isequal(uppersolver.tag,'snopt')
uppersolver.version = 'standard';
uppersolver.call = 'callsnopt';
end
if isequal(uppersolver.version,'geometric') & isequal(uppersolver.tag,'pennon')
uppersolver.version = 'standard';
uppersolver.call = 'callpennonm';
end
solver.uppercall = uppersolver.call;
solver.uppersolver = uppersolver;
temp_options = options;
temp_options.solver = options.bmibnb.lpsolver;
tempProblemClass.constraint.inequalities.semidefinite.linear = 0;
tempProblemClass.constraint.inequalities.semidefinite.quadratic = 0;
tempProblemClass.constraint.inequalities.semidefinite.polynomial = 0;
tempProblemClass.constraint.inequalities.secondordercone = 0;
tempProblemClass.objective.quadratic.convex = 0;
tempProblemClass.objective.quadratic.nonconvex = 0;
tempProblemClass.objective.quadratic.nonconvex = 0;
tempProblemClass.objective.polynomial = 0;
tempProblemClass.objective.sigmonial = 0;
[lpsolver,problem] = selectsolver(temp_options,tempProblemClass,solvers,socp_are_really_qc);
if isempty(lowersolver)| strcmpi(lowersolver.tag,'bmibnb')
tempbinary = tempProblemClass.constraint.binary;
tempProblemClass.constraint.binary = 0;
[lpsolver,problem] = selectsolver(temp_options,tempProblemClass,solvers,socp_are_really_qc);
tempProblemClass.constraint.binary = tempbinary;
end
if isempty(lpsolver) | strcmpi(lpsolver.tag,'bmibnb')
diagnostic.solvertime = 0;
diagnostic.info = yalmiperror(-2,'YALMIP');
diagnostic.problem = -2;
return
end
solver.lpsolver = lpsolver;
solver.lpcall = lpsolver.call;
end
% *************************************************************************
%% DID WE SELECT THE INTERNAL SDPMILP SOLVER
% This solver solves MISDP problems by solving MILP problems and adding SDP
% cuts based on the infasible MILP solution.
% *************************************************************************
if strcmpi(solver.tag,'cutsdp')
% Relax problem for lower solver
tempProblemClass = ProblemClass;
tempProblemClass.constraint.inequalities.elementwise.linear = tempProblemClass.constraint.inequalities.elementwise.linear | tempProblemClass.constraint.inequalities.semidefinite.linear | tempProblemClass.constraint.inequalities.secondordercone;
tempProblemClass.constraint.inequalities.semidefinite.linear = 0;
tempProblemClass.constraint.inequalities.secondordercone = 0;
tempProblemClass.objective.quadratic.convex = 0;
temp_options = options;
temp_options.solver = options.cutsdp.solver;
[cutsolver,problem] = selectsolver(temp_options,tempProblemClass,solvers,socp_are_really_qc);
if isempty(cutsolver) | strcmpi(cutsolver.tag,'cutsdp') |strcmpi(cutsolver.tag,'bmibnb') | strcmpi(cutsolver.tag,'bnb')
diagnostic.solvertime = 0;
diagnostic.info = yalmiperror(-2,'YALMIP');
diagnostic.problem = -2;
return
end
solver.cutsolver = cutsolver;
end
showprogress(['Solver chosen : ' solver.tag],options.showprogress);
% *************************************************************************
%% CONVERT MAXDET TO SDP USING GEOMEAN?
% *************************************************************************
% MAXDET using geometric mean construction
if ~isempty(logdetStruct)
if isequal(solver.tag,'BNB')
can_solve_maxdet = solver.lower.objective.maxdet;
else
can_solve_maxdet = solver.objective.maxdet;
end
if ~can_solve_maxdet
t = sdpvar(1,1);
Ptemp = [];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -