1 /* ========================================================================== */
2 /* === CCOLAMD/ccolamd.h ==================================================== */
3 /* ========================================================================== */
4 
5 /* ----------------------------------------------------------------------------
6  * CCOLAMD Copyright (C), Univ. of Florida.  Authors: Timothy A. Davis,
7  * Sivasankaran Rajamanickam, and Stefan Larimore
8  * -------------------------------------------------------------------------- */
9 
10 /*
11  *  You must include this file (ccolamd.h) in any routine that uses ccolamd,
12  *  csymamd, or the related macros and definitions.
13  */
14 
15 #ifndef CCOLAMD_H
16 #define CCOLAMD_H
17 
18 /* make it easy for C++ programs to include CCOLAMD */
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 /* for size_t definition: */
24 #include <stdlib.h>
25 
26 /* ========================================================================== */
27 /* === CCOLAMD version ====================================================== */
28 /* ========================================================================== */
29 
30 /* All versions of CCOLAMD will include the following definitions.
31  * As an example, to test if the version you are using is 1.3 or later:
32  *
33  *	if (CCOLAMD_VERSION >= CCOLAMD_VERSION_CODE (1,3)) ...
34  *
35  * This also works during compile-time:
36  *
37  *	#if CCOLAMD_VERSION >= CCOLAMD_VERSION_CODE (1,3)
38  *	    printf ("This is version 1.3 or later\n") ;
39  *	#else
40  *	    printf ("This is an early version\n") ;
41  *	#endif
42  */
43 
44 #define CCOLAMD_DATE "May 4, 2016"
45 #define CCOLAMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub))
46 #define CCOLAMD_MAIN_VERSION 2
47 #define CCOLAMD_SUB_VERSION 9
48 #define CCOLAMD_SUBSUB_VERSION 6
49 #define CCOLAMD_VERSION \
50 	CCOLAMD_VERSION_CODE(CCOLAMD_MAIN_VERSION,CCOLAMD_SUB_VERSION)
51 
52 /* ========================================================================== */
53 /* === Knob and statistics definitions ====================================== */
54 /* ========================================================================== */
55 
56 /* size of the knobs [ ] array.  Only knobs [0..3] are currently used. */
57 #define CCOLAMD_KNOBS 20
58 
59 /* number of output statistics.  Only stats [0..10] are currently used. */
60 #define CCOLAMD_STATS 20
61 
62 /* knobs [0] and stats [0]: dense row knob and output statistic. */
63 #define CCOLAMD_DENSE_ROW 0
64 
65 /* knobs [1] and stats [1]: dense column knob and output statistic. */
66 #define CCOLAMD_DENSE_COL 1
67 
68 /* knobs [2]: aggressive absorption option */
69 #define CCOLAMD_AGGRESSIVE 2
70 
71 /* knobs [3]: LU or Cholesky factorization option */
72 #define CCOLAMD_LU 3
73 
74 /* stats [2]: memory defragmentation count output statistic */
75 #define CCOLAMD_DEFRAG_COUNT 2
76 
77 /* stats [3]: ccolamd status:  zero OK, > 0 warning or notice, < 0 error */
78 #define CCOLAMD_STATUS 3
79 
80 /* stats [4..6]: error info, or info on jumbled columns */
81 #define CCOLAMD_INFO1 4
82 #define CCOLAMD_INFO2 5
83 #define CCOLAMD_INFO3 6
84 
85 /* stats [7]: number of originally empty rows */
86 #define CCOLAMD_EMPTY_ROW 7
87 /* stats [8]: number of originally empty cols */
88 #define CCOLAMD_EMPTY_COL 8
89 /* stats [9]: number of rows with entries only in dense cols */
90 #define CCOLAMD_NEWLY_EMPTY_ROW 9
91 /* stats [10]: number of cols with entries only in dense rows */
92 #define CCOLAMD_NEWLY_EMPTY_COL 10
93 
94 /* error codes returned in stats [3]: */
95 #define CCOLAMD_OK				(0)
96 #define CCOLAMD_OK_BUT_JUMBLED			(1)
97 #define CCOLAMD_ERROR_A_not_present		(-1)
98 #define CCOLAMD_ERROR_p_not_present		(-2)
99 #define CCOLAMD_ERROR_nrow_negative		(-3)
100 #define CCOLAMD_ERROR_ncol_negative		(-4)
101 #define CCOLAMD_ERROR_nnz_negative		(-5)
102 #define CCOLAMD_ERROR_p0_nonzero		(-6)
103 #define CCOLAMD_ERROR_A_too_small		(-7)
104 #define CCOLAMD_ERROR_col_length_negative	(-8)
105 #define CCOLAMD_ERROR_row_index_out_of_bounds	(-9)
106 #define CCOLAMD_ERROR_out_of_memory		(-10)
107 #define CCOLAMD_ERROR_invalid_cmember		(-11)
108 #define CCOLAMD_ERROR_internal_error		(-999)
109 
110 /* ========================================================================== */
111 /* === Prototypes of user-callable routines ================================= */
112 /* ========================================================================== */
113 
114 #include "SuiteSparse_config.h"
115 
116 size_t ccolamd_recommended	/* returns recommended value of Alen, */
117 				/* or 0 if input arguments are erroneous */
118 (
119     int nnz,			/* nonzeros in A */
120     int n_row,			/* number of rows in A */
121     int n_col			/* number of columns in A */
122 ) ;
123 
124 size_t ccolamd_l_recommended	/* returns recommended value of Alen, */
125 				/* or 0 if input arguments are erroneous */
126 (
127     SuiteSparse_long nnz,		/* nonzeros in A */
128     SuiteSparse_long n_row,		/* number of rows in A */
129     SuiteSparse_long n_col		/* number of columns in A */
130 ) ;
131 
132 void ccolamd_set_defaults	/* sets default parameters */
133 (				/* knobs argument is modified on output */
134     double knobs [CCOLAMD_KNOBS]	/* parameter settings for ccolamd */
135 ) ;
136 
137 void ccolamd_l_set_defaults	/* sets default parameters */
138 (				/* knobs argument is modified on output */
139     double knobs [CCOLAMD_KNOBS]	/* parameter settings for ccolamd */
140 ) ;
141 
142 int ccolamd			/* returns (1) if successful, (0) otherwise*/
143 (				/* A and p arguments are modified on output */
144     int n_row,			/* number of rows in A */
145     int n_col,			/* number of columns in A */
146     int Alen,			/* size of the array A */
147     int A [ ],			/* row indices of A, of size Alen */
148     int p [ ],			/* column pointers of A, of size n_col+1 */
149     double knobs [CCOLAMD_KNOBS],/* parameter settings for ccolamd */
150     int stats [CCOLAMD_STATS],	/* ccolamd output statistics and error codes */
151     int cmember [ ]		/* Constraint set of A, of size n_col */
152 ) ;
153 
154 SuiteSparse_long ccolamd_l      /* as ccolamd w/ SuiteSparse_long integers */
155 (
156     SuiteSparse_long n_row,
157     SuiteSparse_long n_col,
158     SuiteSparse_long Alen,
159     SuiteSparse_long A [ ],
160     SuiteSparse_long p [ ],
161     double knobs [CCOLAMD_KNOBS],
162     SuiteSparse_long stats [CCOLAMD_STATS],
163     SuiteSparse_long cmember [ ]
164 ) ;
165 
166 int csymamd			/* return (1) if OK, (0) otherwise */
167 (
168     int n,			/* number of rows and columns of A */
169     int A [ ],			/* row indices of A */
170     int p [ ],			/* column pointers of A */
171     int perm [ ],		/* output permutation, size n_col+1 */
172     double knobs [CCOLAMD_KNOBS],/* parameters (uses defaults if NULL) */
173     int stats [CCOLAMD_STATS],	/* output statistics and error codes */
174     void * (*allocate) (size_t, size_t), /* pointer to calloc (ANSI C) or */
175 				/* mxCalloc (for MATLAB mexFunction) */
176     void (*release) (void *),	/* pointer to free (ANSI C) or */
177     				/* mxFree (for MATLAB mexFunction) */
178     int cmember [ ],		/* Constraint set of A */
179     int stype			/* 0: use both parts, >0: upper, <0: lower */
180 ) ;
181 
182 SuiteSparse_long csymamd_l      /* as csymamd, w/ SuiteSparse_long integers */
183 (
184     SuiteSparse_long n,
185     SuiteSparse_long A [ ],
186     SuiteSparse_long p [ ],
187     SuiteSparse_long perm [ ],
188     double knobs [CCOLAMD_KNOBS],
189     SuiteSparse_long stats [CCOLAMD_STATS],
190     void * (*allocate) (size_t, size_t),
191     void (*release) (void *),
192     SuiteSparse_long cmember [ ],
193     SuiteSparse_long stype
194 ) ;
195 
196 void ccolamd_report
197 (
198     int stats [CCOLAMD_STATS]
199 ) ;
200 
201 void ccolamd_l_report
202 (
203     SuiteSparse_long stats [CCOLAMD_STATS]
204 ) ;
205 
206 void csymamd_report
207 (
208     int stats [CCOLAMD_STATS]
209 ) ;
210 
211 void csymamd_l_report
212 (
213     SuiteSparse_long stats [CCOLAMD_STATS]
214 ) ;
215 
216 
217 /* ========================================================================== */
218 /* === Prototypes of "expert" routines ====================================== */
219 /* ========================================================================== */
220 
221 /* These routines are meant to be used internally, or in a future version of
222  * UMFPACK.  They appear here so that UMFPACK can use them, but they should not
223  * be called directly by the user.
224  */
225 
226 int ccolamd2
227 (				/* A and p arguments are modified on output */
228     int n_row,			/* number of rows in A */
229     int n_col,			/* number of columns in A */
230     int Alen,			/* size of the array A */
231     int A [ ],			/* row indices of A, of size Alen */
232     int p [ ],			/* column pointers of A, of size n_col+1 */
233     double knobs [CCOLAMD_KNOBS],/* parameter settings for ccolamd */
234     int stats [CCOLAMD_STATS],	/* ccolamd output statistics and error codes */
235     /* each Front_ array is of size n_col+1: */
236     int Front_npivcol [ ],	/* # pivot cols in each front */
237     int Front_nrows [ ],	/* # of rows in each front (incl. pivot rows) */
238     int Front_ncols [ ],	/* # of cols in each front (incl. pivot cols) */
239     int Front_parent [ ],	/* parent of each front */
240     int Front_cols [ ],		/* link list of pivot columns for each front */
241     int *p_nfr,			/* total number of frontal matrices */
242     int InFront [ ],		/* InFront [row] = f if row in front f */
243     int cmember [ ]		/* Constraint set of A */
244 ) ;
245 
246 SuiteSparse_long ccolamd2_l     /* as ccolamd2, w/ SuiteSparse_long integers */
247 (
248     SuiteSparse_long n_row,
249     SuiteSparse_long n_col,
250     SuiteSparse_long Alen,
251     SuiteSparse_long A [ ],
252     SuiteSparse_long p [ ],
253     double knobs [CCOLAMD_KNOBS],
254     SuiteSparse_long stats [CCOLAMD_STATS],
255     SuiteSparse_long Front_npivcol [ ],
256     SuiteSparse_long Front_nrows [ ],
257     SuiteSparse_long Front_ncols [ ],
258     SuiteSparse_long Front_parent [ ],
259     SuiteSparse_long Front_cols [ ],
260     SuiteSparse_long *p_nfr,
261     SuiteSparse_long InFront [ ],
262     SuiteSparse_long cmember [ ]
263 ) ;
264 
265 void ccolamd_apply_order
266 (
267     int Front [ ],
268     const int Order [ ],
269     int Temp [ ],
270     int nn,
271     int nfr
272 ) ;
273 
274 void ccolamd_l_apply_order
275 (
276     SuiteSparse_long Front [ ],
277     const SuiteSparse_long Order [ ],
278     SuiteSparse_long Temp [ ],
279     SuiteSparse_long nn,
280     SuiteSparse_long nfr
281 ) ;
282 
283 
284 void ccolamd_fsize
285 (
286     int nn,
287     int MaxFsize [ ],
288     int Fnrows [ ],
289     int Fncols [ ],
290     int Parent [ ],
291     int Npiv [ ]
292 ) ;
293 
294 void ccolamd_l_fsize
295 (
296     SuiteSparse_long nn,
297     SuiteSparse_long MaxFsize [ ],
298     SuiteSparse_long Fnrows [ ],
299     SuiteSparse_long Fncols [ ],
300     SuiteSparse_long Parent [ ],
301     SuiteSparse_long Npiv [ ]
302 ) ;
303 
304 void ccolamd_postorder
305 (
306     int nn,
307     int Parent [ ],
308     int Npiv [ ],
309     int Fsize [ ],
310     int Order [ ],
311     int Child [ ],
312     int Sibling [ ],
313     int Stack [ ],
314     int Front_cols [ ],
315     int cmember [ ]
316 ) ;
317 
318 void ccolamd_l_postorder
319 (
320     SuiteSparse_long nn,
321     SuiteSparse_long Parent [ ],
322     SuiteSparse_long Npiv [ ],
323     SuiteSparse_long Fsize [ ],
324     SuiteSparse_long Order [ ],
325     SuiteSparse_long Child [ ],
326     SuiteSparse_long Sibling [ ],
327     SuiteSparse_long Stack [ ],
328     SuiteSparse_long Front_cols [ ],
329     SuiteSparse_long cmember [ ]
330 ) ;
331 
332 int ccolamd_post_tree
333 (
334     int root,
335     int k,
336     int Child [ ],
337     const int Sibling [ ],
338     int Order [ ],
339     int Stack [ ]
340 ) ;
341 
342 SuiteSparse_long ccolamd_l_post_tree
343 (
344     SuiteSparse_long root,
345     SuiteSparse_long k,
346     SuiteSparse_long Child [ ],
347     const SuiteSparse_long Sibling [ ],
348     SuiteSparse_long Order [ ],
349     SuiteSparse_long Stack [ ]
350 ) ;
351 
352 #ifdef __cplusplus
353 }
354 #endif
355 
356 #endif
357