product_trmm.cpp File Reference
#include "main.h"

Macros

#define CALL_ALL_ORDERS(NB, SCALAR, MODE)
 
#define CALL_ALL(NB, SCALAR)
 

Functions

template<typename T >
int get_random_size ()
 
template<typename Scalar , int Mode, int TriOrder, int OtherOrder, int ResOrder, int OtherCols>
void trmm (int rows=get_random_size< Scalar >(), int cols=get_random_size< Scalar >(), int otherCols=OtherCols==Dynamic ? get_random_size< Scalar >() :OtherCols)
 
template<typename Scalar , int Mode, int TriOrder>
void trmv (int rows=get_random_size< Scalar >(), int cols=get_random_size< Scalar >())
 
template<typename Scalar , int Mode, int TriOrder, int OtherOrder, int ResOrder>
void trmm (int rows=get_random_size< Scalar >(), int cols=get_random_size< Scalar >(), int otherCols=get_random_size< Scalar >())
 
 EIGEN_DECLARE_TEST (product_trmm)
 

Macro Definition Documentation

◆ CALL_ALL

#define CALL_ALL (   NB,
  SCALAR 
)
Value:
CALL_ALL_ORDERS(EIGEN_CAT(2, NB), SCALAR, UnitUpper) \
CALL_ALL_ORDERS(EIGEN_CAT(3, NB), SCALAR, StrictlyUpper) \
CALL_ALL_ORDERS(EIGEN_CAT(1, NB), SCALAR, Lower) \
CALL_ALL_ORDERS(EIGEN_CAT(2, NB), SCALAR, UnitLower) \
CALL_ALL_ORDERS(EIGEN_CAT(3, NB), SCALAR, StrictlyLower)
#define EIGEN_CAT(a, b)
Definition: Macros.h:819
#define SCALAR
Definition: bench_gemm.cpp:22
@ StrictlyLower
Definition: Constants.h:223
@ StrictlyUpper
Definition: Constants.h:225
@ UnitLower
Definition: Constants.h:219
@ UnitUpper
Definition: Constants.h:221
@ Lower
Definition: Constants.h:211
@ Upper
Definition: Constants.h:213
#define CALL_ALL_ORDERS(NB, SCALAR, MODE)
Definition: product_trmm.cpp:116

◆ CALL_ALL_ORDERS

#define CALL_ALL_ORDERS (   NB,
  SCALAR,
  MODE 
)
Value:
EIGEN_CAT(CALL_SUBTEST_, NB)((trmm<SCALAR, MODE, ColMajor, ColMajor, ColMajor>())); \
EIGEN_CAT(CALL_SUBTEST_, NB)((trmm<SCALAR, MODE, ColMajor, ColMajor, RowMajor>())); \
EIGEN_CAT(CALL_SUBTEST_, NB)((trmm<SCALAR, MODE, ColMajor, RowMajor, ColMajor>())); \
EIGEN_CAT(CALL_SUBTEST_, NB)((trmm<SCALAR, MODE, ColMajor, RowMajor, RowMajor>())); \
EIGEN_CAT(CALL_SUBTEST_, NB)((trmm<SCALAR, MODE, RowMajor, ColMajor, ColMajor>())); \
EIGEN_CAT(CALL_SUBTEST_, NB)((trmm<SCALAR, MODE, RowMajor, ColMajor, RowMajor>())); \
EIGEN_CAT(CALL_SUBTEST_, NB)((trmm<SCALAR, MODE, RowMajor, RowMajor, ColMajor>())); \
EIGEN_CAT(CALL_SUBTEST_, NB)((trmm<SCALAR, MODE, RowMajor, RowMajor, RowMajor>())); \
EIGEN_CAT(CALL_SUBTEST_1, NB)((trmv<SCALAR, MODE, ColMajor>())); \
EIGEN_CAT(CALL_SUBTEST_1, NB)((trmv<SCALAR, MODE, RowMajor>()));
#define CALL_SUBTEST_1(FUNC)
Definition: split_test_helper.h:4

