product_trsolve.cpp
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
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 #include "main.h"
11 
12 #define VERIFY_TRSM(TRI,XB) { \
13  (XB).setRandom(); ref = (XB); \
14  (TRI).solveInPlace(XB); \
15  VERIFY_IS_APPROX((TRI).toDenseMatrix() * (XB), ref); \
16  (XB).setRandom(); ref = (XB); \
17  (XB) = (TRI).solve(XB); \
18  VERIFY_IS_APPROX((TRI).toDenseMatrix() * (XB), ref); \
19  }
20 
21 #define VERIFY_TRSM_ONTHERIGHT(TRI,XB) { \
22  (XB).setRandom(); ref = (XB); \
23  (TRI).transpose().template solveInPlace<OnTheRight>(XB.transpose()); \
24  VERIFY_IS_APPROX((XB).transpose() * (TRI).transpose().toDenseMatrix(), ref.transpose()); \
25  (XB).setRandom(); ref = (XB); \
26  (XB).transpose() = (TRI).transpose().template solve<OnTheRight>(XB.transpose()); \
27  VERIFY_IS_APPROX((XB).transpose() * (TRI).transpose().toDenseMatrix(), ref.transpose()); \
28  }
29 
30 template<typename Scalar,int Size, int Cols> void trsolve(int size=Size,int cols=Cols)
31 {
32  typedef typename NumTraits<Scalar>::Real RealScalar;
33 
36 
37  enum { colmajor = Size==1 ? RowMajor : ColMajor,
38  rowmajor = Cols==1 ? ColMajor : RowMajor };
42 
43  cmLhs.setRandom(); cmLhs *= static_cast<RealScalar>(0.1); cmLhs.diagonal().array() += static_cast<RealScalar>(1);
44  rmLhs.setRandom(); rmLhs *= static_cast<RealScalar>(0.1); rmLhs.diagonal().array() += static_cast<RealScalar>(1);
45 
46  VERIFY_TRSM(cmLhs.conjugate().template triangularView<Lower>(), cmRhs);
47  VERIFY_TRSM(cmLhs.adjoint() .template triangularView<Lower>(), cmRhs);
48  VERIFY_TRSM(cmLhs .template triangularView<Upper>(), cmRhs);
49  VERIFY_TRSM(cmLhs .template triangularView<Lower>(), rmRhs);
50  VERIFY_TRSM(cmLhs.conjugate().template triangularView<Upper>(), rmRhs);
51  VERIFY_TRSM(cmLhs.adjoint() .template triangularView<Upper>(), rmRhs);
52 
53  VERIFY_TRSM(cmLhs.conjugate().template triangularView<UnitLower>(), cmRhs);
54  VERIFY_TRSM(cmLhs .template triangularView<UnitUpper>(), rmRhs);
55 
56  VERIFY_TRSM(rmLhs .template triangularView<Lower>(), cmRhs);
57  VERIFY_TRSM(rmLhs.conjugate().template triangularView<UnitUpper>(), rmRhs);
58 
59 
60  VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView<Lower>(), cmRhs);
61  VERIFY_TRSM_ONTHERIGHT(cmLhs .template triangularView<Upper>(), cmRhs);
62  VERIFY_TRSM_ONTHERIGHT(cmLhs .template triangularView<Lower>(), rmRhs);
63  VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView<Upper>(), rmRhs);
64 
65  VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView<UnitLower>(), cmRhs);
66  VERIFY_TRSM_ONTHERIGHT(cmLhs .template triangularView<UnitUpper>(), rmRhs);
67 
68  VERIFY_TRSM_ONTHERIGHT(rmLhs .template triangularView<Lower>(), cmRhs);
69  VERIFY_TRSM_ONTHERIGHT(rmLhs.conjugate().template triangularView<UnitUpper>(), rmRhs);
70 
71  int c = internal::random<int>(0,cols-1);
72  VERIFY_TRSM(rmLhs.template triangularView<Lower>(), rmRhs.col(c));
73  VERIFY_TRSM(cmLhs.template triangularView<Lower>(), rmRhs.col(c));
74 }
75 
77 {
78  for(int i = 0; i < g_repeat ; i++)
79  {
80  // matrices
81  CALL_SUBTEST_1((trsolve<float,Dynamic,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE),internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));
82  CALL_SUBTEST_2((trsolve<double,Dynamic,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE),internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));
83  CALL_SUBTEST_3((trsolve<std::complex<float>,Dynamic,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2),internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))));
84  CALL_SUBTEST_4((trsolve<std::complex<double>,Dynamic,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2),internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))));
85 
86  // vectors
87  CALL_SUBTEST_5((trsolve<float,Dynamic,1>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));
88  CALL_SUBTEST_6((trsolve<double,Dynamic,1>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));
89  CALL_SUBTEST_7((trsolve<std::complex<float>,Dynamic,1>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));
90  CALL_SUBTEST_8((trsolve<std::complex<double>,Dynamic,1>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));
91 
92  // meta-unrollers
93  CALL_SUBTEST_9((trsolve<float,4,1>()));
94  CALL_SUBTEST_10((trsolve<double,4,1>()));
95  CALL_SUBTEST_11((trsolve<std::complex<float>,4,1>()));
96  CALL_SUBTEST_12((trsolve<float,1,1>()));
97  CALL_SUBTEST_13((trsolve<float,1,2>()));
98  CALL_SUBTEST_14((trsolve<float,3,1>()));
99 
100  }
101 }
Scalar Scalar * c
Definition: benchVecAdd.cpp:17
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
Definition: NumTraits.h:150
#define VERIFY_TRSM_ONTHERIGHT(TRI, XB)
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
static int g_repeat
Definition: main.h:144
void trsolve(int size=Size, int cols=Cols)
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:34
static const int Cols
#define EIGEN_TEST_MAX_SIZE
A triangularView< Lower >().adjoint().solveInPlace(B)
void test_product_trsolve()
const int Dynamic
Definition: Constants.h:21
#define VERIFY_TRSM(TRI, XB)
The matrix class, also used for vectors and row-vectors.
Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > & setRandom(Index size)


gtsam
Author(s):
autogenerated on Sat May 8 2021 02:43:34