From 5bef1853709252d738da079e13b36558ca54cc11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Mon, 25 Oct 2021 15:36:22 +0200 Subject: [PATCH] =?UTF-8?q?PAC:=20add=20growth=20correction=20term=20for?= =?UTF-8?q?=20definition=20of=20Z=E2=82=81=20in=20the=20MCE=20case?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/DynamicModel.cc | 9 +++++++-- src/DynamicModel.hh | 2 +- src/ModFile.cc | 3 ++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index 956a6c40..8717e739 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -4067,7 +4067,8 @@ DynamicModel::declarePacModelConsistentExpectationEndogs(const string &name) void DynamicModel::addPacModelConsistentExpectationEquation(const string &name, int discount_symb_id, const map, pair> &eqtag_and_lag, - ExprNode::subst_table_t &diff_subst_table) + ExprNode::subst_table_t &diff_subst_table, + expr_t growth) { int pac_target_symb_id; try @@ -4190,7 +4191,11 @@ DynamicModel::addPacModelConsistentExpectationEquation(const string &name, int d AddMinus(AddTimes(A, AddMinus(const_cast(target_base_diff_node), fs)), fp)); addEquation(neweq, -1); neqs++; - pac_expectation_substitution[{name, eqtag}] = AddVariable(mce_z1_symb_id); + /* The growth correction term is not added to the definition of Z₁ + because the latter is recursive. Rather put it at the level of the + substition of pac_expectation operator. */ + expr_t growth_correction = growth ? AddTimes(AddVariable(pac_growth_neutrality_params.at(name)), growth) : Zero; + pac_expectation_substitution[{name, eqtag}] = AddPlus(AddVariable(mce_z1_symb_id), growth_correction); } cout << "Pac Model Consistent Expectation: added " << neqs << " auxiliary variables and equations for model " << name << "." << endl; } diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh index 7b97e8d4..ee08a698 100644 --- a/src/DynamicModel.hh +++ b/src/DynamicModel.hh @@ -582,7 +582,7 @@ public: //! Add model consistent expectation equation for pac model void addPacModelConsistentExpectationEquation(const string &name, int discount, const map, pair> &eqtag_and_lag, - ExprNode::subst_table_t &diff_subst_table); + ExprNode::subst_table_t &diff_subst_table, expr_t growth); //! Table to undiff LHS variables for pac vector z vector getUndiffLHSForPac(const string &aux_model_name, diff --git a/src/ModFile.cc b/src/ModFile.cc index 4cd14be5..511f29c0 100644 --- a/src/ModFile.cc +++ b/src/ModFile.cc @@ -490,7 +490,8 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, bool auto eqtag_and_lag = dynamic_model.walkPacParameters(pms->name); if (pms->aux_model_name.empty()) dynamic_model.addPacModelConsistentExpectationEquation(pms->name, symbol_table.getID(pms->discount), - eqtag_and_lag, diff_subst_table); + eqtag_and_lag, diff_subst_table, + pms->growth); else dynamic_model.fillPacModelInfo(pms->name, lhs, max_lag, aux_model_type, eqtag_and_lag, nonstationary, pms->growth);