iterative-solver 0.0
ArrayHandlerIterable.h
1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ARRAY_ARRAYHANDLERITERABLE_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ARRAY_ARRAYHANDLERITERABLE_H
3#include <cstddef>
4#include <molpro/linalg/array/ArrayHandler.h>
5#include <molpro/linalg/array/util/gemm.h>
6#include <molpro/linalg/array/util/select.h>
7#include <molpro/linalg/array/util/select_max_dot.h>
8#include <numeric>
9
12
13namespace molpro::linalg::array {
14namespace util {
15
16template <typename T>
17struct is_std_array : std::false_type {};
18
19template <typename T, std::size_t N>
20struct is_std_array<std::array<T, N>> : std::true_type {};
21
22template <typename T>
24
25template <typename T>
26constexpr bool is_array_v = std::is_array<T>::value || is_std_array_v<T>;
27
28} // namespace util
29
34template <typename AL, typename AR = AL>
35class ArrayHandlerIterable : public ArrayHandler<AL, AR> {
36public:
42
45
46 AL copy(const AR &source) override { return copyAny<AL, AR>(source); };
47
48 void copy(AL &x, const AR &y) override {
49 using std::begin;
50 using std::end;
51 std::copy(begin(y), end(y), begin(x));
52 };
53
54 void scal(value_type alpha, AL &x) override {
55 for (auto &el : x)
56 el *= alpha;
57 };
58
59 void fill(value_type alpha, AL &x) override {
60 using std::begin;
61 using std::end;
62 std::fill(begin(x), end(x), alpha);
63 };
64
65 void axpy(value_type alpha, const AR &x, AL &y) override {
66 auto prof = molpro::Profiler::single();
67 prof->start("ArrayHandlerIterable::axpy");
68 if (x.size() < y.size())
69 error("ArrayHandlerIterable::axpy() incompatible x and y arrays, x.size() < y.size()");
70 using std::begin;
71 using std::end;
72 std::transform(begin(y), end(y), begin(x), begin(y), [alpha](auto &ely, auto &elx) { return ely + alpha * elx; });
73 prof->stop();
74 };
75
76 value_type dot(const AL &x, const AR &y) override {
77 if (x.size() > y.size())
78 error("ArrayHandlerIterable::dot() incompatible x and y arrays, x.size() > y.size()");
79 using std::begin;
80 using std::end;
81 return std::inner_product(begin(x), end(x), begin(y), (value_type)0);
82 };
83
84 void gemm_outer(const Matrix<value_type> alphas, const CVecRef<AR> &xx, const VecRef<AL> &yy) override {
85 gemm_outer_default(*this, alphas, xx, yy);
86 }
87
88 Matrix<value_type> gemm_inner(const CVecRef<AL> &xx, const CVecRef<AR> &yy) override {
89 return gemm_inner_default(*this, xx, yy);
90 }
91
92 std::map<size_t, value_type_abs> select_max_dot(size_t n, const AL &x, const AR &y) override {
93 if (n > x.size() || n > y.size())
94 error("ArrayHandlerIterable::select_max_dot() n is too large");
95 return util::select_max_dot<AL, AR, value_type, value_type_abs>(n, x, y);
96 }
97
98 std::map<size_t, value_type> select(size_t n, const AL &x, bool max = false, bool ignore_sign = false) override {
99 if (n > x.size())
100 error("ArrayHandlerIterable::select() n is too large");
101 return util::select<AL, value_type>(n, x, max, ignore_sign);
102 }
103
104 ProxyHandle lazy_handle() override { return this->lazy_handle(*this); };
105
106protected:
107 using ArrayHandler<AL, AR>::error;
108 using ArrayHandler<AL, AR>::lazy_handle;
109 using ArrayHandler<AL, AR>::m_lazy_handles;
110
111 template <typename T, typename S, typename std::enable_if_t<util::is_array_v<T>, std::nullptr_t> = nullptr>
112 T copyAny(const S &source) {
113 auto result = T();
114 using std::begin;
115 using std::end;
116 std::copy(begin(source), end(source), begin(result));
117 return result;
118 }
119
120 template <typename T, typename S, typename std::enable_if_t<!util::is_array_v<T>, int> = 0>
121 T copyAny(const S &source) {
122 auto result = T(source.size());
123 using std::begin;
124 using std::end;
125 std::copy(begin(source), end(source), begin(result));
126 return result;
127 }
128};
129
130} // namespace molpro::linalg::array
131
132#endif // LINEARALGEBRA_SRC_MOLPRO_LINALG_ARRAY_ARRAYHANDLERITERABLE_H
Array handler for two containers both of which can be iterated through using begin() and end() member...
Definition: ArrayHandlerIterable.h:35
T copyAny(const S &source)
Definition: ArrayHandlerIterable.h:112
ProxyHandle lazy_handle() override
Returns a lazy handle. Most implementations simply need to call the overload: return lazy_handle(*thi...
Definition: ArrayHandlerIterable.h:104
AL copy(const AR &source) override
Definition: ArrayHandlerIterable.h:46
void scal(value_type alpha, AL &x) override
Definition: ArrayHandlerIterable.h:54
void gemm_outer(const Matrix< value_type > alphas, const CVecRef< AR > &xx, const VecRef< AL > &yy) override
Definition: ArrayHandlerIterable.h:84
void copy(AL &x, const AR &y) override
Definition: ArrayHandlerIterable.h:48
std::map< size_t, value_type_abs > select_max_dot(size_t n, const AL &x, const AR &y) override
Definition: ArrayHandlerIterable.h:92
ArrayHandlerIterable(const ArrayHandlerIterable< AL, AR > &)=default
void fill(value_type alpha, AL &x) override
Definition: ArrayHandlerIterable.h:59
value_type dot(const AL &x, const AR &y) override
Definition: ArrayHandlerIterable.h:76
std::map< size_t, value_type > select(size_t n, const AL &x, bool max=false, bool ignore_sign=false) override
Select n indices with largest (or smallest) actual (or absolute) value.
Definition: ArrayHandlerIterable.h:98
Matrix< value_type > gemm_inner(const CVecRef< AL > &xx, const CVecRef< AR > &yy) override
Definition: ArrayHandlerIterable.h:88
void axpy(value_type alpha, const AR &x, AL &y) override
Definition: ArrayHandlerIterable.h:65
Enhances various operations between pairs of arrays and allows dynamic code injection with uniform in...
Definition: ArrayHandler.h:162
std::vector< std::weak_ptr< LazyHandle > > m_lazy_handles
keeps track of all created lazy handles
Definition: ArrayHandler.h:416
decltype(value_type_L{} *value_type_R{}) value_type
Definition: ArrayHandler.h:181
virtual void error(const std::string &message)
Throws an error.
Definition: ArrayHandler.h:268
Matrix container that allows simple data access, slicing, copying and resizing without loosing data.
Definition: Matrix.h:28
static std::shared_ptr< Profiler > single()
auto begin(Span< T > &x)
Definition: Span.h:84
auto end(Span< T > &x)
Definition: Span.h:94
constexpr bool is_array_v
Definition: ArrayHandlerIterable.h:26
constexpr bool is_std_array_v
Definition: ArrayHandlerIterable.h:23
void gemm_outer_default(Handler &handler, const Matrix< typename Handler::value_type > alphas, const CVecRef< AR > &xx, const VecRef< AL > &yy)
Definition: gemm.h:258
Matrix< typename Handler::value_type > gemm_inner_default(Handler &handler, const CVecRef< AL > &xx, const CVecRef< AR > &yy)
Definition: gemm.h:268
Definition: ArrayHandler.h:22
Definition: ArrayHandlerIterable.h:17