1#ifndef TATOOINE_STATIC_MULTIDIM_ARRAY_H
2#define TATOOINE_STATIC_MULTIDIM_ARRAY_H
17template <
typename ValueType, index_order IndexOrder, memory_location MemLoc,
18 std::size_t... Resolution>
43 std::conditional_t<std::is_same<MemLoc, stack>::value,
45 std::vector<ValueType>>;
51 static constexpr auto init_data(ValueType
const init = ValueType{}) {
52 if constexpr (std::is_same<MemLoc, stack>::value) {
53 return make_array<num_components()>(init);
67 static constexpr auto fill(S&& s) {
71 template <
typename RandEng = std::mt19937_64>
73 RandEng&& eng = RandEng{std::random_device{}()})
requires
78 template <
typename RandEng = std::mt19937_64>
79 static auto randn(ValueType mean = 0, ValueType stddev = 1,
80 RandEng&& eng = RandEng{std::random_device{}()})
requires
104 template <
typename OtherT,
typename OtherIndexing,
typename OtherMemLoc>
107 Resolution...>
const& other)
109 for (
auto is : static_multidim(Resolution...)) {
114 template <
typename OtherT,
typename OtherIndexing,
typename OtherMemLoc>
117 Resolution...>
const& other)
134 template <
typename S>
158 std::vector<ValueType>&&
data)
requires is_same<MemLoc, heap>
163 template <
typename RandomReal,
typename Engine>
168 [&](
auto const& ) {
return static_cast<ValueType
>(rand()); });
171 template <
typename RandomReal,
typename Engine>
176 [&](
auto const& ) {
return static_cast<ValueType
>(rand()); });
179 template <
typename RandomReal,
typename Engine>
184 [&](
auto const& ) {
return static_cast<ValueType
>(rand()); });
187 template <
typename RandomReal,
typename Engine>
192 [&](
auto const& ) {
return static_cast<ValueType
>(rand()); });
198 [[nodiscard]]
constexpr auto at(
integral auto const... is)
const ->
const
243 [[nodiscard]]
constexpr auto operator[](std::size_t i) ->
auto& {
248 [[nodiscard]]
constexpr auto operator[](std::size_t i)
const ->
auto const& {
260 [[nodiscard]]
constexpr auto data() -> ValueType* {
263 [[nodiscard]]
constexpr auto data() const -> ValueType const* {
267 template <
typename F>
270 at(indices) = f(
at(indices));
274 template <
typename F,
typename OtherT,
typename OtherIndexing,
275 typename OtherMemLoc>
278 Resolution...>
const& other) {
280 at(i) = f(
at(i), other(i));
293template <
typename MemLocOut = stack,
typename IndexingOut = x_fastest,
294 typename T0,
typename T1,
typename Indexing0,
typename Indexing1,
295 typename MemLoc0,
typename MemLoc1,
typename FReal,
296 std::size_t... Resolution>
305 if constexpr (
sizeof...(Resolution) == 2) {
307#pragma omp parallel for collapse(2)
309 for (std::size_t iy = 0; iy < interpolated.size(1); ++iy) {
310 for (std::size_t ix = 0; ix < interpolated.size(0); ++ix) {
311 interpolated(ix, iy) =
312 interpolated.
data(ix, iy) * (1 - factor) + arr1(ix, iy) * factor;
315 }
else if constexpr (
sizeof...(Resolution) == 3) {
317#pragma omp parallel for collapse(3)
319 for (std::size_t iz = 0; iz < interpolated.size(2); ++iz) {
320 for (std::size_t iy = 0; iy < interpolated.size(1); ++iy) {
321 for (std::size_t ix = 0; ix < interpolated.size(0); ++ix) {
322 interpolated(ix, iy, iz) = interpolated(ix, iy, iz) * (1 - factor) +
323 arr1(ix, iy, iz) * factor;
328 for (std::size_t is : interpolated.indices()) {
329 interpolated(is) = interpolated(is) * (1 - factor) + arr1(is) * factor;
335template <
typename MemLocOut = stack,
typename IndexingOut = x_fastest,
336 typename T0,
typename T1,
typename Indexing0,
typename Indexing1,
337 typename MemLoc0,
typename MemLoc1,
typename LinReal,
typename TReal,
338 std::size_t... Resolution>
343 return interpolate<MemLocOut, IndexingOut>(
Definition: static_multidim_array.h:19
static std::size_t constexpr num_components()
Definition: static_multidim_array.h:28
static std::size_t constexpr num_dimensions()
Definition: static_multidim_array.h:29
constexpr auto at(integral auto const ... is) -> auto &requires(sizeof...(is)==num_dimensions())
Definition: static_multidim_array.h:204
constexpr static_multidim_array(tag::zeros_t)
Definition: static_multidim_array.h:138
static auto constexpr size()
Definition: static_multidim_array.h:30
static auto plain_index(integral_range auto const &indices)
Definition: static_multidim_array.h:35
constexpr auto operator()(integral auto const ... is) const -> auto const &requires(sizeof...(is)==num_dimensions())
Definition: static_multidim_array.h:220
constexpr auto operator[](std::size_t i) -> auto &
Definition: static_multidim_array.h:243
constexpr auto operator=(static_multidim_array< OtherT, OtherIndexing, OtherMemLoc, Resolution... > const &other) -> static_multidim_array &
Definition: static_multidim_array.h:115
~static_multidim_array()=default
constexpr static_multidim_array(tag::fill< S > const &f)
Definition: static_multidim_array.h:135
static_multidim_array(std::vector< ValueType > const &data)
Definition: static_multidim_array.h:144
constexpr auto at(integral_range auto const &indices) const -> auto const &
Definition: static_multidim_array.h:210
constexpr static_multidim_array()
Definition: static_multidim_array.h:131
constexpr auto operator()(integral_range auto const &indices) -> auto &
Definition: static_multidim_array.h:238
constexpr auto operator()(integral_range auto const &indices) const -> const auto &
Definition: static_multidim_array.h:232
constexpr static_multidim_array(static_multidim_array &&other) noexcept=default
constexpr static_multidim_array(std::vector< ValueType > &&data)
Definition: static_multidim_array.h:157
static constexpr auto zeros()
Definition: static_multidim_array.h:62
constexpr static_multidim_array(random::uniform< RandomReal, Engine > &rand)
Definition: static_multidim_array.h:164
constexpr static_multidim_array(convertible_to< ValueType > auto &&... ts)
Definition: static_multidim_array.h:125
static constexpr auto fill(S &&s)
Definition: static_multidim_array.h:67
static auto randn(ValueType mean=0, ValueType stddev=1, RandEng &&eng=RandEng{std::random_device{}()})
Definition: static_multidim_array.h:79
constexpr auto operator()(integral auto const ... is) -> auto &
Definition: static_multidim_array.h:226
constexpr auto at(integral auto const ... is) const -> const auto &requires(sizeof...(is)==num_dimensions())
Definition: static_multidim_array.h:198
constexpr void binary_operation(F &&f, static_multidim_array< OtherT, OtherIndexing, OtherMemLoc, Resolution... > const &other)
Definition: static_multidim_array.h:276
constexpr static_multidim_array(random::normal< RandomReal, Engine > &rand)
Definition: static_multidim_array.h:188
constexpr static_multidim_array(static_multidim_array< OtherT, OtherIndexing, OtherMemLoc, Resolution... > const &other)
Definition: static_multidim_array.h:105
static_multidim_array< ValueType, IndexOrder, MemLoc, Resolution... > this_type
Definition: static_multidim_array.h:27
static constexpr auto ones()
Definition: static_multidim_array.h:64
constexpr static_multidim_array(std::array< ValueType, num_components()> const &data)
Definition: static_multidim_array.h:149
container_type m_data_container
Definition: static_multidim_array.h:88
constexpr auto internal_container() -> auto &
Definition: static_multidim_array.h:253
static constexpr auto init_data(ValueType const init=ValueType{})
Definition: static_multidim_array.h:51
constexpr auto at(integral_range auto const &indices) -> auto &
Definition: static_multidim_array.h:215
constexpr auto data() const -> ValueType const *
Definition: static_multidim_array.h:263
static auto constexpr in_range(integral auto const ... indices)
Definition: static_multidim_array.h:38
constexpr static_multidim_array(static_multidim_array const &other)=default
constexpr auto data() -> ValueType *
Definition: static_multidim_array.h:260
constexpr void unary_operation(F &&f)
Definition: static_multidim_array.h:268
constexpr static_multidim_array(random::uniform< RandomReal, Engine > &&rand)
Definition: static_multidim_array.h:172
constexpr auto internal_container() const -> auto const &
Definition: static_multidim_array.h:256
static auto randu(ValueType min=0, ValueType max=1, RandEng &&eng=RandEng{std::random_device{}()})
Definition: static_multidim_array.h:72
constexpr auto operator[](std::size_t i) const -> auto const &
Definition: static_multidim_array.h:248
ValueType value_type
Definition: static_multidim_array.h:25
constexpr static_multidim_array(tag::ones_t)
Definition: static_multidim_array.h:141
constexpr auto operator=(static_multidim_array const &other) -> static_multidim_array &=default
constexpr static_multidim_array(std::array< ValueType, num_components()> &&data)
Definition: static_multidim_array.h:153
constexpr static_multidim_array(random::normal< RandomReal, Engine > &&rand)
Definition: static_multidim_array.h:180
static auto constexpr plain_index(integral auto const ... indices)
Definition: static_multidim_array.h:31
std::conditional_t< std::is_same< MemLoc, stack >::value, std::array< ValueType, num_components()>, std::vector< ValueType > > container_type
Definition: static_multidim_array.h:45
Definition: concepts.h:33
Definition: concepts.h:39
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
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
Definition: static_multidim_size.h:81
static auto constexpr in_range(integral auto const ... indices)
Definition: static_multidim_size.h:89
static auto constexpr num_dimensions()
Definition: static_multidim_size.h:82
static auto constexpr size()
Definition: static_multidim_size.h:85
static auto constexpr num_components()
Definition: static_multidim_size.h:83