16#include "magic_enum/magic_enum.hpp"
20#include <nlohmann/json.hpp>
23using json = nlohmann::json;
27 return std::string(magic_enum::enum_name(val));
32 auto result = magic_enum::enum_cast<E>(j.get<std::string>(),
33 magic_enum::case_insensitive);
34 return result.value_or(fallback);
40#define JSON_OPT(j, key, target) \
41 if ((j).contains(key)) \
42 (target) = (j).at(key).get<decltype(target)>()
78 j[
"Structure Comparison"] = {
79 {
"distance_difference",
83 {
"indistinguishable_atoms",
99 j[
"Optimizer"][
"LBFGS"] = {
123 j[
"Nudged Elastic Band"] = {
129 j[
"Nudged Elastic Band"][
"spring"] = {
134 j[
"Nudged Elastic Band"][
"climbing_image"] = {
151 j[
"Saddle Search"] = {
213 if (j.contains(
"Main")) {
214 auto &m = j.at(
"Main");
215 if (m.contains(
"job"))
231 if (j.contains(
"Potential")) {
232 auto &s = j.at(
"Potential");
233 if (s.contains(
"potential"))
246 if (j.contains(
"Structure Comparison")) {
247 auto &s = j.at(
"Structure Comparison");
254 JSON_OPT(s,
"indistinguishable_atoms",
263 if (j.contains(
"Optimizer")) {
264 auto &s = j.at(
"Optimizer");
265 if (s.contains(
"opt_method"))
270 c =
static_cast<char>(std::tolower(
static_cast<unsigned char>(c)));
276 throw std::invalid_argument(
277 std::format(
"unknown convergence_metric: {}",
285 if (s.contains(
"LBFGS")) {
286 auto &l = s.at(
"LBFGS");
297 if (j.contains(
"Dynamics")) {
298 auto &s = j.at(
"Dynamics");
304 if (j.contains(
"Thermostat")) {
305 auto &s = j.at(
"Thermostat");
308 JSON_OPT(s,
"andersen_collision_period",
316 if (j.contains(
"Nudged Elastic Band")) {
317 auto &s = j.at(
"Nudged Elastic Band");
320 if (s.contains(
"opt_method"))
324 if (s.contains(
"spring")) {
325 auto &sp = s.at(
"spring");
330 if (s.contains(
"climbing_image")) {
331 auto &ci = s.at(
"climbing_image");
339 if (j.contains(
"Dimer")) {
340 auto &s = j.at(
"Dimer");
346 if (s.contains(
"rotation_backend"))
353 if (j.contains(
"Saddle Search")) {
354 auto &s = j.at(
"Saddle Search");
365 if (j.contains(
"Serve")) {
366 auto &s = j.at(
"Serve");
368 if (s.contains(
"port"))
370 if (s.contains(
"replicas"))
372 if (s.contains(
"gateway_port"))
378 if (j.contains(
"Debug")) {
379 auto &s = j.at(
"Debug");
391 auto j = json::parse(json_str);
394 }
catch (
const json::exception &e) {
396 }
catch (
const std::invalid_argument &) {
#define JSON_OPT(j, key, target)
static E enum_from_json(const json &j, E fallback)
static json enum_to_json(E val)
struct eonc::Parameters::optimizer_options_t optimizer_options
struct eonc::Parameters::neb_options_t neb_options
struct eonc::Parameters::thermostat_options_t thermostat_options
struct eonc::Parameters::structure_comparison_options_t structure_comparison_options
struct eonc::Parameters::dimer_options_t dimer_options
struct eonc::Parameters::potential_options_t potential_options
struct eonc::Parameters::debug_options_t debug_options
struct eonc::Parameters::saddle_search_options_t saddle_search_options
struct eonc::Parameters::davidson_options_t davidson_options
struct eonc::Parameters::prefactor_options_t prefactor_options
struct eonc::Parameters::hessian_options_t hessian_options
struct eonc::Parameters::dynamics_options_t dynamics_options
struct eonc::Parameters::lanczos_options_t lanczos_options
struct eonc::Parameters::main_options_t main_options
struct eonc::Parameters::serve_options_t serve_options
void from_json(const json &j, Parameters &p)
Deserialize JSON into Parameters, then resolve computed fields.
json to_json(const Parameters &p)
Serialize all Parameters to JSON.
void validate_and_link(Parameters ¶ms)
Resolve cross-group defaults and time unit conversions.
int load_json(const std::string &json_str, Parameters ¶ms)
Load Parameters from a JSON string. Returns 0 on success.
std::optional< std::string_view > convergenceMetricLabel(std::string_view metric)
Display label for a force-convergence metric, or nullopt when the name is none of the three the optim...
std::string phva_atoms
PHVA mobile/active set for the Ritz space; "All" = all free atoms.
bool diagonal_preconditioner
Heuristic | (H v)_i / v_i | preconditioner (not true diag(H); off by default).
bool write_deprecated_outs
long write_movies_interval
DimerRotationBackend rotation_backend
std::string checkpoint_path
bool writeConForces
Opt-in "Forces of Component" sections in written .con frames (enables force+energy co-load on restart...
struct eonc::Parameters::neb_options_t::climbing_image_options_t climbing_image
struct eonc::Parameters::neb_options_t::spring_options_t spring
std::string convergence_metric_label
std::string convergence_metric
double max_time_step_input
struct eonc::Parameters::optimizer_options_t::lbfgs_t lbfgs
std::string potentialsPath
double displace_magnitude
std::string minmode_method
bool indistinguishable_atoms
double distance_difference
double andersen_tcol_input
double langevin_friction_input