1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "main.h"
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> void syrk(const MatrixType& m)
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Index Index;
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Scalar Scalar;
167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime, RowMajor> RMatrixType;
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, Dynamic> Rhs1;
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<Scalar, Dynamic, MatrixType::RowsAtCompileTime> Rhs2;
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, Dynamic,RowMajor> Rhs3;
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rows = m.rows();
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index cols = m.cols();
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType m1 = MatrixType::Random(rows, cols),
257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez             m2 = MatrixType::Random(rows, cols),
267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez             m3 = MatrixType::Random(rows, cols);
277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  RMatrixType rm2 = MatrixType::Random(rows, cols);
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  Rhs1 rhs1 = Rhs1::Random(internal::random<int>(1,320), cols); Rhs1 rhs11 = Rhs1::Random(rhs1.rows(), cols);
307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  Rhs2 rhs2 = Rhs2::Random(rows, internal::random<int>(1,320)); Rhs2 rhs22 = Rhs2::Random(rows, rhs2.cols());
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Rhs3 rhs3 = Rhs3::Random(internal::random<int>(1,320), rows);
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar s1 = internal::random<Scalar>();
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index c = internal::random<Index>(0,cols-1);
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.setZero();
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX((m2.template selfadjointView<Lower>().rankUpdate(rhs2,s1)._expression()),
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   ((s1 * rhs2 * rhs2.adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));
407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  m2.setZero();
417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX(((m2.template triangularView<Lower>() += s1 * rhs2  * rhs22.adjoint()).nestedExpression()),
427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                   ((s1 * rhs2 * rhs22.adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.setZero();
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.template selfadjointView<Upper>().rankUpdate(rhs2,s1)._expression(),
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   (s1 * rhs2 * rhs2.adjoint()).eval().template triangularView<Upper>().toDenseMatrix());
487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  m2.setZero();
497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX((m2.template triangularView<Upper>() += s1 * rhs22 * rhs2.adjoint()).nestedExpression(),
507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                   (s1 * rhs22 * rhs2.adjoint()).eval().template triangularView<Upper>().toDenseMatrix());
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.setZero();
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.template selfadjointView<Lower>().rankUpdate(rhs1.adjoint(),s1)._expression(),
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   (s1 * rhs1.adjoint() * rhs1).eval().template triangularView<Lower>().toDenseMatrix());
567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  m2.setZero();
577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX((m2.template triangularView<Lower>() += s1 * rhs11.adjoint() * rhs1).nestedExpression(),
587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                   (s1 * rhs11.adjoint() * rhs1).eval().template triangularView<Lower>().toDenseMatrix());
597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.setZero();
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.template selfadjointView<Upper>().rankUpdate(rhs1.adjoint(),s1)._expression(),
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   (s1 * rhs1.adjoint() * rhs1).eval().template triangularView<Upper>().toDenseMatrix());
647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX((m2.template triangularView<Upper>() = s1 * rhs1.adjoint() * rhs11).nestedExpression(),
657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                   (s1 * rhs1.adjoint() * rhs11).eval().template triangularView<Upper>().toDenseMatrix());
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.setZero();
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.template selfadjointView<Lower>().rankUpdate(rhs3.adjoint(),s1)._expression(),
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   (s1 * rhs3.adjoint() * rhs3).eval().template triangularView<Lower>().toDenseMatrix());
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.setZero();
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.template selfadjointView<Upper>().rankUpdate(rhs3.adjoint(),s1)._expression(),
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   (s1 * rhs3.adjoint() * rhs3).eval().template triangularView<Upper>().toDenseMatrix());
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.setZero();
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX((m2.template selfadjointView<Lower>().rankUpdate(m1.col(c),s1)._expression()),
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   ((s1 * m1.col(c) * m1.col(c).adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.setZero();
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX((m2.template selfadjointView<Upper>().rankUpdate(m1.col(c),s1)._expression()),
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   ((s1 * m1.col(c) * m1.col(c).adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));
837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  rm2.setZero();
847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX((rm2.template selfadjointView<Upper>().rankUpdate(m1.col(c),s1)._expression()),
857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                   ((s1 * m1.col(c) * m1.col(c).adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));
867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  m2.setZero();
877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX((m2.template triangularView<Upper>() += s1 * m3.col(c) * m1.col(c).adjoint()).nestedExpression(),
887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                   ((s1 * m3.col(c) * m1.col(c).adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));
897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  rm2.setZero();
907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX((rm2.template triangularView<Upper>() += s1 * m1.col(c) * m3.col(c).adjoint()).nestedExpression(),
917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                   ((s1 * m1.col(c) * m3.col(c).adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.setZero();
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX((m2.template selfadjointView<Lower>().rankUpdate(m1.col(c).conjugate(),s1)._expression()),
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   ((s1 * m1.col(c).conjugate() * m1.col(c).conjugate().adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.setZero();
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX((m2.template selfadjointView<Upper>().rankUpdate(m1.col(c).conjugate(),s1)._expression()),
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   ((s1 * m1.col(c).conjugate() * m1.col(c).conjugate().adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.setZero();
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX((m2.template selfadjointView<Lower>().rankUpdate(m1.row(c),s1)._expression()),
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   ((s1 * m1.row(c).transpose() * m1.row(c).transpose().adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));
1057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  rm2.setZero();
1067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX((rm2.template selfadjointView<Lower>().rankUpdate(m1.row(c),s1)._expression()),
1077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                   ((s1 * m1.row(c).transpose() * m1.row(c).transpose().adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));
1087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  m2.setZero();
1097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX((m2.template triangularView<Lower>() += s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint()).nestedExpression(),
1107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                   ((s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));
1117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  rm2.setZero();
1127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX((rm2.template triangularView<Lower>() += s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint()).nestedExpression(),
1137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                   ((s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));
1147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.setZero();
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX((m2.template selfadjointView<Upper>().rankUpdate(m1.row(c).adjoint(),s1)._expression()),
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   ((s1 * m1.row(c).adjoint() * m1.row(c).adjoint().adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_product_syrk()
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 0; i < g_repeat ; i++)
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    int s;
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE);
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_1( syrk(MatrixXf(s, s)) );
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_2( syrk(MatrixXd(s, s)) );
1292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TEST_SET_BUT_UNUSED_VARIABLE(s)
1302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2);
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_3( syrk(MatrixXcf(s, s)) );
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_4( syrk(MatrixXcd(s, s)) );
1342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TEST_SET_BUT_UNUSED_VARIABLE(s)
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
137