📄 callbmialt.m
字号:
function diagnostic = callbmialt(F,h,options)
%
% EXTREMELY naive implementation of a local BMI solver
% using alternating directions.
%
% The default behaviour of the solver can be
% altered be using the field bmialt in sdpsettings.
%
% Recover all used variables
x_vars = depends(F);
all_vars = getvariables(F);
% Nonlinear variables
nonlin_variables = setdiff(all_vars,x_vars);
x_nonlin = recover(nonlin_variables);
set1_vars = [];
set2_vars = [];
for i = 1:length(x_nonlin);
xi_vars = depends(x_nonlin(i));
if length(xi_vars)~=2
error('Not bilinear')
end
if isempty(set1_vars)
set1_vars = xi_vars(1);
set2_vars = xi_vars(2);
else
% index = [ismember(xi_vars(1),set1_vars) ismember(xi_vars(2),set1_vars) ismember(xi_vars(1),set2_vars) ismember(xi_vars(2),set2_vars)];
if ismember(xi_vars(1),set1_vars)
set2_vars = [set2_vars xi_vars(2)];
elseif ismember(xi_vars(1),set2_vars)
set1_vars = [set1_vars xi_vars(2)];
elseif ismember(xi_vars(2),set1_vars)
set2_vars = [set2_vars xi_vars(1)];
elseif ismember(xi_vars(2),set2_vars)
set1_vars = [set1_vars xi_vars(1)];
end
end
end
set1_vars = unique(set1_vars);
set2_vars = unique(set2_vars);
x = recover(x_vars);
x1 = recover(set1_vars);
x2 = recover(set2_vars);
% Set up for local solver
verbose = options.verbose;
options.verbose = max(options.verbose-1,0);
options.solver = options.bmilin.solver;
% Initial values hopefully supplied
if options.usex0
% Initialize to 0 if not initialized
not_initial = isnan(double(x));
if any(not_initial)
setsdpvar(x(find(not_initial)),repmat(0,length(find(not_initial)),1));
end
else
% No initials, set to zero
setsdpvar(x,repmat(0,length(x),1));
F_linear = F(find(is(F,'linear')));
% Find some non-zero by solving for the linear constraints
if length(F_linear) > 0
solvesdp(F_linear,linearize(h)+x'*x,options);
end
end
% Outer linearization loop
goon = 1;
outer_iter = 0;
while goon
% Save old iterates and old objective function
x0 = double(x);
h0 = double(h);
Flin0 = replace(F,x1,double(x1));
obj1 = replace(h,x1,double(x1));
Flin = set([]);
for i = 1:length(Flin0)
if isa(sdpvar(Flin0(i)),'sdpvar')
Flin = Flin + Flin0(i);
end
end
% Solve linearized problem
solvesdp(Flin,obj1,options);
if verbose > 0
disp(sprintf('#%d cost : %6.3f ',outer_iter,double(h)));
end
Flin0 = replace(F,x2,double(x2));
obj1 = replace(h,x2,double(x2));
Flin = set([]);
for i = 1:length(Flin0)
if isa(sdpvar(Flin0(i)),'sdpvar')
Flin = Flin + Flin0(i);
end
end
% Solve linearized problem
solvesdp(Flin,obj1,options);
outer_iter = outer_iter + 1;
if verbose > 0
disp(sprintf('#%d cost : %6.3f ',outer_iter,double(h)));
end
goon = (outer_iter < options.bmilin.maxiter);
end
diagnostic.solvertime = 0;
diagnostic.info = yalmiperror(0,'BMILIN');
diagnostic.problem = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -