1#ifndef TATOOINE_DYNAMIC_TENSOR_H
2#define TATOOINE_DYNAMIC_TENSOR_H
12template <arithmetic_or_complex T>
23 using parent_type::operator();
46 template <
typename RandEng = std::mt19937_64>
48 RandEng&& eng = RandEng{std::random_device{}()}) {
54 template <
typename RandEng = std::mt19937_64>
56 RandEng&& eng = RandEng{std::random_device{}()}) {
62 template <
typename RandEng = std::mt19937_64>
65 T(0), T(1), RandEng{std::random_device{}()}},
69 template <
typename RandEng = std::mt19937_64>
70 static auto randn(T
const mean, T
const stddev,
72 RandEng&& eng = RandEng{std::random_device{}()}) {
78 template <
typename RandEng = std::mt19937_64>
80 RandEng&& eng = RandEng{std::random_device{}()}) {
86 template <
typename RandEng = std::mt19937_64>
89 T(1), T(1), RandEng{std::random_device{}()}},
93 template <random_number_generator Rand,
integral_range Size>
95 return this_type{std::forward<Rand>(rand), std::forward<Size>(
size)};
98 template <random_number_generator Rand>
104 return vander(v, std::ranges::size(v));
107 template <arithmetic Real_, std::
size_t N>
114 auto V =
this_type{std::ranges::size(v), degree};
115 auto factor_up_row = [row = 0ul, &V, degree](
auto const x)
mutable {
117 for (std::size_t col = 1; col < degree; ++col) {
118 V(row, col) = V(row, col - 1) * x;
122 auto v_it =
begin(v);
123 for (std::size_t i = 0; i < degree; ++i, ++v_it) {
124 factor_up_row(
static_cast<T
>(*v_it));
159 template <random_number_generator Rand>
163 template <random_number_generator Rand,
integral_range Dimensions>
168 template <general_tensor OtherTensor>
174 template <convertible_to<T>... Components>
175 explicit tensor(Components&&... components)
requires(
177 :
parent_type{std::vector<T>{std::forward<Components>(components)...},
178 sizeof...(Components)} {}
181 template <
floating_po
int_range Components>
190 auto insert_row = [r = std::size_t(0),
this](
auto const& row)
mutable {
191 for (std::size_t c = 0; c < N; ++c) {
192 at(r, c) =
static_cast<T
>(row[c]);
202 template <general_tensor OtherTensor>
205 if (
this == &other.internal_tensor()) {
206 assing_self_transposed(other);
218 this->resize(other.dimensions());
219 for (std::size_t col = 0; col < this->
size(1); ++col) {
220 for (std::size_t row = col + 1; row < this->
size(0); ++row) {
221 std::swap(this->
at(row, col),
222 this->
data(old_size.plain_index(col, row)));
229 this->resize(other.dimensions());
230 auto const s = this->
size();
233 std::accumulate(
begin(s),
end(s), std::size_t(1), std::multiplies<std::size_t>{});
234 auto cnt = std::size_t(0);
235 auto is = std::vector<std::size_t>(r, 0);
237 while (cnt < max_cnt) {
238 this->
at(is) = other(is);
241 for (std::size_t i = 0; i < r - 1; ++i) {
260 auto at(Is
const... ) {
261 assert(
rank() == 0 ||
sizeof...(Is) ==
rank());
266 auto at(Is
const... )
const {
267 assert(
rank() == 0 ||
sizeof...(Is) ==
rank());
272 assert(
rank() == 0 ||
sizeof...(is) ==
rank());
277 assert(
rank() == 0 ||
sizeof...(is) ==
rank());
282 assert(
rank() == 0 ||
sizeof...(is) ==
rank());
287 assert(
rank() == 0 ||
sizeof...(is) ==
rank());
292 assert(
rank() == 0 ||
sizeof...(is) ==
rank());
297 assert(
rank() == 0 ||
sizeof...(is) ==
rank());
302template <
typename... Rows, std::size_t N>
305template <
typename... Ts>
308template <dynamic_tensor Tensor>
Definition: dynamic_multidim_array.h:18
Definition: dynamic_multidim_size.h:16
static std::size_t constexpr num_dimensions()
Definition: static_multidim_array.h:29
static auto constexpr size()
Definition: static_multidim_array.h:30
constexpr auto data() -> ValueType *
Definition: static_multidim_array.h:260
Definition: concepts.h:36
Definition: concepts.h:87
Definition: tensor_concepts.h:17
Definition: tensor_concepts.h:9
Definition: concepts.h:91
Definition: concepts.h:21
Definition: tensor_concepts.h:93
static constexpr zeros_t zeros
Definition: tags.h:103
static constexpr ones_t ones
Definition: tags.h:106
Definition: algorithm.h:6
typename common_type_impl< Ts... >::type common_type
Definition: common_type.h:23
auto begin(Range &&range)
Definition: iterator_facade.h:318
auto end(Range &&range)
Definition: iterator_facade.h:322
constexpr auto max(A &&a, B &&b)
Definition: math.h:20
constexpr auto min(A &&a, B &&b)
Definition: math.h:15
constexpr void for_each(F &&f, Ts &&... ts)
Definition: utility.h:39
static constexpr forward_tag forward
Definition: tags.h:9
auto constexpr assign(Other &&other) -> void
Definition: base_tensor.h:82
static auto constexpr dimensions()
Definition: base_tensor.h:47
Definition: indexed_dynamic_tensor.h:28
Definition: dynamic_tensor.h:13
static auto rand(Rand &&rand, integral auto const ... size)
Definition: dynamic_tensor.h:99
tensor(integral auto const ... dimensions)
Definition: dynamic_tensor.h:142
static auto randn(integral_range auto const &size, T mean=0, T stddev=1, RandEng &&eng=RandEng{std::random_device{}()})
Definition: dynamic_tensor.h:79
auto assing_self_transposed(general_tensor auto const &other)
Definition: dynamic_tensor.h:216
static auto vander(arithmetic_range auto const &v)
Definition: dynamic_tensor.h:103
auto operator()(einstein_notation::index auto const ... is)
Definition: dynamic_tensor.h:276
auto dimensions() const
Definition: dynamic_tensor.h:255
tensor(tag::zeros_t tag, integral auto... dimensions)
Definition: dynamic_tensor.h:153
static auto vander(vec< Real_, N > const &v)
Definition: dynamic_tensor.h:108
static auto randu(integral_range auto const &size, T min=0, T max=1, RandEng &&eng=RandEng{std::random_device{}()})
Definition: dynamic_tensor.h:55
auto rank() const
Definition: dynamic_tensor.h:257
static auto ones(integral_range auto const &size)
Definition: dynamic_tensor.h:42
tensor(Components &&components)
Constructs a rank 1 tensor aka vector.
Definition: dynamic_tensor.h:182
auto operator()(einstein_notation::index auto const ... is) const
Definition: dynamic_tensor.h:271
tensor(Rows(&&... rows)[N])
Constructs a rank 2 tensor aka matrix.
Definition: dynamic_tensor.h:187
tensor(Components &&... components)
Constructs a rank 1 tensor aka vector.
Definition: dynamic_tensor.h:175
tensor(Rand &&rand, integral auto const ... dimensions)
Definition: dynamic_tensor.h:160
tensor(tag::zeros_t tag, integral_range auto &&dimensions)
Definition: dynamic_tensor.h:156
static auto randu(integral auto const ... is)
Definition: dynamic_tensor.h:63
static auto zeros(integral auto const ... size)
Definition: dynamic_tensor.h:30
tensor(tensor &&other) noexcept=default
static auto zeros(integral_range auto const &size)
Definition: dynamic_tensor.h:34
auto dimension(std::size_t const i) const
Definition: dynamic_tensor.h:256
tensor(tensor const &other)=default
auto operator()(integral auto const ... is) const -> auto const &
Definition: dynamic_tensor.h:296
tensor(dynamic_tensor auto &&other)
Definition: dynamic_tensor.h:138
static auto randn(T const mean, T const stddev, integral_range auto const &size, RandEng &&eng=RandEng{std::random_device{}()})
Definition: dynamic_tensor.h:70
static auto constexpr is_tensor()
Definition: dynamic_tensor.h:25
tensor(tag::ones_t tag, integral auto... dimensions)
Definition: dynamic_tensor.h:147
static auto randn(integral auto const ... is)
Definition: dynamic_tensor.h:87
auto at(integral auto const ... is) const -> auto const &
Definition: dynamic_tensor.h:286
static auto ones(integral auto... size)
Definition: dynamic_tensor.h:38
auto at(Is const ...) const
Definition: dynamic_tensor.h:266
tensor(OtherTensor const &other)
Definition: dynamic_tensor.h:169
static auto constexpr is_dynamic()
Definition: dynamic_tensor.h:26
static auto randu(T const min, T const max, integral_range auto const &size, RandEng &&eng=RandEng{std::random_device{}()})
Definition: dynamic_tensor.h:47
auto assign(general_tensor auto const &other)
Definition: dynamic_tensor.h:228
auto at(integral auto const ... is) -> auto &
Definition: dynamic_tensor.h:281
auto operator=(tensor const &other) -> tensor &=default
auto operator()(integral auto const ... is) -> auto &
Definition: dynamic_tensor.h:291
static auto vander(arithmetic_range auto const &v, integral auto const degree)
Definition: dynamic_tensor.h:112
auto operator=(tensor &&other) noexcept -> tensor &=default
static auto rand(Rand &&rand, Size &&size)
Definition: dynamic_tensor.h:94
tensor(tag::ones_t tag, integral_range auto &&dimensions)
Definition: dynamic_tensor.h:150
auto at(Is const ...)
Definition: dynamic_tensor.h:260
tensor(Rand &&rand, Dimensions &&dimensions)
Definition: dynamic_tensor.h:164
auto operator=(OtherTensor const &other) -> tensor< T > &
Definition: dynamic_tensor.h:203
static auto constexpr rank()
Definition: base_tensor.h:41
auto constexpr at(integral auto const ... is) -> decltype(auto)
Definition: tensor.h:38
tensor< ValueType, Dims... > this_type
Definition: tensor.h:19
type_list_at< this_type, I > at
Definition: type_list.h:269