pac_expectation: modify syntax

issue#70
Houtan Bastani 2018-02-07 16:50:49 +01:00
parent 544eb615d0
commit 59ffefd1ce
7 changed files with 111 additions and 38 deletions

View File

@ -521,13 +521,14 @@ DataTree::AddVarExpectation(const int symb_id, const int forecast_horizon, const
}
expr_t
DataTree::AddPacExpectation(const string &model_name, const expr_t discount, const expr_t growth)
DataTree::AddPacExpectation(const string &model_name, const int discount_id, const int growth_id)
{
pac_expectation_node_map_t::iterator it = pac_expectation_node_map.find(make_pair(model_name, make_pair(discount, growth)));
pac_expectation_node_map_t::iterator it =
pac_expectation_node_map.find(make_pair(model_name, make_pair(discount_id, growth_id)));
if (it != pac_expectation_node_map.end())
return it->second;
return new PacExpectationNode(*this, model_name, discount, growth);
cout << "addpacexp " << model_name << endl;
return new PacExpectationNode(*this, model_name, discount_id, growth_id);
}
expr_t

View File

@ -82,7 +82,7 @@ protected:
var_expectation_node_map_t var_expectation_node_map;
// (model_name, (discount, growth)) -> PacExpectationNode
typedef map<pair<string, pair<expr_t, expr_t> >, PacExpectationNode *> pac_expectation_node_map_t;
typedef map<pair<string, pair<int, int> >, PacExpectationNode *> pac_expectation_node_map_t;
pac_expectation_node_map_t pac_expectation_node_map;
// ((arguments, deriv_idx), symb_id) -> FirstDerivExternalFunctionNode
@ -232,7 +232,7 @@ public:
//! Adds "var_expectation(arg1, arg2, model_name=arg3)" to model tree
expr_t AddVarExpectation(const int symb_id, const int forecast_horizon, const string &model_name);
//! Adds pac_expectation command to model tree
expr_t AddPacExpectation(const string &model_name, expr_t discount, expr_t growth);
expr_t AddPacExpectation(const string &model_name, const int discount_id, const int growth_id);
//! Adds a model local variable with its value
void AddLocalVariable(int symb_id, expr_t value) throw (LocalVariableException);
//! Adds an external function node

View File

@ -908,8 +908,8 @@ hand_side : '(' hand_side ')'
{ $$ = driver.add_var_expectation($3, new string("1"), $7); }
| VAR_EXPECTATION '(' symbol COMMA INT_NUMBER COMMA MODEL_NAME EQUAL NAME ')'
{ $$ = driver.add_var_expectation($3, $5, $9); }
| PAC_EXPECTATION '(' MODEL_NAME EQUAL NAME COMMA DISCOUNT EQUAL hand_side COMMA GROWTH EQUAL hand_side')'
{ $$ = driver.add_pac_expectation($5, $9, $13); }
| PAC_EXPECTATION '(' pac_expectation_options_list ')'
{ $$ = driver.add_pac_expectation(); }
| MINUS hand_side %prec UMINUS
{ $$ = driver.add_uminus($2); }
| PLUS hand_side
@ -968,6 +968,19 @@ hand_side : '(' hand_side ')'
{ $$ = driver.add_steady_state($3); }
;
pac_expectation_options_list : pac_expectation_options_list COMMA pac_expectation_options
| pac_expectation_options
;
pac_expectation_options : MODEL_NAME EQUAL QUOTED_STRING
{ driver.add_pac_expectation_model_name($3); }
| DISCOUNT EQUAL symbol
{ driver.add_pac_expectation_discount($3); }
| GROWTH EQUAL symbol
{ driver.add_pac_expectation_growth($3); }
;
comma_hand_side : hand_side
{ driver.add_external_function_arg($1); }
| comma_hand_side COMMA hand_side

View File

