From 7827d2e04d5f5dd4973ff98f63a277bb76fe7eb1 Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan@dynare.org>
Date: Mon, 9 Sep 2019 12:12:32 +0200
Subject: [PATCH] add info about max endo/exo lag by variable. closes
 dynare#1596

---
 src/DynamicModel.cc | 54 +++++++++++++++++++++++++++++++++++++--------
 src/DynamicModel.hh |  3 +++
 2 files changed, 48 insertions(+), 9 deletions(-)

diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index 055da033..c046b914 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -2955,7 +2955,29 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de
       outstruct = "oo_.";
     }
 
-  output << modstruct << "orig_maximum_endo_lag = " << max_endo_lag_orig << ";" << endl
+  if (max_endo_lag_by_var.size() != symbol_table.orig_endo_nbr())
+    {
+      cerr << "ERROR: the number of endogenous variables found in the model block"
+           << " is not equal to the number declared" << endl;
+      exit(EXIT_FAILURE);
+    }
+
+  if (max_exo_lag_by_var.size() != symbol_table.exo_nbr())
+    {
+      cerr << "ERROR: the number of exogenous variables found in the model block"
+           << " is not equal to the number declared" << endl;
+      exit(EXIT_FAILURE);
+    }
+
+  output << modstruct << "max_endo_lag_by_var = [";
+  for (const auto & it : max_endo_lag_by_var)
+    output << it.second << " ";
+  output << "];" << endl
+         << modstruct << "max_exo_lag_by_var = [";
+  for (const auto & it : max_exo_lag_by_var)
+    output << it.second << " ";
+  output << "];" << endl
+         << modstruct << "orig_maximum_endo_lag = " << max_endo_lag_orig << ";" << endl
          << modstruct << "orig_maximum_endo_lead = " << max_endo_lead_orig << ";" << endl
          << modstruct << "orig_maximum_exo_lag = " << max_exo_lag_orig << ";" << endl
          << modstruct << "orig_maximum_exo_lead = " << max_exo_lead_orig << ";" << endl
@@ -5546,21 +5568,35 @@ DynamicModel::setLeadsLagsOrig()
     for (const auto & dynvar : dynvars)
     {
       int lag = dynvar.second;
-      SymbolType type = symbol_table.getType(dynvar.first);
 
       max_lead_orig = max(lag, max_lead_orig);
       max_lag_orig = max(-lag, max_lag_orig);
 
-      switch (type)
+
+      switch (symbol_table.getType(dynvar.first))
         {
         case SymbolType::endogenous:
-          max_endo_lead_orig = max(lag, max_endo_lead_orig);
-          max_endo_lag_orig = max(-lag, max_endo_lag_orig);
-          break;
+          {
+            max_endo_lead_orig = max(lag, max_endo_lead_orig);
+            max_endo_lag_orig = max(-lag, max_endo_lag_orig);
+            auto var = max_endo_lag_by_var.find(dynvar.first);
+            if (var != max_endo_lag_by_var.end())
+              max_endo_lag_by_var[dynvar.first] = max(0, lag);
+            else
+              max_endo_lag_by_var[dynvar.first] = max(var->second, lag);
+            break;
+          }
         case SymbolType::exogenous:
-          max_exo_lead_orig = max(lag, max_exo_lead_orig);
-          max_exo_lag_orig = max(-lag, max_exo_lag_orig);
-          break;
+          {
+            max_exo_lead_orig = max(lag, max_exo_lead_orig);
+            max_exo_lag_orig = max(-lag, max_exo_lag_orig);
+            auto var = max_exo_lag_by_var.find(dynvar.first);
+            if (var != max_exo_lag_by_var.end())
+              max_exo_lag_by_var[dynvar.first] = max(0, lag);
+            else
+              max_exo_lag_by_var[dynvar.first] = max(var->second, lag);
+            break;
+          }
         case SymbolType::exogenousDet:
           max_exo_det_lead_orig = max(lag, max_exo_det_lead_orig);
           max_exo_det_lag_orig = max(-lag, max_exo_det_lag_orig);
diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh
index 1991d5d3..5264a22b 100644
--- a/src/DynamicModel.hh
+++ b/src/DynamicModel.hh
@@ -84,6 +84,9 @@ private:
   //! Maximum lag and lead over deterministic exogenous variables (positive values) of original model
   int max_exo_det_lag_orig{0}, max_exo_det_lead_orig{0};
 
+  //! Max lags by symb_id
+  map<int, int> max_endo_lag_by_var, max_exo_lag_by_var;
+
   //! Cross reference information
   map<int, ExprNode::EquationInfo> xrefs;
   map<pair<int, int>, set<int>> xref_param;
-- 
GitLab