preprocessor: add subsamples statement
parent
f5bfdbb23f
commit
c1e4155001
|
@ -140,14 +140,15 @@ enum BlockSimulationType
|
||||||
/*! Warning: do not to change existing values for 0 to 4: the values matter for homotopy_setup command */
|
/*! Warning: do not to change existing values for 0 to 4: the values matter for homotopy_setup command */
|
||||||
enum SymbolType
|
enum SymbolType
|
||||||
{
|
{
|
||||||
eEndogenous = 0, //!< Endogenous
|
eEndogenous = 0, //!< Endogenous
|
||||||
eExogenous = 1, //!< Exogenous
|
eExogenous = 1, //!< Exogenous
|
||||||
eExogenousDet = 2, //!< Exogenous deterministic
|
eExogenousDet = 2, //!< Exogenous deterministic
|
||||||
eParameter = 4, //!< Parameter
|
eParameter = 4, //!< Parameter
|
||||||
eModelLocalVariable = 10, //!< Local variable whose scope is model (pound expression)
|
eModelLocalVariable = 10, //!< Local variable whose scope is model (pound expression)
|
||||||
eModFileLocalVariable = 11, //!< Local variable whose scope is mod file (model excluded)
|
eModFileLocalVariable = 11, //!< Local variable whose scope is mod file (model excluded)
|
||||||
eExternalFunction = 12, //!< External (user-defined) function
|
eExternalFunction = 12, //!< External (user-defined) function
|
||||||
eTrend = 13 //!< Trend variable
|
eTrend = 13, //!< Trend variable
|
||||||
|
eStatementDeclaredVariable = 14 //!< Local variable assigned within a Statement (see subsample statement for example)
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ExpressionType
|
enum ExpressionType
|
||||||
|
|
|
@ -1522,6 +1522,15 @@ BasicPriorStatement::checkPass(ModFileStructure &mod_file_struct)
|
||||||
cerr << "ERROR: You must pass the shape option to the prior statement." << endl;
|
cerr << "ERROR: You must pass the shape option to the prior statement." << endl;
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
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: PriorStatement::checkPass(1). Should not arrive here. "
|
||||||
|
<< "Please inform Dynare Team." << endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1556,10 +1565,16 @@ BasicPriorStatement::writeVarianceOption(ostream &output, const string &lhs_fiel
|
||||||
void
|
void
|
||||||
BasicPriorStatement::writeOutputHelper(ostream &output, const string &field, const string &lhs_field) const
|
BasicPriorStatement::writeOutputHelper(ostream &output, const string &field, const string &lhs_field) const
|
||||||
{
|
{
|
||||||
OptionsList::num_options_t::const_iterator it = options_list.num_options.find(field);
|
|
||||||
if (it != options_list.num_options.end())
|
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
|
output << "estimation_info" << lhs_field << "(prior_indx)." << field
|
||||||
<< " = " << it->second << ";" << endl;
|
<< " = " << 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 << "(prior_indx)." << field
|
||||||
|
<< " = '" << itd->second << "';" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
PriorStatement::PriorStatement(const string &name_arg,
|
PriorStatement::PriorStatement(const string &name_arg,
|
||||||
|
@ -1592,6 +1607,8 @@ PriorStatement::writeOutput(ostream &output, const string &basename) const
|
||||||
writeOutputHelper(output, "stdev", lhs_field);
|
writeOutputHelper(output, "stdev", lhs_field);
|
||||||
writeOutputHelper(output, "shape", lhs_field);
|
writeOutputHelper(output, "shape", lhs_field);
|
||||||
writeOutputHelper(output, "shift", lhs_field);
|
writeOutputHelper(output, "shift", lhs_field);
|
||||||
|
writeOutputHelper(output, "date1", lhs_field);
|
||||||
|
writeOutputHelper(output, "date2", lhs_field);
|
||||||
writeOutputHelper(output, "domain", lhs_field);
|
writeOutputHelper(output, "domain", lhs_field);
|
||||||
writeOutputHelper(output, "interval", lhs_field);
|
writeOutputHelper(output, "interval", lhs_field);
|
||||||
BasicPriorStatement::writeVarianceOption(output, lhs_field);
|
BasicPriorStatement::writeVarianceOption(output, lhs_field);
|
||||||
|
|
|
@ -105,7 +105,7 @@ class ParsingDriver;
|
||||||
%token <string_val> INT_NUMBER
|
%token <string_val> INT_NUMBER
|
||||||
%token <string_val> DATE_NUMBER
|
%token <string_val> DATE_NUMBER
|
||||||
%token INV_GAMMA_PDF INV_GAMMA1_PDF INV_GAMMA2_PDF IRF IRF_SHOCKS
|
%token INV_GAMMA_PDF INV_GAMMA1_PDF INV_GAMMA2_PDF IRF IRF_SHOCKS
|
||||||
%token KALMAN_ALGO KALMAN_TOL
|
%token KALMAN_ALGO KALMAN_TOL SUBSAMPLES
|
||||||
%token LABELS LAPLACE LIK_ALGO LIK_INIT LINEAR LOAD_IDENT_FILES LOAD_MH_FILE LOAD_PARAMS_AND_STEADY_STATE LOGLINEAR
|
%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 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
|
%token MFS MH_DROP MH_INIT_SCALE MH_JSCALE MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER MIN MINIMAL_SOLVING_PERIODS
|
||||||
|
@ -217,6 +217,7 @@ statement : parameters
|
||||||
| set_time
|
| set_time
|
||||||
| data
|
| data
|
||||||
| prior
|
| prior
|
||||||
|
| subsamples
|
||||||
| varobs
|
| varobs
|
||||||
| observation_trends
|
| observation_trends
|
||||||
| unit_root_vars
|
| unit_root_vars
|
||||||
|
@ -1197,8 +1198,21 @@ data_options : o_file
|
||||||
| o_xls_range
|
| o_xls_range
|
||||||
;
|
;
|
||||||
|
|
||||||
|
subsamples : symbol '.' SUBSAMPLES '(' subsamples_name_list ')' ';'
|
||||||
|
{ driver.set_subsamples($1); }
|
||||||
|
;
|
||||||
|
|
||||||
|
subsamples_name_list : subsamples_name_list COMMA o_subsample_name
|
||||||
|
| o_subsample_name
|
||||||
|
;
|
||||||
|
|
||||||
prior : symbol '.' PRIOR '(' prior_options_list ')' ';'
|
prior : symbol '.' PRIOR '(' prior_options_list ')' ';'
|
||||||
{ driver.set_prior($1); }
|
{ driver.set_prior($1); }
|
||||||
|
| symbol '.' symbol '.' PRIOR '(' prior_options_list ')' ';'
|
||||||
|
{
|
||||||
|
driver.add_subsample_range(new string (*$1), $3);
|
||||||
|
driver.set_prior($1);
|
||||||
|
}
|
||||||
| STD '(' symbol ')' '.' PRIOR '(' prior_options_list ')' ';'
|
| STD '(' symbol ')' '.' PRIOR '(' prior_options_list ')' ';'
|
||||||
{ driver.set_std_prior($3); }
|
{ driver.set_std_prior($3); }
|
||||||
| CORR '(' symbol COMMA symbol')' '.' PRIOR '(' prior_options_list ')' ';'
|
| CORR '(' symbol COMMA symbol')' '.' PRIOR '(' prior_options_list ')' ';'
|
||||||
|
@ -1955,6 +1969,12 @@ o_nograph : NOGRAPH
|
||||||
| GRAPH
|
| GRAPH
|
||||||
{ driver.option_num("nograph", "0"); }
|
{ driver.option_num("nograph", "0"); }
|
||||||
;
|
;
|
||||||
|
o_subsample_name : symbol EQUAL date_number ':' date_number
|
||||||
|
{
|
||||||
|
driver.declare_statement_local_variable(new string (*$1));
|
||||||
|
driver.set_subsample_name_equal_to_date_range($1, $3, $5);
|
||||||
|
}
|
||||||
|
;
|
||||||
o_conf_sig : CONF_SIG EQUAL non_negative_number { driver.option_num("conf_sig", $3); };
|
o_conf_sig : CONF_SIG EQUAL non_negative_number { driver.option_num("conf_sig", $3); };
|
||||||
o_mh_replic : MH_REPLIC EQUAL INT_NUMBER { driver.option_num("mh_replic", $3); };
|
o_mh_replic : MH_REPLIC EQUAL INT_NUMBER { driver.option_num("mh_replic", $3); };
|
||||||
o_mh_drop : MH_DROP EQUAL non_negative_number { driver.option_num("mh_drop", $3); };
|
o_mh_drop : MH_DROP EQUAL non_negative_number { driver.option_num("mh_drop", $3); };
|
||||||
|
|
|
@ -189,6 +189,7 @@ string eofbuff;
|
||||||
/* End of a Dynare block */
|
/* End of a Dynare block */
|
||||||
<DYNARE_BLOCK>end {BEGIN INITIAL; return token::END;}
|
<DYNARE_BLOCK>end {BEGIN INITIAL; return token::END;}
|
||||||
|
|
||||||
|
<DYNARE_STATEMENT>subsamples {return token::SUBSAMPLES;}
|
||||||
<DYNARE_STATEMENT>prior {return token::PRIOR;}
|
<DYNARE_STATEMENT>prior {return token::PRIOR;}
|
||||||
<INITIAL>std {BEGIN DYNARE_STATEMENT; return token::STD;}
|
<INITIAL>std {BEGIN DYNARE_STATEMENT; return token::STD;}
|
||||||
<INITIAL>corr {BEGIN DYNARE_STATEMENT; return token::CORR;}
|
<INITIAL>corr {BEGIN DYNARE_STATEMENT; return token::CORR;}
|
||||||
|
|
|
@ -496,6 +496,7 @@ VariableNode::prepareForDerivation()
|
||||||
non_null_derivatives = datatree.local_variables_table[symb_id]->non_null_derivatives;
|
non_null_derivatives = datatree.local_variables_table[symb_id]->non_null_derivatives;
|
||||||
break;
|
break;
|
||||||
case eModFileLocalVariable:
|
case eModFileLocalVariable:
|
||||||
|
case eStatementDeclaredVariable:
|
||||||
// Such a variable is never derived
|
// Such a variable is never derived
|
||||||
break;
|
break;
|
||||||
case eExternalFunction:
|
case eExternalFunction:
|
||||||
|
@ -523,6 +524,9 @@ VariableNode::computeDerivative(int deriv_id)
|
||||||
case eModFileLocalVariable:
|
case eModFileLocalVariable:
|
||||||
cerr << "ModFileLocalVariable is not derivable" << endl;
|
cerr << "ModFileLocalVariable is not derivable" << endl;
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
case eStatementDeclaredVariable:
|
||||||
|
cerr << "eStatementDeclaredVariable is not derivable" << endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
case eExternalFunction:
|
case eExternalFunction:
|
||||||
cerr << "Impossible case!" << endl;
|
cerr << "Impossible case!" << endl;
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
@ -735,6 +739,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
|
||||||
|
|
||||||
case eExternalFunction:
|
case eExternalFunction:
|
||||||
case eTrend:
|
case eTrend:
|
||||||
|
case eStatementDeclaredVariable:
|
||||||
cerr << "Impossible case" << endl;
|
cerr << "Impossible case" << endl;
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -917,6 +922,9 @@ VariableNode::getChainRuleDerivative(int deriv_id, const map<int, expr_t> &recur
|
||||||
case eModFileLocalVariable:
|
case eModFileLocalVariable:
|
||||||
cerr << "ModFileLocalVariable is not derivable" << endl;
|
cerr << "ModFileLocalVariable is not derivable" << endl;
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
case eStatementDeclaredVariable:
|
||||||
|
cerr << "eStatementDeclaredVariable is not derivable" << endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
case eExternalFunction:
|
case eExternalFunction:
|
||||||
cerr << "Impossible case!" << endl;
|
cerr << "Impossible case!" << endl;
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
|
@ -175,6 +175,16 @@ ParsingDriver::declare_parameter(string *name, string *tex_name)
|
||||||
delete tex_name;
|
delete tex_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ParsingDriver::declare_statement_local_variable(string *name)
|
||||||
|
{
|
||||||
|
if (mod_file->symbol_table.exists(*name))
|
||||||
|
error("Symbol " + *name + " cannot be assigned within a statement " +
|
||||||
|
"while being assigned elsewhere in the modfile");
|
||||||
|
declare_symbol(name, eStatementDeclaredVariable, NULL);
|
||||||
|
delete name;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ParsingDriver::declare_optimal_policy_discount_factor_parameter(expr_t exprnode)
|
ParsingDriver::declare_optimal_policy_discount_factor_parameter(expr_t exprnode)
|
||||||
{
|
{
|
||||||
|
@ -1224,6 +1234,56 @@ ParsingDriver::estimation_data()
|
||||||
options_list.clear();
|
options_list.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ParsingDriver::set_subsamples(string *name)
|
||||||
|
{
|
||||||
|
check_symbol_is_parameter(name);
|
||||||
|
if (subsample_declarations.find(*name) != subsample_declarations.end())
|
||||||
|
error("Parameter " + *name + " has more than one subsample statement." +
|
||||||
|
"You may only have one subsample statement per parameter.");
|
||||||
|
subsample_declarations[*name] = subsample_declaration_map;
|
||||||
|
subsample_declaration_map.clear();
|
||||||
|
delete name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ParsingDriver::check_symbol_is_statement_variable(string *name)
|
||||||
|
{
|
||||||
|
check_symbol_existence(*name);
|
||||||
|
int symb_id = mod_file->symbol_table.getID(*name);
|
||||||
|
if (mod_file->symbol_table.getType(symb_id) != eStatementDeclaredVariable)
|
||||||
|
error(*name + " is not a variable assigned in a statement");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ParsingDriver::set_subsample_name_equal_to_date_range(string *name, string *date1, string *date2)
|
||||||
|
{
|
||||||
|
check_symbol_is_statement_variable(name);
|
||||||
|
if (subsample_declaration_map.find(*name) != subsample_declaration_map.end())
|
||||||
|
error("Symbol " + *name + " may only be assigned once in a SUBSAMPLE statement");
|
||||||
|
subsample_declaration_map[*name] = make_pair(*date1, *date2);
|
||||||
|
delete name;
|
||||||
|
delete date1;
|
||||||
|
delete date2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ParsingDriver::add_subsample_range(string *parameter, string *subsample_name)
|
||||||
|
{
|
||||||
|
check_symbol_is_parameter(parameter);
|
||||||
|
check_symbol_is_statement_variable(subsample_name);
|
||||||
|
subsample_declarations_t::const_iterator it = subsample_declarations.find(*parameter);
|
||||||
|
if (it == subsample_declarations.end())
|
||||||
|
error("A subsample statement has not been issued for " + *parameter);
|
||||||
|
subsample_declaration_map_t tmp_map = it->second;
|
||||||
|
if (tmp_map.find(*subsample_name) == tmp_map.end())
|
||||||
|
error("The subsample name " + *subsample_name + " was not previously declared in a subsample statement.");
|
||||||
|
option_date("date1", tmp_map[*subsample_name].first);
|
||||||
|
option_date("date2", tmp_map[*subsample_name].second);
|
||||||
|
delete parameter;
|
||||||
|
delete subsample_name;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ParsingDriver::set_prior(string *name)
|
ParsingDriver::set_prior(string *name)
|
||||||
{
|
{
|
||||||
|
|
|
@ -84,6 +84,9 @@ private:
|
||||||
//! Checks that a given symbol exists and is a parameter, and stops with an error message if it isn't
|
//! Checks that a given symbol exists and is a parameter, and stops with an error message if it isn't
|
||||||
void check_symbol_is_parameter(string *name);
|
void check_symbol_is_parameter(string *name);
|
||||||
|
|
||||||
|
//! Checks that a given symbol was assigned within a Statement
|
||||||
|
void check_symbol_is_statement_variable(string *name);
|
||||||
|
|
||||||
//! Checks that a given symbol exists and is a endogenous or exogenous, and stops with an error message if it isn't
|
//! Checks that a given symbol exists and is a endogenous or exogenous, and stops with an error message if it isn't
|
||||||
void check_symbol_is_endogenous_or_exogenous(string *name);
|
void check_symbol_is_endogenous_or_exogenous(string *name);
|
||||||
|
|
||||||
|
@ -186,6 +189,12 @@ private:
|
||||||
vector<int> declared_nonstationary_vars;
|
vector<int> declared_nonstationary_vars;
|
||||||
//! Temporary storage for a variance declared in the prior statement
|
//! Temporary storage for a variance declared in the prior statement
|
||||||
expr_t prior_variance;
|
expr_t prior_variance;
|
||||||
|
//! Temporary storage for declaring subsamples: map<statement_local_var, <date1, date2 >
|
||||||
|
typedef map<string, pair<string, string> > subsample_declaration_map_t;
|
||||||
|
subsample_declaration_map_t subsample_declaration_map;
|
||||||
|
//! Temporary storage for subsample statement: map<parameter, subsample_declaration_map >
|
||||||
|
typedef map<string, subsample_declaration_map_t > subsample_declarations_t;
|
||||||
|
subsample_declarations_t subsample_declarations;
|
||||||
//! reset the values for temporary storage
|
//! reset the values for temporary storage
|
||||||
void reset_current_external_function_options();
|
void reset_current_external_function_options();
|
||||||
//! Adds a model lagged variable to ModelTree and VariableTable
|
//! Adds a model lagged variable to ModelTree and VariableTable
|
||||||
|
@ -239,6 +248,14 @@ public:
|
||||||
void declare_exogenous_det(string *name, string *tex_name = NULL);
|
void declare_exogenous_det(string *name, string *tex_name = NULL);
|
||||||
//! Declares a parameter
|
//! Declares a parameter
|
||||||
void declare_parameter(string *name, string *tex_name = NULL);
|
void declare_parameter(string *name, string *tex_name = NULL);
|
||||||
|
//! Declares a statement local variable
|
||||||
|
void declare_statement_local_variable(string *name);
|
||||||
|
//! Completes a subsample statement
|
||||||
|
void set_subsamples(string *name);
|
||||||
|
//! Declares a subsample, assigning the value to name
|
||||||
|
void set_subsample_name_equal_to_date_range(string *name, string *date1, string *date2);
|
||||||
|
//! Adds a subsample range to the list of options for the prior statement
|
||||||
|
void add_subsample_range(string *parameter, string *subsample_name);
|
||||||
//! Declares declare_optimal_policy_discount_factor as a parameter and initializes it to exprnode
|
//! Declares declare_optimal_policy_discount_factor as a parameter and initializes it to exprnode
|
||||||
void declare_optimal_policy_discount_factor_parameter(expr_t exprnode);
|
void declare_optimal_policy_discount_factor_parameter(expr_t exprnode);
|
||||||
//! Adds a predetermined_variable
|
//! Adds a predetermined_variable
|
||||||
|
@ -375,8 +392,6 @@ public:
|
||||||
void set_std_prior(string *arg);
|
void set_std_prior(string *arg);
|
||||||
//! Sets the prior for estimated correlation
|
//! Sets the prior for estimated correlation
|
||||||
void set_corr_prior(string *arg1, string *arg2);
|
void set_corr_prior(string *arg1, string *arg2);
|
||||||
//! Sets the subsamples for a parameter
|
|
||||||
void set_subsamples(string *arg);
|
|
||||||
//! Runs estimation process
|
//! Runs estimation process
|
||||||
void run_estimation();
|
void run_estimation();
|
||||||
//! Runs dynare_sensitivy()
|
//! Runs dynare_sensitivy()
|
||||||
|
|
Loading…
Reference in New Issue