1 /* ========================================================================== */
2 /* === Tcov/cmread ========================================================== */
3 /* ========================================================================== */
4 
5 /* -----------------------------------------------------------------------------
6  * CHOLMOD/Tcov Module.  Copyright (C) 2005-2006, Timothy A. Davis
7  * http://www.suitesparse.com
8  * -------------------------------------------------------------------------- */
9 
10 /* Read in a matrix from a file and print it out.
11  *
12  * Usage:
13  *	cmread matrixfile
14  *	cmread < matrixfile
15  */
16 
17 #include "cholmod.h"
18 
19 #ifdef DLONG
20 #define CHOLMOD(routine) cholmod_l_ ## routine
21 #define Int SuiteSparse_long
22 #else
23 #define CHOLMOD(routine) cholmod_ ## routine
24 #define Int int
25 #endif
26 
main(int argc,char ** argv)27 int main (int argc, char **argv)
28 {
29     cholmod_sparse *A, *C, *Z ;
30     cholmod_dense *X ;
31     cholmod_triplet *T ;
32     void *V ;
33     FILE *f, *f2 ;
34     cholmod_common Common, *cm ;
35     int mtype, prefer, option ;
36 
37     /* ---------------------------------------------------------------------- */
38     /* get the file containing the input matrix */
39     /* ---------------------------------------------------------------------- */
40 
41     if (argc > 1)
42     {
43 	if ((f = fopen (argv [1], "r")) == NULL)
44 	{
45 	    printf ("cannot open file: %s\n", argv [1]) ;
46 	    return (0) ;
47 	}
48     }
49     else
50     {
51 	f = stdin ;
52     }
53 
54     /* ---------------------------------------------------------------------- */
55     /* start CHOLMOD, read the matrix, print it, and free it */
56     /* ---------------------------------------------------------------------- */
57 
58     cm = &Common ;
59     CHOLMOD (start) (cm) ;
60     cm->print = 5 ;
61     A = CHOLMOD (read_sparse) (f, cm) ;
62     if (argc > 1) fclose (f) ;
63     CHOLMOD (print_sparse) (A, "A", cm) ;
64 
65     if (argc > 1)
66     {
67 	for (prefer = 0 ; prefer <= 2 ; prefer++)
68 	{
69 	    printf ("\n---------------------- Prefer: %d\n", prefer) ;
70 	    f = fopen (argv [1], "r") ;
71 	    V = CHOLMOD (read_matrix) (f, prefer, &mtype, cm) ;
72 	    if (V != NULL) switch (mtype)
73 	    {
74 		case CHOLMOD_TRIPLET:
75 		    T = V ;
76 		    CHOLMOD (print_triplet) (T, "T", cm) ;
77 		    CHOLMOD (free_triplet) (&T, cm) ;
78 		    break ;
79 		case CHOLMOD_SPARSE:
80 		    C = V ;
81 		    CHOLMOD (print_sparse) (C, "C", cm) ;
82 		    Z = CHOLMOD (speye) (C->nrow, C->ncol, CHOLMOD_PATTERN, cm);
83 		    for (option = 0 ; option <= 2 ; option++)
84 		    {
85 			int asym ;
86 			Int xmatch = 0, pmatch = 0, nzoff = 0, nzd = 0 ;
87 			asym = CHOLMOD (symmetry) (C, option,
88 			    &xmatch, &pmatch, &nzoff, &nzd, cm) ;
89 			f2 = fopen ("temp5.mtx", "w") ;
90 			CHOLMOD (write_sparse) (f2, C, Z, NULL, cm) ;
91 			fclose (f2) ;
92 			printf ("asym %d\n", asym) ;
93 		    }
94 		    CHOLMOD (free_sparse) (&C, cm) ;
95 		    CHOLMOD (free_sparse) (&Z, cm) ;
96 		    break ;
97 		case CHOLMOD_DENSE:
98 		    X = V ;
99 		    CHOLMOD (print_dense) (X, "X", cm) ;
100 		    f2 = fopen ("temp5.mtx", "w") ;
101 		    CHOLMOD (write_dense) (f2, X, NULL, cm) ;
102 		    fclose (f2) ;
103 		    CHOLMOD (free_dense) (&X, cm) ;
104 		    break ;
105 	    }
106 	    fclose (f) ;
107 	}
108     }
109 
110     CHOLMOD (free_sparse) (&A, cm) ;
111     CHOLMOD (finish) (cm) ;
112     return (0) ;
113 }
114