* Bug 15841 fixed: intersect() now accepts sparse
[scilab.git] / scilab / modules / elementary_functions / tests / unit_tests / intersect_sparse.tst
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2020 - Samuel GOUGEON
4 //
5 //  This file is distributed under the same license as the Scilab package.
6 // =============================================================================
7
8 // <-- CLI SHELL MODE -->
9 // <-- NO CHECK REF -->
10 //
11 // <-- Short Description -->
12 // Unitary tests for intersect() with sparse boolean or numeric matrices
13
14 // ===============
15 // Sparse booleans
16 // ===============
17 [T, F] = (%t, %f);
18 [esp, espb] = (sparse([]), sparse(F)); espb(1) = []
19
20 // With an empty
21 assert_checkequal(intersect(T, espb), []);
22 [v, ka, kb] = intersect(T, espb);
23 assert_checkequal(list(v, ka, kb), list([], [], []));
24
25 assert_checkequal(intersect(espb, F), []);
26 [v, ka, kb] = intersect(espb, F);
27 assert_checkequal(list(v, ka, kb), list([], [], []));
28 //
29 A = [F F T F T F
30      T F F T T T
31      T T F T F F ];
32 B = [F T F T F
33      T F F F T
34      F T F F T ];
35 ref = [F F T
36        T T F
37        F T F ];
38 [spA, spB, spref] = (sparse(A), sparse(B), sparse(ref));
39 assert_checkequal(intersect(spA, B), sparse([F T]));
40 assert_checkequal(intersect(A, spB), sparse([F T]));
41 assert_checkequal(intersect(spA, spB), sparse([F T]));
42
43 LA = list(spA, A, spA);
44 LB = list(B, spB, spB);
45 for i = 1:3
46     assert_checkequal(intersect(LA(i), LB(i), "c"), spref);
47     [v,ka,kb] = intersect(LA(i), LB(i), "c");
48     assert_checkequal(v, spref);
49     assert_checkequal(ka, [6 1 3]);
50     assert_checkequal(kb, [1 5 4]);
51     assert_checkequal(sparse(LA(i)(:,ka)), v);
52     assert_checkequal(sparse(LB(i)(:,kb)), v);
53
54     assert_checkequal(intersect(LA(i)', LB(i)', "r"), spref');
55     [v,ka,kb] = intersect(LA(i)', LB(i)', "r");
56     assert_checkequal(v, spref');
57     assert_checkequal(ka, [6 1 3]);
58     assert_checkequal(kb, [1 5 4]);
59     assert_checkequal(sparse(LA(i)(:,ka))', v);
60     assert_checkequal(sparse(LB(i)(:,kb))', v);
61 end
62
63 // ============
64 // Sparse reals
65 // ============
66 A = sparse([-3 5 %nan 0 1e20 -%inf 123 1000]);
67 B = sparse([1 %nan -3 123 4530 0 -%inf ]);
68 assert_checkequal(intersect(A,B), sparse([-%inf -3 0 123]));
69 [v, ka, kb] = intersect(A,B);
70 assert_checkequal(v, sparse([-%inf -3 0 123]));
71 assert_checkequal([ka ; kb], [6 1 4 7 ; 7 3 6 4]);
72 //
73 A = sparse([1  0  0  0  0  1  2  0  2  0
74             2  0  2  0  1  0  1  0  0  2
75             2  0  0  0  0  1  0  0  0  0 ]);
76 B = sparse([2  1  1  0  1  0  0  2  2  0
77             2  0  1  1  0  0  1  1  0  0
78             0  2  0  0  1  1  1  2  0  0 ]);
79 Ref = sparse([0  0  1  2
80               0  1  0  0
81               0  0  1  0 ]);
82 kaRef  = [2  5  6  9];
83 kbRef  = [10  4  5  9];
84
85 assert_checkequal(intersect(A,B,"c"), Ref);
86 [v, ka, kb] = intersect(A,B,"c");
87 assert_checkequal(v, Ref);
88 assert_checkequal(ka, kaRef);
89 assert_checkequal(kb, kbRef);
90
91 assert_checkequal(intersect(A',B',"r"), Ref');
92 [v, ka, kb] = intersect(A',B',"r");
93 assert_checkequal(v, Ref');
94 assert_checkequal(ka, kaRef);
95 assert_checkequal(kb, kbRef);
96
97
98 // ==============
99 // Sparse complex
100 // ==============
101 r = [-3  5   %nan 0   1e20 %inf 123  0];
102 i = [1  %nan -3   123 4530 0    -%inf 1];
103 A = sparse(complex(r,i))
104 r = [-3  0  1e20 %nan 0    %inf 123 ];
105 i = [0   1  1    -3   123  0   -%inf];
106 B = sparse(complex(r,i))
107 Ref = sparse(complex([0 0 123 %inf], [1 123 -%inf 0]));
108 assert_checkequal(intersect(A,B), Ref);
109
110 // "c" and "r" modes
111 // -----------------
112 r  = [0.   1.   0.   0.   0.   1.   0.   1.   0.   0.
113       1.   0.   1.   1.   1.   0.   1.   0.   1.   0. ];
114 i  = [1.   0.   0.   1.   1.   0.   1.   0.   0.   0.
115       1.   1.   0.   0.   1.   0.   0.   0.   1.   0. ];
116 A = sparse(complex(r,i));
117
118 r  = [0.   1.   1.   1.   0.   1.   0.   0.   0.   0.
119       1.   1.   1.   1.   1.   0.   0.   1.   0.   1. ];
120 i  = [0.   0.   1.   1.   1.   1.   1.   0.   1.   1.
121       0.   0.   0.   0.   1.   0.   0.   1.   1.   1. ];
122 B = sparse(complex(r,i));
123
124 Ref = sparse([0,  0   ,   %i ;
125               1,  1+%i, 1+%i]);
126 kaRef  = [3 9 1];
127 kbRef  = [1 8 5];
128
129 assert_checkequal(intersect(A,B,"c"), Ref);
130 [v, ka, kb] = intersect(A,B,"c");
131 assert_checkequal(v, Ref);
132 assert_checkequal(ka, kaRef);
133 assert_checkequal(kb, kbRef);
134
135 assert_checkequal(intersect(A',B',"r"), Ref');
136 [v, ka, kb] = intersect(A',B',"r");
137 assert_checkequal(v, Ref');
138 assert_checkequal(ka, kaRef);
139 assert_checkequal(kb, kbRef);