Tatooine
lazy_reader.h
Go to the documentation of this file.
1#ifndef TATOOINE_LAZY_READER_H
2#define TATOOINE_LAZY_READER_H
3//==============================================================================
6#include <mutex>
7#include <map>
8//==============================================================================
9namespace tatooine {
10//==============================================================================
11template <typename DataSet, typename GlobalIndexOrder = x_fastest,
12 typename LocalIndexOrder = GlobalIndexOrder>
14 : chunked_multidim_array<typename DataSet::value_type, GlobalIndexOrder, LocalIndexOrder> {
16 using value_type = typename DataSet::value_type;
19
20 static auto default_value() -> value_type& {
21 static value_type t{};
22 return t;
23 }
24
25 private:
26 DataSet m_dataset;
27 mutable std::vector<bool> m_read;
28 std::size_t m_max_num_chunks_loaded = 1024;
30 mutable std::mutex m_chunks_loaded_mutex;
31 mutable std::vector<std::size_t> m_chunks_loaded;
32 mutable std::vector<std::unique_ptr<std::mutex>> m_mutexes;
33
34 public:
35 lazy_reader(DataSet const& file, std::vector<std::size_t> const& chunk_size)
36 : parent_type{std::vector<std::size_t>(chunk_size.size(), 0), chunk_size},
37 m_dataset{file} {
39 }
40 //----------------------------------------------------------------------------
42 : parent_type{other},
43 m_dataset{other.m_dataset},
44 m_read{other.m_read}
45 //, m_max_num_chunks_loaded{other.m_max_num_chunks_loaded}
46 //, m_limit_num_chunks_loaded{other.m_limit_num_chunks_loaded}
47 {
49 }
50 //----------------------------------------------------------------------------
51 private:
52 auto init(std::vector<std::size_t> const& chunk_size) -> void {
53 auto s = m_dataset.size();
54 this->resize(s, chunk_size);
55 m_read.resize(this->num_chunks(), false);
57 }
58 //----------------------------------------------------------------------------
60 m_mutexes.resize(this->num_chunks());
61 for (auto& mutex : m_mutexes) {
62 mutex = std::make_unique<std::mutex>();
63 }
64 }
65 //----------------------------------------------------------------------------
66 auto read_chunk(std::size_t const plain_chunk_index, integral auto const... indices) const
67 -> auto const& {
68#ifndef NDEBUG
69 if (!this->in_range(indices...)) {
70 std::cerr << "not in range: ";
71 ((std::cerr << indices << ", "), ...);
72 std::cerr << '\n';
73 std::cerr << '\n';
74 std::cerr << "size is: ";
75 for (auto s : this->size()) {
76 std::cerr << s << ", ";
77 }
78 std::cerr << '\n';
79 }
80#endif
81 assert(sizeof...(indices) == this->num_dimensions());
82 assert(this->in_range(indices...));
83
84 if (this->chunk_at_is_null(plain_chunk_index) && !m_read[plain_chunk_index]) {
85 {
86 auto chunks_loaded_lock = std::lock_guard{m_chunks_loaded_mutex};
87 m_chunks_loaded.push_back(plain_chunk_index);
88 //if (m_limit_num_chunks_loaded &&
89 // num_chunks_loaded() > m_max_num_chunks_loaded) {
90 // // TODO reimplement
91 //}
92 }
93
94 this->create_chunk_at(plain_chunk_index);
95 auto& chunk = *this->chunk_at(plain_chunk_index);
96 m_read[plain_chunk_index] = true;
97 auto const offset = this->global_indices_from_chunk_indices(
99 for (std::size_t i = 0; i < offset.size(); ++i) {
100 assert(offset[i] + chunk.size()[i] <= this->size()[i]);
101 }
102 m_dataset.read(offset, chunk.size(), chunk);
103
104 }
105
106 return this->chunk_at(plain_chunk_index);
107 }
108 //----------------------------------------------------------------------------
109 public:
110 auto at(integral auto const... indices) const -> value_type const& {
111 auto const plain_chunk_index =
113 auto lock = std::lock_guard {*m_mutexes[plain_chunk_index]};
114 auto const& chunk = read_chunk(plain_chunk_index, indices...);
115
116 if (chunk == nullptr) {
117 auto const& t = default_value();
118 return t;
119 }
121 plain_chunk_index, indices...)];
122 }
123
124 private:
125 template <integral Index, std::size_t N, std::size_t... Seq>
126 auto at(std::array<Index, N> const& indices,
127 std::index_sequence<Seq...> /*seq*/) const -> value_type const& {
128 return at(indices[Seq]...);
129 }
130
131 public:
132 template <integral Index, std::size_t N>
133 auto at(std::array<Index, N> const& indices) const -> value_type const& {
134 return at(indices, std::make_index_sequence<N>{});
135 }
136 //----------------------------------------------------------------------------
137 auto operator()(integral auto const... indices) const -> value_type const& {
138 assert(sizeof...(indices) == this->num_dimensions());
139 return at(indices...);
140 }
141 //----------------------------------------------------------------------------
142 auto is_chunk_filled_with_value(std::size_t const plain_chunk_index,
143 value_type const& value) const -> bool {
144 auto const& chunk_data = chunk_at(plain_chunk_index)->data();
145 for (auto const& v : chunk_data) {
146 if (v != value) {
147 return false;
148 }
149 }
150 return true;
151 }
152 //----------------------------------------------------------------------------
153 auto is_chunk_filled_with_zeros(std::size_t const plain_chunk_index) const
154 -> bool requires is_arithmetic<value_type> {
155 return is_chunk_filled_with_value(plain_chunk_index, 0);
156 }
157 //----------------------------------------------------------------------------
158 auto set_max_num_chunks_loaded(std::size_t const /*max_num_chunks_loaded*/) {
159 //limit_num_chunks_loaded();
160 //m_max_num_chunks_loaded = max_num_chunks_loaded;
161 }
162 //----------------------------------------------------------------------------
163 auto limit_num_chunks_loaded(bool const /*l*/ = true) {
164 //m_limit_num_chunks_loaded = l;
165 }
166 //----------------------------------------------------------------------------
167 auto num_chunks_loaded() const {
168 return size(m_chunks_loaded);
169 }
170 //----------------------------------------------------------------------------
171 auto chunks_loaded() const -> auto const& { return m_chunks_loaded; }
172 //----------------------------------------------------------------------------
173 auto chunk_is_loaded(std::size_t const plain_chunk_index) const {
174 return std::find(begin(m_chunks_loaded), end(m_chunks_loaded),
175 plain_chunk_index) != end(m_chunks_loaded);
176 }
177};
178//==============================================================================
179} // namespace tatooine
180//==============================================================================
181#endif
auto indices() const
Definition: dynamic_multidim_size.h:236
Definition: concepts.h:21
Definition: algorithm.h:6
auto begin(Range &&range)
Definition: iterator_facade.h:318
auto end(Range &&range)
Definition: iterator_facade.h:322
Definition: chunked_multidim_array.h:27
auto global_indices_from_chunk_indices(std::vector< Int > is) const
Definition: chunked_multidim_array.h:220
auto constexpr in_range(integral auto const ... indices) const
Definition: dynamic_multidim_size.h:130
auto chunk_indices_from_global_indices(std::index_sequence< Seq... >, integral auto const ... is) const
Definition: chunked_multidim_array.h:197
auto chunk_at(integral auto const chunk_index0, integral auto const ... chunk_indices) const -> auto const &
Definition: chunked_multidim_array.h:241
auto chunk_size() const
Definition: chunked_multidim_array.h:332
auto create_chunk_at(std::size_t const plain_chunk_index, std::vector< std::size_t > const &multi_indices) const -> auto const &
Definition: chunked_multidim_array.h:269
auto plain_internal_chunk_index_from_global_indices(std::size_t plain_chunk_index, std::index_sequence< Seq... >, integral auto const ... is) const
Definition: chunked_multidim_array.h:138
auto chunk_at_is_null(integral auto const chunk_index0, integral auto const ... chunk_indices) const
Definition: chunked_multidim_array.h:252
auto size() const -> auto const &
Definition: dynamic_multidim_size.h:107
auto num_chunks() const
Definition: chunked_multidim_array.h:330
auto num_dimensions() const
Definition: dynamic_multidim_size.h:105
auto resize(SizeRange &&size) -> void requires(is_integral< typename std::decay_t< SizeRange >::value_type >)
Definition: chunked_multidim_array.h:87
auto plain_chunk_index_from_global_indices(std::index_sequence< Seq... >, integral auto const ... is) const
Definition: chunked_multidim_array.h:158
Definition: lazy_reader.h:14
auto set_max_num_chunks_loaded(std::size_t const)
Definition: lazy_reader.h:158
static auto default_value() -> value_type &
Definition: lazy_reader.h:20
bool m_limit_num_chunks_loaded
Definition: lazy_reader.h:29
lazy_reader(lazy_reader const &other)
Definition: lazy_reader.h:41
std::size_t m_max_num_chunks_loaded
Definition: lazy_reader.h:28
auto read_chunk(std::size_t const plain_chunk_index, integral auto const ... indices) const -> auto const &
Definition: lazy_reader.h:66
auto chunk_at(integral auto const chunk_index0, integral auto const ... chunk_indices) const -> auto const &
Definition: chunked_multidim_array.h:241
std::vector< std::size_t > m_chunks_loaded
Definition: lazy_reader.h:31
typename DataSet::value_type value_type
Definition: lazy_reader.h:16
auto is_chunk_filled_with_value(std::size_t const plain_chunk_index, value_type const &value) const -> bool
Definition: lazy_reader.h:142
auto chunk_is_loaded(std::size_t const plain_chunk_index) const
Definition: lazy_reader.h:173
auto num_chunks_loaded() const
Definition: lazy_reader.h:167
auto create_mutexes()
Definition: lazy_reader.h:59
auto is_chunk_filled_with_zeros(std::size_t const plain_chunk_index) const -> bool
Definition: lazy_reader.h:153
std::vector< std::unique_ptr< std::mutex > > m_mutexes
Definition: lazy_reader.h:32
auto chunks_loaded() const -> auto const &
Definition: lazy_reader.h:171
lazy_reader(DataSet const &file, std::vector< std::size_t > const &chunk_size)
Definition: lazy_reader.h:35
std::mutex m_chunks_loaded_mutex
Definition: lazy_reader.h:30
auto limit_num_chunks_loaded(bool const =true)
Definition: lazy_reader.h:163
std::vector< bool > m_read
Definition: lazy_reader.h:27
auto at(integral auto const ... indices) const -> value_type const &
Definition: lazy_reader.h:110
auto init(std::vector< std::size_t > const &chunk_size) -> void
Definition: lazy_reader.h:52
auto operator()(integral auto const ... indices) const -> value_type const &
Definition: lazy_reader.h:137
auto at(std::array< Index, N > const &indices, std::index_sequence< Seq... >) const -> value_type const &
Definition: lazy_reader.h:126
auto at(std::array< Index, N > const &indices) const -> value_type const &
Definition: lazy_reader.h:133
DataSet m_dataset
Definition: lazy_reader.h:26