From ff564cbc9aa54f2368edba2201b8dc4ab932ecee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
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

(cherry picked from commit 5bef1853709252d738da079e13b36558ca54cc11)
---
 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 fb84ffcb..0b7cc063 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<string, string>, pair<string, int>> &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<VariableNode *>(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<string, string>, pair<string, int>> &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<int> 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);
-- 
GitLab