Mercurial > octave-nkf
comparison liboctave/UMFPACK/AMD/Source/amd_dump.c @ 5164:57077d0ddc8e
[project @ 2005-02-25 19:55:24 by jwe]
author | jwe |
---|---|
date | Fri, 25 Feb 2005 19:55:28 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
5163:9f3299378193 | 5164:57077d0ddc8e |
---|---|
1 /* ========================================================================= */ | |
2 /* === AMD_dump ============================================================ */ | |
3 /* ========================================================================= */ | |
4 | |
5 /* ------------------------------------------------------------------------- */ | |
6 /* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ | |
7 /* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ | |
8 /* email: davis@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) printf ("%s: AMD_debug_init, D= "ID"\n", s, AMD_debug); | |
44 } | |
45 | |
46 /* ========================================================================= */ | |
47 /* === AMD_dump ============================================================ */ | |
48 /* ========================================================================= */ | |
49 | |
50 /* Dump AMD's data structure, except for the hash buckets. This routine | |
51 * cannot be called when the hash buckets are non-empty. | |
52 */ | |
53 | |
54 GLOBAL void AMD_dump ( | |
55 Int n, /* A is n-by-n */ | |
56 Int Pe [ ], /* pe [0..n-1]: index in iw of start of row i */ | |
57 Int Iw [ ], /* workspace of size iwlen, iwlen [0..pfree-1] | |
58 * holds the matrix on input */ | |
59 Int Len [ ], /* len [0..n-1]: length for row i */ | |
60 Int iwlen, /* length of iw */ | |
61 Int pfree, /* iw [pfree ... iwlen-1] is empty on input */ | |
62 Int Nv [ ], /* nv [0..n-1] */ | |
63 Int Next [ ], /* next [0..n-1] */ | |
64 Int Last [ ], /* last [0..n-1] */ | |
65 Int Head [ ], /* head [0..n-1] */ | |
66 Int Elen [ ], /* size n */ | |
67 Int Degree [ ], /* size n */ | |
68 Int W [ ], /* size n */ | |
69 Int nel | |
70 ) | |
71 { | |
72 Int i, pe, elen, nv, len, e, p, k, j, deg, w, cnt, ilast ; | |
73 | |
74 if (AMD_debug < 0) return ; | |
75 ASSERT (pfree <= iwlen) ; | |
76 for (i = 0 ; i < n ; i++) | |
77 { | |
78 pe = Pe [i] ; | |
79 elen = Elen [i] ; | |
80 nv = Nv [i] ; | |
81 len = Len [i] ; | |
82 w = W [i] ; | |
83 | |
84 if (elen >= EMPTY) | |
85 { | |
86 if (nv == 0) | |
87 { | |
88 AMD_DEBUG3 (("\nI "ID": nonprincipal: ", i)) ; | |
89 ASSERT (elen == EMPTY) ; | |
90 if (pe == EMPTY) | |
91 { | |
92 AMD_DEBUG3 ((" dense node\n")) ; | |
93 ASSERT (w == 1) ; | |
94 } | |
95 else | |
96 { | |
97 ASSERT (pe < EMPTY) ; | |
98 AMD_DEBUG3 ((" i "ID" -> parent "ID"\n", i, FLIP (Pe[i]))); | |
99 } | |
100 } | |
101 else | |
102 { | |
103 AMD_DEBUG3 (("\nI "ID": active principal supervariable:\n",i)); | |
104 AMD_DEBUG3 ((" nv(i): "ID" Flag: %d\n", nv, (nv < 0))) ; | |
105 ASSERT (elen >= 0) ; | |
106 ASSERT (nv > 0 && pe >= 0) ; | |
107 p = pe ; | |
108 AMD_DEBUG3 ((" e/s: ")) ; | |
109 if (elen == 0) AMD_DEBUG3 ((" : ")) ; | |
110 ASSERT (pe < pfree) ; | |
111 for (k = 0 ; k < len ; k++) | |
112 { | |
113 j = Iw [p] ; | |
114 AMD_DEBUG3 ((" "ID"", j)) ; | |
115 ASSERT (j >= 0 && j < n) ; | |
116 if (k == elen-1) AMD_DEBUG3 ((" : ")) ; | |
117 p++ ; | |
118 } | |
119 AMD_DEBUG3 (("\n")) ; | |
120 } | |
121 } | |
122 else | |
123 { | |
124 e = i ; | |
125 if (w == 0) | |
126 { | |
127 AMD_DEBUG3 (("\nE "ID": absorbed element: w "ID"\n", e, w)) ; | |
128 ASSERT (nv > 0 && pe < 0) ; | |
129 AMD_DEBUG3 ((" e "ID" -> parent "ID"\n", e, FLIP (Pe [e]))) ; | |
130 } | |
131 else | |
132 { | |
133 AMD_DEBUG3 (("\nE "ID": unabsorbed element: w "ID"\n", e, w)) ; | |
134 ASSERT (nv > 0 && pe >= 0) ; | |
135 p = pe ; | |
136 AMD_DEBUG3 ((" : ")) ; | |
137 ASSERT (pe < pfree) ; | |
138 for (k = 0 ; k < len ; k++) | |
139 { | |
140 j = Iw [p] ; | |
141 AMD_DEBUG3 ((" "ID"", j)) ; | |
142 ASSERT (j >= 0 && j < n) ; | |
143 p++ ; | |
144 } | |
145 AMD_DEBUG3 (("\n")) ; | |
146 } | |
147 } | |
148 } | |
149 | |
150 /* this routine cannot be called when the hash buckets are non-empty */ | |
151 AMD_DEBUG3 (("\nDegree lists:\n")) ; | |
152 if (nel >= 0) | |
153 { | |
154 cnt = 0 ; | |
155 for (deg = 0 ; deg < n ; deg++) | |
156 { | |
157 if (Head [deg] == EMPTY) continue ; | |
158 ilast = EMPTY ; | |
159 AMD_DEBUG3 ((ID": ", deg)) ; | |
160 for (i = Head [deg] ; i != EMPTY ; i = Next [i]) | |
161 { | |
162 AMD_DEBUG3 ((" "ID" : next "ID" last "ID" deg "ID"\n", | |
163 i, Next [i], Last [i], Degree [i])) ; | |
164 ASSERT (i >= 0 && i < n && ilast == Last [i] && | |
165 deg == Degree [i]) ; | |
166 cnt += Nv [i] ; | |
167 ilast = i ; | |
168 } | |
169 AMD_DEBUG3 (("\n")) ; | |
170 } | |
171 ASSERT (cnt == n - nel) ; | |
172 } | |
173 | |
174 } | |
175 | |
176 #endif |