@ -7156,16 +7156,16 @@ VarExpectationNode::writeJsonOutput(ostream &output,
PacExpectationNode::PacExpectationNode(DataTree &datatree_arg,
const string &model_name_arg,
const expr_t discount_arg,
const expr_t growth_arg) :
const int discount_symb_id_arg,
const int growth_symb_id_arg) :
ExprNode(datatree_arg),
model_name(model_name_arg),
discount(discount_arg),
growth(growth_arg),
discount_symb_id(discount_symb_id_arg),
growth_symb_id(growth_symb_id_arg),
stationary_vars_present(true),
nonstationary_vars_present(true)
{
datatree.pac_expectation_node_map[make_pair(model_name, make_pair(discount, growth))] = this;
datatree.pac_expectation_node_map[make_pair(model_name, make_pair(discount_symb_id, growth_symb_id))] = this;
}
void
@ -7193,13 +7193,15 @@ PacExpectationNode::computeTemporaryTerms(map<expr_t, int> &reference_count,
expr_t
PacExpectationNode::toStatic(DataTree &static_datatree) const
{
return static_datatree.AddPacExpectation(model_name, discount, growth);
cout << "toStatic " << model_name << endl;
return static_datatree.AddPacExpectation(string(model_name), discount_symb_id, growth_symb_id);
}
expr_t
PacExpectationNode::cloneDynamic(DataTree &dynamic_datatree) const
{
return dynamic_datatree.AddPacExpectation(model_name, discount, growth);
cout << "cloneDynamic " << model_name << endl;
return dynamic_datatree.AddPacExpectation(string(model_name), discount_symb_id, growth_symb_id);
}
void
@ -7211,20 +7213,16 @@ PacExpectationNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
if (IS_LATEX(output_type))
{
output << "PAC_EXPECTATION" << LEFT_PAR(output_type) << model_name << ", ";
discount->writeOutput(output, output_type, temporary_terms, tef_terms);
output << ", ";
growth->writeOutput(output, output_type, temporary_terms, tef_terms);
output << "PAC_EXPECTATION" << LEFT_PAR(output_type) << model_name << ", "
<< discount_symb_id << ", " << growth_symb_id;
output << RIGHT_PAR(output_type);
return;
}
output << "M_.pac_expectation." << model_name << ".discount = ";
discount->writeOutput(output, oMatlabOutsideModel, temporary_terms, tef_terms);
output << ";" << endl
<< "M_.pac_expectation." << model_name << ".growth = ";
growth->writeOutput(output, oMatlabOutsideModel, temporary_terms, tef_terms);
output << ";" << endl
output << "M_.pac_expectation." << model_name << ".discount_param_index = "
<< datatree.symbol_table.getTypeSpecificID(discount_symb_id) + 1 << ";" << endl
<< "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
<< "M_.pac_expectation." << model_name << ".h0_param_indices = [";
@ -7484,11 +7482,9 @@ PacExpectationNode::writeJsonOutput(ostream &output,
{
output << "pac_expectation("
<< ", model_name = " << model_name
<< ", ";
discount->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic);
output << ", ";
growth->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic);
output << ")";
<< ", " << discount_symb_id
<< ", " << growth_symb_id
<< ")";
}
void
@ -7603,11 +7599,12 @@ PacExpectationNode::substitutePacExpectation(map<const PacExpectationNode *, con
datatree.AddVariable(*it1, it->first)));
}
growth_param_index = datatree.symbol_table.addSymbol(model_name + "_pac_growth_neutrality_correction",
growth_param_index = datatree.symbol_table.addSymbol(model_name +
"_pac_growth_neutrality_correction",
eParameter);
subExpr = datatree.AddPlus(subExpr,
datatree.AddTimes(datatree.AddVariable(growth_param_index),
growth));
datatree.AddVariable(growth_symb_id)));
subst_table[const_cast<PacExpectationNode *>(this)] = dynamic_cast<BinaryOpNode *>(subExpr);

View File

