eigensolver_generalized_real.cpp File Reference
#include "main.h"
#include <limits>
#include <Eigen/Eigenvalues>
#include <Eigen/LU>

Macros

#define EIGEN_RUNTIME_NO_MALLOC
 

Functions

template<typename MatrixType >
void generalized_eigensolver_real (const MatrixType &m)
 
template<typename MatrixType >
void generalized_eigensolver_assert ()
 
 EIGEN_DECLARE_TEST (eigensolver_generalized_real)
 

Macro Definition Documentation

◆ EIGEN_RUNTIME_NO_MALLOC

#define EIGEN_RUNTIME_NO_MALLOC

Function Documentation

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( eigensolver_generalized_real  )
124  {
125  for (int i = 0; i < g_repeat; i++) {
126  int s = 0;
128  s = internal::random<int>(1, EIGEN_TEST_MAX_SIZE / 4);
130 
131  // some trivial but implementation-wise special cases
136  CALL_SUBTEST_5(generalized_eigensolver_assert<MatrixXd>());
138  }
139 }
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
void generalized_eigensolver_real(const MatrixType &m)
Definition: eigensolver_generalized_real.cpp:17
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
#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, generalized_eigensolver_real(), i, s, and TEST_SET_BUT_UNUSED_VARIABLE.

◆ generalized_eigensolver_assert()

template<typename MatrixType >
void generalized_eigensolver_assert ( )
89  {
91  // all raise assert if uninitialized
97 
98  // none raise assert after compute called
99  eig.compute(MatrixType::Random(20, 20), MatrixType::Random(20, 20));
100  VERIFY(eig.info() == Success);
101  eig.eigenvectors();
102  eig.eigenvalues();
103  eig.alphas();
104  eig.betas();
105 
106  // eigenvectors() raises assert, if eigenvectors were not requested
107  eig.compute(MatrixType::Random(20, 20), MatrixType::Random(20, 20), false);
108  VERIFY(eig.info() == Success);
110  eig.eigenvalues();
111  eig.alphas();
112  eig.betas();
113 
114  // all except info raise assert if realQZ did not converge
115  eig.setMaxIterations(0); // force real QZ to fail.
116  eig.compute(MatrixType::Random(20, 20), MatrixType::Random(20, 20));
117  VERIFY(eig.info() == NoConvergence);
122 }
Computes the generalized eigenvalues and eigenvectors of a pair of general matrices.
Definition: GeneralizedEigenSolver.h:62
EigenvectorsType eigenvectors() const
Returns the computed generalized eigenvectors.
Definition: GeneralizedEigenSolver.h:176
ComputationInfo info() const
Definition: GeneralizedEigenSolver.h:250
GeneralizedEigenSolver & compute(const MatrixType &A, const MatrixType &B, bool computeEigenvectors=true)
Computes generalized eigendecomposition of given matrix.
Definition: GeneralizedEigenSolver.h:276
GeneralizedEigenSolver & setMaxIterations(Index maxIters)
Definition: GeneralizedEigenSolver.h:257
const VectorType & betas() const
Definition: GeneralizedEigenSolver.h:220
const ComplexVectorType & alphas() const
Definition: GeneralizedEigenSolver.h:210
EigenvalueType eigenvalues() const
Returns an expression of the computed generalized eigenvalues.
Definition: GeneralizedEigenSolver.h:200
@ Success
Definition: Constants.h:440
@ NoConvergence
Definition: Constants.h:444
#define VERIFY(a)
Definition: main.h:362
#define VERIFY_RAISES_ASSERT(a)
Definition: main.h:329

References Eigen::GeneralizedEigenSolver< MatrixType_ >::alphas(), Eigen::GeneralizedEigenSolver< MatrixType_ >::betas(), Eigen::GeneralizedEigenSolver< MatrixType_ >::compute(), Eigen::GeneralizedEigenSolver< MatrixType_ >::eigenvalues(), Eigen::GeneralizedEigenSolver< MatrixType_ >::eigenvectors(), Eigen::GeneralizedEigenSolver< MatrixType_ >::info(), Eigen::NoConvergence, Eigen::GeneralizedEigenSolver< MatrixType_ >::setMaxIterations(), Eigen::Success, VERIFY, and VERIFY_RAISES_ASSERT.

◆ generalized_eigensolver_real()

