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