Fix max lags for var
parent
84c2dc5f36
commit
b8ae9f6935
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue