function umfpack_report (Control, Info) %UMFPACK_REPORT prints optional control settings and statistics % % Example: % umfpack_report (Control, Info) ; % % Prints the current Control settings for umfpack2, and the statistical % information returned by umfpack2 in the Info array. If Control is % an empty matrix, then the default control settings are printed. % % Control is 20-by-1, and Info is 90-by-1. Not all entries are used. % % Alternative usages: % % umfpack_report ([ ], Info) ; print the default control parameters % and the Info array. % umfpack_report (Control) ; print the control parameters only. % umfpack_report ; print the default control parameters % and an empty Info array. % % See also umfpack, umfpack2, umfpack_make, umfpack_details, % umfpack_demo, and umfpack_simple. % Copyright 1995-2007 by Timothy A. Davis. %------------------------------------------------------------------------------- % get inputs, use defaults if input arguments not present %------------------------------------------------------------------------------- % The contents of Control and Info are defined in umfpack.h if (nargin < 1) Control = [] ; end if (nargin < 2) Info = [] ; end if (isempty (Control)) Control = umfpack2 ; end if (isempty (Info)) Info = [ 0 (-ones (1, 89)) ] ; end %------------------------------------------------------------------------------- % control settings %------------------------------------------------------------------------------- fprintf ('\nUMFPACK: Control settings:\n\n') ; fprintf (' Control (1): print level: %d\n', Control (1)) ; fprintf (' Control (2): dense row parameter: %g\n', Control (2)) ; fprintf (' "dense" rows have > max (16, (%g)*16*sqrt(n_col)) entries\n', Control (2)) ; fprintf (' Control (3): dense column parameter: %g\n', Control (3)) ; fprintf (' "dense" columns have > max (16, (%g)*16*sqrt(n_row)) entries\n', Control (3)) ; fprintf (' Control (4): pivot tolerance: %g\n', Control (4)) ; fprintf (' Control (5): max block size for dense matrix kernels: %d\n', Control (5)) ; prstrat (' Control (6): strategy: %g ', Control (6)) ; fprintf (' Control (7): initial allocation ratio: %g\n', Control (7)) ; fprintf (' Control (8): max iterative refinement steps: %d\n', Control (8)) ; fprintf (' Control (13): 2-by-2 pivot tolerance: %g\n', Control (13)) ; fprintf (' Control (14): Q fixed during numeric factorization: %g ', Control (14)) ; if (Control (14) > 0) fprintf ('(yes)\n') ; elseif (Control (14) < 0) fprintf ('(no)\n') ; else fprintf ('(auto)\n') ; end fprintf (' Control (15): AMD dense row/column parameter: %g\n', Control (15)) ; fprintf (' "dense" rows/columns in A+A'' have > max (16, (%g)*sqrt(n)) entries.\n', Control (15)) ; fprintf (' Only used if the AMD ordering is used.\n') ; fprintf (' Control (16): diagonal pivot tolerance: %g\n', Control (16)) ; fprintf (' Only used if diagonal pivoting is attempted.\n') ; fprintf (' Control (17): scaling option: %g ', Control (17)) ; if (Control (17) == 0) fprintf ('(none)\n') ; elseif (Control (17) == 2) fprintf ('(scale the matrix by\n') ; fprintf (' dividing each row by max. abs. value in each row)\n') ; else fprintf ('(scale the matrix by\n') ; fprintf (' dividing each row by sum of abs. values in each row)\n') ; end fprintf (' Control (18): frontal matrix allocation ratio: %g\n', Control (18)) ; fprintf (' Control (19): drop tolerance: %g\n', Control (19)) ; fprintf (' Control (20): AMD and COLAMD aggressive absorption: %g ', Control (20)) ; yes_no (Control (20)) ; % compile-time options: fprintf ('\n The following options can only be changed at compile-time:\n') ; if (Control (9) == 1) fprintf (' Control (9): compiled to use the BLAS\n') ; else fprintf (' Control (9): compiled without the BLAS\n') ; fprintf (' (you will not get the best possible performance)\n') ; end if (Control (10) == 1) fprintf (' Control (10): compiled for MATLAB\n') ; elseif (Control (10) == 2) fprintf (' Control (10): compiled for MATLAB\n') ; else fprintf (' Control (10): not compiled for MATLAB\n') ; fprintf (' Printing will be in terms of 0-based matrix indexing,\n') ; fprintf (' not 1-based as is expected in MATLAB. Diary output may\n') ; fprintf (' not be properly recorded.\n') ; end if (Control (11) == 2) fprintf (' Control (11): uses POSIX times ( ) to get CPU time and wallclock time.\n') ; elseif (Control (11) == 1) fprintf (' Control (11): uses getrusage to get CPU time.\n') ; else fprintf (' Control (11): uses ANSI C clock to get CPU time.\n') ; fprintf (' The CPU time may wrap around, type "help cputime".\n') ; end if (Control (12) == 1) fprintf (' Control (12): compiled with debugging enabled\n') ; fprintf (' ###########################################\n') ; fprintf (' ### This will be exceedingly slow! ########\n') ; fprintf (' ###########################################\n') ; else fprintf (' Control (12): compiled for normal operation (no debugging)\n') ; end %------------------------------------------------------------------------------- % Info: %------------------------------------------------------------------------------- if (nargin == 1) return end status = Info (1) ; fprintf ('\nUMFPACK status: Info (1): %d, ', status) ; if (status == 0) fprintf ('OK\n') ; elseif (status == 1) fprintf ('WARNING matrix is singular\n') ; elseif (status == -1) fprintf ('ERROR out of memory\n') ; elseif (status == -3) fprintf ('ERROR numeric LU factorization is invalid\n') ; elseif (status == -4) fprintf ('ERROR symbolic LU factorization is invalid\n') ; elseif (status == -5) fprintf ('ERROR required argument is missing\n') ; elseif (status == -6) fprintf ('ERROR n <= 0\n') ; elseif (status <= -7 & status >= -12 | status == -14) %#ok fprintf ('ERROR matrix A is corrupted\n') ; elseif (status == -13) fprintf ('ERROR invalid system\n') ; elseif (status == -15) fprintf ('ERROR invalid permutation\n') ; elseif (status == -911) fprintf ('ERROR internal error!\n') ; fprintf ('Please report this error to Tim Davis (davis@cise.ufl.edu)\n') ; else fprintf ('ERROR unrecognized error. Info array corrupted\n') ; end fprintf (' (a -1 means the entry has not been computed):\n') ; fprintf ('\n Basic statistics:\n') ; fprintf (' Info (2): %d, # of rows of A\n', Info (2)) ; fprintf (' Info (17): %d, # of columns of A\n', Info (17)) ; fprintf (' Info (3): %d, nnz (A)\n', Info (3)) ; fprintf (' Info (4): %d, Unit size, in bytes, for memory usage reported below\n', Info (4)) ; fprintf (' Info (5): %d, size of int (in bytes)\n', Info (5)) ; fprintf (' Info (6): %d, size of UF_long (in bytes)\n', Info (6)) ; fprintf (' Info (7): %d, size of pointer (in bytes)\n', Info (7)) ; fprintf (' Info (8): %d, size of numerical entry (in bytes)\n', Info (8)) ; fprintf ('\n Pivots with zero Markowitz cost removed to obtain submatrix S:\n') ; fprintf (' Info (57): %d, # of pivots with one entry in pivot column\n', Info (57)) ; fprintf (' Info (58): %d, # of pivots with one entry in pivot row\n', Info (58)) ; fprintf (' Info (59): %d, # of rows/columns in submatrix S (if square)\n', Info (59)) ; fprintf (' Info (60): ') ; if (Info (60) > 0) fprintf ('submatrix S square and diagonal preserved\n') ; elseif (Info (60) == 0) fprintf ('submatrix S not square or diagonal not preserved\n') ; else fprintf ('\n') ; end fprintf (' Info (9): %d, # of "dense" rows in S\n', Info (9)) ; fprintf (' Info (10): %d, # of empty rows in S\n', Info (10)) ; fprintf (' Info (11): %d, # of "dense" columns in S\n', Info (11)) ; fprintf (' Info (12): %d, # of empty columns in S\n', Info (12)) ; fprintf (' Info (34): %g, symmetry of pattern of S\n', Info (34)) ; fprintf (' Info (35): %d, # of off-diagonal nonzeros in S+S''\n', Info (35)) ; fprintf (' Info (36): %d, nnz (diag (S))\n', Info (36)) ; fprintf ('\n 2-by-2 pivoting to place large entries on diagonal:\n') ; fprintf (' Info (52): %d, # of small diagonal entries of S\n', Info (52)) ; fprintf (' Info (53): %d, # of unmatched small diagonal entries\n', Info (53)) ; fprintf (' Info (54): %g, symmetry of P2*S\n', Info (54)) ; fprintf (' Info (55): %d, # of off-diagonal entries in (P2*S)+(P2*S)''\n', Info (55)) ; fprintf (' Info (56): %d, nnz (diag (P2*S))\n', Info (56)) ; fprintf ('\n AMD results, for strict diagonal pivoting:\n') ; fprintf (' Info (37): %d, est. nz in L and U\n', Info (37)) ; fprintf (' Info (38): %g, est. flop count\n', Info (38)) ; fprintf (' Info (39): %g, # of "dense" rows in S+S''\n', Info (39)) ; fprintf (' Info (40): %g, est. max. nz in any column of L\n', Info (40)) ; fprintf ('\n Final strategy selection, based on the analysis above:\n') ; prstrat (' Info (19): %d, strategy used ', Info (19)) ; fprintf (' Info (20): %d, ordering used ', Info (20)) ; if (Info (20) == 0) fprintf ('(COLAMD on A)\n') ; elseif (Info (20) == 1) fprintf ('(AMD on A+A'')\n') ; elseif (Info (20) == 2) fprintf ('(provided by user)\n') ; else fprintf ('(undefined ordering option)\n') ; end fprintf (' Info (32): %d, Q fixed during numeric factorization: ', Info (32)) ; yes_no (Info (32)) ; fprintf (' Info (33): %d, prefer diagonal pivoting: ', Info (33)) ; yes_no (Info (33)) ; fprintf ('\n symbolic analysis time and memory usage:\n') ; fprintf (' Info (13): %d, defragmentations during symbolic analysis\n', Info (13)) ; fprintf (' Info (14): %d, memory used during symbolic analysis (Units)\n', Info (14)) ; fprintf (' Info (15): %d, final size of symbolic factors (Units)\n', Info (15)) ; fprintf (' Info (16): %.2f, symbolic analysis CPU time (seconds)\n', Info (16)) ; fprintf (' Info (18): %.2f, symbolic analysis wall clock time (seconds)\n', Info (18)) ; fprintf ('\n Estimates computed in the symbolic analysis:\n') ; fprintf (' Info (21): %d, est. size of LU factors (Units)\n', Info (21)) ; fprintf (' Info (22): %d, est. total peak memory usage (Units)\n', Info (22)) ; fprintf (' Info (23): %d, est. factorization flop count\n', Info (23)) ; fprintf (' Info (24): %d, est. nnz (L)\n', Info (24)) ; fprintf (' Info (25): %d, est. nnz (U)\n', Info (25)) ; fprintf (' Info (26): %d, est. initial size, variable-part of LU (Units)\n', Info (26)) ; fprintf (' Info (27): %d, est. peak size, of variable-part of LU (Units)\n', Info (27)) ; fprintf (' Info (28): %d, est. final size, of variable-part of LU (Units)\n', Info (28)) ; fprintf (' Info (29): %d, est. max frontal matrix size (# of entries)\n', Info (29)) ; fprintf (' Info (30): %d, est. max # of rows in frontal matrix\n', Info (30)) ; fprintf (' Info (31): %d, est. max # of columns in frontal matrix\n', Info (31)) ; fprintf ('\n Computed in the numeric factorization (estimates shown above):\n') ; fprintf (' Info (41): %d, size of LU factors (Units)\n', Info (41)) ; fprintf (' Info (42): %d, total peak memory usage (Units)\n', Info (42)) ; fprintf (' Info (43): %d, factorization flop count\n', Info (43)) ; fprintf (' Info (44): %d, nnz (L)\n', Info (44)) ; fprintf (' Info (45): %d, nnz (U)\n', Info (45)) ; fprintf (' Info (46): %d, initial size of variable-part of LU (Units)\n', Info (46)) ; fprintf (' Info (47): %d, peak size of variable-part of LU (Units)\n', Info (47)) ; fprintf (' Info (48): %d, final size of variable-part of LU (Units)\n', Info (48)) ; fprintf (' Info (49): %d, max frontal matrix size (# of numerical entries)\n', Info (49)) ; fprintf (' Info (50): %d, max # of rows in frontal matrix\n', Info (50)) ; fprintf (' Info (51): %d, max # of columns in frontal matrix\n', Info (51)) ; fprintf ('\n Computed in the numeric factorization (no estimates computed a priori):\n') ; fprintf (' Info (61): %d, defragmentations during numeric factorization\n', Info (61)) ; fprintf (' Info (62): %d, reallocations during numeric factorization\n', Info (62)) ; fprintf (' Info (63): %d, costly reallocations during numeric factorization\n', Info (63)) ; fprintf (' Info (64): %d, integer indices in compressed pattern of L and U\n', Info (64)) ; fprintf (' Info (65): %d, numerical values stored in L and U\n', Info (65)) ; fprintf (' Info (66): %.2f, numeric factorization CPU time (seconds)\n', Info (66)) ; fprintf (' Info (76): %.2f, numeric factorization wall clock time (seconds)\n', Info (76)) ; if (Info (66) > 0.05 & Info (43) > 0) %#ok fprintf (' mflops in numeric factorization phase: %.2f\n', 1e-6 * Info (43) / Info (66)) ; end fprintf (' Info (67): %d, nnz (diag (U))\n', Info (67)) ; fprintf (' Info (68): %g, reciprocal condition number estimate\n', Info (68)) ; fprintf (' Info (69): %g, matrix was ', Info (69)) ; if (Info (69) == 0) fprintf ('not scaled\n') ; elseif (Info (69) == 2) fprintf ('scaled (row max)\n') ; else fprintf ('scaled (row sum)\n') ; end fprintf (' Info (70): %g, min. scale factor of rows of A\n', Info (70)) ; fprintf (' Info (71): %g, max. scale factor of rows of A\n', Info (71)) ; fprintf (' Info (72): %g, min. abs. on diagonal of U\n', Info (72)) ; fprintf (' Info (73): %g, max. abs. on diagonal of U\n', Info (73)) ; fprintf (' Info (74): %g, initial allocation parameter used\n', Info (74)) ; fprintf (' Info (75): %g, # of forced updates due to frontal growth\n', Info (75)) ; fprintf (' Info (77): %d, # of off-diaogonal pivots\n', Info (77)) ; fprintf (' Info (78): %d, nnz (L), if no small entries dropped\n', Info (78)) ; fprintf (' Info (79): %d, nnz (U), if no small entries dropped\n', Info (79)) ; fprintf (' Info (80): %d, # of small entries dropped\n', Info (80)) ; fprintf ('\n Computed in the solve step:\n') ; fprintf (' Info (81): %d, iterative refinement steps taken\n', Info (81)) ; fprintf (' Info (82): %d, iterative refinement steps attempted\n', Info (82)) ; fprintf (' Info (83): %g, omega(1), sparse-backward error estimate\n', Info (83)) ; fprintf (' Info (84): %g, omega(2), sparse-backward error estimate\n', Info (84)) ; fprintf (' Info (85): %d, solve flop count\n', Info (85)) ; fprintf (' Info (86): %.2f, solve CPU time (seconds)\n', Info (86)) ; fprintf (' Info (87): %.2f, solve wall clock time (seconds)\n', Info (87)) ; fprintf ('\n Info (88:90): unused\n\n') ; %------------------------------------------------------------------------------- function prstrat (fmt, strategy) % prstrat print the ordering strategy fprintf (fmt, strategy) ; if (strategy == 1) fprintf ('(unsymmetric)\n') ; fprintf (' Q = COLAMD (A), Q refined during numerical\n') ; fprintf (' factorization, and no attempt at diagonal pivoting.\n') ; elseif (strategy == 2) fprintf ('(symmetric, with 2-by-2 pivoting)\n') ; fprintf (' P2 = row permutation to place large values on the diagonal\n') ; fprintf (' Q = AMD (P2*A+(P2*A)''), Q not refined during numeric factorization,\n') ; fprintf (' and diagonal pivoting attempted.\n') ; elseif (strategy == 3) fprintf ('(symmetric)\n') ; fprintf (' Q = AMD (A+A''), Q not refined during numeric factorization,\n') ; fprintf (' and diagonal pivoting (P=Q'') attempted.\n') ; else % strategy = 0 ; fprintf ('(auto)\n') ; end %------------------------------------------------------------------------------- function yes_no (s) % yes_no print yes or no if (s == 0) fprintf ('(no)\n') ; else fprintf ('(yes)\n') ; end