cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
view.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_TENSOR_TRAIN_OPERATOR_VIEWS_VIEW_H
4#define pRC_TENSOR_TRAIN_OPERATOR_VIEWS_VIEW_H
5
11
13{
14 template<class T, Size... Ms, Size... Ns, Size... Rs, class F>
15 requires IsDefined<
16 Operator<T, Sizes<Ms...>, Sizes<Ns...>, Sizes<Rs...>>>
17 class View<T, Sizes<Ms...>, Sizes<Ns...>, Sizes<Rs...>, F> : public CRTP<F>
18 {
19 public:
20 using M = pRC::Sizes<Ms...>;
21 using N = pRC::Sizes<Ns...>;
22 using L = pRC::Sizes<(Ms * Ns)...>;
23 using Sizes = pRC::Sizes<Ms..., Ns...>;
24
27 using SubscriptsL = pRC::Subscripts<(Ms * Ns)...>;
28 using Subscripts = pRC::Subscripts<Ms..., Ns...>;
29
30 static constexpr auto Dimension = N::Dimension;
31
32 using Ranks = pRC::Sizes<Rs...>;
33 template<class S>
34 requires(S::Dimension == Ranks::Dimension)
36
37 template<Index C>
39 M::size(C), N::size(C), pRC::Sizes<1, Rs..., 1>::size(C + 1)>;
40
41 using Type = T;
42 template<class C>
44
45 static constexpr auto m()
46 requires requires { M::size(); }
47 {
48 return M::size();
49 }
50
51 static constexpr auto m(Index const dimension)
52 {
53 return M::size(dimension);
54 }
55
56 static constexpr auto n()
57 requires requires { N::size(); }
58 {
59 return N::size();
60 }
61
62 static constexpr auto n(Index const dimension)
63 {
64 return N::size(dimension);
65 }
66
67 static constexpr auto size()
68 requires requires { Sizes::size(); }
69 {
70 return Sizes::size();
71 }
72
73 static constexpr auto size(Index const dimension)
74 {
75 return Sizes::size(dimension);
76 }
77
78 template<class X, IsConvertible<Index>... Is>
79 requires IsConstructible<T, X> && (sizeof...(Is) == 2 * Dimension)
80 static constexpr auto Single(X &&value, Is const... indices)
81 {
82 return Operator<T, M, N, Ranks>::Single(forward<X>(value),
83 indices...);
84 }
85
86 template<class X>
88 static constexpr auto Single(X &&value, Subscripts const &subscripts)
89 {
90 return Operator<T, M, N, Ranks>::Single(forward<X>(value),
91 subscripts);
92 }
93
94 template<class X>
96 static constexpr auto Single(X &&value, SubscriptsM const &is,
97 SubscriptsN const &js)
98 {
99 return Operator<T, M, N, Ranks>::Single(forward<X>(value), is, js);
100 }
101
102 public:
103 template<Index C>
104 constexpr decltype(auto) core()
105 {
106 return this->self().template core<C>();
107 }
108
109 template<Index C>
110 constexpr decltype(auto) core() const
111 {
112 return this->self().template core<C>();
113 }
114
115 template<IsConvertible<Index>... Is>
116 requires(sizeof...(Is) == 2 * Dimension)
117 constexpr decltype(auto) operator()(Is const... indices)
118 {
119 return (*this)(Subscripts(indices...));
120 }
121
122 template<IsConvertible<Index>... Is>
123 requires(sizeof...(Is) == 2 * Dimension)
124 constexpr decltype(auto) operator()(Is const... indices) const
125 {
126 return (*this)(Subscripts(indices...));
127 }
128
129 constexpr decltype(auto) operator()(Subscripts const &subscripts)
130 {
132 [this, &subscripts](auto const... seq) -> decltype(auto)
133 {
134 return (*this)(SubscriptsM(subscripts[seq]...),
135 SubscriptsN(subscripts[seq + Dimension]...));
136 });
137 }
138
139 constexpr decltype(auto) operator()(Subscripts const &subscripts) const
140 {
142 [this, &subscripts](auto const... seq) -> decltype(auto)
143 {
144 return (*this)(SubscriptsM(subscripts[seq]...),
145 SubscriptsN(subscripts[seq + Dimension]...));
146 });
147 }
148
149 constexpr auto operator()(SubscriptsM const &is, SubscriptsN const &js)
150 {
152 [this, &is, &js](auto const... seq)
153 {
155 this->template core<seq>(), is[seq], js[seq])...)(0, 0);
156 });
157 }
158
159 constexpr auto operator()(SubscriptsM const &is,
160 SubscriptsN const &js) const
161 {
163 [this, &is, &js](auto const... seq)
164 {
166 this->template core<seq>(), is[seq], js[seq])...)(0, 0);
167 });
168 }
169
170 template<class X>
171 requires requires { typename pRC::Tensor<T, Ms..., Ns...>; } &&
172 IsSame<X, pRC::Tensor<T, Ms..., Ns...>>
173 explicit constexpr operator X()
174 {
175 pRC::Tensor<T, Ms..., Ns...> full;
176
178 [this, &full](auto const... indices)
179 {
180 full(indices...) = (*this)(indices...);
181 });
182
183 return full;
184 }
185
186 template<class X>
187 requires requires { typename pRC::Tensor<T, Ms..., Ns...>; } &&
188 IsSame<X, pRC::Tensor<T, Ms..., Ns...>>
189 explicit constexpr operator X() const
190 {
191 pRC::Tensor<T, Ms..., Ns...> full;
192
194 [this, &full](auto const... indices)
195 {
196 full(indices...) = (*this)(indices...);
197 });
198
199 return full;
200 }
201
202 protected:
203 ~View() = default;
204 constexpr View(View const &) = default;
205 constexpr View(View &&) = default;
206 constexpr View &operator=(View const &) = delete;
207 constexpr View &operator=(View &&) = delete;
208 constexpr View() = default;
209 };
210}
211
212namespace pRC
213{
214 template<class T, Size... Ms, Size... Ns, class R, class F>
216 F> const &) -> Tensor<T, Ms..., Ns...>;
217}
218#endif // pRC_TENSOR_TRAIN_OPERATOR_VIEWS_VIEW_H
Definition crtp.hpp:12
Definition value.hpp:12
Definition sequence.hpp:29
static constexpr auto size()
Definition sequence.hpp:69
Definition subscripts.hpp:21
static constexpr auto m(Index const dimension)
Definition view.hpp:51
static constexpr auto n(Index const dimension)
Definition view.hpp:62
static constexpr auto size(Index const dimension)
Definition view.hpp:73
static constexpr auto Single(X &&value, SubscriptsM const &is, SubscriptsN const &js)
Definition view.hpp:96
constexpr auto operator()(SubscriptsM const &is, SubscriptsN const &js) const
Definition view.hpp:159
static constexpr auto Single(X &&value, Subscripts const &subscripts)
Definition view.hpp:88
constexpr auto operator()(SubscriptsM const &is, SubscriptsN const &js)
Definition view.hpp:149
Definition declarations.hpp:25
Definition declarations.hpp:20
Definition tensor.hpp:25
static constexpr auto size()
Definition tensor.hpp:39
Definition concepts.hpp:37
Definition concepts.hpp:28
pRC::Float<> T
Definition externs_nonTT.hpp:1
int value
Definition gmock-actions_test.cc:1714
Definition declarations.hpp:23
Operator(OperatorViews::View< T, M, N, Ranks, F > const &) -> Operator< T, M, N, Ranks >
Definition cholesky.hpp:10
Size Index
Definition basics.hpp:32
std::size_t Size
Definition basics.hpp:31
Tensor(TensorViews::View< T, Sizes< Ns... >, F > const &) -> Tensor< T, Ns... >
Sequence< Size, Ns... > Sizes
Definition sequence.hpp:100
static constexpr auto makeSeries()
Definition sequence.hpp:390
static constexpr decltype(auto) fold(X &&a)
Definition fold.hpp:14
static constexpr auto chip(Sequence< T, Is... > const)
Definition sequence.hpp:584
static constexpr auto range(F &&f, Xs &&...args)
Definition range.hpp:18
static constexpr decltype(auto) expand(Sequence< T, Seq... > const, F &&f, Xs &&...args)
Definition sequence.hpp:383