Dynamic-Calibration/utils/YALMIP-master/extras/@optproblem/solvebilevel.m

56 lines
1.8 KiB
Matlab
Executable File

function [sol,info] = solvebilevel(varargin)
%SOLVEBILEVEL Simple global bilevel solver
%
% min Objective(Pouter)(x,y)
% subject to Constraints(Pouter)(x,y)>0
% y = arg min Objective(Pinner)(x,y)
% subject to Constraints(Pinner)(x,y)>0
%
% [DIAGNOSTIC,INFO] = SOLVEBILEVEL(Pouter, Pinner, y, options)
%
% diagnostic : Struct with standard YALMIP diagnostics
% info : Bilevel solver specific information
%
% Input
% Pouter : Outer problem
% Pinner : Inner problem
% y : Inner variables
% options : solver options from SDPSETTINGS.
%
% The behaviour of the bilevel solver can be controlled
% using the field 'bilevel' in SDPSETTINGS
%
% bilevel.outersolver : Solver for outer problems with inner KKT removed
% bilevel.innersolver : Solver for inner problem
% bilevel.rootcut : Number of cuts (based on complementary
% constraints) added in root (experimental)
% bilevel.relgaptol : Termination tolerance
% bilevel.compslacktol: Tolerance for accepting complementary slackness
% bilevel.feastol : Tolerance for feasibility in outer problem
%
%
% See also SDPVAR, SDPSETTINGS, SOLVESDP
if isa(varargin{2},'optimizer')
Pout = varargin{1};
s = struct(varargin{2});
if nargin < 3
options = sdpsettings;
else
options = varargin{3};
end
[sol,info] = solvebilevel(Pout.Constraints,Pout.Objective,s.F,s.h,s.output.expression,options)
else
Pout = varargin{1};
Pinn = varargin{2};
y = varargin{3};
if nargin < 4
options = sdpsettings;
else
options = varargin{4};
end
[sol,info] = solvebilevel(Pout.Constraints,Pout.Objective,Pinn.Constraints,Pinn.Objective,y,options)
end