Ensign
Low-rank framework for multi-core CPUs and GPUs
Loading...
Searching...
No Matches
tree.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include <iostream>
9#include <vector>
10
11#include <generic/matrix.hpp>
12#include <generic/storage.hpp>
13#include <generic/timer.hpp>
14#include <generic/netcdf.hpp>
15#include <generic/tensor.hpp>
16#include <lr/coefficients.hpp>
17#include <lr/lr.hpp>
18
19#include <netcdf.h>
20
21namespace Ensign {
22
23#ifdef __OPENMP__
24#pragma omp declare reduction(+ : Ensign::multi_array<double, 2> : omp_out += omp_in) \
25 initializer(omp_priv = decltype(omp_orig)(omp_orig))
26#endif
27
28#ifdef __OPENMP__
29#pragma omp declare reduction(+ : Ensign::multi_array<double, 4> : omp_out += omp_in) \
30 initializer(omp_priv = decltype(omp_orig)(omp_orig))
31#endif
32
33// General classes for the hierarchical DLR approximation
34// TODO: introduce a template parameter `N` for arbitrary many outgoing legs
35
37template <class T> struct node {
38 const std::string id;
39
40 node* const parent;
41 std::array<node*, 2> child;
43
45
46 node() = default;
47
48 node(const std::string _id, node* const _parent, std::array<node*, 2> _child,
49 const Index _r_in, const Index _n_basisfunctions)
50 : id(_id), parent(_parent), child(_child), n_basisfunctions(_n_basisfunctions),
51 S({_r_in, _r_in})
52 {
53 assert(n_basisfunctions <= _r_in);
54 }
55
56 virtual ~node() = default;
57
58 virtual bool IsInternal() const = 0;
59 virtual bool IsExternal() const = 0;
60 virtual void Initialize(int ncid) = 0;
61
62 Index RankIn() const { return S.shape()[0]; }
63};
64
66template <class T> struct internal_node : virtual node<T> {
69
70 internal_node(const std::string _id, internal_node* const _parent,
71 const Index _r_in, const std::array<Index, 2> _r_out,
72 const Index _n_basisfunctions)
73 : node<T>(_id, _parent, {nullptr, nullptr}, _r_in, _n_basisfunctions),
74 Q({_r_out[0], _r_out[1], _r_in}), G({_r_out[0], _r_out[1], _r_in})
75 {
76 }
77
78 bool IsInternal() const override { return true; }
79
80 bool IsExternal() const override { return false; }
81
82 std::array<Index, 2> RankOut() const
83 {
84 return array<Index, 2>({Q.shape()[0], Q.shape()[1]});
85 }
86
87 void Initialize(int ncid) override;
88
89 void Write(int ncid, int id_r_in, std::array<int, 2> id_r_out) const;
90
92 const Ensign::Matrix::blas_ops& blas);
93};
94
96template <class T> struct external_node : virtual node<T> {
98
99 external_node(const std::string _id, internal_node<T>* const _parent,
100 const Index _dx, const Index _r_in, const Index _n_basisfunctions)
101 : node<T>(_id, _parent, {nullptr, nullptr}, _r_in, _n_basisfunctions),
102 X({_dx, _r_in})
103 {
104 }
105
106 bool IsInternal() const override { return false; }
107
108 bool IsExternal() const override { return true; }
109
110 Index ProblemSize() const { return X.shape()[0]; }
111
112 void Initialize(int ncid) override;
113
114 void Write(int ncid, int id_r_in, int id_dx) const;
115
117 const Ensign::Matrix::blas_ops& blas);
118};
119
120template <class T>
122 const Ensign::Matrix::blas_ops& blas)
123{
126 Ensign::Tensor::matricize<2>(Q, Qmat);
127 Q_R = Tensor::orthogonalize(Qmat, node<T>::n_basisfunctions, weight, blas);
128 Ensign::Tensor::tensorize<2>(Qmat, Q);
129
130 return Q_R;
131};
132
133template <class T>
142
143} // namespace Ensign
Computes weighted coefficients and integrals of low-rank factors (the c and d factors in the notation...
ptrdiff_t Index
Definition common.hpp:83
Provides two-factor (i.e. matrix) low-rank types and their operations.
Declares dense matrix and vector operations, including BLAS wrappers.
multi_array< T, 2 > orthogonalize(multi_array< T, 2 > &input, const Index n_basisfunctions, const T weight, const Ensign::Matrix::blas_ops &blas)
Definition tensor.hpp:85
Core namespace for Ensign's numerical algorithms and data structures.
Definition common.hpp:96
T prod(array< T, d > a)
Definition utility.hpp:14
Provides a NetCDF writer for simulation output.
Provides contiguous multidimensional arrays for CPU and GPU storage.
Provides matrix and vector operations with optional GPU execution.
Definition matrix.hpp:47
Represents a leaf tree node with a basis matrix.
Definition tree.hpp:96
bool IsExternal() const override
Definition tree.hpp:108
bool IsInternal() const override
Definition tree.hpp:106
void Initialize(int ncid) override
void Write(int ncid, int id_r_in, int id_dx) const
Ensign::multi_array< T, 2 > orthogonalize(const T weight, const Ensign::Matrix::blas_ops &blas)
Definition tree.hpp:134
Ensign::multi_array< T, 2 > X
Definition tree.hpp:97
Index ProblemSize() const
Definition tree.hpp:110
external_node(const std::string _id, internal_node< T > *const _parent, const Index _dx, const Index _r_in, const Index _n_basisfunctions)
Definition tree.hpp:99
Represents an internal tree node with a coefficient tensor.
Definition tree.hpp:66
std::array< Index, 2 > RankOut() const
Definition tree.hpp:82
Ensign::multi_array< T, 2 > orthogonalize(const T weight, const Ensign::Matrix::blas_ops &blas)
Definition tree.hpp:121
internal_node(const std::string _id, internal_node *const _parent, const Index _r_in, const std::array< Index, 2 > _r_out, const Index _n_basisfunctions)
Definition tree.hpp:70
bool IsInternal() const override
Definition tree.hpp:78
void Initialize(int ncid) override
Ensign::multi_array< T, 3 > G
Definition tree.hpp:68
void Write(int ncid, int id_r_in, std::array< int, 2 > id_r_out) const
Ensign::multi_array< T, 3 > Q
Definition tree.hpp:67
bool IsExternal() const override
Definition tree.hpp:80
Dense d-dimensional array stored contiguously in column-major order (i.e.
Definition storage.hpp:24
array< Index, d > shape() const
Definition storage.hpp:244
Base class for a node in a tree tensor network.
Definition tree.hpp:37
virtual ~node()=default
virtual bool IsExternal() const =0
virtual bool IsInternal() const =0
node *const parent
Definition tree.hpp:40
Index RankIn() const
Definition tree.hpp:62
Ensign::multi_array< T, 2 > S
Definition tree.hpp:44
const std::string id
Definition tree.hpp:38
std::array< node *, 2 > child
Definition tree.hpp:41
node()=default
node(const std::string _id, node *const _parent, std::array< node *, 2 > _child, const Index _r_in, const Index _n_basisfunctions)
Definition tree.hpp:48
virtual void Initialize(int ncid)=0
const Index n_basisfunctions
Definition tree.hpp:42
Orthogonalizes Q and returns the corresponding upper triangular matrix R.
Definition lr.hpp:164
Provides tensor matricization, tensorization, and orthogonalization.
Provides elapsed-time measurement and named timers.