src/amd/amd_valid.c
author Alpar Juttner <alpar@cs.elte.hu>
Sun, 05 Dec 2010 17:35:23 +0100
changeset 2 4c8956a7bdf4
permissions -rw-r--r--
Set up CMAKE build environment
     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 }