alpar@9: /* ========================================================================= */ alpar@9: /* === AMD_info ============================================================ */ alpar@9: /* ========================================================================= */ alpar@9: alpar@9: /* ------------------------------------------------------------------------- */ alpar@9: /* AMD, Copyright (c) Timothy A. Davis, */ alpar@9: /* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ alpar@9: /* email: davis at cise.ufl.edu CISE Department, Univ. of Florida. */ alpar@9: /* web: http://www.cise.ufl.edu/research/sparse/amd */ alpar@9: /* ------------------------------------------------------------------------- */ alpar@9: alpar@9: /* User-callable. Prints the output statistics for AMD. See amd.h alpar@9: * for details. If the Info array is not present, nothing is printed. alpar@9: */ alpar@9: alpar@9: #include "amd_internal.h" alpar@9: alpar@9: #define PRI(format,x) { if (x >= 0) { PRINTF ((format, x)) ; }} alpar@9: alpar@9: GLOBAL void AMD_info alpar@9: ( alpar@9: double Info [ ] alpar@9: ) alpar@9: { alpar@9: double n, ndiv, nmultsubs_ldl, nmultsubs_lu, lnz, lnzd ; alpar@9: alpar@9: PRINTF (("\nAMD version %d.%d.%d, %s, results:\n", alpar@9: AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION, AMD_DATE)) ; alpar@9: alpar@9: if (!Info) alpar@9: { alpar@9: return ; alpar@9: } alpar@9: alpar@9: n = Info [AMD_N] ; alpar@9: ndiv = Info [AMD_NDIV] ; alpar@9: nmultsubs_ldl = Info [AMD_NMULTSUBS_LDL] ; alpar@9: nmultsubs_lu = Info [AMD_NMULTSUBS_LU] ; alpar@9: lnz = Info [AMD_LNZ] ; alpar@9: lnzd = (n >= 0 && lnz >= 0) ? (n + lnz) : (-1) ; alpar@9: alpar@9: /* AMD return status */ alpar@9: PRINTF ((" status: ")) ; alpar@9: if (Info [AMD_STATUS] == AMD_OK) alpar@9: { alpar@9: PRINTF (("OK\n")) ; alpar@9: } alpar@9: else if (Info [AMD_STATUS] == AMD_OUT_OF_MEMORY) alpar@9: { alpar@9: PRINTF (("out of memory\n")) ; alpar@9: } alpar@9: else if (Info [AMD_STATUS] == AMD_INVALID) alpar@9: { alpar@9: PRINTF (("invalid matrix\n")) ; alpar@9: } alpar@9: else if (Info [AMD_STATUS] == AMD_OK_BUT_JUMBLED) alpar@9: { alpar@9: PRINTF (("OK, but jumbled\n")) ; alpar@9: } alpar@9: else alpar@9: { alpar@9: PRINTF (("unknown\n")) ; alpar@9: } alpar@9: alpar@9: /* statistics about the input matrix */ alpar@9: PRI (" n, dimension of A: %.20g\n", n); alpar@9: PRI (" nz, number of nonzeros in A: %.20g\n", alpar@9: Info [AMD_NZ]) ; alpar@9: PRI (" symmetry of A: %.4f\n", alpar@9: Info [AMD_SYMMETRY]) ; alpar@9: PRI (" number of nonzeros on diagonal: %.20g\n", alpar@9: Info [AMD_NZDIAG]) ; alpar@9: PRI (" nonzeros in pattern of A+A' (excl. diagonal): %.20g\n", alpar@9: Info [AMD_NZ_A_PLUS_AT]) ; alpar@9: PRI (" # dense rows/columns of A+A': %.20g\n", alpar@9: Info [AMD_NDENSE]) ; alpar@9: alpar@9: /* statistics about AMD's behavior */ alpar@9: PRI (" memory used, in bytes: %.20g\n", alpar@9: Info [AMD_MEMORY]) ; alpar@9: PRI (" # of memory compactions: %.20g\n", alpar@9: Info [AMD_NCMPA]) ; alpar@9: alpar@9: /* statistics about the ordering quality */ alpar@9: PRINTF (("\n" alpar@9: " The following approximate statistics are for a subsequent\n" alpar@9: " factorization of A(P,P) + A(P,P)'. They are slight upper\n" alpar@9: " bounds if there are no dense rows/columns in A+A', and become\n" alpar@9: " looser if dense rows/columns exist.\n\n")) ; alpar@9: alpar@9: PRI (" nonzeros in L (excluding diagonal): %.20g\n", alpar@9: lnz) ; alpar@9: PRI (" nonzeros in L (including diagonal): %.20g\n", alpar@9: lnzd) ; alpar@9: PRI (" # divide operations for LDL' or LU: %.20g\n", alpar@9: ndiv) ; alpar@9: PRI (" # multiply-subtract operations for LDL': %.20g\n", alpar@9: nmultsubs_ldl) ; alpar@9: PRI (" # multiply-subtract operations for LU: %.20g\n", alpar@9: nmultsubs_lu) ; alpar@9: PRI (" max nz. in any column of L (incl. diagonal): %.20g\n", alpar@9: Info [AMD_DMAX]) ; alpar@9: alpar@9: /* total flop counts for various factorizations */ alpar@9: alpar@9: if (n >= 0 && ndiv >= 0 && nmultsubs_ldl >= 0 && nmultsubs_lu >= 0) alpar@9: { alpar@9: PRINTF (("\n" alpar@9: " chol flop count for real A, sqrt counted as 1 flop: %.20g\n" alpar@9: " LDL' flop count for real A: %.20g\n" alpar@9: " LDL' flop count for complex A: %.20g\n" alpar@9: " LU flop count for real A (with no pivoting): %.20g\n" alpar@9: " LU flop count for complex A (with no pivoting): %.20g\n\n", alpar@9: n + ndiv + 2*nmultsubs_ldl, alpar@9: ndiv + 2*nmultsubs_ldl, alpar@9: 9*ndiv + 8*nmultsubs_ldl, alpar@9: ndiv + 2*nmultsubs_lu, alpar@9: 9*ndiv + 8*nmultsubs_lu)) ; alpar@9: } alpar@9: }