diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index 055da0334d63928fd479ace1c4db3f9cdffa0f49..c046b914202655f8e349cf4e1bbad292d3875fd6 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 1991d5d3643a474fd838c64326495c07f5bef427..5264a22b8248e3c8666e1081ccf161574f009bab 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;