1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ARRAY_ARRAYHANDLERITERABLESPARSE_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ARRAY_ARRAYHANDLERITERABLESPARSE_H
3#include <molpro/linalg/array/ArrayHandler.h>
4#include <molpro/linalg/array/util/gemm.h>
5#include <molpro/linalg/array/util/select.h>
6#include <molpro/linalg/array/util/select_max_dot.h>
12template <
typename AL,
typename AR,
bool = has_mapped_type_v<AR>>
18template <
typename AL,
typename AR>
27 AL
copy(
const AR &source)
override {
34 void copy(AL &x,
const AR &y)
override {
36 std::fill(x.begin(), x.end(), 0);
37 for (
const auto &s : y)
38 *(x.begin() + s.first) = s.second;
41 void scal(
value_type alpha, AL &x)
override {
static_assert(
true,
"Use ArrayHandlerIterable for unary operations"); };
43 void fill(
value_type alpha, AL &x)
override {
static_assert(
true,
"Use ArrayHandlerIterable for unary operations"); };
46 for (
const auto &el_x : x)
47 if (el_x.first < y.size())
48 y[el_x.first] += alpha * el_x.second;
53 for (
const auto &el_y : y)
54 if (el_y.first < x.size())
55 tot += x[el_y.first] * el_y.second;
60 gemm_outer_default(*
this, alphas, xx, yy);
64 return gemm_inner_default(*
this, xx, yy);
67 std::map<size_t, value_type_abs>
select_max_dot(
size_t n,
const AL &x,
const AR &y)
override {
68 if (n > x.size() || n > y.size())
69 error(
"ArrayHandlerIterableSparse::select_max_dot() n is too large");
70 return util::select_max_dot_iter_sparse<AL, AR, value_type, value_type_abs>(n, x, y);
72 std::map<size_t, value_type>
select(
size_t n,
const AL &x,
bool max =
false,
bool ignore_sign =
false)
override {
74 error(
"ArrayHandlerIterableSparse::select() n is too large");
75 return util::select<AL, value_type>(n, x, max, ignore_sign);
void scal(value_type alpha, AL &x) override
Definition: ArrayHandlerIterableSparse.h:41
void gemm_outer(const Matrix< value_type > alphas, const CVecRef< AR > &xx, const VecRef< AL > &yy) override
Definition: ArrayHandlerIterableSparse.h:59
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: ArrayHandlerIterableSparse.h:72
std::map< size_t, value_type_abs > select_max_dot(size_t n, const AL &x, const AR &y) override
Select n indices with largest by absolute value contributions to the dot product.
Definition: ArrayHandlerIterableSparse.h:67
AL copy(const AR &source) override
Definition: ArrayHandlerIterableSparse.h:27
void axpy(value_type alpha, const AR &x, AL &y) override
Definition: ArrayHandlerIterableSparse.h:45
void copy(AL &x, const AR &y) override
Copy content of y into x.
Definition: ArrayHandlerIterableSparse.h:34
void fill(value_type alpha, AL &x) override
Definition: ArrayHandlerIterableSparse.h:43
value_type dot(const AL &x, const AR &y) override
Definition: ArrayHandlerIterableSparse.h:51
ProxyHandle lazy_handle() override
Returns a lazy handle. Most implementations simply need to call the overload: return lazy_handle(*thi...
Definition: ArrayHandlerIterableSparse.h:78
Matrix< value_type > gemm_inner(const CVecRef< AL > &xx, const CVecRef< AR > &yy) override
Definition: ArrayHandlerIterableSparse.h:63
Definition: ArrayHandlerIterableSparse.h:13
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 AL copy(const AR &source)=0
virtual ProxyHandle lazy_handle()=0
Returns a lazy handle. Most implementations simply need to call the overload: return lazy_handle(*thi...
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:30
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:18