%-------------------------------------------------------------------------------
% CHOLMOD/Demo/lperf:  test performance of x=A\b in CHOLMOD
%-------------------------------------------------------------------------------

% CHOLMOD/Demo Module.  Copyright (C) 2005-2023, Timothy A. Davis,
% All Rights Reserved.
% SPDX-License-Identifier: GPL-2.0+

%-------------------------------------------------------------------------------

% test the performance of the sparse subset Ax=b solver

clear
rng ('default')
index = ssget ;
f = find (index.posdef & (index.amd_lnz > 0)) ;
f = setdiff (f, [1425 228 353 354]) ; % not really posdef
[ignore i] = sort (index.amd_lnz (f)) ;
f = f (i) ;
nmat = length (f)

figure (1) ; clf ; hold off
figure (2) ; clf ; hold off
maxresid = 0 ;

for k = 1:nmat
    id = f (k) ;
    Prob = ssget (id, index)
    A = Prob.A ;
    n = size (A,1) ;

    if (exist ('timelog.m', 'file'))
        delete ('timelog.m') ;
    end
    clear results
    mwrite ('/tmp/A.mtx', A) ;
    system ('./cholmod_l_demo < /tmp/A.mtx > /tmp/output') ;

    % get the results = [i, xlen, flops, time]
    % also get lnz and t = dense solve time
    timelog

    if (isreal (A))
        fl = 2 * n + 4 * lnz ;
    else
        fl = 16 * n + 16 * lnz ;
    end

    figure (1) 
    clf
    hold off
    loglog (results (:,3), results (:,4), 'o', fl, t, 'ro') ;
    xlabel ('flops') ;
    ylabel ('time') ;

    figure (2) 
    loglog (results (:,3), results (:,4), 'o', fl, t, 'ro') ;
    xlabel ('flops') ;
    ylabel ('time') ;
    hold on

    maxresid = max (maxresid, resid) ;
    fprintf ('resid %g maxresid %g\n', resid, maxresid) ;
    drawnow

end