Function Documentation

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( product_trmm  )
137  {
138  for (int i = 0; i < g_repeat; i++) {
139  CALL_ALL(1, float); // EIGEN_SUFFIXES;11;111;21;121;31;131
140  CALL_ALL(2, double); // EIGEN_SUFFIXES;12;112;22;122;32;132
141  CALL_ALL(3, std::complex<float>); // EIGEN_SUFFIXES;13;113;23;123;33;133
142  CALL_ALL(4, std::complex<double>); // EIGEN_SUFFIXES;14;114;24;124;34;134
143  }
144 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
static int g_repeat
Definition: main.h:191
#define CALL_ALL(NB, SCALAR)
Definition: product_trmm.cpp:129

References CALL_ALL, Eigen::g_repeat, and i.

◆ get_random_size()

template<typename T >
int get_random_size ( )
13  {
14  const int factor = NumTraits<T>::ReadCost;
15  const int max_test_size = EIGEN_TEST_MAX_SIZE > 2 * factor ? EIGEN_TEST_MAX_SIZE / factor : EIGEN_TEST_MAX_SIZE;
16  return internal::random<int>(1, max_test_size);
17 }
#define EIGEN_TEST_MAX_SIZE
Definition: boostmultiprec.cpp:16
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217

References EIGEN_TEST_MAX_SIZE.

◆ trmm() [1/2]

template<typename Scalar , int Mode, int TriOrder, int OtherOrder, int ResOrder>
void trmm ( int  rows = get_random_size<Scalar>(),
int  cols = get_random_size<Scalar>(),
int  otherCols = get_random_size<Scalar>() 
)
112  {
113  trmm<Scalar, Mode, TriOrder, OtherOrder, ResOrder, Dynamic>(rows, cols, otherCols);
114 }
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1

References cols, and rows.

◆ trmm() [2/2]

template<typename Scalar , int Mode, int TriOrder, int OtherOrder, int ResOrder, int OtherCols>
void trmm ( int  rows = get_random_size<Scalar>(),
int  cols = get_random_size<Scalar>(),
int  otherCols = OtherCols == Dynamic ? get_random_size<Scalar>() : OtherCols 
)
21  : OtherCols) {
25 
28 
29  TriMatrix mat(rows, cols), tri(rows, cols), triTr(cols, rows), s1tri(rows, cols), s1triTr(cols, rows);
30 
31  OnTheRight ge_right(cols, otherCols);
32  OnTheLeft ge_left(otherCols, rows);
33  ResSX ge_sx, ge_sx_save;
34  ResXS ge_xs, ge_xs_save;
35 
36  Scalar s1 = internal::random<Scalar>(), s2 = internal::random<Scalar>();
37 
38  mat.setRandom();
39  tri = mat.template triangularView<Mode>();
40  triTr = mat.transpose().template triangularView<Mode>();
41  s1tri = (s1 * mat).template triangularView<Mode>();
42  s1triTr = (s1 * mat).transpose().template triangularView<Mode>();
43  ge_right.setRandom();
44  ge_left.setRandom();
45 
46  VERIFY_IS_APPROX(ge_xs = mat.template triangularView<Mode>() * ge_right, tri * ge_right);
47  VERIFY_IS_APPROX(ge_sx = ge_left * mat.template triangularView<Mode>(), ge_left * tri);
48 
49  VERIFY_IS_APPROX(ge_xs.noalias() = mat.template triangularView<Mode>() * ge_right, tri * ge_right);
50  VERIFY_IS_APPROX(ge_sx.noalias() = ge_left * mat.template triangularView<Mode>(), ge_left * tri);
51 
52  if ((Mode & UnitDiag) == 0)
54  ge_xs.noalias() = (s1 * mat.adjoint()).template triangularView<Mode>() * (s2 * ge_left.transpose()),
55  s1 * triTr.conjugate() * (s2 * ge_left.transpose()));
56 
58  ge_xs.noalias() = (s1 * mat.transpose()).template triangularView<Mode>() * (s2 * ge_left.transpose()),
59  s1triTr * (s2 * ge_left.transpose()));
60  VERIFY_IS_APPROX(ge_sx.noalias() = (s2 * ge_left) * (s1 * mat).template triangularView<Mode>(),
61  (s2 * ge_left) * s1tri);
62 
63  VERIFY_IS_APPROX(ge_sx.noalias() = ge_right.transpose() * mat.adjoint().template triangularView<Mode>(),
64  ge_right.transpose() * triTr.conjugate());
65  VERIFY_IS_APPROX(ge_sx.noalias() = ge_right.adjoint() * mat.adjoint().template triangularView<Mode>(),
66  ge_right.adjoint() * triTr.conjugate());
67 
68  ge_xs_save = ge_xs;
69  if ((Mode & UnitDiag) == 0)
71  (ge_xs_save + s1 * triTr.conjugate() * (s2 * ge_left.adjoint())).eval(),
72  ge_xs.noalias() += (s1 * mat.adjoint()).template triangularView<Mode>() * (s2 * ge_left.adjoint()));
73  ge_xs_save = ge_xs;
75  (ge_xs_save + s1triTr * (s2 * ge_left.adjoint())).eval(),
76  ge_xs.noalias() += (s1 * mat.transpose()).template triangularView<Mode>() * (s2 * ge_left.adjoint()));
77  ge_sx.setRandom();
78  ge_sx_save = ge_sx;
79  if ((Mode & UnitDiag) == 0)
81  ge_sx_save - (ge_right.adjoint() * (-s1 * triTr).conjugate()).eval(),
82  ge_sx.noalias() -= (ge_right.adjoint() * (-s1 * mat).adjoint().template triangularView<Mode>()).eval());
83 
84  if ((Mode & UnitDiag) == 0)
85  VERIFY_IS_APPROX(ge_xs = (s1 * mat).adjoint().template triangularView<Mode>() * ge_left.adjoint(),
86  numext::conj(s1) * triTr.conjugate() * ge_left.adjoint());
87  VERIFY_IS_APPROX(ge_xs = (s1 * mat).transpose().template triangularView<Mode>() * ge_left.adjoint(),
88  s1triTr * ge_left.adjoint());
89 
90  // TODO check with sub-matrix expressions ?
91 
92  // destination with a non-default inner-stride
93  // see bug 1741
94  {
95  VERIFY_IS_APPROX(ge_xs.noalias() = mat.template triangularView<Mode>() * ge_right, tri * ge_right);
96  typedef Matrix<Scalar, Dynamic, Dynamic> MatrixX;
97  MatrixX buffer(2 * ge_xs.rows(), 2 * ge_xs.cols());
98  Map<ResXS, 0, Stride<Dynamic, 2> > map1(buffer.data(), ge_xs.rows(), ge_xs.cols(),
99  Stride<Dynamic, 2>(2 * ge_xs.outerStride(), 2));
100  buffer.setZero();
101  VERIFY_IS_APPROX(map1.noalias() = mat.template triangularView<Mode>() * ge_right, tri * ge_right);
102  }
103 }
AnnoyingScalar conj(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:133
Eigen::SparseMatrix< double > mat
Definition: EigenUnitTest.cpp:10
Tridiagonalization< MatrixXf > tri
Definition: Tridiagonalization_compute.cpp:1
void adjoint(const MatrixType &m)
Definition: adjoint.cpp:85
SCALAR Scalar
Definition: bench_gemm.cpp:45
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:96
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
TransposeReturnType transpose()
Definition: SparseMatrixBase.h:358
const AdjointReturnType adjoint() const
Definition: SparseMatrixBase.h:360
Holds strides information for Map.
Definition: Stride.h:55
@ UnitDiag
Definition: Constants.h:215
@ OnTheLeft
Definition: Constants.h:331
@ OnTheRight
Definition: Constants.h:333
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
void transpose()
Definition: skew_symmetric_matrix3.cpp:135

References Eigen::SparseMatrixBase< Derived >::adjoint(), adjoint(), cols, conj(), Eigen::OnTheLeft, Eigen::OnTheRight, rows, Eigen::SparseMatrixBase< Derived >::transpose(), anonymous_namespace{skew_symmetric_matrix3.cpp}::transpose(), tri, Eigen::UnitDiag, and VERIFY_IS_APPROX.

◆ trmv()

template<typename Scalar , int Mode, int TriOrder>
void trmv ( int  rows = get_random_size<Scalar>(),
int  cols = get_random_size<Scalar>() 
)
106  {
107  trmm<Scalar, Mode, TriOrder, ColMajor, ColMajor, 1>(rows, cols, 1);
108 }

References cols, and rows.