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_TENSOR_VIEWS_VIEW_H
4#define pRC_TENSOR_TRAIN_TENSOR_VIEWS_VIEW_H
5
11
13{
14 template<class T, Size... Ns, Size... Rs, class F>
15 requires IsDefined<Tensor<T, Sizes<Ns...>, Sizes<Rs...>>>
16 class View<T, Sizes<Ns...>, Sizes<Rs...>, F> : public CRTP<F>
17 {
18 public:
19 using N = pRC::Sizes<Ns...>;
20 using L = N;
21 using Sizes = N;
22
26
27 static constexpr auto Dimension = N::Dimension;
28
29 using Ranks = pRC::Sizes<Rs...>;
30 template<class S>
31 requires(S::Dimension == Ranks::Dimension)
33
34 template<Index C>
36 N::size(C), pRC::Sizes<1, Rs..., 1>::size(C + 1)>;
37
38 using Type = T;
39 template<class C>
41
42 static constexpr auto n()
43 requires requires { N::size(); }
44 {
45 return N::size();
46 }
47
48 static constexpr auto n(Index const dimension)
49 {
50 return N::size(dimension);
51 }
52
53 static constexpr auto size()
54 requires requires { Sizes::size(); }
55 {
56 return Sizes::size();
57 }
58
59 static constexpr auto size(Index const dimension)
60 {
61 return Sizes::size(dimension);
62 }
63
64 template<class X, IsConvertible<Index>... Is>
65 requires IsConstructible<T, X> && (sizeof...(Is) == Dimension)
66 static constexpr auto Single(X &&value, Is const... indices)
67 {
68 return Tensor<T, N, Ranks>::Single(forward<X>(value), indices...);
69 }
70
71 template<class X>
73 static constexpr auto Single(X &&value, Subscripts const &subscripts)
74 {
75 return Tensor<T, N, Ranks>::Single(forward<X>(value), subscripts);
76 }
77
78 public:
79 template<Index C>
80 constexpr decltype(auto) core()
81 {
82 return this->self().template core<C>();
83 }
84
85 template<Index C>
86 constexpr decltype(auto) core() const
87 {
88 return this->self().template core<C>();
89 }
90
91 template<IsConvertible<Index>... Is>
92 requires(sizeof...(Is) == Dimension)
93 constexpr auto operator()(Is const... indices)
94 {
96 [this, &indices...](auto const... seq)
97 {
98 return fold<Mul, true, Direction::Backwards>(
99 chip<1>(this->template core<seq>(), indices)...)(0, 0);
100 });
101 }
102
103 template<IsConvertible<Index>... Is>
104 requires(sizeof...(Is) == Dimension)
105 constexpr auto operator()(Is const... indices) const
106 {
108 [this, &indices...](auto const... seq)
109 {
110 return fold<Mul, true, Direction::Backwards>(
111 chip<1>(this->template core<seq>(), indices)...)(0, 0);
112 });
113 }
114
115 constexpr decltype(auto) operator()(Subscripts const &subscripts)
116 {
118 [this, &subscripts](auto const... seq) -> decltype(auto)
119 {
120 return (*this)(subscripts[seq]...);
121 });
122 }
123
124 constexpr decltype(auto) operator()(Subscripts const &subscripts) const
125 {
127 [this, &subscripts](auto const... seq) -> decltype(auto)
128 {
129 return (*this)(subscripts[seq]...);
130 });
131 }
132
133 template<class X>
134 requires requires { typename pRC::Tensor<T, Ns...>; } &&
135 IsSame<X, pRC::Tensor<T, Ns...>>
136 explicit constexpr operator X()
137 {
138 pRC::Tensor<T, Ns...> full;
139
141 [this, &full](auto const... indices)
142 {
143 full(indices...) = (*this)(indices...);
144 });
145
146 return full;
147 }
148
149 template<class X>
150 requires requires { typename pRC::Tensor<T, Ns...>; } &&
151 IsSame<X, pRC::Tensor<T, Ns...>>
152 explicit constexpr operator X() const
153 {
154 pRC::Tensor<T, Ns...> full;
155
157 [this, &full](auto const... indices)
158 {
159 full(indices...) = (*this)(indices...);
160 });
161
162 return full;
163 }
164
165 protected:
166 ~View() = default;
167 constexpr View(View const &) = default;
168 constexpr View(View &&) = default;
169 constexpr View &operator=(View const &) = delete;
170 constexpr View &operator=(View &&) = delete;
171 constexpr View() = default;
172 };
173}
174
175namespace pRC
176{
177 template<class T, Size... Ns, class R, class F>
179 -> Tensor<T, Ns...>;
180}
181#endif // pRC_TENSOR_TRAIN_TENSOR_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 size(Index const dimension)
Definition view.hpp:59
constexpr auto operator()(Is const ... indices) const
Definition view.hpp:105
constexpr auto operator()(Is const ... indices)
Definition view.hpp:93
static constexpr auto Single(X &&value, Subscripts const &subscripts)
Definition view.hpp:73
static constexpr auto n(Index const dimension)
Definition view.hpp:48
constexpr decltype(auto) core() const
Definition view.hpp:86
Definition declarations.hpp:21
Definition declarations.hpp:16
Definition tensor.hpp:25
static constexpr auto size()
Definition tensor.hpp:39
static constexpr auto Single(X &&value, Is const ... indices)
Definition tensor.hpp:51
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:19
Tensor(TensorViews::View< T, N, Ranks, F > const &) -> Tensor< T, 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 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