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]))
36 if (wflg < 2 || wflg >= wbig)
38 for (x = 0 ; x < n ; x++)
40 if (W [x] != 0) W [x] = 1 ;
503 Int deg, degme, dext, lemax, e, elenme, eln, i, ilast, inext, j,
504 jlast, k, knt1, knt2, knt3, lenj, ln, me, mindeg, nel, nleft,
505 nvi, nvj, nvpiv, slenme, wbig, we, wflg, wnvi, ok, ndense, ncmpa, nnull,
558 double f, r, ndiv, s, nms_lu, nms_ldl, dmax, alpha, lnz, lnzme ;
580 Int p, p1, p2, p3, p4, pdst, pend, pj, pme, pme1, pme2, pn, psrc ;
602 Int curC, pBucket, pBucket2, degreeListCounter, c, cmax = 0,
625 ASSERT (iwlen >= pfree + n) ;
659 for (j = 0 ; j < n ; j++)
668 for (i = 0 ; i < n ; i++)
673 for (j = 0 ; j < n ; j++)
678 cmax =
MAX (cmax, c) ;
679 ASSERT (c >= 0 && c < n) ;
682 for (i = 1 ; i < n ; i++)
684 Bucket [i] += Bucket [i-1] ;
686 for (j = n-1 ; j >= 0 ; j--)
688 BucketSet [--Bucket [C [j]]] = j ;
692 CAMD_DEBUG3 ((
"\nConstraint Set "ID" :", C [BucketSet [0]]));
693 for (i = 0 ; i < n ; i++)
701 if (C [BucketSet [i+1]] != C [BucketSet [i]])
703 CAMD_DEBUG3 ((
"\nConstraint Set "ID" :", C [BucketSet [i+1]])) ;
710 if (Control != (
double *)
NULL)
728 dense = (int) ( alpha * sqrt ((
double) n) ) ;
730 dense =
MAX (16, dense) ;
731 dense =
MIN (n, dense) ;
733 alpha, aggressive)) ;
735 for (i = 0 ; i < n ; i++)
746 Degree [i] = Len [i] ;
761 for (j = 0 ; j < n ; j++)
765 ASSERT (deg >= 0 && deg < n) ;
766 if (deg > dense || deg == 0)
795 ndense_or_null = ndense + nnull ;
798 degreeListCounter = 0 ;
812 while (degreeListCounter == 0)
816 curC = (C ==
NULL) ? 0 : C [BucketSet [pBucket]] ;
817 for ( ; pBucket < n ; pBucket++)
820 i = BucketSet [pBucket] ;
823 ASSERT (deg >= 0 && deg < n) ;
833 if (inext !=
EMPTY) Last [inext] = i ;
836 degreeListCounter++ ;
838 mindeg =
MIN (mindeg, deg) ;
847 CAMD_dump (n, Pe, Iw, Len, iwlen, pfree, Nv, Next,
848 Last, Head, Elen, Degree, W, nel, BucketSet, C, curC) ;
860 ASSERT (mindeg >= 0 && mindeg < n) ;
861 for (deg = mindeg ; deg < n ; deg++)
864 if (me !=
EMPTY) break ;
867 ASSERT (me >= 0 && me < n) ;
878 degreeListCounter-- ;
906 ASSERT (Pe [me] >= 0 && Pe [me] < iwlen) ;
918 for (p = pme1 ; p <= pme1 + Len [me] - 1 ; p++)
921 ASSERT (i >= 0 && i < n && Nv [i] >= 0) ;
946 if (inext !=
EMPTY) Last [inext] = ilast ;
949 Next [ilast] = inext ;
954 ASSERT (Degree [i] >= 0 && Degree [i] < n) ;
955 Head [Degree [i]] = inext ;
957 degreeListCounter-- ;
971 slenme = Len [me] - elenme ;
973 for (knt1 = 1 ; knt1 <= elenme + 1 ; knt1++)
988 ASSERT (e >= 0 && e < n) ;
992 ASSERT (Elen [e] <
EMPTY && W [e] > 0 && pj >= 0) ;
994 ASSERT (ln >= 0 && (ln == 0 || (pj >= 0 && pj < iwlen))) ;
1003 for (knt2 = 1 ; knt2 <= ln ; knt2++)
1006 ASSERT (i >= 0 && i < n && (i == me || Elen [i] >=
EMPTY));
1009 i, Elen [i], Nv [i], wflg)) ;
1031 if (Len [me] == 0) Pe [me] =
EMPTY ;
1033 Len [e] = ln - knt2 ;
1035 if (Len [e] == 0) Pe [e] =
EMPTY ;
1041 for (j = 0 ; j < n ; j++)
1046 ASSERT (pn >= 0 && pn < iwlen) ;
1048 Iw [pn] =
FLIP (j) ;
1057 while (psrc <= pend)
1060 j =
FLIP (Iw [psrc++]) ;
1064 Iw [pdst] = Pe [j] ;
1068 for (knt3 = 0 ; knt3 <= lenj - 2 ; knt3++)
1070 Iw [pdst++] = Iw [psrc++] ;
1077 for (psrc = pme1 ; psrc <= pfree-1 ; psrc++)
1079 Iw [pdst++] = Iw [psrc] ;
1109 if (inext !=
EMPTY) Last [inext] = ilast ;
1112 Next [ilast] = inext ;
1117 ASSERT (Degree [i] >= 0 && Degree [i] < n) ;
1118 Head [Degree [i]] = inext ;
1120 degreeListCounter-- ;
1134 Pe [e] =
FLIP (me) ;
1155 Degree [me] = degme ;
1157 Len [me] = pme2 - pme1 + 1 ;
1158 ASSERT (Pe [me] >= 0 && Pe [me] < iwlen) ;
1160 Elen [me] =
FLIP (nvpiv + degme) ;
1165 CAMD_DEBUG2 ((
"New element structure: length= "ID"\n", pme2-pme1+1)) ;
1166 for (pme = pme1 ; pme <= pme2 ; pme++)
CAMD_DEBUG3 ((
" "ID"", Iw[pme]));
1198 for (pme = pme1 ; pme <= pme2 ; pme++)
1201 ASSERT (i >= 0 && i < n) ;
1208 ASSERT (nvi > 0 && Pe [i] >= 0 && Pe [i] < iwlen) ;
1210 for (p = Pe [i] ; p <= Pe [i] + eln - 1 ; p++)
1213 ASSERT (e >= 0 && e < n) ;
1227 we = Degree [e] + wnvi ;
1247 for (pme = pme1 ; pme <= pme2 ; pme++)
1250 ASSERT (i >= 0 && i < n && Nv [i] < 0 && Elen [i] >= 0) ;
1253 p2 = p1 + Elen [i] - 1 ;
1257 ASSERT (p1 >= 0 && p1 < iwlen && p2 >= -1 && p2 < iwlen) ;
1266 for (p = p1 ; p <= p2 ; p++)
1269 ASSERT (e >= 0 && e < n) ;
1292 Pe [e] =
FLIP (me) ;
1311 for (p = p1 ; p <= p2 ; p++)
1314 ASSERT (e >= 0 && e < n) ;
1330 Elen [i] = pn - p1 + 1 ;
1341 for (p = p2 + 1 ; p < p4 ; p++)
1344 ASSERT (j >= 0 && j < n) ;
1364 ASSERT (
IMPLIES (aggressive, (deg==0) == (Elen[i]==1 && p3==pn))) ;
1393 CAMD_DEBUG1 ((
" MASS i "ID
" => parent e "ID
"\n", i, me)) ;
1394 Pe [i] =
FLIP (me) ;
1413 Degree [i] =
MIN (Degree [i], deg) ;
1426 Len [i] = pn - p1 + 1 ;
1444 Next [i] =
FLIP (j) ;
1445 Head [hash] =
FLIP (i) ;
1451 Next [i] = Last [j] ;
1460 CAMD_DEBUG4 ((
" s: "ID
" hash "ID
" \n", i, hash)) ;
1465 Degree [me] = degme ;
1472 lemax =
MAX (lemax, degme) ;
1482 for (pme = pme1 ; pme <= pme2 ; pme++)
1485 ASSERT (i >= 0 && i < n) ;
1500 ASSERT (Last [i] >= 0 && Last [i] < n) ;
1514 Head [hash] =
EMPTY ;
1529 CAMD_DEBUG2 ((
"----i "ID
" hash "ID
"\n", i, hash)) ;
1542 ASSERT (ln >= 0 && eln >= 0) ;
1543 ASSERT (Pe [i] >= 0 && Pe [i] < iwlen) ;
1545 for (p = Pe [i] + 1 ; p <= Pe [i] + ln - 1 ; p++)
1547 ASSERT (Iw [p] >= 0 && Iw [p] < n) ;
1565 CAMD_DEBUG3 ((
"compare i "ID
" and j "ID
"\n", i,j)) ;
1569 ASSERT (Len [j] >= 0 && Elen [j] >= 0) ;
1570 ASSERT (Pe [j] >= 0 && Pe [j] < iwlen) ;
1571 ok = (Len [j] == ln) && (Elen [j] == eln) ;
1575 for (p = Pe [j] + 1 ; ok && p <= Pe [j] + ln - 1 ; p++)
1577 ASSERT (Iw [p] >= 0 && Iw [p] < n) ;
1578 if (W [Iw [p]] != wflg) ok = 0 ;
1586 CAMD_DEBUG1 ((
"found it! j "ID
" => i "ID
"\n", j,i));
1630 for (pme = pme1 ; pme <= pme2 ; pme++)
1633 ASSERT (i >= 0 && i < n) ;
1646 deg = Degree [i] + degme - nvi ;
1647 deg =
MIN (deg, nleft - nvi) ;
1648 ASSERT (deg >= 0 && deg < n) ;
1656 inext = Head [deg] ;
1658 if (inext !=
EMPTY) Last [inext] = i ;
1662 degreeListCounter++ ;
1669 mindeg =
MIN (mindeg, deg) ;
1688 Len [me] = p - pme1 ;
1705 BucketSet [pBucket2++] = me ;
1714 if (Info != (
double *)
NULL)
1717 r = degme + ndense ;
1718 dmax =
MAX (dmax, f + r) ;
1721 lnzme = f*r + (f-1)*f/2 ;
1728 s = f*r*r + r*(f-1)*f + (f-1)*f*(2*f-1)/6 ;
1732 nms_ldl += (s + lnzme)/2 ;
1737 for (pme = Pe [me] ; pme <= Pe [me] + Len [me] - 1 ; pme++)
1750 if (Info != (
double *)
NULL)
1755 dmax =
MAX (dmax, (
double) ndense) ;
1765 s = (f-1)*f*(2*f-1)/6 ;
1769 nms_ldl += (s + lnzme)/2 ;
1834 for (i = 0 ; i < n ; i++)
1836 Pe [i] =
FLIP (Pe [i]) ;
1840 for (i = 0 ; i < n ; i++)
1842 Elen [i] =
FLIP (Elen [i]) ;
1849 for (j = n-1 ; j >= 0 ; j--)
1851 if (Nv [j] > 0) continue ;
1852 ASSERT (Pe [j] >= 0 && Pe [j] <= n) ;
1853 Next [j] = Head [Pe [j]] ;
1858 for (e = n-1 ; e >= 0 ; e--)
1860 if (Nv [e] <= 0) continue ;
1861 if (Pe [e] ==
EMPTY) continue ;
1862 Next [e] = Head [Pe [e]] ;
1867 if (C !=
NULL && ndense_or_null > 0)
1881 for (k = 0 , i = 0 ; i < pBucket2 ; i++)
1884 ASSERT (j >= 0 && j < n) ;
1885 if (Pe [j] ==
EMPTY)
1896 ASSERT (k + ndense_or_null == n) ;
1898 if (ndense_or_null > 0)
1917 for (c = 0 ; c <= cmax ; c++)
1922 for (j = Head [n] ; j !=
EMPTY ; j = Next [j])
1925 Pe [j], Elen [j])) ;
1931 ASSERT (i == ndense_or_null) ;
1935 for (c = 0 ; c <= cmax ; c++)
1942 ASSERT (knt1 == ndense_or_null) ;
1946 for (j = Head [n] ; j !=
EMPTY ; j = Next [j])
1948 BucketSet [Bucket [C [j]]++] = j ;
1953 for (i = 1 ; i < k ; i++)
1955 ASSERT (C [Perm [i]] >= C [Perm [i-1]]) ;
1957 for (i = 1 ; i < ndense_or_null ; i++)
1961 (C [BucketSet [i]] > C [BucketSet [i-1]]) ||
1962 (C [BucketSet [i]] == C [BucketSet [i-1]]
1963 && (BucketSet [i] > BucketSet [i-1]))) ;
1971 while (p1 < k && p2 < ndense_or_null)
1975 if (C [Perm [p1]] <= C [BucketSet [p2]])
1978 Last [p3++] = Perm [p1++] ;
1983 Last [p3++] = BucketSet [p2++] ;
1989 Last [p3++] = Perm [p1++] ;
1991 while (p2 < ndense_or_null)
1993 Last [p3++] = BucketSet [p2++] ;
1999 CAMD_DEBUG1 ((
"\nFinal constrained ordering:\n")) ;
2002 Last [i], C [Last [i]])) ;
2003 for (i = 1 ; i < n ; i++)
2005 CAMD_DEBUG1 ((
"Last ["ID
"] = "ID
", C["ID
"] = "ID
"\n", i, Last [i],
2006 Last [i], C [Last [i]])) ;
2010 ASSERT (C [Last [i]] >= C [Last [i-1]]) ;
#define CAMD_NMULTSUBS_LDL
#define CAMD_DEBUG3(params)
static Int amesos_clear_flag(Int wflg, Int wbig, Int W[], Int n)
#define ASSERT(expression)
#define CAMD_DEBUG1(params)
#define InSameConstraintSet(C, i, j)
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