From bef7c2a1938f1201cffbddc8d597b2a486fd36c6 Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan@dynare.org>
Date: Wed, 24 Oct 2018 15:57:07 +0200
Subject: [PATCH] remove need to declare equations nonstationary

---
 src/DynamicModel.cc | 31 +------------------------------
 src/ModFile.cc      |  6 ++++--
 src/SubModel.cc     | 40 +++++++++++-----------------------------
 src/SubModel.hh     | 10 ++++------
 4 files changed, 20 insertions(+), 67 deletions(-)

diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index d6989d37..81ae7133 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -3771,7 +3771,6 @@ DynamicModel::fillVarModelTable() const
 {
   map<string, vector<int>> eqnums, lhsr;
   map<string, vector<expr_t>> lhs_expr_tr;
-  map<string, vector<bool>> nonstationaryr;
   map<string, vector<set<pair<int, int>>>> rhsr;
   map<string, vector<string>> eqtags = var_model_table.getEqTags();
 
@@ -3780,7 +3779,6 @@ DynamicModel::fillVarModelTable() const
       vector<int> eqnumber, lhs;
       vector<expr_t> lhs_expr_t;
       vector<set<pair<int, int>>> rhs;
-      vector<bool> nonstationary;
 
       for (const auto & eqtag : it.second)
         {
@@ -3800,17 +3798,6 @@ DynamicModel::fillVarModelTable() const
               exit(EXIT_FAILURE);
             }
 
-          bool nonstationary_bool = false;
-          for (const auto & equation_tag : equation_tags)
-            if (equation_tag.first == eqn)
-              if (equation_tag.second.first == "data_type"
-                  && equation_tag.second.second == "nonstationary")
-                {
-                  nonstationary_bool = true;
-                  break;
-                }
-          nonstationary.push_back(nonstationary_bool);
-
           equations[eqn]->get_arg1()->collectDynamicVariables(SymbolType::endogenous, lhs_set);
           equations[eqn]->get_arg1()->collectDynamicVariables(SymbolType::exogenous, lhs_tmp_set);
           equations[eqn]->get_arg1()->collectDynamicVariables(SymbolType::parameter, lhs_tmp_set);
@@ -3852,13 +3839,11 @@ DynamicModel::fillVarModelTable() const
       lhsr[it.first] = lhs;
       lhs_expr_tr[it.first] = lhs_expr_t;
       rhsr[it.first] = rhs;
-      nonstationaryr[it.first] = nonstationary;
     }
   var_model_table.setEqNums(eqnums);
   var_model_table.setLhs(lhsr);
   var_model_table.setRhs(rhsr);
   var_model_table.setLhsExprT(lhs_expr_tr);
-  var_model_table.setNonstationary(nonstationaryr);
 
   // Fill AR Matrix
   map<string, map<tuple<int, int, int>, expr_t>> ARr;
@@ -3955,7 +3940,6 @@ DynamicModel::fillTrendComponentModelTable() const
 {
   map<string, vector<int>> eqnums, trend_eqnums, lhsr;
   map<string, vector<expr_t>> lhs_expr_tr;
-  map<string, vector<bool>> nonstationaryr;
   map<string, vector<set<pair<int, int>>>> rhsr;
   map<string, vector<string>> eqtags = trend_component_model_table.getEqTags();
   map<string, vector<string>> trend_eqtags = trend_component_model_table.getTargetEqTags();
@@ -3988,7 +3972,6 @@ DynamicModel::fillTrendComponentModelTable() const
       vector<int> eqnumber, lhs;
       vector<expr_t> lhs_expr_t;
       vector<set<pair<int, int>>> rhs;
-      vector<bool> nonstationary;
 
       for (const auto & eqtag : it.second)
         {
@@ -4008,17 +3991,6 @@ DynamicModel::fillTrendComponentModelTable() const
               exit(EXIT_FAILURE);
             }
 
-          bool nonstationary_bool = false;
-          for (const auto & equation_tag : equation_tags)
-            if (equation_tag.first == eqn)
-              if (equation_tag.second.first == "data_type"
-                  && equation_tag.second.second == "nonstationary")
-                {
-                  nonstationary_bool = true;
-                  break;
-                }
-          nonstationary.push_back(nonstationary_bool);
-
           equations[eqn]->get_arg1()->collectDynamicVariables(SymbolType::endogenous, lhs_set);
           equations[eqn]->get_arg1()->collectDynamicVariables(SymbolType::exogenous, lhs_tmp_set);
           equations[eqn]->get_arg1()->collectDynamicVariables(SymbolType::parameter, lhs_tmp_set);
@@ -4060,10 +4032,9 @@ DynamicModel::fillTrendComponentModelTable() const
       lhsr[it.first] = lhs;
       lhs_expr_tr[it.first] = lhs_expr_t;
       rhsr[it.first] = rhs;
-      nonstationaryr[it.first] = nonstationary;
     }
   trend_component_model_table.setRhs(rhsr);
