xref: /aosp_15_r20/external/eigen/test/diagonal_matrix_variadic_ctor.cpp (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2019 David Tellenbach <[email protected]>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #define EIGEN_NO_STATIC_ASSERT
11 
12 #include "main.h"
13 
14 template <typename Scalar>
assertionTest()15 void assertionTest()
16 {
17   typedef DiagonalMatrix<Scalar, 5> DiagMatrix5;
18   typedef DiagonalMatrix<Scalar, 7> DiagMatrix7;
19   typedef DiagonalMatrix<Scalar, Dynamic> DiagMatrixX;
20 
21   Scalar raw[6];
22   for (int i = 0; i < 6; ++i) {
23     raw[i] = internal::random<Scalar>();
24   }
25 
26   VERIFY_RAISES_ASSERT((DiagMatrix5{raw[0], raw[1], raw[2], raw[3]}));
27   VERIFY_RAISES_ASSERT((DiagMatrix5{raw[0], raw[1], raw[3]}));
28   VERIFY_RAISES_ASSERT((DiagMatrix7{raw[0], raw[1], raw[2], raw[3]}));
29 
30   VERIFY_RAISES_ASSERT((DiagMatrixX {
31     {raw[0], raw[1], raw[2]},
32     {raw[3], raw[4], raw[5]}
33   }));
34 }
35 
36 #define VERIFY_IMPLICIT_CONVERSION_3(DIAGTYPE, V0, V1, V2) \
37   DIAGTYPE d(V0, V1, V2);                                  \
38   DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix();     \
39   VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0);               \
40   VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1);               \
41   VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2);
42 
43 #define VERIFY_IMPLICIT_CONVERSION_4(DIAGTYPE, V0, V1, V2, V3) \
44   DIAGTYPE d(V0, V1, V2, V3);                                  \
45   DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix();         \
46   VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0);                   \
47   VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1);                   \
48   VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2);                   \
49   VERIFY_IS_APPROX(Dense(3, 3), (Scalar)V3);
50 
51 #define VERIFY_IMPLICIT_CONVERSION_5(DIAGTYPE, V0, V1, V2, V3, V4) \
52   DIAGTYPE d(V0, V1, V2, V3, V4);                                  \
53   DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix();             \
54   VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0);                       \
55   VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1);                       \
56   VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2);                       \
57   VERIFY_IS_APPROX(Dense(3, 3), (Scalar)V3);                       \
58   VERIFY_IS_APPROX(Dense(4, 4), (Scalar)V4);
59 
60 template<typename Scalar>
constructorTest()61 void constructorTest()
62 {
63   typedef DiagonalMatrix<Scalar, 0> DiagonalMatrix0;
64   typedef DiagonalMatrix<Scalar, 3> DiagonalMatrix3;
65   typedef DiagonalMatrix<Scalar, 4> DiagonalMatrix4;
66   typedef DiagonalMatrix<Scalar, Dynamic> DiagonalMatrixX;
67 
68   Scalar raw[7];
69   for (int k = 0; k < 7; ++k) raw[k] = internal::random<Scalar>();
70 
71   // Fixed-sized matrices
72   {
73     DiagonalMatrix0 a {{}};
74     VERIFY(a.rows() == 0);
75     VERIFY(a.cols() == 0);
76     typename DiagonalMatrix0::DenseMatrixType m = a.toDenseMatrix();
77     for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
78   }
79   {
80     DiagonalMatrix3 a {{raw[0], raw[1], raw[2]}};
81     VERIFY(a.rows() == 3);
82     VERIFY(a.cols() == 3);
83     typename DiagonalMatrix3::DenseMatrixType m = a.toDenseMatrix();
84     for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
85   }
86   {
87     DiagonalMatrix4 a {{raw[0], raw[1], raw[2], raw[3]}};
88     VERIFY(a.rows() == 4);
89     VERIFY(a.cols() == 4);
90     typename DiagonalMatrix4::DenseMatrixType m = a.toDenseMatrix();
91     for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
92   }
93 
94   // dynamically sized matrices
95   {
96     DiagonalMatrixX a{{}};
97     VERIFY(a.rows() == 0);
98     VERIFY(a.rows() == 0);
99     typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
100     for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
101   }
102   {
103     DiagonalMatrixX a{{raw[0], raw[1], raw[2], raw[3], raw[4], raw[5], raw[6]}};
104     VERIFY(a.rows() == 7);
105     VERIFY(a.rows() == 7);
106     typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
107     for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
108   }
109 }
110 
111 template<>
constructorTest()112 void constructorTest<float>()
113 {
114   typedef float Scalar;
115 
116   typedef DiagonalMatrix<Scalar, 0> DiagonalMatrix0;
117   typedef DiagonalMatrix<Scalar, 3> DiagonalMatrix3;
118   typedef DiagonalMatrix<Scalar, 4> DiagonalMatrix4;
119   typedef DiagonalMatrix<Scalar, 5> DiagonalMatrix5;
120   typedef DiagonalMatrix<Scalar, Dynamic> DiagonalMatrixX;
121 
122   Scalar raw[7];
123   for (int k = 0; k < 7; ++k) raw[k] = internal::random<Scalar>();
124 
125   // Fixed-sized matrices
126   {
127     DiagonalMatrix0 a {{}};
128     VERIFY(a.rows() == 0);
129     VERIFY(a.cols() == 0);
130     typename DiagonalMatrix0::DenseMatrixType m = a.toDenseMatrix();
131     for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
132   }
133   {
134     DiagonalMatrix3 a {{raw[0], raw[1], raw[2]}};
135     VERIFY(a.rows() == 3);
136     VERIFY(a.cols() == 3);
137     typename DiagonalMatrix3::DenseMatrixType m = a.toDenseMatrix();
138     for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
139   }
140   {
141     DiagonalMatrix4 a {{raw[0], raw[1], raw[2], raw[3]}};
142     VERIFY(a.rows() == 4);
143     VERIFY(a.cols() == 4);
144     typename DiagonalMatrix4::DenseMatrixType m = a.toDenseMatrix();
145     for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
146   }
147 
148   // dynamically sized matrices
149   {
150     DiagonalMatrixX a{{}};
151     VERIFY(a.rows() == 0);
152     VERIFY(a.rows() == 0);
153     typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
154     for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
155   }
156   {
157     DiagonalMatrixX a{{raw[0], raw[1], raw[2], raw[3], raw[4], raw[5], raw[6]}};
158     VERIFY(a.rows() == 7);
159     VERIFY(a.rows() == 7);
160     typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
161     for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
162   }
163   { VERIFY_IMPLICIT_CONVERSION_3(DiagonalMatrix3, 1.2647, 2.56f, -3); }
164   { VERIFY_IMPLICIT_CONVERSION_4(DiagonalMatrix4, 1.2647, 2.56f, -3, 3.23f); }
165   { VERIFY_IMPLICIT_CONVERSION_5(DiagonalMatrix5, 1.2647, 2.56f, -3, 3.23f, 2); }
166 }
167 
EIGEN_DECLARE_TEST(diagonal_matrix_variadic_ctor)168 EIGEN_DECLARE_TEST(diagonal_matrix_variadic_ctor)
169 {
170   CALL_SUBTEST_1(assertionTest<unsigned char>());
171   CALL_SUBTEST_1(assertionTest<float>());
172   CALL_SUBTEST_1(assertionTest<Index>());
173   CALL_SUBTEST_1(assertionTest<int>());
174   CALL_SUBTEST_1(assertionTest<long int>());
175   CALL_SUBTEST_1(assertionTest<std::ptrdiff_t>());
176   CALL_SUBTEST_1(assertionTest<std::complex<double>>());
177 
178   CALL_SUBTEST_2(constructorTest<unsigned char>());
179   CALL_SUBTEST_2(constructorTest<float>());
180   CALL_SUBTEST_2(constructorTest<Index>());
181   CALL_SUBTEST_2(constructorTest<int>());
182   CALL_SUBTEST_2(constructorTest<long int>());
183   CALL_SUBTEST_2(constructorTest<std::ptrdiff_t>());
184   CALL_SUBTEST_2(constructorTest<std::complex<double>>());
185 }
186