function test15 (nmat) %TEST15 test symbfact2 vs MATLAB % Example: % test15(nmat) % See also cholmod_test % Copyright 2006-2023, Timothy A. Davis, All Rights Reserved. % SPDX-License-Identifier: GPL-2.0+ fprintf ('=================================================================\n'); index = ssget ; % only test matrices with nrows = 109000 or less. large ones nearly always % cause a MATLAB segfault. f = find (index.nrows < 109000 & index.ncols < 109000) ; % sort by row /col dimension s = max (index.nrows, index.ncols) ; [ignore i] = sort (s (f)) ; f = f (i) ; if (nargin > 0) nmat = max (0,nmat) ; nmat = min (nmat, length (f)) ; f = f (1:nmat) ; end fprintf ('Matrices to test: %d\n', length (f)) ; for i = f % try Problem = ssget (i) ; A = spones (Problem.A) ; [m n] = size (A) ; fprintf ('\n%4d: %-20s nrow: %6d ncol: %6d nnz: %10d\n', ... i, Problem.name, m, n, nnz(A)) ; % warmup, for accurate timing etree (sparse (1)) ; etree2 (sparse (1)) ; amd2 (sparse (1)) ; symbfact (sparse (1)) ; symbfact2 (sparse (1)) ; % test symmetric case if (m == n) % permute the matrix first p = amd2 (A) ; A = A (p,p) ; % test with triu(A) tic co = symbfact (A) ; t1 = toc ; tic co2 = symbfact2 (A) ; t2 = toc ; fprintf ('c=symbfact(A): %10.4f %10.4f speedup %8.2f lnz %d\n', ... t1, t2, t1/t2, sum (co)) ; if (any (co ~= co2)) error ('!') ; end tic [co h parent post R] = symbfact (A) ; t1 = toc ; tic [co2 h2 parent2 post2 R2] = symbfact2 (A) ; t2 = toc ; fprintf ('R=symbfact(A): %10.4f %10.4f speedup %8.2f\n',... t1, t2, t1/t2) ; checkem(co,co2,parent,parent2,post,post2,R,R2,h,h2) ; % test with tril(A) tic co = symbfact (A') ; t1 = toc ; tic co2 = symbfact2 (A,'lo') ; t2 = toc ; fprintf (... 'c=symbfact(A''): %10.4f %10.4f speedup %8.2f lnz %d\n',... t1, t2, t1/t2, sum (co)) ; if (any (co ~= co2)) error ('!') ; end tic [co h parent post R] = symbfact (A') ; t1 = toc ; tic [co2 h2 parent2 post2 R2] = symbfact2 (A,'lo') ; t2 = toc ; fprintf (... 'R=symbfact(A''): %10.4f %10.4f speedup %8.2f\n',... t1, t2, t1/t2) ; checkem(co,co2,parent,parent2,post,post2,R,R2,h,h2) ; end % permute the matrix first p = colamd (A) ; [parent post] = etree2 (A (:,p), 'col') ; p = p (post) ; A = A (:,p) ; % test column case tic co = symbfact (A,'col') ; t1 = toc ; tic co2 = symbfact2 (A,'col') ; t2 = toc ; fprintf ('c=symbfact(A,''col''): %10.4f %10.4f speedup %8.2f lnz %d\n', ... t1, t2, t1/t2, sum (co)) ; if (any (co ~= co2)) error ('!') ; end tic [co h parent post R] = symbfact (A,'col') ; t1 = toc ; tic [co2 h2 parent2 post2 R2] = symbfact2 (A,'col') ; t2 = toc ; fprintf ('R=symbfact(A,''col''): %10.4f %10.4f speedup %8.2f\n', ... t1, t2, t1/t2) ; checkem(co,co2,parent,parent2,post,post2,R,R2,h,h2) ; % catch % fprintf ('%d failed\n', i) ; % end end fprintf ('test15 passed\n') ; %------------------------------------------------------------------------------- function checkem(co,co2,parent,parent2,post,post2,R,R2,h,h2) % checkem compare results from symbfact and symbfact2 if (any (co ~= co2)) error ('count!') ; end if (any (parent ~= parent2)) error ('parent!') ; end if (any (post ~= post2)) error ('post!') ; end if (nnz (R2) ~= nnz (R)) error ('lnz!') ; end if (h ~= h2) error ('h!') ; end % this may run out of memory try % compute nnz(R-R2) err = nnz (R-R2) ; catch err = -1 ; fprintf ('nnz(R-R2) not computed\n') ; end if (err > 0) error ('R!') ; end