134 lines
5.0 KiB
Matlab
Executable File
134 lines
5.0 KiB
Matlab
Executable File
%%***********************************************************************
|
|
%% nzlist: find the combined list of non-zero elements
|
|
%% of Aj, j = 1:k, for each k,
|
|
%% assuming that the Aj's are permuted such that
|
|
%% A1 has the fewest nonzero elements, followed by A2, and so on.
|
|
%%
|
|
%% [isspA,nzlistA,nzlistAsum,isspAy,nzlistAy] = nzlist(blk,At,par)
|
|
%%
|
|
%% isspA(p,k) = 1 if Apk is sparse, 0 if it is dense.
|
|
%% nzlistA = px2 cell array.
|
|
%% nzlistA{p,1}(k) is the starting row index (in C convention)
|
|
%% in the 2-column matrix nzlistA{p,2} that
|
|
%% stores the row and column index of the nonzero elements
|
|
%% of Apk.
|
|
%% nzlistA{p,1}(k) = inf if nnz(Apk) exceeds given threshold.
|
|
%% nzlistAsum = px2 cell array.
|
|
%% nzlistA{p,1}(k) is the starting row index (in C convention)
|
|
%% in the 2-column matrix nzlistA{p,2} that
|
|
%% stores the row and column index of the nonzero elements
|
|
%% of Apk that are not already present
|
|
%% in the combined list from Ap1+...Ap,k-1.
|
|
%% nzlistAy = px1 cell array.
|
|
%% nzlistAy{p} is a 2-column matrix that stores the
|
|
%% row and column index of the nonzero elements of
|
|
%% Ap,1+.... Ap,m.
|
|
%% nzlistAy{p} = inf if the number of nonzero elements
|
|
%% exceeds a given threshold.
|
|
%%*****************************************************************
|
|
%% SDPT3: version 4.0
|
|
%% Copyright (c) 1997 by
|
|
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
|
|
%% Last Modified: 16 Sep 2004
|
|
%%*****************************************************************
|
|
|
|
function [isspA,nzlistA,nzlistAsum,isspAy,nzlistAy] = nzlist(blk,At,par)
|
|
|
|
spdensity = par.spdensity;
|
|
smallblkdim = par.smallblkdim;
|
|
m = par.numcolAt;
|
|
%%
|
|
numblk = size(blk,1);
|
|
isspA = zeros(numblk,m);
|
|
nzlistA = cell(numblk,2); nzlistAsum = cell(numblk,2);
|
|
isspAy = zeros(numblk,1); nzlistAy = cell(numblk,1);
|
|
%%
|
|
for p = 1:size(blk,1)
|
|
pblk = blk(p,:);
|
|
if strcmp(pblk{1},'s') ...
|
|
&& ((max(pblk{2}) > smallblkdim) || (length(pblk{2}) <= 10))
|
|
numblk = length(pblk{2});
|
|
n = sum(pblk{2});
|
|
n2 = sum(pblk{2}.*pblk{2});
|
|
if (numblk == 1)
|
|
nztol = spdensity*n;
|
|
nztol2 = spdensity*n2/2;
|
|
else
|
|
nztol = spdensity*n/2;
|
|
nztol2 = spdensity*n2/4;
|
|
end
|
|
nzlist1 = zeros(1,m+1); nzlist2 = [];
|
|
nzlist3 = zeros(1,m+1); nzlist4 = []; breakyes = zeros(1,2);
|
|
Asum = sparse(n,n);
|
|
%%
|
|
m1 = size(At{p,1},2);
|
|
for k = 1:m1
|
|
Ak = mexsmat(blk,At,1,p,k);
|
|
nnzAk = nnz(Ak);
|
|
isspA(p,k) = ((nnzAk < spdensity*n2) | (numblk > 1));
|
|
if ~all(breakyes)
|
|
[I,J] = find(abs(Ak) > 0);
|
|
%%
|
|
%% nonzero elements of Ak.
|
|
%%
|
|
if (breakyes(1) == 0);
|
|
if (nnzAk <= nztol)
|
|
idx = find(I<=J);
|
|
nzlist1(k+1) = nzlist1(k)+length(idx);
|
|
nzlist2 = [nzlist2; [I(idx), J(idx)] ];
|
|
else
|
|
nzlist1(k+1:m+1) = inf*ones(1,m-k+1);
|
|
breakyes(1) = 1;
|
|
end
|
|
end
|
|
%%
|
|
%% nonzero elements of |A1|+...+|Ak|.
|
|
%%
|
|
if (breakyes(2) == 0)
|
|
nztmp = zeros(length(I),1);
|
|
for t = 1:length(I);
|
|
i=I(t); j=J(t); nztmp(t)=Asum(i,j);
|
|
end
|
|
%% find new nonzero positions when Ak is added to Asum.
|
|
idx = find(nztmp == 0);
|
|
nzlist3(k+1) = nzlist3(k) + length(idx);
|
|
if (nzlist3(k+1) < nztol2);
|
|
nzlist4 = [ nzlist4; [I(idx), J(idx)] ];
|
|
else
|
|
nzlist3(k+1:m+1) = inf*ones(1,m-k+1);
|
|
breakyes(2) = 1;
|
|
end
|
|
Asum = Asum+abs(Ak);
|
|
end
|
|
end
|
|
end
|
|
if (numblk == 1)
|
|
isspAy(p,1) = (nzlist1(m+1) < inf) | (nzlist3(m+1) < inf);
|
|
else
|
|
isspAy(p,1) = 1;
|
|
end
|
|
nzlistA{p,1} = nzlist1; nzlistA{p,2} = nzlist2;
|
|
nzlistAsum{p,1} = nzlist3; nzlistAsum{p,2} = nzlist4;
|
|
%%
|
|
%% nonzero elements of (A1*y1+...Am*ym).
|
|
%%
|
|
if (nzlist3(m+1) < inf);
|
|
if (length(pblk) > 2)
|
|
m2 = length(pblk{3});
|
|
len = sum(pblk{3});
|
|
DD = spconvert([At{p,3}(:,2:4); len, len, 0]);
|
|
Asum = Asum + abs(At{p,2}*DD*At{p,2}');
|
|
end
|
|
[I,J] = find(Asum > 0);
|
|
if (length(I) < nztol2)
|
|
nzlistAy{p} = [I, J];
|
|
else
|
|
nzlistAy{p} = inf;
|
|
end
|
|
else
|
|
nzlistAy{p} = inf;
|
|
end
|
|
end
|
|
end
|
|
%%***********************************************************************
|