From 89ae7048065b8754e161908d5ade50e14558204d Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Mon, 12 Feb 2018 17:37:53 +0100 Subject: [PATCH] preprocessor: add PAC equation parameter info to pac_expectation output --- DynamicModel.cc | 13 ++++ DynamicModel.hh | 2 + ExprNode.cc | 156 +++++++++++++++++++++++++++++++++++++++++++++++- ExprNode.hh | 23 +++++++ ModFile.cc | 1 + 5 files changed, 192 insertions(+), 3 deletions(-) diff --git a/DynamicModel.cc b/DynamicModel.cc index 74235425..4c97c64c 100644 --- a/DynamicModel.cc +++ b/DynamicModel.cc @@ -3382,6 +3382,19 @@ DynamicModel::addEquationsForVar(map > &var_model_ cout << "Accounting for var_model lags not in model block: added " << count << " auxiliary variables and equations." << endl; } +void +DynamicModel::walkPacParameters() +{ + for (size_t i = 0; i < equations.size(); i++) + { + bool pac_encountered = false; + set > > params_and_vals; + equations[i]->walkPacParameters(pac_encountered, params_and_vals); + if (pac_encountered) + equations[i]->addParamInfoToPac(params_and_vals); + } +} + void DynamicModel::fillPacExpectationVarInfo(string &var_model_name, vector &lhs, diff --git a/DynamicModel.hh b/DynamicModel.hh index 598a5c68..afcd72b9 100644 --- a/DynamicModel.hh +++ b/DynamicModel.hh @@ -297,6 +297,8 @@ public: void setVarExpectationIndices(map > &var_model_info); //! Add aux equations (and aux variables) for variables declared in var_model at max order if they don't already exist void addEquationsForVar(map > &var_model_info); + //! Get Pac equation parameter info + void walkPacParameters(); //! Add var_model info to pac_expectation nodes void fillPacExpectationVarInfo(string &var_model_name, vector &lhs, diff --git a/ExprNode.cc b/ExprNode.cc index 959074d7..aaa4b24c 100644 --- a/ExprNode.cc +++ b/ExprNode.cc @@ -578,6 +578,16 @@ NumConstNode::setVarExpectationIndex(map > &var_mo { } +void +NumConstNode::walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const +{ +} + +void +NumConstNode::addParamInfoToPac(set > > ¶ms_and_vals_arg) +{ +} + void NumConstNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg) { @@ -1634,6 +1644,16 @@ VariableNode::setVarExpectationIndex(map > &var_mo { } +void +VariableNode::walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const +{ +} + +void +VariableNode::addParamInfoToPac(set > > ¶ms_and_vals_arg) +{ +} + void VariableNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg) { @@ -3031,6 +3051,18 @@ UnaryOpNode::setVarExpectationIndex(map > &var_mod arg->setVarExpectationIndex(var_model_info); } +void +UnaryOpNode::walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const +{ + arg->walkPacParameters(pac_encountered, params_and_vals); +} + +void +UnaryOpNode::addParamInfoToPac(set > > ¶ms_and_vals_arg) +{ + arg->addParamInfoToPac(params_and_vals_arg); +} + void UnaryOpNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg) { @@ -4567,6 +4599,45 @@ BinaryOpNode::setVarExpectationIndex(map > &var_mo arg2->setVarExpectationIndex(var_model_info); } +void +BinaryOpNode::walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const +{ + if (op_code == oTimes) + { + set params; + set > endogs; + arg1->collectVariables(eParameter, params); + arg2->collectDynamicVariables(eEndogenous, endogs); + if (params.size() == 1 && endogs.size() == 1) + { + params_and_vals.insert(make_pair(*(params.begin()), *(endogs.begin()))); + return; + } + else + { + params.clear(); + endogs.clear(); + arg1->collectDynamicVariables(eEndogenous, endogs); + arg2->collectVariables(eParameter, params); + if (params.size() == 1 && endogs.size() == 1) + { + params_and_vals.insert(make_pair(*(params.begin()), *(endogs.begin()))); + return; + } + } + } + + arg1->walkPacParameters(pac_encountered, params_and_vals); + arg2->walkPacParameters(pac_encountered, params_and_vals); +} + +void +BinaryOpNode::addParamInfoToPac(set > > ¶ms_and_vals_arg) +{ + arg1->addParamInfoToPac(params_and_vals_arg); + arg2->addParamInfoToPac(params_and_vals_arg); +} + void BinaryOpNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg) { @@ -5343,6 +5414,22 @@ TrinaryOpNode::setVarExpectationIndex(map > &var_m arg3->setVarExpectationIndex(var_model_info); } +void +TrinaryOpNode::walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const +{ + arg1->walkPacParameters(pac_encountered, params_and_vals); + arg2->walkPacParameters(pac_encountered, params_and_vals); + arg3->walkPacParameters(pac_encountered, params_and_vals); +} + +void +TrinaryOpNode::addParamInfoToPac(set > > ¶ms_and_vals_arg) +{ + arg1->addParamInfoToPac(params_and_vals_arg); + arg2->addParamInfoToPac(params_and_vals_arg); + arg3->addParamInfoToPac(params_and_vals_arg); +} + void TrinaryOpNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg) { @@ -5717,6 +5804,20 @@ AbstractExternalFunctionNode::setVarExpectationIndex(mapsetVarExpectationIndex(var_model_info); } +void +AbstractExternalFunctionNode::walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const +{ + for (vector::const_iterator it = arguments.begin(); it != arguments.end(); it++) + (*it)->walkPacParameters(pac_encountered, params_and_vals); +} + +void +AbstractExternalFunctionNode::addParamInfoToPac(set > > ¶ms_and_vals_arg) +{ + for (vector::const_iterator it = arguments.begin(); it != arguments.end(); it++) + (*it)->addParamInfoToPac(params_and_vals_arg); +} + void AbstractExternalFunctionNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg) { @@ -7188,6 +7289,16 @@ VarExpectationNode::setVarExpectationIndex(map > & yidx = find(vs.begin(), vs.end(), datatree.symbol_table.getName(symb_id)) - vs.begin(); } +void +VarExpectationNode::walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const +{ +} + +void +VarExpectationNode::addParamInfoToPac(set > > ¶ms_and_vals_arg) +{ +} + void VarExpectationNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg) { @@ -7289,9 +7400,35 @@ PacExpectationNode::writeOutput(ostream &output, ExprNodeOutputType output_type, output << "M_.pac_expectation." << model_name << ".growth_name = '" << datatree.symbol_table.getName(growth_symb_id) << "';" << endl << "M_.pac_expectation." << model_name << ".growth_neutrality_param_index = " - << datatree.symbol_table.getTypeSpecificID(growth_param_index) + 1 << ";" << endl; - - output << "M_.pac_expectation." << model_name << ".h0_param_indices = ["; + << datatree.symbol_table.getTypeSpecificID(growth_param_index) + 1 << ";" << endl + << "M_.pac_expectation." << model_name << ".equation_params = ["; + for (set > >::const_iterator it = params_and_vals.begin(); + it != params_and_vals.end(); it++) + { + if (it != params_and_vals.begin()) + output << " "; + output << datatree.symbol_table.getTypeSpecificID(it->first) + 1; + } + output << "];" << endl + << "M_.pac_expectation." << model_name << ".equation_vars = ["; + for (set > >::const_iterator it = params_and_vals.begin(); + it != params_and_vals.end(); it++) + { + if (it != params_and_vals.begin()) + output << " "; + output << datatree.symbol_table.getTypeSpecificID(it->second.first) + 1; + } + output << "];" << endl + << "M_.pac_expectation." << model_name << ".equation_var_lags = ["; + for (set > >::const_iterator it = params_and_vals.begin(); + it != params_and_vals.end(); it++) + { + if (it != params_and_vals.begin()) + output << " "; + output << it->second.second; + } + output << "];" << endl + << "M_.pac_expectation." << model_name << ".h0_param_indices = ["; for (vector::const_iterator it = h0_indices.begin(); it != h0_indices.end(); it++) { @@ -7559,6 +7696,19 @@ PacExpectationNode::writeJsonOutput(ostream &output, output << ")"; } +void +PacExpectationNode::walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const +{ + pac_encountered = true; +} + +void +PacExpectationNode::addParamInfoToPac(set > > ¶ms_and_vals_arg) +{ + params_and_vals = params_and_vals_arg; +} + + void PacExpectationNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg) { diff --git a/ExprNode.hh b/ExprNode.hh index 1d3a2392..b292b474 100644 --- a/ExprNode.hh +++ b/ExprNode.hh @@ -489,6 +489,12 @@ class ExprNode //! Returns true if model_info_name is referenced by a VarExpectationNode virtual bool isVarModelReferenced(const string &model_info_name) const = 0; + //! Fills parameter information related to PAC equation + virtual void walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const = 0; + + //! Adds PAC equation param info to pac_expectation + virtual void addParamInfoToPac(set > > ¶ms_and_vals_arg) = 0; + //! Fills var_model info for pac_expectation node virtual void fillPacExpectationVarInfo(string &var_model_name, vector &lhs, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg) = 0; @@ -560,6 +566,8 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); + virtual void walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(set > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; @@ -639,6 +647,8 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); + virtual void walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(set > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; @@ -741,6 +751,8 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); + virtual void walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(set > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; @@ -861,6 +873,8 @@ public: expr_t getNonZeroPartofEquation() const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); + virtual void walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(set > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; @@ -949,6 +963,8 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); + virtual void walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(set > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; @@ -1045,6 +1061,8 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); + virtual void walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(set > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; @@ -1234,6 +1252,8 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); + virtual void walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(set > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; @@ -1251,6 +1271,7 @@ private: map > z_vec; // lag -> set< symb_id > (all vars that appear at a given lag) vector h0_indices, h1_indices; int growth_param_index, equation_number; + set > > params_and_vals; public: PacExpectationNode(DataTree &datatree_arg, const string &model_name, const string &var_model_name, const int discount_arg, const int growth_arg); @@ -1305,6 +1326,8 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); + virtual void walkPacParameters(bool &pac_encountered, set > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(set > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; diff --git a/ModFile.cc b/ModFile.cc index faf33ece..eb4a374b 100644 --- a/ModFile.cc +++ b/ModFile.cc @@ -389,6 +389,7 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, const map > rhs_pac; vms->getVarModelName(var_model_name); vms->getVarModelRHS(rhs_pac); + dynamic_model.walkPacParameters(); dynamic_model.fillPacExpectationVarInfo(var_model_name, lhs, rhs_pac, nonstationary); dynamic_model.substitutePacExpectation(); }