1#ifndef LAMBDA_LANCZOS_UTIL_H_
2#define LAMBDA_LANCZOS_UTIL_H_
20template <
size_t I,
typename container_type>
23 typename container_type::const_iterator
iter;
28 const typename std::tuple_element<I, typename container_type::value_type>::type&
operator*()
const {
29 return std::get<I>(*
iter);
33 return this->iter == obj.
iter;
37 return this->iter != obj.
iter;
55template <
typename map_type>
58template <
typename map_type>
62 const typename map_type::const_iterator
itr_cend;
123 static std::complex<T>
invoke(
const std::complex<T> val) {
124 return std::conj(val);
148inline T
inner_prod(
const std::vector<T>& v1,
const std::vector<T>& v2) {
149 assert(v1.size() == v2.size());
150 return std::inner_product(std::begin(v1), std::end(v1),
152 [](
const T& v,
const T& u) -> T {
return v+u; },
153 [](
const T& a,
const T& b) -> T {
return typed_conj(a)*b; });
162 return std::sqrt(std::real(
inner_prod(vec, vec)));
169template <
typename T1,
typename T2>
171 for(
auto& elem : vec) {
192 for(
const T& element : vec) {
193 norm += std::abs(element);
205template <
typename ForwardIterator,
typename T>
207 ForwardIterator first,
208 ForwardIterator last) {
209 const auto n = uorth.size();
211 for(
auto iter = first; iter != last; ++iter) {
212 const auto& uk = *iter;
215 for(
size_t i = 0; i < n; ++i) {
216 uorth[i] -= innprod * uk[i];
228 for(
size_t i = 0; i < n; ++i) {
230 std::fill(a[i].begin(), a[i].end(), T());
243 std::vector<std::vector<T>>& eigenvectors,
244 bool sort_eigenvector,
246 std::vector<std::pair<real_t<T>,
size_t>> ev_index_pairs;
247 ev_index_pairs.reserve(eigenvalues.size());
248 for(
size_t i = 0; i < eigenvalues.size(); ++i) {
249 ev_index_pairs.emplace_back(eigenvalues[i], i);
252 std::sort(ev_index_pairs.begin(),
253 ev_index_pairs.end(),
254 [&predicate](
const auto& x,
const auto& y ) {
255 return predicate(x.first, y.first);
258 std::vector<real_t<T>> eigenvalues_new;
259 eigenvalues_new.reserve(eigenvalues.size());
260 for(
const auto& ev_index : ev_index_pairs) {
261 size_t k = ev_index.second;
262 eigenvalues_new.emplace_back(eigenvalues[k]);
264 eigenvalues = std::move(eigenvalues_new);
266 if(sort_eigenvector) {
267 std::vector<std::vector<T>> eigenvectors_new;
268 eigenvectors_new.reserve(eigenvalues.size());
269 for(
const auto& ev_index : ev_index_pairs) {
270 size_t k = ev_index.second;
271 eigenvectors_new.push_back(std::move(eigenvectors[k]));
273 eigenvectors = std::move(eigenvectors_new);
284 return (
int)(std::numeric_limits<T>::digits *
285 log10(std::numeric_limits<T>::radix));
291 return pow(10, -sig_decimal_digit<T>());
313std::string
vectorToString(
const std::vector<T>& vec, std::string delimiter =
" ") {
314 std::stringstream ss;
316 for(
const auto& elem : vec) {
317 ss << elem << delimiter;
321 std::string result = ss.str();
322 if(!result.empty()) {
Definition: lambda_lanczos_util.hpp:59
MapValueIterable(const map_type &map)
Definition: lambda_lanczos_util.hpp:65
MapValueIterator< map_type > cend() const
Definition: lambda_lanczos_util.hpp:71
MapValueIterator< map_type > cbegin() const
Definition: lambda_lanczos_util.hpp:67
const map_type::const_iterator itr_cbegin
Definition: lambda_lanczos_util.hpp:61
const map_type::const_iterator itr_cend
Definition: lambda_lanczos_util.hpp:62
Iterator for a container of tuples to iterate over the I-th tuple elements.
Definition: lambda_lanczos_util.hpp:21
container_type::const_iterator iter
Definition: lambda_lanczos_util.hpp:23
bool operator!=(const TupleViewIterator &obj) const
Definition: lambda_lanczos_util.hpp:36
const std::tuple_element< I, typenamecontainer_type::value_type >::type & operator*() const
Definition: lambda_lanczos_util.hpp:28
TupleViewIterator operator++(int dummy)
Definition: lambda_lanczos_util.hpp:45
TupleViewIterator & operator++()
Definition: lambda_lanczos_util.hpp:40
TupleViewIterator(const typename container_type::const_iterator &iter)
Definition: lambda_lanczos_util.hpp:26
bool operator==(const TupleViewIterator &obj) const
Definition: lambda_lanczos_util.hpp:32
void normalize(std::vector< T > &vec)
Normalizes given vector.
Definition: lambda_lanczos_util.hpp:180
constexpr int sig_decimal_digit()
Returns the significant decimal digits of type T.
Definition: lambda_lanczos_util.hpp:283
void scalar_mul(T1 a, std::vector< T2 > &vec)
Multiplies each element of vec by a.
Definition: lambda_lanczos_util.hpp:170
real_t< T > norm(const std::vector< T > &vec)
Returns Euclidean norm of given vector.
Definition: lambda_lanczos_util.hpp:161
constexpr T minimum_effective_decimal()
Definition: lambda_lanczos_util.hpp:290
T typed_conj(const T &val)
Complex conjugate with type. This function returns the argument itself for real type,...
Definition: lambda_lanczos_util.hpp:135
void sort_eigenpairs(std::vector< real_t< T > > &eigenvalues, std::vector< std::vector< T > > &eigenvectors, bool sort_eigenvector, const std::function< bool(real_t< T >, real_t< T >)> predicate=std::less< real_t< T > >())
Sorts eigenvalues and eigenvectors with respect to given predicate.
Definition: lambda_lanczos_util.hpp:242
T sgn(T val)
Return the sign of given value.
Definition: lambda_lanczos_util.hpp:300
std::string vectorToString(const std::vector< T > &vec, std::string delimiter=" ")
Returns string representation of given vector.
Definition: lambda_lanczos_util.hpp:313
void initAsIdentity(std::vector< std::vector< T > > &a, size_t n)
Initializes the given matrix a to an n by n identity matrix.
Definition: lambda_lanczos_util.hpp:226
T inner_prod(const std::vector< T > &v1, const std::vector< T > &v2)
Returns "mathematical" inner product of v1 and v2.
Definition: lambda_lanczos_util.hpp:148
void schmidt_orth(std::vector< T > &uorth, ForwardIterator first, ForwardIterator last)
Orthogonalizes vector uorth with respect to orthonormal vectors defined by given iterators.
Definition: lambda_lanczos_util.hpp:206
typename realTypeMap< T >::type real_t
Type mapper from T to real type of T.
Definition: lambda_lanczos_util.hpp:103
real_t< T > l1_norm(const std::vector< T > &vec)
Returns 1-norm of given vector.
Definition: lambda_lanczos_util.hpp:189
Definition: eigenpair_manager.hpp:10
static std::complex< T > invoke(const std::complex< T > val)
Definition: lambda_lanczos_util.hpp:123
Complex conjugate template.
Definition: lambda_lanczos_util.hpp:115
static T invoke(const T &val)
Definition: lambda_lanczos_util.hpp:116
T type
Definition: lambda_lanczos_util.hpp:88
Template class to map specific types. See real_t<T> for usage.
Definition: lambda_lanczos_util.hpp:82
T type
Definition: lambda_lanczos_util.hpp:83