// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2019 David Tellenbach <david.tellenbach@tellnotes.org>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#define EIGEN_NO_STATIC_ASSERT
#include "main.h"
template <
typename Scalar>
void assertionTest()
{
typedef DiagonalMatrix<Scalar,
5> DiagMatrix5;
typedef DiagonalMatrix<Scalar,
7> DiagMatrix7;
typedef DiagonalMatrix<Scalar, Dynamic> DiagMatrixX;
Scalar raw[
6];
for (
int i =
0; i <
6; ++i) {
raw[i] = internal::random<Scalar>();
}
VERIFY_RAISES_ASSERT((DiagMatrix5{raw[
0], raw[
1], raw[
2], raw[
3]}));
VERIFY_RAISES_ASSERT((DiagMatrix5{raw[
0], raw[
1], raw[
3]}));
VERIFY_RAISES_ASSERT((DiagMatrix7{raw[
0], raw[
1], raw[
2], raw[
3]}));
VERIFY_RAISES_ASSERT((DiagMatrixX {
{raw[
0], raw[
1], raw[
2]},
{raw[
3], raw[
4], raw[
5]}
}));
}
#define VERIFY_IMPLICIT_CONVERSION_3(DIAGTYPE, V0, V1, V2) \
DIAGTYPE d(V0, V1, V2); \
DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix(); \
VERIFY_IS_APPROX(Dense(
0,
0), (Scalar)V0); \
VERIFY_IS_APPROX(Dense(
1,
1), (Scalar)V1); \
VERIFY_IS_APPROX(Dense(
2,
2), (Scalar)V2);
#define VERIFY_IMPLICIT_CONVERSION_4(DIAGTYPE, V0, V1, V2, V3) \
DIAGTYPE d(V0, V1, V2, V3); \
DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix(); \
VERIFY_IS_APPROX(Dense(
0,
0), (Scalar)V0); \
VERIFY_IS_APPROX(Dense(
1,
1), (Scalar)V1); \
VERIFY_IS_APPROX(Dense(
2,
2), (Scalar)V2); \
VERIFY_IS_APPROX(Dense(
3,
3), (Scalar)V3);
#define VERIFY_IMPLICIT_CONVERSION_5(DIAGTYPE, V0, V1, V2, V3, V4) \
DIAGTYPE d(V0, V1, V2, V3, V4); \
DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix(); \
VERIFY_IS_APPROX(Dense(
0,
0), (Scalar)V0); \
VERIFY_IS_APPROX(Dense(
1,
1), (Scalar)V1); \
VERIFY_IS_APPROX(Dense(
2,
2), (Scalar)V2); \
VERIFY_IS_APPROX(Dense(
3,
3), (Scalar)V3); \
VERIFY_IS_APPROX(Dense(
4,
4), (Scalar)V4);
template<
typename Scalar>
void constructorTest()
{
typedef DiagonalMatrix<Scalar,
0> DiagonalMatrix0;
typedef DiagonalMatrix<Scalar,
3> DiagonalMatrix3;
typedef DiagonalMatrix<Scalar,
4> DiagonalMatrix4;
typedef DiagonalMatrix<Scalar, Dynamic> DiagonalMatrixX;
Scalar raw[
7];
for (
int k =
0; k <
7; ++k) raw[k] = internal::random<Scalar>();
// Fixed-sized matrices
{
DiagonalMatrix0 a {{}};
VERIFY(a.rows() ==
0);
VERIFY(a.cols() ==
0);
typename DiagonalMatrix0::DenseMatrixType m = a.toDenseMatrix();
for (Index k =
0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
}
{
DiagonalMatrix3 a {{raw[
0], raw[
1], raw[
2]}};
VERIFY(a.rows() ==
3);
VERIFY(a.cols() ==
3);
typename DiagonalMatrix3::DenseMatrixType m = a.toDenseMatrix();
for (Index k =
0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
}
{
DiagonalMatrix4 a {{raw[
0], raw[
1], raw[
2], raw[
3]}};
VERIFY(a.rows() ==
4);
VERIFY(a.cols() ==
4);
typename DiagonalMatrix4::DenseMatrixType m = a.toDenseMatrix();
for (Index k =
0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
}
// dynamically sized matrices
{
DiagonalMatrixX a{{}};
VERIFY(a.rows() ==
0);
VERIFY(a.rows() ==
0);
typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
for (Index k =
0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
}
{
DiagonalMatrixX a{{raw[
0], raw[
1], raw[
2], raw[
3], raw[
4], raw[
5], raw[
6]}};
VERIFY(a.rows() ==
7);
VERIFY(a.rows() ==
7);
typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
for (Index k =
0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
}
}
template<>
void constructorTest<
float>()
{
typedef float Scalar;
typedef DiagonalMatrix<Scalar,
0> DiagonalMatrix0;
typedef DiagonalMatrix<Scalar,
3> DiagonalMatrix3;
typedef DiagonalMatrix<Scalar,
4> DiagonalMatrix4;
typedef DiagonalMatrix<Scalar,
5> DiagonalMatrix5;
typedef DiagonalMatrix<Scalar, Dynamic> DiagonalMatrixX;
Scalar raw[
7];
for (
int k =
0; k <
7; ++k) raw[k] = internal::random<Scalar>();
// Fixed-sized matrices
{
DiagonalMatrix0 a {{}};
VERIFY(a.rows() ==
0);
VERIFY(a.cols() ==
0);
typename DiagonalMatrix0::DenseMatrixType m = a.toDenseMatrix();
for (Index k =
0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
}
{
DiagonalMatrix3 a {{raw[
0], raw[
1], raw[
2]}};
VERIFY(a.rows() ==
3);
VERIFY(a.cols() ==
3);
typename DiagonalMatrix3::DenseMatrixType m = a.toDenseMatrix();
for (Index k =
0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
}
{
DiagonalMatrix4 a {{raw[
0], raw[
1], raw[
2], raw[
3]}};
VERIFY(a.rows() ==
4);
VERIFY(a.cols() ==
4);
typename DiagonalMatrix4::DenseMatrixType m = a.toDenseMatrix();
for (Index k =
0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
}
// dynamically sized matrices
{
DiagonalMatrixX a{{}};
VERIFY(a.rows() ==
0);
VERIFY(a.rows() ==
0);
typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
for (Index k =
0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
}
{
DiagonalMatrixX a{{raw[
0], raw[
1], raw[
2], raw[
3], raw[
4], raw[
5], raw[
6]}};
VERIFY(a.rows() ==
7);
VERIFY(a.rows() ==
7);
typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
for (Index k =
0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
}
{ VERIFY_IMPLICIT_CONVERSION_3(DiagonalMatrix3,
1.
2647,
2.
56f, -
3); }
{ VERIFY_IMPLICIT_CONVERSION_4(DiagonalMatrix4,
1.
2647,
2.
56f, -
3,
3.
23f); }
{ VERIFY_IMPLICIT_CONVERSION_5(DiagonalMatrix5,
1.
2647,
2.
56f, -
3,
3.
23f,
2); }
}
EIGEN_DECLARE_TEST(diagonal_matrix_variadic_ctor)
{
CALL_SUBTEST_1(assertionTest<
unsigned char>());
CALL_SUBTEST_1(assertionTest<
float>());
CALL_SUBTEST_1(assertionTest<Index>());
CALL_SUBTEST_1(assertionTest<
int>());
CALL_SUBTEST_1(assertionTest<
long int>());
CALL_SUBTEST_1(assertionTest<std::ptrdiff_t>());
CALL_SUBTEST_1(assertionTest<std::complex<
double>>());
CALL_SUBTEST_2(constructorTest<
unsigned char>());
CALL_SUBTEST_2(constructorTest<
float>());
CALL_SUBTEST_2(constructorTest<Index>());
CALL_SUBTEST_2(constructorTest<
int>());
CALL_SUBTEST_2(constructorTest<
long int>());
CALL_SUBTEST_2(constructorTest<std::ptrdiff_t>());
CALL_SUBTEST_2(constructorTest<std::complex<
double>>());
}