55 lines
1.8 KiB
Matlab
Executable File
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 |