1function gbtest82
2%GBTEST82 test complex A*B, A'*B, A*B', A'*B', A+B
3
4% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
5% SPDX-License-Identifier: GPL-3.0-or-later
6
7rng ('default') ;
8
9nlist = [1 4 10] ;
10r = complex ([-1 1]) ;
11maxerr = 0 ;
12for m = nlist
13    for n = nlist
14        for k = nlist
15            A = GrB.random (k, m, (m*5)/(k*m), 'range', r) ;
16            B = GrB.random (k, n, (n*5)/(k*n), 'range', r) ;
17            C = double (A).'*double (B) ;
18            C2 = GrB.mxm (A, '+.*', B, struct ('in0', 'transpose')) ;
19            err = norm (C-C2,1) ;
20            maxerr = max (maxerr, err) ;
21            assert (err < 1e-12)
22        end
23    end
24end
25fprintf ('All complex A''*B tests passed, maxerr %g\n', maxerr) ;
26
27maxerr = 0 ;
28for m = nlist
29    for n = nlist
30
31            A = GrB.random (m, n, (m*5)/(k*m), 'range', r) ;
32            B = GrB.random (m, n, (n*5)/(k*n), 'range', r) ;
33            C = double (A) + double (B) ;
34            C2 = A + B  ;
35            err = norm (C-C2,1) ;
36            maxerr = max (maxerr, err) ;
37            assert (err < 1e-12)
38    end
39end
40fprintf ('All complex A+B tests passed, maxerr %g\n', maxerr) ;
41
42maxerr = 0 ;
43for m = nlist
44    for n = nlist
45        for k = nlist
46            for at = 0:1
47                for bt = 0:1
48                    if (at)
49                        A = GrB.random (k, m, (n*5)/(k*m), 'range', r) ;
50                    else
51                        A = GrB.random (m, k, (m*5)/(k*m), 'range', r) ;
52                    end
53                    if (bt)
54                        B = GrB.random (n, k, (m*5)/(k*m), 'range', r) ;
55                    else
56                        B = GrB.random (k, n, (m*5)/(k*m), 'range', r) ;
57                    end
58
59                    desc = struct ;
60                    if (at)
61                        desc.in0 = 'transpose' ;
62                    end
63                    if (bt)
64                        desc.in1 = 'transpose' ;
65                    end
66
67                    M = sparse (m, n) ;
68                    M (1,1) = 1 ; %#ok
69
70                    C = GrB.mxm (A, '+.*', B, desc) ;
71                    Cin = GrB (m, n, 'double complex') ;
72                    CM = GrB.mxm (Cin, M, A, '+.*', B, desc) ;
73
74                    A = double (A) ;
75                    B = double (B) ;
76
77                    if (at)
78                        if (bt)
79                            C2 = A.'*B.'  ;
80                            CM2 = (A.'*B.') .* M ;
81                        else
82                            C2 = A.'*B  ;
83                            CM2 = (A.'*B) .* M ;
84                        end
85                    else
86                        if (bt)
87                            C2 = A*B.'  ;
88                            CM2 = (A*B.') .* M ;
89                        else
90                            C2 = A*B  ;
91                            CM2 = (A*B) .* M ;
92                        end
93                    end
94                    err = norm (C-C2,1) ;
95                    maxerr = max (maxerr, err) ;
96                    assert (err < 1e-12)
97
98                    err = norm (CM-CM2,1) ;
99                    maxerr = max (maxerr, err) ;
100                    assert (err < 1e-12)
101
102                end
103            end
104        end
105    end
106end
107
108fprintf ('maxerr: %g\n', maxerr) ;
109fprintf ('gbtest82: all tests passed\n') ;
110
111