1function test19b(fulltest) 2%TEST19B test GrB_assign and GrB_*_setElement with many pending operations 3 4% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved. 5% SPDX-License-Identifier: Apache-2.0 6 7fprintf ('\ntest19b: GrB_assign and setElement, many pending computations\n') ; 8 9debug_status = stat ; 10if (debug_status) 11 % turn off malloc debugging for this test 12 debug_off 13end 14 15if (nargin < 1) 16 fulltest = 0 ; 17end 18if (fulltest) 19 nt = 3000 ; 20else 21 nt = 2000 ; 22end 23 24for problem = 0:2 25 26 clear Work Work2 27 switch (problem) 28 case 0 29 Corig = sparse (5,5) ; 30 d = 1 ; 31 ntrials = 100 ; 32 case 1 33 Corig = sprandn (10,20,0.1) ; 34 d = 0.3 ; 35 ntrials = nt ; 36 case 2 37 Corig = sparse (rand (10, 20)) ; 38 d = 0.3 ; 39 ntrials = nt ; 40 end 41 42 rng ('default') ; 43 [m n] = size (Corig) ; 44 fprintf ('problem %d: C is %d-by-%d, # assign/setElement to do: %d\n', ... 45 problem, m, n, ntrials) ; 46 47 if (problem > 0) 48 fprintf ('... please wait\n') ; 49 end 50 51 for k = 1:ntrials 52 53 c = randi (10,1) ; 54 if (c == 10) 55 d = struct ('outp', 'replace') ; 56 elseif (c == 9) 57 d = struct ('outp', 'replace', 'mask', 'complement') ; 58 elseif (c == 8) 59 d = struct ('mask', 'complement') ; 60 else 61 d = [ ] ; 62 end 63 64 c = randi (3,1) ; 65 switch (c) 66 case 1 67 accum = '' ; 68 case 2 69 accum = 'plus' ; 70 case 3 71 accum = 'second' ; 72 end 73 74 kind = 0 ; 75 c = randi (12,1) ; 76 if (c < 8) 77 ni = randi (3,1) ; 78 nj = randi (3,1) ; 79 J = randperm (n, nj) ; 80 I = randperm (m, ni) ; 81 A = sprand (ni, nj, 0.3) ; 82 scalar = 0 ; 83 elseif (c == 8) 84 % scalar expansion 85 ni = 2 ; 86 nj = 2 ; 87 J = randperm (n, nj) ; 88 I = randperm (m, ni) ; 89 A = sparse (rand (1)) ; 90 scalar = 1 ; 91 elseif (c == 9) 92 ni = 1 ; 93 nj = 1 ; 94 I = randperm (m,1) ; 95 J = randperm (n,1) ; 96 A = sparse (rand (1)) ; 97 scalar = 0 ; 98 elseif (c == 10) 99 ni = 2 ; 100 nj = 2 ; 101 I = randperm (m,2) ; 102 J = randperm (n,2) ; 103 A = sparse (rand (2)) ; 104 scalar = 0 ; 105 elseif (c == 11) 106 % column assign 107 ni = randi (3,1) ; 108 nj = 1 ; 109 kind = 1 ; 110 J = randperm (n, 1) ; 111 I = randperm (m, ni) ; 112 A = sprand (ni, 1, 0.3) ; 113 scalar = 0 ; 114 else % (c == 12) 115 % row assign: A is a single *column* vector 116 ni = 1 ; 117 nj = randi (3,1) ; 118 kind = 2 ; 119 J = randperm (n, nj) ; 120 I = randperm (m, 1) ; 121 A = sprand (nj, 1, 0.3) ; 122 scalar = 0 ; 123 end 124 125 c = randi (2,1) ; 126 switch (c) 127 case 1 128 % no mask 129 Mask = [ ] ; 130 case 2 131 if (kind == 0) 132 % mask same size as C: Matrix or Vector assign 133 Mask = (sprand (m, n, 0.3) ~= 0) ; 134 elseif (kind == 1) 135 % mask same size as C(:,j): column assign 136 Mask = (sprand (m, 1, 0.3) ~= 0) ; 137 else % (kind == 2) 138 % mask same size as C(i,:)': row assign 139 Mask = (sprand (n, 1, 0.3) ~= 0) ; 140 end 141 end 142 143 Work (k).A = A ; 144 Work (k).I = I ; 145 Work (k).J = J ; 146 Work (k).Mask = Mask ; 147 Work (k).accum = accum ; 148 Work (k).desc = d ; 149 Work (k).scalar = scalar ; 150 Work (k).kind = kind ; 151 152 Work2 (k).A = A ; 153 Work2 (k).I = uint64 (I-1) ; 154 Work2 (k).J = uint64 (J-1) ; 155 Work2 (k).Mask = Mask ; 156 Work2 (k).accum = accum ; 157 Work2 (k).desc = d ; 158 Work2 (k).kind = kind ; 159 160 end 161 162 C3 = Corig ; 163 164 for k = 1:ntrials 165 J = Work (k).J ; 166 I = Work (k).I ; 167 A = Work (k).A ; 168 M = Work (k).Mask ; 169 accum = Work (k).accum ; 170 d = Work (k).desc ; 171 scalar = Work (k).scalar ; 172 kind = Work (k).kind ; 173 if (kind == 0) 174 % matrix/vector assign 175 C3 = GB_spec_assign (C3, M, accum, A, I, J, d, scalar) ; 176 elseif (kind == 1) 177 % col assign 178 C3 = GB_spec_Col_assign (C3, M, accum, A, I, J, d) ; 179 else % (kind == 2) 180 % row assign 181 C3 = GB_spec_Row_assign (C3, M, accum, A, I, J, d) ; 182 end 183 end 184 185 % default sparsity 186 C2 = GB_mex_assign (Corig, Work2) ; 187 GB_spec_compare (C2, C3) ; 188 189 % with sparsity control 190 for sparsity_control = 0:15 191 C2 = GB_mex_assign (Corig, Work2, ... 192 [sparsity_control 15]) ; 193 GB_spec_compare (C2, C3) ; 194 end 195 196end 197 198if (debug_status) 199 debug_on 200end 201fprintf ('\ntest19b: all tests passed\n') ; 202 203