1#ifndef TATOOINE_DYNAMIC_MULTIDIM_ARRAY_H
2#define TATOOINE_DYNAMIC_MULTIDIM_ARRAY_H
17template <
typename ValueType,
typename IndexOrder = x_fastest>
45 template <
integral_range Size>
54 template <
integral_range Size>
59 template <
integral_range Size,
typename RandEng = std::mt19937_64>
61 RandEng&& eng = RandEng{std::random_device{}()}) {
63 min,
max, std::forward<RandEng>(eng)},
64 std::forward<Size>(
size)};
67 template <
integral_range Size,
typename RandEng = std::mt19937_64>
70 RandEng&& eng = RandEng{std::random_device{}()}) {
72 min,
max, std::forward<RandEng>(eng)},
73 std::forward<Size>(
size)};
76 template <
typename RandEng = std::mt19937_64>
80 RandEng{std::random_device{}()}},
84 template <
integral_range Size,
typename RandEng = std::mt19937_64>
86 RandEng&& eng = RandEng{std::random_device{}()}) {
88 mean, stddev, std::forward<RandEng>(eng)},
89 std::forward<Size>(
size)};
92 template <
integral_range Size,
typename RandEng = std::mt19937_64>
94 RandEng&& eng = RandEng{std::random_device{}()}) {
96 mean, stddev, std::forward<RandEng>(eng)},
97 std::forward<Size>(
size)};
100 template <
typename RandEng = std::mt19937_64>
104 RandEng{std::random_device{}()}},
108 template <
integral_range Size, random_number_generator Rand>
113 template <random_number_generator Rand>
131 template <
typename OtherT,
typename OtherIndexing>
138 template <
typename OtherT,
typename OtherIndexing>
143 begin(other.internal_container()),
end(other.internal_container()));
151 template <
typename S>
172 template <
integral_range Size>
177 template <
typename S,
integral_range Size>
182 template <
integral_range Size>
187 template <
integral_range Size>
192 template <
integral_range Size>
196 template <range_of<value_type> Data,
integral_range Size>
200 std::ranges::copy(std::forward<Data>(
data),
204 template <
integral_range Size, random_number_generator Rand>
210 [&](
auto const& ) {
return static_cast<value_type>(
rand.get()); });
213 template <random_number_generator Rand>
224 auto at(Int
const... is) ->
auto& {
231 auto at(Int
const... is)
const ->
auto const& {
275 auto const copy = *
this;
278 for (
auto const& is : copy.indices()) {
292 auto const copy = *
this;
295 for (
auto const& is : copy.indices()) {
311 [[nodiscard]]
constexpr auto data(std::size_t
const i) ->
auto& {
315 [[nodiscard]]
constexpr auto data(std::size_t
const i)
const ->
auto const& {
322 template <
typename F>
329 template <
typename F,
typename OtherT,
typename OtherIndexing>
332 assert(parent_type::operator==(other));
333 for (
auto const& is :
indices()) {
334 at(is) = f(
at(is), other(is));
341template <
typename ValueType,
typename IndexOrder>
345template <
typename ValueType,
typename IndexOrder>
349template <
typename ValueType,
typename UInt>
353template <
typename ValueType,
typename UInt>
357template <
typename ValueType,
typename UInt>
361template <
typename ValueType,
typename UInt, std::
size_t N>
365template <
typename ValueType,
typename UInt, std::
size_t N>
367 std::vector<ValueType>
const&)
370template <
typename ValueType,
typename UInt, std::
size_t N>
374template <
typename IndexingOut =
x_fastest,
typename T0,
typename T1,
375 typename Indexing0,
typename Indexing1,
typename FReal>
385 assert(arr0.dyn_size() == arr1.dyn_size());
389 for (
auto is : interpolated.indices()) {
390 interpolated(is) = interpolated(is) * (1 - factor) + arr1(is) * factor;
395template <
typename IndexingOut = x_fastest,
typename T0,
typename T1,
396 typename Indexing0,
typename Indexing1,
typename LinReal,
401 return interpolate<IndexingOut>(arr0, arr1,
426#if TATOOINE_PNG_AVAILABLE
427template <arithmetic Real>
429 std::string
const& filepath) {
431 throw std::runtime_error{
432 "multidim array needs 2 dimensions for writing as png."};
435 png::image<png::rgb_pixel> image(arr.
size(0), arr.
size(1));
436 for (
unsigned int y = 0; y < image.get_height(); ++y) {
437 for (png::uint_32 x = 0; x < image.get_width(); ++x) {
438 unsigned int idx = x + arr.
size(0) * y;
440 image[image.get_height() - 1 - y][x].red =
441 std::max<Real>(0, std::min<Real>(1, arr[idx])) * 255;
442 image[image.get_height() - 1 - y][x].green =
443 std::max<Real>(0, std::min<Real>(1, arr[idx])) * 255;
444 image[image.get_height() - 1 - y][x].blue =
445 std::max<Real>(0, std::min<Real>(1, arr[idx])) * 255;
448 image.write(filepath);
Definition: dynamic_multidim_array.h:18
auto operator=(dynamic_multidim_array const &other) -> dynamic_multidim_array &=default
constexpr auto data(std::size_t const i) const -> auto const &
Definition: dynamic_multidim_array.h:315
auto constexpr plain_index(integral auto const ... indices) const
Definition: dynamic_multidim_size.h:149
auto constexpr in_range(integral auto const ... indices) const
Definition: dynamic_multidim_size.h:130
dynamic_multidim_array(std::vector< value_type > const &data, Size &&size)
Definition: dynamic_multidim_array.h:193
dynamic_multidim_array(tag::fill< S > const &f, integral auto const ... size)
Definition: dynamic_multidim_array.h:152
auto at(Int const ... is) const -> auto const &
Definition: dynamic_multidim_array.h:231
static auto randu(value_type const min, value_type const max, Size &&size, RandEng &&eng=RandEng{std::random_device{}()})
Definition: dynamic_multidim_array.h:60
std::vector< value_type > container_type
Definition: dynamic_multidim_array.h:27
dynamic_multidim_array(tag::ones_t const &, Size &&size)
Definition: dynamic_multidim_array.h:188
constexpr dynamic_multidim_array(dynamic_multidim_array< OtherT, OtherIndexing > const &other)
Definition: dynamic_multidim_array.h:132
auto operator=(dynamic_multidim_array< OtherT, OtherIndexing > const &other) -> dynamic_multidim_array &
Definition: dynamic_multidim_array.h:139
dynamic_multidim_array(dynamic_multidim_array &&other) noexcept=default
constexpr auto data() const
Definition: dynamic_multidim_array.h:320
constexpr auto internal_container() const -> auto const &
Definition: dynamic_multidim_array.h:307
static auto randu(Size &&size, value_type const min=0, value_type const max=1, RandEng &&eng=RandEng{std::random_device{}()})
Definition: dynamic_multidim_array.h:68
dynamic_multidim_array(std::vector< value_type > &&data, integral auto const ... size)
Definition: dynamic_multidim_array.h:168
dynamic_multidim_array(integral auto const ... size)
Definition: dynamic_multidim_array.h:147
static auto ones(integral auto const ... size)
Definition: dynamic_multidim_array.h:50
auto at(integral_range auto const &indices) -> auto &
Definition: dynamic_multidim_array.h:237
void unary_operation(F &&f)
Definition: dynamic_multidim_array.h:323
constexpr auto data(std::size_t const i) -> auto &
Definition: dynamic_multidim_array.h:311
ValueType value_type
Definition: dynamic_multidim_array.h:23
auto operator[](std::size_t i) const -> auto const &
Definition: dynamic_multidim_array.h:267
static auto rand(Rand &&rand, integral auto const ... size)
Definition: dynamic_multidim_array.h:114
auto indices() const
Definition: dynamic_multidim_size.h:236
dynamic_multidim_array(tag::zeros_t const &, Size &&size)
Definition: dynamic_multidim_array.h:183
dynamic_multidim_array(Rand &&rand, integral auto const ... size)
Definition: dynamic_multidim_array.h:214
~dynamic_multidim_array()=default
dynamic_multidim_array(Size &&size)
Definition: dynamic_multidim_array.h:173
auto size() const -> auto const &
Definition: dynamic_multidim_size.h:107
dynamic_multidim_array()=default
dynamic_multidim_array(dynamic_multidim_array const &other)=default
constexpr auto internal_container() -> auto &
Definition: dynamic_multidim_array.h:306
auto resize(integral auto const ... size) -> void
Definition: dynamic_multidim_array.h:273
dynamic_multidim_array(Data &&data, Size &&size)
Definition: dynamic_multidim_array.h:198
dynamic_multidim_array< value_type, index_order > this_type
Definition: dynamic_multidim_array.h:25
auto num_dimensions() const
Definition: dynamic_multidim_size.h:105
dynamic_multidim_array(std::vector< value_type > const &data, integral auto const ... size)
Definition: dynamic_multidim_array.h:164
static auto randn(integral auto const ... is)
Definition: dynamic_multidim_array.h:101
constexpr auto data()
Definition: dynamic_multidim_array.h:319
auto resize(integral_range auto const &res, value_type const value=value_type{}) -> void
Definition: dynamic_multidim_array.h:289
constexpr void binary_operation(F &&f, dynamic_multidim_array< OtherT, OtherIndexing > const &other)
Definition: dynamic_multidim_array.h:330
dynamic_multidim_array(Rand &&rand, Size &&size)
Definition: dynamic_multidim_array.h:205
auto at(Int const ... is) -> auto &
Definition: dynamic_multidim_array.h:224
dynamic_multidim_array(tag::fill< S > const &f, Size &&size)
Definition: dynamic_multidim_array.h:178
auto operator()(Int const ... is) const -> auto const &
Definition: dynamic_multidim_array.h:263
auto operator()(integral_range auto const &indices) -> auto &
Definition: dynamic_multidim_array.h:249
static auto ones(Size &&size)
Definition: dynamic_multidim_array.h:55
static auto zeros(Size &&size)
Definition: dynamic_multidim_array.h:46
dynamic_multidim_array(tag::ones_t const &, integral auto const ... size)
Definition: dynamic_multidim_array.h:160
static auto randu(integral auto const ... is)
Definition: dynamic_multidim_array.h:77
static auto rand(Rand &&rand, Size &&size)
Definition: dynamic_multidim_array.h:109
auto operator[](std::size_t i) -> auto &
Definition: dynamic_multidim_array.h:271
auto num_components() const
Definition: dynamic_multidim_size.h:111
static auto randn(Size &&size, value_type const mean, value_type const stddev, RandEng &&eng=RandEng{std::random_device{}()})
Definition: dynamic_multidim_array.h:93
static auto zeros(integral auto const ... size)
Definition: dynamic_multidim_array.h:41
auto operator()(integral_range auto const &indices) const -> auto const &
Definition: dynamic_multidim_array.h:253
dynamic_multidim_array(tag::zeros_t const &, integral auto const ... size)
Definition: dynamic_multidim_array.h:156
auto at(integral_range auto const &indices) const -> auto const &
Definition: dynamic_multidim_array.h:243
container_type m_data_container
Definition: dynamic_multidim_array.h:37
auto operator()(Int const ... is) -> auto &
Definition: dynamic_multidim_array.h:258
static auto randn(value_type const mean, value_type const stddev, Size &&size, RandEng &&eng=RandEng{std::random_device{}()})
Definition: dynamic_multidim_array.h:85
Definition: dynamic_multidim_size.h:16
auto constexpr in_range(integral auto const ... indices) const
Definition: dynamic_multidim_size.h:130
auto num_dimensions() const
Definition: dynamic_multidim_size.h:105
auto resize(integral auto const ... size) -> void
Definition: dynamic_multidim_size.h:116
auto num_components() const
Definition: dynamic_multidim_size.h:111
auto operator=(dynamic_multidim_size const &other) -> dynamic_multidim_size &=default
Definition: concepts.h:33
Definition: index_order.h:139
Definition: concepts.h:91
Definition: concepts.h:21
static constexpr zeros_t zeros
Definition: tags.h:103
static constexpr ones_t ones
Definition: tags.h:106
Definition: algorithm.h:6
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
static constexpr forward_tag forward
Definition: tags.h:9
void write_png(filesystem::path const &path, std::vector< T > const &data, std::size_t width, std::size_t height)
Definition: write_png.h:13
auto interpolate(dynamic_multidim_array< T0, Indexing0 > const &arr0, dynamic_multidim_array< T1, Indexing1 > const &arr1, FReal factor)
Definition: dynamic_multidim_array.h:376
constexpr auto plain_index() const -> auto const &
Definition: vertex_handle.h:37
Definition: linspace.h:26
constexpr auto back() const
Definition: linspace.h:95
constexpr auto front() const
Definition: linspace.h:93
An empty struct that holds types.
Definition: type_list.h:248
Definition: index_order.h:17