Method of moments: Preprocessor preparations

issue#70
Johannes Pfeifer 2020-07-08 18:42:14 +02:00
parent 5b80a4db59
commit 98ddbb61ba
11 changed files with 242 additions and 247 deletions

View File

@ -4883,15 +4883,15 @@ Smoother2histvalStatement::writeJsonOutput(ostream &output) const
output << "}";
}
GMMEstimationStatement::GMMEstimationStatement(SymbolList symbol_list_arg,
OptionsList options_list_arg) :
MethodOfMomentsStatement::MethodOfMomentsStatement(SymbolList symbol_list_arg,
OptionsList options_list_arg) :
symbol_list{move(symbol_list_arg)},
options_list{move(options_list_arg)}
{
}
void
GMMEstimationStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
MethodOfMomentsStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
{
try
{
@ -4899,24 +4899,48 @@ GMMEstimationStatement::checkPass(ModFileStructure &mod_file_struct, WarningCons
}
catch (SymbolList::SymbolListException &e)
{
cerr << "ERROR: gmm_estimation: " << e.message << endl;
cerr << "ERROR: method_of_moments: " << e.message << endl;
exit(EXIT_FAILURE);
}
mod_file_struct.mom_estimation_present = true;
// Fill in option_order of mod_file_struct
if (auto it = options_list.num_options.find("order");
it != options_list.num_options.end())
{
int order = stoi(it->second);
if (order > 2)
mod_file_struct.k_order_solver = true;
mod_file_struct.order_option = max(mod_file_struct.order_option, order);
}
if (options_list.string_options.find("datafile") == options_list.string_options.end())
{
cerr << "ERROR: The method_of_moments statement requires a data file to be supplied via the datafile option." << endl;
exit(EXIT_FAILURE);
}
if (options_list.string_options.find("mom.mom_method") == options_list.string_options.end())
{
cerr << "ERROR: The method_of_moments statement requires a method to be supplied via the mom_method option. Possible values are GMM or SMM." << endl;
exit(EXIT_FAILURE);
}
}
void
GMMEstimationStatement::writeOutput(ostream &output, const string &basename, bool minimal_workspace) const
MethodOfMomentsStatement::writeOutput(ostream &output, const string &basename, bool minimal_workspace) const
{
symbol_list.writeOutput("var_list_", output);
options_list.writeOutput(output);
output << "[M_, oo_, estim_params_, bayestopt_, dataset_, dataset_info] = "
<< "GMM_SMM_estimation_core(var_list_, M_, options_, oo_, estim_params_, bayestopt_, dataset_, dataset_info, 'GMM');" << endl;
options_list.writeOutput(output, "options_mom_");
output << "[oo_, options_mom_, M_] = method_of_moments(bayestopt_, options_, oo_, estim_params_, M_, matched_moments_, options_mom_);" << endl;
}
void
GMMEstimationStatement::writeJsonOutput(ostream &output) const
MethodOfMomentsStatement::writeJsonOutput(ostream &output) const
{
output << R"({"statementName": "gmm_estimation")";
output << R"({"statementName": "method_of_moments")";
if (options_list.getNumberOfOptions())
{
output << ", ";
@ -4930,52 +4954,6 @@ GMMEstimationStatement::writeJsonOutput(ostream &output) const
output << "}";
}
SMMEstimationStatement::SMMEstimationStatement(SymbolList symbol_list_arg,
OptionsList options_list_arg) :
symbol_list{move(symbol_list_arg)},
options_list{move(options_list_arg)}
{
}
void
SMMEstimationStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
{
try
{
symbol_list.checkPass(warnings, { SymbolType::endogenous });
}
catch (SymbolList::SymbolListException &e)
{
cerr << "ERROR: smm_estimation: " << e.message << endl;
exit(EXIT_FAILURE);
}
}
void
SMMEstimationStatement::writeOutput(ostream &output, const string &basename, bool minimal_workspace) const
{
symbol_list.writeOutput("var_list_", output);
options_list.writeOutput(output);
output << "[M_, oo_, estim_params_, bayestopt_, dataset_, dataset_info] = "
<< "GMM_SMM_estimation_core(var_list_, M_, options_, oo_, estim_params_, bayestopt_, dataset_, dataset_info, 'SMM');" << endl;
}
void
SMMEstimationStatement::writeJsonOutput(ostream &output) const
{
output << R"({"statementName": "smm_estimation")";
if (options_list.getNumberOfOptions())
{
output << ", ";
options_list.writeJsonOutput(output);
}
if (!symbol_list.empty())
{
output << ", ";
symbol_list.writeJsonOutput(output);
}
output << "}";
}
GenerateIRFsStatement::GenerateIRFsStatement(OptionsList options_list_arg,
vector<string> generate_irf_names_arg,

View File

@ -1144,25 +1144,13 @@ public:
void writeJsonOutput(ostream &output) const override;
};
class GMMEstimationStatement : public Statement
class MethodOfMomentsStatement : public Statement
{
private:
private:
const SymbolList symbol_list;
const OptionsList options_list;
public:
GMMEstimationStatement(SymbolList symbol_list_arg, OptionsList options_list_arg);
void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
void writeJsonOutput(ostream &output) const override;
};
class SMMEstimationStatement : public Statement
{
private:
const SymbolList symbol_list;
const OptionsList options_list;
public:
SMMEstimationStatement(SymbolList symbol_list_arg, OptionsList options_list_arg);
MethodOfMomentsStatement(SymbolList symbol_list_arg, OptionsList options_list_arg);
void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
void writeJsonOutput(ostream &output) const override;

View File

@ -94,7 +94,7 @@ class ParsingDriver;
%token INV_GAMMA_PDF INV_GAMMA1_PDF INV_GAMMA2_PDF IRF IRF_SHOCKS IRF_PLOT_THRESHOLD IRF_CALIBRATION
%token FAST_KALMAN_FILTER KALMAN_ALGO KALMAN_TOL DIFFUSE_KALMAN_TOL SUBSAMPLES OPTIONS TOLF TOLX PLOT_INIT_DATE PLOT_END_DATE
%token LAPLACE LIK_ALGO LIK_INIT LINEAR LINEAR_DECOMPOSITION LOAD_IDENT_FILES LOAD_MH_FILE LOAD_RESULTS_AFTER_LOAD_MH LOAD_PARAMS_AND_STEADY_STATE LOGLINEAR LOGDATA LYAPUNOV LINEAR_APPROXIMATION
%token LYAPUNOV_FIXED_POINT_TOL LYAPUNOV_DOUBLING_TOL LOG_DEFLATOR LOG_TREND_VAR LOG_GROWTH_FACTOR MARKOWITZ MARGINAL_DENSITY MAX MAXIT
%token LYAPUNOV_COMPLEX_THRESHOLD LYAPUNOV_FIXED_POINT_TOL LYAPUNOV_DOUBLING_TOL LOG_DEFLATOR LOG_TREND_VAR LOG_GROWTH_FACTOR MARKOWITZ MARGINAL_DENSITY MAX MAXIT
%token MFS MH_CONF_SIG MH_DROP MH_INIT_SCALE MH_JSCALE MH_TUNE_JSCALE MH_TUNE_GUESS MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER POSTERIOR_MAX_SUBSAMPLE_DRAWS MIN MINIMAL_SOLVING_PERIODS
%token MODE_CHECK MODE_CHECK_NEIGHBOURHOOD_SIZE MODE_CHECK_SYMMETRIC_PLOTS MODE_CHECK_NUMBER_OF_POINTS MODE_COMPUTE MODE_FILE MODEL MODEL_COMPARISON MODEL_INFO MSHOCKS ABS SIGN
%token MODEL_DIAGNOSTICS MODIFIEDHARMONICMEAN MOMENTS_VARENDO CONTEMPORANEOUS_CORRELATION DIFFUSE_FILTER SUB_DRAWS TAPER_STEPS GEWEKE_INTERVAL RAFTERY_LEWIS_QRS RAFTERY_LEWIS_DIAGNOSTICS MCMC_JUMPING_COVARIANCE MOMENT_CALIBRATION
@ -140,7 +140,7 @@ class ParsingDriver;
%token VLISTLOG VLISTPER SPECTRAL_DENSITY INIT2SHOCKS
%token RESTRICTION RESTRICTION_FNAME CROSS_RESTRICTIONS NLAGS CONTEMP_REDUCED_FORM REAL_PSEUDO_FORECAST
%token DUMMY_OBS NSTATES INDXSCALESSTATES NO_BAYESIAN_PRIOR SPECIFICATION SIMS_ZHA
%token <string> ALPHA BETA ABAND NINV CMS NCMS CNUM GAMMA INV_GAMMA INV_GAMMA1 INV_GAMMA2 NORMAL UNIFORM EPS PDF FIG DR NONE PRIOR PRIOR_VARIANCE HESSIAN IDENTITY_MATRIX DIRICHLET DIAGONAL OPTIMAL
%token <string> ALPHA BETA ABAND NINV CMS NCMS CNUM GAMMA INV_GAMMA INV_GAMMA1 INV_GAMMA2 NORMAL UNIFORM EPS PDF FIG DR NONE PRIOR PRIOR_VARIANCE HESSIAN IDENTITY_MATRIX DIRICHLET DIAGONAL OPTIMAL GMM SMM
%token GSIG2_LMDM Q_DIAG FLAT_PRIOR NCSK NSTD WEIBULL WEIBULL_PDF
%token INDXPARR INDXOVR INDXAP APBAND INDXIMF INDXFORE FOREBAND INDXGFOREHAT INDXGIMFHAT
%token INDXESTIMA INDXGDLS EQ_MS FILTER_COVARIANCE FILTER_DECOMPOSITION SMOOTHED_STATE_UNCERTAINTY
@ -157,15 +157,18 @@ class ParsingDriver;
%token SHOCK_DRAWS FREE_PARAMETERS MEDIAN DATA_OBS_NBR NEIGHBORHOOD_WIDTH PVALUE_KS PVALUE_CORR
%token FILTERED_PROBABILITIES REAL_TIME_SMOOTHED PRIOR_FUNCTION POSTERIOR_FUNCTION SAMPLING_DRAWS
%token PROPOSAL_TYPE PROPOSAL_UPPER_BOUND PROPOSAL_LOWER_BOUND PROPOSAL_DRAWS USE_MEAN_CENTER
%token ADAPTIVE_MH_DRAWS THINNING_FACTOR COEFFICIENTS_PRIOR_HYPERPARAMETERS SMM_ESTIMATION GMM_ESTIMATION
%token ADAPTIVE_MH_DRAWS THINNING_FACTOR COEFFICIENTS_PRIOR_HYPERPARAMETERS
%token CONVERGENCE_STARTING_VALUE CONVERGENCE_ENDING_VALUE CONVERGENCE_INCREMENT_VALUE
%token MAX_ITERATIONS_STARTING_VALUE MAX_ITERATIONS_INCREMENT_VALUE MAX_BLOCK_ITERATIONS
%token MAX_REPEATED_OPTIMIZATION_RUNS FUNCTION_CONVERGENCE_CRITERION SAVE_REALTIME
%token PARAMETER_CONVERGENCE_CRITERION NUMBER_OF_LARGE_PERTURBATIONS NUMBER_OF_SMALL_PERTURBATIONS
%token NUMBER_OF_POSTERIOR_DRAWS_AFTER_PERTURBATION MAX_NUMBER_OF_STAGES
%token RANDOM_FUNCTION_CONVERGENCE_CRITERION RANDOM_PARAMETER_CONVERGENCE_CRITERION
%token CENTERED_MOMENTS AUTOLAG RECURSIVE_ORDER_ESTIMATION BARTLETT_KERNEL_LAG WEIGHTING_MATRIX PENALIZED_ESTIMATOR VERBOSE
%token SIMULATION_MULTIPLE SEED BOUNDED_SHOCK_SUPPORT EQTAGS STEADY_STATE_GROWTH
/* Method of Moments */
%token METHOD_OF_MOMENTS MOM_METHOD
%token BARTLETT_KERNEL_LAG WEIGHTING_MATRIX WEIGHTING_MATRIX_SCALING_FACTOR PENALIZED_ESTIMATOR VERBOSE
%token SIMULATION_MULTIPLE MOM_SEED SEED BOUNDED_SHOCK_SUPPORT ADDITIONAL_OPTIMIZER_STEPS MOM_SE_TOLX SE_TOLX MOM_BURNIN BURNIN
%token EQTAGS STEADY_STATE_GROWTH
%token ANALYTICAL_GIRF IRF_IN_PERCENT EMAS_GIRF EMAS_DROP EMAS_TOLF EMAS_MAX_ITER
%token NO_IDENTIFICATION_STRENGTH NO_IDENTIFICATION_REDUCEDFORM NO_IDENTIFICATION_MOMENTS
%token NO_IDENTIFICATION_MINIMAL NO_IDENTIFICATION_SPECTRUM NORMALIZE_JACOBIANS GRID_NBR
@ -307,8 +310,7 @@ statement : parameters
| perfect_foresight_solver
| prior_function
| posterior_function
| gmm_estimation
| smm_estimation
| method_of_moments
| shock_groups
| init2shocks
| det_cond_forecast
@ -1341,99 +1343,69 @@ perfect_foresight_solver_options : o_stack_solve_algo
| o_print
;
gmm_smm_common_option : o_datafile
| o_nobs
| o_first_obs
| o_optim
| o_mode_file
| o_mode_compute
| o_prior_trunc
| o_loglinear
| o_logdata
| o_relative_irf
| o_irf
| o_tex
| o_xls_sheet
| o_xls_range
| o_solve_algo
| o_plot_priors
| o_aim_solver
| o_selected_variables_only
| o_irf_shocks
| o_sylvester
| o_sylvester_fixed_point_tol
| o_lyapunov
| o_lyapunov_fixed_point_tol
| o_lyapunov_doubling_tol
| o_dr
| o_dr_cycle_reduction_tol
| o_dr_logarithmic_reduction_tol
| o_dr_logarithmic_reduction_maxiter
| o_qz_zero_threshold
| o_irf_plot_threshold
| o_consider_all_endogenous
| o_consider_only_observed
| o_dirname
| o_huge_number
| o_silent_optimizer
| o_nograph
| o_nodisplay
| o_graph_format
| o_analytical_girf
| o_irf_in_percent
| o_emas_girf
| o_emas_drop
| o_emas_tolf
| o_emas_max_iter
| o_stderr_multiples
| o_diagonal_only
;
method_of_moments : METHOD_OF_MOMENTS ';'
{ driver.method_of_moments(); }
| METHOD_OF_MOMENTS '(' method_of_moments_options_list ')' ';'
{ driver.method_of_moments(); }
| METHOD_OF_MOMENTS '(' method_of_moments_options_list ')' symbol_list ';'
{ driver.method_of_moments(); }
gmm_estimation : GMM_ESTIMATION '(' gmm_estimation_options_list ')' ';'
{ driver.gmm_estimation(); }
| GMM_ESTIMATION '(' gmm_estimation_options_list ')' symbol_list ';'
{ driver.gmm_estimation(); }
;
method_of_moments_options_list : method_of_moments_option COMMA method_of_moments_options_list
| method_of_moments_option
;
gmm_estimation_options_list : gmm_estimation_option COMMA gmm_estimation_options_list
| gmm_estimation_option
;
gmm_estimation_option : gmm_smm_common_option
| o_gmm_order
| o_gmm_centered_moments
| o_gmm_autolag
| o_gmm_recursive_order_estimation
| o_gmm_bartlett_kernel_lag
| o_gmm_weighting_matrix
| o_gmm_penalized_estimator
| o_gmm_verbose
;
smm_estimation : SMM_ESTIMATION '(' smm_estimation_options_list ')' ';'
{ driver.smm_estimation(); }
| SMM_ESTIMATION '(' smm_estimation_options_list ')' symbol_list ';'
{ driver.smm_estimation(); }
;
smm_estimation_options_list : smm_estimation_option COMMA smm_estimation_options_list
| smm_estimation_option
;
smm_estimation_option : gmm_smm_common_option
| o_smm_order
| o_smm_centered_moments
| o_smm_autolag
| o_smm_recursive_order_estimation
| o_smm_bartlett_kernel_lag
| o_smm_weighting_matrix
| o_smm_penalized_estimator
| o_smm_verbose
| o_smm_simulation_multiple
| o_smm_drop
| o_smm_seed
| o_smm_bounded_shock_support
;
method_of_moments_option : o_mom_method
| o_datafile
| o_bartlett_kernel_lag
| o_order
| o_penalized_estimator
| o_pruning
| o_verbose
| o_weighting_matrix
| o_weighting_matrix_scaling_factor
| o_additional_optimizer_steps
| o_prefilter
| o_bounded_shock_support
| o_mom_seed
| o_simulation_multiple
| o_mom_burnin
| o_dirname
| o_graph_format
| o_nodisplay
| o_nograph
| o_noprint
| o_plot_priors
| o_prior_trunc
| o_tex
| o_first_obs
| o_logdata
| o_nobs
| o_xls_sheet
| o_xls_range
| o_huge_number
| o_mode_compute
| o_optim
| o_silent_optimizer
| o_mom_se_tolx
| o_aim_solver
| o_dr
| o_dr_cycle_reduction_tol
| o_dr_logarithmic_reduction_tol
| o_dr_logarithmic_reduction_maxiter
| o_k_order_solver
| o_lyapunov
| o_lyapunov_complex_threshold
| o_lyapunov_fixed_point_tol
| o_lyapunov_doubling_tol
| o_sylvester
| o_sylvester_fixed_point_tol
| o_qz_criterium
| o_qz_zero_threshold
| o_mode_check
| o_mode_check_neighbourhood_size
| o_mode_check_symmetric_plots
| o_mode_check_number_of_points
;
prior_function : PRIOR_FUNCTION '(' prior_posterior_function_options_list ')' ';'
{ driver.prior_posterior_function(true); }
@ -3444,6 +3416,7 @@ o_lyapunov : LYAPUNOV EQUAL FIXED_POINT {driver.option_num("lyapunov_fp", "true"
| LYAPUNOV EQUAL DOUBLING {driver.option_num("lyapunov_db", "true"); }
| LYAPUNOV EQUAL SQUARE_ROOT_SOLVER {driver.option_num("lyapunov_srs", "true"); }
| LYAPUNOV EQUAL DEFAULT {driver.option_num("lyapunov_fp", "false"); driver.option_num("lyapunov_db", "false"); driver.option_num("lyapunov_srs", "false");};
o_lyapunov_complex_threshold : LYAPUNOV_COMPLEX_THRESHOLD EQUAL non_negative_number {driver.option_num("lyapunov_complex_threshold",$3);};
o_lyapunov_fixed_point_tol : LYAPUNOV_FIXED_POINT_TOL EQUAL non_negative_number {driver.option_num("lyapunov_fixed_point_tol",$3);};
o_lyapunov_doubling_tol : LYAPUNOV_DOUBLING_TOL EQUAL non_negative_number {driver.option_num("lyapunov_doubling_tol",$3);};
o_dr : DR EQUAL CYCLE_REDUCTION {driver.option_num("dr_cycle_reduction", "true"); }
@ -3800,51 +3773,28 @@ o_use_shock_groups : USE_SHOCK_GROUPS { driver.option_str("plot_shock_decomp.use
o_colormap : COLORMAP EQUAL symbol { driver.option_num("plot_shock_decomp.colormap",$3); };
o_icd_colormap : COLORMAP EQUAL symbol { driver.option_num("initial_condition_decomp.colormap",$3); };
o_gmm_order : ORDER EQUAL INT_NUMBER { driver.option_num("gmm.order", $3); };
o_smm_order : ORDER EQUAL INT_NUMBER { driver.option_num("smm.order", $3); };
o_gmm_centered_moments : CENTERED_MOMENTS { driver.option_num("gmm.centered_moments", "true"); };
o_smm_centered_moments : CENTERED_MOMENTS { driver.option_num("smm.centered_moments", "true"); };
o_gmm_autolag : AUTOLAG EQUAL vec_int
{ driver.option_vec_int("gmm.autolag", $3); }
| AUTOLAG EQUAL vec_int_number
{ driver.option_vec_int("gmm.autolag", $3); }
;
o_smm_autolag : AUTOLAG EQUAL vec_int
{ driver.option_vec_int("smm.autolag", $3); }
| AUTOLAG EQUAL vec_int_number
{ driver.option_vec_int("smm.autolag", $3); }
;
o_gmm_recursive_order_estimation : RECURSIVE_ORDER_ESTIMATION { driver.option_num("gmm.recursive_estimation", "true"); };
o_smm_recursive_order_estimation : RECURSIVE_ORDER_ESTIMATION { driver.option_num("smm.recursive_estimation", "true"); };
o_gmm_bartlett_kernel_lag : BARTLETT_KERNEL_LAG EQUAL INT_NUMBER { driver.option_num("gmm.qLag", $3); };
o_smm_bartlett_kernel_lag : BARTLETT_KERNEL_LAG EQUAL INT_NUMBER { driver.option_num("smm.qLag", $3); };
o_gmm_weighting_matrix : WEIGHTING_MATRIX EQUAL OPTIMAL
{ driver.option_str("gmm.weighting_matrix", $3); }
| WEIGHTING_MATRIX EQUAL IDENTITY_MATRIX
{ driver.option_str("gmm.weighting_matrix", $3); }
| WEIGHTING_MATRIX EQUAL DIAGONAL
{ driver.option_str("gmm.weighting_matrix", $3); }
| WEIGHTING_MATRIX EQUAL filename
{ driver.option_str("gmm.weighting_matrix", $3); }
;
o_smm_weighting_matrix : WEIGHTING_MATRIX EQUAL OPTIMAL
{ driver.option_str("smm.weighting_matrix", $3); }
| WEIGHTING_MATRIX EQUAL IDENTITY_MATRIX
{ driver.option_str("smm.weighting_matrix", $3); }
| WEIGHTING_MATRIX EQUAL DIAGONAL
{ driver.option_str("smm.weighting_matrix", $3); }
| WEIGHTING_MATRIX EQUAL filename
{ driver.option_str("smm.weighting_matrix", $3); }
;
o_gmm_penalized_estimator : PENALIZED_ESTIMATOR { driver.option_num("gmm.penalized_estimator", "true"); };
o_smm_penalized_estimator : PENALIZED_ESTIMATOR { driver.option_num("smm.penalized_estimator", "true"); };
o_gmm_verbose : VERBOSE { driver.option_num("gmm.verbose", "true"); };
o_smm_verbose : VERBOSE { driver.option_num("smm.verbose", "true"); };
// Some options to "method_of_moments"
o_bartlett_kernel_lag : BARTLETT_KERNEL_LAG EQUAL INT_NUMBER { driver.option_num("mom.bartlett_kernel_lag", $3); };
o_smm_simulation_multiple : SIMULATION_MULTIPLE EQUAL INT_NUMBER { driver.option_num("smm.simulation_multiple", $3); };
o_smm_drop : DROP EQUAL INT_NUMBER { driver.option_num("smm.drop", $3); };
o_smm_seed : SEED EQUAL INT_NUMBER { driver.option_num("smm.seed", $3); };
o_smm_bounded_shock_support : BOUNDED_SHOCK_SUPPORT { driver.option_num("smm.bounded_support", "true"); };
o_weighting_matrix : WEIGHTING_MATRIX EQUAL vec_str { driver.option_vec_cellstr("mom.weighting_matrix", $3); }
o_weighting_matrix_scaling_factor : WEIGHTING_MATRIX_SCALING_FACTOR EQUAL non_negative_number { driver.option_num("mom.weighting_matrix_scaling_factor", $3); };
o_mom_method : MOM_METHOD EQUAL GMM
{ driver.option_str("mom.mom_method", $3); }
| MOM_METHOD EQUAL SMM
{ driver.option_str("mom.mom_method", $3); }
;
o_penalized_estimator : PENALIZED_ESTIMATOR { driver.option_num("mom.penalized_estimator", "true"); };
o_verbose : VERBOSE { driver.option_num("mom.verbose", "true"); };
o_simulation_multiple : SIMULATION_MULTIPLE EQUAL INT_NUMBER { driver.option_num("mom.simulation_multiple", $3); };
o_mom_burnin : BURNIN EQUAL INT_NUMBER { driver.option_num("mom.burnin", $3); };
o_bounded_shock_support : BOUNDED_SHOCK_SUPPORT { driver.option_num("mom.bounded_shock_support", "true"); };
o_mom_seed : SEED EQUAL INT_NUMBER { driver.option_num("mom.seed", $3); };
o_additional_optimizer_steps : ADDITIONAL_OPTIMIZER_STEPS EQUAL vec_int { driver.option_vec_int("additional_optimizer_steps", $3); };
o_mom_se_tolx : SE_TOLX EQUAL non_negative_number { driver.option_num("mom.se_tolx", $3); };
o_analytical_girf : ANALYTICAL_GIRF { driver.option_num("irf_opt.analytical_GIRF", "true"); };
o_irf_in_percent : IRF_IN_PERCENT { driver.option_num("irf_opt.percent", "true"); };

View File

@ -173,8 +173,7 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4])
<INITIAL>ms_variance_decomposition {BEGIN DYNARE_STATEMENT; return token::MS_VARIANCE_DECOMPOSITION;}
<INITIAL>conditional_forecast {BEGIN DYNARE_STATEMENT; return token::CONDITIONAL_FORECAST;}
<INITIAL>plot_conditional_forecast {BEGIN DYNARE_STATEMENT; return token::PLOT_CONDITIONAL_FORECAST;}
<INITIAL>gmm_estimation {BEGIN DYNARE_STATEMENT; return token::GMM_ESTIMATION;}
<INITIAL>smm_estimation {BEGIN DYNARE_STATEMENT; return token::SMM_ESTIMATION;}
<INITIAL>method_of_moments {BEGIN DYNARE_STATEMENT; return token::METHOD_OF_MOMENTS;}
<INITIAL>markov_switching {BEGIN DYNARE_STATEMENT; return token::MARKOV_SWITCHING;}
<INITIAL>svar {BEGIN DYNARE_STATEMENT; return token::SVAR;}
@ -670,9 +669,7 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4])
<DYNARE_STATEMENT>silent_optimizer {return token::SILENT_OPTIMIZER;}
<DYNARE_STATEMENT>lmmcp {return token::LMMCP;}
<DYNARE_STATEMENT>occbin {return token::OCCBIN;}
<DYNARE_STATEMENT>centered_moments {return token::CENTERED_MOMENTS; }
<DYNARE_STATEMENT>autolag {return token::AUTOLAG; }
<DYNARE_STATEMENT>recursive_order_estimation {return token::RECURSIVE_ORDER_ESTIMATION; }
<DYNARE_STATEMENT>additional_optimizer_steps {return token::ADDITIONAL_OPTIMIZER_STEPS;}
<DYNARE_STATEMENT>bartlett_kernel_lag {return token::BARTLETT_KERNEL_LAG; }
<DYNARE_STATEMENT>optimal {
yylval->build<string>(yytext);
@ -682,11 +679,23 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4])
yylval->build<string>(yytext);
return token::DIAGONAL;
}
<DYNARE_STATEMENT>gmm {
yylval->build<string>(yytext);
return token::GMM;
}
<DYNARE_STATEMENT>smm {
yylval->build<string>(yytext);
return token::SMM;
}
<DYNARE_STATEMENT>weighting_matrix {return token::WEIGHTING_MATRIX; }
<DYNARE_STATEMENT>weighting_matrix_scaling_factor {return token::WEIGHTING_MATRIX_SCALING_FACTOR; }
<DYNARE_STATEMENT>mom_method {return token::MOM_METHOD; }
<DYNARE_STATEMENT>penalized_estimator {return token::PENALIZED_ESTIMATOR; }
<DYNARE_STATEMENT>verbose {return token::VERBOSE; }
<DYNARE_STATEMENT>simulation_multiple {return token::SIMULATION_MULTIPLE; }
<DYNARE_STATEMENT>burnin {return token::BURNIN; }
<DYNARE_STATEMENT>seed {return token::SEED; }
<DYNARE_STATEMENT>se_tolx {return token::SE_TOLX;}
<DYNARE_STATEMENT>bounded_shock_support {return token::BOUNDED_SHOCK_SUPPORT; }
<DYNARE_STATEMENT>analytical_girf {return token::ANALYTICAL_GIRF; }
<DYNARE_STATEMENT>irf_in_percent {return token::IRF_IN_PERCENT; }
@ -755,6 +764,7 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4])
return token::DR;
}
<DYNARE_STATEMENT>sylvester_fixed_point_tol {return token::SYLVESTER_FIXED_POINT_TOL;}
<DYNARE_STATEMENT>lyapunov_complex_threshold {return token::LYAPUNOV_COMPLEX_THRESHOLD;}
<DYNARE_STATEMENT>lyapunov_fixed_point_tol {return token::LYAPUNOV_FIXED_POINT_TOL;}
<DYNARE_STATEMENT>lyapunov_doubling_tol {return token::LYAPUNOV_DOUBLING_TOL;}
<DYNARE_STATEMENT>dr_cycle_reduction_tol {return token::DR_CYCLE_REDUCTION_TOL;}

