AmpGen 2.1
Loading...
Searching...
No Matches
Tensor.h
Go to the documentation of this file.
1#ifndef AMPGEN_TENSOR_H
2#define AMPGEN_TENSOR_H
3#include <memory.h>
4#include <stddef.h>
5#include <algorithm>
6#include <complex>
7#include <initializer_list>
8#include <iostream>
9#include <string>
10#include <vector>
11#include <utility>
12
13#include "AmpGen/Expression.h"
14#include "AmpGen/MsgService.h"
15#include "AmpGen/Types.h"
16
17#define ADD_DEBUG_TENSOR(X, Y) \
18 if(Y != nullptr) \
19 for(unsigned i = 0; i < Tensor(X).size(); ++i) Y->emplace_back(std::string(#X) + Tensor::coordinates_to_string(Tensor(X).coords(i)), Tensor(X)[i]);
20
21#define ADD_DEBUG_TENSOR_NAMED(X, Y, Z) \
22 if(Y != nullptr) \
23 for(unsigned i = 0; i < X.size(); ++i) Y->emplace_back(Z + Tensor::coordinates_to_string(X.coords(i)), X[i]);
24
25namespace AmpGen {
26 class ASTResolver;
27 class TensorProxy;
28
29 class Tensor {
30 public:
31 class Index {
32 private:
33 std::shared_ptr<int> m_ptr;
34 bool m_isUpper;
35
36 public:
37 bool operator==(const Tensor::Index &other) const { return m_ptr.get() == other.m_ptr.get(); }
38 bool operator!=(const Tensor::Index &other) const { return m_ptr.get() != other.m_ptr.get(); }
39 bool isUpper() const { return m_isUpper; };
40 explicit Index(bool isUpper = false) : m_ptr(std::make_shared<int>()), m_isUpper(isUpper) {}
41 Index(const std::shared_ptr<int> &index, bool isUpper = false) : m_ptr(index), m_isUpper(isUpper) {}
42 Index operator-() const { return Index(m_ptr, !m_isUpper); }
43 friend std::ostream &operator<<(std::ostream &out, const Index &index);
44 uint64_t ptr() const { return uint64_t(m_ptr.get()); }
45 };
46 struct Dim : public std::vector<unsigned> {
47 Dim(unsigned a) : std::vector<unsigned>({a}) {}
48 Dim(unsigned a, unsigned b) : std::vector<unsigned>({a, b}) {}
49 Dim(unsigned a, unsigned b, unsigned c) : std::vector<unsigned>({a, b, c}) {}
50 Dim(unsigned a, unsigned b, unsigned c, unsigned d) : std::vector<unsigned>({a, b, c, d}) {}
51 };
52
54 explicit Tensor(const std::vector<Expression> &elements);
55 explicit Tensor(const std::vector<unsigned> &dim);
56 explicit Tensor(const Tensor::Dim &dim) : Tensor(std::vector<unsigned>(dim)) {};
57
58 template <class TYPE> Tensor(const std::initializer_list<TYPE> &elements, const std::vector<unsigned> &dim) : m_dim(dim) {
60 for(auto &x : elements) append(x);
61 }
62
63 template <class TYPE> Tensor(const std::vector<TYPE> &elements, const std::vector<unsigned> &dim) : m_dim(dim) {
65 for(auto &x : elements) append(x);
66 }
67
69 Expression &operator[](const unsigned &i);
70 Expression &operator[](const std::vector<unsigned> &co);
71 const Expression &operator[](const unsigned &i) const;
72 const Expression &operator[](const std::vector<unsigned> &co) const;
73
74 Expression get(const unsigned &co);
75 Expression get(const unsigned &co) const;
76 Expression get(const std::vector<unsigned> &_co) const;
77
80
81 Expression &operator()(const unsigned &a) { return Tensor::operator[]({a}); }
82 Expression &operator()(const unsigned &a, const unsigned &b) { return Tensor::operator[]({a, b}); }
83 const Expression operator()(const unsigned &a) const { return Tensor::operator[]({a}); }
84 const Expression &operator()(const unsigned &a, const unsigned &b) const { return Tensor::operator[]({a, b}); }
85
88 TensorProxy operator()(const Tensor::Index &a, const Tensor::Index &b, const Tensor::Index &c) const;
89 TensorProxy operator()(const Tensor::Index &a, const Tensor::Index &b, const Tensor::Index &c, const Tensor::Index &d) const;
90 TensorProxy operator()(const std::vector<Tensor::Index> &indices) const;
91
93
94 void st(const bool simplify = false);
95 bool rankMatches(const Tensor &other);
96
97 void imposeSymmetry(unsigned indexA, unsigned indexB);
98 void imposeSymmetry(std::vector<unsigned> indices);
99
100 Tensor Invert() const;
101 std::string to_string(const ASTResolver *resolver = nullptr) const;
102
103 int metricSgn(const std::vector<unsigned> &coordinates) const;
104 int metricSgn(const unsigned &index) const;
105 void append(const Expression &expression);
106 void append(const real_t &value);
107 void append(const complex_t &value);
108 void append(const std::string &value);
110
111 unsigned nDim() const;
112 unsigned rank() const;
113 unsigned size() const;
114 unsigned index(const std::vector<unsigned> &_co) const;
115 unsigned symmetrisedIndex(const std::vector<unsigned> &_co) const;
116 unsigned nElements() const;
117
118 const std::vector<unsigned> coords(const unsigned &index) const;
119 const std::vector<unsigned> &dims() const { return m_dim; }
120 const std::string dimString() const;
121
122 void print(const bool &eval = false) const;
123
124 const std::vector<unsigned> &uniqueElements() const { return m_uniqueElements; }
125 void operator+=(const Tensor &rhs);
126 void operator-=(const Tensor &rhs);
128
129 static std::vector<unsigned> index_to_coordinates(const unsigned &index, const std::vector<unsigned> &dim);
130 static unsigned coordinates_to_index(const std::vector<unsigned> &coords, const std::vector<unsigned> &dim);
131 static std::string coordinates_to_string(const std::vector<unsigned> &coordinates);
132 template <class... ARGS> static std::vector<unsigned> dim(const ARGS &...args) {
133 std::vector<unsigned> rt;
134 auto up = std::tuple<ARGS...>(args...);
135 for_each(up, [&rt](const unsigned &f) { rt.emplace_back(f); });
136 return rt;
137 }
138
139 private:
140 std::vector<unsigned> m_dim;
141 std::vector<unsigned> m_symmetrisedCoordinates;
142 std::vector<unsigned> m_uniqueElements;
143 std::vector<Expression> m_elements;
144 };
145
154 public:
155 TensorProxy(const Tensor &tensor, const std::vector<Tensor::Index> &indices);
156 std::vector<Tensor::Index> indices() const;
157 const Tensor &tensor() const;
159 TensorProxy reorder(const std::vector<Tensor::Index> &indices);
160 operator Expression() const;
161 operator Tensor() const;
162
163 private:
164 Tensor m_tensor;
165 std::vector<Tensor::Index> m_indices;
166 };
167
169 public:
171 std::string to_string(const ASTResolver *resolver) const override;
172 void resolve(ASTResolver &resolver) const override;
173 complex_t operator()() const override;
174 operator Expression() const;
175 Tensor tensor() const { return m_tensor; }
176 unsigned size() const { return m_tensor.size(); }
177
178 private:
179 Tensor m_tensor;
180 };
181
182 Tensor operator+(const Tensor &, const Tensor &);
183 Tensor operator-(const Tensor &, const Tensor &);
187
188 Tensor operator/(const Tensor &, const double &);
189 Tensor operator*(const double &, const Tensor &);
190 Tensor operator*(const Tensor &, const double &);
191
195
199
200 TensorProxy operator/(const TensorProxy &, const double &);
201 TensorProxy operator*(const double &, const TensorProxy &);
202 TensorProxy operator*(const TensorProxy &, const double &);
203
204 Tensor Identity(const unsigned &rank = 4);
205
206 const Tensor LeviCivita(const unsigned &rank = 4);
207 Expression dot(const Tensor &A, const Tensor &B);
208
209 std::ostream &operator<<(std::ostream &out, const Tensor::Index &index);
210} // namespace AmpGen
211
212#endif
(Internal) class to aide in the resolution of the dependencies of expression trees.
Definition ASTResolver.h:30
Wrapper class for shared_ptrs to virtual expressions for use in conjunction with operators to build e...
Definition Expression.h:135
Virtual base class for other expression tree components.
Definition Expression.h:116
Index(bool isUpper=false)
Definition Tensor.h:40
bool operator!=(const Tensor::Index &other) const
Definition Tensor.h:38
uint64_t ptr() const
Definition Tensor.h:44
bool operator==(const Tensor::Index &other) const
Definition Tensor.h:37
bool isUpper() const
Definition Tensor.h:39
Index(const std::shared_ptr< int > &index, bool isUpper=false)
Definition Tensor.h:41
Index operator-() const
Definition Tensor.h:42
friend std::ostream & operator<<(std::ostream &out, const Index &index)
Tensor tensor() const
Definition Tensor.h:175
void resolve(ASTResolver &resolver) const override
Resolve the dependencies of a tree using an ASTResolver, which keeps track of parameters,...
unsigned size() const
Definition Tensor.h:176
std::string to_string(const ASTResolver *resolver) const override
Called to convert the Expression tree into source code.
complex_t operator()() const override
Evaluate the expression using the tree, will generally be very slow but ocassionally useful for debug...
TensorExpression(const Tensor &tensor)
Tensor(const Tensor::Dim &dim)
Definition Tensor.h:56
unsigned nElements() const
Expression get(const unsigned &co) const
const Expression & operator()(const unsigned &a, const unsigned &b) const
Definition Tensor.h:84
const std::vector< unsigned > coords(const unsigned &index) const
int metricSgn(const unsigned &index) const
void append(const real_t &value)
void append(const std::string &value)
std::string to_string(const ASTResolver *resolver=nullptr) const
unsigned rank() const
Tensor(const std::vector< TYPE > &elements, const std::vector< unsigned > &dim)
Definition Tensor.h:63
unsigned size() const
void append(const Expression &expression)
unsigned symmetrisedIndex(const std::vector< unsigned > &_co) const
const Expression operator()(const unsigned &a) const
Definition Tensor.h:83
void append(const complex_t &value)
const std::vector< unsigned > & uniqueElements() const
Definition Tensor.h:124
Tensor(const std::vector< Expression > &elements)
Expression & operator()(const unsigned &a)
TensorProxy access to class members High level access is done via these commands, i....
Definition Tensor.h:81
void st(const bool simplify=false)
const Expression & operator[](const unsigned &i) const
Expression & operator[](const unsigned &i)
Low level access of elements, either by coordinates or by index ///.
void operator+=(const Tensor &rhs)
static std::vector< unsigned > index_to_coordinates(const unsigned &index, const std::vector< unsigned > &dim)
Expression & operator[](const std::vector< unsigned > &co)
Expression get(const std::vector< unsigned > &_co) const
const Expression & operator[](const std::vector< unsigned > &co) const
Tensor(const std::vector< unsigned > &dim)
TensorProxy operator()(const Tensor::Index &a, const Tensor::Index &b) const
TensorProxy operator()(const Tensor::Index &a, const Tensor::Index &b, const Tensor::Index &c) const
Tensor conjugate() const
Tensor operator-() const
void setupCoordinates()
unsigned index(const std::vector< unsigned > &_co) const
Tensor(const std::initializer_list< TYPE > &elements, const std::vector< unsigned > &dim)
Definition Tensor.h:58
static unsigned coordinates_to_index(const std::vector< unsigned > &coords, const std::vector< unsigned > &dim)
void imposeSymmetry(std::vector< unsigned > indices)
void operator-=(const Tensor &rhs)
int metricSgn(const std::vector< unsigned > &coordinates) const
void print(const bool &eval=false) const
bool rankMatches(const Tensor &other)
const std::string dimString() const
TensorProxy operator()(const Tensor::Index &a, const Tensor::Index &b, const Tensor::Index &c, const Tensor::Index &d) const
TensorProxy operator()(const std::vector< Tensor::Index > &indices) const
Expression get(const unsigned &co)
void imposeSymmetry(unsigned indexA, unsigned indexB)
Tensor Invert() const
TensorProxy operator()(const Tensor::Index &a) const
static std::vector< unsigned > dim(const ARGS &...args)
Definition Tensor.h:132
Expression & operator()(const unsigned &a, const unsigned &b)
Definition Tensor.h:82
const std::vector< unsigned > & dims() const
Definition Tensor.h:119
static std::string coordinates_to_string(const std::vector< unsigned > &coordinates)
unsigned nDim() const
Utility class that wraps a tensor and a set of indices such that tensor operations can be performed.
Definition Tensor.h:153
const Tensor & tensor() const
TensorProxy reorder(const std::vector< Tensor::Index > &indices)
TensorProxy(const Tensor &tensor, const std::vector< Tensor::Index > &indices)
Tensor & tensorMutable()
std::vector< Tensor::Index > indices() const
double real_t
Definition Types.h:6
Complex< real_t > operator/(const Complex< real_t > &lhs, const R2_t &rhs)
Definition Complex.h:52
Complex< real_t > operator*(const Complex< real_t > &lhs, const R2_t &rhs)
Definition Complex.h:49
std::complex< real_t > complex_t
Definition Types.h:7
Expression dot(const Tensor &A, const Tensor &B)
std::ostream & operator<<(std::ostream &os, const CompiledExpressionBase &expression)
const Tensor LeviCivita(const unsigned &rank=4)
Complex< real_t > operator+(const Complex< real_t > &lhs, const R2_t &rhs)
Definition Complex.h:43
Complex< real_t > operator-(const Complex< real_t > &lhs, const R2_t &rhs)
Definition Complex.h:46
Tensor Identity(const unsigned &rank=4)
std::enable_if_t< I==sizeof...(Tp), void > for_each(std::tuple< Tp... > &, FuncT)
Definition MetaUtils.h:36
Dim(unsigned a, unsigned b)
Definition Tensor.h:48
Dim(unsigned a, unsigned b, unsigned c, unsigned d)
Definition Tensor.h:50
Dim(unsigned a)
Definition Tensor.h:47
Dim(unsigned a, unsigned b, unsigned c)
Definition Tensor.h:49