1function test74
2%TEST74 test GrB_mxm: all built-in semirings
3
4% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
5% SPDX-License-Identifier: Apache-2.0
6
7[binops, ~, add_ops, types, ~, ~] = GB_spec_opsall ;
8% mult_ops = binops.positional ;
9mult_ops = binops.all ;
10types = types.all ;
11
12fprintf ('test74 -------- GrB_mxm on all semirings (all methods)\n') ;
13
14dnn = struct ;
15dtn = struct ( 'inp0', 'tran' ) ;
16dnt = struct ( 'inp1', 'tran' ) ;
17dtt = struct ( 'inp0', 'tran', 'inp1', 'tran' ) ;
18
19dnn_Gus  = struct ( 'axb', 'gustavson' ) ;
20dnn_hash = struct ( 'axb', 'hash' ) ;
21
22ntrials = 0 ;
23
24rng ('default') ;
25GB_builtin_complex_set (1) ;
26
27m_list = [ 1  2    9  ] ;
28n_list = [ 1  2   10  ] ;
29k_list = [ 20 100 12  ] ;
30d_list = [0.3 0.3 0.3 ] ;
31
32for k0 = 1:size(m_list,2)
33
34    m = m_list (k0) ;
35    n = n_list (k0) ;
36    k = k_list (k0) ;
37    density = d_list (k0) ;
38
39    n_semirings = 0 ;
40    A = GB_spec_random (m,k,density,100,'none') ;
41    B = GB_spec_random (k,n,density,100,'none') ;
42    C = GB_spec_random (m,n,density,100,'none') ;
43    M = spones (sprandn (m, n, 0.3)) ;
44
45    clear AT
46    AT = A ;
47    AT.matrix  = A.matrix.' ;
48    AT.pattern = A.pattern' ;
49    fprintf ('\nm %d n %d k %d: \n', m, n, k) ;
50
51    for k1 = 1:length(mult_ops)
52        mulop = mult_ops {k1} ;
53
54        fprintf ('\n%-8s', mulop) ;
55
56        for k2 = 1:length(add_ops)
57            addop = add_ops {k2} ;
58
59            for k3 = 1:length (types)
60                semiring_type = types {k3} ;
61
62                semiring.multiply = mulop ;
63                semiring.add = addop ;
64                semiring.class = semiring_type ;
65
66                % create the semiring.  some are not valid because the
67                % or,and,xor monoids can only be used when z is boolean for
68                % z=mult(x,y).
69                try
70                    [mult_op add_op id] = GB_spec_semiring (semiring) ;
71                    [mult_opname mult_optype ztype xtype ytype] = ...
72                        GB_spec_operator (mult_op);
73                    [ add_opname  add_optype] = GB_spec_operator (add_op) ;
74                    identity = GB_spec_identity (semiring.add, add_optype) ;
75                catch
76                    continue
77                end
78
79                fprintf ('.') ;
80
81                n_semirings = n_semirings + 1 ;
82                % fprintf ('[%s.%s.%s]\n', addop, mulop, semiring_type) ;
83
84                AT.class = semiring_type ;
85                A.class = semiring_type ;
86                B.class = semiring_type ;
87                C.class = semiring_type ;
88
89                % C<M> = A'*B, with Mask, no typecasting
90                C1 = GB_mex_mxm  (C, M, [ ], semiring, AT, B, dtn);
91                C0 = GB_spec_mxm (C, M, [ ], semiring, AT, B, dtn);
92                GB_spec_compare (C0, C1, identity) ;
93
94                % C = A'*B, no Mask, no typecasting
95                C1 = GB_mex_mxm  (C, [ ], [ ], semiring, AT, B, dtn);
96                C0 = GB_spec_mxm (C, [ ], [ ], semiring, AT, B, dtn);
97                GB_spec_compare (C0, C1, identity) ;
98
99                % C = A*B, no Mask, no typecasting, Gustavson
100                C1 = GB_mex_mxm  (C, [ ], [ ], semiring, A, B, dnn_Gus);
101                % C0 = GB_spec_mxm (C, [ ], [ ], semiring, A, B, dnn_Gus);
102                GB_spec_compare (C0, C1, identity) ;
103
104                % C = A*B, no Mask, no typecasting, Hash
105                C1 = GB_mex_mxm  (C, [ ], [ ], semiring, A, B, dnn_hash);
106                % C0 = GB_spec_mxm (C, [ ], [ ], semiring, A, B, dnn_hash);
107                GB_spec_compare (C0, C1, identity) ;
108
109            end
110        end
111    end
112end
113
114fprintf ('\nsemirings tested: %d\n', n_semirings) ;
115fprintf ('\ntest74: all tests passed\n') ;
116
117