diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy index 0dcbffb64cc5f12739f94a1d3be7506cec6c0bd5..d23d5137d097deed650ffcd0fd66606a87f0bc15 100644 --- a/preprocessor/DynareBison.yy +++ b/preprocessor/DynareBison.yy @@ -218,6 +218,7 @@ statement : parameters | data | prior | subsamples + | subsamples_eq | varobs | observation_trends | unit_root_vars @@ -1202,6 +1203,10 @@ subsamples : symbol '.' SUBSAMPLES '(' subsamples_name_list ')' ';' { driver.set_subsamples($1); } ; +subsamples_eq : symbol '.' SUBSAMPLES EQUAL symbol '.' SUBSAMPLES ';' + { driver.copy_subsamples($1, $5); } + ; + subsamples_name_list : subsamples_name_list COMMA o_subsample_name | o_subsample_name ; diff --git a/preprocessor/ParsingDriver.cc b/preprocessor/ParsingDriver.cc index c16e6fedd87e6264664b802fb5230e91c589a260..30ab3369dbedddfb02e8a14d3713a1a62ca3d308 100644 --- a/preprocessor/ParsingDriver.cc +++ b/preprocessor/ParsingDriver.cc @@ -1234,6 +1234,21 @@ ParsingDriver::estimation_data() options_list.clear(); } +void +ParsingDriver::copy_subsamples(string *to_parameter, string *from_parameter) +{ + check_symbol_is_parameter(to_parameter); + check_symbol_is_parameter(from_parameter); + if (subsample_declarations.find(*to_parameter) != subsample_declarations.end()) + error("Parameter " + *to_parameter + " has more than one subsample statement." + + "You may only have one subsample statement per parameter."); + if (subsample_declarations.find(*from_parameter) == subsample_declarations.end()) + error("Parameter " + *from_parameter + " does not have an associated subsample statement."); + subsample_declarations[*to_parameter] = subsample_declarations[*from_parameter]; + delete to_parameter; + delete from_parameter; +} + void ParsingDriver::set_subsamples(string *name) { diff --git a/preprocessor/ParsingDriver.hh b/preprocessor/ParsingDriver.hh index 0deebfd147909729e7efac6a9f3500fb9fd58544..74ba84409dbbdf6008abd573fcbd1d3bfba68f82 100644 --- a/preprocessor/ParsingDriver.hh +++ b/preprocessor/ParsingDriver.hh @@ -256,6 +256,8 @@ public: void set_subsample_name_equal_to_date_range(string *name, string *date1, string *date2); //! Adds a subsample range to the list of options for the prior statement void add_subsample_range(string *parameter, string *subsample_name); + //! Copies the set of subsamples from_parameter to_parameter + void copy_subsamples(string *to_parameter, string *from_parameter); //! Declares declare_optimal_policy_discount_factor as a parameter and initializes it to exprnode void declare_optimal_policy_discount_factor_parameter(expr_t exprnode); //! Adds a predetermined_variable