84 lines
2.5 KiB
Matlab
Executable File
84 lines
2.5 KiB
Matlab
Executable File
%%******************************************************************
|
|
%% 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
|
|
%%*******************************************************************
|