95 lines
3.1 KiB
Matlab
Executable File
95 lines
3.1 KiB
Matlab
Executable File
function [VariableType,F] = robust_classify_variables_newest(F,h,ops,w);
|
|
|
|
% Variables before expanding nonlinear operators
|
|
initial_variables = unique([depends(F) depends(h)]);
|
|
|
|
% Uncertain variables
|
|
w_variables = getvariables(w);
|
|
|
|
% Decision variables
|
|
x_variables = 1:yalmip('nvars');
|
|
x_variables = setdiff(x_variables,w_variables);
|
|
|
|
% These can have complicated dependence
|
|
extended = yalmip('extvariables');
|
|
|
|
% so we know for sure this are simple variables without any w-dependence
|
|
x_variables = setdiff(x_variables,extended);
|
|
aux_variables = [];
|
|
|
|
Graph = [];
|
|
aux_without_w_dependence = [];
|
|
aux_with_only_w_dependence = [];
|
|
aux_with_w_dependence = [];
|
|
Graph = [];
|
|
|
|
if ~isempty(extended) & any(ismember(initial_variables,extended))
|
|
|
|
% Remove auxilliary variables (defined by YALMIP)
|
|
aux_variables = intersect(extended,x_variables);
|
|
% These variables are original decision variables
|
|
x_variables = setdiff(x_variables,aux_variables);
|
|
x_variables = setdiff(x_variables,[extended yalmip('auxvariables')]);
|
|
|
|
% Original constraint index
|
|
id = getlmiid(F(find(~lifted(F))));
|
|
|
|
% This is a tweak to allow epxansion of bilinear terms in robust problems,
|
|
% is expression such as abs(x*w) < 1 for all -1 < w < 1
|
|
ops.expandbilinear = 1;
|
|
|
|
% Expand the model to model norms etc
|
|
[F,failure,cause] = expandmodel(F,h,ops,w);
|
|
if failure % Convexity propgation failed
|
|
interfacedata = [];
|
|
recoverdata = [];
|
|
solver = '';
|
|
diagnostic.solvertime = 0;
|
|
diagnostic.problem = 14;
|
|
diagnostic.info = yalmiperror(14,cause);
|
|
x = [];
|
|
w = [];
|
|
x_variables=[];
|
|
w_variables=[];
|
|
F = [];
|
|
return
|
|
end
|
|
|
|
|
|
Graph = yalmip('getdependence');
|
|
Graph = Graph + speye(length(Graph));
|
|
Graph0 = Graph*Graph;
|
|
Graph0 = double(Graph0 | Graph0);
|
|
while ~isequal(Graph,Graph0)
|
|
Graph = Graph0;
|
|
Graph0 = Graph*Graph;
|
|
Graph0 = double(Graph0 | Graph0);
|
|
end
|
|
|
|
extended = union(extended, yalmip('auxvariables'));
|
|
% Which auxilliary variables depends only on w?
|
|
aux_with_only_w_dependence = extended(find(any(Graph(extended,w_variables),2) & ~any(Graph(extended,x_variables),2)));
|
|
|
|
% Which auxilliary variables depends on w somehow?
|
|
aux_with_w_dependence = extended(find((any(Graph(extended,w_variables),2))));
|
|
aux_with_w_dependence = setdiff(extended(find((any(Graph(extended,w_variables),2)))),aux_with_only_w_dependence);
|
|
|
|
% Only models x
|
|
aux_without_w_dependence = extended(find(~(any(Graph(extended,w_variables),2))));
|
|
|
|
x_variables = union(aux_without_w_dependence, x_variables);
|
|
end
|
|
|
|
allvariables = [depends(F) depends(h)];
|
|
x_variables = intersect(allvariables,x_variables);
|
|
w_variables = intersect(allvariables,w_variables);
|
|
|
|
x = recover(x_variables);
|
|
w = recover(w_variables);
|
|
|
|
VariableType.Graph = Graph;
|
|
VariableType.x_variables = x_variables;
|
|
VariableType.w_variables = w_variables;
|
|
VariableType.aux_with_w_dependence = intersect(aux_with_w_dependence,allvariables);
|
|
VariableType.aux_with_only_w_dependence = intersect(aux_with_only_w_dependence,allvariables);
|