remove extra exo’s for shocks statement, nonstationary, and trend vars; fix bugs
parent
5cc4ad033f
commit
81a2a2ee0d
|
@ -3425,6 +3425,60 @@ DynamicModel::writeDynamicFile(const string &basename, bool block, bool bytecode
|
||||||
writeDynamicMFile(t_basename);
|
writeDynamicMFile(t_basename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicModel::reindexTrendSymbolsMap(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table)
|
||||||
|
{
|
||||||
|
map<int, expr_t> orig_trend_symbols_map = trend_symbols_map;
|
||||||
|
trend_symbols_map.clear();
|
||||||
|
for (map<int, expr_t>::const_iterator it = orig_trend_symbols_map.begin();
|
||||||
|
it != orig_trend_symbols_map.end(); it++)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
vector<int> symb_id (1, symbol_table.getID(orig_symbol_table.getName(it->first)));
|
||||||
|
addTrendVariables(symb_id,
|
||||||
|
it->second->cloneDynamicReindex(dynamic_model, orig_symbol_table));
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
cerr << "Error: unused exo in trend symbols." << endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicModel::reindexNonstationarySymbolsMap(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table)
|
||||||
|
{
|
||||||
|
nonstationary_symbols_map_t orig_nonstationary_symbols_map = nonstationary_symbols_map;
|
||||||
|
nonstationary_symbols_map.clear();
|
||||||
|
for (nonstationary_symbols_map_t::const_iterator it = orig_nonstationary_symbols_map.begin();
|
||||||
|
it != orig_nonstationary_symbols_map.end(); it++)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
vector<int> symb_id (1, symbol_table.getID(orig_symbol_table.getName(it->first)));
|
||||||
|
addNonstationaryVariables(symb_id,
|
||||||
|
it->second.first,
|
||||||
|
it->second.second->cloneDynamicReindex(dynamic_model, orig_symbol_table));
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
cerr << "Error: unused exo in nonstationary symbols." << endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicModel::resetDataTree()
|
||||||
|
{
|
||||||
|
num_const_node_map.clear();
|
||||||
|
variable_node_map.clear();
|
||||||
|
unary_op_node_map.clear();
|
||||||
|
binary_op_node_map.clear();
|
||||||
|
trinary_op_node_map.clear();
|
||||||
|
external_function_node_map.clear();
|
||||||
|
first_deriv_external_function_node_map.clear();
|
||||||
|
second_deriv_external_function_node_map.clear();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
DynamicModel::reindexEquations(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table)
|
DynamicModel::reindexEquations(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table)
|
||||||
{
|
{
|
||||||
|
|
|
@ -238,6 +238,15 @@ public:
|
||||||
//! reindex equations after change in symbol_table
|
//! reindex equations after change in symbol_table
|
||||||
void reindexEquations(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table);
|
void reindexEquations(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table);
|
||||||
|
|
||||||
|
//! reindex trend_symbol_map after change in symbol_table
|
||||||
|
void reindexTrendSymbolsMap(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table);
|
||||||
|
|
||||||
|
//! reindex nonstationary_symbol_map after change in symbol_table
|
||||||
|
void reindexNonstationarySymbolsMap(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table);
|
||||||
|
|
||||||
|
//! reset DataTree vars
|
||||||
|
void resetDataTree();
|
||||||
|
|
||||||
//! Replaces model equations with derivatives of Lagrangian w.r.t. endogenous
|
//! Replaces model equations with derivatives of Lagrangian w.r.t. endogenous
|
||||||
void computeRamseyPolicyFOCs(const StaticModel &static_model);
|
void computeRamseyPolicyFOCs(const StaticModel &static_model);
|
||||||
//! Replaces the model equations in dynamic_model with those in this model
|
//! Replaces the model equations in dynamic_model with those in this model
|
||||||
|
@ -248,7 +257,7 @@ public:
|
||||||
|
|
||||||
//! Returns number of static only equations
|
//! Returns number of static only equations
|
||||||
size_t staticOnlyEquationsNbr() const;
|
size_t staticOnlyEquationsNbr() const;
|
||||||
|
|
||||||
//! Returns number of dynamic only equations
|
//! Returns number of dynamic only equations
|
||||||
size_t dynamicOnlyEquationsNbr() const;
|
size_t dynamicOnlyEquationsNbr() const;
|
||||||
|
|
||||||
|
|
|
@ -313,6 +313,7 @@ ModFile::transformPass(bool nostrict)
|
||||||
{
|
{
|
||||||
SymbolTable orig_symbol_table = symbol_table;
|
SymbolTable orig_symbol_table = symbol_table;
|
||||||
symbol_table.rmExo(unusedExo);
|
symbol_table.rmExo(unusedExo);
|
||||||
|
dynamic_model.resetDataTree();
|
||||||
dynamic_model.reindexEquations(dynamic_model, orig_symbol_table);
|
dynamic_model.reindexEquations(dynamic_model, orig_symbol_table);
|
||||||
vector<Statement *> orig_statements = statements;
|
vector<Statement *> orig_statements = statements;
|
||||||
statements.clear();
|
statements.clear();
|
||||||
|
|
96
Shocks.cc
96
Shocks.cc
|
@ -67,6 +67,31 @@ AbstractShocksStatement::writeDetShocks(ostream &output) const
|
||||||
output << "M_.exo_det_length = " << exo_det_length << ";\n";
|
output << "M_.exo_det_length = " << exo_det_length << ";\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AbstractShocksStatement::det_shocks_t
|
||||||
|
AbstractShocksStatement::reindexDetShocksSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table)
|
||||||
|
{
|
||||||
|
det_shocks_t new_det_shocks;
|
||||||
|
SymbolTable *new_symbol_table = dynamic_datatree.getSymbolTable();
|
||||||
|
for (det_shocks_t::const_iterator it=det_shocks.begin(); it!=det_shocks.end(); it++)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
vector<DetShockElement> det_shock_vec;
|
||||||
|
for (int i=0; i<it->second.size(); i++)
|
||||||
|
{
|
||||||
|
DetShockElement dse;
|
||||||
|
dse.period1 = it->second[1].period1;
|
||||||
|
dse.period2 = it->second[1].period2;
|
||||||
|
dse.value = it->second[i].value->cloneDynamicReindex(dynamic_datatree, orig_symbol_table);
|
||||||
|
det_shock_vec.push_back(dse);
|
||||||
|
}
|
||||||
|
new_det_shocks[new_symbol_table->getID(orig_symbol_table.getName(it->first))] = det_shock_vec;
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
return new_det_shocks;
|
||||||
|
}
|
||||||
|
|
||||||
ShocksStatement::ShocksStatement(bool overwrite_arg,
|
ShocksStatement::ShocksStatement(bool overwrite_arg,
|
||||||
const det_shocks_t &det_shocks_arg,
|
const det_shocks_t &det_shocks_arg,
|
||||||
const var_and_std_shocks_t &var_shocks_arg,
|
const var_and_std_shocks_t &var_shocks_arg,
|
||||||
|
@ -332,6 +357,69 @@ ShocksStatement::has_calibrated_measurement_errors() const
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Statement *
|
||||||
|
ShocksStatement::cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table)
|
||||||
|
{
|
||||||
|
var_and_std_shocks_t new_var_shocks, new_std_shocks;
|
||||||
|
covar_and_corr_shocks_t new_covar_shocks, new_corr_shocks;
|
||||||
|
SymbolTable *new_symbol_table = dynamic_datatree.getSymbolTable();
|
||||||
|
|
||||||
|
for (var_and_std_shocks_t::const_iterator it = var_shocks.begin();
|
||||||
|
it != var_shocks.end(); it++)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
new_var_shocks[new_symbol_table->getID(orig_symbol_table.getName(it->first))] =
|
||||||
|
it->second->cloneDynamicReindex(dynamic_datatree, orig_symbol_table);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var_and_std_shocks_t::const_iterator it = std_shocks.begin();
|
||||||
|
it != std_shocks.end(); it++)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
new_std_shocks[new_symbol_table->getID(orig_symbol_table.getName(it->first))] =
|
||||||
|
it->second->cloneDynamicReindex(dynamic_datatree, orig_symbol_table);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
for (covar_and_corr_shocks_t::const_iterator it = covar_shocks.begin();
|
||||||
|
it != covar_shocks.end(); it++)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
new_covar_shocks[make_pair(new_symbol_table->getID(orig_symbol_table.getName(it->first.first)),
|
||||||
|
new_symbol_table->getID(orig_symbol_table.getName(it->first.second)))] =
|
||||||
|
it->second->cloneDynamicReindex(dynamic_datatree, orig_symbol_table);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
for (covar_and_corr_shocks_t::const_iterator it = corr_shocks.begin();
|
||||||
|
it != corr_shocks.end(); it++)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
new_corr_shocks[make_pair(new_symbol_table->getID(orig_symbol_table.getName(it->first.first)),
|
||||||
|
new_symbol_table->getID(orig_symbol_table.getName(it->first.second)))] =
|
||||||
|
it->second->cloneDynamicReindex(dynamic_datatree, orig_symbol_table);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ShocksStatement(overwrite,
|
||||||
|
reindexDetShocksSymbIds(dynamic_datatree, orig_symbol_table),
|
||||||
|
new_var_shocks,
|
||||||
|
new_std_shocks,
|
||||||
|
new_covar_shocks,
|
||||||
|
new_corr_shocks,
|
||||||
|
*(dynamic_datatree.getSymbolTable()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MShocksStatement::MShocksStatement(bool overwrite_arg,
|
MShocksStatement::MShocksStatement(bool overwrite_arg,
|
||||||
const det_shocks_t &det_shocks_arg,
|
const det_shocks_t &det_shocks_arg,
|
||||||
const SymbolTable &symbol_table_arg) :
|
const SymbolTable &symbol_table_arg) :
|
||||||
|
@ -352,6 +440,14 @@ MShocksStatement::writeOutput(ostream &output, const string &basename) const
|
||||||
writeDetShocks(output);
|
writeDetShocks(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Statement *
|
||||||
|
MShocksStatement::cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table)
|
||||||
|
{
|
||||||
|
return new MShocksStatement(overwrite,
|
||||||
|
reindexDetShocksSymbIds(dynamic_datatree, orig_symbol_table),
|
||||||
|
*(dynamic_datatree.getSymbolTable()));
|
||||||
|
}
|
||||||
|
|
||||||
ConditionalForecastPathsStatement::ConditionalForecastPathsStatement(const AbstractShocksStatement::det_shocks_t &paths_arg) :
|
ConditionalForecastPathsStatement::ConditionalForecastPathsStatement(const AbstractShocksStatement::det_shocks_t &paths_arg) :
|
||||||
paths(paths_arg),
|
paths(paths_arg),
|
||||||
path_length(-1)
|
path_length(-1)
|
||||||
|
|
|
@ -50,7 +50,7 @@ protected:
|
||||||
const det_shocks_t det_shocks;
|
const det_shocks_t det_shocks;
|
||||||
const SymbolTable &symbol_table;
|
const SymbolTable &symbol_table;
|
||||||
void writeDetShocks(ostream &output) const;
|
void writeDetShocks(ostream &output) const;
|
||||||
|
det_shocks_t reindexDetShocksSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
|
||||||
AbstractShocksStatement(bool mshocks_arg, bool overwrite_arg,
|
AbstractShocksStatement(bool mshocks_arg, bool overwrite_arg,
|
||||||
const det_shocks_t &det_shocks_arg,
|
const det_shocks_t &det_shocks_arg,
|
||||||
const SymbolTable &symbol_table_arg);
|
const SymbolTable &symbol_table_arg);
|
||||||
|
@ -79,6 +79,7 @@ public:
|
||||||
const SymbolTable &symbol_table_arg);
|
const SymbolTable &symbol_table_arg);
|
||||||
virtual void writeOutput(ostream &output, const string &basename) const;
|
virtual void writeOutput(ostream &output, const string &basename) const;
|
||||||
virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
|
virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
|
||||||
|
virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
|
||||||
};
|
};
|
||||||
|
|
||||||
class MShocksStatement : public AbstractShocksStatement
|
class MShocksStatement : public AbstractShocksStatement
|
||||||
|
@ -88,6 +89,7 @@ public:
|
||||||
const det_shocks_t &det_shocks_arg,
|
const det_shocks_t &det_shocks_arg,
|
||||||
const SymbolTable &symbol_table_arg);
|
const SymbolTable &symbol_table_arg);
|
||||||
virtual void writeOutput(ostream &output, const string &basename) const;
|
virtual void writeOutput(ostream &output, const string &basename) const;
|
||||||
|
virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
|
||||||
};
|
};
|
||||||
|
|
||||||
class ConditionalForecastPathsStatement : public Statement
|
class ConditionalForecastPathsStatement : public Statement
|
||||||
|
|
Loading…
Reference in New Issue