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