1#ifndef LAMBDA_LANCZOS_EXPONENTIATOR_H_
2#define LAMBDA_LANCZOS_EXPONENTIATOR_H_
30 template <
typename n_type>
41 std::function<void(
const std::vector<T>& in, std::vector<T>& out)>
mv_mul;
87 size_t run(
const T& a,
const std::vector<T>& input, std::vector<T>& output)
const {
88 assert(input.size() == this->matrix_size);
90 std::vector<std::vector<T>> u;
91 std::vector<real_t<T>> alpha;
92 std::vector<real_t<T>> beta;
94 u.reserve(this->initial_vector_size);
95 alpha.reserve(this->initial_vector_size);
96 beta.reserve(this->initial_vector_size);
98 const auto n = this->matrix_size;
103 std::vector<T> coeff_prev;
105 size_t itern = this->max_iteration;
106 for (
size_t k = 1; k <= this->max_iteration; ++k) {
107 u.emplace_back(n, 0.0);
108 this->
mv_mul(u[k - 1], u[k]);
112 for (
size_t i = 0; i < n; ++i) {
114 u[k][i] = u[k][i] - alpha[k - 1] * u[k - 1][i];
116 u[k][i] = u[k][i] - beta[k - 2] * u[k - 2][i] - alpha[k - 1] * u[k - 1][i];
120 if (this->full_orthogonalize) {
124 std::vector<real_t<T>> ev(alpha.size());
125 std::vector<std::vector<real_t<T>>> p(alpha.size());
128 std::vector<T> coeff(alpha.size(), 0.0);
129 for (
size_t i = 0; i < alpha.size(); ++i) {
130 for (
size_t j = 0; j < alpha.size(); ++j) {
131 coeff[i] += p[j][i] * std::exp(a * ev[j]) * p[j][0];
148 for (
size_t i = 0; i < coeff_prev.size(); ++i) {
152 coeff_prev = std::move(coeff);
154 const real_t<T> beta_threshold = std::numeric_limits<real_t<T>>::epsilon();
155 if (std::abs(1 - std::abs(overlap)) <
eps || beta.back() < beta_threshold) {
164 std::fill(output.begin(), output.end(), T());
166 for (
size_t l = 0; l < coeff_prev.size(); ++l) {
167 for (
size_t i = 0; i < n; ++i) {
168 output[i] += norm * coeff_prev[l] * u[l][i];
175 size_t taylor_run(
const T& a,
const std::vector<T>& input, std::vector<T>& output) {
176 const size_t n = this->matrix_size;
177 assert(this->matrix_size == input.size());
184 std::vector<std::vector<T>> taylors;
185 taylors.push_back(input);
188 for (
size_t k = 1;; ++k) {
190 taylors.emplace_back(n, 0.0);
191 mv_mul(taylors[k - 1], taylors[k]);
200 std::fill(output.begin(), output.end(), 0.0);
201 for (
size_t k = taylors.size(); k-- > 0;) {
202 for (
size_t i = 0; i < n; ++i) {
203 output[i] += taylors[k][i] * factor;
209 return taylors.size();
size_t taylor_run(const T &a, const std::vector< T > &input, std::vector< T > &output)
Definition exponentiator.hpp:175
real_t< T > eps
Convergence threshold of Lanczos iteration.
Definition exponentiator.hpp:58
size_t max_iteration
Iteration limit of Lanczos algorithm, set to matrix_size automatically.
Definition exponentiator.hpp:46
size_t matrix_size
Dimension of the matrix to be exponentiated.
Definition exponentiator.hpp:44
std::function< void(const std::vector< T > &in, std::vector< T > &out)> mv_mul
Matrix-vector multiplication routine.
Definition exponentiator.hpp:41
size_t initial_vector_size
(Not necessary to change)
Definition exponentiator.hpp:71
util::real_t< n_type > real_t
See util::real_t for details.
Definition exponentiator.hpp:31
size_t run(const T &a, const std::vector< T > &input, std::vector< T > &output) const
Apply matrix exponentiation exp(a*A) to input and store the result into output.
Definition exponentiator.hpp:87
Exponentiator(std::function< void(const std::vector< T > &, std::vector< T > &)> mv_mul, size_t matrix_size)
Constructs Lanczos exponetiation engine.
Definition exponentiator.hpp:80
bool full_orthogonalize
Flag to execute explicit Lanczos-vector orthogonalization.
Definition exponentiator.hpp:63
size_t tridiagonal_eigenpairs(const std::vector< T > &alpha, const std::vector< T > &beta, std::vector< T > &eigenvalues, std::vector< std::vector< T > > &eigenvectors, bool compute_eigenvector=true)
Computes all eigenpairs (eigenvalues and eigenvectors) for given tri-diagonal matrix using the Implic...
Definition lambda_lanczos_tridiagonal_impl.hpp:291
void normalize(std::vector< T > &vec)
Normalizes given vector.
Definition linear_algebra.hpp:78
real_t< T > norm(const std::vector< T > &vec)
Returns Euclidean norm of given vector.
Definition linear_algebra.hpp:57
typename realTypeMap< T >::type real_t
Type mapper from T to real type of T.
Definition common.hpp:102
T typed_conj(const T &val)
Complex conjugate with type. This function returns the argument itself for real type,...
Definition common.hpp:132
T inner_prod(const std::vector< T > &v1, const std::vector< T > &v2)
Returns "mathematical" inner product of v1 and v2.
Definition linear_algebra.hpp:30
void schmidt_orth(std::vector< T > &uorth, ForwardIterator first, ForwardIterator last)
Orthogonalizes vector uorth with respect to orthonormal vectors defined by given iterators.
Definition linear_algebra.hpp:133
Definition eigenpair_manager.hpp:9