4 if (std::holds_alternative<std::monostate>(v)) {
5 return std::shared_ptr<DBNode>(
nullptr);
7 if (
auto p = std::get_if<double>(&v))
return *p;
8 if (
auto p = std::get_if<int64_t>(&v))
return static_cast<int>(*p);
9 if (
auto p = std::get_if<bool>(&v))
return *p;
10 if (
auto p = std::get_if<std::string>(&v))
return BlockName(*p);
12 return std::shared_ptr<DBNode>(
nullptr);
16 return std::make_shared<DBNode>();
20 auto n = std::make_shared<DBNode>();
34 for (
const auto& [k,v] : ds.
meta) {
37 root->set(meta,
"meta");
41 std::vector<std::shared_ptr<DBNode>> varsArr;
42 varsArr.reserve(ds.
vars.size());
44 for (
const auto& v : ds.
vars) {
48 o->set(
static_cast<int>(v.pdg),
"pdg");
51 o->set(v.step,
"step");
57 root->set(scan,
"scan");
61 std::vector<std::shared_ptr<DBNode>> schemaArr;
68 std::unordered_set<std::string> wanted;
69 const bool filter = !spec.
keys.empty();
70 if (filter) wanted = {spec.
keys.begin(), spec.
keys.end()};
72 std::vector<std::shared_ptr<DBNode>> pointsArr;
73 pointsArr.reserve(ds.
points.size());
75 for (
const auto& p : ds.
points) {
79 for (
size_t i = 0; i < ds.
vars.size(); ++i) {
80 const auto& var = ds.
vars[i];
81 const double val = (i < p.x.size()) ? p.x[i] : 0.0;
82 xobj->set(val, var.name);
87 for (
const auto& [k,v] : p.y) {
88 if (filter && !wanted.count(k))
continue;
93 pointsArr.push_back(jp);
106 std::ofstream out(path_);
107 if (!out)
throw std::runtime_error(
"Cannot open JSON file: " + path_);
109 root->printJSONToStream(out, 0);
DBNode::Value to_dbnode_value(const Value &v)
std::shared_ptr< DBNode > make_scalar_node(const Value &v)
std::shared_ptr< DBNode > dataset_to_dbnode(const DataSet &ds, const OutputSpec &spec)
std::shared_ptr< DBNode > make_object_node()
DBNode::Value make_array_value(const std::vector< std::shared_ptr< DBNode > > &elems)
std::shared_ptr< DBNode > dataset_to_dbnode(const DataSet &ds, const OutputSpec &spec)
std::variant< std::monostate, double, int64_t, bool, std::string > Value
Block identifier with alias support.
std::variant< BlockName, int, double, bool, std::shared_ptr< DBNode >, std::vector< std::shared_ptr< DBNode > > > Value
Variant type used to store values in the tree.
void write(const DataSet &ds, const OutputSpec &spec) override
std::vector< DataPoint > points
std::vector< std::string > outputs_schema
std::vector< ScanVar > vars
std::unordered_map< std::string, Value > meta
std::vector< std::string > keys