1#ifndef LAMBDA_LANCZOS_UTIL_COMMON_H_
2#define LAMBDA_LANCZOS_UTIL_COMMON_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;
121 static std::complex<T>
invoke(
const std::complex<T> val) {
122 return std::conj(val);
143 std::vector<std::vector<T>>& eigenvectors,
144 bool sort_eigenvector,
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);
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);
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]);
163 eigenvalues = std::move(eigenvalues_new);
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]));
172 eigenvectors = std::move(eigenvectors_new);
182 return (
int)(std::numeric_limits<T>::digits * log10(std::numeric_limits<T>::radix));
207std::string
vectorToString(
const std::vector<T>& vec, std::string delimiter =
" ") {
208 std::stringstream ss;
210 for (
const auto& elem : vec) {
211 ss << elem << delimiter;
215 std::string result = ss.str();
216 if (!result.empty()) {
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
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
T type
Definition common.hpp:87
Template class to map specific types. See real_t<T> for usage.
Definition common.hpp:81
T type
Definition common.hpp:82