1function gbtest18
2%GBTEST18 test comparators (and, or, >, ...)
3
4% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
5% SPDX-License-Identifier: GPL-3.0-or-later
6
7tol = 1e-14 ;
8rng ('default') ;
9for trial = 1:21
10
11    fprintf ('.') ;
12
13    if (mod (trial, 10) == 1)
14        m = 1 ;
15        n = 1 ;
16    else
17        m = 4 ;
18        n = 5 ;
19    end
20
21    MA = sprand (m,n, 0.5) ;    A (2,2) = 2 ; %#ok<*NASGU>
22    MB = sprand (m,n, 0.5) ;    B (2,2) = 2 ;
23
24    if (rand < 0.1)
25        MA = logical (MA) ;
26        MB = logical (MB) ;
27    end
28
29    GA = GrB (MA) ;
30    GB = GrB (MB) ;
31
32    C1 = (MA < MB) ;
33    C2 = (GA < GB) ;
34    C3 = (MA < GB) ;
35    C4 = (GA < MB) ;
36    assert (gbtest_eq (C1, C2)) ;
37    assert (gbtest_eq (C1, C3)) ;
38    assert (gbtest_eq (C1, C4)) ;
39
40    C1 = (MA <= MB) ;
41    C2 = (GA <= GB) ;
42    C3 = (MA <= GB) ;
43    C4 = (GA <= MB) ;
44    assert (gbtest_eq (C1, C2)) ;
45    assert (gbtest_eq (C1, C3)) ;
46    assert (gbtest_eq (C1, C4)) ;
47
48    C1 = (MA > MB) ;
49    C2 = (GA > GB) ;
50    C3 = (MA > GB) ;
51    C4 = (GA > MB) ;
52    assert (gbtest_eq (C1, C2)) ;
53    assert (gbtest_eq (C1, C3)) ;
54    assert (gbtest_eq (C1, C4)) ;
55
56    C1 = (MA >= MB) ;
57    C2 = (GA >= GB) ;
58    C3 = (MA >= GB) ;
59    C4 = (GA >= MB) ;
60    assert (gbtest_eq (C1, C2)) ;
61    assert (gbtest_eq (C1, C3)) ;
62    assert (gbtest_eq (C1, C4)) ;
63
64    C1 = (MA == MB) ;
65    C2 = (GA == GB) ;
66    C3 = (MA == GB) ;
67    C4 = (GA == MB) ;
68    assert (gbtest_eq (C1, C2)) ;
69    assert (gbtest_eq (C1, C3)) ;
70    assert (gbtest_eq (C1, C4)) ;
71
72    C1 = (MA ~= MB) ;
73    C2 = (GA ~= GB) ;
74    C3 = (MA ~= GB) ;
75    C4 = (GA ~= MB) ;
76    assert (gbtest_eq (C1, C2)) ;
77    assert (gbtest_eq (C1, C3)) ;
78    assert (gbtest_eq (C1, C4)) ;
79
80    if (~islogical (MA))
81        C1 = (MA .^ MB) ;
82        C2 = (GA .^ GB) ;
83        C3 = (MA .^ GB) ;
84        C4 = (GA .^ MB) ;
85        assert (gbtest_err (C1, C2) < tol) ;
86        assert (gbtest_err (C1, C3) < tol) ;
87        assert (gbtest_err (C1, C4) < tol) ;
88    end
89
90    C1 = (MA & MB) ;
91    C2 = (GA & GB) ;
92    C3 = (MA & GB) ;
93    C4 = (GA & MB) ;
94    assert (gbtest_eq (C1, C2)) ;
95    assert (gbtest_eq (C1, C3)) ;
96    assert (gbtest_eq (C1, C4)) ;
97    if (islogical (MA))
98        % C1 = min (MA , MB) ;
99        C2 = min (GA , GB) ;
100        C3 = min (MA , GB) ;
101        C4 = min (GA , MB) ;
102        assert (gbtest_eq (C1, C2)) ;
103        assert (gbtest_eq (C1, C3)) ;
104        assert (gbtest_eq (C1, C4)) ;
105    end
106
107    C1 = (MA | MB) ;
108    C2 = (GA | GB) ;
109    C3 = (MA | GB) ;
110    C4 = (GA | MB) ;
111    assert (gbtest_eq (C1, C2)) ;
112    assert (gbtest_eq (C1, C3)) ;
113    assert (gbtest_eq (C1, C4)) ;
114    if (islogical (MA))
115        % C1 = max (MA , MB) ;
116        C2 = max (GA , GB) ;
117        C3 = max (MA , GB) ;
118        C4 = max (GA , MB) ;
119        assert (gbtest_eq (C1, C2)) ;
120        assert (gbtest_eq (C1, C3)) ;
121        assert (gbtest_eq (C1, C4)) ;
122    end
123
124    C1 = xor (MA , MB) ;
125    C2 = xor (GA , GB) ;
126    C3 = xor (MA , GB) ;
127    C4 = xor (GA , MB) ;
128    assert (gbtest_eq (C1, C2)) ;
129    assert (gbtest_eq (C1, C3)) ;
130    assert (gbtest_eq (C1, C4)) ;
131
132    C1 = ~MA ;
133    C2 = ~GA ;
134    assert (gbtest_eq (C1, C2)) ;
135
136    b = (trial - 5) / 10 ;
137    if (islogical (MA))
138        b = logical (b) ;
139    end
140    g = GrB (b) ;
141
142    assert (gbtest_eq (MA <  b, GA <  b)) ;
143    assert (gbtest_eq (MA <= b, GA <= b)) ;
144    % MA > b
145    % GA > b
146    assert (gbtest_eq (MA >  b, GA >  b)) ;
147    assert (gbtest_eq (MA >= b, GA >= b)) ;
148    assert (gbtest_eq (MA == b, GA == b)) ;
149    assert (gbtest_eq (MA ~= b, GA ~= b)) ;
150    if (~islogical (MA))
151        MC = MA .^ b ;
152        GC = GA .^ b ;
153        assert (gbtest_err (MC, GC) < tol) ;
154    end
155
156    assert (gbtest_eq (MA <  b, GA <  g)) ;
157    assert (gbtest_eq (MA <= b, GA <= g)) ;
158    assert (gbtest_eq (MA >  b, GA >  g)) ;
159    assert (gbtest_eq (MA >= b, GA >= g)) ;
160    assert (gbtest_eq (MA == b, GA == g)) ;
161    assert (gbtest_eq (MA ~= b, GA ~= g)) ;
162    if (~islogical (MA))
163        assert (gbtest_err (MA .^ b, GA .^ g) < tol) ;
164    end
165
166    assert (gbtest_eq (MA <  b, MA <  g)) ;
167    assert (gbtest_eq (MA <= b, MA <= g)) ;
168    assert (gbtest_eq (MA >  b, MA >  g)) ;
169    assert (gbtest_eq (MA >= b, MA >= g)) ;
170    assert (gbtest_eq (MA == b, MA == g)) ;
171    assert (gbtest_eq (MA ~= b, MA ~= g)) ;
172    if (~islogical (MA))
173        assert (gbtest_err (MA .^ b, MA .^ g) < tol) ;
174    end
175
176    assert (gbtest_eq (b <  MA, b <  GA)) ;
177    assert (gbtest_eq (b <= MA, b <= GA)) ;
178    assert (gbtest_eq (b >  MA, b >  GA)) ;
179    assert (gbtest_eq (b >= MA, b >= GA)) ;
180    assert (gbtest_eq (b == MA, b == GA)) ;
181    assert (gbtest_eq (b ~= MA, b ~= GA)) ;
182    if (~islogical (MA))
183        assert (gbtest_err (b .^ MA, b .^ GA) < tol) ;
184    end
185
186    assert (gbtest_eq (b <  MA, g <  GA)) ;
187    assert (gbtest_eq (b <= MA, g <= GA)) ;
188    assert (gbtest_eq (b >  MA, g >  GA)) ;
189    assert (gbtest_eq (b >= MA, g >= GA)) ;
190    assert (gbtest_eq (b == MA, g == GA)) ;
191    assert (gbtest_eq (b ~= MA, g ~= GA)) ;
192    if (~islogical (MA))
193        assert (gbtest_err (b .^ MA, g .^ GA) < tol) ;
194    end
195
196    assert (gbtest_eq (b <  MA, g <  MA)) ;
197    assert (gbtest_eq (b <= MA, g <= MA)) ;
198    assert (gbtest_eq (b >  MA, g >  MA)) ;
199    assert (gbtest_eq (b >= MA, g >= MA)) ;
200    assert (gbtest_eq (b == MA, g == MA)) ;
201    assert (gbtest_eq (b ~= MA, g ~= MA)) ;
202    if (~islogical (MA))
203        assert (gbtest_err (b .^ MA, g .^ MA) < tol) ;
204    end
205
206    k = (mod (trial,2) == 0) ;
207    gbk = GrB (k) ;
208
209    C1 = (MA & k) ;
210    C2 = (GA & gbk) ;
211    C3 = (MA & gbk) ;
212    C4 = (GA & k) ;
213    assert (gbtest_eq (C1, C2)) ;
214    assert (gbtest_eq (C1, C3)) ;
215    assert (gbtest_eq (C1, C4)) ;
216    if (islogical (MA))
217        % C1 = min (MA , k) ;
218        C2 = min (GA , gbk) ;
219        C3 = min (MA , gbk) ;
220        C4 = min (GA , k) ;
221        assert (gbtest_eq (C1, C2)) ;
222        assert (gbtest_eq (C1, C3)) ;
223        assert (gbtest_eq (C1, C4)) ;
224    end
225
226    C1 = (k   & MA) ;
227    C2 = (gbk & GA) ;
228    C3 = (gbk & MA) ;
229    C4 = (k   & GA) ;
230    assert (gbtest_eq (C1, C2)) ;
231    assert (gbtest_eq (C1, C3)) ;
232    assert (gbtest_eq (C1, C4)) ;
233
234    C1 = (MA | k) ;
235    C2 = (GA | gbk) ;
236    C3 = (MA | gbk) ;
237    C4 = (GA | k) ;
238    assert (gbtest_eq (C1, C2)) ;
239    assert (gbtest_eq (C1, C3)) ;
240    assert (gbtest_eq (C1, C4)) ;
241
242    C1 = xor (MA, k) ;
243    C2 = xor (GA, gbk) ;
244    C3 = xor (MA, gbk) ;
245    C4 = xor (GA, k) ;
246    assert (gbtest_eq (C1, C2)) ;
247    assert (gbtest_eq (C1, C3)) ;
248    assert (gbtest_eq (C1, C4)) ;
249
250    C1 = (k   | MA) ;
251    C2 = (gbk | GA) ;
252    C3 = (gbk | MA) ;
253    C4 = (k   | GA) ;
254    assert (gbtest_eq (C1, C2)) ;
255    assert (gbtest_eq (C1, C3)) ;
256    assert (gbtest_eq (C1, C4)) ;
257
258    C1 = xor (k   , MA) ;
259    C2 = xor (gbk , GA) ;
260    C3 = xor (gbk , MA) ;
261    C4 = xor (k   , GA) ;
262    assert (gbtest_eq (C1, C2)) ;
263    assert (gbtest_eq (C1, C3)) ;
264    assert (gbtest_eq (C1, C4)) ;
265
266    k = double (k) ;
267    gbk = GrB (k) ;
268    if (~islogical (MA))
269        C1 = (k   .^ MA) ;
270        C2 = (gbk .^ GA) ;
271        C3 = (gbk .^ MA) ;
272        C4 = (k   .^ GA) ;
273        assert (gbtest_err (C1, C2) < tol) ;
274        assert (gbtest_err (C1, C3) < tol) ;
275        assert (gbtest_err (C1, C4) < tol) ;
276    end
277
278end
279
280fprintf ('\ngbtest18: all tests passed\n') ;
281
282