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