1function test134(short) 2%TEST134 test GxB_select 3 4% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved. 5% SPDX-License-Identifier: Apache-2.0 6 7% A shorter version of test25 8 9fprintf ('\ntest134: GxB_select tests\n') ; 10 11if (nargin < 1) 12 short = false ; 13end 14 15[~, ~, ~, types, ~, select_ops] = GB_spec_opsall ; 16types = types.all ; 17 18if (short) 19 types = { 'double' } ; 20end 21 22rng ('default') ; 23 24m = 10 ; 25n = 6 ; 26dt = struct ('inp0', 'tran') ; 27 28for k1 = 1:length(types) 29 atype = types {k1} ; 30 fprintf ('%-14s ', atype) ; 31 32 for A_sparsity = [0 1 2] 33 for A_is_csc = 0:1 34 for C_is_hyper = 0:1 35 for C_is_csc = 0:1 36 for M_is_hyper = 0:1 37 for M_is_csc = 0:1 38 39 if (A_sparsity == 0) 40 A_is_hyper = 0 ; 41 A_sparsity_control = 2 ; % sparse 42 elseif (A_sparsity == 1) 43 A_is_hyper = 1 ; 44 A_sparsity_control = 1 ; % hypersparse 45 else 46 A_is_hyper = 0 ; 47 A_sparsity_control = 4 ; % bitmap 48 end 49 50 if (A_is_hyper) 51 ha = 1 ; 52 else 53 ha = 0 ; 54 end 55 56 if (C_is_hyper) 57 hc = 1 ; 58 else 59 hc = 0 ; 60 end 61 62 if (M_is_hyper) 63 hm = 1 ; 64 else 65 hm = 0 ; 66 end 67 68 A = GB_spec_random (m, n, 0.3, 100, atype, A_is_csc, A_is_hyper, ha) ; 69 A.matrix (:,1) = rand (m,1) ; 70 A.pattern (:,1) = true (m,1) ; 71 Cin = GB_spec_random (m, n, 0.3, 100, atype, C_is_csc, C_is_hyper, hc) ; 72 B = GB_spec_random (n, m, 0.3, 100, atype, A_is_csc, A_is_hyper, ha) ; 73 cin = GB_mex_cast (0, atype) ; 74 Mask = GB_random_mask (m, n, 0.5, M_is_csc, M_is_hyper) ; 75 Mask.hyper_switch = hm ; 76 77 A.sparsity = A_sparsity_control ; 78 B.sparsity = A_sparsity_control ; 79 80 fprintf ('.') ; 81 82 for k2 = 1:length(select_ops) 83 op = select_ops {k2} ; 84 85 if (contains (atype, 'complex')) 86 switch (op) 87 case { 'gt_zero', 'ge_zero', 'lt_zero', 'le_zero', ... 88 'gt_thunk', 'ge_thunk', 'lt_thunk', 'le_thunk' } 89 continue ; 90 % error ('op %s not defined for complex types', op) ; 91 otherwise 92 % op is OK 93 end 94 end 95 96 switch op 97 case {'tril' } 98 klist = [-4 0 4] ; 99 case {'triu' } 100 klist = [-4 0 4] ; 101 case {'diag' } 102 klist = [-4 0 4] ; 103 case {'offdiag' } 104 klist = [-4 0 4] ; 105 case {'nonzero' } 106 klist = 0 ; 107 case {'eq_zero' } 108 klist = 0 ; 109 case {'gt_zero' } 110 klist = 0 ; 111 case {'ge_zero' } 112 klist = 0 ; 113 case {'lt_zero' } 114 klist = 0 ; 115 case {'le_zero' } 116 klist = 0 ; 117 case {'ne_thunk'} 118 klist = [0 1] ; 119 case {'eq_thunk'} 120 klist = [0 1] ; 121 case {'gt_thunk'} 122 klist = [0 1] ; 123 case {'ge_thunk'} 124 klist = [0 1] ; 125 case {'lt_thunk'} 126 klist = [0 1] ; 127 case {'le_thunk'} 128 klist = [0 1] ; 129 end 130 131 132 133 for k = klist 134 135 % no mask 136 C1 = GB_spec_select (Cin, [], [], op, A, k, []) ; 137 C2 = GB_mex_select (Cin, [], [], op, A, k, [], 'test') ; 138 GB_spec_compare (C1, C2) ; 139 140 % no mask, transpose 141 C1 = GB_spec_select (Cin, [], [], op, B, k, dt) ; 142 C2 = GB_mex_select (Cin, [], [], op, B, k, dt, 'test') ; 143 GB_spec_compare (C1, C2) ; 144 145 if (strcmp (op, 'tril')) 146 147 % no mask, with accum 148 C1 = GB_spec_select (Cin, [], 'plus', op, A, k, []) ; 149 C2 = GB_mex_select (Cin, [], 'plus', op, A, k, [], 'test') ; 150 GB_spec_compare (C1, C2) ; 151 152 % with mask 153 C1 = GB_spec_select (Cin, Mask, [], op, A, k, []) ; 154 C2 = GB_mex_select (Cin, Mask, [], op, A, k, [], 'test') ; 155 GB_spec_compare (C1, C2) ; 156 157 % with mask and accum 158 C1 = GB_spec_select (Cin, Mask, 'plus', op, A, k, []) ; 159 C2 = GB_mex_select (Cin, Mask, 'plus', op, A, k, [], 'test') ; 160 GB_spec_compare (C1, C2) ; 161 162 % no mask, with accum, transpose 163 C1 = GB_spec_select (Cin, [], 'plus', op, B, k, dt) ; 164 C2 = GB_mex_select (Cin, [], 'plus', op, B, k, dt, 'test') ; 165 GB_spec_compare (C1, C2) ; 166 167 % with mask, transpose 168 C1 = GB_spec_select (Cin, Mask, [], op, B, k, dt) ; 169 C2 = GB_mex_select (Cin, Mask, [], op, B, k, dt, 'test') ; 170 GB_spec_compare (C1, C2) ; 171 172 % with mask and accum, transpose 173 C1 = GB_spec_select (Cin, Mask, 'plus', op, B, k, dt) ; 174 C2 = GB_mex_select (Cin, Mask, 'plus', op, B, k, dt, 'test') ; 175 GB_spec_compare (C1, C2) ; 176 177 end 178 end 179 end 180 181 end 182 end 183 end 184 end 185 end 186 end 187 fprintf ('\n') ; 188 189end 190 191fprintf ('\ntest134: all tests passed\n') ; 192 193 194