Dynamic-Calibration/utils/YALMIP-master/modules/robust/robust_classify_variables_n...

153 lines
4.9 KiB
Mathematica
Raw Permalink Normal View History

2019-12-18 11:25:45 +00:00
function [VariableType,F_x,F_w,F_xw,h] = robust_classify_variables_newest(F,h,ops,w);
Dependency = iterateDependance( yalmip('monomtable') | yalmip('getdependence') | yalmip('getdependenceUser'));
DependsOnw = find(any((Dependency(:,getvariables(w))),2));
h_variables = getvariables(h);
h_w = find(ismember(h_variables,DependsOnw));
if ~isempty(h_w)
base = getbase(h);
h0 = base(1);
base = base(2:end);base = base(:);
sdpvar t
F = [F,base(h_w(:))'*recover(h_variables(h_w)) <= t];
base(h_w) = 0;
h = base(:)'*recover(h_variables) + t;
Dependency = iterateDependance(yalmip('monomtable') | yalmip('getdependence') | yalmip('getdependenceUser'));
DependsOnw = find(any((Dependency(:,getvariables(w))),2));
end
DoesNotDependOnw = find(~any((Dependency(:,getvariables(w))),2));
[notused,x_variables] = find(Dependency(DoesNotDependOnw,:));
F_w = [];
F_x = [];
F_xw = [];
for i = 1:length(F)
F_vars = getvariables(F(i));
F_vars = find(any((Dependency(F_vars,:)),1));
if all(ismember(F_vars,DependsOnw))
F_w = F_w + F(i);
elseif all(ismember(F_vars,DoesNotDependOnw))
F_x = F_x + F(i);
else
F_xw = F_xw + F(i);
end
end
ops.removeequalities = 0;
[F_x,failure,cause] = expandmodel(F_x,h,ops);
[F_w,failure,cause] = expandmodel(F_w,[],ops);
ops.expandbilinear = 1;
ops.reusemodel = 1; % Might be case x+norm(w)<1, norm(w)<1
[F_xw,failure,cause] = expandmodel(F_xw,h,ops,w);
w_variables = depends(F_w);
x_variables = unique([depends(F_x) depends(F_xw) depends(h)]);
x_variables = setdiff(x_variables,w_variables);
% After exanding the conic represntable, we have introduced new variables
Dependency = iterateDependance(yalmip('monomtable') | yalmip('getdependence') | yalmip('getdependenceUser'));
auxiliary = unique([yalmip('extvariables') yalmip('auxvariables')]);
if 1%~isempty(auxiliary)
DependsOnw = find(any((Dependency(:,getvariables(w))),2));
DoesNotDependOnw = find(~any((Dependency(:,getvariables(w))),2));
temp = intersect(DependsOnw,x_variables);
x_variables = setdiff(x_variables,DependsOnw);
aux_with_w_dependence = temp;
else
aux_with_w_dependence = [];
end
% aux_w_or_w = union(aux_with_w_dependence,w_variables);
% old_w_variables = [];
% while ~isequal(w_variables,old_w_variables);
% old_w_variables = w_variables;
% for i = 1:length(F_xw)
% if all(ismember(depends(F_xw(i)),aux_w_or_w))
% if ~any(ismember(depends(F_xw(i)),x_variables))
% new_w = intersect(depends(F_xw(i)),aux_w_or_w);
% w_variables = union(w_variables,new_w);
% aux_with_w_dependence = setdiff(aux_with_w_dependence,new_w);
% goon = 1;
% end
% end
% end
% aux_w_or_w = union(aux_with_w_dependence,w_variables);
% end
x = recover(x_variables);
w = recover(w_variables);
if ~isempty(F_xw)
F_xw_scalar = F_xw(find(is(F_xw,'elementwise') | is(F_xw,'equality')));
F_xw_multi = F_xw - F_xw_scalar;
else
F_xw_scalar = [];
F_xw_multi = F_xw;
end
[MonomTable,Nonlinear] = yalmip('monomtable');
Dependency = yalmip('getdependenceUser');
evar = yalmip('extvariables');
if length(F_xw_scalar)>0
% Optimize dependency graph
X = sdpvar(F_xw_scalar);
Xvar = getvariables(X);
Xbase = getbase(X);Xbase = Xbase(:,2:end);
for i = 1:size(Xbase,1)
used = Xvar(find(Xbase(i,:)));
if any(Nonlinear(used))
used = find(any(MonomTable(used,:),1));
end
auxUsed = intersect(used,aux_with_w_dependence);
if ~isempty(auxUsed)
wUsed = intersect(used,w_variables);
if ~isempty(wUsed)
Dependency(auxUsed,wUsed) = 1;
end
eUsed = intersect(used,evar);
if ~isempty(eUsed)
Dependency(eUsed,auxUsed) = 1;
end
end
end
end
if length(F_xw_multi) > 0
for i = 1:length(F_xw_multi)
used = getvariables(F_xw_multi(i));
used = find(any(MonomTable(used,:),1));
auxUsed = intersect((used),aux_with_w_dependence);
wUsed = intersect((used),w_variables);
if ~isempty(auxUsed) & ~isempty(wUsed)
Dependency(auxUsed,wUsed) = 1;
end
eUsed = intersect((used),evar);
if ~isempty(auxUsed) & ~isempty(eUsed)
Dependency(eUsed,auxUsed) = 1;
end
end
end
UserDependency = yalmip('getdependenceUser');
fixed = find(any(UserDependency,2));
Dependency(fixed,:) = UserDependency(fixed,:);
Dependency = iterateDependance(Dependency);
VariableType.Graph = Dependency;
VariableType.x_variables = x_variables;
VariableType.w_variables = w_variables;
VariableType.aux_with_w_dependence = aux_with_w_dependence;
function Graph = iterateDependance(Graph)
Graph = Graph + speye(length(Graph));
Graph0 = double(Graph*Graph ~=0);
while ~isequal(Graph,Graph0)
Graph = Graph0;
Graph0 = double(Graph*Graph~=0);
end