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