Tatooine
dynamic_multidim_array.h
Go to the documentation of this file.
1#ifndef TATOOINE_DYNAMIC_MULTIDIM_ARRAY_H
2#define TATOOINE_DYNAMIC_MULTIDIM_ARRAY_H
3//==============================================================================
4#include <tatooine/concepts.h>
7#include <tatooine/linspace.h>
9#include <tatooine/multidim.h>
10#include <tatooine/png.h>
11#include <tatooine/random.h>
12#include <tatooine/tags.h>
14//==============================================================================
15namespace tatooine {
16//==============================================================================
17template <typename ValueType, typename IndexOrder = x_fastest>
19 //============================================================================
20 // typedefs
21 //============================================================================
22 public:
23 using value_type = ValueType;
24 using index_order = IndexOrder;
27 using container_type = std::vector<value_type>;
34 //============================================================================
35 // members
36 //============================================================================
38 //============================================================================
39 // factories
40 //============================================================================
41 static auto zeros(integral auto const... size) {
42 return this_type{tag::zeros, size...};
43 }
44 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
45 template <integral_range Size>
46 static auto zeros(Size&& size) {
47 return this_type{tag::zeros, std::forward<Size>(size)};
48 }
49 //------------------------------------------------------------------------------
50 static auto ones(integral auto const... size) {
51 return this_type{tag::ones, size...};
52 }
53 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
54 template <integral_range Size>
55 static auto ones(Size&& size) {
56 return this_type{tag::ones, std::forward<Size>(size)};
57 }
58 //----------------------------------------------------------------------------
59 template <integral_range Size, typename RandEng = std::mt19937_64>
60 static auto randu(value_type const min, value_type const max, Size&& size,
61 RandEng&& eng = RandEng{std::random_device{}()}) {
63 min, max, std::forward<RandEng>(eng)},
64 std::forward<Size>(size)};
65 }
66 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
67 template <integral_range Size, typename RandEng = std::mt19937_64>
68 static auto randu(Size&& size, value_type const min = 0,
69 value_type const max = 1,
70 RandEng&& eng = RandEng{std::random_device{}()}) {
72 min, max, std::forward<RandEng>(eng)},
73 std::forward<Size>(size)};
74 }
75 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
76 template <typename RandEng = std::mt19937_64>
77 static auto randu(integral auto const... is) {
78 return this_type{
80 RandEng{std::random_device{}()}},
81 is...};
82 }
83 //----------------------------------------------------------------------------
84 template <integral_range Size, typename RandEng = std::mt19937_64>
85 static auto randn(value_type const mean, value_type const stddev, Size&& size,
86 RandEng&& eng = RandEng{std::random_device{}()}) {
88 mean, stddev, std::forward<RandEng>(eng)},
89 std::forward<Size>(size)};
90 }
91 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
92 template <integral_range Size, typename RandEng = std::mt19937_64>
93 static auto randn(Size&& size, value_type const mean, value_type const stddev,
94 RandEng&& eng = RandEng{std::random_device{}()}) {
96 mean, stddev, std::forward<RandEng>(eng)},
97 std::forward<Size>(size)};
98 }
99 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
100 template <typename RandEng = std::mt19937_64>
101 static auto randn(integral auto const... is) {
102 return this_type{
104 RandEng{std::random_device{}()}},
105 is...};
106 }
107 //----------------------------------------------------------------------------
108 template <integral_range Size, random_number_generator Rand>
109 static auto rand(Rand&& rand, Size&& size) {
110 return this_type{std::forward<Rand>(rand), std::forward<Size>(size)};
111 }
112 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
113 template <random_number_generator Rand>
114 static auto rand(Rand&& rand, integral auto const... size) {
115 return this_type{std::forward<Rand>(rand), size...};
116 }
117 //============================================================================
118 // ctors
119 //============================================================================
123 //----------------------------------------------------------------------------
125 -> dynamic_multidim_array& = default;
126 auto operator =(dynamic_multidim_array&& other) noexcept
127 -> dynamic_multidim_array& = default;
128 //----------------------------------------------------------------------------
130 //----------------------------------------------------------------------------
131 template <typename OtherT, typename OtherIndexing>
132 explicit constexpr dynamic_multidim_array(
134 : parent_type{other},
136 end(other.internal_container())) {}
137 //----------------------------------------------------------------------------
138 template <typename OtherT, typename OtherIndexing>
142 m_data_container = std::vector<value_type>(
143 begin(other.internal_container()), end(other.internal_container()));
144 return *this;
145 }
146 //============================================================================
147 explicit dynamic_multidim_array(integral auto const... size)
148 : parent_type{size...},
150 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
151 template <typename S>
153 integral auto const... size)
154 : parent_type{size...}, m_data_container(num_components(), f.value) {}
155 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
157 integral auto const... size)
159 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
160 explicit dynamic_multidim_array(tag::ones_t const& /*o*/,
161 integral auto const... size)
163 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
164 explicit dynamic_multidim_array(std::vector<value_type> const& data,
165 integral auto const... size)
167 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
168 explicit dynamic_multidim_array(std::vector<value_type>&& data,
169 integral auto const... size)
170 : parent_type{size...}, m_data_container(std::move(data)) {}
171 //----------------------------------------------------------------------------
172 template <integral_range Size>
174 : parent_type{std::forward<Size>(size)},
176 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
177 template <typename S, integral_range Size>
179 : parent_type{std::forward<Size>(size)},
180 m_data_container(num_components(), f.value) {}
181 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
182 template <integral_range Size>
184 : parent_type{std::forward<Size>(size)},
186 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
187 template <integral_range Size>
189 : parent_type{std::forward<Size>(size)},
191 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
192 template <integral_range Size>
193 dynamic_multidim_array(std::vector<value_type> const& data, Size&& size)
194 : parent_type{std::forward<Size>(size)}, m_data_container(data) {}
195 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
196 template <range_of<value_type> Data, integral_range Size>
197 requires(!integral<value_type>)
199 : parent_type{std::forward<Size>(size)} {
200 std::ranges::copy(std::forward<Data>(data),
201 std::back_inserter(m_data_container));
202 }
203 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
204 template <integral_range Size, random_number_generator Rand>
206 Size&& size)
207 : parent_type{std::forward<Size>(size)},
209 this->unary_operation(
210 [&](auto const& /*c*/) { return static_cast<value_type>(rand.get()); });
211 }
212 //----------------------------------------------------------------------------
213 template <random_number_generator Rand>
215 Rand&& rand, integral auto const... size)
217 this->unary_operation(
218 [&](auto const& /*c*/) { return static_cast<value_type>(rand()); });
219 }
220 //============================================================================
221 // methods
222 //============================================================================
223 template <integral... Int>
224 auto at(Int const... is) -> auto& {
225 assert(sizeof...(is) == num_dimensions());
226 assert(in_range(is...));
227 return m_data_container[plain_index(is...)];
228 }
229 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
230 template <integral... Int>
231 auto at(Int const... is) const -> auto const& {
232 assert(sizeof...(is) == num_dimensions());
233 assert(in_range(is...));
234 return m_data_container[plain_index(is...)];
235 }
236 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
237 auto at(integral_range auto const& indices) -> auto& {
238 assert(indices.size() == num_dimensions());
239 assert(in_range(indices));
241 }
242 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
243 auto at(integral_range auto const& indices) const -> auto const& {
244 assert(indices.size() == num_dimensions());
245 assert(in_range(indices));
247 }
248 //------------------------------------------------------------------------------
249 auto operator()(integral_range auto const& indices) -> auto& {
250 return at(indices);
251 }
252 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
253 auto operator()(integral_range auto const& indices) const -> auto const& {
254 return at(indices);
255 }
256 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
257 template <integral... Int>
258 auto operator()(Int const... is) -> auto& {
259 return at(is...);
260 }
261 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
262 template <integral... Int>
263 auto operator()(Int const... is) const -> auto const& {
264 return at(is...);
265 }
266 //----------------------------------------------------------------------------
267 auto operator[](std::size_t i) const -> auto const& {
268 return m_data_container[i];
269 }
270 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
271 auto operator[](std::size_t i) -> auto& { return m_data_container[i]; }
272 //----------------------------------------------------------------------------
273 auto resize(integral auto const... size) -> void {
274 if (sizeof...(size) == num_dimensions()) {
275 auto const copy = *this;
278 for (auto const& is : copy.indices()) {
279 if (in_range(is)) {
280 at(is) = copy(is);
281 }
282 }
283 } else {
286 }
287 }
288 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
289 auto resize(integral_range auto const& res,
290 value_type const value = value_type{}) -> void {
291 if (res.size() == num_dimensions()) {
292 auto const copy = *this;
294 m_data_container.resize(num_components(), value);
295 for (auto const& is : copy.indices()) {
296 if (in_range(is)) {
297 at(is) = copy(is);
298 }
299 }
300 } else {
302 m_data_container.resize(num_components(), value);
303 }
304 }
305 //----------------------------------------------------------------------------
306 constexpr auto internal_container() -> auto& { return m_data_container; }
307 constexpr auto internal_container() const -> auto const& {
308 return m_data_container;
309 }
310 //----------------------------------------------------------------------------
311 [[nodiscard]] constexpr auto data(std::size_t const i) -> auto& {
312 return m_data_container[i];
313 }
314 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
315 [[nodiscard]] constexpr auto data(std::size_t const i) const -> auto const& {
316 return m_data_container[i];
317 }
318 //----------------------------------------------------------------------------
319 constexpr auto data() { return m_data_container.data(); }
320 constexpr auto data() const { return m_data_container.data(); }
321 //============================================================================
322 template <typename F>
323 void unary_operation(F&& f) {
324 for (auto is : indices()) {
325 at(is) = f(at(is));
326 }
327 }
328 //----------------------------------------------------------------------------
329 template <typename F, typename OtherT, typename OtherIndexing>
330 constexpr void binary_operation(
332 assert(parent_type::operator==(other));
333 for (auto const& is : indices()) {
334 at(is) = f(at(is), other(is));
335 }
336 }
337};
338//==============================================================================
339// deduction guides
340//==============================================================================
341template <typename ValueType, typename IndexOrder>
344// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
345template <typename ValueType, typename IndexOrder>
348//----------------------------------------------------------------------------
349template <typename ValueType, typename UInt>
350dynamic_multidim_array(std::vector<UInt> const&, ValueType const& initial)
352// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
353template <typename ValueType, typename UInt>
354dynamic_multidim_array(std::vector<UInt> const&, std::vector<ValueType> const&)
356// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
357template <typename ValueType, typename UInt>
358dynamic_multidim_array(std::vector<UInt> const&, std::vector<ValueType> &&)
360//----------------------------------------------------------------------------
361template <typename ValueType, typename UInt, std::size_t N>
362dynamic_multidim_array(std::array<UInt, N> const&, ValueType const& initial)
364// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
365template <typename ValueType, typename UInt, std::size_t N>
366dynamic_multidim_array(std::array<UInt, N> const&,
367 std::vector<ValueType> const&)
369// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
370template <typename ValueType, typename UInt, std::size_t N>
371dynamic_multidim_array(std::array<UInt, N> const&, std::vector<ValueType> &&)
373//==============================================================================
374template <typename IndexingOut = x_fastest, typename T0, typename T1,
375 typename Indexing0, typename Indexing1, typename FReal>
378 FReal factor) {
379 if (factor == 0) {
380 return arr0;
381 }
382 if (factor == 1) {
383 return arr1;
384 }
385 assert(arr0.dyn_size() == arr1.dyn_size());
386 auto interpolated =
388
389 for (auto is : interpolated.indices()) {
390 interpolated(is) = interpolated(is) * (1 - factor) + arr1(is) * factor;
391 }
392 return interpolated;
393}
394// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
395template <typename IndexingOut = x_fastest, typename T0, typename T1,
396 typename Indexing0, typename Indexing1, typename LinReal,
397 typename TReal>
400 linspace<LinReal> const& ts, TReal t) {
401 return interpolate<IndexingOut>(arr0, arr1,
402 (t - ts.front()) / (ts.back() - ts.front()));
403}
405// template <typename ValueType, typename IndexOrder>
406// void write_vtk(dynamic_multidim_array<ValueType, IndexOrder> const& arr,
407// std::string const& filepath, vec<double, 3> const& origin,
408// vec<double, 3> const& spacing,
409// std::string const& data_name = "tatooine data") {
410// vtk::legacy_file_writer writer(filepath, vtk::STRUCTURED_POINTS);
411// if (writer.is_open()) {
412// writer.set_title("tatooine");
413// writer.write_header();
414//
415// auto const res = arr.size();
416// writer.write_dimensions(res[0], res[1], res[2]);
417// writer.write_origin(origin(0), origin(1), origin(2));
418// writer.write_spacing(spacing(0), spacing(1), spacing(2));
419// writer.write_point_data(arr.num_components());
420//
421// writer.write_scalars(data_name, arr.data());
422// writer.close();
423// }
424//}
425//
426#if TATOOINE_PNG_AVAILABLE
427template <arithmetic Real>
429 std::string const& filepath) {
430 if (arr.num_dimensions() != 2) {
431 throw std::runtime_error{
432 "multidim array needs 2 dimensions for writing as png."};
433 }
434
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;
439
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;
446 }
447 }
448 image.write(filepath);
449}
452// template <typename Real>
453// void write_png(dynamic_multidim_array<vec<Real, 2> const>& arr,
454// std::string const& filepath) {
455// if (arr.num_dimensions() != 2) {
456// throw std::runtime_error{
457// "multidim array needs 2 dimensions for writing as png."};
458// }
459//
460// png::image<png::rgb_pixel> image(dimension(0).size(), dimension(1).size());
461// for (unsigned int y = 0; y < image.get_height(); ++y) {
462// for (png::uint_32 x = 0; x < image.get_width(); ++x) {
463// unsigned int idx = x + dimension(0).size() * y;
464//
465// image[image.get_height() - 1 - y][x].red =
466// std::max<Real>(0, std::min<Real>(1, m_data_container[idx * 4 + 0]))
467// * 255;
468// image[image.get_height() - 1 - y][x].green =
469// std::max<Real>(0, std::min<Real>(1, m_data_container[idx * 4 + 1]))
470// * 255;
471// image[image.get_height() - 1 - y][x].blue =
472// std::max<Real>(0, std::min<Real>(1, m_data_container[idx * 4 + 2]))
473// * 255;
474// image[image.get_height() - 1 - y][x].alpha =
475// std::max<Real>(0, std::min<Real>(1, m_data_container[idx * 4 + 3]))
476// * 255;
477// }
478// }
479// image.write(filepath);
480//}
481#endif
482//==============================================================================
483} // namespace tatooine
484//==============================================================================
485#endif
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(Size &&size)
Definition: dynamic_multidim_array.h:173
auto size() const -> auto const &
Definition: dynamic_multidim_size.h:107
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: netcdf.h:348
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
Definition: random.h:97
Definition: random.h:15
Definition: tags.h:96
Definition: tags.h:105
Definition: tags.h:102
An empty struct that holds types.
Definition: type_list.h:248
Definition: index_order.h:17