@ -1234,14 +1234,15 @@ public:
class PacExpectationNode : public ExprNode
{
private:
const string &model_name;
const expr_t discount, growth;
const string model_name;
const int discount_symb_id, growth_symb_id;
bool stationary_vars_present, nonstationary_vars_present;
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;
public:
PacExpectationNode(DataTree &datatree_arg, const string &model_name, const expr_t discount_arg, const expr_t growth_arg);
PacExpectationNode(DataTree &datatree_arg, const string &model_name,
const int discount_arg, const int growth_arg);
virtual void computeTemporaryTerms(map<expr_t, pair<int, NodeTreeReference> > &reference_count,
map<NodeTreeReference, temporary_terms_t> &temp_terms_map,
bool is_matlab, NodeTreeReference tr) const;

View File

@ -2673,9 +2673,62 @@ ParsingDriver::add_var_expectation(string *arg1, string *arg2, string *arg3)
}
expr_t
ParsingDriver::add_pac_expectation(string *model_name, expr_t discount, expr_t growth)
ParsingDriver::add_pac_expectation()
{
return data_tree->AddPacExpectation(*model_name, discount, growth);
if (pac_expectation_model_name.empty())
error("pac_expectation: you must pass the model_name option");
if (pac_expectation_discount.empty())
error("pac_expectation: you must pass the discount option");
if (pac_expectation_growth.empty())
error("pac_expectation: you must pass the growth option");
int pac_expectation_discount_id =
mod_file->symbol_table.getID(pac_expectation_discount);
int pac_expectation_growth_id =
mod_file->symbol_table.getID(pac_expectation_growth);
expr_t pac_exp_node = data_tree->AddPacExpectation(pac_expectation_model_name,
pac_expectation_discount_id,
pac_expectation_growth_id);
pac_expectation_model_name = pac_expectation_discount = pac_expectation_growth = "";
return pac_exp_node;
}
void
ParsingDriver::add_pac_expectation_model_name(string *arg)
{
if (!pac_expectation_model_name.empty())
error("pac_expectation: you can only pass the model_name option once");
pac_expectation_model_name = *arg;
delete arg;
}
void
ParsingDriver::add_pac_expectation_discount(string *arg)
{
if (!pac_expectation_discount.empty())
error("pac_expectation: you can only pass the discount option once");
check_symbol_is_parameter(arg);
pac_expectation_discount = *arg;
delete arg;
}
void
ParsingDriver::add_pac_expectation_growth(string *arg)
{
if (!pac_expectation_growth.empty())
error("pac_expectation: you can only pass the growth option once");
check_symbol_existence(*arg);
SymbolType type = mod_file->symbol_table.getType(mod_file->symbol_table.getID(*arg));
if (type != eParameter && type != eEndogenous)
error("pac_expectation growth argument must either be a parameter or an endogenous variable.");
pac_expectation_growth = *arg;
delete arg;
}
expr_t

View File

@ -251,6 +251,10 @@ private:
//! Used by VAR restrictions
void clear_VAR_storage();
//! Used by pac_expectation
string pac_expectation_model_name, pac_expectation_discount, pac_expectation_growth;
public:
ParsingDriver(WarningConsolidation &warnings_arg, bool nostrict_arg) : warnings(warnings_arg), nostrict(nostrict_arg), model_error_encountered(false)
{
@ -687,7 +691,11 @@ public:
//! Writes token "VAR_EXPECTATION(arg1, arg2, arg3)" to model tree
expr_t add_var_expectation(string *arg1, string *arg2, string *arg3);
//! Writes token "PAC_EXPECTATION(model_name, discount, growth)" to model tree
expr_t add_pac_expectation(string *model_name, expr_t discount, expr_t growth);
expr_t add_pac_expectation();
//! Adds arguments for pac_expectation
void add_pac_expectation_model_name(string *arg);
void add_pac_expectation_discount(string *arg);
void add_pac_expectation_growth(string *arg);
//! Writes token "diff(arg1)" to model tree
expr_t add_diff(expr_t arg1);
//! Writes token "adl(arg1, lag)" to model tree