From b8ae9f6935f7039c0ab65946a844f78cf4f8061d Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Mon, 11 Jun 2018 10:40:00 +0200 Subject: [PATCH] Fix max lags for var --- src/DynamicModel.cc | 19 ++--------- src/DynamicModel.hh | 2 -- src/ExprNode.cc | 78 ++++++++++++++++++++------------------------- src/ExprNode.hh | 18 +++++------ src/ModFile.cc | 2 +- 5 files changed, 47 insertions(+), 72 deletions(-) diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index cb62cea2..2785b781 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -3603,7 +3603,8 @@ DynamicModel::getVarMaxLag(StaticModel &static_model, vector &eqnumber) con int max_lag = 0; for (vector::const_iterator it = eqnumber.begin(); it != eqnumber.end(); it++) - equations[*it]->get_arg2()->VarMaxLag(static_model, lhs_static, max_lag); + max_lag = max(max_lag, + equations[*it]->get_arg2()->VarMaxLag(static_model, lhs_static)); return max_lag; } @@ -3784,22 +3785,6 @@ DynamicModel::getUndiffLHSForPac(vector &lhs, vector &lhs_expr_t, v } } -int -DynamicModel::getUndiffMaxLag(StaticModel &static_model, vector &lhs, vector &eqnumber) const -{ - set lhs_static; - for(vector::const_iterator it = lhs.begin(); - it != lhs.end(); it++) - lhs_static.insert((*it)->toStatic(static_model)); - - int max_lag = 0; - for (vector::const_iterator it = eqnumber.begin(); - it != eqnumber.end(); it++) - equations[*it]->get_arg2()->VarMaxLag(static_model, lhs_static, max_lag); - - return max_lag; -} - void DynamicModel::walkPacParameters() { diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh index 8eb69ecc..2d64b422 100644 --- a/src/DynamicModel.hh +++ b/src/DynamicModel.hh @@ -330,8 +330,6 @@ public: int max_lag, vector &nonstationary, int growth_symb_id); - //! Get the max lag for the PAC VAR - int getUndiffMaxLag(StaticModel &static_model, vector &lhs, vector &eqnumber) const; //! Substitutes pac_expectation operator void substitutePacExpectation(); diff --git a/src/ExprNode.cc b/src/ExprNode.cc index 422e6c1e..4c21a481 100644 --- a/src/ExprNode.cc +++ b/src/ExprNode.cc @@ -487,9 +487,10 @@ NumConstNode::VarMinLag() const return 1; } -void -NumConstNode::VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const +int +NumConstNode::VarMaxLag(DataTree &static_datatree, set &static_lhs) const { + return 0; } int @@ -1412,11 +1413,13 @@ VariableNode::undiff() const return const_cast(this); } -void -VariableNode::VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const +int +VariableNode::VarMaxLag(DataTree &static_datatree, set &static_lhs) const { - if (-lag > max_lag) - max_lag = -lag; + auto it = static_lhs.find(this->toStatic(static_datatree)); + if (it == static_lhs.end()) + return 0; + return maxLag(); } int @@ -2966,28 +2969,13 @@ UnaryOpNode::undiff() const return arg->undiff(); } -void -UnaryOpNode::VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const +int +UnaryOpNode::VarMaxLag(DataTree &static_datatree, set &static_lhs) const { - if (op_code != oDiff) - arg->VarMaxLag(static_datatree, static_lhs, max_lag); - else - { - auto it = static_lhs.find(this->toStatic(static_datatree)); - if (it != static_lhs.end()) - { - int max_lag_tmp = arg->maxLag() - arg->countDiffs(); - if (max_lag_tmp > max_lag) - max_lag = max_lag_tmp; - } - else - { - int max_lag_tmp = 0; - arg->VarMaxLag(static_datatree, static_lhs, max_lag_tmp); - if (max_lag_tmp + 1 > max_lag) - max_lag = max_lag_tmp + 1; - } - } + auto it = static_lhs.find(this->toStatic(static_datatree)); + if (it == static_lhs.end()) + return 0; + return arg->maxLag() - arg->countDiffs(); } int @@ -4329,11 +4317,11 @@ BinaryOpNode::VarMinLag() const return min(arg1->VarMinLag(), arg2->VarMinLag()); } -void -BinaryOpNode::VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const +int +BinaryOpNode::VarMaxLag(DataTree &static_datatree, set &static_lhs) const { - arg1->VarMaxLag(static_datatree, static_lhs, max_lag); - arg2->VarMaxLag(static_datatree, static_lhs, max_lag); + return max(arg1->VarMaxLag(static_datatree, static_lhs), + arg2->VarMaxLag(static_datatree, static_lhs)); } void @@ -5706,12 +5694,12 @@ TrinaryOpNode::VarMinLag() const return min(min(arg1->VarMinLag(), arg2->VarMinLag()), arg3->VarMinLag()); } -void -TrinaryOpNode::VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const +int +TrinaryOpNode::VarMaxLag(DataTree &static_datatree, set &static_lhs) const { - arg1->VarMaxLag(static_datatree, static_lhs, max_lag); - arg2->VarMaxLag(static_datatree, static_lhs, max_lag); - arg3->VarMaxLag(static_datatree, static_lhs, max_lag); + return max(arg1->VarMaxLag(static_datatree, static_lhs), + max(arg2->VarMaxLag(static_datatree, static_lhs), + arg3->VarMaxLag(static_datatree, static_lhs))); } int @@ -6151,11 +6139,13 @@ int val = 0; return val; } -void -AbstractExternalFunctionNode::VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const +int +AbstractExternalFunctionNode::VarMaxLag(DataTree &static_datatree, set &static_lhs) const { + int max_lag = 0; for (auto argument : arguments) - argument->VarMaxLag(static_datatree, static_lhs, max_lag); + max_lag = max(max_lag, argument->VarMaxLag(static_datatree, static_lhs)); + return max_lag; } int @@ -7705,9 +7695,10 @@ VarExpectationNode::VarMinLag() const return 1; } -void -VarExpectationNode::VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const +int +VarExpectationNode::VarMaxLag(DataTree &static_datatree, set &static_lhs) const { + return 0; } int @@ -8160,9 +8151,10 @@ PacExpectationNode::VarMinLag() const return 1; } -void -PacExpectationNode::VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const +int +PacExpectationNode::VarMaxLag(DataTree &static_datatree, set &static_lhs) const { + return 0; } int diff --git a/src/ExprNode.hh b/src/ExprNode.hh index 13071eb0..0498ad7e 100644 --- a/src/ExprNode.hh +++ b/src/ExprNode.hh @@ -282,7 +282,7 @@ class ExprNode virtual int VarMinLag() const = 0; //! Find the maximum lag in a VAR: handles case where LHS is diff - virtual void VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const = 0; + virtual int VarMaxLag(DataTree &static_datatree, set &static_lhs) const = 0; //! Finds LHS variable in a VAR equation virtual void collectVARLHSVariable(set &result) const = 0; @@ -595,7 +595,7 @@ public: int maxLead() const override; int maxLag() const override; int VarMinLag() const override; - void VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set &static_lhs) const override; int PacMaxLag(vector &lhs) const override; expr_t undiff() const override; expr_t decreaseLeadsLags(int n) const override; @@ -686,7 +686,7 @@ public: int maxLead() const override; int maxLag() const override; int VarMinLag() const override; - void VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set &static_lhs) const override; int PacMaxLag(vector &lhs) const override; expr_t undiff() const override; expr_t decreaseLeadsLags(int n) const override; @@ -798,7 +798,7 @@ public: int maxLead() const override; int maxLag() const override; int VarMinLag() const override; - void VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set &static_lhs) const override; int PacMaxLag(vector &lhs) const override; expr_t undiff() const override; expr_t decreaseLeadsLags(int n) const override; @@ -930,7 +930,7 @@ public: int maxLead() const override; int maxLag() const override; int VarMinLag() const override; - void VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set &static_lhs) const override; int PacMaxLag(vector &lhs) const override; expr_t undiff() const override; expr_t decreaseLeadsLags(int n) const override; @@ -1037,7 +1037,7 @@ public: int maxLead() const override; int maxLag() const override; int VarMinLag() const override; - void VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set &static_lhs) const override; int PacMaxLag(vector &lhs) const override; expr_t undiff() const override; expr_t decreaseLeadsLags(int n) const override; @@ -1150,7 +1150,7 @@ public: int maxLead() const override; int maxLag() const override; int VarMinLag() const override; - void VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set &static_lhs) const override; int PacMaxLag(vector &lhs) const override; expr_t undiff() const override; expr_t decreaseLeadsLags(int n) const override; @@ -1342,7 +1342,7 @@ public: int maxLead() const override; int maxLag() const override; int VarMinLag() const override; - void VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set &static_lhs) const override; int PacMaxLag(vector &lhs) const override; expr_t undiff() const override; expr_t decreaseLeadsLags(int n) const override; @@ -1428,7 +1428,7 @@ public: int maxLead() const override; int maxLag() const override; int VarMinLag() const override; - void VarMaxLag(DataTree &static_datatree, set &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set &static_lhs) const override; int PacMaxLag(vector &lhs) const override; expr_t undiff() const override; expr_t decreaseLeadsLags(int n) const override; diff --git a/src/ModFile.cc b/src/ModFile.cc index 1e237dc3..5bcaa0a1 100644 --- a/src/ModFile.cc +++ b/src/ModFile.cc @@ -434,7 +434,7 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, const if (!undiff.empty()) { dynamic_model.getUndiffLHSForPac(lhs, lhs_expr_t, diff, orig_diff_var, eqnumber, undiff, diff_subst_table); - max_lag = original_model.getUndiffMaxLag(diff_static_model, lhs_expr_t, eqnumber); + max_lag++; } pms->fillUndiffedLHS(lhs); dynamic_model.walkPacParameters();