cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
tensor.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_TENSOR_TENSOR_H
4#define pRC_CORE_TENSOR_TENSOR_H
5
18
19namespace pRC
20{
21 template<class T, Size... Ns>
22 requires(IsValue<T> || IsComplex<T> || IsBool<T>) &&
23 requires { Sizes<Ns...>::size(); }
24 class Tensor
25 {
26 public:
27 using Type = T;
28 template<class C>
29 using ChangeType = Tensor<C, Ns...>;
30
31 using Sizes = pRC::Sizes<Ns...>;
32 template<Size... Ss>
33 using ChangeSizes = Tensor<T, Ss...>;
34
36
37 static constexpr auto Dimension = Sizes::Dimension;
38
39 static constexpr auto size()
40 {
41 return Sizes::size();
42 }
43
44 static constexpr auto size(Index const dimension)
45 {
46 return Sizes::size(dimension);
47 }
48
49 template<class X, IsConvertible<Index>... Is>
50 requires IsConstructible<T, X> && (sizeof...(Is) == Dimension)
51 static constexpr auto Single(X &&value, Is const... indices)
52 {
53 return Single(forward<X>(value), Subscripts(indices...));
54 }
55
56 template<class X>
58 static constexpr auto Single(X &&value, Subscripts const &subscripts)
59 {
60 return TensorViews::Single<T, Sizes>(forward<X>(value), subscripts);
61 }
62
63 public:
64 ~Tensor() = default;
65 constexpr Tensor(Tensor const &) = default;
66 constexpr Tensor(Tensor &&) = default;
67 constexpr Tensor &operator=(Tensor const &) & = default;
68 constexpr Tensor &operator=(Tensor &&) & = default;
69 constexpr Tensor() = default;
70
71 template<class X>
73 constexpr Tensor(X &&other)
74 {
75 *this = forward<X>(other);
76 }
77
78 template<class X>
80 constexpr auto &operator=(X &&rhs) &
81 {
82 view(*this) = forward<X>(rhs);
83 return *this;
84 }
85
86 template<IsConvertible<Index>... Is>
87 requires(sizeof...(Is) == Dimension)
88 constexpr decltype(auto) operator()(Is const... indices) &&
89 {
90 return move(mData)(indices...);
91 }
92
93 template<IsConvertible<Index>... Is>
94 requires(sizeof...(Is) == Dimension)
95 constexpr decltype(auto) operator()(Is const... indices) const &&
96 {
97 return move(mData)(indices...);
98 }
99
100 template<IsConvertible<Index>... Is>
101 requires(sizeof...(Is) == Dimension)
102 constexpr decltype(auto) operator()(Is const... indices) &
103 {
104 return mData(indices...);
105 }
106
107 template<IsConvertible<Index>... Is>
108 requires(sizeof...(Is) == Dimension)
109 constexpr decltype(auto) operator()(Is const... indices) const &
110 {
111 return mData(indices...);
112 }
113
114 constexpr decltype(auto) operator()(Subscripts const &subscripts) &&
115 {
116 return move(mData)(subscripts);
117 }
118
119 constexpr decltype(auto) operator()(
120 Subscripts const &subscripts) const &&
121 {
122 return move(mData)(subscripts);
123 }
124
125 constexpr decltype(auto) operator()(Subscripts const &subscripts) &
126 {
127 return mData(subscripts);
128 }
129
130 constexpr decltype(auto) operator()(
131 Subscripts const &subscripts) const &
132 {
133 return mData(subscripts);
134 }
135
136 constexpr decltype(auto) operator[](Index const index) &&
137 {
138 return move(mData)[index];
139 }
140
141 constexpr decltype(auto) operator[](Index const index) const &&
142 {
143 return move(mData)[index];
144 }
145
146 constexpr decltype(auto) operator[](Index const index) &
147 {
148 return mData[index];
149 }
150
151 constexpr decltype(auto) operator[](Index const index) const &
152 {
153 return mData[index];
154 }
155
156 template<class X>
158 constexpr auto &operator+=(X &&rhs) &
159 {
160 return *this = *this + forward<X>(rhs);
161 }
162
163 template<class X>
165 constexpr auto &operator-=(X &&rhs) &
166 {
167 return *this = *this - forward<X>(rhs);
168 }
169
170 template<class X>
172 constexpr auto &applyOnTheLeft(X &&lhs) &
173 {
174 view(*this).applyOnTheLeft(forward<X>(lhs));
175 return *this;
176 }
177
178 template<class X>
180 constexpr auto &applyOnTheRight(X &&rhs) &
181 {
182 view(*this).applyOnTheRight(forward<X>(rhs));
183 return *this;
184 }
185
186 template<class X>
188 constexpr auto &operator*=(X &&rhs) &
189 {
190 view(*this) *= forward<X>(rhs);
191 return *this;
192 }
193
194 template<class X>
196 constexpr auto &operator/=(X &&rhs) &
197 {
198 return *this = *this / forward<X>(rhs);
199 }
200
201 explicit constexpr operator T() const
202 requires(Dimension == 0)
203 {
204 return operator()();
205 }
206
207 explicit constexpr operator Bool() const
208 requires IsSame<T, Bool> && (Dimension > 0)
209 {
210 return reduce<LogicalAnd>(*this)();
211 }
212
213 private:
214 BEGIN_IGNORE_DIAGNOSTIC_GCC("-Wpedantic")
215 Array<T, Ns...> mData;
217 };
218
219 template<class F, class T, Size... Ns>
220 Tensor(TensorViews::View<T, Sizes<Ns...>, F> const &) -> Tensor<T, Ns...>;
221}
222#endif // pRC_CORE_TENSOR_TENSOR_H
Definition value.hpp:12
Definition sequence.hpp:29
static constexpr Size Dimension
Definition sequence.hpp:47
static constexpr auto size()
Definition sequence.hpp:69
Definition subscripts.hpp:21
Definition single.hpp:13
Definition tensor.hpp:25
pRC::Subscripts< Ns... > Subscripts
Definition tensor.hpp:35
constexpr Tensor(Tensor const &)=default
static constexpr auto size()
Definition tensor.hpp:39
constexpr auto & operator+=(X &&rhs) &
Definition tensor.hpp:158
constexpr auto & operator/=(X &&rhs) &
Definition tensor.hpp:196
constexpr Tensor & operator=(Tensor const &) &=default
~Tensor()=default
static constexpr auto Single(X &&value, Is const ... indices)
Definition tensor.hpp:51
static constexpr auto size(Index const dimension)
Definition tensor.hpp:44
constexpr decltype(auto) operator()(Is const ... indices) &&
Definition tensor.hpp:88
constexpr auto & operator*=(X &&rhs) &
Definition tensor.hpp:188
constexpr auto & applyOnTheRight(X &&rhs) &
Definition tensor.hpp:180
constexpr Tensor(Tensor &&)=default
constexpr Tensor()=default
constexpr auto & operator=(X &&rhs) &
Definition tensor.hpp:80
constexpr auto & operator-=(X &&rhs) &
Definition tensor.hpp:165
constexpr auto & applyOnTheLeft(X &&lhs) &
Definition tensor.hpp:172
constexpr Tensor & operator=(Tensor &&) &=default
static constexpr auto Dimension
Definition tensor.hpp:37
static constexpr auto Single(X &&value, Subscripts const &subscripts)
Definition tensor.hpp:58
constexpr Tensor(X &&other)
Definition tensor.hpp:73
Definition concepts.hpp:40
Definition concepts.hpp:37
Definition concepts.hpp:31
Definition concepts.hpp:28
pRC::Float<> T
Definition externs_nonTT.hpp:1
int value
Definition gmock-actions_test.cc:1714
Definition cholesky.hpp:10
bool Bool
Definition basics.hpp:29
Size Index
Definition basics.hpp:32
std::size_t Size
Definition basics.hpp:31
static constexpr decltype(auto) view(X &&a)
Definition view.hpp:13
Conditional<((Ns *... *1) *sizeof(T) > cHugepageSizeByte), HeapArray< T, Ns... >, StackArray< T, Ns... > > Array
Definition declarations.hpp:21
static constexpr auto reduce(Sequence< T, I1, I2, Is... > const)
Definition sequence.hpp:458
#define BEGIN_IGNORE_DIAGNOSTIC_GCC(warning)
Definition pragma.hpp:42
#define END_IGNORE_DIAGNOSTIC_GCC
Definition pragma.hpp:43
Definition gtest_pred_impl_unittest.cc:54
Definition view.hpp:11