OpenPFC  0.1.4
Phase Field Crystal simulation framework
Loading...
Searching...
No Matches
parameter_metadata.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025 VTT Technical Research Centre of Finland Ltd
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
44#ifndef PFC_UI_PARAMETER_METADATA_HPP
45#define PFC_UI_PARAMETER_METADATA_HPP
46
47#include <optional>
48#include <sstream>
49#include <string>
50#include <type_traits>
51#include <limits>
52
53namespace pfc {
54namespace ui {
55
64template <typename T>
66 std::string name;
67 std::string description;
68 bool required = false;
69 std::optional<T> min_value;
70 std::optional<T> max_value;
71 std::optional<T> typical_value;
72 std::optional<T> default_value;
73 std::string physical_units;
74 std::string category;
75
84 std::optional<std::string> validate(T value) const {
85 if (min_value && value < *min_value) {
86 std::ostringstream msg;
87 msg << "Parameter '" << name << "' = " << value
88 << " is below minimum " << *min_value;
89 if (min_value && max_value) {
90 msg << " (valid range: [" << *min_value << ", " << *max_value << "])";
91 }
92 return msg.str();
93 }
94
95 if (max_value && value > *max_value) {
96 std::ostringstream msg;
97 msg << "Parameter '" << name << "' = " << value
98 << " exceeds maximum " << *max_value;
99 if (min_value && max_value) {
100 msg << " (valid range: [" << *min_value << ", " << *max_value << "])";
101 }
102 return msg.str();
103 }
104
105 return std::nullopt; // Valid
106 }
107
113 std::string format_info() const {
114 std::ostringstream info;
115 info << "Parameter: " << name << "\n";
116 info << " Description: " << description;
117 if (!physical_units.empty()) {
118 info << " (" << physical_units << ")";
119 }
120 info << "\n";
121
122 if (min_value || max_value) {
123 info << " Valid range: [";
124 if (min_value) {
125 info << *min_value;
126 } else {
127 info << "-inf";
128 }
129 info << ", ";
130 if (max_value) {
131 info << *max_value;
132 } else {
133 info << "+inf";
134 }
135 info << "]\n";
136 }
137
138 if (typical_value) {
139 info << " Typical value: " << *typical_value << "\n";
140 }
141
142 if (default_value) {
143 info << " Default value: " << *default_value << "\n";
144 }
145
146 info << " Required: " << (required ? "yes" : "no");
147
148 return info.str();
149 }
150
154 class Builder {
155 private:
157
158 public:
159 Builder& name(const std::string& n) {
160 param_.name = n;
161 return *this;
162 }
163
164 Builder& description(const std::string& desc) {
165 param_.description = desc;
166 return *this;
167 }
168
169 Builder& required(bool req = true) {
170 param_.required = req;
171 return *this;
172 }
173
174 Builder& optional(bool opt = true) {
175 param_.required = !opt;
176 return *this;
177 }
178
179 Builder& min(T min_val) {
180 param_.min_value = min_val;
181 return *this;
182 }
183
184 Builder& max(T max_val) {
185 param_.max_value = max_val;
186 return *this;
187 }
188
189 Builder& range(T min_val, T max_val) {
190 param_.min_value = min_val;
191 param_.max_value = max_val;
192 return *this;
193 }
194
195 Builder& typical(T typ_val) {
196 param_.typical_value = typ_val;
197 return *this;
198 }
199
200 Builder& default_val(T def_val) {
201 param_.default_value = def_val;
202 return *this;
203 }
204
205 Builder& units(const std::string& u) {
206 param_.physical_units = u;
207 return *this;
208 }
209
210 Builder& category(const std::string& cat) {
211 param_.category = cat;
212 return *this;
213 }
214
215 ParameterMetadata<T> build() const {
216 return param_;
217 }
218 };
219
223 static Builder builder() {
224 return Builder();
225 }
226};
227
228} // namespace ui
229} // namespace pfc
230
231#endif // PFC_UI_PARAMETER_METADATA_HPP
Builder pattern for fluent parameter construction.
Definition parameter_metadata.hpp:154
Metadata for a single model parameter.
Definition parameter_metadata.hpp:65
std::optional< T > max_value
Maximum valid value (inclusive)
Definition parameter_metadata.hpp:70
std::optional< T > default_value
Default if not specified.
Definition parameter_metadata.hpp:72
std::optional< T > min_value
Minimum valid value (inclusive)
Definition parameter_metadata.hpp:69
bool required
Must be present in config?
Definition parameter_metadata.hpp:68
std::string physical_units
Physical units (e.g., "K", "m/s")
Definition parameter_metadata.hpp:73
std::string name
Parameter name (as in config file)
Definition parameter_metadata.hpp:66
static Builder builder()
Start building parameter metadata.
Definition parameter_metadata.hpp:223
std::optional< T > typical_value
Typical/recommended value.
Definition parameter_metadata.hpp:71
std::string category
Parameter category (e.g., "Thermodynamics")
Definition parameter_metadata.hpp:74
std::optional< std::string > validate(T value) const
Validate a parameter value against constraints.
Definition parameter_metadata.hpp:84
std::string description
Human-readable description.
Definition parameter_metadata.hpp:67
std::string format_info() const
Format parameter info for error messages.
Definition parameter_metadata.hpp:113
Represents the global simulation domain (the "world").
Definition world.hpp:91