From 638b4c7ac58ea73e3fb2a6480ea2de2a6b6efa20 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Thu, 26 Nov 2020 16:23:26 +0100
Subject: [PATCH] Ensure that all statements produce an output in JSON mode

---
 src/ComputingTasks.cc       | 19 +++++++++++++++++++
 src/ComputingTasks.hh       |  1 +
 src/Shocks.cc               | 19 ++++++++++++++-----
 src/Shocks.hh               |  1 +
 src/SigmaeInitialization.cc | 26 ++++++++++++++++++++++++--
 src/SigmaeInitialization.hh |  3 ++-
 src/Statement.cc            |  5 -----
 src/Statement.hh            |  2 +-
 8 files changed, 62 insertions(+), 14 deletions(-)

diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc
index 496afc70..56b6d52b 100644
--- a/src/ComputingTasks.cc
+++ b/src/ComputingTasks.cc
@@ -593,6 +593,25 @@ DetCondForecastStatement::writeOutput(ostream &output, const string &basename, b
   output << ");" << endl;
 }
 
+void
+DetCondForecastStatement::writeJsonOutput(ostream &output) const
+{
+  output << R"({"statementName": "det_cond_forecast")";
+  if (options_list.getNumberOfOptions())
+    {
+      output << ", ";
+      options_list.writeJsonOutput(output);
+    }
+  if (!symbol_list.empty())
+    {
+      output << ", ";
+      symbol_list.writeJsonOutput(output);
+    }
+  output << R"(, "linear_decomposition": )"
+         << (linear_decomposition ? "true" : "false")
+         << "}";
+}
+
 RamseyModelStatement::RamseyModelStatement(OptionsList options_list_arg) :
   options_list{move(options_list_arg)}
 {
diff --git a/src/ComputingTasks.hh b/src/ComputingTasks.hh
index c186c268..6bc0d050 100644
--- a/src/ComputingTasks.hh
+++ b/src/ComputingTasks.hh
@@ -106,6 +106,7 @@ public:
                            OptionsList options_list_arg,
                            const bool linear_decompositiontion_arg);
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
+  void writeJsonOutput(ostream &output) const override;
 };
 
 class ModelInfoStatement : public Statement
diff --git a/src/Shocks.cc b/src/Shocks.cc
index 451abc34..d10f0128 100644
--- a/src/Shocks.cc
+++ b/src/Shocks.cc
@@ -151,11 +151,7 @@ void
 ShocksStatement::writeJsonOutput(ostream &output) const
 {
   output << R"({"statementName": "shocks")"
-         << R"(, "overwrite": )";
-  if (overwrite)
-    output << "true";
-  else
-    output << "false";
+         << R"(, "overwrite": )" << (overwrite ? "true" : "false");
   if (!det_shocks.empty())
     {
       output << ", ";
@@ -422,6 +418,19 @@ MShocksStatement::writeOutput(ostream &output, const string &basename, bool mini
   writeDetShocks(output);
 }
 
+void
+MShocksStatement::writeJsonOutput(ostream &output) const
+{
+  output << R"({"statementName": "mshocks")"
+         << R"(, "overwrite": )" << (overwrite ? "true" : "false");
+  if (!det_shocks.empty())
+    {
+      output << ", ";
+      writeJsonDetShocks(output);
+    }
+  output << "}";
+}
+
 ConditionalForecastPathsStatement::ConditionalForecastPathsStatement(AbstractShocksStatement::det_shocks_t paths_arg,
                                                                      const SymbolTable &symbol_table_arg) :
   paths{move(paths_arg)},
diff --git a/src/Shocks.hh b/src/Shocks.hh
index bcc7c301..8d17a7b7 100644
--- a/src/Shocks.hh
+++ b/src/Shocks.hh
@@ -90,6 +90,7 @@ public:
                    const det_shocks_t &det_shocks_arg,
                    const SymbolTable &symbol_table_arg);
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
+  void writeJsonOutput(ostream &output) const override;
 };
 
 class ConditionalForecastPathsStatement : public Statement
diff --git a/src/SigmaeInitialization.cc b/src/SigmaeInitialization.cc
index 9fbcf3cc..62fa0090 100644
--- a/src/SigmaeInitialization.cc
+++ b/src/SigmaeInitialization.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2003-2019 Dynare Team
+ * Copyright © 2003-2020 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -83,7 +83,7 @@ SigmaeStatement::writeOutput(ostream &output, const string &basename, bool minim
               ic1 = ir;
               ir1 = ic;
             }
-          else // ic <= ir && matrix_form == eLower
+          else // ic <= ir && matrix_form == MatrixForm::lower
             {
               ic1 = ic;
               ir1 = ir;
@@ -96,3 +96,25 @@ SigmaeStatement::writeOutput(ostream &output, const string &basename, bool minim
     }
   output << "];" << endl;
 }
+
+void
+SigmaeStatement::writeJsonOutput(ostream &output) const
+{
+  output << R"({"statementName": "Sigma_e", "value": [)";
+  for (auto it = matrix.begin(); it != matrix.end(); ++it)
+    {
+      if (it != matrix.begin())
+        output << ", ";
+      output << "[";
+      for (auto it2 = it->begin(); it2 != it->end(); ++it2)
+        {
+          if (it2 != it->begin())
+            output << ", ";
+          output << '"';
+          (*it2)->writeJsonOutput(output, {}, {});
+          output << '"';
+        }
+      output << "]";
+    }
+  output << "] }";
+}
diff --git a/src/SigmaeInitialization.hh b/src/SigmaeInitialization.hh
index 39d53a9c..14f71723 100644
--- a/src/SigmaeInitialization.hh
+++ b/src/SigmaeInitialization.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2003-2015 Dynare Team
+ * Copyright © 2003-2020 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -58,6 +58,7 @@ private:
 public:
   explicit SigmaeStatement(matrix_t matrix_arg) noexcept(false);
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
+  void writeJsonOutput(ostream &output) const override;
 };
 
 #endif
diff --git a/src/Statement.cc b/src/Statement.cc
index 50f7e99e..5a4be1c0 100644
--- a/src/Statement.cc
+++ b/src/Statement.cc
@@ -34,11 +34,6 @@ Statement::writeJuliaOutput(ostream &output, const string &basename)
 {
 }
 
-void
-Statement::writeJsonOutput(ostream &output) const
-{
-}
-
 void
 Statement::computingPass()
 {
diff --git a/src/Statement.hh b/src/Statement.hh
index e7febfd9..fab30d99 100644
--- a/src/Statement.hh
+++ b/src/Statement.hh
@@ -166,7 +166,7 @@ public:
   */
   virtual void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const = 0;
   virtual void writeJuliaOutput(ostream &output, const string &basename);
-  virtual void writeJsonOutput(ostream &output) const;
+  virtual void writeJsonOutput(ostream &output) const = 0;
 };
 
 class NativeStatement : public Statement
-- 
GitLab