17faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// This file is part of Eigen, a lightweight C++ template library 27faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// for linear algebra. 37faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// 47faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Copyright (C) 2012 Alexey Korepanov <kaikaikai@yandex.ru> 57faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// 67faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// This Source Code Form is subject to the terms of the Mozilla 77faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Public License v. 2.0. If a copy of the MPL was not distributed 87faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 97faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include "main.h" 117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include <limits> 127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include <Eigen/Eigenvalues> 137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename MatrixType> void real_qz(const MatrixType& m) 157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{ 167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /* this test covers the following files: 177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez RealQZ.h 187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez */ 197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez using std::abs; 207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef typename MatrixType::Index Index; 217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef typename MatrixType::Scalar Scalar; 227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index dim = m.cols(); 247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez MatrixType A = MatrixType::Random(dim,dim), 267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez B = MatrixType::Random(dim,dim); 277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez RealQZ<MatrixType> qz(A,B); 297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_EQUAL(qz.info(), Success); 317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // check for zeros 327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez bool all_zeros = true; 337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for (Index i=0; i<A.cols(); i++) 347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for (Index j=0; j<i; j++) { 357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if (abs(qz.matrixT()(i,j))!=Scalar(0.0)) 367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez all_zeros = false; 377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if (j<i-1 && abs(qz.matrixS()(i,j))!=Scalar(0.0)) 387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez all_zeros = false; 397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if (j==i-1 && j>0 && abs(qz.matrixS()(i,j))!=Scalar(0.0) && abs(qz.matrixS()(i-1,j-1))!=Scalar(0.0)) 407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez all_zeros = false; 417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_EQUAL(all_zeros, true); 437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(qz.matrixQ()*qz.matrixS()*qz.matrixZ(), A); 447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(qz.matrixQ()*qz.matrixT()*qz.matrixZ(), B); 457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(qz.matrixQ()*qz.matrixQ().adjoint(), MatrixType::Identity(dim,dim)); 467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(qz.matrixZ()*qz.matrixZ().adjoint(), MatrixType::Identity(dim,dim)); 477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez} 487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezvoid test_real_qz() 507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{ 517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int s = 0; 527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(int i = 0; i < g_repeat; i++) { 537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_1( real_qz(Matrix4f()) ); 547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4); 557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_2( real_qz(MatrixXd(s,s)) ); 567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // some trivial but implementation-wise tricky cases 587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_2( real_qz(MatrixXd(1,1)) ); 597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_2( real_qz(MatrixXd(2,2)) ); 607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_3( real_qz(Matrix<double,1,1>()) ); 617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_4( real_qz(Matrix2d()) ); 627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez TEST_SET_BUT_UNUSED_VARIABLE(s) 657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez} 66