Dynamic-Calibration/utils/YALMIP-master/modules/global/decide_branch_variables.m

63 lines
1.7 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
function vars = decide_branch_variables(p)
if size(p.bilinears,1)==0
if p.K.s(1)>0
if any(p.K.s>p.K.rank)
vars = p.linears;
return
end
end
end
if p.options.bmibnb.lowrank==0
nonlinear = find(~(sum(p.monomtable~=0,2)==1 & sum(p.monomtable,2)==1));
vars = find(sum(abs(full(p.monomtable(nonlinear,:))),1));
if ~isempty(p.evalVariables)
temp = [];
for i = 1:length(p.evalMap)
temp = [temp p.evalMap{i}.variableIndex];
end
vars = union(vars,temp);
end
else
% Try to find a bi-partite structure
pool1 = p.bilinears(1,2);
pool2 = p.bilinears(1,3);
for i = 2:size(p.bilinears,1)
v1 = p.bilinears(i,2);
v2 = p.bilinears(i,3);
if v1==v2
% We are fucked
pool1 = [pool1 v1];
pool2 = [pool2 v2];
else
if ismember(v1,pool1)
pool2 = [pool2 v2];
elseif ismember(v1,pool2)
pool1 = [pool1 v2];
elseif ismember(v2,pool1)
pool2 = [pool2 v1];
elseif ismember(v2,pool2)
pool1 = [pool1 v1];
else
% No member yet
pool1 = [pool1 v1];
pool2 = [pool2 v2];
end
end
end
pool1 = unique(pool1);
pool2 = unique(pool2);
if isempty(intersect(pool1,pool2))
if length(pool1)<=length(pool2)
vars = pool1;
else
vars = pool2;
end
else
nonlinear = find(~(sum(p.monomtable~=0,2)==1 & sum(p.monomtable,2)==1));
vars = find(sum(abs(full(p.monomtable(nonlinear,:))),1));
end
end