45#ifndef DOXYGEN_SHOULD_SKIP_THIS
51# include <agrum/base/external/json/json.hpp>
52using json = nlohmann::json;
53using ordered_json = nlohmann::ordered_json;
56 template < GUM_Numeric GUM_SCALAR >
59 _indent_ = (indent < -1) ? -1 : indent;
60 GUM_CONSTRUCTOR(GumIDWriter);
63 template < GUM_Numeric GUM_SCALAR >
64 GumIDWriter< GUM_SCALAR >::~GumIDWriter() {
65 GUM_DESTRUCTOR(GumIDWriter);
68 template < GUM_Numeric GUM_SCALAR >
69 void GumIDWriter< GUM_SCALAR >::write(std::ostream& output,
70 const InfluenceDiagram< GUM_SCALAR >&
id) {
71 if (!output.good())
GUM_ERROR(
IOError,
"Input/Output error : stream not writable.")
74 content[
"type"] =
"ID";
75 content[
"GumJsonVersion"] =
"1.0";
78 content[
"chance"] = ordered_json::array();
79 content[
"utility"] = ordered_json::array();
80 content[
"decision"] = ordered_json::array();
81 for (const auto& node:
id.nodes()) {
82 const auto fast =
id.variable(node).toFast();
83 if (
id.isChanceNode(node)) {
84 content[
"chance"].push_back(fast);
85 }
else if (
id.isUtilityNode(node)) {
86 content[
"utility"].push_back(fast);
88 content[
"decision"].push_back(fast);
93 content[
"parents"] = ordered_json::object();
94 for (
const auto& node:
id.nodes()) {
95 ordered_json parentList = ordered_json::array();
96 const auto& name =
id.variable(node).name();
97 if (
id.isChanceNode(node)) {
98 const auto& cpt =
id.cpt(node);
99 for (Idx i = 1; i < cpt.nbrDim(); i++)
100 parentList.push_back(cpt.variable(i).name());
101 }
else if (
id.isUtilityNode(node)) {
102 const auto& ut =
id.utility(node);
103 for (Idx i = 1; i < ut.nbrDim(); i++)
104 parentList.push_back(ut.variable(i).name());
107 for (
const auto& p:
id.parents(node))
108 parentList.push_back(
id.variable(p).name());
110 content[
"parents"][name] = parentList;
114 for (
const auto& node:
id.nodes()) {
115 if (!
id.isChanceNode(node))
continue;
117 const auto& cpt =
id.cpt(node);
118 Instantiation I(cpt);
119 for (I.setFirst(); !I.end(); ++I)
120 vals.push_back(cpt[I]);
121 content[
"cpt"][
id.variable(node).name()] = vals;
125 for (
const auto& node:
id.nodes()) {
126 if (!
id.isUtilityNode(node))
continue;
128 const auto& ut =
id.utility(node);
130 for (I.setFirst(); !I.end(); ++I)
131 vals.push_back(ut[I]);
132 content[
"reward"][
id.variable(node).name()] = vals;
136 for (
const auto& prop:
id.properties())
137 content[
"properties"][prop] =
id.property(prop);
142 output << content.dump(_indent_);
146 GUM_ERROR(
IOError,
"Writing in the ostream failed. Check if the stream is writable.")
150 template < GUM_Numeric GUM_SCALAR >
151 void GumIDWriter< GUM_SCALAR >::write(std::string_view filePath,
152 InfluenceDiagram< GUM_SCALAR >&
id) {
154 write(filePath,
static_cast< const InfluenceDiagram< GUM_SCALAR >&
>(
id));
157 template < GUM_Numeric GUM_SCALAR >
158 void GumIDWriter< GUM_SCALAR >::write(std::string_view filePath,
159 const InfluenceDiagram< GUM_SCALAR >&
id) {
160 std::ofstream output(std::string(filePath),
161 _binary_ ? (std::ios_base::trunc | std::ios::binary)
162 : std::ios_base::trunc);
168 template < GUM_Numeric GUM_SCALAR >
169 std::string GumIDWriter< GUM_SCALAR >::toString(
const InfluenceDiagram< GUM_SCALAR >&
id) {
170 std::ostringstream oss;
Shared binary I/O helpers for GUM (jgum/bgum) serialization.
Definition of class for GUM (json) file output for Influence Diagrams.
GumIDWriter(bool binary=false, int indent=-1)
Default constructor.
Pure virtual class for exporting an ID.
Exception : input/output problem.
#define GUM_ERROR(type, msg)
gum is the global namespace for all aGrUM entities
void _writeVector_(std::ostream &os, const std::vector< uint8_t > &vec)
Writes a length-prefixed byte vector to a binary stream (bgum format).