15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is part of Eigen, a lightweight C++ template library 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for linear algebra. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr> 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This Source Code Form is subject to the terms of the Mozilla 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Public License v. 2.0. If a copy of the MPL was not distributed 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "main.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <Eigen/Eigenvalues> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Scalar,int Size> void hessenberg(int size = Size) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Matrix<Scalar,Size,Size> MatrixType; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test basic functionality: A = U H U* and H is Hessenberg 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(int counter = 0; counter < g_repeat; ++counter) { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatrixType m = MatrixType::Random(size,size); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HessenbergDecomposition<MatrixType> hess(m); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatrixType Q = hess.matrixQ(); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatrixType H = hess.matrixH(); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VERIFY_IS_APPROX(m, Q * H * Q.adjoint()); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(int row = 2; row < size; ++row) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(int col = 0; col < row-1; ++col) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VERIFY(H(row,col) == (typename MatrixType::Scalar)0); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test whether compute() and constructor returns same result 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatrixType A = MatrixType::Random(size, size); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HessenbergDecomposition<MatrixType> cs1; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cs1.compute(A); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HessenbergDecomposition<MatrixType> cs2(A); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VERIFY_IS_EQUAL(cs1.matrixH().eval(), cs2.matrixH().eval()); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatrixType cs1Q = cs1.matrixQ(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatrixType cs2Q = cs2.matrixQ(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VERIFY_IS_EQUAL(cs1Q, cs2Q); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test assertions for when used uninitialized 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HessenbergDecomposition<MatrixType> hessUninitialized; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VERIFY_RAISES_ASSERT( hessUninitialized.matrixH() ); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VERIFY_RAISES_ASSERT( hessUninitialized.matrixQ() ); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VERIFY_RAISES_ASSERT( hessUninitialized.householderCoefficients() ); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VERIFY_RAISES_ASSERT( hessUninitialized.packedMatrix() ); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: Add tests for packedMatrix() and householderCoefficients() 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void test_hessenberg() 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CALL_SUBTEST_1(( hessenberg<std::complex<double>,1>() )); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CALL_SUBTEST_2(( hessenberg<std::complex<double>,2>() )); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CALL_SUBTEST_3(( hessenberg<std::complex<float>,4>() )); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CALL_SUBTEST_4(( hessenberg<float,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE)) )); 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CALL_SUBTEST_5(( hessenberg<std::complex<double>,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE)) )); 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test problem size constructors 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CALL_SUBTEST_6(HessenbergDecomposition<MatrixXf>(10)); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63