BioCMAMC-ST
serde.hpp
1
2
3#ifndef __CORE__SERDE_HPP__
4#define __CORE__SERDE_HPP__
5#include <core/global_initaliser.hpp>
6
7#include <core/case_data.hpp>
8#include <string_view>
9#ifdef USE_CEAREAL
10namespace SerDe
11{
12 void save_simulation(const Core::CaseData& case_data);
13 bool load_simulation(Core::GlobalInitialiser& gi,
14 Core::CaseData& case_data,
15 std::string_view ser_filename);
16} // namespace SerDe
17
18#endif // USE_CEAREAL
19
20#ifdef USE_CEAREAL
21# include <cereal/archives/binary.hpp>
22
23template <typename T = void>
24 requires AutoGenerated::FlagCompileTime::use_cereal_serde
25void
26do_serde(Core::CaseData& case_data)
27{
28 std::cout << "Serialization..." << std::endl;
29 SerDe::save_simulation(case_data);
30}
31
32template <typename T = void>
33 requires AutoGenerated::FlagCompileTime::use_cereal_serde
34std::optional<Core::CaseData>
35impl_load(std::shared_ptr<IO::Logger>& logger,
36 const ExecInfo& exec,
37 const Core::UserControlParameters&& params,
38 std::optional<Simulation::Feed::SimulationFeed> feed)
39{
40 Core::CaseData case_data;
41 case_data.exec_info = exec;
42
43 Core::GlobalInitialiser gi(exec, params);
44 auto transition = gi.init_transitionner();
45 if (!transition.has_value())
46 {
47 return std::nullopt;
48 }
49
50 case_data.transitioner = std::move(*transition);
51 gi.init_feed(std::move(feed));
52 try
53 {
54 if (!params.serde_file.has_value())
55 {
56 return std::nullopt;
57 }
58 std::string serde_filename
59 = *params.serde_file + std::to_string(exec.current_rank) + ".raw";
60 if (logger)
61 {
62 logger->print("Serde", serde_filename);
63 }
64 const bool ok_init = SerDe::load_simulation(gi, case_data, serde_filename);
65
66 if (!gi.check_init_terminate() || !ok_init)
67 {
68 return std::nullopt;
69 }
70 }
71 catch (std::exception& e)
72 {
73 auto err = "CORE::load::load_simulation:" + std::string(e.what());
74 throw std::runtime_error(err);
75 }
76
77 case_data.params = gi.get_parameters();
78 // TODO: Check integreity between transitionner and read value (transitionner
79 // and simulation tpf
80 // + n_species)
81
82 return case_data;
83}
84
85#endif
86
87template <typename T = void>
88 requires(!AutoGenerated::FlagCompileTime::use_cereal_serde)
89void
90do_serde(Core::CaseData& /*arg*/)
91{
92 // NOP
93}
94
95template <typename T = void>
96 requires(!AutoGenerated::FlagCompileTime::use_cereal_serde)
97[[maybe_unused]] std::optional<Core::CaseData>
98impl_load([[maybe_unused]] const ExecInfo& exec,
99 [[maybe_unused]] const Core::UserControlParameters&& params,
100 [[maybe_unused]] std::optional<Simulation::Feed::SimulationFeed> feed)
101{
102 return std::nullopt;
103}
104
105#endif
A class responsible for initializing various components of a simulation framework.
Definition global_initaliser.hpp:39
Holds the data required to execute a simulation case.
Definition case_data.hpp:40
ExecInfo exec_info
Information about the execution environment.
Definition case_data.hpp:78
SimulationParameters params
Parameters that configure the simulation.
Definition case_data.hpp:58
CmaUtils::TransitionnerPtrType transitioner
Unique pointer to the flow map transitioner.
Definition case_data.hpp:69
A structure to hold user-defined control parameters for simulation settings.
Definition simulation_parameters.hpp:24
Definition execinfo.hpp:12