-  trend_component_model_table.setVals(eqnums, trend_eqnums, lhsr, lhs_expr_tr, nonstationaryr);
+  trend_component_model_table.setVals(eqnums, trend_eqnums, lhsr, lhs_expr_tr);
 }
 
 void
diff --git a/src/ModFile.cc b/src/ModFile.cc
index b3118309..6ff0b55a 100644
--- a/src/ModFile.cc
+++ b/src/ModFile.cc
@@ -423,13 +423,15 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, const
              {
                max_lag = trend_component_model_table.getMaxLag(aux_model_name) + 1;
                lhs = dynamic_model.getUndiffLHSForPac(aux_model_name, diff_subst_table);
-               nonstationary = trend_component_model_table.getNonstationary(aux_model_name);
+               // All lhs variables in a trend component model are nonstationary
+               nonstationary.insert(nonstationary.end(), trend_component_model_table.getDiff(aux_model_name).size(), true);
              }
            else if (var_model_table.isExistingVarModelName(aux_model_name))
              {
                max_lag = var_model_table.getMaxLag(aux_model_name);
                lhs = var_model_table.getLhs(aux_model_name);
-               nonstationary = var_model_table.getNonstationary(aux_model_name);
+               // nonstationary variables in a VAR are those that are in diff
+               nonstationary = var_model_table.getDiff(aux_model_name);
              }
            else
              {
diff --git a/src/SubModel.cc b/src/SubModel.cc
index 4811af06..28ceb741 100644
--- a/src/SubModel.cc
+++ b/src/SubModel.cc
@@ -43,14 +43,12 @@ TrendComponentModelTable::addTrendComponentModel(string name_arg,
 
 void
 TrendComponentModelTable::setVals(map<string, vector<int>> eqnums_arg, map<string, vector<int>> target_eqnums_arg,
-                                  map<string, vector<int>> lhs_arg,
-                                  map<string, vector<expr_t>> lhs_expr_t_arg, map<string, vector<bool>> nonstationary_arg)
+                                  map<string, vector<int>> lhs_arg, map<string, vector<expr_t>> lhs_expr_t_arg)
 {
   eqnums = move(eqnums_arg);
   target_eqnums = move(target_eqnums_arg);
   lhs = move(lhs_arg);
   lhs_expr_t = move(lhs_expr_t_arg);
-  nonstationary = move(nonstationary_arg);
 
   for (const auto &it : eqnums)
     {
@@ -149,13 +147,6 @@ TrendComponentModelTable::checkModelName(const string &name_arg) const
     }
 }
 
-vector<bool>
-TrendComponentModelTable::getNonstationary(const string &name_arg) const
-{
-  checkModelName(name_arg);
-  return nonstationary.find(name_arg)->second;
-}
-
 vector<int>
 TrendComponentModelTable::getNontrendLhs(const string &name_arg) const
 {
@@ -317,8 +308,8 @@ TrendComponentModelTable::writeOutput(const string &basename, ostream &output) c
         output << (it >= 0 ? symbol_table.getTypeSpecificID(it) + 1 : -1) << " ";
       output << "];" << endl
              << "M_.trend_component." << name << ".nonstationary = [";
-      for (auto it : nonstationary.at(name))
-        output << (it ? "true" : "false") << " ";
+      for (size_t i = 0; i < diff.at(name).size(); i++)
+        output << "true ";
       output << "];" << endl;
       int i = 1;
       for (const auto &it : rhs.at(name))
@@ -473,13 +464,10 @@ VarModelTable::writeOutput(const string &basename, ostream &output) const
       for (const auto &it : diff.at(name))
         output << (it ? "true" : "false") << " ";
       output << "];" << endl
+             << "M_.var." << name << ".nonstationary = M_.var." << name << ".diff;" << endl
              << "M_.var." << name << ".orig_diff_var = [";
       for (auto it : orig_diff_var.at(name))
         output << (it >= 0 ? symbol_table.getTypeSpecificID(it) + 1 : -1) << " ";
-      output << "];" << endl
-             << "M_.var." << name << ".nonstationary = [";
-      for (auto it : nonstationary.at(name))
-        output << (it ? "true" : "false") << " ";
       output << "];" << endl;
       int i = 1;
       for (const auto &it : rhs.at(name))
@@ -590,18 +578,19 @@ VarModelTable::setLhsExprT(map<string, vector<expr_t>> lhs_expr_t_arg)
   lhs_expr_t = move(lhs_expr_t_arg);
 }
 
-void
-VarModelTable::setNonstationary(map<string, vector<bool>> nonstationary_arg)
-{
-  nonstationary = move(nonstationary_arg);
-}
-
 map<string, vector<int>>
 VarModelTable::getEqNums() const
 {
   return eqnums;
 }
 
+vector<bool>
+VarModelTable::getDiff(const string &name_arg) const
+{
+  checkModelName(name_arg);
+  return diff.find(name_arg)->second;
+}
+
 vector<int>
 VarModelTable::getEqNums(const string &name_arg) const
 {
@@ -656,13 +645,6 @@ VarModelTable::getLhs(const string &name_arg) const
   return lhs.find(name_arg)->second;
 }
 
-vector<bool>
-VarModelTable::getNonstationary(const string &name_arg) const
-{
-  checkModelName(name_arg);
-  return nonstationary.find(name_arg)->second;
-}
-
 vector<set<pair<int, int>>>
 VarModelTable::getRhs(const string &name_arg) const
 {
diff --git a/src/SubModel.hh b/src/SubModel.hh
index 79d4dba1..76740893 100644
--- a/src/SubModel.hh
+++ b/src/SubModel.hh
@@ -42,7 +42,7 @@ private:
   map<string, vector<string>> eqtags, target_eqtags;
   map<string, vector<int>> eqnums, target_eqnums, nontarget_eqnums, max_lags, lhs, target_lhs, nontarget_lhs, orig_diff_var;
   map<string, vector<set<pair<int, int>>>> rhs;
-  map<string, vector<bool>> diff, nonstationary;
+  map<string, vector<bool>> diff;
   map<string, vector<expr_t>> lhs_expr_t;
   map<string, vector<int>> target_vars;
   map<string, map<tuple<int, int, int>, expr_t>> AR; // AR: name -> (eqn, lag, lhs_symb_id) -> expr_t
@@ -72,13 +72,12 @@ public:
   vector<int> getOrigDiffVar(const string &name_arg) const;
   map<string, vector<int>> getNonTargetEqNums() const;
   vector<int> getNonTargetEqNums(const string &name_arg) const;
-  vector<bool> getNonstationary(const string &name_arg) const;
   vector<int> getNontrendLhs(const string &name_arg) const;
   vector<int> getTargetLhs(const string &name_arg) const;
 
   void setVals(map<string, vector<int>> eqnums_arg, map<string, vector<int>> target_eqnums_arg,
                map<string, vector<int>> lhs_arg,
-               map<string, vector<expr_t>> lhs_expr_t_arg, map<string, vector<bool>> nonstationary_arg);
+               map<string, vector<expr_t>> lhs_expr_t_arg);
   void setRhs(map<string, vector<set<pair<int, int>>>> rhs_arg);
   void setMaxLags(map<string, vector<int>> max_lags_arg);
   void setDiff(map<string, vector<bool>> diff_arg);
@@ -120,7 +119,7 @@ private:
   map<string, vector<string>> eqtags;
   map<string, vector<int>> eqnums, max_lags, lhs, orig_diff_var;
   map<string, vector<set<pair<int, int>>>> rhs;
-  map<string, vector<bool>> diff, nonstationary;
+  map<string, vector<bool>> diff;
   map<string, vector<expr_t>> lhs_expr_t;
   map<string, map<tuple<int, int, int>, expr_t>> AR; // AR: name -> (eqn, lag, lhs_symb_id) -> param_expr_t
 public:
@@ -136,11 +135,11 @@ public:
   map<string, vector<string>> getEqTags() const;
   vector<string> getEqTags(const string &name_arg) const;
   map<string, vector<int>> getEqNums() const;
+  vector<bool> getDiff(const string &name_arg) const;
   vector<int> getEqNums(const string &name_arg) const;
   vector<int> getMaxLags(const string &name_arg) const;
   int getMaxLag(const string &name_arg) const;
   vector<int> getLhs(const string &name_arg) const;
-  vector<bool> getNonstationary(const string &name_arg) const;
   map<string, pair<SymbolList, int>> getSymbolListAndOrder() const;
   vector<set<pair<int, int>>> getRhs(const string &name_arg) const;
   vector<expr_t> getLhsExprT(const string &name_arg) const;
@@ -149,7 +148,6 @@ public:
   void setLhs(map<string, vector<int>> lhs_arg);
   void setRhs(map<string, vector<set<pair<int, int>>>> rhs_arg);
   void setLhsExprT(map<string, vector<expr_t>> lhs_expr_t_arg);
-  void setNonstationary(map<string, vector<bool>> nonstationary_arg);
   void setDiff(map<string, vector<bool>> diff_arg);
   void setMaxLags(map<string, vector<int>> max_lags_arg);
   void setOrigDiffVar(map<string, vector<int>> orig_diff_var_arg);
-- 
GitLab