diff --git a/DynamicModel.cc b/DynamicModel.cc index f6a54358..615d0232 100644 --- a/DynamicModel.cc +++ b/DynamicModel.cc @@ -3384,11 +3384,12 @@ DynamicModel::addEquationsForVar(map > &var_model_ void DynamicModel::fillPacExpectationVarInfo(string &var_model_name, + vector &lhs, map > &rhs, vector &nonstationary) { for (size_t i = 0; i < equations.size(); i++) - equations[i]->fillPacExpectationVarInfo(var_model_name, rhs, nonstationary); + equations[i]->fillPacExpectationVarInfo(var_model_name, lhs, rhs, nonstationary); } void diff --git a/DynamicModel.hh b/DynamicModel.hh index d87b412b..598a5c68 100644 --- a/DynamicModel.hh +++ b/DynamicModel.hh @@ -299,6 +299,7 @@ public: void addEquationsForVar(map > &var_model_info); //! Add var_model info to pac_expectation nodes void fillPacExpectationVarInfo(string &var_model_name, + vector &lhs, map > &rhs, vector &nonstationary); //! Substitutes pac_expectation operator diff --git a/ExprNode.cc b/ExprNode.cc index e2dbba7e..effec690 100644 --- a/ExprNode.cc +++ b/ExprNode.cc @@ -579,7 +579,7 @@ NumConstNode::setVarExpectationIndex(map > &var_mo } void -NumConstNode::fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg) +NumConstNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg) { } @@ -1635,7 +1635,7 @@ VariableNode::setVarExpectationIndex(map > &var_mo } void -VariableNode::fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg) +VariableNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg) { } @@ -3032,9 +3032,9 @@ UnaryOpNode::setVarExpectationIndex(map > &var_mod } void -UnaryOpNode::fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg) +UnaryOpNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg) { - arg->fillPacExpectationVarInfo(var_model_name, rhs_arg, nonstationary_arg); + arg->fillPacExpectationVarInfo(var_model_name_arg, lhs_arg, rhs_arg, nonstationary_arg); } bool @@ -4568,10 +4568,10 @@ BinaryOpNode::setVarExpectationIndex(map > &var_mo } void -BinaryOpNode::fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg) +BinaryOpNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg) { - arg1->fillPacExpectationVarInfo(var_model_name, rhs_arg, nonstationary_arg); - arg2->fillPacExpectationVarInfo(var_model_name, rhs_arg, nonstationary_arg); + arg1->fillPacExpectationVarInfo(var_model_name_arg, lhs_arg, rhs_arg, nonstationary_arg); + arg2->fillPacExpectationVarInfo(var_model_name_arg, lhs_arg, rhs_arg, nonstationary_arg); } bool @@ -5344,11 +5344,11 @@ TrinaryOpNode::setVarExpectationIndex(map > &var_m } void -TrinaryOpNode::fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg) +TrinaryOpNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg) { - arg1->fillPacExpectationVarInfo(var_model_name, rhs_arg, nonstationary_arg); - arg2->fillPacExpectationVarInfo(var_model_name, rhs_arg, nonstationary_arg); - arg3->fillPacExpectationVarInfo(var_model_name, rhs_arg, nonstationary_arg); + arg1->fillPacExpectationVarInfo(var_model_name_arg, lhs_arg, rhs_arg, nonstationary_arg); + arg2->fillPacExpectationVarInfo(var_model_name_arg, lhs_arg, rhs_arg, nonstationary_arg); + arg3->fillPacExpectationVarInfo(var_model_name_arg, lhs_arg, rhs_arg, nonstationary_arg); } bool @@ -5718,10 +5718,10 @@ AbstractExternalFunctionNode::setVarExpectationIndex(map > &rhs_arg, vector &nonstationary_arg) +AbstractExternalFunctionNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg) { for (vector::const_iterator it = arguments.begin(); it != arguments.end(); it++) - (*it)->fillPacExpectationVarInfo(var_model_name, rhs_arg, nonstationary_arg); + (*it)->fillPacExpectationVarInfo(var_model_name_arg, lhs_arg, rhs_arg, nonstationary_arg); } bool @@ -7189,7 +7189,7 @@ VarExpectationNode::setVarExpectationIndex(map > & } void -VarExpectationNode::fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg) +VarExpectationNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg) { } @@ -7554,11 +7554,13 @@ PacExpectationNode::writeJsonOutput(ostream &output, } void -PacExpectationNode::fillPacExpectationVarInfo(string &var_model_name_arg, map > &rhs_arg, vector &nonstationary_arg) +PacExpectationNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, + map > &rhs_arg, vector &nonstationary_arg) { if (var_model_name != var_model_name_arg) return; + lhs = lhs_arg; z_vec = rhs_arg; for (vector::const_iterator it = nonstationary_arg.begin(); @@ -7581,37 +7583,36 @@ PacExpectationNode::substitutePacExpectation(map(myit->second); + int maxlag = z_vec.size(); expr_t subExpr = datatree.AddNonNegativeConstant("0"); if (stationary_vars_present) - for (map >::const_iterator it = z_vec.begin(); - it != z_vec.end(); it++) - for (set::const_iterator it1 = it->second.begin(); it1 != it->second.end(); it1++) + for (int i = 1; i < maxlag + 1; i++) + for (vector::const_iterator it = lhs.begin(); it != lhs.end(); it++) { stringstream param_name_h0; param_name_h0 << "h0_" << model_name - << "_var_" << datatree.symbol_table.getName(*it1) - << "_lag_" << it->first; + << "_var_" << datatree.symbol_table.getName(*it) + << "_lag_" << i; int new_param_symb_id = datatree.symbol_table.addSymbol(param_name_h0.str(), eParameter); h0_indices.push_back(new_param_symb_id); subExpr = datatree.AddPlus(subExpr, datatree.AddTimes(datatree.AddVariable(new_param_symb_id), - datatree.AddVariable(*it1, it->first))); + datatree.AddVariable(*it, i))); } if (nonstationary_vars_present) - for (map >::const_iterator it = z_vec.begin(); - it != z_vec.end(); it++) - for (set::const_iterator it1 = it->second.begin(); it1 != it->second.end(); it1++) + for (int i = 1; i < maxlag + 1; i++) + for (vector::const_iterator it = lhs.begin(); it != lhs.end(); it++) { stringstream param_name_h1; param_name_h1 << "h1_" << model_name - << "_var_" << datatree.symbol_table.getName(*it1) - << "_lag_" << it->first; + << "_var_" << datatree.symbol_table.getName(*it) + << "_lag_" << i; int new_param_symb_id = datatree.symbol_table.addSymbol(param_name_h1.str(), eParameter); h1_indices.push_back(new_param_symb_id); subExpr = datatree.AddPlus(subExpr, datatree.AddTimes(datatree.AddVariable(new_param_symb_id), - datatree.AddVariable(*it1, it->first))); + datatree.AddVariable(*it, i))); } growth_param_index = datatree.symbol_table.addSymbol(model_name + diff --git a/ExprNode.hh b/ExprNode.hh index a8d417a0..37cc2c58 100644 --- a/ExprNode.hh +++ b/ExprNode.hh @@ -490,7 +490,7 @@ class ExprNode virtual bool isVarModelReferenced(const string &model_info_name) const = 0; //! Fills var_model info for pac_expectation node - virtual void fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg) = 0; + virtual void fillPacExpectationVarInfo(string &var_model_name, vector &lhs, map > &rhs_arg, vector &nonstationary_arg) = 0; //! Fills map virtual void getEndosAndMaxLags(map &model_endos_and_lags) const = 0; @@ -560,7 +560,7 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); - virtual void fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg); + virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; virtual expr_t substituteStaticAuxiliaryVariable() const; @@ -639,7 +639,7 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); - virtual void fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg); + virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; //! Substitute auxiliary variables by their expression in static model @@ -741,7 +741,7 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); - virtual void fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg); + virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; //! Substitute auxiliary variables by their expression in static model @@ -861,7 +861,7 @@ public: expr_t getNonZeroPartofEquation() const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); - virtual void fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg); + virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; //! Substitute auxiliary variables by their expression in static model @@ -949,7 +949,7 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); - virtual void fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg); + virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; //! Substitute auxiliary variables by their expression in static model @@ -1045,7 +1045,7 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); - virtual void fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg); + virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; //! Substitute auxiliary variables by their expression in static model @@ -1234,7 +1234,7 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); - virtual void fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg); + virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; virtual expr_t substituteStaticAuxiliaryVariable() const; @@ -1247,6 +1247,7 @@ private: const string model_name, var_model_name; const int discount_symb_id, growth_symb_id; bool stationary_vars_present, nonstationary_vars_present; + vector lhs; map > z_vec; // lag -> set< symb_id > (all vars that appear at a given lag) vector h0_indices, h1_indices; int growth_param_index; @@ -1304,7 +1305,7 @@ public: virtual expr_t removeTrendLeadLag(map trend_symbols_map) const; virtual bool isInStaticForm() const; virtual void setVarExpectationIndex(map > &var_model_info); - virtual void fillPacExpectationVarInfo(string &var_model_name, map > &rhs_arg, vector &nonstationary_arg); + virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector &lhs_arg, map > &rhs_arg, vector &nonstationary_arg); virtual bool isVarModelReferenced(const string &model_info_name) const; virtual void getEndosAndMaxLags(map &model_endos_and_lags) const; virtual expr_t substituteStaticAuxiliaryVariable() const; diff --git a/ModFile.cc b/ModFile.cc index 7d1f757a..faf33ece 100644 --- a/ModFile.cc +++ b/ModFile.cc @@ -389,7 +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.fillPacExpectationVarInfo(var_model_name, rhs_pac, nonstationary); + dynamic_model.fillPacExpectationVarInfo(var_model_name, lhs, rhs_pac, nonstationary); dynamic_model.substitutePacExpectation(); } }