function test2 (nmat)
%TEST2 test for BTF
% Requires CSparse and ssget
% Example:
%   test2
% 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 ;
f = find (index.nrows == index.ncols) ;

% too much time:
skip = [1514 1297 1876 1301] ;
f = setdiff (f, skip) ;

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

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

T0 = zeros (nmat,1) ;
T1 = zeros (nmat,1) ;
Anz = zeros (nmat,1) ;
MN = zeros (nmat, 2) ;
Nzdiag = zeros (nmat,1) ;
clf

% warmup
p = maxtrans (sparse (1)) ;             %#ok
p = btf (sparse (1)) ;                  %#ok
p = cs_dmperm (sparse (1)) ;            %#ok
a = cs_transpose (sparse (1)) ;         %#ok

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

try
    for k = 1:nmat

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

        waitbar (k/nmat, h) ;

        Nzdiag (k) = nnz (diag (A)) ;

        [m n] = size (A) ;
        Anz (k) = nnz (A) ;
        MN (k,:) = [m n] ;

        tic
        [p,q,r] = btf (A) ;
        t0 = toc ;
        s0 = sum (q > 0) ;
        T0 (k) = max (1e-9, t0) ;

        tic
        [p2,q2,r2] = cs_dmperm (A) ;
        t1 = toc ;
        s1 = sum (dmperm (A) > 0) ;
        T1 (k) = max (1e-9, t1) ;

        fprintf ('%4d btf %10.6f cs_dmperm %10.6f', f(k), t0, t1) ;
        if (t1 ~= 0)
            fprintf (' rel: %8.4f', t0 / t1) ;
        end
        fprintf ('\n') ;

        if (s0 ~= s1)
            error ('!') ;
        end

        C = A (p, abs (q)) ;
        subplot (1,2,1) ;
        cspy (C) ;
        z = find (q < 0) ;
        zd = nnz (diag (C (z,z))) ;
        if (zd > 0)
            error ('?') ;
        end

        minnz = Anz (1) ;
        maxnz = nnz (A) ;

        subplot (1,2,2) ;
        loglog (Anz (1:k), T0 (1:k) ./ T1 (1:k), ...
            'o', [minnz maxnz], [1 1], 'r-') ;
        drawnow

        clear C A Prob
    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) ;
