41 using time_type = Time;
43 using coord_type = Space;
45 using value_type = Value;
56 key_type(coord_type
const &origin, coord_type
const &destination) :
from(origin),
to(destination)
62 return (other.
from == this->from && other.
to == this->to);
66 template <
class Archive>
void serialize(Archive &ar,
const unsigned int version)
77 std::size_t operator()(
const key_type &k)
const
80 res = res * 31 + std::hash<coord_type>()(k.
from);
81 res = res * 31 + std::hash<coord_type>()(k.
to);
87 mutable std::pair<Time, Time> m_RAM_window = {0, 1};
89 using forward_flow_type = std::unordered_map<time_type, std::unordered_map<key_type, value_type, key_hash>>;
91 using backward_flow_type =
92 std::unordered_map<time_type, std::unordered_map<coord_type, std::unordered_map<coord_type, value_type>>>;
94 mutable forward_flow_type m_forward_flow;
96 mutable backward_flow_type m_backward_flow;
106 value_type
flow_from_to(coord_type
const &from, coord_type
const &to, time_type t)
const
108 slide_RAM_window_to(t);
109 assert(m_forward_flow.find(t) != m_forward_flow.end());
110 assert(m_forward_flow.at(t).find(
key_type(from, to)) != m_forward_flow.at(t).end());
111 return m_forward_flow.at(t).at(
key_type(from, to));
117 void set_flow_from_to(coord_type
const &from, coord_type
const &to, time_type t, value_type v)
119 slide_RAM_window_to(t);
120 m_forward_flow[t][
key_type(from, to)] = v;
121 m_backward_flow[t][to][from] = v;
128 slide_RAM_window_to(t);
129 m_forward_flow[t][
key_type(from, to)] += v;
130 m_backward_flow[t][to][from] += v;
137 std::unordered_map<coord_type, value_type>
const &
flow_to(coord_type
const &x, time_type t)
const
139 slide_RAM_window_to(t);
141 return m_backward_flow.at(t).at(x);
149 slide_RAM_window_to(t);
150 auto it1 = m_backward_flow.find(t);
151 if (it1 != m_backward_flow.end())
153 auto it2 = m_backward_flow.at(t).find(to);
154 return it2 != m_backward_flow.at(t).end();
167 std::string get_forward_flow_archive_name(time_type t)
const
169 const std::string prefix =
"M-forward-";
170 const std::string extension =
".archive";
171 return prefix + std::to_string(t) + extension;
177 std::string get_backward_flow_archive_name(time_type t)
const
179 const std::string prefix =
"M-backward-";
180 const std::string extension =
".archive";
181 return prefix + std::to_string(t) + extension;
186 void serialize_layer(time_type t)
const
188 const std::string forward_filename = get_forward_flow_archive_name(t);
189 const std::string backward_filename = get_backward_flow_archive_name(t);
191 std::ofstream forward_ofs(forward_filename, std::ios::binary);
192 std::ofstream backward_ofs(backward_filename, std::ios::binary);
194 boost::archive::binary_oarchive forward_oa(forward_ofs);
195 boost::archive::binary_oarchive backward_oa(backward_ofs);
197 forward_oa << m_forward_flow.at(t);
198 backward_oa << m_backward_flow.at(t);
200 m_forward_flow.erase(t);
201 m_backward_flow.erase(t);
204 void deserialize_layer(time_type t)
const
206 const std::string forward_filename = get_forward_flow_archive_name(t);
207 const std::string backward_filename = get_backward_flow_archive_name(t);
209 std::ifstream forward_ifs(forward_filename, std::ios::binary);
210 std::ifstream backward_ifs(backward_filename, std::ios::binary);
211 boost::archive::binary_iarchive forward_ia(forward_ifs);
212 boost::archive::binary_iarchive backward_ia(backward_ifs);
214 std::unordered_map<key_type, value_type, key_hash> forward_layer;
215 std::unordered_map<coord_type, std::unordered_map<coord_type, value_type>> backward_layer;
216 forward_ia >> forward_layer;
217 backward_ia >> backward_layer;
219 m_forward_flow.emplace(t, forward_layer);
220 m_backward_flow.emplace(t, backward_layer);
223 void slide_RAM_window_to(time_type t)
const
226 if (t == m_RAM_window.first || t == m_RAM_window.second)
232 else if (t == m_RAM_window.second + 1)
235 serialize_layer(m_RAM_window.first);
237 m_RAM_window.first += 1;
238 m_RAM_window.second += 1;
242 deserialize_layer(m_RAM_window.second);
244 catch (
const std::exception &e)
250 else if (t == m_RAM_window.first - 1)
253 serialize_layer(m_RAM_window.second);
255 deserialize_layer(m_RAM_window.first - 1);
257 m_RAM_window.first -= 1;
258 m_RAM_window.second -= 1;
264 serialize_layer(m_RAM_window.first);
265 serialize_layer(m_RAM_window.second);
269 m_RAM_window.first = 0;
270 m_RAM_window.second = 1;
274 m_RAM_window.first = t - 1;
275 m_RAM_window.second = t;
279 deserialize_layer(m_RAM_window.first);
280 deserialize_layer(m_RAM_window.second);