29 if (wflg < 2 || wflg >= wbig)
31 for (x = 0 ; x < n ; x++)
33 if (W [x] != 0) W [x] = 1 ;
464 Int deg, degme, dext, lemax, e, elenme, eln, i, ilast, inext, j,
465 jlast, jnext, k, knt1, knt2, knt3, lenj, ln, me, mindeg, nel, nleft,
466 nvi, nvj, nvpiv, slenme, wbig, we, wflg, wnvi, ok, ndense, ncmpa,
519 double f, r, ndiv, s, nms_lu, nms_ldl, dmax, alpha, lnz, lnzme ;
541 Int p, p1, p2, p3, p4, pdst, pend, pj, pme, pme1, pme2, pn, psrc ;
571 ASSERT (iwlen >= pfree + n) ;
588 if (Control != (
double *)
NULL)
606 dense = alpha * sqrt ((
double) n) ;
608 dense =
MAX (16, dense) ;
609 dense =
MIN (n, dense) ;
611 alpha, aggressive)) ;
613 for (i = 0 ; i < n ; i++)
624 Degree [i] = Len [i] ;
629 AMD_dump (n, Pe, Iw, Len, iwlen, pfree, Nv, Next, Last,
630 Head, Elen, Degree, W, -1) ;
643 for (i = 0 ; i < n ; i++)
646 ASSERT (deg >= 0 && deg < n) ;
657 Elen [i] =
FLIP (1) ;
663 else if (deg > dense)
690 if (inext !=
EMPTY) Last [inext] = i ;
708 AMD_dump (n, Pe, Iw, Len, iwlen, pfree, Nv, Next,
709 Last, Head, Elen, Degree, W, nel) ;
721 ASSERT (mindeg >= 0 && mindeg < n) ;
722 for (deg = mindeg ; deg < n ; deg++)
725 if (me !=
EMPTY) break ;
728 ASSERT (me >= 0 && me < n) ;
765 ASSERT (Pe [me] >= 0 && Pe [me] < iwlen) ;
777 for (p = pme1 ; p <= pme1 + Len [me] - 1 ; p++)
780 ASSERT (i >= 0 && i < n && Nv [i] >= 0) ;
803 if (inext !=
EMPTY) Last [inext] = ilast ;
806 Next [ilast] = inext ;
811 ASSERT (Degree [i] >= 0 && Degree [i] < n) ;
812 Head [Degree [i]] = inext ;
826 slenme = Len [me] - elenme ;
828 for (knt1 = 1 ; knt1 <= elenme + 1 ; knt1++)
843 ASSERT (e >= 0 && e < n) ;
847 ASSERT (Elen [e] <
EMPTY && W [e] > 0 && pj >= 0) ;
849 ASSERT (ln >= 0 && (ln == 0 || (pj >= 0 && pj < iwlen))) ;
858 for (knt2 = 1 ; knt2 <= ln ; knt2++)
861 ASSERT (i >= 0 && i < n && (i == me || Elen [i] >=
EMPTY));
864 i, Elen [i], Nv [i], wflg)) ;
886 if (Len [me] == 0) Pe [me] =
EMPTY ;
888 Len [e] = ln - knt2 ;
890 if (Len [e] == 0) Pe [e] =
EMPTY ;
896 for (j = 0 ; j < n ; j++)
901 ASSERT (pn >= 0 && pn < iwlen) ;
915 j =
FLIP (Iw [psrc++]) ;
923 for (knt3 = 0 ; knt3 <= lenj - 2 ; knt3++)
925 Iw [pdst++] = Iw [psrc++] ;
932 for (psrc = pme1 ; psrc <= pfree-1 ; psrc++)
934 Iw [pdst++] = Iw [psrc] ;
952 AMD_DEBUG2 ((
" s: "ID
" nv "ID
"\n", i, Nv [i]));
962 if (inext !=
EMPTY) Last [inext] = ilast ;
965 Next [ilast] = inext ;
970 ASSERT (Degree [i] >= 0 && Degree [i] < n) ;
971 Head [Degree [i]] = inext ;
994 Degree [me] = degme ;
996 Len [me] = pme2 - pme1 + 1 ;
997 ASSERT (Pe [me] >= 0 && Pe [me] < iwlen) ;
999 Elen [me] =
FLIP (nvpiv + degme) ;
1004 AMD_DEBUG2 ((
"New element structure: length= "ID"\n", pme2-pme1+1)) ;
1005 for (pme = pme1 ; pme <= pme2 ; pme++)
AMD_DEBUG3 ((
" "ID"", Iw[pme]));
1037 for (pme = pme1 ; pme <= pme2 ; pme++)
1040 ASSERT (i >= 0 && i < n) ;
1047 ASSERT (nvi > 0 && Pe [i] >= 0 && Pe [i] < iwlen) ;
1049 for (p = Pe [i] ; p <= Pe [i] + eln - 1 ; p++)
1052 ASSERT (e >= 0 && e < n) ;
1058 AMD_DEBUG4 ((
" unabsorbed, first time seen")) ;
1066 we = Degree [e] + wnvi ;
1086 for (pme = pme1 ; pme <= pme2 ; pme++)
1089 ASSERT (i >= 0 && i < n && Nv [i] < 0 && Elen [i] >= 0) ;
1092 p2 = p1 + Elen [i] - 1 ;
1096 ASSERT (p1 >= 0 && p1 < iwlen && p2 >= -1 && p2 < iwlen) ;
1105 for (p = p1 ; p <= p2 ; p++)
1108 ASSERT (e >= 0 && e < n) ;
1120 AMD_DEBUG4 ((
" e: "ID
" hash = "ID
"\n",e,hash)) ;
1125 AMD_DEBUG1 ((
" Element "ID
" =>"ID
" (aggressive)\n",
1128 Pe [e] =
FLIP (me) ;
1136 for (p = p1 ; p <= p2 ; p++)
1139 ASSERT (e >= 0 && e < n) ;
1149 AMD_DEBUG4 ((
" e: "ID
" hash = "ID
"\n",e,hash)) ;
1155 Elen [i] = pn - p1 + 1 ;
1166 for (p = p2 + 1 ; p < p4 ; p++)
1169 ASSERT (j >= 0 && j < n) ;
1178 AMD_DEBUG4 ((
" s: "ID
" hash "ID
" Nv[j]= "ID
"\n",
1189 ASSERT (
IMPLIES (aggressive, (deg==0) == (Elen[i]==1 && p3==pn))) ;
1191 if (Elen [i] == 1 && p3 == pn)
1218 AMD_DEBUG1 ((
" MASS i "ID
" => parent e "ID
"\n", i, me)) ;
1219 Pe [i] =
FLIP (me) ;
1238 Degree [i] =
MIN (Degree [i], deg) ;
1251 Len [i] = pn - p1 + 1 ;
1269 Next [i] =
FLIP (j) ;
1270 Head [hash] =
FLIP (i) ;
1276 Next [i] = Last [j] ;
1289 Degree [me] = degme ;
1296 lemax =
MAX (lemax, degme) ;
1305 AMD_DEBUG1 ((
"Detecting supervariables:\n")) ;
1306 for (pme = pme1 ; pme <= pme2 ; pme++)
1309 ASSERT (i >= 0 && i < n) ;
1322 ASSERT (Last [i] >= 0 && Last [i] < n) ;
1336 Head [hash] =
EMPTY ;
1351 AMD_DEBUG2 ((
"----i "ID
" hash "ID
"\n", i, hash)) ;
1364 ASSERT (ln >= 0 && eln >= 0) ;
1365 ASSERT (Pe [i] >= 0 && Pe [i] < iwlen) ;
1367 for (p = Pe [i] + 1 ; p <= Pe [i] + ln - 1 ; p++)
1369 ASSERT (Iw [p] >= 0 && Iw [p] < n) ;
1387 AMD_DEBUG3 ((
"compare i "ID
" and j "ID
"\n", i,j)) ;
1390 ASSERT (Len [j] >= 0 && Elen [j] >= 0) ;
1391 ASSERT (Pe [j] >= 0 && Pe [j] < iwlen) ;
1392 ok = (Len [j] == ln) && (Elen [j] == eln) ;
1394 for (p = Pe [j] + 1 ; ok && p <= Pe [j] + ln - 1 ; p++)
1396 ASSERT (Iw [p] >= 0 && Iw [p] < n) ;
1397 if (W [Iw [p]] != wflg) ok = 0 ;
1405 AMD_DEBUG1 ((
"found it! j "ID
" => i "ID
"\n", j,i));
1449 for (pme = pme1 ; pme <= pme2 ; pme++)
1452 ASSERT (i >= 0 && i < n) ;
1465 deg = Degree [i] + degme - nvi ;
1466 deg =
MIN (deg, nleft - nvi) ;
1467 ASSERT (
IMPLIES (aggressive, deg > 0) && deg >= 0 && deg < n) ;
1473 inext = Head [deg] ;
1475 if (inext !=
EMPTY) Last [inext] = i ;
1484 mindeg =
MIN (mindeg, deg) ;
1504 Len [me] = p - pme1 ;
1526 if (Info != (
double *)
NULL)
1529 r = degme + ndense ;
1530 dmax =
MAX (dmax, f + r) ;
1533 lnzme = f*r + (f-1)*f/2 ;
1540 s = f*r*r + r*(f-1)*f + (f-1)*f*(2*f-1)/6 ;
1544 nms_ldl += (s + lnzme)/2 ;
1548 AMD_DEBUG2 ((
"finalize done nel "ID" n "ID"\n ::::\n", nel, n)) ;
1549 for (pme = Pe [me] ; pme <= Pe [me] + Len [me] - 1 ; pme++)
1562 if (Info != (
double *)
NULL)
1567 dmax =
MAX (dmax, (
double) ndense) ;
1577 s = (f-1)*f*(2*f-1)/6 ;
1581 nms_ldl += (s + lnzme)/2 ;
1637 for (i = 0 ; i < n ; i++)
1639 Pe [i] =
FLIP (Pe [i]) ;
1643 for (i = 0 ; i < n ; i++)
1645 Elen [i] =
FLIP (Elen [i]) ;
1653 for (i = 0 ; i < n ; i++)
1661 AMD_DEBUG2 ((
" element, size is "ID
"\n", Elen [i])) ;
1667 for (e = 0 ; e < n ; e++)
1672 Elen [e], Nv [e])) ;
1676 for (i = 0 ; i < n ; i++)
1691 ASSERT (j >= 0 && j < n) ;
1698 if (cnt > n) break ;
1711 for (i = 0 ; i < n ; i++)
1723 AMD_DEBUG1 ((
"Path compression, i unordered: "ID"\n", i)) ;
1740 ASSERT (j >= 0 && j < n) ;
1760 ASSERT (j >= 0 && j < n) ;
1781 for (k = 0 ; k < n ; k++)
1786 for (e = 0 ; e < n ; e++)
1792 ASSERT (k >= 0 && k < n) ;
1800 for (k = 0 ; k < n ; k++)
1803 if (e ==
EMPTY) break ;
1804 ASSERT (e >= 0 && e < n && Nv [e] > 0) ;
1808 ASSERT (nel == n - ndense) ;
1811 for (i = 0 ; i < n ; i++)
1824 Next [i] = Next [e] ;
1838 for (i = 0 ; i < n ; i++)
1841 ASSERT (k >= 0 && k < n) ;
#define AMD_NMULTSUBS_LDL
#define AMD_DEBUG1(params)
#define AMD_DEBUG3(params)
#define AMD_DEFAULT_AGGRESSIVE
#define ASSERT(expression)
#define AMD_DEBUG4(params)
#define AMD_DEBUG2(params)
static Int amesos_clear_flag(Int wflg, Int wbig, Int W[], Int n)
#define AMD_DEFAULT_DENSE
GLOBAL void AMD_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[])