From ea44aa19d6dd2bf4c508ee081b2b6cae2a647250 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Thu, 16 Dec 2021 14:22:31 +0100
Subject: [PATCH] =?UTF-8?q?New=20option=20=E2=80=9Coverwrite=E2=80=9D=20to?=
 =?UTF-8?q?=20=E2=80=9Cestimated=5Fparams=E2=80=9D=20block?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This option provides the same behaviour as before the change in
60ef6bbdbd2f95b7f8d52b1c10cf6bb9aa7773cc.

It is typically useful when doing several estimations in the same .mod file.
---
 src/ComputingTasks.cc | 28 +++++++++++++++++-----------
 src/ComputingTasks.hh |  5 ++++-
 src/DynareBison.yy    |  6 +++++-
 src/ParsingDriver.cc  |  4 ++--
 src/ParsingDriver.hh  |  2 +-
 5 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc
index 099a8500..ede7a71e 100644
--- a/src/ComputingTasks.cc
+++ b/src/ComputingTasks.cc
@@ -1320,8 +1320,10 @@ AbstractEstimatedParamsStatement::commonCheckPass() const
 }
 
 EstimatedParamsStatement::EstimatedParamsStatement(vector<EstimationParams> estim_params_list_arg,
-                                                   const SymbolTable &symbol_table_arg) :
-  AbstractEstimatedParamsStatement(move(estim_params_list_arg), symbol_table_arg)
+                                                   const SymbolTable &symbol_table_arg,
+                                                   bool overwrite_arg) :
+  AbstractEstimatedParamsStatement(move(estim_params_list_arg), symbol_table_arg),
+  overwrite{overwrite_arg}
 {
 }
 
@@ -1361,15 +1363,19 @@ EstimatedParamsStatement::checkPass(ModFileStructure &mod_file_struct, WarningCo
 void
 EstimatedParamsStatement::writeOutput(ostream &output, const string &basename, bool minimal_workspace) const
 {
-  /* Multiple estimated_params statements are allowed, so make sure we don’t
-     overwrite previous ones. */
-  output << "if isempty(estim_params_)" << endl
-         << "    estim_params_.var_exo = zeros(0, 10);" << endl
-         << "    estim_params_.var_endo = zeros(0, 10);" << endl
-         << "    estim_params_.corrx = zeros(0, 11);" << endl
-         << "    estim_params_.corrn = zeros(0, 11);" << endl
-         << "    estim_params_.param_vals = zeros(0, 10);" << endl
-         << "end" << endl;
+  string indent;
+  if (!overwrite)
+    {
+      output << "if isempty(estim_params_)" << endl;
+      indent = "    ";
+    }
+  output << indent << "estim_params_.var_exo = zeros(0, 10);" << endl
+         << indent << "estim_params_.var_endo = zeros(0, 10);" << endl
+         << indent << "estim_params_.corrx = zeros(0, 11);" << endl
+         << indent << "estim_params_.corrn = zeros(0, 11);" << endl
+         << indent << "estim_params_.param_vals = zeros(0, 10);" << endl;
+  if (!overwrite)
+    output << "end" << endl;
 
   for (const auto &it : estim_params_list)
     {
diff --git a/src/ComputingTasks.hh b/src/ComputingTasks.hh
index c3008925..facaab90 100644
--- a/src/ComputingTasks.hh
+++ b/src/ComputingTasks.hh
@@ -504,9 +504,12 @@ protected:
 
 class EstimatedParamsStatement : public AbstractEstimatedParamsStatement
 {
+private:
+  const bool overwrite;
 public:
   EstimatedParamsStatement(vector<EstimationParams> estim_params_list_arg,
-                           const SymbolTable &symbol_table_arg);
+                           const SymbolTable &symbol_table_arg,
+                           bool overwrite_arg);
   string blockName() const override { return "estimated_params"; };
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
diff --git a/src/DynareBison.yy b/src/DynareBison.yy
index 847ce76f..1d2dde48 100644
--- a/src/DynareBison.yy
+++ b/src/DynareBison.yy
@@ -1738,7 +1738,11 @@ boolean : TRUE
         | FALSE
         ;
 
-estimated_params : ESTIMATED_PARAMS ';' estimated_list END ';' { driver.estimated_params(); };
+estimated_params : ESTIMATED_PARAMS ';' estimated_list END ';'
+                   { driver.estimated_params(false); }
+                 | ESTIMATED_PARAMS '(' OVERWRITE ')' ';' estimated_list END ';'
+                   { driver.estimated_params(true); }
+                 ;
 
 estimated_list : estimated_list estimated_elem
                  { driver.add_estimated_params_element(); }
diff --git a/src/ParsingDriver.cc b/src/ParsingDriver.cc
index 9f89cbf4..30948634 100644
--- a/src/ParsingDriver.cc
+++ b/src/ParsingDriver.cc
@@ -1469,9 +1469,9 @@ ParsingDriver::add_estimated_params_element()
 }
 
 void
-ParsingDriver::estimated_params()
+ParsingDriver::estimated_params(bool overwrite)
 {
-  mod_file->addStatement(make_unique<EstimatedParamsStatement>(estim_params_list, mod_file->symbol_table));
+  mod_file->addStatement(make_unique<EstimatedParamsStatement>(estim_params_list, mod_file->symbol_table, overwrite));
   estim_params_list.clear();
 }
 
diff --git a/src/ParsingDriver.hh b/src/ParsingDriver.hh
index ce07bd0a..b6cd328e 100644
--- a/src/ParsingDriver.hh
+++ b/src/ParsingDriver.hh
@@ -507,7 +507,7 @@ public:
   //! Writes model_info command
   void model_info();
   //! Writes estimated params command
-  void estimated_params();
+  void estimated_params(bool overwrite);
   //! Writes estimated params init command
   void estimated_params_init(bool use_calibration = false);
   //! Writes estimated params bound command
-- 
GitLab