Skip to content
Snippets Groups Projects
Commit e1fbb2c5 authored by Sébastien Villemot's avatar Sébastien Villemot
Browse files

Move check on variables types within 'shocks' block to the checking pass stage

Closes #448
parent 5b87c7ca
Branches
Tags
No related merge requests found
......@@ -644,10 +644,6 @@ ParsingDriver::add_stderr_shock(string *var, expr_t value)
check_symbol_existence(*var);
int symb_id = mod_file->symbol_table.getID(*var);
SymbolType type = mod_file->symbol_table.getType(symb_id);
if (type != eExogenous && !mod_file->symbol_table.isObservedVariable(symb_id))
error("shocks: standard error can only be specified for exogenous or observed endogenous variables");
if (var_shocks.find(symb_id) != var_shocks.end()
|| std_shocks.find(symb_id) != std_shocks.end())
error("shocks: variance or stderr of shock on " + *var + " declared twice");
......@@ -663,10 +659,6 @@ ParsingDriver::add_var_shock(string *var, expr_t value)
check_symbol_existence(*var);
int symb_id = mod_file->symbol_table.getID(*var);
SymbolType type = mod_file->symbol_table.getType(symb_id);
if (type != eExogenous && !mod_file->symbol_table.isObservedVariable(symb_id))
error("shocks: variance can only be specified for exogenous or observed endogenous variables");
if (var_shocks.find(symb_id) != var_shocks.end()
|| std_shocks.find(symb_id) != std_shocks.end())
error("shocks: variance or stderr of shock on " + *var + " declared twice");
......@@ -684,12 +676,6 @@ ParsingDriver::add_covar_shock(string *var1, string *var2, expr_t value)
int symb_id1 = mod_file->symbol_table.getID(*var1);
int symb_id2 = mod_file->symbol_table.getID(*var2);
SymbolType type1 = mod_file->symbol_table.getType(symb_id1);
SymbolType type2 = mod_file->symbol_table.getType(symb_id2);
if (!((type1 == eExogenous && type2 == eExogenous)
|| (mod_file->symbol_table.isObservedVariable(symb_id1) && mod_file->symbol_table.isObservedVariable(symb_id2))))
error("shocks: covariance can only be specified for exogenous or observed endogenous variables of same type");
pair<int, int> key(symb_id1, symb_id2), key_inv(symb_id2, symb_id1);
if (covar_shocks.find(key) != covar_shocks.end()
......@@ -713,12 +699,6 @@ ParsingDriver::add_correl_shock(string *var1, string *var2, expr_t value)
int symb_id1 = mod_file->symbol_table.getID(*var1);
int symb_id2 = mod_file->symbol_table.getID(*var2);
SymbolType type1 = mod_file->symbol_table.getType(symb_id1);
SymbolType type2 = mod_file->symbol_table.getType(symb_id2);
if (!((type1 == eExogenous && type2 == eExogenous)
|| (mod_file->symbol_table.isObservedVariable(symb_id1) && mod_file->symbol_table.isObservedVariable(symb_id2))))
error("shocks: correlation can only be specified for exogenous or observed endogenous variables of same type");
pair<int, int> key(symb_id1, symb_id2), key_inv(symb_id2, symb_id1);
if (covar_shocks.find(key) != covar_shocks.end()
......
......@@ -198,29 +198,84 @@ ShocksStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidati
// Workaround for trac ticket #35
mod_file_struct.shocks_present_but_simul_not_yet = true;
// Determine if there is a calibrated measurement error
/* Error out if variables are not of the right type. This must be done here
and not at parsing time (see #448).
Also Determine if there is a calibrated measurement error */
for (var_and_std_shocks_t::const_iterator it = var_shocks.begin();
it != var_shocks.end(); it++)
{
if (symbol_table.getType(it->first) != eExogenous
&& !symbol_table.isObservedVariable(it->first))
{
cerr << "shocks: setting a variance on '"
<< symbol_table.getName(it->first) << "' is not allowed, because it is neither an exogenous variable nor an observed endogenous variable" << endl;
exit(EXIT_FAILURE);
}
if (symbol_table.isObservedVariable(it->first))
mod_file_struct.calibrated_measurement_errors = true;
}
for (var_and_std_shocks_t::const_iterator it = std_shocks.begin();
it != std_shocks.end(); it++)
{
if (symbol_table.getType(it->first) != eExogenous
&& !symbol_table.isObservedVariable(it->first))
{
cerr << "shocks: setting a standard error on '"
<< symbol_table.getName(it->first) << "' is not allowed, because it is neither an exogenous variable nor an observed endogenous variable" << endl;
exit(EXIT_FAILURE);
}
if (symbol_table.isObservedVariable(it->first))
mod_file_struct.calibrated_measurement_errors = true;
}
for (covar_and_corr_shocks_t::const_iterator it = covar_shocks.begin();
it != covar_shocks.end(); it++)
if (symbol_table.isObservedVariable(it->first.first)
|| symbol_table.isObservedVariable(it->first.second))
{
int symb_id1 = it->first.first;
int symb_id2 = it->first.second;
if (!((symbol_table.getType(symb_id1) == eExogenous
&& symbol_table.getType(symb_id2) == eExogenous)
|| (symbol_table.isObservedVariable(symb_id1)
&& symbol_table.isObservedVariable(symb_id2))))
{
cerr << "shocks: setting a covariance between '"
<< symbol_table.getName(symb_id1) << "' and '"
<< symbol_table.getName(symb_id2) << "'is not allowed; covariances can only be specified for exogenous or observed endogenous variables of same type" << endl;
exit(EXIT_FAILURE);
}
if (symbol_table.isObservedVariable(symb_id1)
|| symbol_table.isObservedVariable(symb_id2))
mod_file_struct.calibrated_measurement_errors = true;
}
for (covar_and_corr_shocks_t::const_iterator it = corr_shocks.begin();
it != corr_shocks.end(); it++)
{
int symb_id1 = it->first.first;
int symb_id2 = it->first.second;
if (!((symbol_table.getType(symb_id1) == eExogenous
&& symbol_table.getType(symb_id2) == eExogenous)
|| (symbol_table.isObservedVariable(symb_id1)
&& symbol_table.isObservedVariable(symb_id2))))
{
cerr << "shocks: setting a correlation between '"
<< symbol_table.getName(symb_id1) << "' and '"
<< symbol_table.getName(symb_id2) << "'is not allowed; correlations can only be specified for exogenous or observed endogenous variables of same type" << endl;
exit(EXIT_FAILURE);
}
if (symbol_table.isObservedVariable(it->first.first)
|| symbol_table.isObservedVariable(it->first.second))
mod_file_struct.calibrated_measurement_errors = true;
}
}
MShocksStatement::MShocksStatement(const det_shocks_t &det_shocks_arg,
const SymbolTable &symbol_table_arg) :
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment