1 /* ========================================================================== */
2 /* === UMFPACK_report_matrix ================================================ */
3 /* ========================================================================== */
4 
5 /* -------------------------------------------------------------------------- */
6 /* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
7 /* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
8 /* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
9 /* -------------------------------------------------------------------------- */
10 
11 /*
12     User-callable.  Prints a column or row-oriented matrix.  See
13     umfpack_report_matrix.h for details.
14 */
15 
16 #include "umf_internal.h"
17 
UMFPACK_report_matrix(Int n_row,Int n_col,const Int Ap[],const Int Ai[],const double Ax[],const double Az[],Int col_form,const double Control[UMFPACK_CONTROL])18 GLOBAL Int UMFPACK_report_matrix
19 (
20     Int n_row,
21     Int n_col,
22     const Int Ap [ ],
23     const Int Ai [ ],
24     const double Ax [ ],
25 #ifdef COMPLEX
26     const double Az [ ],
27 #endif
28     Int col_form,		/* 1: column form, 0: row form */
29     const double Control [UMFPACK_CONTROL]
30 )
31 {
32     Entry a ;
33     Int prl, i, k, length, ilast, p, nz, prl1, p1, p2, n, n_i, do_values ;
34     char *vector, *index ;
35 #ifdef COMPLEX
36     Int split = SPLIT (Az) ;
37 #endif
38 
39     /* ---------------------------------------------------------------------- */
40     /* determine the form, and check if inputs exist */
41     /* ---------------------------------------------------------------------- */
42 
43     prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ;
44 
45     if (prl <= 2)
46     {
47 	return (UMFPACK_OK) ;
48     }
49 
50     if (col_form)
51     {
52 	vector = "column" ;	/* column vectors */
53 	index = "row" ;		/* with row indices */
54 	n = n_col ;
55 	n_i = n_row ;
56     }
57     else
58     {
59 	vector = "row" ;	/* row vectors */
60 	index = "column" ;	/* with column indices */
61 	n = n_row ;
62 	n_i = n_col ;
63     }
64 
65     PRINTF (("%s-form matrix, n_row "ID" n_col "ID", ", vector, n_row, n_col)) ;
66 
67     if (n_row <= 0 || n_col <= 0)
68     {
69 	PRINTF (("ERROR: n_row <= 0 or n_col <= 0\n\n")) ;
70 	return (UMFPACK_ERROR_n_nonpositive) ;
71     }
72 
73     if (!Ap)
74     {
75 	PRINTF (("ERROR: Ap missing\n\n")) ;
76 	return (UMFPACK_ERROR_argument_missing) ;
77     }
78 
79     nz = Ap [n] ;
80     PRINTF (("nz = "ID". ", nz)) ;
81     if (nz < 0)
82     {
83 	PRINTF (("ERROR: number of entries < 0\n\n")) ;
84 	return (UMFPACK_ERROR_invalid_matrix) ;
85     }
86 
87     if (Ap [0] != 0)
88     {
89 	PRINTF (("ERROR: Ap ["ID"] = "ID" must be "ID"\n\n",
90 	    (Int) INDEX (0), INDEX (Ap [0]), (Int) INDEX (0))) ;
91 	return (UMFPACK_ERROR_invalid_matrix) ;
92     }
93 
94     if (!Ai)
95     {
96 	PRINTF (("ERROR: Ai missing\n\n")) ;
97 	return (UMFPACK_ERROR_argument_missing) ;
98     }
99 
100     do_values = Ax != (double *) NULL ;
101 
102     PRINTF4 (("\n")) ;
103 
104     /* ---------------------------------------------------------------------- */
105     /* check the row/column pointers, Ap */
106     /* ---------------------------------------------------------------------- */
107 
108     for (k = 0 ; k < n ; k++)
109     {
110 	if (Ap [k] < 0)
111 	{
112 	    PRINTF (("ERROR: Ap ["ID"] < 0\n\n", INDEX (k))) ;
113 	    return (UMFPACK_ERROR_invalid_matrix) ;
114 	}
115 	if (Ap [k] > nz)
116 	{
117 	    PRINTF (("ERROR: Ap ["ID"] > size of Ai\n\n", INDEX (k))) ;
118 	    return (UMFPACK_ERROR_invalid_matrix) ;
119 	}
120     }
121 
122     for (k = 0 ; k < n ; k++)
123     {
124 	length = Ap [k+1] - Ap [k] ;
125 	if (length < 0)
126 	{
127 	    PRINTF (("ERROR: # entries in %s "ID" is < 0\n\n",
128 		vector, INDEX (k))) ;
129 	    return (UMFPACK_ERROR_invalid_matrix) ;
130 	}
131     }
132 
133     /* ---------------------------------------------------------------------- */
134     /* print each vector */
135     /* ---------------------------------------------------------------------- */
136 
137     prl1 = prl ;
138 
139     for (k = 0 ; k < n ; k++)
140     {
141 	/* if prl is 4, print the first 10 entries of the first 10 vectors */
142 	if (k < 10)
143 	{
144 	    prl = prl1 ;
145 	}
146 	/* get the vector pointers */
147 	p1 = Ap [k] ;
148 	p2 = Ap [k+1] ;
149 	length = p2 - p1 ;
150 	PRINTF4 (("\n    %s "ID": start: "ID" end: "ID" entries: "ID"\n",
151 	    vector, INDEX (k), p1, p2-1, length)) ;
152 	ilast = EMPTY ;
153 	for (p = p1 ; p < p2 ; p++)
154 	{
155 	    i = Ai [p] ;
156 	    PRINTF4 (("\t%s "ID" ", index, INDEX (i))) ;
157 	    if (do_values && prl >= 4)
158 	    {
159 		PRINTF ((":")) ;
160 		ASSIGN (a, Ax, Az, p, split) ;
161 		PRINT_ENTRY (a) ;
162 	    }
163 	    if (i < 0 || i >= n_i)
164 	    {
165 		PRINTF ((" ERROR: %s index "ID" out of range in %s "ID"\n\n",
166 		    index, INDEX (i), vector, INDEX (k))) ;
167 		return (UMFPACK_ERROR_invalid_matrix) ;
168 	    }
169 	    if (i <= ilast)
170 	    {
171 		PRINTF ((" ERROR: %s index "ID" out of order (or duplicate) in "
172 		    "%s "ID"\n\n", index, INDEX (i), vector, INDEX (k))) ;
173 		return (UMFPACK_ERROR_invalid_matrix) ;
174 	    }
175 	    PRINTF4 (("\n")) ;
176 	    /* truncate printout, but continue to check matrix */
177 	    if (prl == 4 && (p - p1) == 9 && length > 10)
178 	    {
179 		PRINTF4 (("\t...\n")) ;
180 		prl-- ;
181 	    }
182 	    ilast = i ;
183 	}
184 	/* truncate printout, but continue to check matrix */
185 	if (prl == 4 && k == 9 && n > 10)
186 	{
187 	    PRINTF4 (("\n    ...\n")) ;
188 	    prl-- ;
189 	}
190     }
191     prl = prl1 ;
192 
193     /* ---------------------------------------------------------------------- */
194     /* return the status of the matrix */
195     /* ---------------------------------------------------------------------- */
196 
197     PRINTF4 (("    %s-form matrix ", vector)) ;
198     PRINTF (("OK\n\n")) ;
199 
200     return (UMFPACK_OK) ;
201 }
202