1
/* Compute the row counts of the Cholesky factor L of the matrix A. Uses
2
* the lower triangular part of A. */
7
void firstdesc (CS_INT n, CS_INT *parent, CS_INT *post, CS_INT *first,
10
CS_INT len, i, k, r, s ;
11
for (i = 0 ; i < n ; i++) first [i] = -1 ;
12
for (k = 0 ; k < n ; k++)
14
i = post [k] ; /* node i of etree is kth postordered node */
15
len = 0 ; /* traverse from i towards the root */
16
for (r = i ; r != -1 && first [r] == -1 ; r = parent [r], len++)
18
len += (r == -1) ? (-1) : level [r] ; /* root node or end of path */
19
for (s = i ; s != r ; s = parent [s]) level [s] = len-- ;
23
/* return rowcount [0..n-1] */
25
CS_INT *rowcnt (cs_dl *A, CS_INT *parent, CS_INT *post)
27
CS_INT i, j, k, len, s, p, jprev, q, n, sparent, jleaf, *Ap, *Ai, *maxfirst,
28
*ancestor, *prevleaf, *w, *first, *level, *rowcount ;
29
n = A->n ; Ap = A->p ; Ai = A->i ; /* get A */
30
w = cs_dl_malloc (5*n, sizeof (CS_INT)) ; /* get workspace */
31
ancestor = w ; maxfirst = w+n ; prevleaf = w+2*n ; first = w+3*n ;
33
rowcount = cs_dl_malloc (n, sizeof (CS_INT)) ; /* allocate result */
34
firstdesc (n, parent, post, first, level) ; /* find first and level */
35
for (i = 0 ; i < n ; i++)
37
rowcount [i] = 1 ; /* count the diagonal of L */
38
prevleaf [i] = -1 ; /* no previous leaf of the ith row subtree */
39
maxfirst [i] = -1 ; /* max first[j] for node j in ith subtree */
40
ancestor [i] = i ; /* every node is in its own set, by itself */
42
for (k = 0 ; k < n ; k++)
44
j = post [k] ; /* j is the kth node in the postordered etree */
45
for (p = Ap [j] ; p < Ap [j+1] ; p++)
48
q = cs_dl_leaf (i, j, first, maxfirst, prevleaf, ancestor, &jleaf) ;
49
if (jleaf) rowcount [i] += (level [j] - level [q]) ;
51
if (parent [j] != -1) ancestor [j] = parent [j] ;
62
const mxArray *pargin [ ]
67
CS_INT i, m, n, *parent, *post, *rowcount ;
69
if (nargout > 1 || nargin != 3)
71
mexErrMsgTxt ("Usage: r = cs_rowcnt(A,parent,post)") ;
75
A = cs_dl_mex_get_sparse (&Amatrix, 1, 0, pargin [0]) ;
78
parent = cs_dl_mex_get_int (n, pargin [1], &i, 0) ;
79
post = cs_dl_mex_get_int (n, pargin [2], &i, 1) ;
81
rowcount = rowcnt (A, parent, post) ;
83
pargout [0] = mxCreateDoubleMatrix (1, n, mxREAL) ;
84
x = mxGetPr (pargout [0]) ;
85
for (i = 0 ; i < n ; i++) x [i] = rowcount [i] ;
87
cs_dl_free (rowcount) ;