NGen
Loading...
Searching...
No Matches
serialization.hpp
1/*
2Author: Nels Frazier
3Copyright (C) 2025 Lynker
4------------------------------------------------------------------------
5Licensed under the Apache License, Version 2.0 (the "License");
6you may not use this file except in compliance with the License.
7You may obtain a copy of the License at
8
9 http://www.apache.org/licenses/LICENSE-2.0
10
11Unless required by applicable law or agreed to in writing, software
12distributed under the License is distributed on an "AS IS" BASIS,
13WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14See the License for the specific language governing permissions and
15limitations under the License.
16------------------------------------------------------------------------
17Version 0.2
18Interface of the save-side ngen BMI state serialization protocol. Pairs
19with NgenDeserializationProtocol (restore, see deserialization.hpp) and
20shares the on-disk SerializationRecord format (see serialization_record.hpp).
21Record identity per run() call is taken from Context::id.
22*/
23#pragma once
24
25#include "utilities/serialization/record_backend.hpp"
26#include <memory>
27#include <nonstd/expected.hpp>
28#include <protocol.hpp>
29
30namespace models {
31namespace bmi {
32namespace protocols {
33using nonstd::expected;
34
36constexpr const char* const SERIALIZATION_CREATE_NAME = "ngen::serialization_create";
37constexpr const char* const SERIALIZATION_FREE_NAME = "ngen::serialization_free";
38constexpr const char* const SERIALIZATION_SIZE_NAME = "ngen::serialization_size";
39constexpr const char* const SERIALIZATION_STATE_NAME = "ngen::serialization_state";
40
42constexpr const char* const SERIALIZATION_CONFIGURATION_KEY = "serialization";
44constexpr const char* const SERIALIZATION_PATH_KEY = "path";
46constexpr const char* const SERIALIZATION_SAVE_KEY = "save";
48constexpr const char* const SERIALIZATION_CHECK_KEY = "check";
49constexpr const char* const SERIALIZATION_FATAL_KEY = "fatal";
50constexpr const char* const SERIALIZATION_FREQUENCY_KEY = "frequency";
51
58 const char* name;
59 const char* unit;
60};
61
63 {SERIALIZATION_CREATE_NAME, "ngen::trigger"},
64 {SERIALIZATION_FREE_NAME, "ngen::trigger"},
65 {SERIALIZATION_SIZE_NAME, "bytes" },
66 {SERIALIZATION_STATE_NAME, "ngen::opaque" },
67};
68
94 public:
95 NgenSerializationProtocol(const ModelPtr& model, const Properties& properties);
97 virtual ~NgenSerializationProtocol() override;
98
99 private:
107 auto run(const ModelPtr& model, const Context& ctx) const
108 -> expected<void, ProtocolError> override;
109
111 nsel_NODISCARD auto check_support(const ModelPtr& model)
112 -> expected<void, ProtocolError> override;
113
125 auto initialize(const ModelPtr& model, const Properties& properties)
126 -> expected<void, ProtocolError> override;
127
128 bool is_supported() const override final;
129
130 private:
132 bool supported = false;
133 bool check;
135
136 // Storage backend, acquired in initialize() via a
137 // `RecordBackend`-typed factory. `nullptr` means save is
138 // disabled / unconfigured.
139 std::shared_ptr<::ngen::serialization::RecordBackend> backend_;
140};
141
142} // namespace protocols
143} // namespace bmi
144} // namespace models
Definition protocol.hpp:110
NgenSerializationProtocol()
Definition serialization.cpp:92
auto run(const ModelPtr &model, const Context &ctx) const -> expected< void, ProtocolError > override
Append one state record to the shared file when the frequency fires.
Definition serialization.cpp:100
bool check
Definition serialization.hpp:133
bool supported
Definition serialization.hpp:132
auto initialize(const ModelPtr &model, const Properties &properties) -> expected< void, ProtocolError > override
Parse top-level path and the save sub-block from the serialization configuration.
Definition serialization.cpp:288
nsel_NODISCARD auto check_support(const ModelPtr &model) -> expected< void, ProtocolError > override
Probe the model for all four reserved serialization variable names.
Definition serialization.cpp:241
bool is_supported() const override final
Whether the protocol is supported by the model.
Definition serialization.cpp:380
bool is_fatal
Definition serialization.hpp:134
std::shared_ptr<::ngen::serialization::RecordBackend > backend_
Definition serialization.hpp:139
int frequency
Definition serialization.hpp:131
Definition deserialization.hpp:40
constexpr ReservedVar RESERVED_VARS[]
Definition serialization.hpp:62
constexpr const char *const SERIALIZATION_STATE_NAME
Definition serialization.hpp:39
std::shared_ptr< models::bmi::Bmi_Adapter > ModelPtr
Definition protocol.hpp:107
constexpr const char *const SERIALIZATION_SAVE_KEY
Save-side sub-block key.
Definition serialization.hpp:46
constexpr const char *const SERIALIZATION_CREATE_NAME
Reserved BMI variable names driving the protocol's capture sequence.
Definition serialization.hpp:36
geojson::PropertyMap Properties
Definition protocol.hpp:108
constexpr const char *const SERIALIZATION_FREE_NAME
Definition serialization.hpp:37
constexpr const char *const SERIALIZATION_FATAL_KEY
Definition serialization.hpp:49
constexpr const char *const SERIALIZATION_FREQUENCY_KEY
Definition serialization.hpp:50
constexpr const char *const SERIALIZATION_SIZE_NAME
Definition serialization.hpp:38
constexpr const char *const SERIALIZATION_PATH_KEY
Shared path key at the top-level block.
Definition serialization.hpp:44
constexpr const char *const SERIALIZATION_CONFIGURATION_KEY
Top-level configuration key.
Definition serialization.hpp:42
constexpr const char *const SERIALIZATION_CHECK_KEY
Save-side / restore-side shared sub-keys.
Definition serialization.hpp:48
Definition AbstractCLibBmiAdapter.hpp:6
Definition DomainLayer.hpp:13
STL namespace.
Definition protocol.hpp:100
(Reserved-name, expected-unit-string) pair used by both the save and restore protocols' check_support...
Definition serialization.hpp:57
const char * unit
Definition serialization.hpp:59
const char * name
Definition serialization.hpp:58