1 /* ========================================================================== */
2 /* === ccolamd and csymamd example (long integer version) =================== */
3 /* ========================================================================== */
4 
5 /* ----------------------------------------------------------------------------
6  * CCOLAMD Copyright (C), Univ. of Florida.  Authors: Timothy A. Davis,
7  * Sivasankaran Rajamanickam, and Stefan Larimore
8  * -------------------------------------------------------------------------- */
9 
10 /*
11  *  ccolamd example of use, to order the columns of a 5-by-4 matrix with
12  *  11 nonzero entries in the following nonzero pattern, with default knobs
13  *  and no ordering constraints.
14  *
15  *     x 0 x 0
16  *     x 0 x x
17  *     0 x x 0
18  *     0 0 x x
19  *     x x 0 0
20  *
21  *  csymamd example of use, to order the rows and columns of a 5-by-5
22  *  matrix with 13 nonzero entries in the following nonzero pattern,
23  *  with default knobs and no ordering constraints.
24  *
25  *     x x 0 0 0
26  *     x x x x 0
27  *     0 x x 0 0
28  *     0 x 0 x x
29  *     0 0 0 x x
30  *
31  *  (where x denotes a nonzero value).
32  */
33 
34 /* ========================================================================== */
35 
36 #include <stdio.h>
37 #include "ccolamd.h"
38 
39 #define A_NNZ 11
40 #define A_NROW 5
41 #define A_NCOL 4
42 #define ALEN 150    /* size max (2.2*nnz+17*ncol+7*nrow+6, 23*ncol+7*nrow+6) */
43 
44 #define B_NNZ 4
45 #define B_N 5
46 
main(void)47 int main (void)
48 {
49 
50     /* ====================================================================== */
51     /* input matrix A definition */
52     /* ====================================================================== */
53 
54     SuiteSparse_long A [ALEN] = {
55 
56     	0, 1, 4,		/* row indices of nonzeros in column 0 */
57 	2, 4,			/* row indices of nonzeros in column 1 */
58 	0, 1, 2, 3,		/* row indices of nonzeros in column 2 */
59 	1, 3} ;			/* row indices of nonzeros in column 3 */
60 
61     SuiteSparse_long p [ ] = {
62 
63     	0,			/* column 0 is in A [0..2] */
64 	3,			/* column 1 is in A [3..4] */
65 	5,			/* column 2 is in A [5..8] */
66 	9,			/* column 3 is in A [9..10] */
67 	A_NNZ} ;		/* number of nonzeros in A */
68 
69     /* ====================================================================== */
70     /* input matrix B definition */
71     /* ====================================================================== */
72 
73     SuiteSparse_long B [ ] = {  /* Note: only strictly lower triangular part */
74     				/* is included, since symamd ignores the */
75 				/* diagonal and upper triangular part of B. */
76 
77     	1,			/* row indices of nonzeros in column 0 */
78     	2, 3,			/* row indices of nonzeros in column 1 */
79     				/* row indices of nonzeros in column 2 (none) */
80     	4			/* row indices of nonzeros in column 3 */
81     	} ;			/* row indices of nonzeros in column 4 (none) */
82 
83     SuiteSparse_long q [ ] = {
84 
85     	0,			/* column 0 is in B [0] */
86 	1,			/* column 1 is in B [1..2] */
87 	3,			/* column 2 is empty */
88 	3,			/* column 3 is in B [3] */
89 	4,			/* column 4 is empty */
90 	B_NNZ} ;		/* number of nonzeros in strictly lower B */
91 
92     /* ====================================================================== */
93     /* other variable definitions */
94     /* ====================================================================== */
95 
96     SuiteSparse_long perm [B_N+1] ;	    /* note the size is N+1 */
97     SuiteSparse_long stats [CCOLAMD_STATS] ;  /* ccolamd/csymamd output stats */
98     SuiteSparse_long row, col, pp, length, ok ;
99 
100     /* ====================================================================== */
101     /* dump the input matrix A */
102     /* ====================================================================== */
103 
104     printf ("ccolamd %d-by-%d input matrix:\n", A_NROW, A_NCOL) ;
105     for (col = 0 ; col < A_NCOL ; col++)
106     {
107 	length = p [col+1] - p [col] ;
108     	printf ("Column %ld, with %ld entries:\n", col, length) ;
109 	for (pp = p [col] ; pp < p [col+1] ; pp++)
110 	{
111 	    row = A [pp] ;
112 	    printf ("    row %ld\n", row) ;
113 	}
114     }
115 
116     /* ====================================================================== */
117     /* order the matrix.  Note that this destroys A and overwrites p */
118     /* ====================================================================== */
119 
120     ok = ccolamd_l (A_NROW, A_NCOL, ALEN, A, p, (double *) NULL, stats, NULL) ;
121     ccolamd_l_report (stats) ;
122 
123     if (!ok)
124     {
125 	printf ("ccolamd error!\n") ;
126 	exit (1) ;
127     }
128 
129     /* ====================================================================== */
130     /* print the column ordering */
131     /* ====================================================================== */
132 
133     printf ("ccolamd_l column ordering:\n") ;
134     printf ("1st column: %ld\n", p [0]) ;
135     printf ("2nd column: %ld\n", p [1]) ;
136     printf ("3rd column: %ld\n", p [2]) ;
137     printf ("4th column: %ld\n", p [3]) ;
138 
139     /* ====================================================================== */
140     /* dump the strictly lower triangular part of symmetric input matrix B */
141     /* ====================================================================== */
142 
143     printf ("\n\ncsymamd_l %d-by-%d input matrix:\n", B_N, B_N) ;
144     printf ("Entries in strictly lower triangular part:\n") ;
145     for (col = 0 ; col < B_N ; col++)
146     {
147 	length = q [col+1] - q [col] ;
148     	printf ("Column %ld, with %ld entries:\n", col, length) ;
149 	for (pp = q [col] ; pp < q [col+1] ; pp++)
150 	{
151 	    row = B [pp] ;
152 	    printf ("    row %ld\n", row) ;
153 	}
154     }
155 
156     /* ====================================================================== */
157     /* order the matrix B.  Note that this does not modify B or q. */
158     /* ====================================================================== */
159 
160     ok = csymamd_l (B_N, B, q, perm, (double *) NULL, stats, &calloc, &free,
161 	    NULL, -1) ;
162     csymamd_l_report (stats) ;
163 
164     if (!ok)
165     {
166 	printf ("csymamd error!\n") ;
167 	exit (1) ;
168     }
169 
170     /* ====================================================================== */
171     /* print the symmetric ordering */
172     /* ====================================================================== */
173 
174     printf ("csymamd_l column ordering:\n") ;
175     printf ("1st row/column: %ld\n", perm [0]) ;
176     printf ("2nd row/column: %ld\n", perm [1]) ;
177     printf ("3rd row/column: %ld\n", perm [2]) ;
178     printf ("4th row/column: %ld\n", perm [3]) ;
179     printf ("5th row/column: %ld\n", perm [4]) ;
180 
181     return (0) ;
182 }
183