preprocessor: add PAC equation parameter info to pac_expectation output
parent
83d1e921b6
commit
89ae704806
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
156
ExprNode.cc
156
ExprNode.cc
|
@ -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> > > ¶ms_and_vals) const
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
NumConstNode::addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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> > > ¶ms_and_vals) const
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
VariableNode::addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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> > > ¶ms_and_vals) const
|
||||
{
|
||||
arg->walkPacParameters(pac_encountered, params_and_vals);
|
||||
}
|
||||
|
||||
void
|
||||
UnaryOpNode::addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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> > > ¶ms_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> > > ¶ms_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> > > ¶ms_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> > > ¶ms_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> > > ¶ms_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> > > ¶ms_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> > > ¶ms_and_vals) const
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
VarExpectationNode::addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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> > > ¶ms_and_vals) const
|
||||
{
|
||||
pac_encountered = true;
|
||||
}
|
||||
|
||||
void
|
||||
PacExpectationNode::addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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)
|
||||
{
|
||||
|
|
23
ExprNode.hh
23
ExprNode.hh
|
@ -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> > > ¶ms_and_vals) const = 0;
|
||||
|
||||
//! Adds PAC equation param info to pac_expectation
|
||||
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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> > > ¶ms_and_vals) const;
|
||||
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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> > > ¶ms_and_vals) const;
|
||||
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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> > > ¶ms_and_vals) const;
|
||||
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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> > > ¶ms_and_vals) const;
|
||||
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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> > > ¶ms_and_vals) const;
|
||||
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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> > > ¶ms_and_vals) const;
|
||||
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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> > > ¶ms_and_vals) const;
|
||||
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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> > > ¶ms_and_vals) const;
|
||||
virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > ¶ms_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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue