1 #ifndef REDUKT_LANCZOS_H
2 #define REDUKT_LANCZOS_H
5 #include <ietl/interface/ublas.h>
6 #include <ietl/vectorspace.h>
7 #include <ietl/lanczos.h>
8 #include <ietl/iteration.h>
10 #include <boost/random.hpp>
11 #include <boost/limits.hpp>
24 #include <boost/numeric/ublas/io.hpp>
28 template<
class Matrix,
class Vector>
33 typedef boost::lagged_fibonacci607
RandGen;
38 assert( mat.size1() == mat.size2() );
47 ietl::lanczos<Matrix,Vectorspace> lanczos( mat, vec );
49 double rel_tol = 500*std::numeric_limits<double>::epsilon();
50 double abs_tol = std::pow(std::numeric_limits<double>::epsilon(),2./3);
53 ietl::lanczos_iteration_nhighest<double> iter( max_iter, k, rel_tol, abs_tol );
55 std::cout <<
"Starting Lanczos calculation of " << k <<
" highest eigenvalues with " << max_iter <<
" max.iterations" << std::endl;
58 lanczos.calculate_eigenvalues( iter, gen );
59 eigen = lanczos.eigenvalues();
60 multi = lanczos.multiplicities();
61 err = lanczos.errors();
63 catch( std::runtime_error& e )
65 std::cout << e.what() << std::endl;
68 std::cout <<
"# eigenvalue error multiplicity\n";
69 std::cout.precision(10);
70 for(
unsigned int i=0; i < eigen.size(); ++i )
71 std::cout << i <<
"\t" << eigen[i] <<
"\t" << err[i] <<
"\t"
74 throw std::runtime_error(
"Problems with ietl lanczos algorithm occured during eigenvalue computation");
77 std::cout <<
"Lanczos eigenvalue calculation finished" << std::endl;
80 std::cout <<
"Lanczos reordering eigenvalues descending " << std::flush;
81 for(
unsigned int i=0; i < eigen.size()/2; ++i )
82 std::swap( eigen[i], eigen[eigen.size()-i-1] );
83 std::cout <<
"done" << std::endl;
90 std::cout <<
"Starting Lanczos calculation of eigenvectors" << std::endl;
93 lanczos.eigenvectors( eigen.begin(), eigen.begin() + k,
94 std::back_inserter(eigenvectors),
98 catch( std::runtime_error& e )
100 std::cout << e.what() << std::endl;
101 throw std::runtime_error(
"Problems with ietl lanczos algorithm occured during eigenvector computation");
103 std::cout <<
"Lanczos eigenvector calculation finished" << std::endl;
109 std::cout <<
"# eigenvalue error multiplicity\n";
110 std::cout.precision(10);
111 for(
unsigned int i=0; i < eigen.size(); ++i )
112 std::cout << i <<
"\t" << eigen[i] <<
"\t" << err[i] <<
"\t"
116 for(
unsigned int i=0; i < eigenvectors.size(); ++i )
117 std::cout <<
"Eigenvector " << i <<
" = " << eigenvectors[i] << std::endl;
119 std::cout << std::endl;
120 std::cout <<
" Information about the eigen vectors computations:\n\n";
121 for(
int i = 0; i < info.size(); i++)
123 std::cout <<
" m1(" << i+1 <<
"): " << info.m1(i) <<
", m2(" << i+1 <<
"): "
124 << info.m2(i) <<
", ma(" << i+1 <<
"): " << info.ma(i) <<
" eigenvalue("
125 << i+1 <<
"): " << info.eigenvalue(i) <<
" residual(" << i+1 <<
"): "
126 << info.residual(i) <<
" error_info(" << i+1 <<
"): "
127 << info.error_info(i) << std::endl << std::endl;
133 assert( i < eigenvectors.size() );
134 return eigenvectors[i];
139 assert( i < eigenvectors.size() );
144 std::vector<double> eigen;
145 std::vector<int> multi;
146 std::vector<double> err;
148 std::vector<Vector> eigenvectors;
149 ietl::Info<double> info;
152 #endif // REDUKT_LANCZOS_H
Lanczos(const Matrix &mat, int k)
Compute k greatest eigenvalues and eigenvectors of symmetric Matrix mat.
Definition: Lanczos.h:36
const Vector & getEigenvector(unsigned int i) const
Definition: Lanczos.h:131
ietl::vectorspace< Vector > Vectorspace
Definition: Lanczos.h:32
boost::lagged_fibonacci607 RandGen
Definition: Lanczos.h:33
double getEigenvalue(unsigned int i) const
Definition: Lanczos.h:137
Compute k greatest eigenvectors of a Matrix.
Definition: Lanczos.h:29
void printInfo()
Definition: Lanczos.h:106