PAC: generate the “growth_neutrality_param_index” MATLAB field for MCE models
Previously it was only generated in the case of backward PAC models.pac-components
parent
6863494db2
commit
784dd4122a
|
@ -114,6 +114,7 @@ DynamicModel::DynamicModel(const DynamicModel &m) :
|
||||||
pac_h1_indices{m.pac_h1_indices},
|
pac_h1_indices{m.pac_h1_indices},
|
||||||
pac_mce_z1_symb_ids{m.pac_mce_z1_symb_ids},
|
pac_mce_z1_symb_ids{m.pac_mce_z1_symb_ids},
|
||||||
pac_eqtag_and_lag{m.pac_eqtag_and_lag},
|
pac_eqtag_and_lag{m.pac_eqtag_and_lag},
|
||||||
|
pac_growth_neutrality_params{m.pac_growth_neutrality_params},
|
||||||
pac_model_info{m.pac_model_info},
|
pac_model_info{m.pac_model_info},
|
||||||
pac_equation_info{m.pac_equation_info}
|
pac_equation_info{m.pac_equation_info}
|
||||||
{
|
{
|
||||||
|
@ -178,6 +179,7 @@ DynamicModel::operator=(const DynamicModel &m)
|
||||||
pac_mce_z1_symb_ids = m.pac_mce_z1_symb_ids;
|
pac_mce_z1_symb_ids = m.pac_mce_z1_symb_ids;
|
||||||
pac_eqtag_and_lag = m.pac_eqtag_and_lag;
|
pac_eqtag_and_lag = m.pac_eqtag_and_lag;
|
||||||
pac_expectation_substitution.clear();
|
pac_expectation_substitution.clear();
|
||||||
|
pac_growth_neutrality_params = m.pac_growth_neutrality_params;
|
||||||
pac_model_info = m.pac_model_info;
|
pac_model_info = m.pac_model_info;
|
||||||
pac_equation_info = m.pac_equation_info;
|
pac_equation_info = m.pac_equation_info;
|
||||||
|
|
||||||
|
@ -3033,20 +3035,19 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
|
||||||
output << "];" << endl;
|
output << "];" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto &it : pac_model_info)
|
for (auto &[model, growth_neutrality_param_index] : pac_growth_neutrality_params)
|
||||||
|
output << "M_.pac." << model << ".growth_neutrality_param_index = "
|
||||||
|
<< symbol_table.getTypeSpecificID(growth_neutrality_param_index) + 1 << ";" << endl;
|
||||||
|
|
||||||
|
for (auto &[model, values] : pac_model_info)
|
||||||
{
|
{
|
||||||
vector<int> lhs = get<0>(it.second);
|
auto &[lhs, aux_model_type] = values;
|
||||||
output << "M_.pac." << it.first << ".lhs = [";
|
output << "M_.pac." << model << ".lhs = [";
|
||||||
for (auto it : lhs)
|
for (auto it : lhs)
|
||||||
output << it + 1 << " ";
|
output << it + 1 << " ";
|
||||||
output << "];" << endl;
|
output << "];" << endl;
|
||||||
|
|
||||||
if (int growth_param_index = get<1>(it.second);
|
output << "M_.pac." << model << ".auxiliary_model_type = '" << aux_model_type << "';" << endl;
|
||||||
growth_param_index >= 0)
|
|
||||||
output << "M_.pac." << it.first << ".growth_neutrality_param_index = "
|
|
||||||
<< symbol_table.getTypeSpecificID(growth_param_index) + 1 << ";" << endl;
|
|
||||||
|
|
||||||
output << "M_.pac." << it.first << ".auxiliary_model_type = '" << get<2>(it.second) << "';" << endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto &pit : pac_equation_info)
|
for (auto &pit : pac_equation_info)
|
||||||
|
@ -4194,6 +4195,14 @@ DynamicModel::addPacModelConsistentExpectationEquation(const string &name, int d
|
||||||
cout << "Pac Model Consistent Expectation: added " << neqs << " auxiliary variables and equations for model " << name << "." << endl;
|
cout << "Pac Model Consistent Expectation: added " << neqs << " auxiliary variables and equations for model " << name << "." << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicModel::createPacGrowthNeutralityParameter(const string &pac_model_name)
|
||||||
|
{
|
||||||
|
int param_idx = symbol_table.addSymbol(pac_model_name +"_pac_growth_neutrality_correction",
|
||||||
|
SymbolType::parameter);
|
||||||
|
pac_growth_neutrality_params[pac_model_name] = param_idx;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
DynamicModel::fillPacModelInfo(const string &pac_model_name,
|
DynamicModel::fillPacModelInfo(const string &pac_model_name,
|
||||||
vector<int> lhs,
|
vector<int> lhs,
|
||||||
|
@ -4208,12 +4217,6 @@ DynamicModel::fillPacModelInfo(const string &pac_model_name,
|
||||||
bool stationary_vars_present = any_of(nonstationary.begin(), nonstationary.end(), logical_not<bool>());
|
bool stationary_vars_present = any_of(nonstationary.begin(), nonstationary.end(), logical_not<bool>());
|
||||||
bool nonstationary_vars_present = any_of(nonstationary.begin(), nonstationary.end(), [](bool b) { return b; }); // FIXME: use std::identity instead of an anonymous function when we upgrade to C++20
|
bool nonstationary_vars_present = any_of(nonstationary.begin(), nonstationary.end(), [](bool b) { return b; }); // FIXME: use std::identity instead of an anonymous function when we upgrade to C++20
|
||||||
|
|
||||||
int growth_param_index = -1;
|
|
||||||
if (growth)
|
|
||||||
growth_param_index = symbol_table.addSymbol(pac_model_name
|
|
||||||
+"_pac_growth_neutrality_correction",
|
|
||||||
SymbolType::parameter);
|
|
||||||
|
|
||||||
for (auto pac_models_and_eqtags : pac_eqtag_and_lag)
|
for (auto pac_models_and_eqtags : pac_eqtag_and_lag)
|
||||||
{
|
{
|
||||||
if (pac_models_and_eqtags.first.first != pac_model_name)
|
if (pac_models_and_eqtags.first.first != pac_model_name)
|
||||||
|
@ -4276,12 +4279,15 @@ DynamicModel::fillPacModelInfo(const string &pac_model_name,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (growth)
|
if (growth)
|
||||||
subExpr = AddPlus(subExpr,
|
{
|
||||||
AddTimes(AddVariable(growth_param_index), growth));
|
int growth_param_index = pac_growth_neutrality_params.at(pac_model_name);
|
||||||
|
subExpr = AddPlus(subExpr,
|
||||||
|
AddTimes(AddVariable(growth_param_index), growth));
|
||||||
|
}
|
||||||
|
|
||||||
pac_expectation_substitution[{pac_model_name, eqtag}] = subExpr;
|
pac_expectation_substitution[{pac_model_name, eqtag}] = subExpr;
|
||||||
}
|
}
|
||||||
pac_model_info[pac_model_name] = {move(lhs), growth_param_index, move(aux_model_type)};
|
pac_model_info[pac_model_name] = {move(lhs), move(aux_model_type)};
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -134,13 +134,16 @@ private:
|
||||||
//! Store lag info for pac equations
|
//! Store lag info for pac equations
|
||||||
//! (pac_model_name, equation_tag) -> (standardized_eqtag, lag)
|
//! (pac_model_name, equation_tag) -> (standardized_eqtag, lag)
|
||||||
map<pair<string, string>, pair<string, int>> pac_eqtag_and_lag;
|
map<pair<string, string>, pair<string, int>> pac_eqtag_and_lag;
|
||||||
|
// Store indices for growth neutrality parameters
|
||||||
|
// pac_model_name -> growth_param_index
|
||||||
|
map<string, int> pac_growth_neutrality_params;
|
||||||
|
|
||||||
//! (pac_model_name, equation_tag) -> expr_t
|
//! (pac_model_name, equation_tag) -> expr_t
|
||||||
map<pair<string, string>, expr_t> pac_expectation_substitution;
|
map<pair<string, string>, expr_t> pac_expectation_substitution;
|
||||||
|
|
||||||
//! Store info about pac models:
|
//! Store info about backward PAC models:
|
||||||
//! pac_model_name -> (lhsvars, growth_param_index, aux_model_type)
|
//! pac_model_name -> (lhsvars, aux_model_type)
|
||||||
map<string, tuple<vector<int>, int, string>> pac_model_info;
|
map<string, pair<vector<int>, string>> pac_model_info;
|
||||||
|
|
||||||
//! Store info about pac models specific to the equation they appear in
|
//! Store info about pac models specific to the equation they appear in
|
||||||
//! (pac_model_name, standardized_eqtag) ->
|
//! (pac_model_name, standardized_eqtag) ->
|
||||||
|
@ -414,7 +417,14 @@ public:
|
||||||
|
|
||||||
//! Get Pac equation parameter info
|
//! Get Pac equation parameter info
|
||||||
map<pair<string, string>, pair<string, int>> walkPacParameters(const string &name);
|
map<pair<string, string>, pair<string, int>> walkPacParameters(const string &name);
|
||||||
|
|
||||||
|
// Create the growth neutrality parameter of a given PAC model (when the
|
||||||
|
// “growth” option has been passed)
|
||||||
|
void createPacGrowthNeutralityParameter(const string &pac_model_name);
|
||||||
|
|
||||||
//! Add var_model info to pac_expectation nodes
|
//! Add var_model info to pac_expectation nodes
|
||||||
|
// Must be called after createPacGrowthNeutralityParameter() has been called
|
||||||
|
// on the relevant models
|
||||||
void fillPacModelInfo(const string &pac_model_name,
|
void fillPacModelInfo(const string &pac_model_name,
|
||||||
vector<int> lhs,
|
vector<int> lhs,
|
||||||
int max_lag,
|
int max_lag,
|
||||||
|
|
|
@ -484,6 +484,9 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, bool
|
||||||
cerr << "Error: aux_model_name not recognized as VAR model or Trend Component model" << endl;
|
cerr << "Error: aux_model_name not recognized as VAR model or Trend Component model" << endl;
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
if (pms->growth)
|
||||||
|
dynamic_model.createPacGrowthNeutralityParameter(pms->name);
|
||||||
|
|
||||||
auto eqtag_and_lag = dynamic_model.walkPacParameters(pms->name);
|
auto eqtag_and_lag = dynamic_model.walkPacParameters(pms->name);
|
||||||
if (pms->aux_model_name.empty())
|
if (pms->aux_model_name.empty())
|
||||||
dynamic_model.addPacModelConsistentExpectationEquation(pms->name, symbol_table.getID(pms->discount),
|
dynamic_model.addPacModelConsistentExpectationEquation(pms->name, symbol_table.getID(pms->discount),
|
||||||
|
|
Loading…
Reference in New Issue