lambda-lanczos 2.1.1
Loading...
Searching...
No Matches
common.hpp
Go to the documentation of this file.
1#ifndef LAMBDA_LANCZOS_UTIL_COMMON_H_
2#define LAMBDA_LANCZOS_UTIL_COMMON_H_
3
4#include <cassert>
5#include <cmath>
6#include <complex>
7#include <functional>
8#include <limits>
9#include <map>
10#include <numeric>
11#include <sstream>
12#include <vector>
13
14namespace lambda_lanczos {
15namespace util {
16
20template <size_t I, typename container_type>
22 private:
23 typename container_type::const_iterator iter;
24
25 public:
26 TupleViewIterator(const typename container_type::const_iterator& iter) : iter(iter) {}
27
28 const typename std::tuple_element<I, typename container_type::value_type>::type& operator*() const {
29 return std::get<I>(*iter);
30 }
31
32 bool operator==(const TupleViewIterator& obj) const {
33 return this->iter == obj.iter;
34 }
35
36 bool operator!=(const TupleViewIterator& obj) const {
37 return this->iter != obj.iter;
38 }
39
41 this->iter++;
42 return *this;
43 }
44
46 auto before = *this;
47 this->iter++;
48 return before;
49 }
50};
51
55template <typename map_type>
57
58template <typename map_type>
60 private:
61 const typename map_type::const_iterator itr_cbegin;
62 const typename map_type::const_iterator itr_cend;
63
64 public:
65 MapValueIterable(const map_type& map) : itr_cbegin(map.cbegin()), itr_cend(map.cend()) {}
66
68 return itr_cbegin;
69 }
70
72 return itr_cend;
73 }
74};
75
80template <typename T>
82 typedef T type;
83};
84
85template <typename T>
86struct realTypeMap<std::complex<T>> {
87 typedef T type;
88};
89
101template <typename T>
103
112template <typename T>
114 static T invoke(const T& val) {
115 return val;
116 }
117};
118
119template <typename T>
120struct TypedConjugate<std::complex<T>> {
121 static std::complex<T> invoke(const std::complex<T> val) {
122 return std::conj(val);
123 }
124};
125
131template <typename T>
132inline T typed_conj(const T& val) {
133 return TypedConjugate<T>::invoke(val);
134}
135
141template <typename T>
142inline void sort_eigenpairs(std::vector<real_t<T>>& eigenvalues,
143 std::vector<std::vector<T>>& eigenvectors,
144 bool sort_eigenvector,
145 const std::function<bool(real_t<T>, real_t<T>)> predicate = std::less<real_t<T>>()) {
146 using ev_index_t = std::pair<real_t<T>, size_t>;
147 std::vector<ev_index_t> ev_index_pairs;
148 ev_index_pairs.reserve(eigenvalues.size());
149 for (size_t i = 0; i < eigenvalues.size(); ++i) {
150 ev_index_pairs.emplace_back(eigenvalues[i], i);
151 }
152
153 std::sort(ev_index_pairs.begin(), ev_index_pairs.end(), [&predicate](const ev_index_t& x, const ev_index_t& y) {
154 return predicate(x.first, y.first);
155 });
156
157 std::vector<real_t<T>> eigenvalues_new;
158 eigenvalues_new.reserve(eigenvalues.size());
159 for (const auto& ev_index : ev_index_pairs) {
160 size_t k = ev_index.second;
161 eigenvalues_new.emplace_back(eigenvalues[k]);
162 }
163 eigenvalues = std::move(eigenvalues_new);
164
165 if (sort_eigenvector) {
166 std::vector<std::vector<T>> eigenvectors_new;
167 eigenvectors_new.reserve(eigenvalues.size());
168 for (const auto& ev_index : ev_index_pairs) {
169 size_t k = ev_index.second;
170 eigenvectors_new.push_back(std::move(eigenvectors[k]));
171 }
172 eigenvectors = std::move(eigenvectors_new);
173 }
174}
175
180template <typename T>
181inline constexpr int sig_decimal_digit() {
182 return (int)(std::numeric_limits<T>::digits * log10(std::numeric_limits<T>::radix));
183}
184
185template <typename T>
186inline constexpr T minimum_effective_decimal() {
187 return pow(10, -sig_decimal_digit<T>());
188}
189
194template <typename T>
195T sgn(T val) {
196 if (val >= 0) {
197 return (T)1;
198 } else {
199 return (T)(-1);
200 }
201}
202
206template <typename T>
207std::string vectorToString(const std::vector<T>& vec, std::string delimiter = " ") {
208 std::stringstream ss;
209
210 for (const auto& elem : vec) {
211 ss << elem << delimiter;
212 }
213
214 /* Remove the last space */
215 std::string result = ss.str();
216 if (!result.empty()) {
217 result.pop_back();
218 }
219
220 return result;
221}
222
223} /* namespace util */
224} /* namespace lambda_lanczos */
225
226#endif /* LAMBDA_LANCZOS_UTIL_COMMON_H_ */
MapValueIterable(const map_type &map)
Definition common.hpp:65
MapValueIterator< map_type > cend() const
Definition common.hpp:71
MapValueIterator< map_type > cbegin() const
Definition common.hpp:67
const map_type::const_iterator itr_cbegin
Definition common.hpp:61
const map_type::const_iterator itr_cend
Definition common.hpp:62
Iterator for a container of tuples to iterate over the I-th tuple elements.
Definition common.hpp:21
map_type::const_iterator iter
Definition common.hpp:23
bool operator!=(const TupleViewIterator &obj) const
Definition common.hpp:36
const std::tuple_element< I, typenamecontainer_type::value_type >::type & operator*() const
Definition common.hpp:28
TupleViewIterator operator++(int dummy)
Definition common.hpp:45
TupleViewIterator & operator++()
Definition common.hpp:40
TupleViewIterator(const typename container_type::const_iterator &iter)
Definition common.hpp:26
bool operator==(const TupleViewIterator &obj) const
Definition common.hpp:32
Definition common.hpp:15
constexpr int sig_decimal_digit()
Returns the significant decimal digits of type T.
Definition common.hpp:181
typename realTypeMap< T >::type real_t
Type mapper from T to real type of T.
Definition common.hpp:102
constexpr T minimum_effective_decimal()
Definition common.hpp:186
TupleViewIterator< 1, map_type > MapValueIterator
Iterator for a map to iterate over its values.
Definition common.hpp:56
T typed_conj(const T &val)
Complex conjugate with type. This function returns the argument itself for real type,...
Definition common.hpp:132
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 common.hpp:142
T sgn(T val)
Return the sign of given value.
Definition common.hpp:195
std::string vectorToString(const std::vector< T > &vec, std::string delimiter=" ")
Returns string representation of given vector.
Definition common.hpp:207
Definition eigenpair_manager.hpp:9
static std::complex< T > invoke(const std::complex< T > val)
Definition common.hpp:121
Complex conjugate template.
Definition common.hpp:113
static T invoke(const T &val)
Definition common.hpp:114
Template class to map specific types. See real_t<T> for usage.
Definition common.hpp:81
T type
Definition common.hpp:82