From 41375b7c04455fd8f6393e908a79ce841366f2d0 Mon Sep 17 00:00:00 2001 From: adjemian Date: Wed, 24 Sep 2008 21:52:11 +0000 Subject: [PATCH] v4.1: Added Model comparison. Not yet ready but can be used. The preprocessor, surprisingly, seems to sort the compared models (listed after the model_comparison command) by decreasing order of the model names (including path and extension). TODO: + Add an option to define the benchmark model (bayes ratio). + Add comparison to estimated BVAR models. git-svn-id: https://www.dynare.org/svn/dynare/dynare_v4@2110 ac1d8469-bf42-47a9-8791-bf33cf982152 --- ComputingTasks.cc | 10 ++--- DynareBison.yy | 77 +++++++++++++++------------------------ DynareFlex.ll | 9 ++++- include/ComputingTasks.hh | 2 +- 4 files changed, 43 insertions(+), 55 deletions(-) diff --git a/ComputingTasks.cc b/ComputingTasks.cc index 123c6ebb..f280d341 100644 --- a/ComputingTasks.cc +++ b/ComputingTasks.cc @@ -827,16 +827,16 @@ ModelComparisonStatement::writeOutput(ostream &output, const string &basename) c { options_list.writeOutput(output); - output << "ModelNames_ = {};\n"; - output << "ModelPriors_ = {};\n"; + output << "ModelNames_ = {};" << endl; + output << "ModelPriors_ = [];" << endl; for(filename_list_type::const_iterator it = filename_list.begin(); it != filename_list.end(); it++) { - output << "ModelNames_ = { ModelNames_{:} '" << it->first << "};\n"; - output << "ModelPriors_ = { ModelPriors_{:} '" << it->second << "};\n"; + output << "ModelNames_ = { ModelNames_{:} '" << it->first << "'};" << endl; + output << "ModelPriors_ = [ ModelPriors_ ; " << it->second << "];" << endl; } - output << "model_comparison(ModelNames_,ModelPriors_);\n"; + output << "model_comparison(ModelNames_,ModelPriors_,oo_,options_,M_.fname);" << endl; } PlannerObjectiveStatement::PlannerObjectiveStatement(ModelTree *model_tree_arg) : diff --git a/DynareBison.yy b/DynareBison.yy index b2360f78..2405142f 100644 --- a/DynareBison.yy +++ b/DynareBison.yy @@ -87,7 +87,8 @@ class ParsingDriver; %token CALIB CALIB_VAR CHECK CONF_SIG CONSTANT CORR COVAR CUTOFF %token DATAFILE DR_ALGO DROP DSAMPLE DYNASAVE DYNATYPE %token END ENDVAL EQUAL ESTIMATION ESTIMATED_PARAMS ESTIMATED_PARAMS_BOUNDS ESTIMATED_PARAMS_INIT -%token FILENAME FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS +%token FILENAME +%token FILENAME_KEYWORD FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS %token FLOAT_NUMBER %token FORECAST %token GAMMA_PDF GAUSSIAN_ELIMINATION GCC_COMPILER GMRES GRAPH @@ -96,10 +97,11 @@ class ParsingDriver; %token INT_NUMBER %token INV_GAMMA1_PDF INV_GAMMA2_PDF IRF %token KALMAN_ALGO KALMAN_TOL -%token LAPLACE LCC_COMPILER LIK_ALGO LIK_INIT LINEAR LOAD_MH_FILE LOGLINEAR LU MARKOWITZ MAX +%token LAPLACE LCC_COMPILER LIK_ALGO LIK_INIT LINEAR LOAD_MH_FILE LOGLINEAR LU +%token MARKOWITZ MARGINAL_DENSITY MAX %token METHOD MH_DROP MH_INIT_SCALE MH_JSCALE MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER MIN %token MODE_CHECK MODE_COMPUTE MODE_FILE MODEL MODEL_COMPARISON MODEL_INFO MSHOCKS -%token MODEL_COMPARISON_APPROXIMATION MODIFIEDHARMONICMEAN MOMENTS_VARENDO DIFFUSE_FILTER +%token MODIFIEDHARMONICMEAN MOMENTS_VARENDO DIFFUSE_FILTER %token NAME %token NO_COMPILER NOBS NOCONSTANT NOCORR NODIAGNOSTIC NOFUNCTIONS %token NOGRAPH NOMOMENTS NOPRINT NORMAL_PDF @@ -135,7 +137,7 @@ class ParsingDriver; %type expression %type equation hand_side model_var %type signed_float signed_integer prior -%type value value1 filename filename_elem vec_int_elem vec_int_1 vec_int +%type value value1 vec_int_elem vec_int_1 vec_int %type vec_value_1 vec_value %type calib_arg2 range number @@ -370,7 +372,7 @@ comma_expression : expression initval : INITVAL ';' initval_list END { driver.end_initval(); } -initval_file : INITVAL_FILE '(' FILENAME EQUAL NAME ')' ';' +initval_file : INITVAL_FILE '(' FILENAME_KEYWORD EQUAL NAME ')' ';' { driver.initval_file($5); } ; @@ -1117,44 +1119,25 @@ dynasave : DYNASAVE '(' NAME ')'';' { driver.run_dynasave($2, $4); } ; -model_comparison : MODEL_COMPARISON '(' model_comparison_options ')' filename_list ';' - { driver.run_model_comparison(); }; +model_comparison : MODEL_COMPARISON mc_filename_list ';' + { driver.run_model_comparison(); } + | MODEL_COMPARISON '(' o_marginal_density ')' mc_filename_list ';' + { driver.run_model_comparison(); } + ; -model_comparison_options : model_comparison_options COMMA model_comparison_option - | model_comparison_option - ; - -model_comparison_option : o_model_comparison_approximation - | o_print - | o_noprint - ; - -filename_list : filename - { driver.add_mc_filename($1); } - | filename_list COMMA filename - { driver.add_mc_filename($3); } - | filename '(' value ')' - { driver.add_mc_filename($1, $3); } - | filename_list COMMA filename '(' value ')' - { driver.add_mc_filename($3, $5); } - ; - -filename : filename_elem - { $$ = $1; } - | filename filename_elem - { $1->append(*$2); delete $2; $$ = $1; } - ; - -filename_elem : NAME - | '\\' - { $$ = new string("\\"); } - | DIVIDE - { $$ = new string("/"); } - | ':' - { $$ = new string(":"); } - | '.' - { $$ = new string("."); } - ; +mc_filename_list : FILENAME + { driver.add_mc_filename($1); } + | FILENAME '(' value ')' + { driver.add_mc_filename($1, $3); } + | mc_filename_list FILENAME + { driver.add_mc_filename($2); } + | mc_filename_list FILENAME '(' value ')' + { driver.add_mc_filename($2, $4); } + | mc_filename_list COMMA FILENAME + { driver.add_mc_filename($3); } + | mc_filename_list COMMA FILENAME '(' value ')' + { driver.add_mc_filename($3, $5); } + ; planner_objective : PLANNER_OBJECTIVE { driver.begin_planner_objective(); } hand_side { driver.end_planner_objective($3); } ';'; @@ -1375,11 +1358,11 @@ o_filtered_vars : FILTERED_VARS { driver.option_num("filtered_vars", "1"); }; o_relative_irf : RELATIVE_IRF { driver.option_num("relative_irf", "1"); }; o_kalman_algo : KALMAN_ALGO EQUAL INT_NUMBER { driver.option_num("kalman_algo", $3); }; o_kalman_tol : KALMAN_TOL EQUAL INT_NUMBER { driver.option_num("kalman_tol", $3); }; -o_model_comparison_approximation : MODEL_COMPARISON_APPROXIMATION EQUAL LAPLACE - { driver.option_str("model_comparison_approximation", "Laplace"); } - | MODEL_COMPARISON_APPROXIMATION EQUAL MODIFIEDHARMONICMEAN - { driver.option_str("model_comparison_approximation", "MODIFIEDHARMONICMEAN"); } - ; +o_marginal_density : MARGINAL_DENSITY EQUAL LAPLACE + { driver.option_str("mc_marginal_density", "laplace"); } + | MARGINAL_DENSITY EQUAL MODIFIEDHARMONICMEAN + { driver.option_str("mc_marginal_density", "modifiedharmonicmean"); } + ; o_print : PRINT { driver.option_num("noprint", "0"); }; o_noprint : NOPRINT { driver.option_num("noprint", "1"); }; o_xls_sheet : XLS_SHEET EQUAL NAME { driver.option_str("xls_sheet", $3); }; diff --git a/DynareFlex.ll b/DynareFlex.ll index 6a2ebd90..e49b22d3 100644 --- a/DynareFlex.ll +++ b/DynareFlex.ll @@ -204,13 +204,13 @@ int sigma_e = 0; periods {return token::PERIODS;} cutoff {return token::CUTOFF;} markowitz {return token::MARKOWITZ;} -model_comparison_approximation {return token::MODEL_COMPARISON;} +marginal_density {return token::MARGINAL_DENSITY;} laplace {return token::LAPLACE;} modifiedharmonicmean {return token::MODIFIEDHARMONICMEAN;} constant {return token::CONSTANT;} noconstant {return token::NOCONSTANT;} covar {return token::COVAR;} -filename {return token::FILENAME;} +filename {return token::FILENAME_KEYWORD;} diffuse_filter {return token::DIFFUSE_FILTER;} bvar_prior_tau { return token::BVAR_PRIOR_TAU; } @@ -380,6 +380,11 @@ int sigma_e = 0; return token::INT_NUMBER; } +[A-Za-z0-9_/:\\\.]+ { + yylval->string_val = new string(yytext); + return token::FILENAME; +} + /* an instruction starting with a recognized symbol (which is not a modfile local variable) is passed as NAME, otherwise it is a native statement until the end of the line diff --git a/include/ComputingTasks.hh b/include/ComputingTasks.hh index 1d5a749b..04426a1f 100644 --- a/include/ComputingTasks.hh +++ b/include/ComputingTasks.hh @@ -292,7 +292,7 @@ public: class ModelComparisonStatement : public Statement { public: - typedef map > filename_list_type; + typedef map filename_list_type; private: filename_list_type filename_list; OptionsList options_list;