1function testca
2%TESTCA test complex mxm, mxv, and vxm
3
4% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
5% SPDX-License-Identifier: Apache-2.0
6
7fprintf ('testca: test complex mxm, mxv, and vxm\n') ;
8rng ('default') ;
9dnn = struct ;
10dnt = struct ('inp1', 'tran') ;
11dtn = struct ('inp0', 'tran') ;
12dtt = struct ('inp0', 'tran', 'inp1', 'tran') ;
13
14algos = {'auto', 'gustavson', 'dot', 'hash', 'saxpy'} ;
15
16for kk = 1:length(algos)
17dnn.algo = algos {kk} ;
18dnt.algo = algos {kk} ;
19dtn.algo = algos {kk} ;
20dtt.algo = algos {kk} ;
21
22semiring.add = 'plus' ;
23semiring.multiply = 'times' ;
24semiring.class = 'double complex' ;
25
26seed = 1 ;
27for m = [1 5 10 100]
28    for n = [1 5 10 100]
29        for k = [1 5 10 100]
30            fprintf ('.') ;
31            for trial = 1:31
32
33                A = GB_mex_random (m, k, 10*(m+k), 1, seed) ; seed = seed + 1 ;
34                B = GB_mex_random (k, n, 10*(k+n), 1, seed) ; seed = seed + 1 ;
35                S = GB_mex_complex (sparse (m,n)) ;
36                D = GB_mex_random (m, n, 10*(m+n), 1, seed) ; seed = seed + 1 ;
37
38                if (trial == 31)
39                    A (:,1) = 1i * rand (m,1) ;
40                    B (1,:) = 1i * rand (1,n) ;
41                    if (k > 1)
42                        A (:,2) = 0 ;
43                        A (1,2) = 1i ;
44                        B (2,:) = 0 ;
45                        B (2,1) = 1i ;
46                    end
47                end
48
49                C = A*B ;
50                C2 = GB_mex_mxm (S, [], [], semiring, A, B, dnn) ;
51                assert (isequal_roundoff (C, C2.matrix)) ;
52
53                if (n == 1)
54                    C2 = GB_mex_mxv (S, [], [], semiring, A, B, dnn) ;
55                    assert (isequal_roundoff (C, C2.matrix)) ;
56
57                    C2 = GB_mex_vxm (S, [], [], semiring, B, A.', dnn) ;
58                    assert (isequal_roundoff (C, C2.matrix)) ;
59                end
60
61                if (m > 1 && n > 1)
62                    t = min (m,n) ;
63                    Eye = speye (m,n) ;
64                    C = A*B ;
65                    C2 = GB_mex_mxm (S, Eye, [], semiring, A, B, dnn) ;
66                    d = full (diag (C)) ;
67                    d = GB_mex_complex (sparse (1:t, 1:t, d, m, n)) ;
68                    assert (isequal_roundoff (d, C2.matrix)) ;
69                end
70
71                C = D + A*B ;
72                C2 = GB_mex_mxm (D, [], 'plus', semiring, A, B, dnn) ;
73                assert (isequal_roundoff (C, C2.matrix)) ;
74
75                if (n == 1)
76                    C2 = GB_mex_mxv (D, [], 'plus', semiring, A, B, dnn) ;
77                    assert (isequal_roundoff (C, C2.matrix)) ;
78                end
79
80                C2 = GB_mex_mxm (D, [], 'plus', semiring, A, B.', dnt)  ;
81                assert (isequal_roundoff (C, C2.matrix)) ;
82
83                C2 = GB_mex_mxm (D, [], 'plus', semiring, A.', B, dtn)  ;
84                assert (isequal_roundoff (C, C2.matrix)) ;
85
86                if (n == 1)
87                    C2 = GB_mex_mxv (D, [], 'plus', semiring, A.', B, dtn)  ;
88                    assert (isequal_roundoff (C, C2.matrix)) ;
89                end
90
91                C2 = GB_mex_mxm (D, [], 'plus', semiring, A.', B.', dtt)  ;
92                assert (isequal_roundoff (C, C2.matrix)) ;
93
94                M = spones (sprand (m, n, 0.5)) ;
95                C2 = GB_mex_mxm (S, M, [ ], semiring, A.', B.', dtt)  ;
96                C = (A*B) .* M ;
97                assert (isequal_roundoff (C, C2.matrix)) ;
98
99            end
100        end
101    end
102end
103end
104
105fprintf ('\ntestca: all complex mxm, mxv, vxm tests passed\n') ;
106
107