diff --git a/matlab/global_initialization.m b/matlab/global_initialization.m index cb463a8b7e6ced701b6e22b094bceeb4f002f92a..f3d3bd5983e745f5529b09e5f07f26d2f0cdb3b9 100644 --- a/matlab/global_initialization.m +++ b/matlab/global_initialization.m @@ -616,7 +616,6 @@ options_.convergence.geweke.taper_steps=[4 8 15]; options_.convergence.geweke.geweke_interval=[0.2 0.5]; % DMM -options_.multinomial_index = 1; options_.dmm.seed = 0; options_.dmm.thinning_factor = 1; options_.dmm.block_length = 1; @@ -627,6 +626,7 @@ options_.mcmc.drop = 100; options_.mcmc.replic = 1000; options_.calibration = []; +options_.multinomial = []; % initialize persistent variables in priordens() priordens([],[],[],[],[],[],1); diff --git a/matlab/writeDmmNmlFile.m b/matlab/writeDmmNmlFile.m index e9153f5d47c4675d5519f5b4833313385a0c141c..d271c0513f082bfe4592d3a6ce4b883253b8c9a2 100644 --- a/matlab/writeDmmNmlFile.m +++ b/matlab/writeDmmNmlFile.m @@ -41,7 +41,7 @@ fprintf(fid, 'from %s.mod on %d-%d-%d at %d:%d:%d\n', M_.fname, fix(clock)); %% SSM fprintf(fid, '\n&ssm\n'); fprintf(fid, 'nu=%d nv=%d nx=%d d=%d %d dllname=%s check=%s', M_.exo_nbr, ... - size(options_.multinomial_info,2), options_.dmm.nx, ... + size(options_.multinomial, 2), options_.dmm.nx, ... options_.dmm.max_order_of_integration, options_.dmm.num_nonstationary, ... [M_.fname '.dll'], options_.dmm.check_mats); fprintf(fid, '\n&end\n'); @@ -70,11 +70,13 @@ end fprintf(fid, '&end\n'); %% S* -for i=1:size(options_.multinomial_info,2) +for i=1:size(options_.multinomial,2) fprintf(fid, '\n&S%d\n',i); + indx = find(strcmp(estimation_info.transition_probability_index, options_.multinomial(i).probability)); + params = estimation_info.transition_probability(indx).prior.params; fprintf(fid, 'dynS%d=%s nS%d=%d hypS%d(1,1)=%d %d matS%d=%s',i,'I',i, ... - options_.multinomial_info(i).number_of_regimes, i, ... - options_.multinomial_info(i).values,i,'G'); + options_.multinomial(i).number_of_regimes, i, ... + params, i, 'G'); fprintf(fid, '\n&end\n'); end diff --git a/preprocessor/ComputingTasks.cc b/preprocessor/ComputingTasks.cc index dfc871a46ac41f505f500ece8194bad8e4e8d754..46980420e2a1ce8ce5a637cb6f383b6374b3177b 100644 --- a/preprocessor/ComputingTasks.cc +++ b/preprocessor/ComputingTasks.cc @@ -1556,15 +1556,63 @@ MultinomialStatement::MultinomialStatement(const OptionsList &options_list_arg) void MultinomialStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) { + if (options_list.string_options.find("parameter") == options_list.string_options.end()) + { + cerr << "ERROR: The parameter option must be passed to the multinomial statement" << endl; + exit(EXIT_FAILURE); + } + + if (options_list.string_options.find("process") == options_list.string_options.end() && + options_list.num_options.find("process") == options_list.num_options.end()) + { + cerr << "ERROR: The process option must be passed to the multinomial statement" << endl; + exit(EXIT_FAILURE); + } + + if (options_list.num_options.find("number_of_regimes") == options_list.num_options.end()) + { + cerr << "ERROR: The number_of_regimes option must be passed to the multinomial statement" << endl; + exit(EXIT_FAILURE); + } + + if (options_list.symbol_list_options.find("probability") == options_list.symbol_list_options.end()) + { + cerr << "ERROR: The probability option must be passed to the multinomial statement" << endl; + exit(EXIT_FAILURE); + } } void MultinomialStatement::writeOutput(ostream &output, const string &basename) const { - output << "options_.multinomial = set_multinomial_default();" << endl; - options_list.writeOutput(output); - output << "options_.multinomial_info(options_.multinomial_index) = options_.multinomial;" << endl - << "options_.multinomial_index = options_.multinomial_index + 1;" << endl; + string lhs_field = "options_.multinomial(multind)"; + output << "multind = size(options_.multinomial, 2) + 1;" << endl; + writeOutputHelper(output, lhs_field, "process"); + writeOutputHelper(output, lhs_field, "parameter"); + writeOutputHelper(output, lhs_field, "probability"); + writeOutputHelper(output, lhs_field, "number_of_regimes"); +} + +void +MultinomialStatement::writeOutputHelper(ostream &output, const string &lhs_field, const string &field) const +{ + OptionsList::num_options_t::const_iterator itn = options_list.num_options.find(field); + if (itn != options_list.num_options.end()) + { + output << lhs_field << "." << field << " = "<< itn->second << ";" << endl; + return; + } + + OptionsList::string_options_t::const_iterator its = options_list.string_options.find(field); + if (its != options_list.string_options.end()) + { + output << lhs_field << "." << field << " = '"<< its->second << "';" << endl; + return; + } + + OptionsList::symbol_list_options_t::const_iterator itsl = options_list.symbol_list_options.find(field); + if (itsl != options_list.symbol_list_options.end()) + itsl->second.writeOutput(lhs_field + "." + field, output); } TransitionProbPriorStatement::TransitionProbPriorStatement(const string &name_arg, diff --git a/preprocessor/ComputingTasks.hh b/preprocessor/ComputingTasks.hh index 8171f3c407dfb07f7de94187ff6994faf1c42dc1..9814508ba0bef84e8b594134ad250fa6bd0d757d 100644 --- a/preprocessor/ComputingTasks.hh +++ b/preprocessor/ComputingTasks.hh @@ -646,6 +646,7 @@ public: MultinomialStatement(const OptionsList &options_list_arg); virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings); virtual void writeOutput(ostream &output, const string &basename) const; + void writeOutputHelper(ostream &output, const string &lhs_field, const string &field) const; }; class SubsamplesStatement : public Statement diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy index e7ffebc7a574cd7b5acbf05cde1dc9c924dcc022..73070c74d1ce7da41e8466adbd56807470a32a90 100644 --- a/preprocessor/DynareBison.yy +++ b/preprocessor/DynareBison.yy @@ -159,7 +159,7 @@ class ParsingDriver; %token SELECTED_VARIABLES_ONLY COVA_COMPUTE SIMULATION_FILE_TAG FILE_TAG %token NO_ERROR_BANDS ERROR_BAND_PERCENTILES SHOCKS_PER_PARAMETER NO_CREATE_INIT %token SHOCK_DRAWS FREE_PARAMETERS MEDIAN DATA_OBS_NBR NEIGHBORHOOD_WIDTH PVALUE_KS PVALUE_CORR -%token FILTERED_PROBABILITIES REAL_TIME_SMOOTHED +%token FILTERED_PROBABILITIES REAL_TIME_SMOOTHED PARAMETER %token PROPOSAL_TYPE PROPOSAL_UPPER_BOUND PROPOSAL_LOWER_BOUND PROPOSAL_DRAWS USE_MEAN_CENTER %token ADAPTIVE_MH_DRAWS THINNING_FACTOR COEFFICIENTS_PRIOR_HYPERPARAMETERS %token CONVERGENCE_STARTING_VALUE CONVERGENCE_ENDING_VALUE CONVERGENCE_INCREMENT_VALUE @@ -1414,7 +1414,7 @@ calibration_options_list : calibration_options_list COMMA calibration_options | calibration_options ; -calibration_options : o_calibration_process +calibration_options : o_process | o_calibration_regime ; @@ -1604,9 +1604,10 @@ multinomial_options_list : multinomial_options_list COMMA multinomial_options | multinomial_options ; -multinomial_options : o_multinomial_process +multinomial_options : o_process | o_multinomial_number_of_regimes - | o_multinomial_probability + | o_probability + | o_parameter ; estimation : ESTIMATION ';' @@ -2812,16 +2813,13 @@ o_equations : EQUATIONS EQUAL vec_int | EQUATIONS EQUAL vec_int_number { driver.option_vec_int("ms.equations",$3); } ; - -o_multinomial_process : PROCESS EQUAL symbol { driver.option_str("multinomial.process",$3); } - | PROCESS EQUAL INT_NUMBER { driver.option_num("multinomial.process",$3); } - ; -o_multinomial_number_of_regimes : NUMBER_OF_REGIMES EQUAL INT_NUMBER { driver.option_num("multinomial.number_of_regimes",$3); }; -o_multinomial_probability : PROBABILITY EQUAL vec_value - { driver.option_num("multinomial.probability",$3); } - | PROBABILITY EQUAL '[' prob_symbol_list ']' - { driver.option_symbol_list("multinomial.probability"); } - ; +o_multinomial_number_of_regimes : NUMBER_OF_REGIMES EQUAL INT_NUMBER { driver.option_num("number_of_regimes",$3); }; +o_parameter : PARAMETER EQUAL symbol{ driver.option_str("parameter", $3); }; +o_probability : PROBABILITY EQUAL vec_value + { driver.option_num("probability",$3); } + | PROBABILITY EQUAL '[' prob_symbol_list ']' + { driver.option_symbol_list("probability"); } + ; o_instruments : INSTRUMENTS EQUAL '(' symbol_list ')' {driver.option_symbol_list("instruments"); }; o_ext_func_name : EXT_FUNC_NAME EQUAL filename { driver.external_function_option("name", $3); }; @@ -2927,9 +2925,9 @@ o_dmm_simulate_data : SIMULATE_DATA EQUAL symbol { driver.option_str("dmm.simula o_dmm_check_mats : CHECK_MATS EQUAL symbol { driver.option_str("dmm.check_mats", $3); }; o_dmm_calc_marg_lik : CALC_MARG_LIK EQUAL symbol { driver.option_str("dmm.calc_marg_lik", $3); }; o_dmm_block_length : BLOCK_LENGTH EQUAL symbol { driver.option_str("dmm.block_length", $3); }; -o_calibration_process : PROCESS EQUAL symbol { driver.option_str("process",$3); } - | PROCESS EQUAL INT_NUMBER { driver.option_num("process",$3); } - ; +o_process : PROCESS EQUAL symbol { driver.option_str("process",$3); } + | PROCESS EQUAL INT_NUMBER { driver.option_num("process",$3); } + ; o_calibration_regime : REGIME EQUAL INT_NUMBER { driver.option_num("regime",$3); }; o_consider_all_endogenous : CONSIDER_ALL_ENDOGENOUS { driver.option_str("endo_vars_for_moment_computations_in_estimation", "all_endogenous_variables"); }; o_consider_only_observed : CONSIDER_ONLY_OBSERVED { driver.option_str("endo_vars_for_moment_computations_in_estimation", "only_observed_variables"); }; diff --git a/preprocessor/DynareFlex.ll b/preprocessor/DynareFlex.ll index ff394f06284f8cc5a3c0253fc5b9d533ddafe142..035a02036e8b80ab14a9fd2d239adc8b469ee14f 100644 --- a/preprocessor/DynareFlex.ll +++ b/preprocessor/DynareFlex.ll @@ -731,6 +731,7 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2 <DYNARE_STATEMENT>neighborhood_width {return token::NEIGHBORHOOD_WIDTH;} <DYNARE_STATEMENT>pvalue_ks {return token::PVALUE_KS;} <DYNARE_STATEMENT>pvalue_corr {return token::PVALUE_CORR;} +<DYNARE_STATEMENT>parameter {return token::PARAMETER;} /* end of GSA options */ /* For identification() statement */ diff --git a/tests/nile.mod b/tests/nile.mod index dafee68629b3a9f5d2d47e773a0ba44ad77f9882..f5607e9023bb307c34c1c43c6ae98652cd58f5e6 100644 --- a/tests/nile.mod +++ b/tests/nile.mod @@ -3,8 +3,8 @@ varobs y; varexo ee emu; parameters Ve, Vmu, delta, S1, S2; -multinomial( process=A, number_of_regimes=2, probability = [P1]); -multinomial( process=2, number_of_regimes=2, probability = [P2]); +multinomial( process=1, number_of_regimes=2, probability = [P1], parameter = S1); +multinomial( process=2, number_of_regimes=2, probability = [P2], parameter = S2); // probability can be a single object representing a vector with a Dirlichet prior (see below) or a vector of calibrated values //add bernoulli instruction (similar to markov-switching for independent draws) and new options to create bernoulli process // I don' know if probabilities would be a better name than probability (vector being implicit)