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

Functions

template<typename MatrixType >
void syrk (const MatrixType &m)
 
 EIGEN_DECLARE_TEST (product_syrk)
 

Function Documentation

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( product_syrk  )
150  {
151  for (int i = 0; i < g_repeat; i++) {
152  int s;
153  s = internal::random<int>(1, EIGEN_TEST_MAX_SIZE);
154  CALL_SUBTEST_1(syrk(MatrixXf(s, s)));
155  CALL_SUBTEST_2(syrk(MatrixXd(s, s)));
157 
158  s = internal::random<int>(1, EIGEN_TEST_MAX_SIZE / 2);
159  CALL_SUBTEST_3(syrk(MatrixXcf(s, s)));
160  CALL_SUBTEST_4(syrk(MatrixXcd(s, s)));
163  }
164 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define EIGEN_TEST_MAX_SIZE
Definition: boostmultiprec.cpp:16
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
RealScalar s
Definition: level1_cplx_impl.h:130
#define TEST_SET_BUT_UNUSED_VARIABLE(X)
Definition: main.h:139
static int g_repeat
Definition: main.h:191
void syrk(const MatrixType &m)
Definition: product_syrk.cpp:13
#define CALL_SUBTEST_3(FUNC)
Definition: split_test_helper.h:16
#define CALL_SUBTEST_1(FUNC)
Definition: split_test_helper.h:4
#define CALL_SUBTEST_5(FUNC)
Definition: split_test_helper.h:28
#define CALL_SUBTEST_2(FUNC)
Definition: split_test_helper.h:10
#define CALL_SUBTEST_4(FUNC)
Definition: split_test_helper.h:22

References CALL_SUBTEST_1, CALL_SUBTEST_2, CALL_SUBTEST_3, CALL_SUBTEST_4, CALL_SUBTEST_5, EIGEN_TEST_MAX_SIZE, Eigen::g_repeat, i, s, syrk(), and TEST_SET_BUT_UNUSED_VARIABLE.

◆ syrk()

template<typename MatrixType >
void syrk ( const MatrixType m)
13  {
14  typedef typename MatrixType::Scalar Scalar;
19 
20  Index rows = m.rows();
21  Index cols = m.cols();
22 
23  MatrixType m1 = MatrixType::Random(rows, cols), m2 = MatrixType::Random(rows, cols),
24  m3 = MatrixType::Random(rows, cols);
25  RMatrixType rm2 = MatrixType::Random(rows, cols);
26 
27  Rhs1 rhs1 = Rhs1::Random(internal::random<int>(1, 320), cols);
28  Rhs1 rhs11 = Rhs1::Random(rhs1.rows(), cols);
29  Rhs2 rhs2 = Rhs2::Random(rows, internal::random<int>(1, 320));
30  Rhs2 rhs22 = Rhs2::Random(rows, rhs2.cols());
31  Rhs3 rhs3 = Rhs3::Random(internal::random<int>(1, 320), rows);
32 
33  Scalar s1 = internal::random<Scalar>();
34 
35  Index c = internal::random<Index>(0, cols - 1);
36 
37  m2.setZero();
38  VERIFY_IS_APPROX((m2.template selfadjointView<Lower>().rankUpdate(rhs2, s1)._expression()),
39  ((s1 * rhs2 * rhs2.adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));
40  m2.setZero();
41  VERIFY_IS_APPROX(((m2.template triangularView<Lower>() += s1 * rhs2 * rhs22.adjoint()).nestedExpression()),
42  ((s1 * rhs2 * rhs22.adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));
43 
44  m2.setZero();
45  VERIFY_IS_APPROX(m2.template selfadjointView<Upper>().rankUpdate(rhs2, s1)._expression(),
46  (s1 * rhs2 * rhs2.adjoint()).eval().template triangularView<Upper>().toDenseMatrix());
47  m2.setZero();
48  VERIFY_IS_APPROX((m2.template triangularView<Upper>() += s1 * rhs22 * rhs2.adjoint()).nestedExpression(),
49  (s1 * rhs22 * rhs2.adjoint()).eval().template triangularView<Upper>().toDenseMatrix());
50 
51  m2.setZero();
52  VERIFY_IS_APPROX(m2.template selfadjointView<Lower>().rankUpdate(rhs1.adjoint(), s1)._expression(),
53  (s1 * rhs1.adjoint() * rhs1).eval().template triangularView<Lower>().toDenseMatrix());
54  m2.setZero();
55  VERIFY_IS_APPROX((m2.template triangularView<Lower>() += s1 * rhs11.adjoint() * rhs1).nestedExpression(),
56  (s1 * rhs11.adjoint() * rhs1).eval().template triangularView<Lower>().toDenseMatrix());
57 
58  m2.setZero();
59  VERIFY_IS_APPROX(m2.template selfadjointView<Upper>().rankUpdate(rhs1.adjoint(), s1)._expression(),
60  (s1 * rhs1.adjoint() * rhs1).eval().template triangularView<Upper>().toDenseMatrix());
61  VERIFY_IS_APPROX((m2.template triangularView<Upper>() = s1 * rhs1.adjoint() * rhs11).nestedExpression(),
62  (s1 * rhs1.adjoint() * rhs11).eval().template triangularView<Upper>().toDenseMatrix());
63 
64  m2.setZero();
65  VERIFY_IS_APPROX(m2.template selfadjointView<Lower>().rankUpdate(rhs3.adjoint(), s1)._expression(),
66  (s1 * rhs3.adjoint() * rhs3).eval().template triangularView<Lower>().toDenseMatrix());
67 
68  m2.setZero();
69  VERIFY_IS_APPROX(m2.template selfadjointView<Upper>().rankUpdate(rhs3.adjoint(), s1)._expression(),
70  (s1 * rhs3.adjoint() * rhs3).eval().template triangularView<Upper>().toDenseMatrix());
71 
72  m2.setZero();
73  VERIFY_IS_APPROX((m2.template selfadjointView<Lower>().rankUpdate(m1.col(c), s1)._expression()),
74  ((s1 * m1.col(c) * m1.col(c).adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));
75 
76  m2.setZero();
77  VERIFY_IS_APPROX((m2.template selfadjointView<Upper>().rankUpdate(m1.col(c), s1)._expression()),
78  ((s1 * m1.col(c) * m1.col(c).adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));
79  rm2.setZero();
80  VERIFY_IS_APPROX((rm2.template selfadjointView<Upper>().rankUpdate(m1.col(c), s1)._expression()),
81  ((s1 * m1.col(c) * m1.col(c).adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));
82  m2.setZero();
83  VERIFY_IS_APPROX((m2.template triangularView<Upper>() += s1 * m3.col(c) * m1.col(c).adjoint()).nestedExpression(),
84  ((s1 * m3.col(c) * m1.col(c).adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));
85  rm2.setZero();
86  VERIFY_IS_APPROX((rm2.template triangularView<Upper>() += s1 * m1.col(c) * m3.col(c).adjoint()).nestedExpression(),
87  ((s1 * m1.col(c) * m3.col(c).adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));
88 
89  m2.setZero();
90  VERIFY_IS_APPROX((m2.template selfadjointView<Lower>().rankUpdate(m1.col(c).conjugate(), s1)._expression()),
91  ((s1 * m1.col(c).conjugate() * m1.col(c).conjugate().adjoint())
92  .eval()
93  .template triangularView<Lower>()
94  .toDenseMatrix()));
95 
96  m2.setZero();
97  VERIFY_IS_APPROX((m2.template selfadjointView<Upper>().rankUpdate(m1.col(c).conjugate(), s1)._expression()),
98  ((s1 * m1.col(c).conjugate() * m1.col(c).conjugate().adjoint())
99  .eval()
100  .template triangularView<Upper>()
101  .toDenseMatrix()));
102 
103  m2.setZero();
104  VERIFY_IS_APPROX((m2.template selfadjointView<Lower>().rankUpdate(m1.row(c), s1)._expression()),
105  ((s1 * m1.row(c).transpose() * m1.row(c).transpose().adjoint())
106  .eval()
107  .template triangularView<Lower>()
108  .toDenseMatrix()));
109  rm2.setZero();
110  VERIFY_IS_APPROX((rm2.template selfadjointView<Lower>().rankUpdate(m1.row(c), s1)._expression()),
111  ((s1 * m1.row(c).transpose() * m1.row(c).transpose().adjoint())
112  .eval()
113  .template triangularView<Lower>()
114  .toDenseMatrix()));
115  m2.setZero();
116  VERIFY_IS_APPROX((m2.template triangularView<Lower>() += s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint())
117  .nestedExpression(),
118  ((s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint())
119  .eval()
120  .template triangularView<Lower>()
121  .toDenseMatrix()));
122  rm2.setZero();
124  (rm2.template triangularView<Lower>() += s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint())
125  .nestedExpression(),
126  ((s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint())
127  .eval()
128  .template triangularView<Lower>()
129  .toDenseMatrix()));
130 
131  m2.setZero();
132  VERIFY_IS_APPROX((m2.template selfadjointView<Upper>().rankUpdate(m1.row(c).adjoint(), s1)._expression()),
133  ((s1 * m1.row(c).adjoint() * m1.row(c).adjoint().adjoint())
134  .eval()
135  .template triangularView<Upper>()
136  .toDenseMatrix()));
137 
138  // destination with a non-default inner-stride
139  // see bug 1741
140  {
141  typedef Matrix<Scalar, Dynamic, Dynamic> MatrixX;
142  MatrixX buffer(2 * rows, 2 * cols);
143  Map<MatrixType, 0, Stride<Dynamic, 2> > map1(buffer.data(), rows, cols, Stride<Dynamic, 2>(2 * rows, 2));
144  buffer.setZero();
145  VERIFY_IS_APPROX((map1.template selfadjointView<Lower>().rankUpdate(rhs2, s1)._expression()),
146  ((s1 * rhs2 * rhs2.adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));
147  }
148 }
Matrix3d m1
Definition: IOFormat.cpp:2
MatrixType m2(n_dims)
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
SCALAR Scalar
Definition: bench_gemm.cpp:45
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:96
Holds strides information for Map.
Definition: Stride.h:55
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
int * m
Definition: level2_cplx_impl.h:294
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
int c
Definition: calibrate.py:100

References calibrate::c, cols, m, m1, m2(), rows, and VERIFY_IS_APPROX.

Referenced by EIGEN_DECLARE_TEST().