src/amd/amd_dump.c
changeset 2 4c8956a7bdf4
equal deleted inserted replaced
-1:000000000000 0:5317f91d04d2
       
     1 /* ========================================================================= */
       
     2 /* === AMD_dump ============================================================ */
       
     3 /* ========================================================================= */
       
     4 
       
     5 /* ------------------------------------------------------------------------- */
       
     6 /* AMD, Copyright (c) Timothy A. Davis,                                      */
       
     7 /* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
       
     8 /* email: davis at cise.ufl.edu    CISE Department, Univ. of Florida.        */
       
     9 /* web: http://www.cise.ufl.edu/research/sparse/amd                          */
       
    10 /* ------------------------------------------------------------------------- */
       
    11 
       
    12 /* Debugging routines for AMD.  Not used if NDEBUG is not defined at compile-
       
    13  * time (the default).  See comments in amd_internal.h on how to enable
       
    14  * debugging.  Not user-callable.
       
    15  */
       
    16 
       
    17 #include "amd_internal.h"
       
    18 
       
    19 #ifndef NDEBUG
       
    20 
       
    21 /* This global variable is present only when debugging */
       
    22 GLOBAL Int AMD_debug = -999 ;           /* default is no debug printing */
       
    23 
       
    24 /* ========================================================================= */
       
    25 /* === AMD_debug_init ====================================================== */
       
    26 /* ========================================================================= */
       
    27 
       
    28 /* Sets the debug print level, by reading the file debug.amd (if it exists) */
       
    29 
       
    30 GLOBAL void AMD_debug_init ( char *s )
       
    31 {
       
    32     FILE *f ;
       
    33     f = fopen ("debug.amd", "r") ;
       
    34     if (f == (FILE *) NULL)
       
    35     {
       
    36         AMD_debug = -999 ;
       
    37     }
       
    38     else
       
    39     {
       
    40         fscanf (f, ID, &AMD_debug) ;
       
    41         fclose (f) ;
       
    42     }
       
    43     if (AMD_debug >= 0)
       
    44     {
       
    45         printf ("%s: AMD_debug_init, D= "ID"\n", s, AMD_debug) ;
       
    46     }
       
    47 }
       
    48 
       
    49 /* ========================================================================= */
       
    50 /* === AMD_dump ============================================================ */
       
    51 /* ========================================================================= */
       
    52 
       
    53 /* Dump AMD's data structure, except for the hash buckets.  This routine
       
    54  * cannot be called when the hash buckets are non-empty.
       
    55  */
       
    56 
       
    57 GLOBAL void AMD_dump (
       
    58     Int n,          /* A is n-by-n */
       
    59     Int Pe [ ],     /* pe [0..n-1]: index in iw of start of row i */
       
    60     Int Iw [ ],     /* workspace of size iwlen, iwlen [0..pfree-1]
       
    61                      * holds the matrix on input */
       
    62     Int Len [ ],    /* len [0..n-1]: length for row i */
       
    63     Int iwlen,      /* length of iw */
       
    64     Int pfree,      /* iw [pfree ... iwlen-1] is empty on input */
       
    65     Int Nv [ ],     /* nv [0..n-1] */
       
    66     Int Next [ ],   /* next [0..n-1] */
       
    67     Int Last [ ],   /* last [0..n-1] */
       
    68     Int Head [ ],   /* head [0..n-1] */
       
    69     Int Elen [ ],   /* size n */
       
    70     Int Degree [ ], /* size n */
       
    71     Int W [ ],      /* size n */
       
    72     Int nel
       
    73 )
       
    74 {
       
    75     Int i, pe, elen, nv, len, e, p, k, j, deg, w, cnt, ilast ;
       
    76 
       
    77     if (AMD_debug < 0) return ;
       
    78     ASSERT (pfree <= iwlen) ;
       
    79     AMD_DEBUG3 (("\nAMD dump, pfree: "ID"\n", pfree)) ;
       
    80     for (i = 0 ; i < n ; i++)
       
    81     {
       
    82         pe = Pe [i] ;
       
    83         elen = Elen [i] ;
       
    84         nv = Nv [i] ;
       
    85         len = Len [i] ;
       
    86         w = W [i] ;
       
    87 
       
    88         if (elen >= EMPTY)
       
    89         {
       
    90             if (nv == 0)
       
    91             {
       
    92                 AMD_DEBUG3 (("\nI "ID": nonprincipal:    ", i)) ;
       
    93                 ASSERT (elen == EMPTY) ;
       
    94                 if (pe == EMPTY)
       
    95                 {
       
    96                     AMD_DEBUG3 ((" dense node\n")) ;
       
    97                     ASSERT (w == 1) ;
       
    98                 }
       
    99                 else
       
   100                 {
       
   101                     ASSERT (pe < EMPTY) ;
       
   102                     AMD_DEBUG3 ((" i "ID" -> parent "ID"\n", i, FLIP (Pe[i])));
       
   103                 }
       
   104             }
       
   105             else
       
   106             {
       
   107                 AMD_DEBUG3 (("\nI "ID": active principal supervariable:\n",i));
       
   108                 AMD_DEBUG3 (("   nv(i): "ID"  Flag: %d\n", nv, (nv < 0))) ;
       
   109                 ASSERT (elen >= 0) ;
       
   110                 ASSERT (nv > 0 && pe >= 0) ;
       
   111                 p = pe ;
       
   112                 AMD_DEBUG3 (("   e/s: ")) ;
       
   113                 if (elen == 0) AMD_DEBUG3 ((" : ")) ;
       
   114                 ASSERT (pe + len <= pfree) ;
       
   115                 for (k = 0 ; k < len ; k++)
       
   116                 {
       
   117                     j = Iw [p] ;
       
   118                     AMD_DEBUG3 (("  "ID"", j)) ;
       
   119                     ASSERT (j >= 0 && j < n) ;
       
   120                     if (k == elen-1) AMD_DEBUG3 ((" : ")) ;
       
   121                     p++ ;
       
   122                 }
       
   123                 AMD_DEBUG3 (("\n")) ;
       
   124             }
       
   125         }
       
   126         else
       
   127         {
       
   128             e = i ;
       
   129             if (w == 0)
       
   130             {
       
   131                 AMD_DEBUG3 (("\nE "ID": absorbed element: w "ID"\n", e, w)) ;
       
   132                 ASSERT (nv > 0 && pe < 0) ;
       
   133                 AMD_DEBUG3 ((" e "ID" -> parent "ID"\n", e, FLIP (Pe [e]))) ;
       
   134             }
       
   135             else
       
   136             {
       
   137                 AMD_DEBUG3 (("\nE "ID": unabsorbed element: w "ID"\n", e, w)) ;
       
   138                 ASSERT (nv > 0 && pe >= 0) ;
       
   139                 p = pe ;
       
   140                 AMD_DEBUG3 ((" : ")) ;
       
   141                 ASSERT (pe + len <= pfree) ;
       
   142                 for (k = 0 ; k < len ; k++)
       
   143                 {
       
   144                     j = Iw [p] ;
       
   145                     AMD_DEBUG3 (("  "ID"", j)) ;
       
   146                     ASSERT (j >= 0 && j < n) ;
       
   147                     p++ ;
       
   148                 }
       
   149                 AMD_DEBUG3 (("\n")) ;
       
   150             }
       
   151         }
       
   152     }
       
   153 
       
   154     /* this routine cannot be called when the hash buckets are non-empty */
       
   155     AMD_DEBUG3 (("\nDegree lists:\n")) ;
       
   156     if (nel >= 0)
       
   157     {
       
   158         cnt = 0 ;
       
   159         for (deg = 0 ; deg < n ; deg++)
       
   160         {
       
   161             if (Head [deg] == EMPTY) continue ;
       
   162             ilast = EMPTY ;
       
   163             AMD_DEBUG3 ((ID": \n", deg)) ;
       
   164             for (i = Head [deg] ; i != EMPTY ; i = Next [i])
       
   165             {
       
   166                 AMD_DEBUG3 (("   "ID" : next "ID" last "ID" deg "ID"\n",
       
   167                     i, Next [i], Last [i], Degree [i])) ;
       
   168                 ASSERT (i >= 0 && i < n && ilast == Last [i] &&
       
   169                     deg == Degree [i]) ;
       
   170                 cnt += Nv [i] ;
       
   171                 ilast = i ;
       
   172             }
       
   173             AMD_DEBUG3 (("\n")) ;
       
   174         }
       
   175         ASSERT (cnt == n - nel) ;
       
   176     }
       
   177 
       
   178 }
       
   179 
       
   180 #endif