22 #define IsInCurrentSet(C,i,curC) ((C == NULL) ? 1 : (C [i] == curC))
25 #define InSameConstraintSet(C,i,j) ((C == NULL) ? 1 : (C [i] == C [j]))
39 if (wflg < 2 || wflg >= wbig)
41 for (x = 0 ; x < n ; x++)
43 if (W [x] != 0) W [x] = 1 ;
506 Int deg, degme, dext, lemax, e, elenme, eln, i, ilast, inext, j,
507 jlast, k, knt1, knt2, knt3, lenj, ln, me, mindeg, nel, nleft,
508 nvi, nvj, nvpiv, slenme, wbig, we, wflg, wnvi, ok, ndense, ncmpa, nnull,
561 double f, r, ndiv, s, nms_lu, nms_ldl, dmax, alpha, lnz, lnzme ;
583 Int p, p1, p2, p3, p4, pdst, pend, pj, pme, pme1, pme2, pn, psrc ;
605 Int curC, pBucket, pBucket2, degreeListCounter, c, cmax = 0,
628 ASSERT (iwlen >= pfree + n) ;
662 for (j = 0 ; j < n ; j++)
671 for (i = 0 ; i < n ; i++)
676 for (j = 0 ; j < n ; j++)
681 cmax =
MAX (cmax, c) ;
682 ASSERT (c >= 0 && c < n) ;
685 for (i = 1 ; i < n ; i++)
687 Bucket [i] += Bucket [i-1] ;
689 for (j = n-1 ; j >= 0 ; j--)
691 BucketSet [--Bucket [C [j]]] = j ;
695 CAMD_DEBUG3 ((
"\nConstraint Set "ID" :", C [BucketSet [0]]));
696 for (i = 0 ; i < n ; i++)
704 if (C [BucketSet [i+1]] != C [BucketSet [i]])
706 CAMD_DEBUG3 ((
"\nConstraint Set "ID" :", C [BucketSet [i+1]])) ;
713 if (Control != (
double *)
NULL)
731 dense = alpha * sqrt ((
double) n) ;
733 dense =
MAX (16, dense) ;
734 dense =
MIN (n, dense) ;
736 alpha, aggressive)) ;
738 for (i = 0 ; i < n ; i++)
749 Degree [i] = Len [i] ;
764 for (j = 0 ; j < n ; j++)
768 ASSERT (deg >= 0 && deg < n) ;
769 if (deg > dense || deg == 0)
798 ndense_or_null = ndense + nnull ;
801 degreeListCounter = 0 ;
815 while (degreeListCounter == 0)
819 curC = (C ==
NULL) ? 0 : C [BucketSet [pBucket]] ;
820 for ( ; pBucket < n ; pBucket++)
823 i = BucketSet [pBucket] ;
826 ASSERT (deg >= 0 && deg < n) ;
836 if (inext !=
EMPTY) Last [inext] = i ;
839 degreeListCounter++ ;
841 mindeg =
MIN (mindeg, deg) ;
850 CAMD_dump (n, Pe, Iw, Len, iwlen, pfree, Nv, Next,
851 Last, Head, Elen, Degree, W, nel, BucketSet, C, curC) ;
863 ASSERT (mindeg >= 0 && mindeg < n) ;
864 for (deg = mindeg ; deg < n ; deg++)
867 if (me !=
EMPTY) break ;
870 ASSERT (me >= 0 && me < n) ;
881 degreeListCounter-- ;
909 ASSERT (Pe [me] >= 0 && Pe [me] < iwlen) ;
921 for (p = pme1 ; p <= pme1 + Len [me] - 1 ; p++)
924 ASSERT (i >= 0 && i < n && Nv [i] >= 0) ;
949 if (inext !=
EMPTY) Last [inext] = ilast ;
952 Next [ilast] = inext ;
957 ASSERT (Degree [i] >= 0 && Degree [i] < n) ;
958 Head [Degree [i]] = inext ;
960 degreeListCounter-- ;
974 slenme = Len [me] - elenme ;
976 for (knt1 = 1 ; knt1 <= elenme + 1 ; knt1++)
991 ASSERT (e >= 0 && e < n) ;
995 ASSERT (Elen [e] <
EMPTY && W [e] > 0 && pj >= 0) ;
997 ASSERT (ln >= 0 && (ln == 0 || (pj >= 0 && pj < iwlen))) ;
1006 for (knt2 = 1 ; knt2 <= ln ; knt2++)
1009 ASSERT (i >= 0 && i < n && (i == me || Elen [i] >=
EMPTY));
1012 i, Elen [i], Nv [i], wflg)) ;
1034 if (Len [me] == 0) Pe [me] =
EMPTY ;
1036 Len [e] = ln - knt2 ;
1038 if (Len [e] == 0) Pe [e] =
EMPTY ;
1044 for (j = 0 ; j < n ; j++)
1049 ASSERT (pn >= 0 && pn < iwlen) ;
1051 Iw [pn] =
FLIP (j) ;
1060 while (psrc <= pend)
1063 j =
FLIP (Iw [psrc++]) ;
1067 Iw [pdst] = Pe [j] ;
1071 for (knt3 = 0 ; knt3 <= lenj - 2 ; knt3++)
1073 Iw [pdst++] = Iw [psrc++] ;
1080 for (psrc = pme1 ; psrc <= pfree-1 ; psrc++)
1082 Iw [pdst++] = Iw [psrc] ;
1112 if (inext !=
EMPTY) Last [inext] = ilast ;
1115 Next [ilast] = inext ;
1120 ASSERT (Degree [i] >= 0 && Degree [i] < n) ;
1121 Head [Degree [i]] = inext ;
1123 degreeListCounter-- ;
1137 Pe [e] =
FLIP (me) ;
1158 Degree [me] = degme ;
1160 Len [me] = pme2 - pme1 + 1 ;
1161 ASSERT (Pe [me] >= 0 && Pe [me] < iwlen) ;
1163 Elen [me] =
FLIP (nvpiv + degme) ;
1168 CAMD_DEBUG2 ((
"New element structure: length= "ID"\n", pme2-pme1+1)) ;
1169 for (pme = pme1 ; pme <= pme2 ; pme++)
CAMD_DEBUG3 ((
" "ID"", Iw[pme]));
1201 for (pme = pme1 ; pme <= pme2 ; pme++)
1204 ASSERT (i >= 0 && i < n) ;
1211 ASSERT (nvi > 0 && Pe [i] >= 0 && Pe [i] < iwlen) ;
1213 for (p = Pe [i] ; p <= Pe [i] + eln - 1 ; p++)
1216 ASSERT (e >= 0 && e < n) ;
1230 we = Degree [e] + wnvi ;
1250 for (pme = pme1 ; pme <= pme2 ; pme++)
1253 ASSERT (i >= 0 && i < n && Nv [i] < 0 && Elen [i] >= 0) ;
1256 p2 = p1 + Elen [i] - 1 ;
1260 ASSERT (p1 >= 0 && p1 < iwlen && p2 >= -1 && p2 < iwlen) ;
1269 for (p = p1 ; p <= p2 ; p++)
1272 ASSERT (e >= 0 && e < n) ;
1295 Pe [e] =
FLIP (me) ;
1314 for (p = p1 ; p <= p2 ; p++)
1317 ASSERT (e >= 0 && e < n) ;
1333 Elen [i] = pn - p1 + 1 ;
1344 for (p = p2 + 1 ; p < p4 ; p++)
1347 ASSERT (j >= 0 && j < n) ;
1367 ASSERT (
IMPLIES (aggressive, (deg==0) == (Elen[i]==1 && p3==pn))) ;
1396 CAMD_DEBUG1 ((
" MASS i "ID
" => parent e "ID
"\n", i, me)) ;
1397 Pe [i] =
FLIP (me) ;
1416 Degree [i] =
MIN (Degree [i], deg) ;
1429 Len [i] = pn - p1 + 1 ;
1447 Next [i] =
FLIP (j) ;
1448 Head [hash] =
FLIP (i) ;
1454 Next [i] = Last [j] ;
1463 CAMD_DEBUG4 ((
" s: "ID
" hash "ID
" \n", i, hash)) ;
1468 Degree [me] = degme ;
1475 lemax =
MAX (lemax, degme) ;
1485 for (pme = pme1 ; pme <= pme2 ; pme++)
1488 ASSERT (i >= 0 && i < n) ;
1503 ASSERT (Last [i] >= 0 && Last [i] < n) ;
1517 Head [hash] =
EMPTY ;
1532 CAMD_DEBUG2 ((
"----i "ID
" hash "ID
"\n", i, hash)) ;
1545 ASSERT (ln >= 0 && eln >= 0) ;
1546 ASSERT (Pe [i] >= 0 && Pe [i] < iwlen) ;
1548 for (p = Pe [i] + 1 ; p <= Pe [i] + ln - 1 ; p++)
1550 ASSERT (Iw [p] >= 0 && Iw [p] < n) ;
1568 CAMD_DEBUG3 ((
"compare i "ID
" and j "ID
"\n", i,j)) ;
1572 ASSERT (Len [j] >= 0 && Elen [j] >= 0) ;
1573 ASSERT (Pe [j] >= 0 && Pe [j] < iwlen) ;
1574 ok = (Len [j] == ln) && (Elen [j] == eln) ;
1578 for (p = Pe [j] + 1 ; ok && p <= Pe [j] + ln - 1 ; p++)
1580 ASSERT (Iw [p] >= 0 && Iw [p] < n) ;
1581 if (W [Iw [p]] != wflg) ok = 0 ;
1589 CAMD_DEBUG1 ((
"found it! j "ID
" => i "ID
"\n", j,i));
1633 for (pme = pme1 ; pme <= pme2 ; pme++)
1636 ASSERT (i >= 0 && i < n) ;
1649 deg = Degree [i] + degme - nvi ;
1650 deg =
MIN (deg, nleft - nvi) ;
1651 ASSERT (deg >= 0 && deg < n) ;
1659 inext = Head [deg] ;
1661 if (inext !=
EMPTY) Last [inext] = i ;
1665 degreeListCounter++ ;
1672 mindeg =
MIN (mindeg, deg) ;
1691 Len [me] = p - pme1 ;
1708 BucketSet [pBucket2++] = me ;
1717 if (Info != (
double *)
NULL)
1720 r = degme + ndense ;
1721 dmax =
MAX (dmax, f + r) ;
1724 lnzme = f*r + (f-1)*f/2 ;
1731 s = f*r*r + r*(f-1)*f + (f-1)*f*(2*f-1)/6 ;
1735 nms_ldl += (s + lnzme)/2 ;
1740 for (pme = Pe [me] ; pme <= Pe [me] + Len [me] - 1 ; pme++)
1753 if (Info != (
double *)
NULL)
1758 dmax =
MAX (dmax, (
double) ndense) ;
1768 s = (f-1)*f*(2*f-1)/6 ;
1772 nms_ldl += (s + lnzme)/2 ;
1837 for (i = 0 ; i < n ; i++)
1839 Pe [i] =
FLIP (Pe [i]) ;
1843 for (i = 0 ; i < n ; i++)
1845 Elen [i] =
FLIP (Elen [i]) ;
1852 for (j = n-1 ; j >= 0 ; j--)
1854 if (Nv [j] > 0) continue ;
1855 ASSERT (Pe [j] >= 0 && Pe [j] <= n) ;
1856 Next [j] = Head [Pe [j]] ;
1861 for (e = n-1 ; e >= 0 ; e--)
1863 if (Nv [e] <= 0) continue ;
1864 if (Pe [e] ==
EMPTY) continue ;
1865 Next [e] = Head [Pe [e]] ;
1870 if (C !=
NULL && ndense_or_null > 0)
1884 for (k = 0 , i = 0 ; i < pBucket2 ; i++)
1887 ASSERT (j >= 0 && j < n) ;
1888 if (Pe [j] ==
EMPTY)
1899 ASSERT (k + ndense_or_null == n) ;
1901 if (ndense_or_null > 0)
1920 for (c = 0 ; c <= cmax ; c++)
1925 for (j = Head [n] ; j !=
EMPTY ; j = Next [j])
1928 Pe [j], Elen [j])) ;
1934 ASSERT (i == ndense_or_null) ;
1938 for (c = 0 ; c <= cmax ; c++)
1945 ASSERT (knt1 == ndense_or_null) ;
1949 for (j = Head [n] ; j !=
EMPTY ; j = Next [j])
1951 BucketSet [Bucket [C [j]]++] = j ;
1956 for (i = 1 ; i < k ; i++)
1958 ASSERT (C [Perm [i]] >= C [Perm [i-1]]) ;
1960 for (i = 1 ; i < ndense_or_null ; i++)
1964 (C [BucketSet [i]] > C [BucketSet [i-1]]) ||
1965 (C [BucketSet [i]] == C [BucketSet [i-1]]
1966 && (BucketSet [i] > BucketSet [i-1]))) ;
1974 while (p1 < k && p2 < ndense_or_null)
1978 if (C [Perm [p1]] <= C [BucketSet [p2]])
1981 Last [p3++] = Perm [p1++] ;
1986 Last [p3++] = BucketSet [p2++] ;
1992 Last [p3++] = Perm [p1++] ;
1994 while (p2 < ndense_or_null)
1996 Last [p3++] = BucketSet [p2++] ;
2002 CAMD_DEBUG1 ((
"\nFinal constrained ordering:\n")) ;
2005 Last [i], C [Last [i]])) ;
2006 for (i = 1 ; i < n ; i++)
2008 CAMD_DEBUG1 ((
"Last ["ID
"] = "ID
", C["ID
"] = "ID
"\n", i, Last [i],
2009 Last [i], C [Last [i]])) ;
2013 ASSERT (C [Last [i]] >= C [Last [i-1]]) ;
static Int amesos_clear_flag(Int wflg, Int wbig, Int W[], Int n)
#define CAMD_NMULTSUBS_LDL
#define CAMD_DEBUG3(params)
#define ASSERT(expression)
#define InSameConstraintSet(C, i, j)
#define CAMD_DEBUG1(params)
GLOBAL void CAMD_2(Int n, Int Pe[], Int Iw[], Int Len[], Int iwlen, Int pfree, Int Nv[], Int Next[], Int Last[], Int Head[], Int Elen[], Int Degree[], Int W[], double Control[], double Info[], const Int C[], Int BucketSet[])
#define CAMD_NMULTSUBS_LU
#define CAMD_DEBUG4(params)
#define CAMD_DEFAULT_AGGRESSIVE
#define IsInCurrentSet(C, i, curC)
#define CAMD_DEBUG2(params)
#define CAMD_DEFAULT_DENSE