Fix max lags for var

issue#70
Houtan Bastani 2018-06-11 10:40:00 +02:00
parent 84c2dc5f36
commit b8ae9f6935
5 changed files with 47 additions and 72 deletions

View File

@ -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()
{

View File

@ -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();

View File

@ -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

View File

@ -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;

View File

@ -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();