Tatooine
transposed_tensor.h
Go to the documentation of this file.
1#ifndef TATOOINE_TRANSPOSED_TENSOR_H
2#define TATOOINE_TRANSPOSED_TENSOR_H
3//==============================================================================
5#include <tatooine/concepts.h>
6#include <tatooine/concepts.h>
9//==============================================================================
10namespace tatooine {
11//==============================================================================
12template <static_tensor Tensor>
14 static auto constexpr rank() { return std::decay_t<Tensor>::rank(); }
15 static auto constexpr dimensions() {
16 auto dims = std::decay_t<Tensor>::dimensions();
17 std::reverse(begin(dims), end(dims));
18 return dims;
19 }
20 static auto constexpr dimension(std::size_t const i) {
21 return std::decay_t<Tensor>::dimension(rank() - i - 1);
22 }
23 static auto constexpr is_tensor() { return true; }
24 static auto constexpr is_static() { return true; }
25 static auto constexpr is_transposed() { return true; }
26 using value_type = typename std::decay_t<Tensor>::value_type;
27 //============================================================================
28 private:
30
31 //============================================================================
32 public:
33 constexpr explicit transposed_static_tensor(static_tensor auto&& t)
34 : m_internal_tensor{std::forward<decltype(t)>(t)} {}
35 //----------------------------------------------------------------------------
36 auto constexpr at(integral auto const... is) const -> decltype(auto) {
37 return invoke_reversed(
38 [this](auto const... is) -> decltype(auto) {
39 return internal_tensor()(is...);
40 },
41 is...);
42 }
43 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
44 auto constexpr at(integral auto const... is) -> decltype(auto) {
45 return invoke_reversed(
46 [this](auto const... is) -> decltype(auto) {
47 return internal_tensor()(is...);
48 },
49 is...);
50 }
51 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
52 auto constexpr operator()(integral auto const... is) const -> decltype(auto) {
53 return at(is...);
54 }
55 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
56 auto constexpr operator()(integral auto const... is) -> decltype(auto) {
57 return at(is...);
58 }
59 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
60 auto constexpr at(integral_range auto is) const -> decltype(auto) {
61 std::reverse(begin(is), end(is));
62 return internal_tensor()(is);
63 }
64 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
65 auto constexpr at(integral_range auto is) -> decltype(auto) {
66 std::reverse(begin(is), end(is));
67 return internal_tensor()(is);
68 }
69 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
70 auto constexpr operator()(integral_range auto is) const -> decltype(auto) {
71 std::reverse(begin(is), end(is));
72 return internal_tensor()(is);
73 }
74 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
75 auto constexpr operator()(integral_range auto is) -> decltype(auto) {
76 std::reverse(begin(is), end(is));
77 return internal_tensor()(is);
78 }
79 //----------------------------------------------------------------------------
80 auto internal_tensor() const -> auto const& { return m_internal_tensor; }
81 auto internal_tensor() -> auto& { return m_internal_tensor; }
82};
83//------------------------------------------------------------------------------
84template <static_tensor T>
86template <static_tensor T>
88template <static_tensor T>
90//==============================================================================
91// dynamic tensor
92//==============================================================================
93template <dynamic_tensor Tensor>
95 static auto constexpr is_tensor() { return true; }
96 static auto constexpr is_transposed() { return true; }
97 static auto constexpr is_dynamic() { return true; }
98 using value_type = typename std::decay_t<Tensor>::value_type;
99 //============================================================================
101 //============================================================================
103 : m_internal_tensor{std::forward<decltype(t)>(t)} {}
104 //============================================================================
105 auto internal_tensor() -> auto& { return m_internal_tensor; }
106 auto internal_tensor() const -> auto const& { return m_internal_tensor; }
107 //------------------------------------------------------------------------------
108 auto constexpr rank() const { return internal_tensor().rank(); }
109 auto constexpr dimensions() const {
110 auto s = internal_tensor().dimensions();
111 std::reverse(begin(s), end(s));
112 return s;
113 }
114 auto constexpr dimension(std::size_t const i) const {
115 return internal_tensor().dimension(rank() - i - 1);
116 }
117 //============================================================================
118 auto constexpr at(integral auto const... is) const -> decltype(auto) {
119 return invoke_reversed(
120 [this](auto const... is) -> decltype(auto) {
121 return internal_tensor()(is...);
122 },
123 is...);
124 }
125 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
126 auto constexpr at(integral auto const... is) -> decltype(auto) {
127 return invoke_reversed(
128 [this](auto const... is) -> decltype(auto) {
129 return internal_tensor()(is...);
130 },
131 is...);
132 }
133 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
134 auto constexpr operator()(integral auto const... is) const -> decltype(auto) {
135 return at(is...);
136 }
137 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
138 auto constexpr operator()(integral auto const... is) -> decltype(auto) {
139 return at(is...);
140 }
141 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
142 auto constexpr at(integral_range auto is) const -> decltype(auto) {
143 std::reverse(begin(is), end(is));
144 return internal_tensor()(is);
145 }
146 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
147 auto constexpr at(integral_range auto is) -> decltype(auto) {
148 std::reverse(begin(is), end(is));
149 return internal_tensor()(is);
150 }
151 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
152 auto constexpr operator()(integral_range auto is) const -> decltype(auto) {
153 std::reverse(begin(is), end(is));
154 return internal_tensor()(is);
155 }
156 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
157 auto constexpr operator()(integral_range auto is) -> decltype(auto) {
158 std::reverse(begin(is), end(is));
159 return internal_tensor()(is);
160 }
161};
162//------------------------------------------------------------------------------
163template <dynamic_tensor T>
165template <dynamic_tensor T>
167template <dynamic_tensor T>
169//==============================================================================
171 return transposed_dynamic_tensor{std::forward<decltype(t)>(t)};
172}
173//------------------------------------------------------------------------------
174template <static_tensor T>
175requires (!transposed_tensor<T>)
176auto constexpr transposed(T&& t) {
177 return transposed_static_tensor{std::forward<T>(t)};
178}
179//------------------------------------------------------------------------------
180auto constexpr transposed(transposed_tensor auto&& t) -> decltype(auto) {
181 return t.internal_tensor();
182}
183//==============================================================================
184} // namespace tatooine
185//==============================================================================
186#endif
Definition: tensor_concepts.h:17
Definition: concepts.h:91
Definition: concepts.h:21
Definition: tensor_concepts.h:20
Definition: tensor_concepts.h:93
Definition: algorithm.h:6
auto constexpr invoke_reversed(auto &&f, auto &&param0) -> decltype(auto)
Definition: invoke_reversed.h:9
auto begin(Range &&range)
Definition: iterator_facade.h:318
auto end(Range &&range)
Definition: iterator_facade.h:322
auto transposed(dynamic_tensor auto &&t)
Definition: transposed_tensor.h:170
static constexpr forward_tag forward
Definition: tags.h:9
Definition: transposed_tensor.h:94
transposed_dynamic_tensor(dynamic_tensor auto &&t)
Definition: transposed_tensor.h:102
auto constexpr at(integral auto const ... is) -> decltype(auto)
Definition: transposed_tensor.h:126
auto constexpr at(integral_range auto is) const -> decltype(auto)
Definition: transposed_tensor.h:142
auto constexpr operator()(integral_range auto is) -> decltype(auto)
Definition: transposed_tensor.h:157
auto constexpr operator()(integral auto const ... is) const -> decltype(auto)
Definition: transposed_tensor.h:134
auto constexpr operator()(integral auto const ... is) -> decltype(auto)
Definition: transposed_tensor.h:138
auto internal_tensor() -> auto &
Definition: transposed_tensor.h:105
auto constexpr operator()(integral_range auto is) const -> decltype(auto)
Definition: transposed_tensor.h:152
typename std::decay_t< Tensor >::value_type value_type
Definition: transposed_tensor.h:98
Tensor m_internal_tensor
Definition: transposed_tensor.h:100
auto constexpr at(integral_range auto is) -> decltype(auto)
Definition: transposed_tensor.h:147
auto constexpr rank() const
Definition: transposed_tensor.h:108
auto constexpr dimension(std::size_t const i) const
Definition: transposed_tensor.h:114
static auto constexpr is_transposed()
Definition: transposed_tensor.h:96
auto internal_tensor() const -> auto const &
Definition: transposed_tensor.h:106
static auto constexpr is_dynamic()
Definition: transposed_tensor.h:97
static auto constexpr is_tensor()
Definition: transposed_tensor.h:95
auto constexpr at(integral auto const ... is) const -> decltype(auto)
Definition: transposed_tensor.h:118
auto constexpr dimensions() const
Definition: transposed_tensor.h:109
Definition: transposed_tensor.h:13
typename std::decay_t< Tensor >::value_type value_type
Definition: transposed_tensor.h:26
auto constexpr operator()(integral auto const ... is) const -> decltype(auto)
Definition: transposed_tensor.h:52
auto constexpr operator()(integral_range auto is) -> decltype(auto)
Definition: transposed_tensor.h:75
static auto constexpr is_tensor()
Definition: transposed_tensor.h:23
auto constexpr operator()(integral auto const ... is) -> decltype(auto)
Definition: transposed_tensor.h:56
auto internal_tensor() -> auto &
Definition: transposed_tensor.h:81
auto constexpr at(integral auto const ... is) const -> decltype(auto)
Definition: transposed_tensor.h:36
static auto constexpr is_transposed()
Definition: transposed_tensor.h:25
static auto constexpr dimensions()
Definition: transposed_tensor.h:15
static auto constexpr rank()
Definition: transposed_tensor.h:14
auto internal_tensor() const -> auto const &
Definition: transposed_tensor.h:80
static auto constexpr dimension(std::size_t const i)
Definition: transposed_tensor.h:20
Tensor m_internal_tensor
Definition: transposed_tensor.h:29
auto constexpr at(integral_range auto is) const -> decltype(auto)
Definition: transposed_tensor.h:60
constexpr transposed_static_tensor(static_tensor auto &&t)
Definition: transposed_tensor.h:33
auto constexpr at(integral_range auto is) -> decltype(auto)
Definition: transposed_tensor.h:65
auto constexpr operator()(integral_range auto is) const -> decltype(auto)
Definition: transposed_tensor.h:70
auto constexpr at(integral auto const ... is) -> decltype(auto)
Definition: transposed_tensor.h:44
static auto constexpr is_static()
Definition: transposed_tensor.h:24