function test5 (nmat)
%TEST5 test for BTF
% Requires ssget
% Example:
%   test5
% See also btf, maxtrans, strongcomp, dmperm, ssget,
%   test1, test2, test3, test4, test5.

% BTF, Copyright (c) 2004-2022, University of Florida.  All Rights Reserved.
% Author: Timothy A. Davis.
% SPDX-License-Identifier: LGPL-2.1+

index = ssget ;

[ignore f] = sort (index.nnz) ;

% time intensive
skip_costly = [1514 1297 1876 1301] ;
f = setdiff (f, skip_costly) ;

if (nargin < 1)
    nmat = 1000 ;
end
nmat = min (nmat, length (f)) ;
f = f (1:nmat) ;

h = waitbar (0, 'BTF test 5 of 6') ;

try
    for k = 1:nmat

        i = f(k) ;
        Prob = ssget (i, index) ;
        A = Prob.A ;

        waitbar (k/nmat, h) ;

        for tr = [1 -1]

            if (tr == -1)
                AT = A' ;
                [m n] = size (A) ;
                if (m == n)
                    if (nnz (spones (AT) - spones (A)) == 0)
                        fprintf ('skip test with transpose\n') ;
                        continue ;
                    end
                end
                A = AT ;
            end

            tic
            q1 = maxtrans (A) ;
            t1 = toc ;
            r1 = sum (q1 > 0) ;

            tic
            q2 = maxtrans (A, 10) ;
            t2 = toc ;
            r2 = sum (q2 > 0) ;

            fprintf (...
                '%4d %4d : %10.4f %8d  : %10.4f %8d', k, f(k), t1, r1, t2, r2) ;
            fprintf (' rel sprank %8.4f', r2 / (max (1, r1))) ;
            if (t2 ~= 0)
                fprintf (': rel time %8.4f', t1 / t2) ;
            end
            fprintf ('\n') ;

            if (r1 ~= r2)
                disp (Prob) ;
                fprintf ('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n') ;
            end

        end
    end

catch
    % out-of-memory is OK, other errors are not
    disp (lasterr) ;
    if (isempty (strfind (lasterr, 'Out of memory')))
        error (lasterr) ;                                                   %#ok
    else
        fprintf ('test terminated early, but otherwise OK\n') ;
    end
end

close (h) ;
