Dynamic-Calibration/utils/SDPT3-4.0/HSDSolver/HSDsortA.m

78 lines
2.8 KiB
Mathematica
Raw Permalink Normal View History

2019-12-18 11:25:45 +00:00
%%*****************************************************************
%% 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
%%*********************************************************************