1// ============================================================================
2// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3//
4// Copyright (C) 2019-2020 - Samuel GOUGEON
5//
6//  This file is distributed under the same license as the Scilab package.
7// ============================================================================
8
9// <-- CLI SHELL MODE -->
10// <-- NO CHECK REF -->
11//
12// ---------------------------------------------
13// <--  Unit test for ./. and .\. operators  -->
14// ---------------------------------------------
15
16rtol = 10*%eps;
17objects = list(rand(1,1), rand(1,3), rand(4,1), rand(1,1,5), rand(2,3), rand(3,4,2));
18n = length(objects);
19
20// With arrays without zeros
21// =========================
22for i = 1:n
23    o = objects(i);
24    for j = 1:n
25        o2 = objects(j);
26        b = o .*. o2;
27        assert_checkalmostequal(b ./. o2, o, rtol)
28        assert_checkalmostequal(o .\. b, o2, rtol)
29    end
30end
31
32// With a null array
33// =================
34z = list(zeros(1,1), zeros(1,3), zeros(4,1), zeros(1,1,5), zeros(2,3), zeros(3,4,2));
35for i = 1:n
36    o = objects(i);
37    for j = 1:n
38        o2 = z(j);
39        b = o .*. o2;
40        //assert_checkalmostequal(b ./. o2, o, rtol)  // => Nan | not managed
41        assert_checkalmostequal(o .\. b, o2, rtol)
42
43        b = o2 .*. o;
44        assert_checkalmostequal(b ./. o, o2, rtol)
45        //assert_checkalmostequal(o2 .\. b, o, rtol)  // => Nan | not managed
46    end
47end
48
49// With arrays with zeros
50// ======================
51withZeros = list(1, 0:3, [2 0 1]', cat(3,3,0,2,0), [2 3 0 ; 1 0 2], ..
52            matrix([0,3,1,2,0,2,3,0,3,3,3,2,3,1,0,0,3,3,1,0,3,3,0,0], [3,4,2]));
53for i = 1:n
54    o = objects(i);
55    for j = 1:n
56        // Without zeros .*. with zeros
57        // ............................
58        o2 = withZeros(j);
59        b = o .*. o2;
60        assert_checkalmostequal(b ./. o2, o, rtol)
61        assert_checkalmostequal(o .\. b, o2, rtol)
62
63        b = o2 .*. o;
64        assert_checkalmostequal(b ./. o, o2, rtol)
65        assert_checkalmostequal(o2 .\. b, o, rtol)
66
67        // With zeros .*. with zeros
68        // .........................
69        o = withZeros(i);
70        b = o .*. o2;
71        assert_checkalmostequal(b ./. o2, o, rtol)
72        assert_checkalmostequal(o .\. b, o2, rtol)
73
74        b = o2 .*. o;
75        assert_checkalmostequal(b ./. o, o2, rtol)
76        assert_checkalmostequal(o2 .\. b, o, rtol)
77    end
78end
79
80// Between sparse matrices
81// =======================
82rtol = 10*%eps;
83objects = list(sprand(10,1,0.5), sprand(1,8,0.5), sprand(5,5,0.5));
84n = length(objects);
85
86for i = 1:n
87    o = objects(i);
88    for j = 1:n
89        o2 = objects(j);
90        b = o .*. o2;
91        assert_checkalmostequal(b ./. o2, o, rtol)
92        assert_checkalmostequal(o .\. b, o2, rtol)
93    end
94end
95