From 52f3b964b2440a7d57d98da15ea8a629effa8f52 Mon Sep 17 00:00:00 2001 From: Johannes Pfeifer Date: Fri, 16 Jun 2017 13:51:03 +0200 Subject: [PATCH 1/2] Fix bug in use_shock_groups and colormap Option was not written to correct subfield of options_-structure. Related to 7cd56e96877de4ed2dd22bb579884ab292034d71 --- DynareBison.yy | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/DynareBison.yy b/DynareBison.yy index c82b7025..d9e3169e 100644 --- a/DynareBison.yy +++ b/DynareBison.yy @@ -2553,8 +2553,8 @@ plot_shock_decomposition_options_list : plot_shock_decomposition_option COMMA pl | plot_shock_decomposition_option ; -plot_shock_decomposition_option : o_psd_use_shock_groups - | o_psd_colormap +plot_shock_decomposition_option : o_use_shock_groups + | o_colormap | o_psd_nodisplay | o_psd_graph_format | o_psd_detail_plot @@ -3375,14 +3375,10 @@ o_lmmcp : LMMCP {driver.option_num("lmmcp.status", "1"); }; o_occbin : OCCBIN {driver.option_num("occbin", "1"); }; o_function : FUNCTION EQUAL filename { driver.option_str("function", $3); }; o_sampling_draws : SAMPLING_DRAWS EQUAL INT_NUMBER { driver.option_num("sampling_draws",$3); }; -o_use_shock_groups : USE_SHOCK_GROUPS { driver.option_str("use_shock_groups","default"); } - | USE_SHOCK_GROUPS EQUAL symbol { driver.option_str("use_shock_groups", $3); } +o_use_shock_groups : USE_SHOCK_GROUPS { driver.option_str("plot_shock_decomp.use_shock_groups","default"); } + | USE_SHOCK_GROUPS EQUAL symbol { driver.option_str("plot_shock_decomp.use_shock_groups", $3); } ; -o_psd_use_shock_groups : USE_SHOCK_GROUPS { driver.option_str("plot_shock_decomp.use_shock_groups","default"); } - | USE_SHOCK_GROUPS EQUAL symbol { driver.option_str("plot_shock_decomp.use_shock_groups", $3); } - ; o_colormap : COLORMAP EQUAL symbol { driver.option_num("plot_shock_decomp.colormap",$3); }; -o_psd_colormap : COLORMAP EQUAL symbol { driver.option_num("plot_shock_decomp.colormap",$3); }; range : symbol ':' symbol { From 293097712967442434d206a0d73a3fe2b29a8055 Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Thu, 27 Jul 2017 12:33:19 -0400 Subject: [PATCH 2/2] preprocessor: store max lead/lag info, write to output --- DynamicModel.cc | 65 ++++++++++++++++++++++++++++++++++++++++++++++++- DynamicModel.hh | 11 +++++++++ ModFile.cc | 1 + 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/DynamicModel.cc b/DynamicModel.cc index e827d58c..c927a873 100644 --- a/DynamicModel.cc +++ b/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/DynamicModel.hh b/DynamicModel.hh index 1fb14bc2..8b68744d 100644 --- a/DynamicModel.hh +++ b/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/ModFile.cc b/ModFile.cc index 29fcd93f..71f5f33a 100644 --- a/ModFile.cc +++ b/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)