112 Int n, hash, head, i, j, k, p, pend, ilen, ilast, pi, piend,
113 jlen, ok, cn, csep, pdest, nodes_pruned, nz, total_weight, jscattered ;
114 Int *Cp, *Ci, *Next, *Hhead ;
118 double work = 0, goodwork = 0 ;
130 PRINT2 ((
"Partition start, n "ID" nz "ID"\n", n, nz)) ;
133 for (j = 0 ; j < n ; j++)
136 total_weight += Cnw [j] ;
142 for (j = 0 ; j < n ; j++)
146 return (total_weight) ;
151 PRINT2 ((
"diagonal matrix\n")) ;
153 for (j = 0 ; j < k ; j++)
167 ASSERT (n > 1 && nz > 0) ;
168 PRINT2 ((
"original graph:\n")) ;
169 for (j = 0 ; j < n ; j++)
172 for (p = Cp [j] ; p < Cp [j+1] ; p++)
176 ASSERT (i >= 0 && i < n && i != j) ;
178 PRINT2 ((
"hash: "ID
"\n", Hash [j])) ;
180 DEBUG (
for (p = 0 ; p < csize ; p++)
ASSERT (Cew [p] == 1)) ;
199 for (j = 0 ; j < n ; j++)
203 ASSERT (hash >= 0 && hash < csize) ;
204 head = Hhead [hash] ;
214 ASSERT (head >= 0 && head < n) ;
219 Hhead [hash] =
FLIP (j) ;
225 for (cnt = 0, k = 0 ; k < n ; k++)
227 ASSERT (Hash [k] >= 0 && Hash [k] < csize) ;
229 ASSERT (hash >= 0 && hash < csize) ;
230 head = Hhead [hash] ;
233 ASSERT (j >= 0 && j < n) ;
236 PRINT2 ((
"hash "ID
": ", hash)) ;
237 for ( ; j !=
EMPTY ; j = Next [j])
240 ASSERT (j >= 0 && j < n) ;
241 ASSERT (Hash [j] == hash) ;
266 #define Cmap_MARK(i) Cmap [i] = j
267 #define Cmap_MARKED(i) (Cmap [i] == j)
269 for (i = 0 ; i < n ; i++)
274 for (k = 0 ; k < n ; k++)
284 head = Hhead [hash] ;
291 PRINT2 ((
"\n--------------------hash "ID
":\n", hash)) ;
292 for (j =
FLIP (head) ; j !=
EMPTY && Next[j] >
EMPTY ; j = Next [j])
295 ASSERT (j >= 0 && j < n && Hash [j] == hash) ;
303 for (i = Next [j] ; i !=
EMPTY ; i = Next [i])
305 ASSERT (i >= 0 && i < n && Hash [i] == hash && i != j) ;
320 for ( ; p < pend ; p++)
325 DEBUG (work += jlen) ;
327 for (ok =
Cmap_MARKED (i) ; ok && pi < piend ; pi++)
335 PRINT2 ((
"found "ID
" absorbed into "ID
"\n", i, j)) ;
336 Hash [i] =
FLIP (j) ;
339 ASSERT (ilast != i && ilast >= 0 && ilast < n) ;
340 Next [ilast] = Next [i] ;
342 DEBUG (goodwork += (ilen+1)) ;
351 DEBUG (
if (pruned) goodwork += jlen) ;
357 DEBUG (
if (((work - goodwork) / (
double) nz) > 0.20)
PRINT0 ((
358 "work %12g good %12g nz %12g (wasted work/nz: %6.2f )\n",
359 work, goodwork, (
double) nz, (work - goodwork) / ((
double) nz)))) ;
367 DEBUG (
for (p = 0 ; p < csize ; p++)
ASSERT (Cew [p] == 1)) ;
368 DEBUG (
for (cnt = 0, j = 0 ; j < n ; j++) cnt += Cnw [j]) ;
369 ASSERT (cnt == total_weight) ;
375 if (nodes_pruned == 0)
383 csep =
CHOLMOD(metis_bisector) (
C, Cnw, Cew, Part, Common) ;
386 else if (nodes_pruned == n-1)
393 PRINT2 ((
"completely dense graph\n")) ;
394 csep = total_weight ;
395 for (j = 0 ; j < n ; j++)
416 for (j = 0 ; j < n ; j++)
421 for (j = 0 ; j < n ; j++)
430 PRINT2 ((
"compressed graph from "ID
" to "ID
" nodes\n", n, cn)) ;
431 ASSERT (cn > 1 && cn == n - nodes_pruned) ;
439 for (j = 0 ; j < n ; j++)
444 ASSERT (k <= j && Cmap [j] == k) ;
449 for ( ; p < pend ; p++)
453 ASSERT (i >= 0 && i < n && i != j) ;
470 PRINT2 ((
"pruned graph ("ID
"/"ID
") nodes, ("ID
"/"ID
") edges\n",
472 PRINT2 ((
"compressed graph:\n")) ;
473 for (cnt = 0, j = 0 ; j < cn ; j++)
476 for (p = Cp [j] ; p < Cp [j+1] ; p++)
480 ASSERT (i >= 0 && i < cn && i != j) ;
482 PRINT2 ((
"weight: "ID
"\n", Cnw [j])) ;
486 ASSERT (cnt == total_weight) ;
487 for (j = 0 ; j < n ; j++)
PRINT2 ((
"Cmap ["ID
"] = "ID
"\n", j, Cmap[j]));
496 csep =
CHOLMOD(metis_bisector) (
C, Cnw, Cew, Part, Common) ;
505 DEBUG (
for (j = 0 ; j < cn ; j++)
PRINT2 ((
""ID
" ", Part [j]))) ;
515 for (j = n-1 ; j >= 0 ; j--)
525 Part [j] = Part [k] ;
538 for (i = 0 ; i < n ; i++)
540 if (Hash [i] <
EMPTY)
543 j =
FLIP (Hash [i]) ;
544 ASSERT (Part [i] ==
EMPTY && j >= 0 && j < n && Cnw [i] == 0) ;
545 Part [i] = Part [j] ;
547 ASSERT (Part [i] >= 0 && Part [i] <= 2) ;
552 for (cnt = 0, j = 0 ; j < n ; j++)
555 PRINT2 ((
""ID
" ", Part [j])) ;
556 if (Part [j] == 2) cnt += Cnw [j] ;
559 PRINT2 ((
"csep "ID
" "ID
"\n", cnt, csep)) ;
561 for (cnt = 0, j = 0 ; j < n ; j++) cnt += Cnw [j] ;
562 ASSERT (cnt == total_weight) ;
571 PRINT2 ((
"Partition done, n "ID
" csep "ID
"\n", n, csep)) ;
600 if (Common->
mark <= 0)
602 nrow = Common->
nrow ;
603 Flag = Common->
Flag ;
604 for (i = 0 ; i < nrow ; i++)
607 if (Flag [i] >=
EMPTY)
615 return (Common->
mark) ;
679 Int n, mark, cj, j, sj, sn, p, i, snode, pstart, pdest, pend, nd_components,
681 Int *Bp, *Bi, *Flag ;
687 PRINT2 ((
"find components: cn %d\n", cn)) ;
688 Flag = Common->
Flag ;
704 part = (Part ==
NULL) ? 0 : 1 ;
707 for (part = (Part ==
NULL) ? 0 : 1 ; part >= 0 ; part--)
714 for (cj = 0 ; cj < cn ; cj++)
719 snode = (Map ==
NULL) ? (cj) : (Map [cj]) ;
720 ASSERT (snode >= 0 && snode < n) ;
722 if (Flag [snode] >=
EMPTY && Flag [snode] < mark
723 && ((Part ==
NULL) || Part [cj] == part))
733 PRINT2 ((
"----------:::snode "ID" cnode "ID"\n", snode, cnode));
735 ASSERT (CParent [snode] == -2) ;
736 if (first || nd_components)
745 CParent [snode] = cnode ;
751 Flag [snode] = mark ;
755 for (sj = 0 ; sj < sn ; sj++)
759 PRINT2 ((
" j: "ID
"\n", j)) ;
760 ASSERT (j >= 0 && j < n) ;
761 ASSERT (Flag [j] == mark) ;
764 pend = pstart + Bnz [j] ;
765 for (p = pstart ; p < pend ; p++)
768 if (i != j && Flag [i] >=
EMPTY)
783 Bnz [j] = pdest - pstart ;
790 PRINT2 ((
"sn "ID
"\n", sn)) ;
797 (first || nd_components) ?
FLIP (snode) : snode ;
835 Int *Bp, *Bi, *Hash, *Cmap, *Bnw, *Bew, *Iwork ;
838 Int j,
n, bnz, sepsize, p, pend ;
881 Iwork = Common->
Iwork ;
905 B =
CHOLMOD(
aat) (A, fset, fsize, -1, Common) ;
919 Common->
anz = bnz / 2 + ((double) n) ;
923 csize =
MAX (((
size_t) n) + 1, (
size_t) bnz) ;
931 for (j = 0 ; j < n ; j++)
935 for (p = Bp [j] ; p < pend ; p++)
942 Hash [j] = (
Int) hash ;
943 ASSERT (Hash [j] >= 0 && Hash [j] < csize) ;
948 Bew =
CHOLMOD(malloc) (csize,
sizeof (
Int), Common) ;
953 CHOLMOD(free) (csize,
sizeof (
Int), Bew, Common) ;
958 for (j = 0 ; j < n ; j++)
962 for (s = 0 ; s < csize ; s++)
975 compress, Hash, B, Bnw, Bew, Cmap, Partition, Common) ;
989 CHOLMOD(free) (csize,
sizeof (
Int), Bew, Common) ;
1034 double prune_dense, nd_oksep ;
1035 Int *Bp, *Bi, *Bnz, *Cstack, *Imap, *Map, *Flag, *Head, *Next, *Bnw, *Iwork,
1036 *Ipost, *NewParent, *Hash, *Cmap, *Cp, *Ci, *Cew, *Cnw, *Part, *Post,
1039 Int n, bnz, top, i, j, k, cnode, cdense, p, cj, cn, ci, cnz, mark, c, uncol,
1040 sepsize, parent, ncomponents, threshold, ndense, pstart, pdest, pend,
1041 nd_compress, nd_camd, csize, jnext, nd_small, total_weight,
1042 nchild, child =
EMPTY ;
1074 ASSERT (
CHOLMOD(dump_sparse) (A,
"A for NESDIS:", Common) >= 0) ;
1080 nd_oksep =
MAX (0, nd_oksep) ;
1081 nd_oksep =
MIN (1, nd_oksep) ;
1084 nd_small =
MAX (4, nd_small) ;
1086 PRINT0 ((
"nd_components %d nd_small %d nd_oksep %g\n",
1088 nd_small, nd_oksep)) ;
1095 uncol = (A->stype == 0) ? A->ncol : 0 ;
1115 Flag = Common->
Flag ;
1116 Head = Common->
Head ;
1118 Iwork = Common->
Iwork ;
1121 Bnz = Iwork + 2*((size_t) n) ;
1122 Hash = Iwork + 3*((size_t) n) ;
1124 Work3n =
CHOLMOD(malloc) (n, 3*
sizeof (
Int), Common) ;
1154 B =
CHOLMOD(
aat) (A, fset, fsize, -1, Common) ;
1159 CHOLMOD(free) (3*n,
sizeof (
Int), Work3n, Common) ;
1166 csize =
MAX (n, bnz) ;
1167 ASSERT (
CHOLMOD(dump_sparse) (B,
"B for nd:", Common) >= 0) ;
1179 for (j = 0 ; j < n ; j++)
1185 if (
IS_NAN (prune_dense) || prune_dense < 0)
1193 threshold = (
Int) (
MAX (16, prune_dense * sqrt ((
double) (n)))) ;
1194 threshold =
MIN (n, threshold) ;
1200 for (j = 0 ; j < n ; j++)
1202 Bnz [j] = Bp [j+1] - Bp [j] ;
1203 if (Bnz [j] > threshold)
1206 PRINT2 ((
"j is dense %d\n", j)) ;
1214 CParent [cnode] =
EMPTY ;
1216 Flag [j] =
FLIP (cnode) ;
1226 PRINT2 ((
"all nodes are dense\n")) ;
1227 for (k = 0 ; k < n ; k++)
1232 CParent [0] =
EMPTY ;
1234 CHOLMOD(free) (3*n,
sizeof (
Int), Work3n, Common) ;
1243 Cew =
CHOLMOD(malloc) (csize,
sizeof (
Int), Common) ;
1250 CHOLMOD(free) (csize,
sizeof (
Int), Cew, Common) ;
1251 CHOLMOD(free) (3*n,
sizeof (
Int), Work3n, Common) ;
1254 PRINT2 ((
"out of memory for C, etc\n")) ;
1262 for (j = 0 ; j < n ; j++)
1266 for (p = 0 ; p < csize ; p++)
1275 Bnz, CParent, Cstack, &top, Imap, Common) ;
1290 DEBUG (
for (i = 0 ; i < n ; i++) Imap [i] =
EMPTY) ;
1303 while (cnode ==
EMPTY)
1305 i = Cstack [top--] ;
1369 for (cj = 0 ; cj < cn ; cj++)
1373 ASSERT (Flag [j] == mark) ;
1375 Cnw [cj] = Bnw [j] ;
1377 total_weight += Cnw [cj] ;
1380 pend = pstart + Bnz [j] ;
1382 for (p = pstart ; p < pend ; p++)
1386 if (i != j && Flag [i] >=
EMPTY)
1390 if (Flag [i] != mark)
1401 ASSERT (ci >= 0 && ci < cn && ci != cj && cnz < csize) ;
1407 Bnz [j] = pdest - pstart ;
1410 Hash [cj] = (
Int) hash ;
1411 ASSERT (Hash [cj] >= 0 && Hash [cj] < csize) ;
1420 for (cj = 0 ; cj < cn ; cj++)
1423 PRINT2 ((
"----------------------------C column cj: "ID" j: "ID"\n",
1425 ASSERT (j >= 0 && j < n) ;
1427 for (p = Cp [cj] ; p < Cp [cj+1] ; p++)
1431 PRINT3 ((
"ci: "ID
" i: "ID
"\n", ci, i)) ;
1432 ASSERT (ci != cj && ci >= 0 && ci < cn) ;
1433 ASSERT (i != j && i >= 0 && i < n) ;
1439 PRINT0 ((
"consider cn %d nd_small %d ", cn, nd_small)) ;
1443 PRINT0 ((
" too small\n")) ;
1444 sepsize = total_weight ;
1465 nd_compress, Hash, C, Cnw, Cew,
1466 Cmap, Part, Common) ;
1476 CHOLMOD(free) (csize,
sizeof (
Int), Cew, Common) ;
1477 CHOLMOD(free) (3*n,
sizeof (
Int), Work3n, Common) ;
1487 for (ci = 0 ; ci < cn ; ci++)
1489 if (Hash [ci] <
EMPTY)
1492 cj =
FLIP (Hash [ci]) ;
1493 PRINT2 ((
"In C, "ID" absorbed into "ID" (wgt now "ID")\n",
1494 ci, cj, Cnw [cj])) ;
1498 PRINT2 ((
"In B, "ID
" (wgt "ID
") => "ID
" (wgt "ID
")\n",
1499 i, Bnw [i], j, Bnw [j], Cnw [cj])) ;
1504 Bnw [j] = Cnw [cj] ;
1505 Flag [i] =
FLIP (j) ;
1509 DEBUG (
for (cnt = 0, j = 0 ; j < n ; j++) cnt += Bnw [j]) ;
1522 ASSERT (sepsize >= 0 && sepsize <= total_weight) ;
1524 PRINT0 ((
"sepsize %d tot %d : %8.4f ", sepsize, total_weight,
1525 ((
double) sepsize) / ((
double) total_weight))) ;
1527 if (sepsize == total_weight || sepsize == 0 ||
1528 sepsize > nd_oksep * total_weight)
1536 PRINT2 ((
"cnode %d sepsize zero or all of graph: "ID"\n",
1538 for (cj = 0 ; cj < cn ; cj++)
1541 Flag [j] =
FLIP (cnode) ;
1542 PRINT2 ((
" node cj: "ID" j: "ID" ordered\n", cj, j)) ;
1546 PRINT0 ((
"discarded\n")) ;
1555 PRINT0 ((
"sepsize not tiny: "ID"\n", sepsize)) ;
1556 parent = CParent [cnode] ;
1558 CParent [cnode] = -2 ;
1560 for (cj = 0 ; cj < cn ; cj++)
1567 PRINT2 ((
"node cj: "ID" j: "ID" ordered\n", cj, j)) ;
1570 PRINT2((
"------------new cnode: cj "ID
" j "ID
"\n",
1574 Flag [j] =
FLIP (cnode) ;
1578 PRINT2 ((
" node cj: "ID" j: "ID" not ordered\n",
1583 ASSERT (CParent [cnode] == -2) ;
1584 CParent [cnode] = parent ;
1590 CParent, Cstack, &top, Imap, Common) ;
1605 for (i = 0 ; i < n ; i++)
1608 j =
FLIP (Flag [i]) ;
1609 PRINT2 ((
"\nfind component for "ID", in: "ID"\n", i, j)) ;
1610 ASSERT (j >= 0 && j < n) ;
1612 while (CParent [j] == -2)
1614 j =
FLIP (Flag [j]) ;
1615 PRINT2 ((
" walk up to "ID
" ", j)) ;
1616 ASSERT (j >= 0 && j < n) ;
1617 PRINT2 ((
" CParent "ID
"\n", CParent [j])) ;
1622 ASSERT (cnode >= 0 && cnode < n) ;
1623 ASSERT (CParent [cnode] >=
EMPTY && CParent [cnode] < n) ;
1624 PRINT2 ((
"i "ID
" is in component with cnode "ID
"\n", i, cnode)) ;
1629 j =
FLIP (Flag [i]) ;
1630 Flag [i] =
FLIP (cnode) ;
1632 while (CParent [j] == -2)
1634 ASSERT (j >= 0 && j < n) ;
1635 jnext =
FLIP (Flag [j]) ;
1636 PRINT2 ((
" "ID
" walk "ID
" set cnode to "ID
"\n", i, j, cnode)) ;
1639 Flag [j] =
FLIP (cnode) ;
1647 for (j = 0 ; j < n ; j++)
1649 PRINT2 ((
"j %d CParent %d ", j, CParent [j])) ;
1650 if (CParent [j] >=
EMPTY && CParent [j] < n)
1654 PRINT2 ((
" a repnode\n")) ;
1659 cnode =
FLIP (Flag [j]) ;
1660 PRINT2 ((
" repnode is %d\n", cnode)) ;
1661 ASSERT (cnode >= 0 && cnode < n) ;
1662 ASSERT (CParent [cnode] >=
EMPTY && CParent [cnode] < n) ;
1676 CHOLMOD(free) (csize,
sizeof (
Int), Cew, Common) ;
1677 CHOLMOD(free) (3*n,
sizeof (
Int), Work3n, Common) ;
1693 for (j = 0 ; j < n ; j++)
1695 if (CParent [j] == cdense)
1704 PRINT1 ((
"root has one child\n")) ;
1705 CParent [cdense] = -2 ;
1706 CParent [child] =
EMPTY ;
1707 for (j = 0 ; j < n ; j++)
1709 if (Flag [j] ==
FLIP (cdense))
1712 PRINT1 ((
"dense %d\n", j)) ;
1713 Flag [j] =
FLIP (child) ;
1723 DEBUG (
for (cnt = 0, j = 0 ; j < n ; j++)
if (CParent [j] != -2) cnt++) ;
1732 ncomponents =
CHOLMOD(postorder) (CParent, n,
NULL, Post, Common) ;
1733 ASSERT (cnt == ncomponents) ;
1737 DEBUG (
for (j = 0 ; j < n ; j++) Ipost [j] =
EMPTY) ;
1740 for (c = 0 ; c < ncomponents ; c++)
1743 ASSERT (cnode >= 0 && cnode < n) ;
1750 NewParent = Iwork + n ;
1751 for (c = 0 ; c < ncomponents ; c++)
1753 parent = CParent [Post [c]] ;
1754 NewParent [c] = (parent ==
EMPTY) ?
EMPTY : (Ipost [parent]) ;
1756 for (c = 0 ; c < ncomponents ; c++)
1758 CParent [c] = NewParent [c] ;
1767 for (c = 0 ; c < ncomponents ; c++)
1771 for (c = 0 ; c < ncomponents ; c++)
1773 if (CParent [c] !=
EMPTY) Cmember [CParent [c]]++ ;
1775 for (c = 0 ; c < ncomponents ; c++)
1778 ASSERT (Cmember [c] == 0 || Cmember [c] >= 2) ;
1786 for (j = 0 ; j < n ; j++)
1789 cnode =
FLIP (Flag [j]) ;
1791 j, Flag [j],
FLIP (Flag [j]))) ;
1792 ASSERT (cnode >= 0 && cnode < n) ;
1794 ASSERT (c >= 0 && c < ncomponents) ;
1814 PRINT1 ((
"nd_camd: %d A->stype %d\n", nd_camd, A->stype)) ;
1832 PRINT0 ((
"make symmetric failed\n")) ;
1836 PRINT2 ((
"nested dissection (2)\n")) ;
1852 PRINT0 ((
"camd/csymamd failed\n")) ;
1863 PRINT2 ((
"ccolamd failed\n")) ;
1884 for (j = n-1 ; j >= 0 ; j--)
1888 ASSERT (c >= 0 && c < ncomponents) ;
1890 Next [j] = Head [c] ;
1899 for (c = 0 ; c < ncomponents ; c++)
1901 for (j = Head [c] ; j !=
EMPTY ; j = Next [j])
1917 return (ncomponents) ;
1952 Int *First, *Count, *Csubtree, *W, *Map ;
1953 Int c, j, k, nc, sepsize, total_weight, parent, nc_new, first ;
1964 if (n < ncomponents)
1971 if (n <= 1 || ncomponents <= 1)
1977 nd_oksep =
MAX (0, nd_oksep) ;
1978 nd_oksep =
MIN (1, nd_oksep) ;
1979 nd_small =
MAX (4, nd_small) ;
1998 Count = W ; W += ncomponents ;
1999 Csubtree = W ; W += ncomponents ;
2000 First = W ; W += ncomponents ;
2006 for (c = 0 ; c < nc ; c++)
2010 for (k = 0 ; k < nc ; k++)
2012 for (c = k ; c !=
EMPTY && First [c] == -1 ; c = CParent [c])
2014 ASSERT (c >= 0 && c < nc) ;
2023 for (c = 0 ; c < nc ; c++)
2027 for (j = 0 ; j < (
Int) n ; j++)
2029 ASSERT (Cmember [j] >= 0 && Cmember [j] < nc) ;
2030 Count [Cmember [j]]++ ;
2037 for (c = 0 ; c < nc ; c++)
2040 Csubtree [c] = Count [c] ;
2042 c, Count [c], CParent [c], First [c])) ;
2045 for (c = 0 ; c < nc ; c++)
2048 parent = CParent [c] ;
2050 if (parent !=
EMPTY)
2052 Csubtree [parent] += Csubtree [c] ;
2059 for (c = 0 ; c < nc ; c++)
if (CParent [c] ==
EMPTY) j += Csubtree [c] ;
2068 for (c = nc-1 ; c >= 0 ; c--)
2071 sepsize = Count [c] ;
2072 total_weight = Csubtree [c] ;
2073 PRINT1 ((
"Node "ID" sepsize "ID" subtree "ID" ratio %g\n", c, sepsize,
2074 total_weight, ((
double) sepsize)/((
double) total_weight))) ;
2077 (sepsize > nd_oksep * total_weight || total_weight < (
int) nd_small))
2086 for (k = first ; k < c ; k++)
2089 PRINT1 ((
" collapse node "ID
"\n", k)) ;
2096 PRINT1 ((
"collapse: %d\n", collapse)) ;
2108 for (c = 0 ; c < nc ; c++)
2111 if (CParent [c] >=
EMPTY)
2118 PRINT1 ((
"Collapse the tree from "ID" to "ID" nodes\n", nc, nc_new)) ;
2120 for (c = 0 ; c < nc ; c++)
2122 parent = CParent [c] ;
2123 if (parent >=
EMPTY)
2126 CParent [Map [c]] = (parent ==
EMPTY) ?
EMPTY : Map [parent] ;
2129 for (j = 0 ; j < (
Int) n ; j++)
2131 PRINT1 ((
"j "ID
" Cmember[j] "ID
" Map[Cmember[j]] "ID
"\n",
2132 j, Cmember [j], Map [Cmember [j]])) ;
2133 Cmember [j] = Map [Cmember [j]] ;
#define CHOLMOD_TOO_LARGE
int CHOLMOD() camd(cholmod_sparse *A, Int *fset, size_t fsize, Int *Cmember, Int *Perm, cholmod_common *Common)
UF_long CHOLMOD() nnz(cholmod_sparse *A, cholmod_common *Common)
size_t CHOLMOD() add_size_t(size_t a, size_t b, int *ok)
static void find_components(cholmod_sparse *B, Int Map[], Int cn, Int cnode, Int Part[], Int Bnz[], Int CParent[], Int Cstack[], Int *top, Int Queue[], cholmod_common *Common)
#define RETURN_IF_NULL_COMMON(result)
struct cholmod_common_struct::cholmod_method_struct method[CHOLMOD_MAXMETHODS+1]
size_t CHOLMOD() mult_size_t(size_t a, size_t k, int *ok)
cholmod_sparse *CHOLMOD() aat(cholmod_sparse *A, Int *fset, size_t fsize, int mode, cholmod_common *Common)
int CHOLMOD() dump_work(int flag, int head, UF_long wsize, cholmod_common *Common)
int CHOLMOD() free_sparse(cholmod_sparse **AHandle, cholmod_common *Common)
#define ASSERT(expression)
int CHOLMOD() ccolamd(cholmod_sparse *A, Int *fset, size_t fsize, Int *Cmember, Int *Perm, cholmod_common *Common)
UF_long CHOLMOD() collapse_septree(size_t n, size_t ncomponents, double nd_oksep, size_t nd_small, Int *CParent, Int *Cmember, cholmod_common *Common)
cholmod_sparse *CHOLMOD() allocate_sparse(size_t nrow, size_t ncol, size_t nzmax, int sorted, int packed, int stype, int xtype, cholmod_common *Common)
int CHOLMOD() allocate_work(size_t nrow, size_t iworksize, size_t xworksize, cholmod_common *Common)
static UF_long partition(Int csize, int compress, Int Hash[], cholmod_sparse *C, Int Cnw[], Int Cew[], Int Cmap[], Int Part[], cholmod_common *Common)
static UF_long clear_flag(cholmod_common *Common)
#define RETURN_IF_NULL(A, result)
int CHOLMOD() dump_parent(Int *Parent, size_t n, char *name, cholmod_common *Common)
#define ERROR(status, msg)
#define RETURN_IF_XTYPE_INVALID(A, xtype1, xtype2, result)
int CHOLMOD() csymamd(cholmod_sparse *A, Int *Cmember, Int *Perm, cholmod_common *Common)
cholmod_sparse *CHOLMOD() copy(cholmod_sparse *A, int stype, int mode, cholmod_common *Common)