COIN-OR::LEMON - Graph Library

source: lemon-project-template-glpk/deps/glpk/src/amd/amd_valid.c @ 9:33de93886c88

subpack-glpk
Last change on this file since 9:33de93886c88 was 9:33de93886c88, checked in by Alpar Juttner <alpar@…>, 13 years ago

Import GLPK 4.47

File size: 3.3 KB
Line 
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
39GLOBAL 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}
Note: See TracBrowser for help on using the repository browser.