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