diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index cb62cea2671b79f8ab89cccf743bc193bfa8d728..2785b7812ffe75fc586b2403c3ea0e3723ac22f6 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -3603,7 +3603,8 @@ DynamicModel::getVarMaxLag(StaticModel &static_model, vector<int> &eqnumber) con int max_lag = 0; for (vector<int>::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<int> &lhs, vector<expr_t> &lhs_expr_t, v } } -int -DynamicModel::getUndiffMaxLag(StaticModel &static_model, vector<expr_t> &lhs, vector<int> &eqnumber) const -{ - set<expr_t> lhs_static; - for(vector<expr_t>::const_iterator it = lhs.begin(); - it != lhs.end(); it++) - lhs_static.insert((*it)->toStatic(static_model)); - - int max_lag = 0; - for (vector<int>::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 8eb69ecc79853ba15f4f99a5f3cd0ceb48a10a7c..2d64b422d0ae7dd2173b375834eaa724f8df341d 100644 --- a/src/DynamicModel.hh +++ b/src/DynamicModel.hh @@ -330,8 +330,6 @@ public: int max_lag, vector<bool> &nonstationary, int growth_symb_id); - //! Get the max lag for the PAC VAR - int getUndiffMaxLag(StaticModel &static_model, vector<expr_t> &lhs, vector<int> &eqnumber) const; //! Substitutes pac_expectation operator void substitutePacExpectation(); diff --git a/src/ExprNode.cc b/src/ExprNode.cc index 422e6c1e4cdb86122b9fc27c4c711d766661f508..4c21a481a139daa6e5d8560bd5627effbace3bda 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<expr_t> &static_lhs, int &max_lag) const +int +NumConstNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const { + return 0; } int @@ -1412,11 +1413,13 @@ VariableNode::undiff() const return const_cast<VariableNode *>(this); } -void -VariableNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const +int +VariableNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &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<expr_t> &static_lhs, int &max_lag) const +int +UnaryOpNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &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<expr_t> &static_lhs, int &max_lag) const +int +BinaryOpNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &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<expr_t> &static_lhs, int &max_lag) const +int +TrinaryOpNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &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<expr_t> &static_lhs, int &max_lag) const +int +AbstractExternalFunctionNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &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<expr_t> &static_lhs, int &max_lag) const +int +VarExpectationNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const { + return 0; } int @@ -8160,9 +8151,10 @@ PacExpectationNode::VarMinLag() const return 1; } -void -PacExpectationNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const +int +PacExpectationNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const { + return 0; } int diff --git a/src/ExprNode.hh b/src/ExprNode.hh index 13071eb0ed8b393b82cdacb7598b8d7e0c69534b..0498ad7e86f08bf81e8f3787e40d5258e1e773b3 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<expr_t> &static_lhs, int &max_lag) const = 0; + virtual int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const = 0; //! Finds LHS variable in a VAR equation virtual void collectVARLHSVariable(set<expr_t> &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<expr_t> &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override; int PacMaxLag(vector<int> &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<expr_t> &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override; int PacMaxLag(vector<int> &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<expr_t> &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override; int PacMaxLag(vector<int> &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<expr_t> &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override; int PacMaxLag(vector<int> &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<expr_t> &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override; int PacMaxLag(vector<int> &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<expr_t> &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override; int PacMaxLag(vector<int> &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<expr_t> &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override; int PacMaxLag(vector<int> &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<expr_t> &static_lhs, int &max_lag) const override; + int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override; int PacMaxLag(vector<int> &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 1e237dc303c4ad0abdaf6c14008ddb342d553bf5..5bcaa0a10aef334d4649551c5f94b3eba10c1952 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();