b334391a475dde1961dceb18fb636459ba6ff1ea
[scilab.git] / scilab / modules / elementary_functions / tests / unit_tests / gsort_multilevel_polynomials.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 // <-- ENGLISH IMPOSED -->
11 //
12 //====================================================================
13 //          Tests of multilevel gsort() for polynomials
14 //====================================================================
15 /*
16 We sort polynomials,
17  - first: by degree, with degree()
18  - second: by highest coefficient, by a custom function.
19 */
20 function c = get_degreeI(p,i)
21     tmp = coeff(p(:))
22     [nl,nc] = size(tmp)
23     if i <> %inf then
24         tmp = tmp(:,i+1)
25     else
26         tmp = tmp'((0:nl-1)'*nc + max(0,degree(p(:)))+1) // highest coeff
27     end
28     c = matrix(tmp, size(p))
29 endfunction
30 crit = list(degree, list(get_degreeI, %inf));
31
32 // Initial array
33 // -------------
34 x = poly(0,"x");
35 p = [
36   "[2*x,1+2*x+x^2,1+2*x+2*x^2,2+x,2*x+x^2,0*x;"
37   "2+x^2,2*x+x^2,0,2*x^2,1+x+2*x^2,2*x+2*x^2;"
38   "1+2*x^2,x+x^2,2*x^2,1+2*x,2+2*x,2+2*x+x^2;"
39   "2*x+x^2,x,1+x+x^2,2*x,x+x^2,x+2*x^2;"
40   "1+2*x+x^2,2+x+x^2,1+2*x+x^2,2*x+2*x^2,2,2+x+2*x^2;"
41   "x,2*x,2+2*x+x^2,2+2*x+x^2,1,2+x];"
42  ];
43 p = evstr(p);
44 /*
45   2x         1 +2x +x²  1 +2x +2x²  2 +x       2x +x²     0
46   2 +x²      2x +x²     0           2x²        1 +x +2x²  2x +2x²
47   1 +2x²     x +x²      2x²         1 +2x      2 +2x      2 +2x +x²
48   2x +x²     x          1 +x +x²    2x         x +x²      x +2x²
49   1 +2x +x²  2 +x +x²   1 +2x +x²   2x +2x²    2          2 +x +2x²
50   x          2x         2 +2x +x²   2 +2x +x²  1          2 +x
51 */
52
53 // "g" multilevel sorting
54 // ----------------------
55 [r, k] = %gsort_multilevel(p, "g", ["i" "i"], crit);
56 ref = [
57   "[0*x,2+x,2+2*x,x+x^2,2*x+x^2,2*x^2;"
58   "0*x,2+x,2+x^2,2+x+x^2,x+x^2,2*x+2*x^2;"
59   "1,2*x,2*x+x^2,1+x+x^2,2+2*x+x^2,1+x+2*x^2;"
60   "2,2*x,1+2*x+x^2,1+2*x+x^2,1+2*x^2,2*x+2*x^2;"
61   "x,1+2*x,1+2*x+x^2,2+2*x+x^2,1+2*x+2*x^2,x+2*x^2;"
62   "x,2*x,2*x+x^2,2+2*x+x^2,2*x^2,2+x+2*x^2]"
63   ];
64 ref = evstr(ref);
65 /*
66   0  2 +x   2 +2x      x +x²      2x +x²      2x²
67   0  2 +x   2 +x²      2 +x +x²   x +x²       2x +2x²
68   1  2x     2x +x²     1 +x +x²   2 +2x +x²   1 +x +2x²
69   2  2x     1 +2x +x²  1 +2x +x²  1 +2x²      2x +2x²
70   x  1 +2x  1 +2x +x²  2 +2x +x²  1 +2x +2x²  x +2x²
71   x  2x     2x +x²     2 +2x +x²  2x²         2 +x +2x²
72 */
73 kref = [
74   14  19  27   9  25  20
75   31  36   2  11  28  23
76   30   1   4  16  33  26
77   29  12   5  17   3  32
78    6  21   7  18  13  34
79   10  22   8  24  15  35
80   ];
81 assert_checkequal(r, ref);
82 assert_checkequal(k, kref);
83 //
84 [r, k] = %gsort_multilevel(p, "g", ["i" "d"], crit);
85 ref = [
86   "[0*x,1+2*x,2+x,1+x+2*x^2,1+2*x+x^2,1+2*x+x^2;"
87   "0*x,2*x,1+2*x^2,2*x+2*x^2,1+2*x+x^2,2+2*x+x^2;"
88   "2,2+2*x,1+2*x+2*x^2,x+2*x^2,2*x+x^2,2+2*x+x^2;"
89   "1,x,2*x^2,2+x+2*x^2,x+x^2,2*x+x^2;"
90   "2*x,x,2*x^2,2+x^2,2+x+x^2,x+x^2;"
91   "2*x,2+x,2*x+2*x^2,2*x+x^2,1+x+x^2,2+2*x+x^2]"
92   ];
93 ref = evstr(ref);
94 /*
95   0   1 +2x  2 +x        1 +x +2x²  1 +2x +x²  1 +2x +x²
96   0   2x     1 +2x²      2x +2x²    1 +2x +x²  2 +2x +x²
97   2   2 +2x  1 +2x +2x²  x +2x²     2x +x²     2 +2x +x²
98   1   x      2x²         2 +x +2x²  x +x²      2x +x²
99   2x  x      2x²         2 +x²      2 +x +x²   x +x²
100   2x  2 +x   2x +2x²     2x +x²     1 +x +x²   2 +2x +x²
101 */
102 kref = [
103   14  21  36  26   5  17
104   31  22   3  32   7  18
105   29  27  13  34   8  24
106   30   6  15  35   9  25
107    1  10  20   2  11  28
108   12  19  23   4  16  33
109   ];
110 assert_checkequal(r, ref);
111 assert_checkequal(k, kref);
112
113 // "r" and "c" multilevel sorting
114 // ------------------------------
115 [r, k] = %gsort_multilevel(p, "c", ["i" "i"], crit);
116 ref = [
117   "[0*x,2+x,2*x,1+2*x+x^2,2*x+x^2,1+2*x+2*x^2;"
118   "0*x,2+x^2,2*x+x^2,2*x^2,1+x+2*x^2,2*x+2*x^2;"
119   "1+2*x,2+2*x,x+x^2,2+2*x+x^2,1+2*x^2,2*x^2;"
120   "x,2*x,2*x+x^2,1+x+x^2,x+x^2,x+2*x^2;"
121   "2,1+2*x+x^2,2+x+x^2,1+2*x+x^2,2*x+2*x^2,2+x+2*x^2;"
122   "1,x,2+x,2*x,2+2*x+x^2,2+2*x+x^2]"
123   ];
124 ref = evstr(ref);
125 /*
126   0      2 +x       2x        1 +2x +x²  2x +x²     1 +2x +2x²
127   0      2 +x²      2x +x²    2x²        1 +x +2x²  2x +2x²
128   1 +2x  2 +2x      x +x²     2 +2x +x²  1 +2x²     2x²
129   x      2x         2x +x²    1 +x +x²   x +x²      x +2x²
130   2      1 +2x +x²  2 +x +x²  1 +2x +x²  2x +2x²    2 +x +2x²
131   1      x          2 +x      2x         2 +2x +x²  2 +2x +x²
132 */
133 kref = [
134   6  4  1  2  5  3
135   3  1  2  4  5  6
136   4  5  2  6  1  3
137   2  4  1  3  5  6
138   5  1  2  3  4  6
139   5  1  6  2  3  4
140   ];
141 assert_checkequal(r, ref);
142 assert_checkequal(k, kref);
143 //
144 [r, k] = %gsort_multilevel(p, "c", ["d" "i"], crit);
145 ref = [
146   "[1+2*x+x^2,2*x+x^2,1+2*x+2*x^2,2+x,2*x,0*x;"
147   "2+x^2,2*x+x^2,2*x^2,1+x+2*x^2,2*x+2*x^2,0*x;"
148   "x+x^2,2+2*x+x^2,1+2*x^2,2*x^2,1+2*x,2+2*x;"
149   "2*x+x^2,1+x+x^2,x+x^2,x+2*x^2,x,2*x;"
150   "1+2*x+x^2,2+x+x^2,1+2*x+x^2,2*x+2*x^2,2+x+2*x^2,2;"
151   "2+2*x+x^2,2+2*x+x^2,x,2+x,2*x,1]"
152   ];
153 ref = evstr(ref);
154 /*
155   1 +2x +x²  2x +x²     1 +2x +2x²  2 +x       2x         0
156   2 +x²      2x +x²     2x²         1 +x +2x²  2x +2x²    0
157   x +x²      2 +2x +x²  1 +2x²      2x²        1 +2x      2 +2x
158   2x +x²     1 +x +x²   x +x²       x +2x²     x          2x
159   1 +2x +x²  2 +x +x²   1 +2x +x²   2x +2x²    2 +x +2x²  2
160   2 +2x +x²  2 +2x +x²  x           2 +x       2x         1
161 */
162 kref = [
163   2  5  3  4  1  6
164   1  2  4  5  6  3
165   2  6  1  3  4  5
166   1  3  5  6  2  4
167   1  2  3  4  6  5
168   3  4  1  6  2  5
169   ];
170 assert_checkequal(r, ref);
171 assert_checkequal(k, kref);
172 //
173 [r, k] = %gsort_multilevel(p, "r", ["i" "i"], crit);
174 ref = [
175   "[x,x,0*x,2+x,1,0*x;"
176   "2*x,2*x,1+x+x^2,1+2*x,2,2+x;"
177   "2+x^2,1+2*x+x^2,1+2*x+x^2,2*x,2+2*x,2+2*x+x^2;"
178   "2*x+x^2,2*x+x^2,2+2*x+x^2,2+2*x+x^2,2*x+x^2,2*x+2*x^2;"
179   "1+2*x+x^2,x+x^2,1+2*x+2*x^2,2*x^2,x+x^2,x+2*x^2;"
180   "1+2*x^2,2+x+x^2,2*x^2,2*x+2*x^2,1+x+2*x^2,2+x+2*x^2]"
181   ];
182 ref = evstr(ref);
183 /*
184   x          x          0           2 +x       1          0
185   2x         2x         1 +x +x²    1 +2x      2          2 +x
186   2 +x²      1 +2x +x²  1 +2x +x²   2x         2 +2x      2 +2x +x²
187   2x +x²     2x +x²     2 +2x +x²   2 +2x +x²  2x +x²     2x +2x²
188   1 +2x +x²  x +x²      1 +2x +2x²  2x²        x +x²      x +2x²
189   1 +2x²     2 +x +x²   2x²         2x +2x²    1 +x +2x²  2 +x +2x²
190 */
191 kref = [
192   6  4  2  1  6  1
193   1  6  4  3  5  6
194   2  1  5  4  3  3
195   4  2  6  6  1  2
196   5  3  1  2  4  4
197   3  5  3  5  2  5
198   ];
199 assert_checkequal(r, ref);
200 assert_checkequal(k, kref);
201 //
202 [r, k] = %gsort_multilevel(p, "r", ["d" "i"], crit);
203 ref = [
204   "[2+x^2,1+2*x+x^2,1+x+x^2,2+2*x+x^2,2*x+x^2,2+2*x+x^2;"
205   "2*x+x^2,2*x+x^2,1+2*x+x^2,2*x^2,x+x^2,2*x+2*x^2;"
206   "1+2*x+x^2,x+x^2,2+2*x+x^2,2*x+2*x^2,1+x+2*x^2,x+2*x^2;"
207   "1+2*x^2,2+x+x^2,1+2*x+2*x^2,2+x,2+2*x,2+x+2*x^2;"
208   "x,x,2*x^2,1+2*x,1,2+x;"
209   "2*x,2*x,0*x,2*x,2,0*x]"
210   ];
211 ref = evstr(ref);
212 /*
213   2 +x²      1 +2x +x²  1 +x +x²    2 +2x +x²  2x +x²     2 +2x +x²
214   2x +x²     2x +x²     1 +2x +x²   2x²        x +x²      2x +2x²
215   1 +2x +x²  x +x²      2 +2x +x²   2x +2x²    1 +x +2x²  x +2x²
216   1 +2x²     2 +x +x²   1 +2x +2x²  2 +x       2 +2x      2 +x +2x²
217   x          x          2x²         1 +2x      1          2 +x
218   2x         2x         0           2x         2          0
219 */
220 kref = [
221   2  1  4  6  1  3
222   4  2  5  2  4  2
223   5  3  6  5  2  4
224   3  5  1  1  3  5
225   6  4  3  3  6  6
226   1  6  2  4  5  1
227   ];
228 assert_checkequal(r, ref);
229 assert_checkequal(k, kref);
230
231 // Lexicographic multilevel sorting
232 // --------------------------------
233 p = [
234   "[2+2*x,2+2*x,2+x,1+x,1+2*x,1+2*x;"
235   "0*x,x,2*x,2,2+x,1+x;"
236   "2+2*x,1+2*x,x,1,0*x,2+x;"
237   "2,1+2*x,1+2*x,x,x,1+2*x;"
238   "1,2,1+x,2,1,0*x;"
239   "1+x,2*x,1,1,2+2*x,x;"
240   "2+x,0*x,2+x,0*x,2*x,x]"
241   ];
242 p = evstr(p);
243 /*
244   2 +2x  2 +2x  2 +x   1 +x  1 +2x  1 +2x
245   0      x      2x     2     2 +x   1 +x
246   2 +2x  1 +2x  x      1     0      2 +x
247   2      1 +2x  1 +2x  x     x      1 +2x
248   1      2      1 +x   2     1      0
249   1 +x   2x     1      1     2 +2x  x
250   2 +x   0      2 +x   0     2x     x
251 */
252 [r, k] = %gsort_multilevel(p, "lr", ["i" "i"], crit);
253 ref = [
254   "[0*x,x,2*x,2,2+x,1+x;"
255   "1,2,1+x,2,1,0*x;"
256   "2,1+2*x,1+2*x,x,x,1+2*x;"
257   "2+x,0*x,2+x,0*x,2*x,x;"
258   "1+x,2*x,1,1,2+2*x,x;"
259   "2+2*x,1+2*x,x,1,0*x,2+x;"
260   "2+2*x,2+2*x,2+x,1+x,1+2*x,1+2*x]"
261   ];
262 ref = evstr(ref);
263 /*
264   0      x      2x     2     2 +x   1 +x
265   1      2      1 +x   2     1      0
266   2      1 +2x  1 +2x  x     x      1 +2x
267   2 +x   0      2 +x   0     2x     x
268   1 +x   2x     1      1     2 +2x  x
269   2 +2x  1 +2x  x      1     0      2 +x
270   2 +2x  2 +2x  2 +x   1 +x  1 +2x  1 +2x
271 */
272 assert_checkequal(r, ref);
273 assert_checkequal(k', [2  5  4  7  6  3  1]);
274
275 //
276 [r, k] = %gsort_multilevel(p, "lr", ["d" "i"], crit);
277 ref = [
278   "[1+x,2*x,1,1,2+2*x,x;"
279   "2+x,0*x,2+x,0*x,2*x,x;"
280   "2+2*x,2+2*x,2+x,1+x,1+2*x,1+2*x;"
281   "2+2*x,1+2*x,x,1,0*x,2+x;"
282   "1,2,1+x,2,1,0*x;"
283   "2,1+2*x,1+2*x,x,x,1+2*x;"
284   "0*x,x,2*x,2,2+x,1+x]"
285   ];
286 ref = evstr(ref);
287 /*
288   1 +x   2x     1      1     2 +2x  x
289   2 +x   0      2 +x   0     2x     x
290   2 +2x  2 +2x  2 +x   1 +x  1 +2x  1 +2x
291   2 +2x  1 +2x  x      1     0      2 +x
292   1      2      1 +x   2     1      0
293   2      1 +2x  1 +2x  x     x      1 +2x
294   0      x      2x     2     2 +x   1 +x
295 */
296 assert_checkequal(r, ref);
297 assert_checkequal(k', [6  7  1  3  5  4  2]);
298 //
299 [r, k] = %gsort_multilevel(p, "lc", ["i" "i"], crit);
300 ref = [
301   "[1+x,2+x,2+2*x,1+2*x,1+2*x,2+2*x;"
302   "2,2*x,0*x,2+x,1+x,x;"
303   "1,x,2+2*x,0*x,2+x,1+2*x;"
304   "x,1+2*x,2,x,1+2*x,1+2*x;"
305   "2,1+x,1,1,0*x,2;"
306   "1,1,1+x,2+2*x,x,2*x;"
307   "0*x,2+x,2+x,2*x,x,0*x]"
308   ];
309 ref = evstr(ref);
310 /*
311   1 +x  2 +x   2 +2x  1 +2x  1 +2x  2 +2x
312   2     2x     0      2 +x   1 +x   x
313   1     x      2 +2x  0      2 +x   1 +2x
314   x     1 +2x  2      x      1 +2x  1 +2x
315   2     1 +x   1      1      0      2
316   1     1      1 +x   2 +2x  x      2x
317   0     2 +x   2 +x   2x     x      0
318 */
319 assert_checkequal(r, ref);
320 assert_checkequal(k, [4  3  1  5  6  2]);
321 //
322 [r, k] = %gsort_multilevel(p, "lc", ["d" "i"], crit);
323 ref = [
324   "[2+x,1+x,1+2*x,2+2*x,1+2*x,2+2*x;"
325   "2*x,2,1+x,x,2+x,0*x;"
326   "x,1,2+x,1+2*x,0*x,2+2*x;"
327   "1+2*x,x,1+2*x,1+2*x,x,2;"
328   "1+x,2,0*x,2,1,1;"
329   "1,1,x,2*x,2+2*x,1+x;"
330   "2+x,0*x,x,0*x,2*x,2+x]"
331   ];
332 ref = evstr(ref);
333 /*
334   2 +x   1 +x  1 +2x  2 +2x  1 +2x  2 +2x
335   2x     2     1 +x   x      2 +x   0
336   x      1     2 +x   1 +2x  0      2 +2x
337   1 +2x  x     1 +2x  1 +2x  x      2
338   1 +x   2     0      2      1      1
339   1      1     x      2x     2 +2x  1 +x
340   2 +x   0     x      0      2x     2 +x
341 */
342 assert_checkequal(r, ref);
343 assert_checkequal(k, [3  4  6  2  5  1]);