function demo2 (C, sym, name)
%DEMO2: solve a linear system using Cholesky, LU, and QR, with various orderings
%
% Example:
%   demo2 (C, 1, 'name of system')
% See also: cs_demo

% CXSparse, Copyright (c) 2006-2022, Timothy A. Davis. All Rights Reserved.
% SPDX-License-Identifier: LGPL-2.1+

clf
subplot (2,2,1) ; cspy (C) ;
title (name, 'FontSize', 16, 'Interpreter', 'none') ;
[m n] = size (C) ;
[p,q,r,s,cc,rr] = cs_dmperm (C) ;
subplot (2,2,3) ; cs_dmspy (C) ;
subplot (2,2,2) ; ccspy (C) ;
drawnow

sprnk = rr (4) - 1 ;
nb = length (r) - 1 ;
ns = sum ((r (2:nb+1) == r (1:nb)+1) & (s (2:nb+1) == s (1:nb)+1)) ;
fprintf ('blocks: %d singletons %d structural rank %d\n', nb, ns, sprnk) ;

if (sprnk ~= sprank (C))
    error ('sprank mismatch!') ;
end

if (sprnk < min (m,n))
    return ;                % return if structurally singular
end


% the following code is not in the C version of this demo:
if (m == n)
    if (sym)
        try
            [L,p] = cs_chol (C) ;               %#ok
            subplot (2,2,4) ;
            cspy (L+triu(L',1)) ; title ('L+L''') ;
        catch
            % tol = 0.001 ;
            [L,U,p,q] = cs_lu (C,0.001) ;       %#ok
            subplot (2,2,4) ;
            cspy (L+U-speye(n)) ; title ('L+U') ;
        end
    else
        [L,U,p,q] = cs_lu (C) ;         %#ok
        subplot (2,2,4) ;
        cspy (L+U-speye(n)) ; title ('L+U') ;
    end
else
    if (m < n)
        [V,beta,p,R,q] = cs_qr (C') ;           %#ok
    else
        [V,beta,p,R,q] = cs_qr (C) ;            %#ok
    end
    subplot (2,2,4) ;
    cspy (V+R) ; title ('V+R') ;
end
drawnow

% continue with the MATLAB equivalent of the C cs_demo2 program
for order = [0 3]
    if (order == 0 & m > 1000)                                              %#ok
        continue ;
    end
    fprintf ('QR    ') ;
    print_order (order) ;
    b = rhs (m) ;           % compute right-hand-side
    tic ;
    x = cs_qrsol (C, b, order) ;
    fprintf ('time %8.2f ', toc) ;
    print_resid (C, x, b) ;
end

if (m ~= n)
    return ;
end

for order = 0:3
    if (order == 0 & m > 1000)                                              %#ok
        continue ;
    end
    fprintf ('LU    ') ;
    print_order (order) ;
    b = rhs (m) ;           % compute right-hand-side
    tic ;
    x = cs_lusol (C, b, order) ;
    fprintf ('time %8.2f ', toc) ;
    print_resid (C, x, b) ;
end

if (sym == 0)
    return ;
end

for order = 0:1
    if (order == 0 & m > 1000)                                              %#ok
        continue ;
    end
    fprintf ('Chol  ') ;
    print_order (order) ;
    b = rhs (m) ;           % compute right-hand-side
    tic ;
    x = cs_cholsol (C, b, order) ;
    fprintf ('time %8.2f ', toc) ;
    print_resid (C, x, b) ;
end
