function test1 (nmat)
%TEST1 test for BTF
% Requires CSparse and ssget
% Example:
%   test1
% 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.sprank < min (index.nrows, index.ncols)) ;
f = 1:length (index.nrows) ;

% 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 = cs_dmperm (sparse (1)) ;        %#ok
a = cs_transpose (sparse (1)) ;     %#ok

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

try

    for k = 1:nmat

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

        waitbar (k/nmat, h) ;

        r = full (sum (spones (A), 2)) ;
        c = full (sum (spones (A))) ;
        m2 = length (find (r > 0)) ;
        n2 = length (find (c > 0)) ;

        if (m2 < n2)
            tic
            A = cs_transpose (A) ;
            t = toc ;
        end

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

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

        tic
        q = maxtrans (A) ;
        t0 = toc ;
        s0 = sum (q > 0) ;
        T0 (k) = max (1e-9, t0) ;

        tic
        p = cs_dmperm (A) ;
        t1 = toc ;
        s1 = sum (p > 0) ;
        T1 (k) = max (1e-9, t1) ;

        fprintf (...
            '%4d maxtrans %10.6f %10.6f  cs_dmperm %10.6f m/n %8.2f', ...
            f(k), t, t0, t1, m/n) ;
        if (t1 ~= 0)
            fprintf (' rel: %8.4f', t0 / t1) ;
        end
        fprintf ('\n') ;
        if (s0 ~= s1)
            error ('!') ;
        end

        if (s0 == n & m == n)                                               %#ok
            B = A (:, q) ;
            subplot (2,2,1) ;
            cspy (B) ;
            if (nnz (diag (B)) ~= n)
                error ('?')
            end
            clear B
        else
            cspy (0) ;
        end

        maxnz = nnz (A) ;

        zfree  = find (MN (1:k,1) == MN (1:k,2) & Nzdiag (1:k) == MN(1:k,1)) ;
        square = find (MN (1:k,1) == MN (1:k,2) & Nzdiag (1:k) ~= MN(1:k,1)) ;
        tall   = find (MN (1:k,1) >  MN (1:k,2)) ;
        squat  = find (MN (1:k,1) <  MN (1:k,2)) ;

        subplot (2,2,2) ;
        loglog (Anz (square), T0 (square) ./ T1 (square), ...
            'o', [1 maxnz], [1 1], 'r-') ;
        title ('square') ;
        subplot (2,2,3) ;
        loglog (Anz (tall), T0 (tall) ./ T1 (tall), ...
            'o', [1 maxnz], [1 1], 'r-') ;
        title ('tall') ;
        subplot (2,2,4) ;
        title ('square, intially zero-free') ;
        loglog (Anz (zfree), T0 (zfree) ./ T1 (zfree), ...
            'o', [1 maxnz], [1 1], 'r-') ;
        title ('square, zero-free diag') ;

        drawnow

    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) ;
