xref: /aosp_15_r20/external/eigen/test/selfadjoint.cpp (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1*bf2c3715SXin Li // This file is triangularView of Eigen, a lightweight C++ template library
2*bf2c3715SXin Li // for linear algebra.
3*bf2c3715SXin Li //
4*bf2c3715SXin Li // Copyright (C) 2010 Gael Guennebaud <[email protected]>
5*bf2c3715SXin Li //
6*bf2c3715SXin Li // This Source Code Form is subject to the terms of the Mozilla
7*bf2c3715SXin Li // Public License v. 2.0. If a copy of the MPL was not distributed
8*bf2c3715SXin Li // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9*bf2c3715SXin Li 
10*bf2c3715SXin Li #define TEST_CHECK_STATIC_ASSERTIONS
11*bf2c3715SXin Li #include "main.h"
12*bf2c3715SXin Li 
13*bf2c3715SXin Li // This file tests the basic selfadjointView API,
14*bf2c3715SXin Li // the related products and decompositions are tested in specific files.
15*bf2c3715SXin Li 
selfadjoint(const MatrixType & m)16*bf2c3715SXin Li template<typename MatrixType> void selfadjoint(const MatrixType& m)
17*bf2c3715SXin Li {
18*bf2c3715SXin Li   typedef typename MatrixType::Scalar Scalar;
19*bf2c3715SXin Li 
20*bf2c3715SXin Li   Index rows = m.rows();
21*bf2c3715SXin Li   Index cols = m.cols();
22*bf2c3715SXin Li 
23*bf2c3715SXin Li   MatrixType m1 = MatrixType::Random(rows, cols),
24*bf2c3715SXin Li              m2 = MatrixType::Random(rows, cols),
25*bf2c3715SXin Li              m3(rows, cols),
26*bf2c3715SXin Li              m4(rows, cols);
27*bf2c3715SXin Li 
28*bf2c3715SXin Li   m1.diagonal() = m1.diagonal().real().template cast<Scalar>();
29*bf2c3715SXin Li 
30*bf2c3715SXin Li   // check selfadjoint to dense
31*bf2c3715SXin Li   m3 = m1.template selfadjointView<Upper>();
32*bf2c3715SXin Li   VERIFY_IS_APPROX(MatrixType(m3.template triangularView<Upper>()), MatrixType(m1.template triangularView<Upper>()));
33*bf2c3715SXin Li   VERIFY_IS_APPROX(m3, m3.adjoint());
34*bf2c3715SXin Li 
35*bf2c3715SXin Li   m3 = m1.template selfadjointView<Lower>();
36*bf2c3715SXin Li   VERIFY_IS_APPROX(MatrixType(m3.template triangularView<Lower>()), MatrixType(m1.template triangularView<Lower>()));
37*bf2c3715SXin Li   VERIFY_IS_APPROX(m3, m3.adjoint());
38*bf2c3715SXin Li 
39*bf2c3715SXin Li   m3 = m1.template selfadjointView<Upper>();
40*bf2c3715SXin Li   m4 = m2;
41*bf2c3715SXin Li   m4 += m1.template selfadjointView<Upper>();
42*bf2c3715SXin Li   VERIFY_IS_APPROX(m4, m2+m3);
43*bf2c3715SXin Li 
44*bf2c3715SXin Li   m3 = m1.template selfadjointView<Lower>();
45*bf2c3715SXin Li   m4 = m2;
46*bf2c3715SXin Li   m4 -= m1.template selfadjointView<Lower>();
47*bf2c3715SXin Li   VERIFY_IS_APPROX(m4, m2-m3);
48*bf2c3715SXin Li 
49*bf2c3715SXin Li   VERIFY_RAISES_STATIC_ASSERT(m2.template selfadjointView<StrictlyUpper>());
50*bf2c3715SXin Li   VERIFY_RAISES_STATIC_ASSERT(m2.template selfadjointView<UnitLower>());
51*bf2c3715SXin Li }
52*bf2c3715SXin Li 
bug_159()53*bf2c3715SXin Li void bug_159()
54*bf2c3715SXin Li {
55*bf2c3715SXin Li   Matrix3d m = Matrix3d::Random().selfadjointView<Lower>();
56*bf2c3715SXin Li   EIGEN_UNUSED_VARIABLE(m)
57*bf2c3715SXin Li }
58*bf2c3715SXin Li 
EIGEN_DECLARE_TEST(selfadjoint)59*bf2c3715SXin Li EIGEN_DECLARE_TEST(selfadjoint)
60*bf2c3715SXin Li {
61*bf2c3715SXin Li   for(int i = 0; i < g_repeat ; i++)
62*bf2c3715SXin Li   {
63*bf2c3715SXin Li     int s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE);
64*bf2c3715SXin Li 
65*bf2c3715SXin Li     CALL_SUBTEST_1( selfadjoint(Matrix<float, 1, 1>()) );
66*bf2c3715SXin Li     CALL_SUBTEST_2( selfadjoint(Matrix<float, 2, 2>()) );
67*bf2c3715SXin Li     CALL_SUBTEST_3( selfadjoint(Matrix3cf()) );
68*bf2c3715SXin Li     CALL_SUBTEST_4( selfadjoint(MatrixXcd(s,s)) );
69*bf2c3715SXin Li     CALL_SUBTEST_5( selfadjoint(Matrix<float,Dynamic,Dynamic,RowMajor>(s, s)) );
70*bf2c3715SXin Li 
71*bf2c3715SXin Li     TEST_SET_BUT_UNUSED_VARIABLE(s)
72*bf2c3715SXin Li   }
73*bf2c3715SXin Li 
74*bf2c3715SXin Li   CALL_SUBTEST_1( bug_159() );
75*bf2c3715SXin Li }
76