1#ifndef TATOOINE_BASE_TENSOR_H
2#define TATOOINE_BASE_TENSOR_H
18template <
typename Tensor, arithmetic_or_complex ValueType,
19 std::size_t FixedDim, std::size_t... Dims>
22template <
typename Tensor, arithmetic_or_complex ValueType, std::size_t... Dims>
36 static_assert(is_arithmetic<ValueType> || is_complex<ValueType>,
37 "A tensor can only hold real or complex values.");
38 static_assert(
sizeof...(Dims) > 0,
39 "base tensor needs to have more than one dimension defined.");
41 static auto constexpr rank() {
return sizeof...(Dims); }
47 static auto constexpr dimensions() {
return std::array{Dims...}; }
49 static auto constexpr dimension(std::size_t
const i) {
53 static auto constexpr is_static() ->
bool {
return true; }
54 static auto constexpr is_tensor() ->
bool {
return true; }
59 for_loop(std::forward<
decltype(f)>(f), Dims...);
64 template <static_tensor Other>
65 requires(same_dimensions<this_type, Other>()) &&
68 assign(std::forward<Other>(other));
71 template <static_tensor Other>
72 requires(same_dimensions<this_type, Other>()) &&
75 assign(std::forward<Other>(other));
79 template <static_tensor Other>
80 requires(same_dimensions<this_type, Other>()) &&
82 auto constexpr assign(Other&& other) ->
void {
89 requires(
sizeof...(Is) ==
rank())
90 auto constexpr at(Is
const... ) {
95 requires(
sizeof...(Is) ==
rank())
96 auto constexpr at(Is
const... )
const {
101 requires(
sizeof...(Is) ==
rank())
102 auto constexpr operator()(Is
const... is)
const {
107 requires(
sizeof...(Is) ==
rank())
108 auto constexpr operator()(Is
const... is) {
112 auto constexpr at(
integral auto const... is)
const ->
decltype(
auto)
113 requires(
sizeof...(is) ==
rank())
118 auto constexpr at(
integral auto const... is) ->
decltype(
auto)
119 requires(
sizeof...(is) ==
rank())
124 template <std::size_t... Seq>
126 std::index_sequence<Seq...> ) ->
decltype(
auto) {
127 return at(is[Seq]...);
130 template <std::size_t... Seq>
132 std::index_sequence<Seq...> )
const
134 return at(is[Seq]...);
139 assert(is.size() ==
rank());
140 return at(is, std::make_index_sequence<
rank()>{});
144 assert(is.size() ==
rank());
145 return at(is, std::make_index_sequence<
rank()>{});
149 requires(
sizeof...(is) ==
rank())
155 requires(
sizeof...(is) ==
rank())
160 template <std::size_t FixedDim, std::size_t... Is>
161 auto constexpr slice(std::size_t fixed_index, std::index_sequence<Is...>)
163 if constexpr (
rank() > 1) {
166 "Fixed dimensions must be in range of number of dimensions.");
171 return at(fixed_index);
175 template <std::
size_t FixedDim>
176 auto constexpr slice(std::size_t fixed_index) ->
decltype(
auto) {
177 if constexpr (
rank() > 1) {
180 "Fixed dimensions must be in range of number of dimensions.");
181 return slice<FixedDim>(fixed_index,
182 std::make_index_sequence<
rank() - 1>{});
184 return at(fixed_index);
188 template <std::size_t FixedDim, std::size_t... Is>
189 auto constexpr slice(std::size_t fixed_index,
190 std::index_sequence<Is...>)
const {
191 static_assert(FixedDim <
rank(),
192 "fixed dimensions must be in range of number of dimensions");
198 template <std::
size_t FixedDim>
199 [[nodiscard]]
auto constexpr slice(std::size_t fixed_index)
const {
200 static_assert(FixedDim <
rank(),
201 "fixed dimensions must be in range of number of dimensions");
202 return slice<FixedDim>(fixed_index, std::make_index_sequence<
rank() - 1>{});
207 static_assert(
sizeof...(is) ==
rank(),
208 "number of indices does not match number of dimensions");
213 template <
typename OtherTensor,
typename OtherValueType>
217 at(is...) +=
static_cast<ValueType
>(other(is...));
227 template <
typename OtherTensor,
typename OtherValueType>
231 at(is...) -=
static_cast<ValueType
>(other(is...));
254 if (std::isnan(
at(is...))) {
266 if (std::isinf(
at(is...))) {
276template <arithmetic_or_complex ValueType, std::size_t... Dims>
278template <arithmetic_or_complex ValueType, std::
size_t M, std::
size_t N>
280template <arithmetic_or_complex ValueType, std::
size_t N>
Definition: concepts.h:39
Definition: concepts.h:91
Definition: concepts.h:21
Definition: concepts.h:121
Definition: algorithm.h:6
typename value_type_impl< T >::type value_type
Definition: type_traits.h:280
tensor< real_number, Dimensions... > Tensor
Definition: tensor.h:184
constexpr auto sliced_indices()
creates an index sequence and removes an element from it
Definition: utility.h:33
constexpr auto for_loop(Iteration &&iteration, execution_policy::sequential_t, Ranges(&&... ranges)[2]) -> void
Use this function for creating a sequential nested loop.
Definition: for_loop.h:336
Definition: base_tensor.h:23
static auto constexpr rank()
Definition: base_tensor.h:41
auto constexpr slice(std::size_t fixed_index, std::index_sequence< Is... >) -> decltype(auto)
Definition: base_tensor.h:161
auto operator+=(base_tensor< OtherTensor, OtherValueType, Dims... > const &other) -> auto &
Definition: base_tensor.h:214
auto constexpr at(integral_range auto const &is, std::index_sequence< Seq... >) -> decltype(auto)
Definition: base_tensor.h:125
auto constexpr assign(Other &&other) -> void
Definition: base_tensor.h:82
auto constexpr at(integral_range auto const &is) const -> decltype(auto)
Definition: base_tensor.h:143
auto constexpr at(integral_range auto const &is) -> decltype(auto)
Definition: base_tensor.h:138
auto constexpr at(integral_range auto const &is, std::index_sequence< Seq... >) const -> decltype(auto)
Definition: base_tensor.h:131
auto isinf() const
Definition: base_tensor.h:263
auto constexpr at(integral auto const ... is) -> decltype(auto) requires(sizeof...(is)==rank())
Definition: base_tensor.h:118
auto constexpr slice(std::size_t fixed_index) const
Definition: base_tensor.h:199
auto operator/=(convertible_to< ValueType > auto const &other) -> auto &
Definition: base_tensor.h:246
static auto constexpr dimension(std::size_t const i)
Definition: base_tensor.h:49
auto operator-=(base_tensor< OtherTensor, OtherValueType, Dims... > const &other) -> auto &
Definition: base_tensor.h:228
ValueType value_type
Definition: base_tensor.h:24
auto operator-=(convertible_to< ValueType > auto const &other) -> auto &
Definition: base_tensor.h:236
constexpr base_tensor(Other &&other)
Definition: base_tensor.h:67
auto constexpr slice(std::size_t fixed_index) -> decltype(auto)
Definition: base_tensor.h:176
auto constexpr at(Is const ...) const
Definition: base_tensor.h:96
auto operator+=(convertible_to< ValueType > auto const &other) -> auto &
Definition: base_tensor.h:222
auto isnan() const
Definition: base_tensor.h:251
static auto constexpr array_index(integral auto const ... is)
Definition: base_tensor.h:206
static auto constexpr num_components()
Definition: base_tensor.h:43
auto constexpr operator()(integral auto const ... is) -> decltype(auto) requires(sizeof...(is)==rank())
Definition: base_tensor.h:154
auto constexpr operator()(integral auto const ... is) const -> decltype(auto) requires(sizeof...(is)==rank())
Definition: base_tensor.h:148
auto constexpr slice(std::size_t fixed_index, std::index_sequence< Is... >) const
Definition: base_tensor.h:189
static auto constexpr is_static() -> bool
Definition: base_tensor.h:53
auto operator*=(convertible_to< ValueType > auto const &other) -> auto &
Definition: base_tensor.h:241
auto constexpr operator=(Other &&other) -> base_tensor &
Definition: base_tensor.h:74
static auto constexpr is_tensor() -> bool
Definition: base_tensor.h:54
static auto constexpr for_indices(invocable< decltype(Dims)... > auto &&f)
Definition: base_tensor.h:58
constexpr base_tensor()=default
static auto constexpr dimensions()
Definition: base_tensor.h:47
auto constexpr at(integral auto const ... is) const -> decltype(auto) requires(sizeof...(is)==rank())
Definition: base_tensor.h:112
static auto constexpr indices()
Definition: base_tensor.h:56
auto constexpr at(Is const ...)
Definition: base_tensor.h:90
constexpr auto as_derived() -> derived_type &
returns casted as_derived data
Definition: crtp.h:11
type_list< Indices... > indices
Definition: indexed_dynamic_tensor.h:41
Definition: indexed_static_tensor.h:22
Definition: static_multidim_size.h:81
static auto constexpr num_components()
Definition: static_multidim_size.h:83
Definition: tensor_slice.h:13
Definition: index_order.h:17