Dynamic-Calibration/utils/YALMIP-master/modules/sos/solvesos_find_blocks.m

55 lines
1.8 KiB
Matlab
Executable File

function [sol,m,Q,residuals,everything] = solvesos_find_blocks(F,obj,options,params,candidateMonomials)
tol = options.sos.numblkdg;
if tol > 1e-2
disp(' ');
disp('-> Are you sure you meant to have a tolerance in numblk that big!')
disp('-> The options numblkdiag controls the tolerance, it is not a 0/1 switch.')
disp(' ');
end
options.sos.numblkdg = 0;
[sol,m,Q,residuals,everything] = solvesos(F,obj,options,params,candidateMonomials);
% Save old structure to find out when we have stalled
for i = 1:length(Q)
oldlengths{i} = length(Q{i});
end
go_on = (sol.problem == 0 | sol.problem == 4);
while go_on
for sosfun = 1:length(Q)
Qtemp = Q{sosfun};
keep = diag(Qtemp)>tol;
Qtemp(:,find(~keep)) = [];
Qtemp(find(~keep),:) = [];
m{sosfun} = m{sosfun}(find(keep));
Qtemp(abs(Qtemp) < tol) = 0;
[v1,dummy1,r1,dummy3]=dmperm(Qtemp+eye(length(Qtemp)));
lengths{sosfun} = [];
n{sosfun} = {};
for blocks = 1:length(r1)-1
i1 = r1(blocks);
i2 = r1(blocks+1)-1;
if i2>i1
n{sosfun}{blocks} = m{sosfun}(v1(i1:i2));
else
n{sosfun}{blocks} = m{sosfun}(v1(i1));
end
lengths{sosfun} = [lengths{sosfun} length(n{sosfun}{blocks})];
end
lengths{sosfun} = sort(lengths{sosfun});
end
go_on = ~isequal(lengths,oldlengths);
oldlengths = lengths;
if go_on
[sol,m,Q,residuals,everything] = solvesos(F,obj,options,params,n);
go_on = go_on & (sol.problem == 0 | sol.problem == 4);
if sol.problem == 1
disp('-> Feasibility was lost during the numerical block-diagonalization.')
disp('-> The setting sos.numblkdiag is probably too big')
end
end
end