Amesos Package Browser (Single Doxygen Collection)  Development
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
amesos_amd_internal.h
Go to the documentation of this file.
1 /* ========================================================================= */
2 /* === amesos_amd_internal.h ====================================================== */
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 /* This file is for internal use in AMD itself, and does not normally need to
13  * be included in user code (it is included in UMFPACK, however). All others
14  * should use amd.h instead.
15  *
16  * The following compile-time definitions affect how AMD is compiled.
17  *
18  * -DNPRINT
19  *
20  * Disable all printing. stdio.h will not be included. Printing can
21  * be re-enabled at run-time by setting the global pointer amesos_amd_printf
22  * to printf (or mexPrintf for a MATLAB mexFunction).
23  *
24  * -DNMALLOC
25  *
26  * No memory manager is defined at compile-time. You MUST define the
27  * function pointers amesos_amd_malloc, amesos_amd_free, amesos_amd_realloc, and
28  * amesos_amd_calloc at run-time for AMD to work properly.
29  */
30 
31 /* ========================================================================= */
32 /* === NDEBUG ============================================================== */
33 /* ========================================================================= */
34 
35 /*
36  * Turning on debugging takes some work (see below). If you do not edit this
37  * file, then debugging is always turned off, regardless of whether or not
38  * -DNDEBUG is specified in your compiler options.
39  *
40  * If AMD is being compiled as a mexFunction, then MATLAB_MEX_FILE is defined,
41  * and mxAssert is used instead of assert. If debugging is not enabled, no
42  * MATLAB include files or functions are used. Thus, the AMD library libamd.a
43  * can be safely used in either a stand-alone C program or in another
44  * mexFunction, without any change.
45  */
46 
47 /*
48  AMD will be exceedingly slow when running in debug mode. The next three
49  lines ensure that debugging is turned off.
50 */
51 #ifndef NDEBUG
52 #define NDEBUG
53 #endif
54 
55 /*
56  To enable debugging, uncomment the following line:
57 #undef NDEBUG
58 */
59 
60 /* ------------------------------------------------------------------------- */
61 /* ANSI include files */
62 /* ------------------------------------------------------------------------- */
63 
64 /* from stdlib.h: size_t, malloc, free, realloc, and calloc */
65 #include <stdlib.h>
66 
67 #if !defined(NPRINT) || !defined(NDEBUG)
68 /* from stdio.h: printf. Not included if NPRINT is defined at compile time.
69  * fopen and fscanf are used when debugging. */
70 #include <stdio.h>
71 #endif
72 
73 /* from limits.h: INT_MAX and LONG_MAX */
74 #include <limits.h>
75 
76 /* from math.h: sqrt */
77 #include <math.h>
78 
79 /* ------------------------------------------------------------------------- */
80 /* MATLAB include files (only if being used in or via MATLAB) */
81 /* ------------------------------------------------------------------------- */
82 
83 #ifdef MATLAB_MEX_FILE
84 #include "matrix.h"
85 #include "mex.h"
86 #endif
87 
88 /* ------------------------------------------------------------------------- */
89 /* basic definitions */
90 /* ------------------------------------------------------------------------- */
91 
92 #ifdef FLIP
93 #undef FLIP
94 #endif
95 
96 #ifdef MAX
97 #undef MAX
98 #endif
99 
100 #ifdef MIN
101 #undef MIN
102 #endif
103 
104 #ifdef EMPTY
105 #undef EMPTY
106 #endif
107 
108 #ifdef GLOBAL
109 #undef GLOBAL
110 #endif
111 
112 #ifdef PRIVATE
113 #undef PRIVATE
114 #endif
115 
116 /* FLIP is a "negation about -1", and is used to mark an integer i that is
117  * normally non-negative. FLIP (EMPTY) is EMPTY. FLIP of a number > EMPTY
118  * is negative, and FLIP of a number < EMTPY is positive. FLIP (FLIP (i)) = i
119  * for all integers i. UNFLIP (i) is >= EMPTY. */
120 #define EMPTY (-1)
121 #define FLIP(i) (-(i)-2)
122 #define UNFLIP(i) ((i < EMPTY) ? FLIP (i) : (i))
123 
124 /* for integer MAX/MIN, or for doubles when we don't care how NaN's behave: */
125 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
126 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
127 
128 /* logical expression of p implies q: */
129 #define IMPLIES(p,q) (!(p) || (q))
130 
131 /* Note that the IBM RS 6000 xlc predefines TRUE and FALSE in <types.h>. */
132 /* The Compaq Alpha also predefines TRUE and FALSE. */
133 #ifdef TRUE
134 #undef TRUE
135 #endif
136 #ifdef FALSE
137 #undef FALSE
138 #endif
139 
140 #define TRUE (1)
141 #define FALSE (0)
142 #define PRIVATE static
143 #define GLOBAL
144 #define EMPTY (-1)
145 
146 /* Note that Linux's gcc 2.96 defines NULL as ((void *) 0), but other */
147 /* compilers (even gcc 2.95.2 on Solaris) define NULL as 0 or (0). We */
148 /* need to use the ANSI standard value of 0. */
149 #ifdef NULL
150 #undef NULL
151 #endif
152 
153 #define NULL 0
154 
155 /* largest value of size_t */
156 #ifndef SIZE_T_MAX
157 #define SIZE_T_MAX ((size_t) (-1))
158 #endif
159 
160 /* ------------------------------------------------------------------------- */
161 /* integer type for AMD: int or UF_long */
162 /* ------------------------------------------------------------------------- */
163 
164 /* define UF_long */
165 #include "amesos_UFconfig.h"
166 
167 #if defined (DLONG) || defined (ZLONG)
168 
169 #define Int UF_long
170 #define ID UF_long_id
171 #define Int_MAX UF_long_max
172 
173 #define AMD_order amesos_amd_l_order
174 #define AMD_defaults amesos_amd_l_defaults
175 #define AMD_control amesos_amd_l_control
176 #define AMD_info amesos_amd_l_info
177 #define AMD_1 amesos_amd_l1
178 #define AMD_2 amesos_amd_l2
179 #define AMD_valid amesos_amd_l_valid
180 #define AMD_aat amesos_amd_l_aat
181 #define AMD_postorder amesos_amd_l_postorder
182 #define AMD_post_tree amesos_amd_l_post_tree
183 #define AMD_dump amesos_amd_l_dump
184 #define AMD_debug amesos_amd_l_debug
185 #define AMD_debug_init amesos_amd_l_debug_init
186 #define AMD_preprocess amesos_amd_l_preprocess
187 
188 #else
189 
190 #define Int int
191 #define ID "%d"
192 #define Int_MAX INT_MAX
193 
194 #define AMD_order amesos_amd_order
195 #define AMD_defaults amesos_amd_defaults
196 #define AMD_control amesos_amd_control
197 #define AMD_info amesos_amd_info
198 #define AMD_1 amesos_amd_1
199 #define AMD_2 amesos_amd_2
200 #define AMD_valid amesos_amd_valid
201 #define AMD_aat amesos_amd_aat
202 #define AMD_postorder amesos_amd_postorder
203 #define AMD_post_tree amesos_amd_post_tree
204 #define AMD_dump amesos_amd_dump
205 #define AMD_debug amesos_amd_debug
206 #define AMD_debug_init amesos_amd_debug_init
207 #define AMD_preprocess amesos_amd_preprocess
208 
209 #endif
210 
211 /* ========================================================================= */
212 /* === PRINTF macro ======================================================== */
213 /* ========================================================================= */
214 
215 /* All output goes through the PRINTF macro. */
216 #define PRINTF(params) { if (amesos_amd_printf != NULL) (void) amesos_amd_printf params ; }
217 
218 /* ------------------------------------------------------------------------- */
219 /* AMD routine definitions (user-callable) */
220 /* ------------------------------------------------------------------------- */
221 
222 #include "amesos_amd.h"
223 
224 /* ------------------------------------------------------------------------- */
225 /* AMD routine definitions (not user-callable) */
226 /* ------------------------------------------------------------------------- */
227 
228 GLOBAL size_t AMD_aat
229 (
230  Int n,
231  const Int Ap [ ],
232  const Int Ai [ ],
233  Int Len [ ],
234  Int Tp [ ],
235  double Info [ ]
236 ) ;
237 
238 GLOBAL void AMD_1
239 (
240  Int n,
241  const Int Ap [ ],
242  const Int Ai [ ],
243  Int P [ ],
244  Int Pinv [ ],
245  Int Len [ ],
246  Int slen,
247  Int S [ ],
248  double Control [ ],
249  double Info [ ]
250 ) ;
251 
253 (
254  Int nn,
255  Int Parent [ ],
256  Int Npiv [ ],
257  Int Fsize [ ],
258  Int Order [ ],
259  Int Child [ ],
260  Int Sibling [ ],
261  Int Stack [ ]
262 ) ;
263 
265 (
266  Int root,
267  Int k,
268  Int Child [ ],
269  const Int Sibling [ ],
270  Int Order [ ],
271  Int Stack [ ]
272 #ifndef NDEBUG
273  , Int nn
274 #endif
275 ) ;
276 
278 (
279  Int n,
280  const Int Ap [ ],
281  const Int Ai [ ],
282  Int Rp [ ],
283  Int Ri [ ],
284  Int W [ ],
285  Int Flag [ ]
286 ) ;
287 
288 /* ------------------------------------------------------------------------- */
289 /* debugging definitions */
290 /* ------------------------------------------------------------------------- */
291 
292 #ifndef NDEBUG
293 
294 /* from assert.h: assert macro */
295 #include <assert.h>
296 
297 #ifndef EXTERN
298 #define EXTERN extern
299 #endif
300 
302 
303 GLOBAL void AMD_debug_init ( char *s ) ;
304 
305 GLOBAL void AMD_dump
306 (
307  Int n,
308  Int Pe [ ],
309  Int Iw [ ],
310  Int Len [ ],
311  Int iwlen,
312  Int pfree,
313  Int Nv [ ],
314  Int Next [ ],
315  Int Last [ ],
316  Int Head [ ],
317  Int Elen [ ],
318  Int Degree [ ],
319  Int W [ ],
320  Int nel
321 ) ;
322 
323 #ifdef ASSERT
324 #undef ASSERT
325 #endif
326 
327 /* Use mxAssert if AMD is compiled into a mexFunction */
328 #ifdef MATLAB_MEX_FILE
329 #define ASSERT(expression) (mxAssert ((expression), ""))
330 #else
331 #define ASSERT(expression) (assert (expression))
332 #endif
333 
334 #define AMD_DEBUG0(params) { PRINTF (params) ; }
335 #define AMD_DEBUG1(params) { if (AMD_debug >= 1) PRINTF (params) ; }
336 #define AMD_DEBUG2(params) { if (AMD_debug >= 2) PRINTF (params) ; }
337 #define AMD_DEBUG3(params) { if (AMD_debug >= 3) PRINTF (params) ; }
338 #define AMD_DEBUG4(params) { if (AMD_debug >= 4) PRINTF (params) ; }
339 
340 #else
341 
342 /* no debugging */
343 #define ASSERT(expression)
344 #define AMD_DEBUG0(params)
345 #define AMD_DEBUG1(params)
346 #define AMD_DEBUG2(params)
347 #define AMD_DEBUG3(params)
348 #define AMD_DEBUG4(params)
349 
350 #endif
#define AMD_1
#define GLOBAL
#define Int
#define P(k)
#define EXTERN
Definition: amesos_amd.h:315
#define AMD_debug
#define AMD_dump
#define AMD_preprocess
#define NDEBUG
#define AMD_post_tree
#define AMD_aat
#define AMD_postorder
#define AMD_debug_init