Dynamic-Calibration/utils/SDPT3-4.0/Solver/detect_ublk.m

91 lines
3.1 KiB
Matlab
Executable File

%%*******************************************************************
%% detect_ublk: search for implied free variables in linear
%% block.
%% [blk2,At2,C2,ublkinfo] = detect_ublk(blk,At,C);
%%
%% i1,i2: indices corresponding to splitting of unrestricted varaibles
%% i3 : remaining indices in the linear block
%%*****************************************************************
%% SDPT3: version 4.0
%% Copyright (c) 1997 by
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
%% Last Modified: 16 Sep 2004
%%*****************************************************************
function [blk2,At2,C2,ublkinfo,parbarrier2,X2,Z2] = ...
detect_ublk(blk,At,C,parbarrier,X,Z,printlevel);
if (nargin < 7); printlevel = 1; end
blk2 = blk; At2 = At; C2 = C;
if (nargin >= 6)
parbarrier2 = parbarrier;
X2 = X; Z2 = Z;
else
X2 = []; Z2 = [];
end
numblk = size(blk,1);
ublkinfo = cell(size(blk,1),3);
tol = 1e-14;
%%
numblknew = numblk;
%%
for p = 1:numblk
pblk = blk(p,:);
m = size(At{p},2);
if strcmp(pblk{1},'l')
r = randmat(1,m,0,'n');
stime = cputime;
Ap = At{p}'; Cp = C{p};
ApTr = (r*Ap)';
[dummy,II] = intersect(ApTr,-ApTr);
if ~isempty(II)
[tmp,perm] = sort(abs(ApTr(II)));
idx0 = find(diff(tmp) < tol);
i1 = II(perm(idx0));
i2 = II(perm(idx0+1));
n = pblk{2};
Api1 = Ap(:,i1);
Api2 = Ap(:,i2);
Cpi1 = Cp(i1)';
Cpi2 = Cp(i2)';
if ~isempty(i1)
idxzr = find(abs(Cpi1+Cpi2) < tol & sum(abs(Api1+Api2),1) < tol);
else
idxzr = [];
end
if ~isempty(idxzr)
i1 = i1(idxzr');
i2 = i2(idxzr');
blk2{p,1} = 'u';
blk2{p,2} = length(i1);
At2{p} = Ap(:,i1)';
C2{p} = Cp(i1);
if (printlevel)
fprintf('\n %1.0d linear variables from unrestricted variable.\n',...
2*length(i1));
end
if (nargin >= 6)
parbarrier2{p} = parbarrier{p}(i1);
X2{p} = X{p}(i1)-X{p}(i2);
Z2{p} = zeros(length(i1),1);
end
i3 = setdiff([1:n],union(i1,i2));
if ~isempty(i3)
numblknew = numblknew + 1;
blk2{numblknew,1} = 'l';
blk2{numblknew,2} = length(i3);
At2{numblknew,1} = Ap(:,i3)';
C2{numblknew,1} = Cp(i3);
if (nargin >= 6)
parbarrier2{numblknew,1} = parbarrier{p}(i3);
X2{numblknew,1} = X{p}(i3); Z2{numblknew,1} = Z{p}(i3);
end
end
ublkinfo{p,1} = i1; ublkinfo{p,2} = i2; ublkinfo{p,3} = i3;
end
end
end
end
%%*******************************************************************