Enhances various operations between pairs of arrays and allows dynamic code injection with uniform interface. More...
#include <ArrayHandler.h>
Enhances various operations between pairs of arrays and allows dynamic code injection with uniform interface.
The handler is directional, there is a left and a right array.
AL | |
AR |
Operations between pairs of arrays can often be improved with some hindsight, e.g. lazy evaluation and loop fusing, or might require dynamic information, e.g. file name info for copy constructor of disk array. This class is not meant to beautify the code, but to allow dynamic code injection without a bloated interface.
Copy constructor
Lazy evaluation of axpy
Lazy evaluation of dot
Classes | |
struct | Counter |
class | LazyHandle |
Registers operations for lazy evaluation. Evaluation is triggered by calling eval() or on destruction. More... | |
class | ProxyHandle |
A convenience wrapper around a pointer to the LazyHandle. More... | |
Public Types | |
using | value_type_L = typename array::mapped_or_value_type_t< AL > |
using | value_type_R = typename array::mapped_or_value_type_t< AR > |
using | value_type = decltype(value_type_L{} *value_type_R{}) |
using | value_type_abs = decltype(check_abs< value_type >()) |
Public Member Functions | |
virtual AL | copy (const AR &source)=0 |
virtual void | copy (AL &x, const AR &y)=0 |
Copy content of y into x. More... | |
virtual void | scal (value_type alpha, AL &x)=0 |
virtual void | fill (value_type alpha, AL &x)=0 |
virtual void | axpy (value_type alpha, const AR &x, AL &y)=0 |
virtual value_type | dot (const AL &x, const AR &y)=0 |
virtual void | gemm_outer (const Matrix< value_type > alphas, const CVecRef< AR > &xx, const VecRef< AL > &yy)=0 |
virtual Matrix< value_type > | gemm_inner (const CVecRef< AL > &xx, const CVecRef< AR > &yy)=0 |
virtual std::map< size_t, value_type_abs > | select_max_dot (size_t n, const AL &x, const AR &y)=0 |
Select n indices with largest by absolute value contributions to the dot product. More... | |
virtual std::map< size_t, value_type > | select (size_t n, const AL &x, bool max=false, bool ignore_sign=false)=0 |
Select n indices with largest (or smallest) actual (or absolute) value. More... | |
const Counter & | counter () const |
std::string | counter_to_string (std::string L, std::string R) |
void | clear_counter () |
virtual | ~ArrayHandler () |
Destroys ArrayHandler instance and invalidates any LazyHandler it created. Invalidated handler will not evaluate. More... | |
virtual ProxyHandle | lazy_handle ()=0 |
Returns a lazy handle. Most implementations simply need to call the overload: return lazy_handle(*this);. More... | |
Protected Member Functions | |
ArrayHandler () | |
ArrayHandler (const ArrayHandler &)=default | |
virtual void | error (const std::string &message) |
Throws an error. More... | |
virtual void | fused_axpy (const std::vector< std::tuple< size_t, size_t, size_t > > ®, const std::vector< value_type > &alphas, const std::vector< std::reference_wrapper< const AR > > &xx, std::vector< std::reference_wrapper< AL > > &yy) |
Default implementation of fused_axpy without any simplification. More... | |
virtual void | fused_dot (const std::vector< std::tuple< size_t, size_t, size_t > > ®, const std::vector< std::reference_wrapper< const AL > > &xx, const std::vector< std::reference_wrapper< const AR > > &yy, std::vector< std::reference_wrapper< value_type > > &out) |
Default implementation of fused_dot without any simplification. More... | |
void | save_handle (const std::shared_ptr< LazyHandle > &handle) |
Save weak ptr to a lazy handle. More... | |
ProxyHandle | lazy_handle (ArrayHandler< AL, AR > &handler) |
Protected Attributes | |
std::unique_ptr< Counter > | m_counter |
std::vector< std::weak_ptr< LazyHandle > > | m_lazy_handles |
keeps track of all created lazy handles More... | |
using molpro::linalg::array::ArrayHandler< AL, AR >::value_type = decltype(value_type_L{} * value_type_R{}) |
using molpro::linalg::array::ArrayHandler< AL, AR >::value_type_abs = decltype(check_abs<value_type>()) |
using molpro::linalg::array::ArrayHandler< AL, AR >::value_type_L = typename array::mapped_or_value_type_t<AL> |
using molpro::linalg::array::ArrayHandler< AL, AR >::value_type_R = typename array::mapped_or_value_type_t<AR> |
|
inlineprotected |
|
protecteddefault |
|
inlinevirtual |
Destroys ArrayHandler instance and invalidates any LazyHandler it created. Invalidated handler will not evaluate.
|
pure virtual |
|
inline |
|
pure virtual |
Copy content of y into x.
Implemented in molpro::linalg::array::ArrayHandlerDDiskSparse< AL, AR, true >, molpro::linalg::array::ArrayHandlerDistrSparse< AL, AR, true >, and molpro::linalg::array::ArrayHandlerIterableSparse< AL, AR, true >.
|
pure virtual |
|
inline |
|
inline |
|
pure virtual |
|
inlineprotectedvirtual |
Throws an error.
message | error message |
|
pure virtual |
Implemented in molpro::linalg::array::ArrayHandlerDDisk< AL, AR >, molpro::linalg::array::ArrayHandlerDDiskDistr< AL, AR >, molpro::linalg::array::ArrayHandlerDDiskSparse< AL, AR, true >, molpro::linalg::array::ArrayHandlerDefault< AL, AR >, molpro::linalg::array::ArrayHandlerDistr< AL, AR >, molpro::linalg::array::ArrayHandlerDistrDDisk< AL, AR >, molpro::linalg::array::ArrayHandlerDistrSparse< AL, AR, true >, molpro::linalg::array::ArrayHandlerIterable< AL, AR >, molpro::linalg::array::ArrayHandlerIterableSparse< AL, AR, true >, and molpro::linalg::array::ArrayHandlerSparse< AL, AR >.
|
inlineprotectedvirtual |
Default implementation of fused_axpy without any simplification.
|
inlineprotectedvirtual |
Default implementation of fused_dot without any simplification.
|
pure virtual |
Perform dot() on multiple pairs of containers in an efficient manner
Implemented in molpro::linalg::array::ArrayHandlerDDiskSparse< AL, AR, true >, molpro::linalg::array::ArrayHandlerDistrSparse< AL, AR, true >, and molpro::linalg::array::ArrayHandlerIterableSparse< AL, AR, true >.
|
pure virtual |
Perform axpy() on multiple pairs of containers in an efficient manner
|
pure virtual |
Returns a lazy handle. Most implementations simply need to call the overload: return lazy_handle(*this);.
Implemented in molpro::linalg::array::ArrayHandlerDDisk< AL, AR >, molpro::linalg::array::ArrayHandlerDDiskDistr< AL, AR >, molpro::linalg::array::ArrayHandlerDDiskSparse< AL, AR, true >, molpro::linalg::array::ArrayHandlerDefault< AL, AR >, molpro::linalg::array::ArrayHandlerDistr< AL, AR >, molpro::linalg::array::ArrayHandlerDistrDDisk< AL, AR >, molpro::linalg::array::ArrayHandlerDistrSparse< AL, AR, true >, molpro::linalg::array::ArrayHandlerIterable< AL, AR >, molpro::linalg::array::ArrayHandlerIterableSparse< AL, AR, true >, and molpro::linalg::array::ArrayHandlerSparse< AL, AR >.
|
inlineprotected |
|
inlineprotected |
Save weak ptr to a lazy handle.
|
pure virtual |
Implemented in molpro::linalg::array::ArrayHandlerDDisk< AL, AR >, molpro::linalg::array::ArrayHandlerDDiskDistr< AL, AR >, molpro::linalg::array::ArrayHandlerDDiskSparse< AL, AR, true >, molpro::linalg::array::ArrayHandlerDefault< AL, AR >, molpro::linalg::array::ArrayHandlerDistr< AL, AR >, molpro::linalg::array::ArrayHandlerDistrDDisk< AL, AR >, molpro::linalg::array::ArrayHandlerDistrSparse< AL, AR, true >, molpro::linalg::array::ArrayHandlerIterable< AL, AR >, molpro::linalg::array::ArrayHandlerIterableSparse< AL, AR, true >, and molpro::linalg::array::ArrayHandlerSparse< AL, AR >.
|
pure virtual |
Select n indices with largest (or smallest) actual (or absolute) value.
n | number of indices to select |
x | array to examine |
max | If true, select largest values, otherwise smallest |
ignore_sign | If true, consider std::abs() of elements |
Implemented in molpro::linalg::array::ArrayHandlerDDisk< AL, AR >, molpro::linalg::array::ArrayHandlerDDiskDistr< AL, AR >, molpro::linalg::array::ArrayHandlerDDiskSparse< AL, AR, true >, molpro::linalg::array::ArrayHandlerDefault< AL, AR >, molpro::linalg::array::ArrayHandlerDistr< AL, AR >, molpro::linalg::array::ArrayHandlerDistrDDisk< AL, AR >, molpro::linalg::array::ArrayHandlerDistrSparse< AL, AR, true >, molpro::linalg::array::ArrayHandlerIterable< AL, AR >, molpro::linalg::array::ArrayHandlerIterableSparse< AL, AR, true >, and molpro::linalg::array::ArrayHandlerSparse< AL, AR >.
|
pure virtual |
Select n indices with largest by absolute value contributions to the dot product.
This is necessary for perturbation theory.
n | number of indices to select |
x | left array |
y | right array |
Implemented in molpro::linalg::array::ArrayHandlerDDiskSparse< AL, AR, true >, molpro::linalg::array::ArrayHandlerDistrSparse< AL, AR, true >, and molpro::linalg::array::ArrayHandlerIterableSparse< AL, AR, true >.
|
protected |
|
protected |
keeps track of all created lazy handles