PAC: in the backward case, create an aux. var. for the pac_expectation expression
By the way, refactor the MCE case by merging two routines related to the Z₁ aux. var. This restores the symmetry with the backward case, now that the latter also has an aux. var. for the pac_expectation operator. Also store the aux. var. IDs in a structure common to the backward and MCE cases.pac-components
parent
0e62206203
commit
0f89569f7e
|
@ -3783,11 +3783,14 @@ DynamicModel::getPacTargetSymbId(const string &pac_model_name) const
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
DynamicModel::addPacModelConsistentExpectationEquation(const string &name, int discount_symb_id,
|
DynamicModel::computePacModelConsistentExpectationSubstitution(const string &name,
|
||||||
int pac_eq_max_lag,
|
int discount_symb_id,
|
||||||
ExprNode::subst_table_t &diff_subst_table,
|
int pac_eq_max_lag,
|
||||||
map<string, int> &pac_mce_z1_symb_ids,
|
expr_t growth_correction_term,
|
||||||
map<string, vector<int>> &pac_mce_alpha_symb_ids)
|
ExprNode::subst_table_t &diff_subst_table,
|
||||||
|
map<string, int> &pac_aux_var_symb_ids,
|
||||||
|
map<string, vector<int>> &pac_mce_alpha_symb_ids,
|
||||||
|
map<string, expr_t> &pac_expectation_substitution)
|
||||||
{
|
{
|
||||||
int pac_target_symb_id;
|
int pac_target_symb_id;
|
||||||
try
|
try
|
||||||
|
@ -3813,7 +3816,7 @@ DynamicModel::addPacModelConsistentExpectationEquation(const string &name, int d
|
||||||
cerr << "The variable/parameter '" << varname << "' conflicts with the variable that will be generated for the Z_1 variable of the '" << name << "' PAC model. Please rename it." << endl;
|
cerr << "The variable/parameter '" << varname << "' conflicts with the variable that will be generated for the Z_1 variable of the '" << name << "' PAC model. Please rename it." << endl;
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
pac_mce_z1_symb_ids[name] = mce_z1_symb_id;
|
pac_aux_var_symb_ids[name] = mce_z1_symb_id;
|
||||||
|
|
||||||
expr_t A = One;
|
expr_t A = One;
|
||||||
expr_t fp = Zero;
|
expr_t fp = Zero;
|
||||||
|
@ -3913,18 +3916,11 @@ DynamicModel::addPacModelConsistentExpectationEquation(const string &name, int d
|
||||||
neqs++;
|
neqs++;
|
||||||
|
|
||||||
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::computePacModelConsistentExpectationSubstitution(const string &name,
|
|
||||||
expr_t growth_correction_term,
|
|
||||||
int pac_mce_z1_symb_id,
|
|
||||||
map<string, expr_t> &pac_expectation_substitution)
|
|
||||||
{
|
|
||||||
/* The growth correction term is not added to the definition of Z₁
|
/* The growth correction term is not added to the definition of Z₁
|
||||||
because the latter is recursive. Rather put it at the level of the
|
because the latter is recursive. Rather put it at the level of the
|
||||||
substition of pac_expectation operator. */
|
substition of pac_expectation operator. */
|
||||||
pac_expectation_substitution[name] = AddPlus(AddVariable(pac_mce_z1_symb_id), growth_correction_term);
|
pac_expectation_substitution[name] = AddPlus(AddVariable(mce_z1_symb_id), growth_correction_term);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -3934,6 +3930,7 @@ DynamicModel::computePacBackwardExpectationSubstitution(const string &name,
|
||||||
const string &aux_model_type,
|
const string &aux_model_type,
|
||||||
const vector<bool> &nonstationary,
|
const vector<bool> &nonstationary,
|
||||||
expr_t growth_correction_term,
|
expr_t growth_correction_term,
|
||||||
|
map<string, int> &pac_aux_var_symb_ids,
|
||||||
map<string, vector<int>> &pac_h0_indices,
|
map<string, vector<int>> &pac_h0_indices,
|
||||||
map<string, vector<int>> &pac_h1_indices,
|
map<string, vector<int>> &pac_h1_indices,
|
||||||
map<string, expr_t> &pac_expectation_substitution)
|
map<string, expr_t> &pac_expectation_substitution)
|
||||||
|
@ -4001,7 +3998,21 @@ DynamicModel::computePacBackwardExpectationSubstitution(const string &name,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pac_expectation_substitution[name] = AddPlus(subExpr, growth_correction_term);
|
int expect_var_id;
|
||||||
|
string expect_var_name = "pac_expectation_" + name;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
expect_var_id = symbol_table.addSymbol(expect_var_name, SymbolType::endogenous);
|
||||||
|
}
|
||||||
|
catch (SymbolTable::AlreadyDeclaredException &e)
|
||||||
|
{
|
||||||
|
cerr << "The variable/parameter '" << expect_var_name << "' conflicts with the variable that will be generated for the 'pac_expectation' expression of the '" << name << "' PAC model. Please rename it." << endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
addEquation(AddEqual(AddVariable(expect_var_id), AddPlus(subExpr, growth_correction_term)), -1);
|
||||||
|
|
||||||
|
pac_aux_var_symb_ids[name] = expect_var_id;
|
||||||
|
pac_expectation_substitution[name] = AddVariable(expect_var_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -528,20 +528,18 @@ public:
|
||||||
//! Return target of the pac equation
|
//! Return target of the pac equation
|
||||||
int getPacTargetSymbId(const string &pac_model_name) const;
|
int getPacTargetSymbId(const string &pac_model_name) const;
|
||||||
|
|
||||||
/* For a PAC MCE model, add the variable and the equation defining Z₁.
|
|
||||||
The symbol IDs of the new endogenous and parameters are also added to
|
|
||||||
pac_mce_{z1,alpha}_symb_ids. */
|
|
||||||
void addPacModelConsistentExpectationEquation(const string &name, int discount,
|
|
||||||
int pac_eq_max_lag,
|
|
||||||
ExprNode::subst_table_t &diff_subst_table,
|
|
||||||
map<string, int> &pac_mce_z1_symb_ids,
|
|
||||||
map<string, vector<int>> &pac_mce_alpha_symb_ids);
|
|
||||||
|
|
||||||
/* For a PAC MCE model, fill pac_expectation_substitution with the
|
/* For a PAC MCE model, fill pac_expectation_substitution with the
|
||||||
expression that will be substituted for the pac_expectation operator */
|
expression that will be substituted for the pac_expectation operator.
|
||||||
|
In the process, add the variable and the equation defining Z₁.
|
||||||
|
The symbol IDs of the new endogenous are added to pac_aux_var_symb_ids,
|
||||||
|
and the new auxiliary parameters to pac_mce_alpha_symb_ids.
|
||||||
|
*/
|
||||||
void computePacModelConsistentExpectationSubstitution(const string &name,
|
void computePacModelConsistentExpectationSubstitution(const string &name,
|
||||||
|
int discount_symb_id, int pac_eq_max_lag,
|
||||||
expr_t growth_correction_term,
|
expr_t growth_correction_term,
|
||||||
int pac_mce_z1_symb_id,
|
ExprNode::subst_table_t &diff_subst_table,
|
||||||
|
map<string, int> &pac_aux_var_symb_ids,
|
||||||
|
map<string, vector<int>> &pac_mce_alpha_symb_ids,
|
||||||
map<string, expr_t> &pac_expectation_substitution);
|
map<string, expr_t> &pac_expectation_substitution);
|
||||||
|
|
||||||
|
|
||||||
|
@ -554,6 +552,7 @@ public:
|
||||||
const string &aux_model_type,
|
const string &aux_model_type,
|
||||||
const vector<bool> &nonstationary,
|
const vector<bool> &nonstationary,
|
||||||
expr_t growth_correction_term,
|
expr_t growth_correction_term,
|
||||||
|
map<string, int> &pac_aux_var_symb_ids,
|
||||||
map<string, vector<int>> &pac_h0_indices,
|
map<string, vector<int>> &pac_h0_indices,
|
||||||
map<string, vector<int>> &pac_h1_indices,
|
map<string, vector<int>> &pac_h1_indices,
|
||||||
map<string, expr_t> &pac_expectation_substitution);
|
map<string, expr_t> &pac_expectation_substitution);
|
||||||
|
|
|
@ -884,27 +884,25 @@ PacModelTable::transformPass(ExprNode::subst_table_t &diff_subst_table,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// In the MCE case, add the variable and the equation defining Z₁
|
|
||||||
if (aux_model_name[name].empty())
|
|
||||||
dynamic_model.addPacModelConsistentExpectationEquation(name, symbol_table.getID(discount[name]),
|
|
||||||
pacEquationMaxLag(name),
|
|
||||||
diff_subst_table,
|
|
||||||
mce_z1_symb_ids, mce_alpha_symb_ids);
|
|
||||||
|
|
||||||
// Compute the expressions that will be substituted for the pac_expectation operators
|
// Compute the expressions that will be substituted for the pac_expectation operators
|
||||||
expr_t growth_correction_term = dynamic_model.Zero;
|
expr_t growth_correction_term = dynamic_model.Zero;
|
||||||
if (growth[name])
|
if (growth[name])
|
||||||
growth_correction_term = dynamic_model.AddTimes(growth[name], dynamic_model.AddVariable(growth_neutrality_params[name]));
|
growth_correction_term = dynamic_model.AddTimes(growth[name], dynamic_model.AddVariable(growth_neutrality_params[name]));
|
||||||
if (aux_model_name[name].empty())
|
if (aux_model_name[name].empty())
|
||||||
dynamic_model.computePacModelConsistentExpectationSubstitution(name,
|
dynamic_model.computePacModelConsistentExpectationSubstitution(name,
|
||||||
|
symbol_table.getID(discount[name]),
|
||||||
|
pacEquationMaxLag(name),
|
||||||
growth_correction_term,
|
growth_correction_term,
|
||||||
mce_z1_symb_ids[name],
|
diff_subst_table,
|
||||||
|
aux_var_symb_ids,
|
||||||
|
mce_alpha_symb_ids,
|
||||||
pac_expectation_substitution);
|
pac_expectation_substitution);
|
||||||
else
|
else
|
||||||
dynamic_model.computePacBackwardExpectationSubstitution(name, lhs[name], max_lag,
|
dynamic_model.computePacBackwardExpectationSubstitution(name, lhs[name], max_lag,
|
||||||
aux_model_type[name],
|
aux_model_type[name],
|
||||||
nonstationary,
|
nonstationary,
|
||||||
growth_correction_term,
|
growth_correction_term,
|
||||||
|
aux_var_symb_ids,
|
||||||
h0_indices, h1_indices,
|
h0_indices, h1_indices,
|
||||||
pac_expectation_substitution);
|
pac_expectation_substitution);
|
||||||
}
|
}
|
||||||
|
@ -986,10 +984,10 @@ PacModelTable::writeOutput(const string &basename, ostream &output) const
|
||||||
output << "];" << endl;
|
output << "];" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write PAC Model Consistent Expectation Z1 info
|
// Write the auxiliary variable IDs created for the pac_expectation operator
|
||||||
for (auto &[name, id] : mce_z1_symb_ids)
|
for (auto &[name, id] : aux_var_symb_ids)
|
||||||
output << "M_.pac." << name << ".mce.z1 = "
|
output << "M_.pac." << name << "." << (aux_model_name.at(name).empty() ? "mce.z1" : "aux_id")
|
||||||
<< symbol_table.getTypeSpecificID(id) + 1 << ";" << endl;
|
<< " = " << symbol_table.getTypeSpecificID(id) + 1 << ";" << endl;
|
||||||
|
|
||||||
// Write PAC equation name info
|
// Write PAC equation name info
|
||||||
for (auto &[name, eq] : eq_name)
|
for (auto &[name, eq] : eq_name)
|
||||||
|
|
|
@ -205,12 +205,17 @@ private:
|
||||||
pac_model_name → eq_name */
|
pac_model_name → eq_name */
|
||||||
map<string, string> eq_name;
|
map<string, string> eq_name;
|
||||||
|
|
||||||
|
/* Stores symb_ids for auxiliary endogenous created for the expression
|
||||||
|
substituted to the pac_expectation operator:
|
||||||
|
- in the backward case, this auxiliary contains exactly the
|
||||||
|
pac_expectation value
|
||||||
|
- in the MCE case, this auxiliary represents Z₁ (i.e. without the growth
|
||||||
|
correction term)
|
||||||
|
pac_model_name → symb_id */
|
||||||
|
map<string, int> aux_var_symb_ids;
|
||||||
/* Stores symb_ids for alphas created by DynamicModel::addPacModelConsistentExpectationEquation()
|
/* Stores symb_ids for alphas created by DynamicModel::addPacModelConsistentExpectationEquation()
|
||||||
pac_model_name → mce_alpha_symb_ids */
|
pac_model_name → mce_alpha_symb_ids */
|
||||||
map<string, vector<int>> mce_alpha_symb_ids;
|
map<string, vector<int>> mce_alpha_symb_ids;
|
||||||
/* Stores symb_ids for z1s created by DynamicModel::addPacModelConsistentExpectationEquation()
|
|
||||||
pac_model_name → mce_z1_symb_id */
|
|
||||||
map<string, int> mce_z1_symb_ids;
|
|
||||||
/* Stores symb_ids for h0, h1 parameters
|
/* Stores symb_ids for h0, h1 parameters
|
||||||
pac_model_name → parameter symb_ids */
|
pac_model_name → parameter symb_ids */
|
||||||
map<string, vector<int>> h0_indices, h1_indices;
|
map<string, vector<int>> h0_indices, h1_indices;
|
||||||
|
|
Loading…
Reference in New Issue