78 lines
2.8 KiB
Matlab
Executable File
78 lines
2.8 KiB
Matlab
Executable File
%%*****************************************************************
|
|
%% sortA: sort columns of At{p} in ascending order according to the
|
|
%% number of nonzero elements.
|
|
%%
|
|
%% [At,C,b,X0,Z0,permA,permZ] = sortA(blk,At,C,b,X0,Z0);
|
|
%%*****************************************************************
|
|
%% SDPT3: version 4.0
|
|
%% Copyright (c) 1997 by
|
|
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
|
|
%% Last Modified: 16 Sep 2004
|
|
%%*****************************************************************
|
|
|
|
function [At,C,Cnew,X0,Z0,permA,invpermA,permZ] = ...
|
|
HSDsortA(blk,At,C,Cnew,b,X0,Z0);
|
|
|
|
global spdensity smallblkdim
|
|
%%
|
|
numblk = size(blk,1);
|
|
m = length(b);
|
|
nnzA = zeros(numblk,m);
|
|
permA = kron(ones(numblk,1),[1:m]);
|
|
invpermA = kron(ones(numblk,1),[1:m]);
|
|
permZ = cell(size(blk,1),1);
|
|
%%
|
|
for p=1:size(blk,1)
|
|
pblk = blk(p,:);
|
|
n = sum(pblk{2});
|
|
numblk = length(pblk{2});
|
|
if strcmp(pblk{1},'s') & (max(pblk{2}) > smallblkdim)
|
|
n2 = sum(pblk{2}.*pblk{2}); n22 = sum(pblk{2}.*(pblk{2}+1))/2;
|
|
m1 = size(At{p,1},2);
|
|
if (length(pblk{2}) == 1)
|
|
tmp = abs(C{p}) + abs(Z0{p});
|
|
if (~isempty(At{p,1}))
|
|
tmp = tmp + smat(blk(p,:),abs(At{p,1})*ones(m1,1),1);
|
|
end
|
|
if (nnz(tmp) < spdensity*n22);
|
|
per = symamd(tmp);
|
|
invper = zeros(n,1); invper(per) = [1:n];
|
|
permZ{p} = invper;
|
|
if (~isempty(At{p,1}))
|
|
isspAt = issparse(At{p,1});
|
|
for k = 1:m1
|
|
Ak = smat(pblk,At{p,1}(:,k),1);
|
|
At{p,1}(:,k) = svec(pblk,Ak(per,per),isspAt);
|
|
end
|
|
end
|
|
C{p} = C{p}(per,per);
|
|
Z0{p} = Z0{p}(per,per);
|
|
X0{p} = X0{p}(per,per);
|
|
Cnew{p} = Cnew{p}(per,per);
|
|
else
|
|
per = [];
|
|
end
|
|
if (length(pblk) > 2) & (~isempty(per))
|
|
m2 = length(pblk{3});
|
|
P = spconvert([(1:n)', per', ones(n,1)]);
|
|
At{p,2} = P*At{p,2};
|
|
end
|
|
end
|
|
if ~isempty(At{p,1}) & (mexnnz(At{p,1}) < m*n22/2)
|
|
for k = 1:m1
|
|
Ak = At{p,1}(:,k);
|
|
nnzA(p,k) = length(find(abs(Ak) > eps));
|
|
end
|
|
[dummy,permAp] = sort(nnzA(p,1:m1));
|
|
At{p,1} = At{p,1}(:,permAp);
|
|
permA(p,1:m1) = permAp;
|
|
invpermA(p,permAp) = [1:m1];
|
|
end
|
|
elseif strcmp(pblk{1},'q') | strcmp(pblk{1},'l') | strcmp(pblk{1},'u');
|
|
if ~issparse(At{p,1});
|
|
At{p,1} = sparse(At{p,1});
|
|
end
|
|
end
|
|
end
|
|
%%*********************************************************************
|