diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index bb4c0ef23c5c91f2d2765bae47af7e80ee5b0538..4a3d159c12c2f31beb05125c29ee47575b33cb5f 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -5586,24 +5586,24 @@ DynamicModel::findPacExpectationEquationNumbers(set<int> &eqnumbers) const } pair<lag_equivalence_table_t, ExprNode::subst_table_t> -DynamicModel::substituteUnaryOps() +DynamicModel::substituteUnaryOps(PacModelTable &pac_model_table) { vector<int> eqnumbers(equations.size()); iota(eqnumbers.begin(), eqnumbers.end(), 0); - return substituteUnaryOps(eqnumbers); + return substituteUnaryOps(eqnumbers, pac_model_table); } pair<lag_equivalence_table_t, ExprNode::subst_table_t> -DynamicModel::substituteUnaryOps(const set<string> &var_model_eqtags) +DynamicModel::substituteUnaryOps(const set<string> &var_model_eqtags, PacModelTable &pac_model_table) { set<int> eqnumbers = getEquationNumbersFromTags(var_model_eqtags); findPacExpectationEquationNumbers(eqnumbers); vector<int> eqnumbers_vec(eqnumbers.begin(), eqnumbers.end()); - return substituteUnaryOps(eqnumbers_vec); + return substituteUnaryOps(eqnumbers_vec, pac_model_table); } pair<lag_equivalence_table_t, ExprNode::subst_table_t> -DynamicModel::substituteUnaryOps(const vector<int> &eqnumbers) +DynamicModel::substituteUnaryOps(const vector<int> &eqnumbers, PacModelTable &pac_model_table) { lag_equivalence_table_t nodes; ExprNode::subst_table_t subst_table; @@ -5633,6 +5633,9 @@ DynamicModel::substituteUnaryOps(const vector<int> &eqnumbers) equations[eq] = substeq; } + // Substitute in growth terms in pac_model and pac_target_info + pac_model_table.substituteUnaryOpsInGrowth(nodes, subst_table, neweqs); + // Add new equations for (auto &neweq : neweqs) { diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh index 51265ac173fc91ccb3962798abe9f568cd88c73f..85be14bb3c408bc19e7e720de31e53dda3b6ad7b 100644 --- a/src/DynamicModel.hh +++ b/src/DynamicModel.hh @@ -525,13 +525,13 @@ public: void substituteModelLocalVariables(); //! Creates aux vars for all unary operators - pair<lag_equivalence_table_t, ExprNode::subst_table_t> substituteUnaryOps(); + pair<lag_equivalence_table_t, ExprNode::subst_table_t> substituteUnaryOps(PacModelTable &pac_model_table); //! Creates aux vars for unary operators in certain equations: originally implemented for support of VARs - pair<lag_equivalence_table_t, ExprNode::subst_table_t> substituteUnaryOps(const set<string> &eq_tags); + pair<lag_equivalence_table_t, ExprNode::subst_table_t> substituteUnaryOps(const set<string> &eq_tags, PacModelTable &pac_model_table); //! Creates aux vars for unary operators in certain equations: originally implemented for support of VARs - pair<lag_equivalence_table_t, ExprNode::subst_table_t> substituteUnaryOps(const vector<int> &eqnumbers); + pair<lag_equivalence_table_t, ExprNode::subst_table_t> substituteUnaryOps(const vector<int> &eqnumbers, PacModelTable &pac_model_table); //! Substitutes diff operator pair<lag_equivalence_table_t, ExprNode::subst_table_t> substituteDiff(PacModelTable &pac_model_table); diff --git a/src/ModFile.cc b/src/ModFile.cc index 916d471769d95813424b40bac430d0dd77d4baf3..1ee64c9bb23e28089a814235a822166f56bd03f8 100644 --- a/src/ModFile.cc +++ b/src/ModFile.cc @@ -1,5 +1,5 @@ /* - * Copyright © 2006-2021 Dynare Team + * Copyright © 2006-2022 Dynare Team * * This file is part of Dynare. * @@ -426,10 +426,10 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, bool lag_equivalence_table_t unary_ops_nodes; ExprNode::subst_table_t unary_ops_subst_table; if (transform_unary_ops) - tie(unary_ops_nodes, unary_ops_subst_table) = dynamic_model.substituteUnaryOps(); + tie(unary_ops_nodes, unary_ops_subst_table) = dynamic_model.substituteUnaryOps(pac_model_table); else // substitute only those unary ops that appear in auxiliary model equations - tie(unary_ops_nodes, unary_ops_subst_table) = dynamic_model.substituteUnaryOps(eqtags); + tie(unary_ops_nodes, unary_ops_subst_table) = dynamic_model.substituteUnaryOps(eqtags, pac_model_table); // Create auxiliary variable and equations for Diff operators auto [diff_nodes, diff_subst_table] = dynamic_model.substituteDiff(pac_model_table); diff --git a/src/SubModel.cc b/src/SubModel.cc index 3df70279ecd9b31b0932164a3630129cbf71fefd..6b9f6ff8961aff9accd5457a4d17203b189a1f5c 100644 --- a/src/SubModel.cc +++ b/src/SubModel.cc @@ -872,6 +872,19 @@ PacModelTable::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation } } +void +PacModelTable::substituteUnaryOpsInGrowth(const lag_equivalence_table_t &nodes, ExprNode::subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) +{ + for (auto &[name, gv] : growth) + if (gv) + gv = gv->substituteUnaryOpNodes(nodes, subst_table, neweqs); + + for (auto &[name, ti] : target_info) + for (auto &[expr, gv, auxname, kind, coeff, growth_neutrality_param, h_indices, original_gv, gv_info] : get<2>(ti)) + if (gv) + gv = gv->substituteUnaryOpNodes(nodes, subst_table, neweqs); +} + void PacModelTable::findDiffNodesInGrowth(lag_equivalence_table_t &diff_nodes) const { diff --git a/src/SubModel.hh b/src/SubModel.hh index dcbf8a0569dc667b7c219d12a74df7097a2c5722..548d323a3f02ef4eddc8ac9c58a326c3b2533fb1 100644 --- a/src/SubModel.hh +++ b/src/SubModel.hh @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2021 Dynare Team + * Copyright © 2018-2022 Dynare Team * * This file is part of Dynare. * @@ -276,10 +276,12 @@ public: bool isExistingPacModelName(const string &name_arg) const; bool empty() const; void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings); + // Called by DynamicModel::substituteUnaryOps() + void substituteUnaryOpsInGrowth(const lag_equivalence_table_t &nodes, ExprNode::subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs); void findDiffNodesInGrowth(lag_equivalence_table_t &diff_nodes) const; // Called by DynamicModel::substituteDiff() void substituteDiffNodesInGrowth(const lag_equivalence_table_t &diff_nodes, ExprNode::subst_table_t &diff_subst_table, vector<BinaryOpNode *> &neweqs); - // Must be called after substituteDiffNodesInGrowth() + // Must be called after substituteDiffNodesInGrowth() and substituteUnaryOpsInGrowth() void transformPass(const lag_equivalence_table_t &unary_ops_nodes, ExprNode::subst_table_t &unary_ops_subst_table, const lag_equivalence_table_t &diff_nodes,