diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc index 00f31006040cdc076fab7e7c61703e3e73597d57..891fa5ca2af5507c202d8bb53445fa5d948fa5ad 100644 --- a/src/ComputingTasks.cc +++ b/src/ComputingTasks.cc @@ -1647,6 +1647,56 @@ EstimatedParamsBoundsStatement::writeJsonOutput(ostream &output) const << "}"; } +DeterministicTrendsStatement::DeterministicTrendsStatement(trend_elements_t trend_elements_arg, + const SymbolTable &symbol_table_arg) : + trend_elements{move(trend_elements_arg)}, + symbol_table{symbol_table_arg} +{ +} + +void +DeterministicTrendsStatement::writeOutput(ostream &output, const string &basename, bool minimal_workspace) const +{ + output << "options_.trend_coeff = {};" << endl; + for (const auto &trend_element : trend_elements) + { + SymbolType type = symbol_table.getType(trend_element.first); + if (type == SymbolType::endogenous) + { + output << "tmp1 = strmatch('" << trend_element.first << "',M_.endogenous_names,'exact');" << endl; + output << "options_.deterministic_trend_coeffs{tmp1} = '"; + trend_element.second->writeOutput(output); + output << "';" << endl; + } + else + cerr << "Warning : Non-variable symbol used in deterministic_trends: " << trend_element.first << endl; + } +} + +void +DeterministicTrendsStatement::writeJsonOutput(ostream &output) const +{ + output << R"({"statementName": "deterministic_trends", )" + << R"("trends" : {)"; + bool printed = false; + for (const auto &trend_element : trend_elements) + { + if (symbol_table.getType(trend_element.first) == SymbolType::endogenous) + { + if (printed) + output << ", "; + output << R"(")" << trend_element.first << R"(": ")"; + trend_element.second->writeJsonOutput(output, {}, {}); + output << R"(")" << endl; + printed = true; + } + else + cerr << "Warning : Non-variable symbol used in deterministic_trends: " << trend_element.first << endl; + } + output << "}" + << "}"; +} + ObservationTrendsStatement::ObservationTrendsStatement(trend_elements_t trend_elements_arg, const SymbolTable &symbol_table_arg) : trend_elements{move(trend_elements_arg)}, diff --git a/src/ComputingTasks.hh b/src/ComputingTasks.hh index 69ab9d70f244818825cfed9d42563d97e09f82f1..d86cb4bcd1822aae632e07a71929d6dd98cf6f8a 100644 --- a/src/ComputingTasks.hh +++ b/src/ComputingTasks.hh @@ -301,6 +301,20 @@ public: void writeJsonOutput(ostream &output) const override; }; +class DeterministicTrendsStatement : public Statement +{ +public: + using trend_elements_t = map<string, expr_t>; +private: + const trend_elements_t trend_elements; + const SymbolTable &symbol_table; +public: + DeterministicTrendsStatement(trend_elements_t trend_elements_arg, + const SymbolTable &symbol_table_arg); + void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override; + void writeJsonOutput(ostream &output) const override; +}; + class FilterInitialStateStatement : public Statement { public: diff --git a/src/DynareBison.yy b/src/DynareBison.yy index 1f219c6d6e8f81ee146e490db9010fb84a3286da..04861ca55662717e5ca7508260e80e360f7236e8 100644 --- a/src/DynareBison.yy +++ b/src/DynareBison.yy @@ -106,7 +106,7 @@ class ParsingDriver; %token USE_PENALIZED_OBJECTIVE_FOR_HESSIAN INIT_STATE FAST_REALTIME RESCALE_PREDICTION_ERROR_COVARIANCE GENERATE_IRFS %token NAN_CONSTANT NO_STATIC NOBS NOCONSTANT NODISPLAY NOCORR NODIAGNOSTIC NOFUNCTIONS NO_HOMOTOPY %token NOGRAPH POSTERIOR_NOGRAPH POSTERIOR_GRAPH NOMOMENTS NOPRINT NORMAL_PDF SAVE_DRAWS MODEL_NAME STDERR_MULTIPLES DIAGONAL_ONLY -%token OBSERVATION_TRENDS OPTIM OPTIM_WEIGHTS ORDER OSR OSR_PARAMS MAX_DIM_COVA_GROUP ADVANCED OUTFILE OUTVARS OVERWRITE DISCOUNT +%token DETERMINISTIC_TRENDS OBSERVATION_TRENDS OPTIM OPTIM_WEIGHTS ORDER OSR OSR_PARAMS MAX_DIM_COVA_GROUP ADVANCED OUTFILE OUTVARS OVERWRITE DISCOUNT %token PARALLEL_LOCAL_FILES PARAMETERS PARAMETER_SET PARTIAL_INFORMATION PERIODS PERIOD PLANNER_OBJECTIVE PLOT_CONDITIONAL_FORECAST PLOT_PRIORS PREFILTER PRESAMPLE %token PERFECT_FORESIGHT_SETUP PERFECT_FORESIGHT_SOLVER NO_POSTERIOR_KERNEL_DENSITY FUNCTION %token PRINT PRIOR_MC PRIOR_TRUNC PRIOR_MODE PRIOR_MEAN POSTERIOR_MODE POSTERIOR_MEAN POSTERIOR_MEDIAN MLE_MODE PRUNING PARTICLE_FILTER_OPTIONS @@ -245,6 +245,7 @@ statement : parameters | options | options_eq | varobs + | deterministic_trends | observation_trends | filter_initial_state | varexobs @@ -2080,6 +2081,7 @@ varexobs_list : varexobs_list symbol { driver.add_varexobs($1); } ; +deterministic_trends : DETERMINISTIC_TRENDS ';' trend_list END ';' { driver.set_deterministic_trends(); }; observation_trends : OBSERVATION_TRENDS ';' trend_list END ';' { driver.set_trends(); }; trend_list : trend_list trend_element diff --git a/src/DynareFlex.ll b/src/DynareFlex.ll index 4771827d8b4858fa448e2aaa1793572366a4e0da..2451d6e6801532185cb3f5973527431e22954706 100644 --- a/src/DynareFlex.ll +++ b/src/DynareFlex.ll @@ -213,6 +213,7 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4]) <INITIAL>estimated_params_bounds {BEGIN DYNARE_BLOCK; return token::ESTIMATED_PARAMS_BOUNDS;} <INITIAL>osr_params_bounds {BEGIN DYNARE_BLOCK; return token::OSR_PARAMS_BOUNDS;} <INITIAL>observation_trends {BEGIN DYNARE_BLOCK; return token::OBSERVATION_TRENDS;} +<INITIAL>deterministic_trends {BEGIN DYNARE_BLOCK; return token::DETERMINISTIC_TRENDS;} <INITIAL>optim_weights {BEGIN DYNARE_BLOCK; return token::OPTIM_WEIGHTS;} <INITIAL>homotopy_setup {BEGIN DYNARE_BLOCK; return token::HOMOTOPY_SETUP;} <INITIAL>conditional_forecast_paths {BEGIN DYNARE_BLOCK; return token::CONDITIONAL_FORECAST_PATHS;} diff --git a/src/ParsingDriver.cc b/src/ParsingDriver.cc index 51cd294354ea889d30e545d31633adf46ebc8c31..4945bb47d0ce187c1f402f2525d1e57ef5cbeeac 100644 --- a/src/ParsingDriver.cc +++ b/src/ParsingDriver.cc @@ -1873,10 +1873,10 @@ ParsingDriver::set_trends() } void -ParsingDriver::set_filter_initial_state() +ParsingDriver::set_deterministic_trends() { - mod_file->addStatement(make_unique<FilterInitialStateStatement>(filter_initial_state_elements, mod_file->symbol_table)); - filter_initial_state_elements.clear(); + mod_file->addStatement(make_unique<DeterministicTrendsStatement>(trend_elements, mod_file->symbol_table)); + trend_elements.clear(); } void @@ -1888,6 +1888,13 @@ ParsingDriver::set_trend_element(string arg1, expr_t arg2) trend_elements[move(arg1)] = arg2; } +void +ParsingDriver::set_filter_initial_state() +{ + mod_file->addStatement(make_unique<FilterInitialStateStatement>(filter_initial_state_elements, mod_file->symbol_table)); + filter_initial_state_elements.clear(); +} + void ParsingDriver::set_filter_initial_state_element(const string &name, const string &lag, expr_t rhs) { diff --git a/src/ParsingDriver.hh b/src/ParsingDriver.hh index eb200ca34b0316e7366e1d531feb9fe8224c768e..0811f3bca92bc167bfcf32b8be8b1e8eaffecd5b 100644 --- a/src/ParsingDriver.hh +++ b/src/ParsingDriver.hh @@ -597,6 +597,7 @@ public: //! Forecast Statement void forecast(); void set_trends(); + void set_deterministic_trends(); void set_trend_element(string arg1, expr_t arg2); //! filter_initial_state block void set_filter_initial_state();