5 CS_INT i, k, p, pa, n = A->n, m = A->m, *Ap = A->p, *Ai = A->i, *next, *head,
6 *tail, *nque, *pinv, *leftmost, *w, *parent = S->parent ;
10 if (!pinv || !w || !leftmost)
15 next = w ; head = w + m ; tail = w + m + n ; nque = w + m + 2*n ;
16 for (k = 0 ; k < n ; k++) head [k] = -1 ;
17 for (k = 0 ; k < n ; k++) tail [k] = -1 ;
18 for (k = 0 ; k < n ; k++) nque [k] = 0 ;
19 for (i = 0 ; i < m ; i++) leftmost [i] = -1 ;
20 for (k = n-1 ; k >= 0 ; k--)
22 for (p = Ap [k] ; p < Ap [k+1] ; p++)
24 leftmost [Ai [p]] = k ;
27 for (i = m-1 ; i >= 0 ; i--)
31 if (k == -1) continue ;
32 if (nque [k]++ == 0) tail [k] = i ;
38 for (k = 0 ; k < n ; k++)
42 if (i < 0) i = S->m2++ ;
44 if (--nque [k] <= 0) continue ;
46 if ((pa = parent [k]) != -1)
48 if (nque [pa] == 0) tail [pa] = tail [k] ;
49 next [tail [k]] = head [pa] ;
50 head [pa] = next [i] ;
51 nque [pa] += nque [k] ;
54 for (i = 0 ; i < m ; i++)
if (pinv [i] < 0) pinv [i] = k++ ;
62 CS_INT n, k, ok = 1, *post ;
64 if (!
CS_CSC (A))
return (NULL) ;
67 if (!S)
return (NULL) ;
69 if (order && !S->q)
return (
cs_sfree (S)) ;
75 S->cp =
cs_counts (C, S->parent, post, 1) ;
77 ok = C && S->parent && S->cp && cs_vcount (C, S) ;
78 if (ok)
for (S->unz = 0, k = 0 ; k < n ; k++) S->unz += S->cp [k] ;
83 S->unz = 4*(A->p [n]) + n ;
CS_INT * cs_post(const CS_INT *parent, CS_INT n)
CS_INT * cs_etree(const cs *A, CS_INT ata)
CS_INT * cs_amd(CS_INT order, const cs *A)
css * cs_sqr(CS_INT order, const cs *A, CS_INT qr)
void * cs_calloc(CS_INT n, size_t size)
cs * cs_permute(const cs *A, const CS_INT *pinv, const CS_INT *q, CS_INT values)
CS_INT * cs_counts(const cs *A, const CS_INT *parent, const CS_INT *post, CS_INT ata)
void * cs_malloc(CS_INT n, size_t size)