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

84 lines
2.5 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
%%******************************************************************
%% combine_blk: combine small SDP blocks together,
%% combine all SOCP blocks together, etc
%%
%% [blk2,At2,C2,blkinfo] = combine_blk(blk,At,C);
%%
%%*****************************************************************
%% SDPT3: version 4.0
%% Copyright (c) 1997 by
%% K.C. Toh, M.J. Todd, R.H. Tutuncu
%% Last Modified: 16 Sep 2004
%%*****************************************************************
function [blk2,At2,C2,blkinfo] = combine_blk(blk,At,C);
blkinfo = zeros(size(blk,1),1);
for p = 1:size(blk,1)
pblk = blk(p,:);
if strcmp(pblk{1},'s')
if (sum(pblk{2}) < 100)
blkinfo(p) = 1;
end
elseif strcmp(pblk{1},'q')
blkinfo(p) = 2;
elseif strcmp(pblk{1},'r')
blkinfo(p) = 3;
elseif strcmp(pblk{1},'l')
blkinfo(p) = 4;
elseif strcmp(pblk{1},'u')
blkinfo(p) = 5;
end
end
numblk0 = length(find(blkinfo == 0));
numblk = numblk0 + length(union(blkinfo(blkinfo > 0),[]));
blk2 = cell(numblk,2); At2 = cell(numblk,1); C2 = cell(numblk,1);
cnt = 0;
idx = find(blkinfo==0); %% larger SDP blocks
if ~isempty(idx)
len = length(idx);
blk2(1:len,:) = blk(idx,:);
At2(1:len) = At(idx); C2(1:len) = C(idx);
cnt = len;
end
idx = find(blkinfo==1); %% smaller SDP blocks
Ctmp = []; idxstart = 0;
if ~isempty(idx)
cnt = cnt + 1;
blk2{cnt,1} = 's'; blk2{cnt,2} = [];
len = length(idx);
for k = 1:len
blk2{cnt,2} = [blk2{cnt,2}, blk{idx(k),2}];
At2{cnt} = [At2{cnt}; At{idx(k)}];
[ii,jj,vv] = find(C{idx(k)});
Ctmp = [Ctmp; [idxstart+ii,idxstart+jj,vv]];
idxstart = idxstart + sum(blk{idx(k),2});
end
end
n = sum(blk2{cnt,2});
C2{cnt} = spconvert([Ctmp; n,n,0]);
%%
for L = [2:5]
idx = find(blkinfo==L);
if ~isempty(idx)
cnt = cnt + 1;
if (L==2)
blk2{cnt,1} = 'q';
elseif (L==3)
blk2{cnt,1} = 'r';
elseif (L==4)
blk2{cnt,1} = 'l';
elseif (L==5)
blk2{cnt,1} = 'u';
end
blk2{cnt,2} = [];
len = length(idx);
for k = 1:len
blk2{cnt,2} = [blk2{cnt,2}, blk{idx(k),2}];
At2{cnt} = [At2{cnt}; At{idx(k)}];
C2{cnt} = [C2{cnt}; C{idx(k)}];
end
end
end
%%*******************************************************************