template<typename MatrixType >
void generalized_eigensolver_real ( const MatrixType m)
17  {
18  /* this test covers the following files:
19  GeneralizedEigenSolver.h
20  */
21  Index rows = m.rows();
22  Index cols = m.cols();
23 
24  typedef typename MatrixType::Scalar Scalar;
25  typedef std::complex<Scalar> ComplexScalar;
27 
28  MatrixType a = MatrixType::Random(rows, cols);
29  MatrixType b = MatrixType::Random(rows, cols);
30  MatrixType a1 = MatrixType::Random(rows, cols);
31  MatrixType b1 = MatrixType::Random(rows, cols);
32  MatrixType spdA = a.adjoint() * a + a1.adjoint() * a1;
33  MatrixType spdB = b.adjoint() * b + b1.adjoint() * b1;
34 
35  // lets compare to GeneralizedSelfAdjointEigenSolver
36  {
38  GeneralizedEigenSolver<MatrixType> eig(spdA, spdB);
39 
40  VERIFY_IS_EQUAL(eig.eigenvalues().imag().cwiseAbs().maxCoeff(), 0);
41 
42  VectorType realEigenvalues = eig.eigenvalues().real();
43  std::sort(realEigenvalues.data(), realEigenvalues.data() + realEigenvalues.size());
44  VERIFY_IS_APPROX(realEigenvalues, symmEig.eigenvalues());
45 
46  // check eigenvectors
47  typename GeneralizedEigenSolver<MatrixType>::EigenvectorsType D = eig.eigenvalues().asDiagonal();
48  typename GeneralizedEigenSolver<MatrixType>::EigenvectorsType V = eig.eigenvectors();
49  VERIFY_IS_APPROX(spdA * V, spdB * V * D);
50  }
51 
52  // non symmetric case:
53  {
55  // TODO enable full-prealocation of required memory, this probably requires an in-place mode for
56  // HessenbergDecomposition
57  // Eigen::internal::set_is_malloc_allowed(false);
58  eig.compute(a, b);
59  // Eigen::internal::set_is_malloc_allowed(true);
60  for (Index k = 0; k < cols; ++k) {
62  (eig.betas()(k) * a).template cast<ComplexScalar>() - eig.alphas()(k) * b;
63  if (tmp.size() > 1 && tmp.norm() > (std::numeric_limits<Scalar>::min)()) tmp /= tmp.norm();
64  VERIFY_IS_MUCH_SMALLER_THAN(std::abs(tmp.determinant()), Scalar(1));
65  }
66  // check eigenvectors
67  typename GeneralizedEigenSolver<MatrixType>::EigenvectorsType D = eig.eigenvalues().asDiagonal();
68  typename GeneralizedEigenSolver<MatrixType>::EigenvectorsType V = eig.eigenvectors();
69  VERIFY_IS_APPROX(a * V, b * V * D);
70  }
71 
72  // regression test for bug 1098
73  {
74  GeneralizedSelfAdjointEigenSolver<MatrixType> eig1(a.adjoint() * a, b.adjoint() * b);
75  eig1.compute(a.adjoint() * a, b.adjoint() * b);
76  GeneralizedEigenSolver<MatrixType> eig2(a.adjoint() * a, b.adjoint() * b);
77  eig2.compute(a.adjoint() * a, b.adjoint() * b);
78  }
79 
80  // check without eigenvectors
81  {
82  GeneralizedEigenSolver<MatrixType> eig1(spdA, spdB, true);
83  GeneralizedEigenSolver<MatrixType> eig2(spdA, spdB, false);
84  VERIFY_IS_APPROX(eig1.eigenvalues(), eig2.eigenvalues());
85  }
86 }
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
dominoes D
Definition: Domino.cpp:55
MatrixXcd V
Definition: EigenSolver_EigenSolver_MatrixType.cpp:15
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
Scalar * b
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
Computes eigenvalues and eigenvectors of the generalized selfadjoint eigen problem.
Definition: GeneralizedSelfAdjointEigenSolver.h:51
#define min(a, b)
Definition: datatypes.h:22
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
const Scalar * a
Definition: level2_cplx_impl.h:32
int * m
Definition: level2_cplx_impl.h:294
char char char int int * k
Definition: level2_impl.h:374
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
#define VERIFY_IS_EQUAL(a, b)
Definition: main.h:367
#define VERIFY_IS_MUCH_SMALLER_THAN(a, b)
Definition: main.h:371
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
Definition: fft_test_shared.h:66

References a, abs(), Eigen::GeneralizedEigenSolver< MatrixType_ >::alphas(), b, Eigen::GeneralizedEigenSolver< MatrixType_ >::betas(), cols, Eigen::GeneralizedEigenSolver< MatrixType_ >::compute(), Eigen::GeneralizedSelfAdjointEigenSolver< MatrixType_ >::compute(), D, Eigen::GeneralizedEigenSolver< MatrixType_ >::eigenvalues(), Eigen::SelfAdjointEigenSolver< MatrixType_ >::eigenvalues(), Eigen::GeneralizedEigenSolver< MatrixType_ >::eigenvectors(), k, m, min, rows, tmp, V, VERIFY_IS_APPROX, VERIFY_IS_EQUAL, and VERIFY_IS_MUCH_SMALLER_THAN.

Referenced by EIGEN_DECLARE_TEST().