diff --git a/CodeInterpreter.hh b/CodeInterpreter.hh index 964d05c8910ad7165292ab2dba5e71bb2cdd2ccd..d7585379f96f63d792808f7edc3f2930e10f7c1b 100644 --- a/CodeInterpreter.hh +++ b/CodeInterpreter.hh @@ -234,6 +234,18 @@ enum external_function_type ExternalFunctionSecondDerivative }; +enum PriorDistributions + { + eNoShape = 0, + eBeta = 1, + eGamma = 2, + eNormal = 3, + eInvGamma = 4, + eInvGamma1 = 4, + eUniform = 5, + eInvGamma2 = 6 + }; + struct Block_contain_type { int Equation, Variable, Own_Derivative; diff --git a/ComputingTasks.cc b/ComputingTasks.cc index b605d70058f2793325bd2cec130691d61b5288e7..81d4ec165c9d470058ab3aa70deb100976639e8f 100644 --- a/ComputingTasks.cc +++ b/ComputingTasks.cc @@ -446,7 +446,7 @@ EstimatedParamsStatement::checkPass(ModFileStructure &mod_file_struct) mod_file_struct.dsge_prior_weight_in_estimated_params = true; // Handle case of degenerate beta prior - if (it->prior == "1") //BETA_PDF is associated with "1" in DynareBison.yy + if (it->prior == eBeta) try { if (it->mean->eval(eval_context_t()) == 0.5 @@ -1655,9 +1655,11 @@ BasicPriorStatement::~BasicPriorStatement() } BasicPriorStatement::BasicPriorStatement(const string &name_arg, + const PriorDistributions &prior_shape_arg, const expr_t &variance_arg, const OptionsList &options_list_arg) : name(name_arg), + prior_shape(prior_shape_arg), variance(variance_arg), options_list(options_list_arg), first_statement_encountered(false) @@ -1667,7 +1669,7 @@ BasicPriorStatement::BasicPriorStatement(const string &name_arg, void BasicPriorStatement::checkPass(ModFileStructure &mod_file_struct) { - if (options_list.num_options.find("shape") == options_list.num_options.end()) + if (options_list.string_options.find("shape") == options_list.string_options.end()) { cerr << "ERROR: You must pass the shape option to the prior statement." << endl; exit(EXIT_FAILURE); @@ -1715,7 +1717,6 @@ BasicPriorStatement::writeVarianceOption(ostream &output, const string &lhs_fiel void BasicPriorStatement::writeOutputHelper(ostream &output, const string &field, const string &lhs_field) const { - OptionsList::num_options_t::const_iterator itn = options_list.num_options.find(field); if (itn != options_list.num_options.end()) output << "estimation_info" << lhs_field << "(prior_indx)." << field @@ -1727,10 +1728,18 @@ BasicPriorStatement::writeOutputHelper(ostream &output, const string &field, con << " = '" << itd->second << "';" << endl; } +void +BasicPriorStatement::writeShape(ostream &output, const string &lhs_field) const +{ + assert(prior_shape != eNoShape); + output << "estimation_info" << lhs_field << "(prior_indx).shape = " << prior_shape; +} + PriorStatement::PriorStatement(const string &name_arg, + const PriorDistributions &prior_shape_arg, const expr_t &variance_arg, const OptionsList &options_list_arg) : - BasicPriorStatement(name_arg, variance_arg, options_list_arg) + BasicPriorStatement(name_arg, prior_shape_arg, variance_arg, options_list_arg) { } @@ -1751,7 +1760,7 @@ PriorStatement::writeOutput(ostream &output, const string &basename) const writePriorIndex(output, lhs_field); output << "estimation_info" << lhs_field << "_index(prior_indx) = {'" << name << "'};" << endl << "estimation_info" << lhs_field <<"(prior_indx).name = '" << name << "';" << endl; - + writeShape(output, lhs_field); writeOutputHelper(output, "mean", lhs_field); writeOutputHelper(output, "mode", lhs_field); writeOutputHelper(output, "stdev", lhs_field); @@ -1765,10 +1774,11 @@ PriorStatement::writeOutput(ostream &output, const string &basename) const } StdPriorStatement::StdPriorStatement(const string &name_arg, + const PriorDistributions &prior_shape_arg, const expr_t &variance_arg, const OptionsList &options_list_arg, const SymbolTable &symbol_table_arg ) : - BasicPriorStatement(name_arg, variance_arg, options_list_arg), + BasicPriorStatement(name_arg, prior_shape_arg, variance_arg, options_list_arg), symbol_table(symbol_table_arg) { } @@ -1793,6 +1803,7 @@ StdPriorStatement::writeOutput(ostream &output, const string &basename) const output << "estimation_info" << lhs_field << "_index(prior_indx) = {'" << name << "'};" << endl; output << "estimation_info" << lhs_field << "(prior_indx).name = '" << name << "';" << endl; + writeShape(output, lhs_field); writeOutputHelper(output, "mean", lhs_field); writeOutputHelper(output, "mode", lhs_field); writeOutputHelper(output, "stdev", lhs_field); @@ -1804,10 +1815,11 @@ StdPriorStatement::writeOutput(ostream &output, const string &basename) const } CorrPriorStatement::CorrPriorStatement(const string &name_arg1, const string &name_arg2, + const PriorDistributions &prior_shape_arg, const expr_t &variance_arg, const OptionsList &options_list_arg, const SymbolTable &symbol_table_arg ) : - BasicPriorStatement(name_arg1, variance_arg, options_list_arg), + BasicPriorStatement(name_arg1, prior_shape_arg, variance_arg, options_list_arg), name1(name_arg2), symbol_table(symbol_table_arg) { @@ -1841,6 +1853,7 @@ CorrPriorStatement::writeOutput(ostream &output, const string &basename) const output << "estimation_info" << lhs_field << "(prior_indx).name1 = '" << name << "';" << endl; output << "estimation_info" << lhs_field << "(prior_indx).name2 = '" << name1 << "';" << endl; + writeShape(output, lhs_field); writeOutputHelper(output, "mean", lhs_field); writeOutputHelper(output, "mode", lhs_field); writeOutputHelper(output, "stdev", lhs_field); diff --git a/ComputingTasks.hh b/ComputingTasks.hh index bba0176e07903ebeaaa6f7a49b0e6f37dcfdbcc8..f111f7a4562043702356020a48e9064bc1728614 100644 --- a/ComputingTasks.hh +++ b/ComputingTasks.hh @@ -251,7 +251,8 @@ class EstimationParams { public: int type; - string name, name2, prior; + string name, name2; + PriorDistributions prior; expr_t init_val, low_bound, up_bound, mean, std, p3, p4, jscale; void @@ -260,7 +261,7 @@ public: type = 0; name = ""; name2 = ""; - prior = "NaN"; + prior = eNoShape; init_val = datatree.NaN; low_bound = datatree.MinusInfinity; up_bound = datatree.Infinity; @@ -583,10 +584,12 @@ public: virtual ~BasicPriorStatement(); protected: const string name; + const PriorDistributions prior_shape; const expr_t variance; const OptionsList options_list; bool first_statement_encountered; BasicPriorStatement(const string &name_arg, + const PriorDistributions &prior_shape_arg, const expr_t &variance_arg, const OptionsList &options_list_arg); virtual void checkPass(ModFileStructure &mod_file_struct); @@ -594,12 +597,14 @@ protected: void writePriorIndex(ostream &output, const string &lhs_field) const; void writeVarianceOption(ostream &output, const string &lhs_field) const; void writeOutputHelper(ostream &output, const string &field, const string &lhs_field) const; + void writeShape(ostream &output, const string &lhs_field) const; }; class PriorStatement : public BasicPriorStatement { public: PriorStatement(const string &name_arg, + const PriorDistributions &prior_shape_arg, const expr_t &variance_arg, const OptionsList &options_list_arg); virtual void checkPass(ModFileStructure &mod_file_struct); @@ -612,6 +617,7 @@ private: const SymbolTable symbol_table; public: StdPriorStatement(const string &name_arg, + const PriorDistributions &prior_shape_arg, const expr_t &variance_arg, const OptionsList &options_list_arg, const SymbolTable &symbol_table_arg); @@ -627,6 +633,7 @@ private: public: CorrPriorStatement(const string &name_arg1, const string &name_arg2, + const PriorDistributions &prior_shape_arg, const expr_t &variance_arg, const OptionsList &options_list_arg, const SymbolTable &symbol_table_arg); diff --git a/DynareBison.yy b/DynareBison.yy index 7df717480940bae01c6b73720cece444a760f527..86dfb2c4088b418088e507398539bd79f97e42a6 100644 --- a/DynareBison.yy +++ b/DynareBison.yy @@ -33,6 +33,7 @@ using namespace std; class ParsingDriver; #include "ExprNode.hh" +#include "CodeInterpreter.hh" /* Little hack: we redefine the macro which computes the locations, because we need to access the location from within the parsing driver for error @@ -75,6 +76,7 @@ class ParsingDriver; SymbolType symbol_type_val; vector<string *> *vector_string_val; vector<int> *vector_int_val; + PriorDistributions prior_distributions_val; }; %{ @@ -175,13 +177,13 @@ class ParsingDriver; %type <node_val> expression expression_or_empty %type <node_val> equation hand_side %type <string_val> non_negative_number signed_number signed_integer date_number -%type <string_val> filename symbol prior_distribution vec_of_vec_value vec_value_list +%type <string_val> filename symbol vec_of_vec_value vec_value_list %type <string_val> vec_value_1 vec_value signed_inf signed_number_w_inf -%type <string_val> range prior_pdf_string vec_value_w_inf vec_value_1_w_inf +%type <string_val> range vec_value_w_inf vec_value_1_w_inf %type <symbol_type_val> change_type_arg %type <vector_string_val> change_type_var_list %type <vector_int_val> vec_int_elem vec_int_1 vec_int vec_int_number - +%type <prior_distributions_val> prior_pdf %% %start statement_list; @@ -1030,24 +1032,21 @@ estimated_elem1 : STDERR symbol } ; -estimated_elem2 : prior_pdf_string COMMA estimated_elem3 +estimated_elem2 : prior_pdf COMMA estimated_elem3 { - driver.estim_params.prior = *$1; - delete $1; + driver.estim_params.prior = $1; } - | expression_or_empty COMMA prior_pdf_string COMMA estimated_elem3 + | expression_or_empty COMMA prior_pdf COMMA estimated_elem3 { driver.estim_params.init_val = $1; - driver.estim_params.prior = *$3; - delete $3; + driver.estim_params.prior = $3; } - | expression_or_empty COMMA expression_or_empty COMMA expression_or_empty COMMA prior_pdf_string COMMA estimated_elem3 + | expression_or_empty COMMA expression_or_empty COMMA expression_or_empty COMMA prior_pdf COMMA estimated_elem3 { driver.estim_params.init_val = $1; driver.estim_params.low_bound = $3; driver.estim_params.up_bound = $5; - driver.estim_params.prior = *$7; - delete $7; + driver.estim_params.prior = $7; } | expression { @@ -1160,37 +1159,21 @@ estimated_bounds_elem : STDERR symbol COMMA expression COMMA expression ';' } ; -prior_distribution : BETA - { $$ = new string("1"); } - | GAMMA - { $$ = new string("2"); } - | NORMAL - { $$ = new string("3"); } - | INV_GAMMA - { $$ = new string("4"); } - | INV_GAMMA1 - { $$ = new string("4"); } - | UNIFORM - { $$ = new string("5"); } - | INV_GAMMA2 - { $$ = new string("6"); } - ; - -prior_pdf_string : BETA_PDF - { $$ = new string("1"); } - | GAMMA_PDF - { $$ = new string("2"); } - | NORMAL_PDF - { $$ = new string("3"); } - | INV_GAMMA_PDF - { $$ = new string("4"); } - | INV_GAMMA1_PDF - { $$ = new string("4"); } - | UNIFORM_PDF - { $$ = new string("5"); } - | INV_GAMMA2_PDF - { $$ = new string("6"); } - ; +prior_pdf : BETA_PDF + { $$ = eBeta; } + | GAMMA_PDF + { $$ = eGamma; } + | NORMAL_PDF + { $$ = eNormal; } + | INV_GAMMA_PDF + { $$ = eInvGamma; } + | INV_GAMMA1_PDF + { $$ = eInvGamma1; } + | UNIFORM_PDF + { $$ = eUniform; } + | INV_GAMMA2_PDF + { $$ = eInvGamma2; } + ; set_time : SET_TIME '(' date_number ')' ';' { driver.set_time($3); } @@ -1224,16 +1207,16 @@ subsamples_name_list : subsamples_name_list COMMA o_subsample_name | o_subsample_name ; -prior : symbol '.' PRIOR { driver.set_prior_variance(); } '(' prior_options_list ')' ';' +prior : symbol '.' PRIOR { driver.set_prior_variance(); driver.prior_shape = eNoShape; } '(' prior_options_list ')' ';' { driver.set_prior($1); } - | symbol '.' symbol '.' PRIOR { driver.set_prior_variance(); } '(' prior_options_list ')' ';' + | symbol '.' symbol '.' PRIOR { driver.set_prior_variance(); driver.prior_shape = eNoShape; } '(' prior_options_list ')' ';' { driver.add_subsample_range(new string (*$1), $3); driver.set_prior($1); } - | STD '(' symbol ')' '.' PRIOR { driver.set_prior_variance(); } '(' prior_options_list ')' ';' + | STD '(' symbol ')' '.' PRIOR { driver.set_prior_variance(); driver.prior_shape = eNoShape; } '(' prior_options_list ')' ';' { driver.set_std_prior($3); } - | CORR '(' symbol COMMA symbol')' '.' PRIOR { driver.set_prior_variance(); } '(' prior_options_list ')' ';' + | CORR '(' symbol COMMA symbol')' '.' PRIOR { driver.set_prior_variance(); driver.prior_shape = eNoShape; } '(' prior_options_list ')' ';' { driver.set_corr_prior($3, $5); } ; @@ -1992,7 +1975,7 @@ o_last_obs : LAST_OBS EQUAL date_number { driver.option_date("last_obs", $3); } ; o_shift : SHIFT EQUAL signed_number { driver.option_num("shift", $3); }; -o_shape : SHAPE EQUAL prior_distribution { driver.option_num("shape", $3); }; +o_shape : SHAPE EQUAL prior_pdf { driver.prior_shape = $3; }; o_mode : MODE EQUAL signed_number { driver.option_num("mode", $3); }; o_mean : MEAN EQUAL signed_number { driver.option_num("mean", $3); }; o_stdev : STDEV EQUAL non_negative_number { driver.option_num("stdev", $3); }; diff --git a/ParsingDriver.cc b/ParsingDriver.cc index ad855720bf1391272003cbfab77c7ab0ed59b4ab..a35ee57d40f7bda80f85c03d0fec03826fde88c7 100644 --- a/ParsingDriver.cc +++ b/ParsingDriver.cc @@ -1303,9 +1303,10 @@ void ParsingDriver::set_prior(string *name) { check_symbol_is_parameter(name); - mod_file->addStatement(new PriorStatement(*name, prior_variance, options_list)); + mod_file->addStatement(new PriorStatement(*name, prior_shape, prior_variance, options_list)); options_list.clear(); set_prior_variance(); + prior_shape = eNoShape; delete name; } @@ -1344,9 +1345,11 @@ void ParsingDriver::set_std_prior(string *name) { check_symbol_is_endogenous_or_exogenous(name); - mod_file->addStatement(new StdPriorStatement(*name, prior_variance, options_list, mod_file->symbol_table)); + mod_file->addStatement(new StdPriorStatement(*name, prior_shape, prior_variance, + options_list, mod_file->symbol_table)); options_list.clear(); set_prior_variance(); + prior_shape = eNoShape; delete name; } @@ -1364,9 +1367,11 @@ ParsingDriver::set_corr_prior(string *name1, string *name2) { check_symbol_is_endogenous_or_exogenous(name1); check_symbol_is_endogenous_or_exogenous(name2); - mod_file->addStatement(new CorrPriorStatement(*name1, *name2, prior_variance, options_list, mod_file->symbol_table)); + mod_file->addStatement(new CorrPriorStatement(*name1, *name2, prior_shape, prior_variance, + options_list, mod_file->symbol_table)); options_list.clear(); set_prior_variance(); + prior_shape = eNoShape; delete name1; delete name2; } diff --git a/ParsingDriver.hh b/ParsingDriver.hh index 65b2a7340ecbf4117843ca8c3039f9da5dfdd032..9e05f98e13ee9458b6122178225e29e588e458b4 100644 --- a/ParsingDriver.hh +++ b/ParsingDriver.hh @@ -217,6 +217,9 @@ public: //! Estimation parameters EstimationParams estim_params; + //! Temporary storage for the prior shape + PriorDistributions prior_shape; + //! Error handler with explicit location void error(const Dynare::parser::location_type &l, const string &m) __attribute__ ((noreturn)); //! Error handler using saved location