lemon-project-template-glpk
comparison deps/glpk/src/amd/amd_valid.c @ 11:4fc6ad2fb8a6
Test GLPK in src/main.cc
author | Alpar Juttner <alpar@cs.elte.hu> |
---|---|
date | Sun, 06 Nov 2011 21:43:29 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:fc6eb94e9186 |
---|---|
1 /* ========================================================================= */ | |
2 /* === AMD_valid =========================================================== */ | |
3 /* ========================================================================= */ | |
4 | |
5 /* ------------------------------------------------------------------------- */ | |
6 /* AMD, Copyright (c) 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 /* ------------------------------------------------------------------------- */ | |
11 | |
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: | |
15 * | |
16 * n_row >= 0 | |
17 * n_col >= 0 | |
18 * nz = Ap [n_col] >= 0 number of entries in the matrix | |
19 * Ap [0] == 0 | |
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. | |
22 * | |
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, | |
25 * not an error): | |
26 * | |
27 * row indices in Ai [Ap [j] ... Ap [j+1]-1] are not sorted in ascending | |
28 * order, and/or duplicate entries exist. | |
29 * | |
30 * Otherwise, AMD_OK is returned. | |
31 * | |
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). | |
35 */ | |
36 | |
37 #include "amd_internal.h" | |
38 | |
39 GLOBAL Int AMD_valid | |
40 ( | |
41 /* inputs, not modified on output: */ | |
42 Int n_row, /* A is n_row-by-n_col */ | |
43 Int 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] */ | |
46 ) | |
47 { | |
48 Int nz, j, p1, p2, ilast, i, p, result = AMD_OK ; | |
49 | |
50 if (n_row < 0 || n_col < 0 || Ap == NULL || Ai == NULL) | |
51 { | |
52 return (AMD_INVALID) ; | |
53 } | |
54 nz = Ap [n_col] ; | |
55 if (Ap [0] != 0 || nz < 0) | |
56 { | |
57 /* column pointers must start at Ap [0] = 0, and Ap [n] must be >= 0 */ | |
58 AMD_DEBUG0 (("column 0 pointer bad or nz < 0\n")) ; | |
59 return (AMD_INVALID) ; | |
60 } | |
61 for (j = 0 ; j < n_col ; j++) | |
62 { | |
63 p1 = Ap [j] ; | |
64 p2 = Ap [j+1] ; | |
65 AMD_DEBUG2 (("\nColumn: "ID" p1: "ID" p2: "ID"\n", j, p1, p2)) ; | |
66 if (p1 > p2) | |
67 { | |
68 /* column pointers must be ascending */ | |
69 AMD_DEBUG0 (("column "ID" pointer bad\n", j)) ; | |
70 return (AMD_INVALID) ; | |
71 } | |
72 ilast = EMPTY ; | |
73 for (p = p1 ; p < p2 ; p++) | |
74 { | |
75 i = Ai [p] ; | |
76 AMD_DEBUG3 (("row: "ID"\n", i)) ; | |
77 if (i < 0 || i >= n_row) | |
78 { | |
79 /* row index out of range */ | |
80 AMD_DEBUG0 (("index out of range, col "ID" row "ID"\n", j, i)); | |
81 return (AMD_INVALID) ; | |
82 } | |
83 if (i <= ilast) | |
84 { | |
85 /* row index unsorted, or duplicate entry present */ | |
86 AMD_DEBUG1 (("index unsorted/dupl col "ID" row "ID"\n", j, i)); | |
87 result = AMD_OK_BUT_JUMBLED ; | |
88 } | |
89 ilast = i ; | |
90 } | |
91 } | |
92 return (result) ; | |
93 } |