From 91096d8d02e3fc46324b5eaaee5397b03c4df9d9 Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Thu, 27 Jul 2017 12:33:19 -0400 Subject: [PATCH] preprocessor: store max lead/lag info, write to output --- preprocessor/DynamicModel.cc | 65 +++++++++++++++++++++++++++++++++++- preprocessor/DynamicModel.hh | 11 ++++++ preprocessor/ModFile.cc | 1 + 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/preprocessor/DynamicModel.cc b/preprocessor/DynamicModel.cc index e827d58ce..c927a8736 100644 --- a/preprocessor/DynamicModel.cc +++ b/preprocessor/DynamicModel.cc @@ -44,6 +44,10 @@ DynamicModel::DynamicModel(SymbolTable &symbol_table_arg, max_endo_lag(0), max_endo_lead(0), max_exo_lag(0), max_exo_lead(0), max_exo_det_lag(0), max_exo_det_lead(0), + max_lag_orig(0), max_lead_orig(0), + max_endo_lag_orig(0), max_endo_lead_orig(0), + max_exo_lag_orig(0), max_exo_lead_orig(0), + max_exo_det_lag_orig(0), max_exo_det_lead_orig(0), dynJacobianColsNbr(0), global_temporary_terms(true) { @@ -2563,7 +2567,15 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de outstruct = "oo_."; } - output << modstruct << "lead_lag_incidence = ["; + output << modstruct << "max_endo_lag_orig = " << max_endo_lag_orig << ";" << endl + << modstruct << "max_endo_lead_orig = " << max_endo_lead_orig << ";" << endl + << modstruct << "max_exo_lag_orig = " << max_exo_lag_orig << ";" << endl + << modstruct << "max_exo_lead_orig = " << max_exo_lead_orig << ";" << endl + << modstruct << "max_exo_det_lag_orig = " << max_exo_det_lag_orig << ";" << endl + << modstruct << "max_exo_det_lead_orig = " << max_exo_det_lead_orig << ";" << endl + << modstruct << "max_lag_orig = " << max_lag_orig << ";" << endl + << modstruct << "max_lead_orig = " << max_lead_orig << ";" << endl + << modstruct << "lead_lag_incidence = ["; // Loop on endogenous variables int nstatic = 0, nfwrd = 0, @@ -3740,6 +3752,8 @@ DynamicModel::cloneDynamic(DynamicModel &dynamic_model) const for (size_t i = 0; i < static_only_equations.size(); i++) dynamic_model.addStaticOnlyEquation(static_only_equations[i]->cloneDynamic(dynamic_model), static_only_equations_lineno[i]); + + dynamic_model.setLeadsLagsOrig(); } void @@ -3912,6 +3926,55 @@ DynamicModel::findUnusedExogenous() return unusedExo; } +void +DynamicModel::setLeadsLagsOrig() +{ + set > dynvars; + + for (int i = 0; i < (int) equations.size(); i++) + { + equations[i]->collectDynamicVariables(eEndogenous, dynvars); + equations[i]->collectDynamicVariables(eExogenous, dynvars); + equations[i]->collectDynamicVariables(eExogenousDet, dynvars); + } + + for (set >::const_iterator it = dynvars.begin(); + it != dynvars.end(); it++) + { + int lag = it->second; + SymbolType type = symbol_table.getType(it->first); + + if (max_lead_orig < lag) + max_lead_orig= lag; + else if (-max_lag_orig > lag) + max_lag_orig = -lag; + + switch (type) + { + case eEndogenous: + if (max_endo_lead_orig < lag) + max_endo_lead_orig = lag; + else if (-max_endo_lag_orig > lag) + max_endo_lag_orig = -lag; + break; + case eExogenous: + if (max_exo_lead_orig < lag) + max_exo_lead_orig = lag; + else if (-max_exo_lag_orig > lag) + max_exo_lag_orig = -lag; + break; + case eExogenousDet: + if (max_exo_det_lead_orig < lag) + max_exo_det_lead_orig = lag; + else if (-max_exo_det_lag_orig > lag) + max_exo_det_lag_orig = -lag; + break; + default: + break; + } + } +} + void DynamicModel::computeDerivIDs() { diff --git a/preprocessor/DynamicModel.hh b/preprocessor/DynamicModel.hh index 1fb14bc20..8b68744d8 100644 --- a/preprocessor/DynamicModel.hh +++ b/preprocessor/DynamicModel.hh @@ -61,6 +61,14 @@ private: //! Maximum lag and lead over deterministic exogenous variables (positive values) /*! Set by computeDerivIDs() */ int max_exo_det_lag, max_exo_det_lead; + //! Maximum lag and lead over all types of variables (positive values) of original model + int max_lag_orig, max_lead_orig; + //! Maximum lag and lead over endogenous variables (positive values) of original model + int max_endo_lag_orig, max_endo_lead_orig; + //! Maximum lag and lead over exogenous variables (positive values) of original model + int max_exo_lag_orig, max_exo_lead_orig; + //! Maximum lag and lead over deterministic exogenous variables (positive values) of original model + int max_exo_det_lag_orig, max_exo_det_lead_orig; //! Cross reference information map xrefs; @@ -277,6 +285,9 @@ public: //! Find exogenous variables not used in model set findUnusedExogenous(); + //! Set the max leads/lags of the original model + void setLeadsLagsOrig(); + //! Copies a dynamic model (only the equations) /*! It assumes that the dynamic model given in argument has just been allocated */ void cloneDynamic(DynamicModel &dynamic_model) const; diff --git a/preprocessor/ModFile.cc b/preprocessor/ModFile.cc index 29fcd93f4..71f5f33a0 100644 --- a/preprocessor/ModFile.cc +++ b/preprocessor/ModFile.cc @@ -335,6 +335,7 @@ void ModFile::transformPass(bool nostrict, bool compute_xrefs) { // Save the original model (must be done before any model transformations by preprocessor) + dynamic_model.setLeadsLagsOrig(); dynamic_model.cloneDynamic(original_model); if (nostrict)