Amesos Package Browser (Single Doxygen Collection)  Development
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
amesos_amd_dump.c
Go to the documentation of this file.
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 amesos_amd_internal.h on how to enable
14  * debugging. Not user-callable.
15  */
16 
17 #include "amesos_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 
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
void f()
#define EMPTY
#define GLOBAL
#define AMD_DEBUG3(params)
#define Int
GLOBAL void AMD_debug_init(char *s)
#define NULL
GLOBAL void AMD_dump(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[], Int nel)
#define ASSERT(expression)
#define FLIP(i)
#define ID
GLOBAL Int AMD_debug