109 Int n, hash, head, i, j, k, p, pend, ilen, ilast, pi, piend,
110 jlen, ok, cn, csep, pdest, nodes_pruned, nz, total_weight, jscattered ;
111 Int *Cp, *Ci, *Next, *Hhead ;
115 double work = 0, goodwork = 0 ;
127 PRINT2 ((
"Partition start, n "ID" nz "ID"\n", n, nz)) ;
130 for (j = 0 ; j < n ; j++)
133 total_weight += Cnw [j] ;
139 for (j = 0 ; j < n ; j++)
143 return (total_weight) ;
148 PRINT2 ((
"diagonal matrix\n")) ;
150 for (j = 0 ; j < k ; j++)
164 ASSERT (n > 1 && nz > 0) ;
165 PRINT2 ((
"original graph:\n")) ;
166 for (j = 0 ; j < n ; j++)
169 for (p = Cp [j] ; p < Cp [j+1] ; p++)
173 ASSERT (i >= 0 && i < n && i != j) ;
175 PRINT2 ((
"hash: "ID
"\n", Hash [j])) ;
177 DEBUG (
for (p = 0 ; p < csize ; p++)
ASSERT (Cew [p] == 1)) ;
196 for (j = 0 ; j < n ; j++)
200 ASSERT (hash >= 0 && hash < csize) ;
201 head = Hhead [hash] ;
211 ASSERT (head >= 0 && head < n) ;
216 Hhead [hash] =
FLIP (j) ;
222 for (cnt = 0, k = 0 ; k < n ; k++)
224 ASSERT (Hash [k] >= 0 && Hash [k] < csize) ;
226 ASSERT (hash >= 0 && hash < csize) ;
227 head = Hhead [hash] ;
230 ASSERT (j >= 0 && j < n) ;
233 PRINT2 ((
"hash "ID
": ", hash)) ;
234 for ( ; j !=
EMPTY ; j = Next [j])
237 ASSERT (j >= 0 && j < n) ;
238 ASSERT (Hash [j] == hash) ;
263 #define Cmap_MARK(i) Cmap [i] = j
264 #define Cmap_MARKED(i) (Cmap [i] == j)
266 for (i = 0 ; i < n ; i++)
271 for (k = 0 ; k < n ; k++)
281 head = Hhead [hash] ;
288 PRINT2 ((
"\n--------------------hash "ID
":\n", hash)) ;
289 for (j =
FLIP (head) ; j !=
EMPTY && Next[j] >
EMPTY ; j = Next [j])
292 ASSERT (j >= 0 && j < n && Hash [j] == hash) ;
300 for (i = Next [j] ; i !=
EMPTY ; i = Next [i])
302 ASSERT (i >= 0 && i < n && Hash [i] == hash && i != j) ;
317 for ( ; p < pend ; p++)
322 DEBUG (work += jlen) ;
324 for (ok =
Cmap_MARKED (i) ; ok && pi < piend ; pi++)
332 PRINT2 ((
"found "ID
" absorbed into "ID
"\n", i, j)) ;
333 Hash [i] =
FLIP (j) ;
336 ASSERT (ilast != i && ilast >= 0 && ilast < n) ;
337 Next [ilast] = Next [i] ;
339 DEBUG (goodwork += (ilen+1)) ;
348 DEBUG (
if (pruned) goodwork += jlen) ;
354 DEBUG (
if (((work - goodwork) / (
double) nz) > 0.20)
PRINT0 ((
355 "work %12g good %12g nz %12g (wasted work/nz: %6.2f )\n",
356 work, goodwork, (
double) nz, (work - goodwork) / ((
double) nz)))) ;
364 DEBUG (
for (p = 0 ; p < csize ; p++)
ASSERT (Cew [p] == 1)) ;
365 DEBUG (
for (cnt = 0, j = 0 ; j < n ; j++) cnt += Cnw [j]) ;
366 ASSERT (cnt == total_weight) ;
372 if (nodes_pruned == 0)
380 csep =
CHOLMOD(metis_bisector) (
C, Cnw, Cew, Part, Common) ;
383 else if (nodes_pruned == n-1)
390 PRINT2 ((
"completely dense graph\n")) ;
391 csep = total_weight ;
392 for (j = 0 ; j < n ; j++)
413 for (j = 0 ; j < n ; j++)
418 for (j = 0 ; j < n ; j++)
427 PRINT2 ((
"compressed graph from "ID
" to "ID
" nodes\n", n, cn)) ;
428 ASSERT (cn > 1 && cn == n - nodes_pruned) ;
436 for (j = 0 ; j < n ; j++)
441 ASSERT (k <= j && Cmap [j] == k) ;
446 for ( ; p < pend ; p++)
450 ASSERT (i >= 0 && i < n && i != j) ;
467 PRINT2 ((
"pruned graph ("ID
"/"ID
") nodes, ("ID
"/"ID
") edges\n",
469 PRINT2 ((
"compressed graph:\n")) ;
470 for (cnt = 0, j = 0 ; j < cn ; j++)
473 for (p = Cp [j] ; p < Cp [j+1] ; p++)
477 ASSERT (i >= 0 && i < cn && i != j) ;
479 PRINT2 ((
"weight: "ID
"\n", Cnw [j])) ;
483 ASSERT (cnt == total_weight) ;
484 for (j = 0 ; j < n ; j++)
PRINT2 ((
"Cmap ["ID
"] = "ID
"\n", j, Cmap[j]));
493 csep =
CHOLMOD(metis_bisector) (
C, Cnw, Cew, Part, Common) ;
502 DEBUG (
for (j = 0 ; j < cn ; j++)
PRINT2 ((
""ID
" ", Part [j]))) ;
512 for (j = n-1 ; j >= 0 ; j--)
522 Part [j] = Part [k] ;
535 for (i = 0 ; i < n ; i++)
537 if (Hash [i] <
EMPTY)
540 j =
FLIP (Hash [i]) ;
541 ASSERT (Part [i] ==
EMPTY && j >= 0 && j < n && Cnw [i] == 0) ;
542 Part [i] = Part [j] ;
544 ASSERT (Part [i] >= 0 && Part [i] <= 2) ;
549 for (cnt = 0, j = 0 ; j < n ; j++)
552 PRINT2 ((
""ID
" ", Part [j])) ;
553 if (Part [j] == 2) cnt += Cnw [j] ;
556 PRINT2 ((
"csep "ID
" "ID
"\n", cnt, csep)) ;
558 for (cnt = 0, j = 0 ; j < n ; j++) cnt += Cnw [j] ;
559 ASSERT (cnt == total_weight) ;
568 PRINT2 ((
"Partition done, n "ID
" csep "ID
"\n", n, csep)) ;
597 if (Common->
mark <= 0)
599 nrow = Common->
nrow ;
600 Flag = Common->
Flag ;
601 for (i = 0 ; i < nrow ; i++)
604 if (Flag [i] >=
EMPTY)
612 return (Common->
mark) ;
676 Int n, mark, cj, j, sj, sn, p, i, snode, pstart, pdest, pend, nd_components,
678 Int *Bp, *Bi, *Flag ;
684 PRINT2 ((
"find components: cn %d\n", cn)) ;
685 Flag = Common->
Flag ;
701 part = (Part ==
NULL) ? 0 : 1 ;
704 for (part = (Part ==
NULL) ? 0 : 1 ; part >= 0 ; part--)
711 for (cj = 0 ; cj < cn ; cj++)
716 snode = (Map ==
NULL) ? (cj) : (Map [cj]) ;
717 ASSERT (snode >= 0 && snode < n) ;
719 if (Flag [snode] >=
EMPTY && Flag [snode] < mark
720 && ((Part ==
NULL) || Part [cj] == part))
730 PRINT2 ((
"----------:::snode "ID" cnode "ID"\n", snode, cnode));
732 ASSERT (CParent [snode] == -2) ;
733 if (first || nd_components)
742 CParent [snode] = cnode ;
748 Flag [snode] = mark ;
752 for (sj = 0 ; sj < sn ; sj++)
756 PRINT2 ((
" j: "ID
"\n", j)) ;
757 ASSERT (j >= 0 && j < n) ;
758 ASSERT (Flag [j] == mark) ;
761 pend = pstart + Bnz [j] ;
762 for (p = pstart ; p < pend ; p++)
765 if (i != j && Flag [i] >=
EMPTY)
780 Bnz [j] = pdest - pstart ;
787 PRINT2 ((
"sn "ID
"\n", sn)) ;
794 (first || nd_components) ?
FLIP (snode) : snode ;
832 Int *Bp, *Bi, *Hash, *Cmap, *Bnw, *Bew, *Iwork ;
835 Int j,
n, bnz, sepsize, p, pend ;
878 Iwork = Common->
Iwork ;
902 B =
CHOLMOD(
aat) (A, fset, fsize, -1, Common) ;
916 Common->
anz = bnz / 2 + ((double) n) ;
920 csize =
MAX (((
size_t) n) + 1, (
size_t) bnz) ;
928 for (j = 0 ; j < n ; j++)
932 for (p = Bp [j] ; p < pend ; p++)
939 Hash [j] = (
Int) hash ;
940 ASSERT (Hash [j] >= 0 && Hash [j] < csize) ;
945 Bew =
CHOLMOD(malloc) (csize,
sizeof (
Int), Common) ;
950 CHOLMOD(free) (csize,
sizeof (
Int), Bew, Common) ;
955 for (j = 0 ; j < n ; j++)
959 for (s = 0 ; s < csize ; s++)
972 compress, Hash, B, Bnw, Bew, Cmap, Partition, Common) ;
986 CHOLMOD(free) (csize,
sizeof (
Int), Bew, Common) ;
1031 double prune_dense, nd_oksep ;
1032 Int *Bp, *Bi, *Bnz, *Cstack, *Imap, *Map, *Flag, *Head, *Next, *Bnw, *Iwork,
1033 *Ipost, *NewParent, *Hash, *Cmap, *Cp, *Ci, *Cew, *Cnw, *Part, *Post,
1036 Int n, bnz, top, i, j, k, cnode, cdense, p, cj, cn, ci, cnz, mark, c, uncol,
1037 sepsize, parent, ncomponents, threshold, ndense, pstart, pdest, pend,
1038 nd_compress, nd_camd, csize, jnext, nd_small, total_weight,
1039 nchild, child =
EMPTY ;
1071 ASSERT (
CHOLMOD(dump_sparse) (A,
"A for NESDIS:", Common) >= 0) ;
1077 nd_oksep =
MAX (0, nd_oksep) ;
1078 nd_oksep =
MIN (1, nd_oksep) ;
1081 nd_small =
MAX (4, nd_small) ;
1083 PRINT0 ((
"nd_components %d nd_small %d nd_oksep %g\n",
1085 nd_small, nd_oksep)) ;
1092 uncol = (A->stype == 0) ? A->ncol : 0 ;
1112 Flag = Common->
Flag ;
1113 Head = Common->
Head ;
1115 Iwork = Common->
Iwork ;
1118 Bnz = Iwork + 2*((size_t) n) ;
1119 Hash = Iwork + 3*((size_t) n) ;
1121 Work3n =
CHOLMOD(malloc) (n, 3*
sizeof (
Int), Common) ;
1151 B =
CHOLMOD(
aat) (A, fset, fsize, -1, Common) ;
1156 CHOLMOD(free) (3*n,
sizeof (
Int), Work3n, Common) ;
1163 csize =
MAX (n, bnz) ;
1164 ASSERT (
CHOLMOD(dump_sparse) (B,
"B for nd:", Common) >= 0) ;
1176 for (j = 0 ; j < n ; j++)
1182 if (
IS_NAN (prune_dense) || prune_dense < 0)
1190 threshold = (
Int) (
MAX (16, prune_dense * sqrt ((
double) (n)))) ;
1191 threshold =
MIN (n, threshold) ;
1197 for (j = 0 ; j < n ; j++)
1199 Bnz [j] = Bp [j+1] - Bp [j] ;
1200 if (Bnz [j] > threshold)
1203 PRINT2 ((
"j is dense %d\n", j)) ;
1211 CParent [cnode] =
EMPTY ;
1213 Flag [j] =
FLIP (cnode) ;
1223 PRINT2 ((
"all nodes are dense\n")) ;
1224 for (k = 0 ; k < n ; k++)
1229 CParent [0] =
EMPTY ;
1231 CHOLMOD(free) (3*n,
sizeof (
Int), Work3n, Common) ;
1240 Cew =
CHOLMOD(malloc) (csize,
sizeof (
Int), Common) ;
1247 CHOLMOD(free) (csize,
sizeof (
Int), Cew, Common) ;
1248 CHOLMOD(free) (3*n,
sizeof (
Int), Work3n, Common) ;
1251 PRINT2 ((
"out of memory for C, etc\n")) ;
1259 for (j = 0 ; j < n ; j++)
1263 for (p = 0 ; p < csize ; p++)
1272 Bnz, CParent, Cstack, &top, Imap, Common) ;
1287 DEBUG (
for (i = 0 ; i < n ; i++) Imap [i] =
EMPTY) ;
1300 while (cnode ==
EMPTY)
1302 i = Cstack [top--] ;
1366 for (cj = 0 ; cj < cn ; cj++)
1370 ASSERT (Flag [j] == mark) ;
1372 Cnw [cj] = Bnw [j] ;
1374 total_weight += Cnw [cj] ;
1377 pend = pstart + Bnz [j] ;
1379 for (p = pstart ; p < pend ; p++)
1383 if (i != j && Flag [i] >=
EMPTY)
1387 if (Flag [i] != mark)
1398 ASSERT (ci >= 0 && ci < cn && ci != cj && cnz < csize) ;
1404 Bnz [j] = pdest - pstart ;
1407 Hash [cj] = (
Int) hash ;
1408 ASSERT (Hash [cj] >= 0 && Hash [cj] < csize) ;
1417 for (cj = 0 ; cj < cn ; cj++)
1420 PRINT2 ((
"----------------------------C column cj: "ID" j: "ID"\n",
1422 ASSERT (j >= 0 && j < n) ;
1424 for (p = Cp [cj] ; p < Cp [cj+1] ; p++)
1428 PRINT3 ((
"ci: "ID
" i: "ID
"\n", ci, i)) ;
1429 ASSERT (ci != cj && ci >= 0 && ci < cn) ;
1430 ASSERT (i != j && i >= 0 && i < n) ;
1436 PRINT0 ((
"consider cn %d nd_small %d ", cn, nd_small)) ;
1440 PRINT0 ((
" too small\n")) ;
1441 sepsize = total_weight ;
1462 nd_compress, Hash, C, Cnw, Cew,
1463 Cmap, Part, Common) ;
1473 CHOLMOD(free) (csize,
sizeof (
Int), Cew, Common) ;
1474 CHOLMOD(free) (3*n,
sizeof (
Int), Work3n, Common) ;
1484 for (ci = 0 ; ci < cn ; ci++)
1486 if (Hash [ci] <
EMPTY)
1489 cj =
FLIP (Hash [ci]) ;
1490 PRINT2 ((
"In C, "ID" absorbed into "ID" (wgt now "ID")\n",
1491 ci, cj, Cnw [cj])) ;
1495 PRINT2 ((
"In B, "ID
" (wgt "ID
") => "ID
" (wgt "ID
")\n",
1496 i, Bnw [i], j, Bnw [j], Cnw [cj])) ;
1501 Bnw [j] = Cnw [cj] ;
1502 Flag [i] =
FLIP (j) ;
1506 DEBUG (
for (cnt = 0, j = 0 ; j < n ; j++) cnt += Bnw [j]) ;
1519 ASSERT (sepsize >= 0 && sepsize <= total_weight) ;
1521 PRINT0 ((
"sepsize %d tot %d : %8.4f ", sepsize, total_weight,
1522 ((
double) sepsize) / ((
double) total_weight))) ;
1524 if (sepsize == total_weight || sepsize == 0 ||
1525 sepsize > nd_oksep * total_weight)
1533 PRINT2 ((
"cnode %d sepsize zero or all of graph: "ID"\n",
1535 for (cj = 0 ; cj < cn ; cj++)
1538 Flag [j] =
FLIP (cnode) ;
1539 PRINT2 ((
" node cj: "ID" j: "ID" ordered\n", cj, j)) ;
1543 PRINT0 ((
"discarded\n")) ;
1552 PRINT0 ((
"sepsize not tiny: "ID"\n", sepsize)) ;
1553 parent = CParent [cnode] ;
1555 CParent [cnode] = -2 ;
1557 for (cj = 0 ; cj < cn ; cj++)
1564 PRINT2 ((
"node cj: "ID" j: "ID" ordered\n", cj, j)) ;
1567 PRINT2((
"------------new cnode: cj "ID
" j "ID
"\n",
1571 Flag [j] =
FLIP (cnode) ;
1575 PRINT2 ((
" node cj: "ID" j: "ID" not ordered\n",
1580 ASSERT (CParent [cnode] == -2) ;
1581 CParent [cnode] = parent ;
1587 CParent, Cstack, &top, Imap, Common) ;
1602 for (i = 0 ; i < n ; i++)
1605 j =
FLIP (Flag [i]) ;
1606 PRINT2 ((
"\nfind component for "ID", in: "ID"\n", i, j)) ;
1607 ASSERT (j >= 0 && j < n) ;
1609 while (CParent [j] == -2)
1611 j =
FLIP (Flag [j]) ;
1612 PRINT2 ((
" walk up to "ID
" ", j)) ;
1613 ASSERT (j >= 0 && j < n) ;
1614 PRINT2 ((
" CParent "ID
"\n", CParent [j])) ;
1619 ASSERT (cnode >= 0 && cnode < n) ;
1620 ASSERT (CParent [cnode] >=
EMPTY && CParent [cnode] < n) ;
1621 PRINT2 ((
"i "ID
" is in component with cnode "ID
"\n", i, cnode)) ;
1626 j =
FLIP (Flag [i]) ;
1627 Flag [i] =
FLIP (cnode) ;
1629 while (CParent [j] == -2)
1631 ASSERT (j >= 0 && j < n) ;
1632 jnext =
FLIP (Flag [j]) ;
1633 PRINT2 ((
" "ID
" walk "ID
" set cnode to "ID
"\n", i, j, cnode)) ;
1636 Flag [j] =
FLIP (cnode) ;
1644 for (j = 0 ; j < n ; j++)
1646 PRINT2 ((
"j %d CParent %d ", j, CParent [j])) ;
1647 if (CParent [j] >=
EMPTY && CParent [j] < n)
1651 PRINT2 ((
" a repnode\n")) ;
1656 cnode =
FLIP (Flag [j]) ;
1657 PRINT2 ((
" repnode is %d\n", cnode)) ;
1658 ASSERT (cnode >= 0 && cnode < n) ;
1659 ASSERT (CParent [cnode] >=
EMPTY && CParent [cnode] < n) ;
1673 CHOLMOD(free) (csize,
sizeof (
Int), Cew, Common) ;
1674 CHOLMOD(free) (3*n,
sizeof (
Int), Work3n, Common) ;
1690 for (j = 0 ; j < n ; j++)
1692 if (CParent [j] == cdense)
1701 PRINT1 ((
"root has one child\n")) ;
1702 CParent [cdense] = -2 ;
1703 CParent [child] =
EMPTY ;
1704 for (j = 0 ; j < n ; j++)
1706 if (Flag [j] ==
FLIP (cdense))
1709 PRINT1 ((
"dense %d\n", j)) ;
1710 Flag [j] =
FLIP (child) ;
1720 DEBUG (
for (cnt = 0, j = 0 ; j < n ; j++)
if (CParent [j] != -2) cnt++) ;
1729 ncomponents =
CHOLMOD(postorder) (CParent, n,
NULL, Post, Common) ;
1730 ASSERT (cnt == ncomponents) ;
1734 DEBUG (
for (j = 0 ; j < n ; j++) Ipost [j] =
EMPTY) ;
1737 for (c = 0 ; c < ncomponents ; c++)
1740 ASSERT (cnode >= 0 && cnode < n) ;
1747 NewParent = Iwork + n ;
1748 for (c = 0 ; c < ncomponents ; c++)
1750 parent = CParent [Post [c]] ;
1751 NewParent [c] = (parent ==
EMPTY) ?
EMPTY : (Ipost [parent]) ;
1753 for (c = 0 ; c < ncomponents ; c++)
1755 CParent [c] = NewParent [c] ;
1764 for (c = 0 ; c < ncomponents ; c++)
1768 for (c = 0 ; c < ncomponents ; c++)
1770 if (CParent [c] !=
EMPTY) Cmember [CParent [c]]++ ;
1772 for (c = 0 ; c < ncomponents ; c++)
1775 ASSERT (Cmember [c] == 0 || Cmember [c] >= 2) ;
1783 for (j = 0 ; j < n ; j++)
1786 cnode =
FLIP (Flag [j]) ;
1788 j, Flag [j],
FLIP (Flag [j]))) ;
1789 ASSERT (cnode >= 0 && cnode < n) ;
1791 ASSERT (c >= 0 && c < ncomponents) ;
1811 PRINT1 ((
"nd_camd: %d A->stype %d\n", nd_camd, A->stype)) ;
1829 PRINT0 ((
"make symmetric failed\n")) ;
1833 PRINT2 ((
"nested dissection (2)\n")) ;
1849 PRINT0 ((
"camd/csymamd failed\n")) ;
1860 PRINT2 ((
"ccolamd failed\n")) ;
1881 for (j = n-1 ; j >= 0 ; j--)
1885 ASSERT (c >= 0 && c < ncomponents) ;
1887 Next [j] = Head [c] ;
1896 for (c = 0 ; c < ncomponents ; c++)
1898 for (j = Head [c] ; j !=
EMPTY ; j = Next [j])
1914 return (ncomponents) ;
1949 Int *First, *Count, *Csubtree, *W, *Map ;
1950 Int c, j, k, nc, sepsize, total_weight, parent, nc_new, first ;
1961 if (n < ncomponents)
1968 if (n <= 1 || ncomponents <= 1)
1974 nd_oksep =
MAX (0, nd_oksep) ;
1975 nd_oksep =
MIN (1, nd_oksep) ;
1976 nd_small =
MAX (4, nd_small) ;
1995 Count = W ; W += ncomponents ;
1996 Csubtree = W ; W += ncomponents ;
1997 First = W ; W += ncomponents ;
2003 for (c = 0 ; c < nc ; c++)
2007 for (k = 0 ; k < nc ; k++)
2009 for (c = k ; c !=
EMPTY && First [c] == -1 ; c = CParent [c])
2011 ASSERT (c >= 0 && c < nc) ;
2020 for (c = 0 ; c < nc ; c++)
2024 for (j = 0 ; j < (
Int) n ; j++)
2026 ASSERT (Cmember [j] >= 0 && Cmember [j] < nc) ;
2027 Count [Cmember [j]]++ ;
2034 for (c = 0 ; c < nc ; c++)
2037 Csubtree [c] = Count [c] ;
2039 c, Count [c], CParent [c], First [c])) ;
2042 for (c = 0 ; c < nc ; c++)
2045 parent = CParent [c] ;
2047 if (parent !=
EMPTY)
2049 Csubtree [parent] += Csubtree [c] ;
2056 for (c = 0 ; c < nc ; c++)
if (CParent [c] ==
EMPTY) j += Csubtree [c] ;
2065 for (c = nc-1 ; c >= 0 ; c--)
2068 sepsize = Count [c] ;
2069 total_weight = Csubtree [c] ;
2070 PRINT1 ((
"Node "ID" sepsize "ID" subtree "ID" ratio %g\n", c, sepsize,
2071 total_weight, ((
double) sepsize)/((
double) total_weight))) ;
2074 (sepsize > nd_oksep * total_weight || total_weight < (
int) nd_small))
2083 for (k = first ; k < c ; k++)
2086 PRINT1 ((
" collapse node "ID
"\n", k)) ;
2093 PRINT1 ((
"collapse: %d\n", collapse)) ;
2105 for (c = 0 ; c < nc ; c++)
2108 if (CParent [c] >=
EMPTY)
2115 PRINT1 ((
"Collapse the tree from "ID" to "ID" nodes\n", nc, nc_new)) ;
2117 for (c = 0 ; c < nc ; c++)
2119 parent = CParent [c] ;
2120 if (parent >=
EMPTY)
2123 CParent [Map [c]] = (parent ==
EMPTY) ?
EMPTY : Map [parent] ;
2126 for (j = 0 ; j < (
Int) n ; j++)
2128 PRINT1 ((
"j "ID
" Cmember[j] "ID
" Map[Cmember[j]] "ID
"\n",
2129 j, Cmember [j], Map [Cmember [j]])) ;
2130 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)
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)
size_t CHOLMOD() add_size_t(size_t a, size_t b, int *ok)
#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)
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)
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)
static UF_long clear_flag(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)
#define RETURN_IF_NULL(A, result)
int CHOLMOD() dump_parent(Int *Parent, size_t n, char *name, 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)
#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)