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