The R Project SVN R-packages

Rev

Rev 1820 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

/* ========================================================================= */
/* === AMD_info ============================================================ */
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
/* AMD Version 1.2, Copyright (c) 2005 by Timothy A. Davis,          */
/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
/* email: davis at cise.ufl.edu    CISE Department, Univ. of Florida.        */
/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
/* ------------------------------------------------------------------------- */

/* User-callable.  Prints the output statistics for AMD.  See amd.h
 * for details.  If the Info array is not present, nothing is printed.
 */

#include "amd_internal.h"

#define PRI(format,x) { if (x >= 0) { PRINTF ((format, x)) ; }}

GLOBAL void AMD_info
(
    double Info [ ]
)
{
    double n, ndiv, nmultsubs_ldl, nmultsubs_lu, lnz, lnzd ;

    if (!Info)
    {
    return ;
    }

    n = Info [AMD_N] ;
    ndiv = Info [AMD_NDIV] ;
    nmultsubs_ldl = Info [AMD_NMULTSUBS_LDL] ;
    nmultsubs_lu = Info [AMD_NMULTSUBS_LU] ;
    lnz = Info [AMD_LNZ] ;
    lnzd = (n >= 0 && lnz >= 0) ? (n + lnz) : (-1) ;

    /* AMD return status */
    PRINTF ((
    "\namd:  approximate minimum degree ordering, results:\n"
    "    status: ")) ;
    if (Info [AMD_STATUS] == AMD_OK)
    {
    PRINTF (("OK\n")) ;
    }
    else if (Info [AMD_STATUS] == AMD_OUT_OF_MEMORY)
    {
    PRINTF (("out of memory\n")) ;
    }
    else if (Info [AMD_STATUS] == AMD_INVALID)
    {
    PRINTF (("invalid matrix\n")) ;
    }
    else
    {
    PRINTF (("unknown\n")) ;
    }

    /* statistics about the input matrix */
    PRI ("    n, dimension of A:                                  %.20g\n", n);
    PRI ("    nz, number of nonzeros in A:                        %.20g\n",
    Info [AMD_NZ]) ;
    PRI ("    symmetry of A:                                      %.4f\n",
    Info [AMD_SYMMETRY]) ;
    PRI ("    number of nonzeros on diagonal:                     %.20g\n",
    Info [AMD_NZDIAG]) ;
    PRI ("    nonzeros in pattern of A+A' (excl. diagonal):       %.20g\n",
    Info [AMD_NZ_A_PLUS_AT]) ;
    PRI ("    # dense rows/columns of A+A':                       %.20g\n",
    Info [AMD_NDENSE]) ;

    /* statistics about AMD's behavior  */
    PRI ("    memory used, in bytes:                              %.20g\n",
    Info [AMD_MEMORY]) ;
    PRI ("    # of memory compactions:                            %.20g\n",
    Info [AMD_NCMPA]) ;

    /* statistics about the ordering quality */
    PRINTF (("\n"
    "    The following approximate statistics are for a subsequent\n"
    "    factorization of A(P,P) + A(P,P)'.  They are slight upper\n"
    "    bounds if there are no dense rows/columns in A+A', and become\n"
    "    looser if dense rows/columns exist.\n\n")) ;

    PRI ("    nonzeros in L (excluding diagonal):                 %.20g\n",
    lnz) ;
    PRI ("    nonzeros in L (including diagonal):                 %.20g\n",
    lnzd) ;
    PRI ("    # divide operations for LDL' or LU:                 %.20g\n",
    ndiv) ;
    PRI ("    # multiply-subtract operations for LDL':            %.20g\n",
    nmultsubs_ldl) ;
    PRI ("    # multiply-subtract operations for LU:              %.20g\n",
    nmultsubs_lu) ;
    PRI ("    max nz. in any column of L (incl. diagonal):        %.20g\n",
    Info [AMD_DMAX]) ;

    /* total flop counts for various factorizations */

    if (n >= 0 && ndiv >= 0 && nmultsubs_ldl >= 0 && nmultsubs_lu >= 0)
    {
    PRINTF (("\n"
    "    chol flop count for real A, sqrt counted as 1 flop: %.20g\n"
    "    LDL' flop count for real A:                         %.20g\n"
    "    LDL' flop count for complex A:                      %.20g\n"
    "    LU flop count for real A (with no pivoting):        %.20g\n"
    "    LU flop count for complex A (with no pivoting):     %.20g\n\n",
    n + ndiv + 2*nmultsubs_ldl,
        ndiv + 2*nmultsubs_ldl,
      9*ndiv + 8*nmultsubs_ldl,
        ndiv + 2*nmultsubs_lu,
      9*ndiv + 8*nmultsubs_lu)) ;
    }
}