diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc index 099a8500cd6019ca1a5fc5e499683f75627c027f..ede7a71e3da443a33b997720b92e574846e432e9 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 c3008925852195a7b9a082697ffee37ee4248cb1..facaab90ab8c5357506ab5985c0530317c93c5e3 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 847ce76f20d0679120845e579a5f3f3d465cb077..1d2dde48801292428cfcc53848fd0ed6e0a90cc9 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 9f89cbf4b1c66e0b7008e2e4ad58681fc12cd5ab..3094863436761eaa8f8a6ab84792947d7de96114 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 ce07bd0a38fafda45de4fc2a400664e3cadf739b..b6cd328e9ae5379fce6e40805212f56617db3286 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