diff --git a/matlab/global_initialization.m b/matlab/global_initialization.m index e3325df1958855da342ff4494878fd2ecd470dfb..aa57f47bcb45fd1a52dfde5ba0789d1a0ba34e28 100644 --- a/matlab/global_initialization.m +++ b/matlab/global_initialization.m @@ -201,6 +201,10 @@ estimation_info.measurement_error.prior_index = {}; estimation_info.structural_innovation.prior_index = {}; estimation_info.measurement_error_corr.prior_index = {}; estimation_info.structural_innovation_corr.prior_index = {}; +estimation_info.measurement_error.options_index = {}; +estimation_info.structural_innovation.options_index = {}; +estimation_info.measurement_error_corr.options_index = {}; +estimation_info.structural_innovation_corr.options_index = {}; options_.initial_period = dynDate(1); options_.dataset.firstobs = options_.initial_period; options_.dataset.lastobs = NaN; diff --git a/preprocessor/ComputingTasks.cc b/preprocessor/ComputingTasks.cc index aae564fe849c5bd38c1a19d1dc2371421d3b2970..169333e659d0cf749244548d4faa5feea9a6361c 100644 --- a/preprocessor/ComputingTasks.cc +++ b/preprocessor/ComputingTasks.cc @@ -1700,3 +1700,171 @@ CorrPriorStatement::writeOutput(ostream &output, const string &basename) const writeOutputHelper(output, "interval", lhs_field); BasicPriorStatement::writeVarianceOption(output, lhs_field); } + +BasicOptionsStatement::~BasicOptionsStatement() +{ +} + +BasicOptionsStatement::BasicOptionsStatement(const string &name_arg, + const OptionsList &options_list_arg) : + name(name_arg), + options_list(options_list_arg), + first_statement_encountered(false) +{ +} + +void +BasicOptionsStatement::checkPass(ModFileStructure &mod_file_struct) +{ + if (options_list.num_options.find("date1") != options_list.num_options.end() || + options_list.num_options.find("date2") != options_list.num_options.end()) + if (options_list.num_options.find("date1") == options_list.num_options.end() || + options_list.num_options.find("date2") == options_list.num_options.end()) + { + cerr << "ERROR: OptionsStatement::checkPass(1). Should not arrive here. " + << "Please inform Dynare Team." << endl; + exit(EXIT_FAILURE); + } +} + +void +BasicOptionsStatement::writeOptionsIndex(ostream &output, const string &lhs_field) const +{ + if (first_statement_encountered) + output << "options_indx = 1;" << endl; + else + output << "options_indx = size(estimation_info" << lhs_field << "_index, 2) + 1;" << endl; +} + +void +BasicOptionsStatement::get_base_name(const SymbolType symb_type, string &lhs_field) const +{ + if (symb_type == eExogenous || symb_type == eExogenousDet) + lhs_field = "structural_innovation"; + else + lhs_field = "measurement_error"; +} + +void +BasicOptionsStatement::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 << "(options_indx)." << field + << " = " << itn->second << ";" << endl; + + OptionsList::date_options_t::const_iterator itd = options_list.date_options.find(field); + if (itd != options_list.date_options.end()) + output << "estimation_info" << lhs_field << "(options_indx)." << field + << " = '" << itd->second << "';" << endl; +} + +OptionsStatement::OptionsStatement(const string &name_arg, + const OptionsList &options_list_arg) : + BasicOptionsStatement(name_arg, options_list_arg) +{ +} + +void +OptionsStatement::checkPass(ModFileStructure &mod_file_struct) +{ + BasicOptionsStatement::checkPass(mod_file_struct); + if (!mod_file_struct.options_statement_present) + first_statement_encountered = true; + mod_file_struct.options_statement_present = true; +} + +void +OptionsStatement::writeOutput(ostream &output, const string &basename) const +{ + string lhs_field = ".options"; + + BasicOptionsStatement::writeOptionsIndex(output, lhs_field); + output << "estimation_info" << lhs_field <<"_index(options_indx) = {'" << name << "'};" << endl + << "estimation_info" << lhs_field << "(options_indx).name = '" << name << "';" << endl; + + writeOutputHelper(output, "init", lhs_field); + writeOutputHelper(output, "bounds", lhs_field); + writeOutputHelper(output, "jscale", lhs_field); + writeOutputHelper(output, "date1", lhs_field); + writeOutputHelper(output, "date2", lhs_field); +} + +StdOptionsStatement::StdOptionsStatement(const string &name_arg, + const OptionsList &options_list_arg, + const SymbolTable &symbol_table_arg ) : + BasicOptionsStatement(name_arg, options_list_arg), + symbol_table(symbol_table_arg) +{ +} + +void +StdOptionsStatement::checkPass(ModFileStructure &mod_file_struct) +{ + BasicOptionsStatement::checkPass(mod_file_struct); + if (!mod_file_struct.std_options_statement_present) + first_statement_encountered = true; + mod_file_struct.std_options_statement_present = true; +} + +void +StdOptionsStatement::writeOutput(ostream &output, const string &basename) const +{ + string lhs_field; + get_base_name(symbol_table.getType(name), lhs_field); + lhs_field = "." + lhs_field + ".options"; + + BasicOptionsStatement::writeOptionsIndex(output, lhs_field); + output << "estimation_info" << lhs_field << "_index(options_indx) = {'" << name << "'};" << endl; + output << "estimation_info" << lhs_field << "(options_indx).name = '" << name << "';" << endl; + + writeOutputHelper(output, "init", lhs_field); + writeOutputHelper(output, "bounds", lhs_field); + writeOutputHelper(output, "jscale", lhs_field); + writeOutputHelper(output, "date1", lhs_field); + writeOutputHelper(output, "date2", lhs_field); +} + +CorrOptionsStatement::CorrOptionsStatement(const string &name_arg1, const string &name_arg2, + const OptionsList &options_list_arg, + const SymbolTable &symbol_table_arg ) : + BasicOptionsStatement(name_arg1, options_list_arg), + name1(name_arg2), + symbol_table(symbol_table_arg) +{ +} + +void +CorrOptionsStatement::checkPass(ModFileStructure &mod_file_struct) +{ + if (symbol_table.getType(name) != symbol_table.getType(name1)) + { + cerr << "ERROR: In the corr(A,B).options statement, A and B must be of the same type. " + << "In your case, " << name << " and " << name1 << " are of different " + << "types." << endl; + exit(EXIT_FAILURE); + } + if (!mod_file_struct.corr_options_statement_present) + first_statement_encountered = true; + mod_file_struct.corr_prior_statement_present = true; +} + +void +CorrOptionsStatement::writeOutput(ostream &output, const string &basename) const +{ + string lhs_field; + get_base_name(symbol_table.getType(name), lhs_field); + lhs_field = "." + lhs_field + "_corr.options"; + + BasicOptionsStatement::writeOptionsIndex(output, lhs_field); + output << "estimation_info" << lhs_field << "_index(options_indx) = {'" << name << "_" << name1 << "'};" << endl; + lhs_field += "."; + output << "estimation_info" << lhs_field << "(options_indx).name1 = '" << name << "';" << endl; + output << "estimation_info" << lhs_field << "(options_indx).name2 = '" << name1 << "';" << endl; + + writeOutputHelper(output, "init", lhs_field); + writeOutputHelper(output, "bounds", lhs_field); + writeOutputHelper(output, "jscale", lhs_field); + writeOutputHelper(output, "date1", lhs_field); + writeOutputHelper(output, "date2", lhs_field); +} diff --git a/preprocessor/ComputingTasks.hh b/preprocessor/ComputingTasks.hh index c69043fb650ce3c0857a833e5541453f8ac828e6..397139aeb7483a173f9d3618e7cca6aca54c1336 100644 --- a/preprocessor/ComputingTasks.hh +++ b/preprocessor/ComputingTasks.hh @@ -632,4 +632,51 @@ public: virtual void writeOutput(ostream &output, const string &basename) const; }; +class BasicOptionsStatement : public Statement +{ +public: + virtual ~BasicOptionsStatement(); +protected: + const string name; + const OptionsList options_list; + bool first_statement_encountered; + BasicOptionsStatement(const string &name_arg, + const OptionsList &options_list_arg); + void get_base_name(const SymbolType symb_type, string &lhs_field) const; + virtual void checkPass(ModFileStructure &mod_file_struct); + void writeOptionsIndex(ostream &output, const string &lhs_field) const; + void writeOutputHelper(ostream &output, const string &field, const string &lhs_field) const; +}; + +class OptionsStatement : public BasicOptionsStatement +{ +public: + OptionsStatement(const string &name_arg, const OptionsList &options_list_arg); + virtual void checkPass(ModFileStructure &mod_file_struct); + virtual void writeOutput(ostream &output, const string &basename) const; +}; + +class StdOptionsStatement : public BasicOptionsStatement +{ +private: + const SymbolTable symbol_table; +public: + StdOptionsStatement(const string &name_arg, const OptionsList &options_list_arg, + const SymbolTable &symbol_table_arg); + virtual void checkPass(ModFileStructure &mod_file_struct); + virtual void writeOutput(ostream &output, const string &basename) const; +}; + +class CorrOptionsStatement : public BasicOptionsStatement +{ +private: + const string name1; + const SymbolTable symbol_table; +public: + CorrOptionsStatement(const string &name_arg1, const string &name_arg2, + const OptionsList &options_list_arg, const SymbolTable &symbol_table_arg); + virtual void checkPass(ModFileStructure &mod_file_struct); + virtual void writeOutput(ostream &output, const string &basename) const; +}; + #endif diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy index d23d5137d097deed650ffcd0fd66606a87f0bc15..53eba46614d0495ed22f9d6155674b0623473e45 100644 --- a/preprocessor/DynareBison.yy +++ b/preprocessor/DynareBison.yy @@ -101,11 +101,11 @@ class ParsingDriver; %token FORECAST K_ORDER_SOLVER INSTRUMENTS PRIOR SHIFT MEAN STDEV VARIANCE MODE INTERVAL SHAPE DOMAINN %token GAMMA_PDF GRAPH CONDITIONAL_VARIANCE_DECOMPOSITION NOCHECK STD %token HISTVAL HOMOTOPY_SETUP HOMOTOPY_MODE HOMOTOPY_STEPS HP_FILTER HP_NGRID -%token IDENTIFICATION INF_CONSTANT INITVAL INITVAL_FILE +%token IDENTIFICATION INF_CONSTANT INITVAL INITVAL_FILE BOUNDS JSCALE INIT %token <string_val> INT_NUMBER %token <string_val> DATE_NUMBER %token INV_GAMMA_PDF INV_GAMMA1_PDF INV_GAMMA2_PDF IRF IRF_SHOCKS -%token KALMAN_ALGO KALMAN_TOL SUBSAMPLES +%token KALMAN_ALGO KALMAN_TOL SUBSAMPLES OPTIONS %token LABELS LAPLACE LIK_ALGO LIK_INIT LINEAR LOAD_IDENT_FILES LOAD_MH_FILE LOAD_PARAMS_AND_STEADY_STATE LOGLINEAR %token MARKOWITZ MARGINAL_DENSITY MAX MAXIT %token MFS MH_DROP MH_INIT_SCALE MH_JSCALE MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER MIN MINIMAL_SOLVING_PERIODS @@ -176,8 +176,8 @@ class ParsingDriver; %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 -%type <string_val> vec_value_1 vec_value -%type <string_val> range prior_pdf_string +%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 <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 @@ -219,6 +219,7 @@ statement : parameters | prior | subsamples | subsamples_eq + | options | varobs | observation_trends | unit_root_vars @@ -980,6 +981,18 @@ signed_number : PLUS non_negative_number | non_negative_number ; +signed_inf : PLUS INF_CONSTANT + { $$ = new string ("Inf"); } + | MINUS INF_CONSTANT + { $$ = new string ("-Inf"); } + | INF_CONSTANT + { $$ = new string ("Inf"); } + ; + +signed_number_w_inf : signed_inf + | signed_number + ; + estimated_params : ESTIMATED_PARAMS ';' estimated_list END ';' { driver.estimated_params(); }; estimated_list : estimated_list estimated_elem @@ -1238,6 +1251,28 @@ prior_options : o_shift | o_domain ; +options : symbol '.' OPTIONS '(' options_options_list ')' ';' + { driver.set_options($1); } + | symbol '.' symbol '.' OPTIONS '(' options_options_list ')' ';' + { + driver.add_subsample_range(new string (*$1), $3); + driver.set_options($1); + } + | STD '(' symbol ')' '.' OPTIONS '(' options_options_list ')' ';' + { driver.set_std_options($3); } + | CORR '(' symbol COMMA symbol')' '.' OPTIONS '(' options_options_list ')' ';' + { driver.set_corr_options($3, $5); } + ; + +options_options_list : options_options_list COMMA options_options + | options_options + ; + +options_options : o_jscale + | o_init + | o_bounds + ; + estimation : ESTIMATION ';' { driver.run_estimation(); } | ESTIMATION '(' estimation_options_list ')' ';' @@ -1961,6 +1996,9 @@ o_shape : SHAPE EQUAL prior_distribution { driver.option_num("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); }; +o_jscale : JSCALE EQUAL non_negative_number { driver.option_num("jscale", $3); }; +o_init : INIT EQUAL signed_number { driver.option_num("init", $3); }; +o_bounds : BOUNDS EQUAL vec_value_w_inf { driver.option_num("bounds", $3); }; o_domain : DOMAINN EQUAL vec_value { driver.option_num("domain", $3); }; o_interval : INTERVAL EQUAL vec_value { driver.option_num("interval", $3); }; o_variance : VARIANCE EQUAL expression { driver.add_expression_to_prior_statement($3); } @@ -2339,6 +2377,19 @@ vec_value_1 : '[' signed_number vec_value : vec_value_1 ']' { $1->append("]"); $$ = $1; }; +vec_value_1_w_inf : '[' signed_number_w_inf + { $2->insert(0, "["); $$ = $2;} + | vec_value_1_w_inf signed_number_w_inf + { + $1->append(" "); + $1->append(*$2); + delete $2; + $$ = $1; + } + ; + +vec_value_w_inf : vec_value_1_w_inf ']' { $1->append("]"); $$ = $1; }; + symbol : NAME | ALPHA | BETA diff --git a/preprocessor/DynareFlex.ll b/preprocessor/DynareFlex.ll index d0ff91fd7933e9eeada1aa6b82f476de949bd326..3684ea8d87c6523e63da010c262dcc56e5dc8506 100644 --- a/preprocessor/DynareFlex.ll +++ b/preprocessor/DynareFlex.ll @@ -190,6 +190,7 @@ string eofbuff; <DYNARE_BLOCK>end {BEGIN INITIAL; return token::END;} <DYNARE_STATEMENT>subsamples {return token::SUBSAMPLES;} +<DYNARE_STATEMENT>options {return token::OPTIONS;} <DYNARE_STATEMENT>prior {return token::PRIOR;} <INITIAL>std {BEGIN DYNARE_STATEMENT; return token::STD;} <INITIAL>corr {BEGIN DYNARE_STATEMENT; return token::CORR;} @@ -208,6 +209,9 @@ string eofbuff; <DYNARE_STATEMENT>interval {return token::INTERVAL;} <DYNARE_STATEMENT>shape {return token::SHAPE;} <DYNARE_STATEMENT>shift {return token::SHIFT;} +<DYNARE_STATEMENT>bounds {return token::BOUNDS;} +<DYNARE_STATEMENT>init {return token::INIT;} +<DYNARE_STATEMENT>jscale {return token::JSCALE;} <DYNARE_STATEMENT>prefilter {return token::PREFILTER;} <DYNARE_STATEMENT>presample {return token::PRESAMPLE;} <DYNARE_STATEMENT>lik_algo {return token::LIK_ALGO;} diff --git a/preprocessor/ParsingDriver.cc b/preprocessor/ParsingDriver.cc index 30ab3369dbedddfb02e8a14d3713a1a62ca3d308..4bc6620108438577c4952460d714d8e8dbd8d02e 100644 --- a/preprocessor/ParsingDriver.cc +++ b/preprocessor/ParsingDriver.cc @@ -1315,6 +1315,15 @@ ParsingDriver::add_expression_to_prior_statement(expr_t variance) prior_variance = variance; } +void +ParsingDriver::set_options(string *name) +{ + check_symbol_is_parameter(name); + mod_file->addStatement(new OptionsStatement(*name, options_list)); + options_list.clear(); + delete name; +} + void ParsingDriver::check_symbol_is_endogenous_or_exogenous(string *name) { @@ -1341,6 +1350,15 @@ ParsingDriver::set_std_prior(string *name) delete name; } +void +ParsingDriver::set_std_options(string *name) +{ + check_symbol_is_endogenous_or_exogenous(name); + // mod_file->addStatement(new StdOptionsStatement(*name, options_list, mod_file->symbol_table)); + options_list.clear(); + delete name; +} + void ParsingDriver::set_corr_prior(string *name1, string *name2) { @@ -1353,6 +1371,17 @@ ParsingDriver::set_corr_prior(string *name1, string *name2) delete name2; } +void +ParsingDriver::set_corr_options(string *name1, string *name2) +{ + check_symbol_is_endogenous_or_exogenous(name1); + check_symbol_is_endogenous_or_exogenous(name2); + // mod_file->addStatement(new CorrOptionsStatement(*name1, *name2, options_list, mod_file->symbol_table)); + options_list.clear(); + delete name1; + delete name2; +} + void ParsingDriver::run_estimation() { diff --git a/preprocessor/ParsingDriver.hh b/preprocessor/ParsingDriver.hh index 74ba84409dbbdf6008abd573fcbd1d3bfba68f82..a19ad5ed2d8d1929a8df7ff48ffb32c3e7b76bb3 100644 --- a/preprocessor/ParsingDriver.hh +++ b/preprocessor/ParsingDriver.hh @@ -390,10 +390,16 @@ public: void set_prior(string *arg); //! Adds the variance option to its temporary holding place void add_expression_to_prior_statement(expr_t variance); + //! Sets the options for a parameter + void set_options(string *arg); //! Sets the prior for estimated std dev void set_std_prior(string *arg); + //! Sets the options for estimated std dev + void set_std_options(string *arg); //! Sets the prior for estimated correlation void set_corr_prior(string *arg1, string *arg2); + //! Sets the options for estimated correlation + void set_corr_options(string *arg1, string *arg2); //! Runs estimation process void run_estimation(); //! Runs dynare_sensitivy() diff --git a/preprocessor/Statement.hh b/preprocessor/Statement.hh index a6091437ab0b10b9b3ce1c1577975fb95c781713..9aeecf95ee2488a42a0a355587d08db568886868 100644 --- a/preprocessor/Statement.hh +++ b/preprocessor/Statement.hh @@ -94,6 +94,12 @@ public: bool std_prior_statement_present; //! Whether there is a corr prior statement present bool corr_prior_statement_present; + //! Whether there is a options statement present + bool options_statement_present; + //! Whether there is a std options statement present + bool std_options_statement_present; + //! Whether there is a corr options statement present + bool corr_options_statement_present; }; class Statement