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