From c2461981d2917c69c3decfc55bf2aaf006057c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org> Date: Sat, 14 Dec 2019 08:42:09 +0100 Subject: [PATCH] Various provisions for improvements to shock decomposition commands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit – New “squeeze_shock_decomposition” command — New “max_nrows” option to “plot_shock_decomposition” and “initial_condition_decomposition” — “plot_shock_decomposition” now returns oo_ as an output argument Ref. dynare#1687, dynare!1655 --- src/ComputingTasks.cc | 31 ++++++++++++++++++++++++++++++- src/ComputingTasks.hh | 10 ++++++++++ src/DynareBison.yy | 12 ++++++++++++ src/DynareFlex.ll | 2 ++ src/ParsingDriver.cc | 7 +++++++ src/ParsingDriver.hh | 2 ++ 6 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc index 3aec80e2..a26e8b2a 100644 --- a/src/ComputingTasks.cc +++ b/src/ComputingTasks.cc @@ -2811,7 +2811,7 @@ PlotShockDecompositionStatement::writeOutput(ostream &output, const string &base output << "options_ = set_default_plot_shock_decomposition_options(options_);" << endl; options_list.writeOutput(output); symbol_list.writeOutput("var_list_", output); - output << "plot_shock_decomposition(M_, oo_, options_, var_list_);" << endl; + output << "oo_ = plot_shock_decomposition(M_, oo_, options_, var_list_);" << endl; } void @@ -2864,6 +2864,35 @@ InitialConditionDecompositionStatement::writeJsonOutput(ostream &output) const output << "}"; } +SqueezeShockDecompositionStatement::SqueezeShockDecompositionStatement(SymbolList symbol_list_arg) + : symbol_list{move(symbol_list_arg)} +{ +} + +void +SqueezeShockDecompositionStatement::writeOutput(ostream &output, const string &basename, bool minimal_workspace) const +{ + if (symbol_list.empty()) + output << "oo_ = squeeze_shock_decomposition(M_, oo_, options_);" << endl; + else + { + symbol_list.writeOutput("var_list_", output); + output << "oo_ = squeeze_shock_decomposition(M_, oo_, options_, var_list_,);" << endl; + } +} + +void +SqueezeShockDecompositionStatement::writeJsonOutput(ostream &output) const +{ + output << R"({"statementName": "squeeze_shock_decomposition")"; + if (!symbol_list.empty()) + { + output << ", "; + symbol_list.writeJsonOutput(output); + } + output << "}"; +} + ConditionalForecastStatement::ConditionalForecastStatement(OptionsList options_list_arg) : options_list{move(options_list_arg)} { diff --git a/src/ComputingTasks.hh b/src/ComputingTasks.hh index bf898c17..e8e2a7ca 100644 --- a/src/ComputingTasks.hh +++ b/src/ComputingTasks.hh @@ -760,6 +760,16 @@ public: void writeJsonOutput(ostream &output) const override; }; +class SqueezeShockDecompositionStatement : public Statement +{ +private: + const SymbolList symbol_list; +public: + SqueezeShockDecompositionStatement(SymbolList symbol_list_arg); + void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override; + void writeJsonOutput(ostream &output) const override; +}; + class ConditionalForecastStatement : public Statement { private: diff --git a/src/DynareBison.yy b/src/DynareBison.yy index d1d1be31..23f4f395 100644 --- a/src/DynareBison.yy +++ b/src/DynareBison.yy @@ -168,6 +168,7 @@ class ParsingDriver; %token NO_IDENTIFICATION_STRENGTH NO_IDENTIFICATION_REDUCEDFORM NO_IDENTIFICATION_MOMENTS %token NO_IDENTIFICATION_MINIMAL NO_IDENTIFICATION_SPECTRUM NORMALIZE_JACOBIANS GRID_NBR %token TOL_RANK TOL_DERIV TOL_SV CHECKS_VIA_SUBSETS MAX_DIM_SUBSETS_GROUPS +%token MAX_NROWS SQUEEZE_SHOCK_DECOMPOSITION %token <vector<string>> SYMBOL_VEC @@ -273,6 +274,7 @@ statement : parameters | realtime_shock_decomposition | plot_shock_decomposition | initial_condition_decomposition + | squeeze_shock_decomposition | conditional_forecast | conditional_forecast_paths | plot_conditional_forecast @@ -2452,6 +2454,12 @@ initial_condition_decomposition : INITIAL_CONDITION_DECOMPOSITION ';' { driver.initial_condition_decomposition(); } ; +squeeze_shock_decomposition : SQUEEZE_SHOCK_DECOMPOSITION ';' + { driver.squeeze_shock_decomposition(); } + | SQUEEZE_SHOCK_DECOMPOSITION symbol_list ';' + { driver.squeeze_shock_decomposition(); } + ; + bvar_prior_option : o_bvar_prior_tau | o_bvar_prior_decay | o_bvar_prior_lambda @@ -2862,6 +2870,7 @@ plot_shock_decomposition_option : o_use_shock_groups | o_psd_flip | o_psd_nograph | o_psd_init2shocks + | o_psd_max_nrows ; initial_condition_decomposition_options_list : initial_condition_decomposition_option COMMA initial_condition_decomposition_options_list @@ -2880,6 +2889,7 @@ initial_condition_decomposition_option : o_icd_type | o_icd_diff | o_icd_flip | o_icd_colormap + | o_icd_max_nrows ; homotopy_setup: HOMOTOPY_SETUP ';' homotopy_list END ';' @@ -3279,6 +3289,8 @@ o_psd_nodisplay : NODISPLAY { driver.option_num("plot_shock_decomp.nodisplay", " o_psd_init2shocks : INIT2SHOCKS { driver.option_str("plot_shock_decomp.init2shocks", "default"); } | INIT2SHOCKS EQUAL symbol { driver.option_str("plot_shock_decomp.init2shocks", $3); } ; +o_icd_max_nrows : MAX_NROWS EQUAL INT_NUMBER { driver.option_num("initial_condition_decomp.max_nrows", $3); }; +o_psd_max_nrows : MAX_NROWS EQUAL INT_NUMBER { driver.option_num("plot_shock_decomp.max_nrows", $3); }; o_graph_format : GRAPH_FORMAT EQUAL allowed_graph_formats { driver.process_graph_format_option(); } | GRAPH_FORMAT EQUAL '(' list_allowed_graph_formats ')' diff --git a/src/DynareFlex.ll b/src/DynareFlex.ll index f1c1d074..83a14f25 100644 --- a/src/DynareFlex.ll +++ b/src/DynareFlex.ll @@ -162,6 +162,7 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4]|w([1-9]{1}|[1-4][0-9]|5[0-2])) <INITIAL>realtime_shock_decomposition {BEGIN DYNARE_STATEMENT; return token::REALTIME_SHOCK_DECOMPOSITION;} <INITIAL>plot_shock_decomposition {BEGIN DYNARE_STATEMENT; return token::PLOT_SHOCK_DECOMPOSITION;} <INITIAL>initial_condition_decomposition {BEGIN DYNARE_STATEMENT; return token::INITIAL_CONDITION_DECOMPOSITION;} +<INITIAL>squeeze_shock_decomposition {BEGIN DYNARE_STATEMENT; return token::SQUEEZE_SHOCK_DECOMPOSITION;} <INITIAL>sbvar {BEGIN DYNARE_STATEMENT; return token::SBVAR;} <INITIAL>ms_estimation {BEGIN DYNARE_STATEMENT; return token::MS_ESTIMATION;} <INITIAL>ms_simulation {BEGIN DYNARE_STATEMENT; return token::MS_SIMULATION;} @@ -702,6 +703,7 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4]|w([1-9]{1}|[1-4][0-9]|5[0-2])) <DYNARE_STATEMENT>tol_sv {return token::TOL_SV;} <DYNARE_STATEMENT>checks_via_subsets {return token::CHECKS_VIA_SUBSETS;} <DYNARE_STATEMENT>max_dim_subsets_groups {return token::MAX_DIM_SUBSETS_GROUPS;} +<DYNARE_STATEMENT>max_nrows {return token::MAX_NROWS;} <DYNARE_STATEMENT>\$[^$]*\$ { strtok(yytext+1, "$"); diff --git a/src/ParsingDriver.cc b/src/ParsingDriver.cc index 3c20bbbc..a600c3ca 100644 --- a/src/ParsingDriver.cc +++ b/src/ParsingDriver.cc @@ -2396,6 +2396,13 @@ ParsingDriver::initial_condition_decomposition() options_list.clear(); } +void +ParsingDriver::squeeze_shock_decomposition() +{ + mod_file->addStatement(make_unique<SqueezeShockDecompositionStatement>(symbol_list)); + symbol_list.clear(); +} + void ParsingDriver::conditional_forecast() { diff --git a/src/ParsingDriver.hh b/src/ParsingDriver.hh index 8600f63e..8b772dce 100644 --- a/src/ParsingDriver.hh +++ b/src/ParsingDriver.hh @@ -702,6 +702,8 @@ public: void plot_shock_decomposition(); //! Initial Condition decomposition void initial_condition_decomposition(); + //! squeeze_shock_decomposition statement + void squeeze_shock_decomposition(); //! Conditional forecast statement void conditional_forecast(); //! Conditional forecast paths block -- GitLab