preprocessor: add PAC equation parameter info to pac_expectation output

issue#70
Houtan Bastani 2018-02-12 17:37:53 +01:00
parent 83d1e921b6
commit 89ae704806
5 changed files with 192 additions and 3 deletions

View File

@ -3382,6 +3382,19 @@ DynamicModel::addEquationsForVar(map<string, pair<SymbolList, int> > &var_model_
cout << "Accounting for var_model lags not in model block: added " << count << " auxiliary variables and equations." << endl;
}
void
DynamicModel::walkPacParameters()
{
for (size_t i = 0; i < equations.size(); i++)
{
bool pac_encountered = false;
set<pair<int, pair<int, int> > > params_and_vals;
equations[i]->walkPacParameters(pac_encountered, params_and_vals);
if (pac_encountered)
equations[i]->addParamInfoToPac(params_and_vals);
}
}
void
DynamicModel::fillPacExpectationVarInfo(string &var_model_name,
vector<int> &lhs,

View File

@ -297,6 +297,8 @@ public:
void setVarExpectationIndices(map<string, pair<SymbolList, int> > &var_model_info);
//! Add aux equations (and aux variables) for variables declared in var_model at max order if they don't already exist
void addEquationsForVar(map<string, pair<SymbolList, int> > &var_model_info);
//! Get Pac equation parameter info
void walkPacParameters();
//! Add var_model info to pac_expectation nodes
void fillPacExpectationVarInfo(string &var_model_name,
vector<int> &lhs,

View File

@ -578,6 +578,16 @@ NumConstNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_mo
{
}
void
NumConstNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
{
}
void
NumConstNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
{
}
void
NumConstNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
{
@ -1634,6 +1644,16 @@ VariableNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_mo
{
}
void
VariableNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
{
}
void
VariableNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
{
}
void
VariableNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
{
@ -3031,6 +3051,18 @@ UnaryOpNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_mod
arg->setVarExpectationIndex(var_model_info);
}
void
UnaryOpNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
{
arg->walkPacParameters(pac_encountered, params_and_vals);
}
void
UnaryOpNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
{
arg->addParamInfoToPac(params_and_vals_arg);
}
void
UnaryOpNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
{
@ -4567,6 +4599,45 @@ BinaryOpNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_mo
arg2->setVarExpectationIndex(var_model_info);
}
void
BinaryOpNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
{
if (op_code == oTimes)
{
set<int> params;
set<pair<int, int> > endogs;
arg1->collectVariables(eParameter, params);
arg2->collectDynamicVariables(eEndogenous, endogs);
if (params.size() == 1 && endogs.size() == 1)
{
params_and_vals.insert(make_pair(*(params.begin()), *(endogs.begin())));
return;
}
else
{
params.clear();
endogs.clear();
arg1->collectDynamicVariables(eEndogenous, endogs);
arg2->collectVariables(eParameter, params);
if (params.size() == 1 && endogs.size() == 1)
{
params_and_vals.insert(make_pair(*(params.begin()), *(endogs.begin())));
return;
}
}
}
arg1->walkPacParameters(pac_encountered, params_and_vals);
arg2->walkPacParameters(pac_encountered, params_and_vals);
}
void
BinaryOpNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
{
arg1->addParamInfoToPac(params_and_vals_arg);
arg2->addParamInfoToPac(params_and_vals_arg);
}
void
BinaryOpNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
{
@ -5343,6 +5414,22 @@ TrinaryOpNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_m
arg3->setVarExpectationIndex(var_model_info);
}
void
TrinaryOpNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
{
arg1->walkPacParameters(pac_encountered, params_and_vals);
arg2->walkPacParameters(pac_encountered, params_and_vals);
arg3->walkPacParameters(pac_encountered, params_and_vals);
}
void
TrinaryOpNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
{
arg1->addParamInfoToPac(params_and_vals_arg);
arg2->addParamInfoToPac(params_and_vals_arg);
arg3->addParamInfoToPac(params_and_vals_arg);
}
void
TrinaryOpNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
{
@ -5717,6 +5804,20 @@ AbstractExternalFunctionNode::setVarExpectationIndex(map<string, pair<SymbolList
(*it)->setVarExpectationIndex(var_model_info);
}
void
AbstractExternalFunctionNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
{
for (vector<expr_t>::const_iterator it = arguments.begin(); it != arguments.end(); it++)
(*it)->walkPacParameters(pac_encountered, params_and_vals);
}
void
AbstractExternalFunctionNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
{
for (vector<expr_t>::const_iterator it = arguments.begin(); it != arguments.end(); it++)
(*it)->addParamInfoToPac(params_and_vals_arg);
}
void
AbstractExternalFunctionNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
{
@ -7188,6 +7289,16 @@ VarExpectationNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &
yidx = find(vs.begin(), vs.end(), datatree.symbol_table.getName(symb_id)) - vs.begin();
}
void
VarExpectationNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
{
}
void
VarExpectationNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
{
}
void
VarExpectationNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
{
@ -7289,9 +7400,35 @@ PacExpectationNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
output << "M_.pac_expectation." << model_name << ".growth_name = '"
<< datatree.symbol_table.getName(growth_symb_id) << "';" << endl
<< "M_.pac_expectation." << model_name << ".growth_neutrality_param_index = "
<< datatree.symbol_table.getTypeSpecificID(growth_param_index) + 1 << ";" << endl;
output << "M_.pac_expectation." << model_name << ".h0_param_indices = [";
<< datatree.symbol_table.getTypeSpecificID(growth_param_index) + 1 << ";" << endl
<< "M_.pac_expectation." << model_name << ".equation_params = [";
for (set<pair<int, pair<int, int> > >::const_iterator it = params_and_vals.begin();
it != params_and_vals.end(); it++)
{
if (it != params_and_vals.begin())
output << " ";
output << datatree.symbol_table.getTypeSpecificID(it->first) + 1;
}
output << "];" << endl
<< "M_.pac_expectation." << model_name << ".equation_vars = [";
for (set<pair<int, pair<int, int> > >::const_iterator it = params_and_vals.begin();
it != params_and_vals.end(); it++)
{
if (it != params_and_vals.begin())
output << " ";
output << datatree.symbol_table.getTypeSpecificID(it->second.first) + 1;
}
output << "];" << endl
<< "M_.pac_expectation." << model_name << ".equation_var_lags = [";
for (set<pair<int, pair<int, int> > >::const_iterator it = params_and_vals.begin();
it != params_and_vals.end(); it++)
{
if (it != params_and_vals.begin())
output << " ";
output << it->second.second;
}
output << "];" << endl
<< "M_.pac_expectation." << model_name << ".h0_param_indices = [";
for (vector<int>::const_iterator it = h0_indices.begin();
it != h0_indices.end(); it++)
{
@ -7559,6 +7696,19 @@ PacExpectationNode::writeJsonOutput(ostream &output,
output << ")";
}
void
PacExpectationNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
{
pac_encountered = true;
}
void
PacExpectationNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
{
params_and_vals = params_and_vals_arg;
}
void
PacExpectationNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
{

View File

@ -489,6 +489,12 @@ class ExprNode
//! Returns true if model_info_name is referenced by a VarExpectationNode
virtual bool isVarModelReferenced(const string &model_info_name) const = 0;
//! Fills parameter information related to PAC equation
virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const = 0;
//! Adds PAC equation param info to pac_expectation
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg) = 0;
//! Fills var_model info for pac_expectation node
virtual void fillPacExpectationVarInfo(string &var_model_name, vector<int> &lhs, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg) = 0;
@ -560,6 +566,8 @@ public:
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
virtual bool isInStaticForm() const;
virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
virtual bool isVarModelReferenced(const string &model_info_name) const;
virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@ -639,6 +647,8 @@ public:
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
virtual bool isInStaticForm() const;
virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
virtual bool isVarModelReferenced(const string &model_info_name) const;
virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@ -741,6 +751,8 @@ public:
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
virtual bool isInStaticForm() const;
virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
virtual bool isVarModelReferenced(const string &model_info_name) const;
virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@ -861,6 +873,8 @@ public:
expr_t getNonZeroPartofEquation() const;
virtual bool isInStaticForm() const;
virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
virtual bool isVarModelReferenced(const string &model_info_name) const;
virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@ -949,6 +963,8 @@ public:
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
virtual bool isInStaticForm() const;
virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
virtual bool isVarModelReferenced(const string &model_info_name) const;
virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@ -1045,6 +1061,8 @@ public:
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
virtual bool isInStaticForm() const;
virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
virtual bool isVarModelReferenced(const string &model_info_name) const;
virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@ -1234,6 +1252,8 @@ public:
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
virtual bool isInStaticForm() const;
virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
virtual bool isVarModelReferenced(const string &model_info_name) const;
virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@ -1251,6 +1271,7 @@ private:
map<int, set<int > > z_vec; // lag -> set< symb_id > (all vars that appear at a given lag)
vector<int> h0_indices, h1_indices;
int growth_param_index, equation_number;
set<pair<int, pair<int, int> > > params_and_vals;
public:
PacExpectationNode(DataTree &datatree_arg, const string &model_name, const string &var_model_name,
const int discount_arg, const int growth_arg);
@ -1305,6 +1326,8 @@ public:
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
virtual bool isInStaticForm() const;
virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
virtual bool isVarModelReferenced(const string &model_info_name) const;
virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;

View File

@ -389,6 +389,7 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, const
map<int, set<int > > rhs_pac;
vms->getVarModelName(var_model_name);
vms->getVarModelRHS(rhs_pac);
dynamic_model.walkPacParameters();
dynamic_model.fillPacExpectationVarInfo(var_model_name, lhs, rhs_pac, nonstationary);
dynamic_model.substitutePacExpectation();
}