diff --git a/DynamicModel.cc b/DynamicModel.cc index 4c97c64c5b44450717730d5b40d95dfd5fdf5224..10024fc69f0932b67c03a101edbd884fd151625d 100644 --- a/DynamicModel.cc +++ b/DynamicModel.cc @@ -3388,10 +3388,11 @@ DynamicModel::walkPacParameters() for (size_t i = 0; i < equations.size(); i++) { bool pac_encountered = false; + pair<int, int> lhs (-1, -1); set<pair<int, pair<int, int> > > params_and_vals; - equations[i]->walkPacParameters(pac_encountered, params_and_vals); + equations[i]->walkPacParameters(pac_encountered, lhs, params_and_vals); if (pac_encountered) - equations[i]->addParamInfoToPac(params_and_vals); + equations[i]->addParamInfoToPac(lhs, params_and_vals); } } diff --git a/ExprNode.cc b/ExprNode.cc index 402519362e35d488e84872cacfe03eb4b329b95b..9a4ddd7168207eef8d296cd064de553f98740ee8 100644 --- a/ExprNode.cc +++ b/ExprNode.cc @@ -579,12 +579,12 @@ NumConstNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_mo } void -NumConstNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const +NumConstNode::walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const { } void -NumConstNode::addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) +NumConstNode::addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) { } @@ -1645,12 +1645,12 @@ VariableNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_mo } void -VariableNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const +VariableNode::walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const { } void -VariableNode::addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) +VariableNode::addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) { } @@ -3052,15 +3052,15 @@ UnaryOpNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_mod } void -UnaryOpNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const +UnaryOpNode::walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const { - arg->walkPacParameters(pac_encountered, params_and_vals); + arg->walkPacParameters(pac_encountered, lhs, params_and_vals); } void -UnaryOpNode::addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) +UnaryOpNode::addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) { - arg->addParamInfoToPac(params_and_vals_arg); + arg->addParamInfoToPac(lhs_arg, params_and_vals_arg); } void @@ -4600,7 +4600,7 @@ BinaryOpNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_mo } void -BinaryOpNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const +BinaryOpNode::walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const { if (op_code == oTimes) { @@ -4626,16 +4626,23 @@ BinaryOpNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, i } } } + else if (op_code == oEqual) + { + set<pair<int, int> > general_lhs; + arg1->collectDynamicVariables(eEndogenous, general_lhs); + if (general_lhs.size() == 1) + lhs = *(general_lhs.begin()); + } - arg1->walkPacParameters(pac_encountered, params_and_vals); - arg2->walkPacParameters(pac_encountered, params_and_vals); + arg1->walkPacParameters(pac_encountered, lhs, params_and_vals); + arg2->walkPacParameters(pac_encountered, lhs, params_and_vals); } void -BinaryOpNode::addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) +BinaryOpNode::addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) { - arg1->addParamInfoToPac(params_and_vals_arg); - arg2->addParamInfoToPac(params_and_vals_arg); + arg1->addParamInfoToPac(lhs_arg, params_and_vals_arg); + arg2->addParamInfoToPac(lhs_arg, params_and_vals_arg); } void @@ -5415,19 +5422,19 @@ TrinaryOpNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_m } void -TrinaryOpNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const +TrinaryOpNode::walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶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); + arg1->walkPacParameters(pac_encountered, lhs, params_and_vals); + arg2->walkPacParameters(pac_encountered, lhs, params_and_vals); + arg3->walkPacParameters(pac_encountered, lhs, params_and_vals); } void -TrinaryOpNode::addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) +TrinaryOpNode::addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) { - arg1->addParamInfoToPac(params_and_vals_arg); - arg2->addParamInfoToPac(params_and_vals_arg); - arg3->addParamInfoToPac(params_and_vals_arg); + arg1->addParamInfoToPac(lhs_arg, params_and_vals_arg); + arg2->addParamInfoToPac(lhs_arg, params_and_vals_arg); + arg3->addParamInfoToPac(lhs_arg, params_and_vals_arg); } void @@ -5805,17 +5812,17 @@ AbstractExternalFunctionNode::setVarExpectationIndex(map<string, pair<SymbolList } void -AbstractExternalFunctionNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const +AbstractExternalFunctionNode::walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const { for (vector<expr_t>::const_iterator it = arguments.begin(); it != arguments.end(); it++) - (*it)->walkPacParameters(pac_encountered, params_and_vals); + (*it)->walkPacParameters(pac_encountered, lhs, params_and_vals); } void -AbstractExternalFunctionNode::addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) +AbstractExternalFunctionNode::addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) { for (vector<expr_t>::const_iterator it = arguments.begin(); it != arguments.end(); it++) - (*it)->addParamInfoToPac(params_and_vals_arg); + (*it)->addParamInfoToPac(lhs_arg, params_and_vals_arg); } void @@ -7290,12 +7297,12 @@ VarExpectationNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > & } void -VarExpectationNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const +VarExpectationNode::walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const { } void -VarExpectationNode::addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) +VarExpectationNode::addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) { } @@ -7394,7 +7401,10 @@ PacExpectationNode::writeOutput(ostream &output, ExprNodeOutputType output_type, output <<"M_.pac_expectation." << model_name << ".var_model_name = '" << var_model_name << "';" << endl << "M_.pac_expectation." << model_name << ".discount_index = " << datatree.symbol_table.getTypeSpecificID(discount_symb_id) + 1 << ";" << endl - << "M_.pac_expectation." << model_name << ".equation_number = " << equation_number + 1 << ";" << endl; + << "M_.pac_expectation." << model_name << ".equation_number = " << equation_number + 1 << ";" << endl + << "M_.pac_expectation." << model_name << ".lhs_var = " + << datatree.symbol_table.getTypeSpecificID(lhs_pac_var.first) + 1 << ";" << endl + << "M_.pac_expectation." << model_name << ".lhs_lag = " << lhs_pac_var.second << ";" << endl; if (growth_symb_id >= 0) output << "M_.pac_expectation." << model_name << ".growth_neutrality_param_index = " @@ -7714,14 +7724,27 @@ PacExpectationNode::writeJsonOutput(ostream &output, } void -PacExpectationNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const +PacExpectationNode::walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const { pac_encountered = true; } void -PacExpectationNode::addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) +PacExpectationNode::addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) { + if (lhs_arg.first == -1) + { + cerr << "Pac Expectation: error in obtaining LHS varibale." << endl; + exit(EXIT_FAILURE); + } + + if (params_and_vals_arg.size() != 2) + { + cerr << "Pac Expectation: error in obtaining RHS parameters." << endl; + exit(EXIT_FAILURE); + } + + lhs_pac_var = lhs_arg; params_and_vals = params_and_vals_arg; } diff --git a/ExprNode.hh b/ExprNode.hh index b292b474daa690b95d3e932aba2b92bda9718ea3..f674887ebd4fd9693a198000dbd8e48cfaf2d6bb 100644 --- a/ExprNode.hh +++ b/ExprNode.hh @@ -490,10 +490,10 @@ class ExprNode virtual bool isVarModelReferenced(const string &model_info_name) const = 0; //! Fills parameter information related to PAC equation - virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const = 0; + virtual void walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const = 0; //! Adds PAC equation param info to pac_expectation - virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) = 0; + virtual void addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg) = 0; //! Fills var_model info for pac_expectation node virtual void fillPacExpectationVarInfo(string &var_model_name, vector<int> &lhs, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg) = 0; @@ -566,8 +566,8 @@ public: virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info); - virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; - virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); + virtual void walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const; @@ -647,8 +647,8 @@ public: virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info); - virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; - virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); + virtual void walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const; @@ -751,8 +751,8 @@ public: virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info); - virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; - virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); + virtual void walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const; @@ -873,8 +873,8 @@ public: expr_t getNonZeroPartofEquation() const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info); - virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; - virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); + virtual void walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const; @@ -963,8 +963,8 @@ public: virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info); - virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; - virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); + virtual void walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const; @@ -1061,8 +1061,8 @@ public: virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info); - virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; - virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); + virtual void walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const; @@ -1252,8 +1252,8 @@ public: virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info); - virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; - virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); + virtual void walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const; @@ -1268,6 +1268,7 @@ private: const int discount_symb_id, growth_symb_id; bool stationary_vars_present, nonstationary_vars_present; vector<int> lhs; + pair<int, int> lhs_pac_var; map<int, set<int > > z_vec; // lag -> set< symb_id > (all vars that appear at a given lag) vector<int> h0_indices, h1_indices; int growth_param_index, equation_number; @@ -1326,8 +1327,8 @@ public: virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info); - virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; - virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); + virtual void walkPacParameters(bool &pac_encountered, pair<int, int> &lhs, set<pair<int, pair<int, int> > > ¶ms_and_vals) const; + virtual void addParamInfoToPac(pair<int, int> &lhs_arg, set<pair<int, pair<int, int> > > ¶ms_and_vals_arg); virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;