1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
% ********************************************************************
% Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.
% ********************************************************************
function [T,Q] = print_prob( A, dir_in )
%
% [T,Q] = print_prob( A [, dir] )
%
%
% Given a sparse matrix, write out the permutations and factorization
%
% The files are created in the current local directory by default
% If optional "dir" is given, the files are created under that directory
dir = '.';
if (nargin >= 2),
dir = dir_in;
is_absolute_dir = (dir(1) == '/');
if (is_absolute_dir),
[status,msg,msgid] = mkdir('',dir);
else
[status,msg,msgid] = mkdir('.',dir);
end;
isok = (status == 1);
if (~isok),
error(sprintf('print_prob: mkdir for %s return msg=%s, msgid=%g', ...
dir, msg, msgid ));
return;
end;
end;
has_final_slash = (dir( numel(dir) ) == '/');
if (~has_final_slash),
dir = strcat(dir,'/');
end;
nrow = size(A,1);
ncol = size(A,2);
[Ap,Ai,Ax] = sparse2csr( A );
print_gvec(strcat(dir,'ptrA'),Ap);
print_gvec(strcat(dir,'indA'),Ai);
print_gvec(strcat(dir,'valA'),Ax);
m = 30;
X = reshape( 1:(ncol*m), ncol, m );
B = A * X;
print_gvec(strcat(dir,'X_30'),X(:,1:30));
print_gvec(strcat(dir,'X_10'),X(:,1:10));
print_gvec(strcat(dir,'X_1'),X(:,1:1));
print_gvec(strcat(dir,'B_30'),B(:,1:30));
print_gvec(strcat(dir,'B_10'),B(:,1:10));
print_gvec(strcat(dir,'B_1'),B(:,1:1));
[L, is_indefinite, Q] = chol(A,'lower');
if (is_indefinite),
% perform LU instead
[L,U,P,Q] = lu(A);
np = size(P,2);
pvec = P*reshape(1:np,np,1);
pvec = pvec - 1;
print_gvec(strcat(dir,'P'),pvec);
nq = size(Q,2);
qvec = Q * reshape(1:nq,nq,1);
qvec = qvec - 1;
print_gvec(strcat(dir,'Q'),qvec);
T = tril(L,-1) + triu(U);
else
tiny = 1e-100;
T = L + triu(L',1)*tiny + triu(Q'*A*Q,1);
nq = size(Q,2);
qvec = Q * reshape(1:nq,nq,1);
qvec = qvec - 1;
print_gvec(strcat(dir,'Q'),qvec);
end
[Tp,Ti,Tx] = sparse2csr( T );
print_gvec(strcat(dir,'ptrT'),Tp);
print_gvec(strcat(dir,'indT'),Ti);
print_gvec(strcat(dir,'valT'),Tx);
end
|