1
/* ========================================================================= */
2
/* === AMD_valid =========================================================== */
3
/* ========================================================================= */
5
/* ------------------------------------------------------------------------- */
6
/* AMD Version 2.0, Copyright (c) 2006 by 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
/* ------------------------------------------------------------------------- */
12
/* Check if a column-form matrix is valid or not. The matrix A is
13
* n_row-by-n_col. The row indices of entries in column j are in
14
* Ai [Ap [j] ... Ap [j+1]-1]. Required conditions are:
18
* nz = Ap [n_col] >= 0 number of entries in the matrix
20
* Ap [j] <= Ap [j+1] for all j in the range 0 to n_col.
21
* Ai [0 ... nz-1] must be in the range 0 to n_row-1.
23
* If any of the above conditions hold, AMD_INVALID is returned. If the
24
* following condition holds, AMD_OK_BUT_JUMBLED is returned (a warning,
27
* row indices in Ai [Ap [j] ... Ap [j+1]-1] are not sorted in ascending
28
* order, and/or duplicate entries exist.
30
* Otherwise, AMD_OK is returned.
32
* In v1.2 and earlier, this function returned TRUE if the matrix was valid
33
* (now returns AMD_OK), or FALSE otherwise (now returns AMD_INVALID or
34
* AMD_OK_BUT_JUMBLED).
37
#include "amd_internal.h"
41
/* inputs, not modified on output: */
42
Int n_row, /* A is n_row-by-n_col */
44
const Int Ap [ ], /* column pointers of A, of size n_col+1 */
45
const Int Ai [ ] /* row indices of A, of size nz = Ap [n_col] */
48
Int nz, j, p1, p2, ilast, i, p, result = AMD_OK ;
49
if (n_row < 0 || n_col < 0 || Ap == NULL || Ai == NULL)
51
return (AMD_INVALID) ;
54
if (Ap [0] != 0 || nz < 0)
56
/* column pointers must start at Ap [0] = 0, and Ap [n] must be >= 0 */
57
AMD_DEBUG0 (("column 0 pointer bad or nz < 0\n")) ;
58
return (AMD_INVALID) ;
60
for (j = 0 ; j < n_col ; j++)
64
AMD_DEBUG2 (("\nColumn: "ID" p1: "ID" p2: "ID"\n", j, p1, p2)) ;
67
/* column pointers must be ascending */
68
AMD_DEBUG0 (("column "ID" pointer bad\n", j)) ;
69
return (AMD_INVALID) ;
72
for (p = p1 ; p < p2 ; p++)
75
AMD_DEBUG3 (("row: "ID"\n", i)) ;
76
if (i < 0 || i >= n_row)
78
/* row index out of range */
79
AMD_DEBUG0 (("index out of range, col "ID" row "ID"\n", j, i));
80
return (AMD_INVALID) ;
84
/* row index unsorted, or duplicate entry present */
85
AMD_DEBUG1 (("index unsorted/dupl col "ID" row "ID"\n", j, i));
86
result = AMD_OK_BUT_JUMBLED ;