View File

@ -138,6 +138,7 @@ ModFile::checkPass(bool nostrict, bool stochastic)
|| mod_file_struct.discretionary_policy_present
|| mod_file_struct.calib_smoother_present
|| mod_file_struct.identification_present
|| mod_file_struct.mom_estimation_present
|| mod_file_struct.sensitivity_present
|| stochastic;
@ -619,6 +620,7 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, bool
|| mod_file_struct.discretionary_policy_present
|| mod_file_struct.calib_smoother_present
|| mod_file_struct.identification_present
|| mod_file_struct.mom_estimation_present
|| mod_file_struct.sensitivity_present
|| stochastic)
{
@ -746,7 +748,7 @@ ModFile::computingPass(bool no_tmp_terms, FileOutputType output, int params_deri
if (mod_file_struct.stoch_simul_present
|| mod_file_struct.estimation_present || mod_file_struct.osr_present
|| mod_file_struct.ramsey_model_present || mod_file_struct.identification_present
|| mod_file_struct.calib_smoother_present)
|| mod_file_struct.calib_smoother_present || mod_file_struct.mom_estimation_present)
static_model.set_cutoff_to_zero();
int derivsOrder = 1;
@ -763,7 +765,7 @@ ModFile::computingPass(bool no_tmp_terms, FileOutputType output, int params_deri
|| mod_file_struct.stoch_simul_present
|| mod_file_struct.estimation_present || mod_file_struct.osr_present
|| mod_file_struct.ramsey_model_present || mod_file_struct.identification_present
|| mod_file_struct.calib_smoother_present)
|| mod_file_struct.calib_smoother_present || mod_file_struct.mom_estimation_present)
{
if (mod_file_struct.perfect_foresight_solver_present)
dynamic_model.computingPass(true, 1, 0, global_eval_context, no_tmp_terms, block, use_dll, bytecode, linear_decomposition);
@ -772,7 +774,7 @@ ModFile::computingPass(bool no_tmp_terms, FileOutputType output, int params_deri
if (mod_file_struct.stoch_simul_present
|| mod_file_struct.estimation_present || mod_file_struct.osr_present
|| mod_file_struct.ramsey_model_present || mod_file_struct.identification_present
|| mod_file_struct.calib_smoother_present)
|| mod_file_struct.calib_smoother_present || mod_file_struct.mom_estimation_present)
dynamic_model.set_cutoff_to_zero();
if (mod_file_struct.order_option < 1)
{

View File

@ -1456,6 +1456,19 @@ ParsingDriver::option_vec_str(string name_option, vector<string> opt)
options_list.vector_str_options[move(name_option)] = move(opt);
}
void
ParsingDriver::option_vec_cellstr(string name_option, vector<string> opt)
{
if (options_list.vector_cellstr_options.find(name_option)
!= options_list.vector_cellstr_options.end())
error("option " + name_option + " declared twice");
if (opt.empty())
error("option " + name_option + " was passed an empty vector.");
options_list.vector_cellstr_options[move(name_option)] = move(opt);
}
void
ParsingDriver::linear()
{
@ -3367,17 +3380,9 @@ ParsingDriver::perfect_foresight_solver()
}
void
ParsingDriver::gmm_estimation()
ParsingDriver::method_of_moments()
{
mod_file->addStatement(make_unique<GMMEstimationStatement>(symbol_list, options_list));
symbol_list.clear();
options_list.clear();
}
void
ParsingDriver::smm_estimation()
{
mod_file->addStatement(make_unique<SMMEstimationStatement>(symbol_list, options_list));
mod_file->addStatement(make_unique<MethodOfMomentsStatement>(symbol_list, options_list));
symbol_list.clear();
options_list.clear();
}

View File

@ -506,6 +506,8 @@ public:
void option_vec_int(string name_option, vector<int> opt);
//! Sets an option to a vector of strings
void option_vec_str(string name_option, vector<string> opt);
//! Sets an option to a celll array of strings
void option_vec_cellstr(string name_option, vector<string> opt);
//! Indicates that the model is linear
void linear();
//! Adds a variable to temporary symbol list
@ -907,10 +909,8 @@ public:
void add_VAR_covariance_pair_restriction(const string &name11, const string &name12, const string &name21, const string &name22);
//! Runs VAR estimation process
void run_var_estimation();
//! GMM Estimation statement
void gmm_estimation();
//! SMM Estimation statement
void smm_estimation();
//! Method of Moments estimation statement
void method_of_moments();
//! Add a var_expectation_model statement
void var_expectation_model();
};

