153 lines
4.9 KiB
Matlab
Executable File
153 lines
4.9 KiB
Matlab
Executable File
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
|