1function ssmult_test
2%SSMULT_TEST lengthy test of SSMULT and SSMULTSYM
3%
4%   Example
5%       ssmult_test
6%
7% See also ssmult, ssmultsym
8
9% Copyright 2007-2011, Timothy A. Davis, http://www.suitesparse.com
10
11fprintf ('\nTesting large sparse column vectors (1e7-by-1)\n') ;
12x = sprandn (1e7,1,1e-4) ;
13y = sprandn (1e7,1,1e-4) ;
14x (1) = pi ;
15y (1) = exp (1) ;
16tic ; a = x'*y ; t1 = toc ;
17tic ; b = ssmult (x, y, 1) ; t2 = toc ;
18fprintf ('s=x''*y in MATLAB: %8.3f seconds\n', t1) ;
19fprintf ('s=ssmult(x,y,1):  %8.3f seconds; error %g\n', t2, abs (full(a-b))) ;
20fprintf ('SSMULT speedup: %8.3g\n\n', t1/t2) ;
21
22load west0479
23A = west0479 ;
24B = sprand (A) ;
25C = A*B ;
26D = ssmult (A,B) ;
27err = norm (C-D,1) / norm (C,1) ;
28fprintf ('west0479 error: %g\n', err) ;
29
30fprintf ('\ntesting large matrices (may fail if you are low on memory):\n')
31rand ('state', 0) ;
32
33n = 10000 ;
34A = sprand (n, n, 0.01) ;
35B = sprand (n, n, 0.001) ;
36test_large (A,B) ;
37
38msg = { 'real', 'complex' } ;
39
40% all of these calls to ssmult should fail:
41fprintf ('\ntesting error handling (the errors below are expected):\n') ;
42A = { 3, 'gunk', sparse(1), sparse(1), sparse(rand(3,2)) } ;
43B = { 4,   0   , 5,         msg,       sparse(rand(3,4)) } ;
44for k = 1:length(A)
45    try
46        % the following statement is supposed to fail
47        C = ssmult (A {k}, B {k}) ;                                         %#ok
48        error ('test failed\n') ;
49    catch me
50        disp (me.message) ;
51    end
52end
53fprintf ('error handling tests: ok.\n') ;
54
55% err should be zero:
56rand ('state', 0)
57for Acomplex = 0:1
58    for Bcomplex = 0:1
59        err = 0 ;
60        fprintf ('\ntesting C = A*B where A is %s, B is %s\n', ...
61            msg {Acomplex+1}, msg {Bcomplex+1}) ;
62        for m = [ 0:30 100 ]
63            fprintf ('.') ;
64            for n = [ 0:30 100 ]
65                for k = [ 0:30 100 ]
66                    A = sprand (m,k,0.1) ;
67                    if (Acomplex)
68                        A = A + 1i*sprand (A) ;
69                    end
70                    B = sprand (k,n,0.1) ;
71                    if (Bcomplex)
72                        B = B + 1i*sprand (B) ;
73                    end
74                    C = A*B ;
75                    D = ssmult (A,B) ;
76                    s = ssmultsym (A,B) ;
77                    err = max (err, norm (C-D,1)) ;
78                    err = max (err, nnz (C-D)) ;
79                    err = max (err, isreal (D) ~= (norm (imag (D), 1) == 0)) ;
80                    err = max (err, s.nz > nnz (C)) ;
81                    [i j x] = find (D) ;                                    %#ok
82                    if (~isempty (x))
83                        err = max (err, any (x == 0)) ;
84                    end
85                end
86            end
87        end
88        fprintf (' maximum error: %g\n', err) ;
89    end
90end
91
92sstest ;
93fprintf ('\nSSMULT tests complete.\n') ;
94
95
96%-------------------------------------------------------------------------------
97function test_large (A,B)
98% test large matrices
99n = size (A,1) ;
100fprintf ('dimension %d   nnz(A): %d   nnz(B): %d\n', n, nnz (A), nnz (B)) ;
101c = ssmultsym (A,B) ;
102fprintf ('nnz(C): %d   flops: %g   memory: %g MB\n', ...
103    c.nz, c.flops, c.memory/2^20) ;
104try
105    % warmup for accurate timings
106    C = A*B ;                                                               %#ok
107    D = ssmult (A,B) ;                                                      %#ok
108    tic ;
109    C = A*B ;
110    t1 = toc ;
111    tic ;
112    D = ssmult (A,B) ;
113    t2 = toc ;
114    tic ;
115    t3 = toc ;
116    fprintf ('MATLAB time:          %g\n', t1) ;
117    err = norm (C-D,1) ;
118    fprintf ('SSMULT time:          %g err: %g\n', t2, err) ;
119catch me
120    disp (me.message)
121    fprintf ('tests with large random matrices failed ...\n') ;
122end
123clear C D
124
125