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