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