View File

@ -1,5 +1,5 @@
/*
* Copyright © 2003-2019 Dynare Team
* Copyright © 2003-2020 Dynare Team
*
* This file is part of Dynare.
*

View File

@ -1,5 +1,5 @@
/*
* Copyright © 2003-2019 Dynare Team
* Copyright © 2003-2020 Dynare Team
*
* This file is part of Dynare.
*

View File

@ -135,6 +135,20 @@ OptionsList::writeOutput(ostream &output) const
else
output << vals.front() << ";" << endl;
}
/* vector_cellstr_options should ideally be merged into vector_str_options
only difference is treatment of vals.size==1, where vector_str_options
does not add quotes and curly brackets, i.e. allows for type conversion of
'2' into the number 2
*/
for (const auto & [name, vals] : vector_cellstr_options)
{
output << "options_." << name << " = {";
for (const auto &viit : vals)
output << "'" << viit << "';";
output << "};" << endl;
}
}
void
@ -194,6 +208,14 @@ OptionsList::writeOutput(ostream &output, const string &option_group) const
else
output << vals.front() << ";" << endl;
}
for (const auto & [name, vals] : vector_cellstr_options)
{
output << option_group << "." << name << " = {";
for (const auto &viit : vals)
output << "'" << viit << "';";
output << "};" << endl;
}
}
void
@ -213,7 +235,9 @@ OptionsList::writeJsonOutput(ostream &output) const
&& string_options.empty()
&& date_options.empty()
&& symbol_list_options.empty()
&& vector_int_options.empty()))
&& vector_int_options.empty()
&& vector_str_options.empty()
&& vector_cellstr_options.empty()))
output << ", ";
}
@ -226,7 +250,9 @@ OptionsList::writeJsonOutput(ostream &output) const
|| !(string_options.empty()
&& date_options.empty()
&& symbol_list_options.empty()
&& vector_int_options.empty()))
&& vector_int_options.empty()
&& vector_str_options.empty()
&& vector_cellstr_options.empty()))
output << ", ";
}
@ -238,7 +264,9 @@ OptionsList::writeJsonOutput(ostream &output) const
if (it != string_options.end()
|| !(date_options.empty()
&& symbol_list_options.empty()
&& vector_int_options.empty()))
&& vector_int_options.empty()
&& vector_str_options.empty()
&& vector_cellstr_options.empty()))
output << ", ";
}
@ -249,7 +277,9 @@ OptionsList::writeJsonOutput(ostream &output) const
++it;
if (it != date_options.end()
|| !(symbol_list_options.empty()
&& vector_int_options.empty()))
&& vector_int_options.empty()
&& vector_str_options.empty()
&& vector_cellstr_options.empty()))
output << ", ";
}
@ -261,7 +291,9 @@ OptionsList::writeJsonOutput(ostream &output) const
output << "}";
++it;
if (it != symbol_list_options.end()
|| !vector_int_options.empty())
|| !(vector_int_options.empty()
&& vector_str_options.empty()
&& vector_cellstr_options.empty()))
output << ", ";
}
@ -276,7 +308,9 @@ OptionsList::writeJsonOutput(ostream &output) const
{
output << *viit;
++viit;
if (viit != it->second.end())
if (viit != it->second.end()
|| !(vector_str_options.empty()
&& vector_cellstr_options.empty()))
output << ", ";
}
}
@ -284,7 +318,9 @@ OptionsList::writeJsonOutput(ostream &output) const
output << it->second.front() << endl;
output << "]";
++it;
if (it != vector_int_options.end())
if (it != vector_int_options.end()
|| !(vector_str_options.empty()
&& vector_cellstr_options.empty()))
output << ", ";
}
@ -299,7 +335,8 @@ OptionsList::writeJsonOutput(ostream &output) const
{
output << R"(")" << *viit << R"(")";
++viit;
if (viit != it->second.end())
if (viit != it->second.end()
|| !(vector_cellstr_options.empty()))
output << ", ";
}
}
@ -307,7 +344,26 @@ OptionsList::writeJsonOutput(ostream &output) const
output << it->second.front() << endl;
output << "]";
++it;
if (it != vector_str_options.end())
if (it != vector_str_options.end()
|| !(vector_cellstr_options.empty()))
output << ", ";
}
for (auto it = vector_cellstr_options.begin();
it != vector_cellstr_options.end();)
{
output << R"(")"<< it->first << R"(": [)";
for (auto viit = it->second.begin();
viit != it->second.end();)
{
output << R"(")" << *viit << R"(")";
++viit;
if (viit != it->second.end())
output << ", ";
}
output << "]";
++it;
if (it != vector_cellstr_options.end())
output << ", ";
}
@ -324,6 +380,7 @@ OptionsList::clear()
symbol_list_options.clear();
vector_int_options.clear();
vector_str_options.clear();
vector_cellstr_options.clear();
}
int
@ -335,5 +392,6 @@ OptionsList::getNumberOfOptions() const
+ date_options.size()
+ symbol_list_options.size()
+ vector_int_options.size()
+ vector_str_options.size();
+ vector_str_options.size()
+ vector_cellstr_options.size();
}

View File

@ -78,6 +78,8 @@ public:
bool partial_information{false};
//! Whether the "k_order_solver" option is used (explictly, or implicitly if order >= 3)
bool k_order_solver{false};
//! Whether an method_of_moments statement is present
bool mom_estimation_present{false};
//! Whether there is a calibrated measurement error
bool calibrated_measurement_errors{false};
//! Whether dsge_prior_weight was initialized as a parameter
@ -197,6 +199,7 @@ public:
using symbol_list_options_t = map<string, SymbolList>;
using vec_int_options_t = map<string, vector<int>>;
using vec_str_options_t = map<string, vector<string >>;
using vec_cellstr_options_t = map<string, vector<string >>;
num_options_t num_options;
paired_num_options_t paired_num_options;
string_options_t string_options;
@ -204,6 +207,7 @@ public:
symbol_list_options_t symbol_list_options;
vec_int_options_t vector_int_options;
vec_str_options_t vector_str_options;
vec_cellstr_options_t vector_cellstr_options;
int getNumberOfOptions() const;
void writeOutput(ostream &output) const;
void writeOutput(ostream &output, const string &option_group) const;