var_forecast: create individual .m files for each forecast

issue#70
Houtan Bastani 2016-11-16 18:44:20 +01:00 committed by Stéphane Adjemian (Charybdis)
parent a020daef37
commit 012360c370
10 changed files with 112 additions and 12 deletions

View File

@ -174,11 +174,13 @@ PriorPosteriorFunctionStatement::writeOutput(ostream &output, const string &base
VarModelStatement::VarModelStatement(const SymbolList &symbol_list_arg, VarModelStatement::VarModelStatement(const SymbolList &symbol_list_arg,
const OptionsList &options_list_arg, const OptionsList &options_list_arg,
const string &name_arg, const string &name_arg,
const SymbolTable &symbol_table_arg) : const SymbolTable &symbol_table_arg,
const DynamicModel &dynamic_model_arg) :
symbol_list(symbol_list_arg), symbol_list(symbol_list_arg),
options_list(options_list_arg), options_list(options_list_arg),
name(name_arg), name(name_arg),
symbol_table(symbol_table_arg) symbol_table(symbol_table_arg),
dynamic_model(dynamic_model_arg)
{ {
} }
@ -214,6 +216,7 @@ VarModelStatement::writeOutput(ostream &output, const string &basename, bool min
symbol_list.writeOutput("options_.var.var_list_", output); symbol_list.writeOutput("options_.var.var_list_", output);
output << "M_.var." << name << " = options_.var;" << endl output << "M_.var." << name << " = options_.var;" << endl
<< "clear options_.var;" << endl; << "clear options_.var;" << endl;
dynamic_model.writeVarExpectationFunctions(output, name);
} }
StochSimulStatement::StochSimulStatement(const SymbolList &symbol_list_arg, StochSimulStatement::StochSimulStatement(const SymbolList &symbol_list_arg,

View File

@ -117,11 +117,13 @@ private:
const OptionsList options_list; const OptionsList options_list;
const string &name; const string &name;
const SymbolTable &symbol_table; const SymbolTable &symbol_table;
const DynamicModel &dynamic_model;
public: public:
VarModelStatement(const SymbolList &symbol_list_arg, VarModelStatement(const SymbolList &symbol_list_arg,
const OptionsList &options_list_arg, const OptionsList &options_list_arg,
const string &name_arg, const string &name_arg,
const SymbolTable &symbol_table_arg); const SymbolTable &symbol_table_arg,
const DynamicModel &dynamic_model_arg);
virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings); virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
virtual void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const; virtual void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const;
}; };

View File

@ -3141,6 +3141,14 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de
output << "];" << endl; output << "];" << endl;
} }
void
DynamicModel::writeVarExpectationFunctions(ostream &output, const string &var_model_name) const
{
// Write Var Forecast files
for (int eq = 0; eq < (int) equations.size(); eq++)
equations[eq]->writeVarExpectationFunction(output, var_model_name);
}
map<pair<int, pair<int, int > >, expr_t> map<pair<int, pair<int, int > >, expr_t>
DynamicModel::collect_first_order_derivatives_endogenous() DynamicModel::collect_first_order_derivatives_endogenous()
{ {

View File

@ -236,6 +236,9 @@ public:
//! Writes model initialization and lead/lag incidence matrix to output //! Writes model initialization and lead/lag incidence matrix to output
void writeOutput(ostream &output, const string &basename, bool block, bool byte_code, bool use_dll, int order, bool estimation_present, bool compute_xrefs, bool julia) const; void writeOutput(ostream &output, const string &basename, bool block, bool byte_code, bool use_dll, int order, bool estimation_present, bool compute_xrefs, bool julia) const;
//! Writes calls to functions that write functions that forecast VARs
void writeVarExpectationFunctions(ostream &output, const string &var_model_name) const;
//! Return true if the hessian is equal to zero //! Return true if the hessian is equal to zero
inline bool checkHessianZero() const; inline bool checkHessianZero() const;

View File

@ -771,7 +771,7 @@ hand_side : '(' hand_side ')'
{ $$ = driver.add_power($1, $3); } { $$ = driver.add_power($1, $3); }
| EXPECTATION '(' signed_integer ')''(' hand_side ')' | EXPECTATION '(' signed_integer ')''(' hand_side ')'
{ $$ = driver.add_expectation($3, $6); } { $$ = driver.add_expectation($3, $6); }
| VAR_EXPECTATION '(' hand_side COMMA MODEL_NAME EQUAL NAME ')' | VAR_EXPECTATION '(' symbol COMMA MODEL_NAME EQUAL NAME ')'
{ $$ = driver.add_var_expectation($3, $7); } { $$ = driver.add_var_expectation($3, $7); }
| MINUS hand_side %prec UMINUS | MINUS hand_side %prec UMINUS
{ $$ = driver.add_uminus($2); } { $$ = driver.add_uminus($2); }

View File

@ -194,6 +194,12 @@ ExprNode::compileExternalFunctionOutput(ostream &CompileCode, unsigned int &inst
// Nothing to do // Nothing to do
} }
void
ExprNode::writeVarExpectationFunction(ostream &output, const string &var_model_name) const
{
// Nothing to do
}
VariableNode * VariableNode *
ExprNode::createEndoLeadAuxiliaryVarForMyself(subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const ExprNode::createEndoLeadAuxiliaryVarForMyself(subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const
{ {
@ -349,6 +355,11 @@ NumConstNode::collectDynamicVariables(SymbolType type_arg, set<pair<int, int> >
{ {
} }
void
NumConstNode::writeVarExpectationFunction(ostream &output, const string &var_model_name) const
{
}
pair<int, expr_t > pair<int, expr_t >
NumConstNode::normalizeEquation(int var_endo, vector<pair<int, pair<expr_t, expr_t> > > &List_of_Op_RHS) const NumConstNode::normalizeEquation(int var_endo, vector<pair<int, pair<expr_t, expr_t> > > &List_of_Op_RHS) const
{ {
@ -1394,6 +1405,11 @@ VariableNode::isNumConstNodeEqualTo(double value) const
return false; return false;
} }
void
VariableNode::writeVarExpectationFunction(ostream &output, const string &var_model_name) const
{
}
bool bool
VariableNode::isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const VariableNode::isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const
{ {
@ -1668,6 +1684,17 @@ UnaryOpNode::composeDerivatives(expr_t darg, int deriv_id)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
void
UnaryOpNode::writeVarExpectationFunction(ostream &output, const string &var_model_name) const
{
if (op_code == oVarExpectation && var_model_name == var_expectation_model_name)
{
VariableNode *varg = dynamic_cast<VariableNode *>(arg);
output << "writeVarExpectationFunction('" << var_expectation_model_name << "', '"
<< datatree.symbol_table.getName(varg->symb_id) << "');" << endl;
}
}
expr_t expr_t
UnaryOpNode::computeDerivative(int deriv_id) UnaryOpNode::computeDerivative(int deriv_id)
{ {
@ -2017,15 +2044,13 @@ UnaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
break; break;
case oVarExpectation: case oVarExpectation:
VariableNode *varg = dynamic_cast<VariableNode *>(arg); VariableNode *varg = dynamic_cast<VariableNode *>(arg);
assert(varg != NULL);
assert(datatree.symbol_table.getType(varg->symb_id) == eEndogenous);
if (IS_LATEX(output_type)) if (IS_LATEX(output_type))
output << "VAR" << LEFT_PAR(output_type) output << "VAR" << LEFT_PAR(output_type)
<< datatree.symbol_table.getTeXName(varg->symb_id) << datatree.symbol_table.getTeXName(varg->symb_id)
<< "_{t+1}" << RIGHT_PAR(output_type); << "_{t+1}" << RIGHT_PAR(output_type);
else else
output << "var_forecast('" << var_expectation_model_name << "', 1, y, '" output << "var_forecast_" << var_expectation_model_name << "_"
<< datatree.symbol_table.getName(varg->symb_id) << "')"; << datatree.symbol_table.getName(varg->symb_id) << "(y)";
return; return;
} }
@ -2385,6 +2410,9 @@ UnaryOpNode::buildSimilarUnaryOpNode(expr_t alt_arg, DataTree &alt_datatree) con
expr_t expr_t
UnaryOpNode::toStatic(DataTree &static_datatree) const UnaryOpNode::toStatic(DataTree &static_datatree) const
{ {
if (op_code == oVarExpectation)
return static_datatree.AddVariable((dynamic_cast<VariableNode *>(arg))->symb_id);
expr_t sarg = arg->toStatic(static_datatree); expr_t sarg = arg->toStatic(static_datatree);
return buildSimilarUnaryOpNode(sarg, static_datatree); return buildSimilarUnaryOpNode(sarg, static_datatree);
} }
@ -3095,6 +3123,13 @@ BinaryOpNode::containsExternalFunction() const
|| arg2->containsExternalFunction(); || arg2->containsExternalFunction();
} }
void
BinaryOpNode::writeVarExpectationFunction(ostream &output, const string &var_model_name) const
{
arg1->writeVarExpectationFunction(output, var_model_name);
arg2->writeVarExpectationFunction(output, var_model_name);
}
void void
BinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type, BinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
const temporary_terms_t &temporary_terms, const temporary_terms_t &temporary_terms,
@ -4234,6 +4269,14 @@ TrinaryOpNode::containsExternalFunction() const
|| arg3->containsExternalFunction(); || arg3->containsExternalFunction();
} }
void
TrinaryOpNode::writeVarExpectationFunction(ostream &output, const string &var_model_name) const
{
arg1->writeVarExpectationFunction(output, var_model_name);
arg2->writeVarExpectationFunction(output, var_model_name);
arg3->writeVarExpectationFunction(output, var_model_name);
}
void void
TrinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type, TrinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
const temporary_terms_t &temporary_terms, const temporary_terms_t &temporary_terms,
@ -4899,6 +4942,14 @@ AbstractExternalFunctionNode::normalizeEquation(int var_endo, vector<pair<int, p
return (make_pair(1, (expr_t) NULL)); return (make_pair(1, (expr_t) NULL));
} }
void
AbstractExternalFunctionNode::writeVarExpectationFunction(ostream &output, const string &var_model_name) const
{
for (vector<expr_t>::const_iterator it = arguments.begin();
it != arguments.end(); it++)
(*it)->writeVarExpectationFunction(output, var_model_name);
}
void void
AbstractExternalFunctionNode::writeExternalFunctionArguments(ostream &output, ExprNodeOutputType output_type, AbstractExternalFunctionNode::writeExternalFunctionArguments(ostream &output, ExprNodeOutputType output_type,
const temporary_terms_t &temporary_terms, const temporary_terms_t &temporary_terms,

View File

@ -212,6 +212,9 @@ public:
//! returns true if the expr node contains an external function //! returns true if the expr node contains an external function
virtual bool containsExternalFunction() const = 0; virtual bool containsExternalFunction() const = 0;
//! Writes the matlab/C function for a Var Expectation Node
virtual void writeVarExpectationFunction(ostream &output, const string &var_model_name) const = 0;
//! Writes output of node (with no temporary terms and with "outside model" output type) //! Writes output of node (with no temporary terms and with "outside model" output type)
void writeOutput(ostream &output) const; void writeOutput(ostream &output) const;
@ -501,6 +504,7 @@ public:
virtual expr_t decreaseLeadsLagsPredeterminedVariables() const; virtual expr_t decreaseLeadsLagsPredeterminedVariables() const;
virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const; virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const;
virtual bool isNumConstNodeEqualTo(double value) const; virtual bool isNumConstNodeEqualTo(double value) const;
virtual void writeVarExpectationFunction(ostream &output, const string &var_model_name) const;
virtual bool containsEndogenous(void) const; virtual bool containsEndogenous(void) const;
virtual bool containsExogenous() const; virtual bool containsExogenous() const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
@ -567,6 +571,7 @@ public:
virtual expr_t decreaseLeadsLagsPredeterminedVariables() const; virtual expr_t decreaseLeadsLagsPredeterminedVariables() const;
virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const; virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const;
virtual bool isNumConstNodeEqualTo(double value) const; virtual bool isNumConstNodeEqualTo(double value) const;
virtual void writeVarExpectationFunction(ostream &output, const string &var_model_name) const;
virtual bool containsEndogenous(void) const; virtual bool containsEndogenous(void) const;
virtual bool containsExogenous() const; virtual bool containsExogenous() const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
@ -655,6 +660,7 @@ public:
virtual expr_t decreaseLeadsLagsPredeterminedVariables() const; virtual expr_t decreaseLeadsLagsPredeterminedVariables() const;
virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const; virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const;
virtual bool isNumConstNodeEqualTo(double value) const; virtual bool isNumConstNodeEqualTo(double value) const;
virtual void writeVarExpectationFunction(ostream &output, const string &var_model_name) const;
virtual bool containsEndogenous(void) const; virtual bool containsEndogenous(void) const;
virtual bool containsExogenous() const; virtual bool containsExogenous() const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
@ -754,6 +760,7 @@ public:
virtual expr_t decreaseLeadsLagsPredeterminedVariables() const; virtual expr_t decreaseLeadsLagsPredeterminedVariables() const;
virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const; virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const;
virtual bool isNumConstNodeEqualTo(double value) const; virtual bool isNumConstNodeEqualTo(double value) const;
virtual void writeVarExpectationFunction(ostream &output, const string &var_model_name) const;
virtual bool containsEndogenous(void) const; virtual bool containsEndogenous(void) const;
virtual bool containsExogenous() const; virtual bool containsExogenous() const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
@ -835,6 +842,7 @@ public:
virtual expr_t decreaseLeadsLagsPredeterminedVariables() const; virtual expr_t decreaseLeadsLagsPredeterminedVariables() const;
virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const; virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const;
virtual bool isNumConstNodeEqualTo(double value) const; virtual bool isNumConstNodeEqualTo(double value) const;
virtual void writeVarExpectationFunction(ostream &output, const string &var_model_name) const;
virtual bool containsEndogenous(void) const; virtual bool containsEndogenous(void) const;
virtual bool containsExogenous() const; virtual bool containsExogenous() const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
@ -916,6 +924,7 @@ public:
virtual expr_t decreaseLeadsLagsPredeterminedVariables() const; virtual expr_t decreaseLeadsLagsPredeterminedVariables() const;
virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const; virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const;
virtual bool isNumConstNodeEqualTo(double value) const; virtual bool isNumConstNodeEqualTo(double value) const;
virtual void writeVarExpectationFunction(ostream &output, const string &var_model_name) const;
virtual bool containsEndogenous(void) const; virtual bool containsEndogenous(void) const;
virtual bool containsExogenous() const; virtual bool containsExogenous() const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;

View File

@ -809,9 +809,20 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool clear_glo
} }
// Print statements // Print statements
// Print var_model statements first so that the forecast functions can be used by following statements
// for (vector<Statement *>::const_iterator it = statements.begin();
// it != statements.end(); it++)
// if (dynamic_cast<VarModelStatement *>(*it) != NULL)
// (*it)->writeOutput(mOutputFile, basename, minimal_workspace);
// dynamic_model.writeVarExpectationFunctions(mOutputFile);
for (vector<Statement *>::const_iterator it = statements.begin(); for (vector<Statement *>::const_iterator it = statements.begin();
it != statements.end(); it++) it != statements.end(); it++)
{ {
// Don't print var_model statements again as they were already printed
// if (dynamic_cast<VarModelStatement *>(*it) != NULL)
// continue;
(*it)->writeOutput(mOutputFile, basename, minimal_workspace); (*it)->writeOutput(mOutputFile, basename, minimal_workspace);
/* Special treatment for initval block: insert initial values for the /* Special treatment for initval block: insert initial values for the

View File

@ -1286,7 +1286,7 @@ ParsingDriver::var_model()
if (it == options_list.string_options.end()) if (it == options_list.string_options.end())
error("You must pass the model_name option to the var_model statement."); error("You must pass the model_name option to the var_model statement.");
const string *name = new string(it->second); const string *name = new string(it->second);
mod_file->addStatement(new VarModelStatement(symbol_list, options_list, *name, mod_file->symbol_table)); mod_file->addStatement(new VarModelStatement(symbol_list, options_list, *name, mod_file->symbol_table, mod_file->dynamic_model));
symbol_list.clear(); symbol_list.clear();
options_list.clear(); options_list.clear();
} }
@ -1628,6 +1628,15 @@ ParsingDriver::copy_options(string *to_declaration_type, string *to_name1, strin
delete from_subsample_name; delete from_subsample_name;
} }
void
ParsingDriver::check_symbol_is_endogenous(string *name)
{
check_symbol_existence(*name);
int symb_id = mod_file->symbol_table.getID(*name);
if (mod_file->symbol_table.getType(symb_id) != eEndogenous)
error(*name + " is not endogenous");
}
void void
ParsingDriver::check_symbol_is_endogenous_or_exogenous(string *name) ParsingDriver::check_symbol_is_endogenous_or_exogenous(string *name)
{ {
@ -2387,9 +2396,10 @@ ParsingDriver::add_expectation(string *arg1, expr_t arg2)
} }
expr_t expr_t
ParsingDriver::add_var_expectation(expr_t arg1, string *arg2) ParsingDriver::add_var_expectation(string *arg1, string *arg2)
{ {
expr_t varExpectationNode = data_tree->AddVarExpectation(arg1, *arg2); check_symbol_is_endogenous(arg1);
expr_t varExpectationNode = data_tree->AddVarExpectation(add_model_variable(arg1), *arg2);
return varExpectationNode; return varExpectationNode;
} }

View File

@ -87,6 +87,9 @@ private:
//! Checks that a given symbol exists and is a parameter, and stops with an error message if it isn't //! Checks that a given symbol exists and is a parameter, and stops with an error message if it isn't
void check_symbol_is_parameter(string *name); void check_symbol_is_parameter(string *name);
//! Checks that a given symbol exists and is endogenous, and stops with an error message if it isn't
void check_symbol_is_endogenous(string *name);
//! Checks that a given symbol was assigned within a Statement //! Checks that a given symbol was assigned within a Statement
void check_symbol_is_statement_variable(string *name); void check_symbol_is_statement_variable(string *name);
@ -639,7 +642,7 @@ public:
//! Writes token "E(arg1)(arg2)" to model tree //! Writes token "E(arg1)(arg2)" to model tree
expr_t add_expectation(string *arg1, expr_t arg2); expr_t add_expectation(string *arg1, expr_t arg2);
//! Writes token "VAR_EXPECTATION(arg1,arg2)" to model tree //! Writes token "VAR_EXPECTATION(arg1,arg2)" to model tree
expr_t add_var_expectation(expr_t arg1, string *arg2); expr_t add_var_expectation(string *arg1, string *arg2);
//! Writes token "exp(arg1)" to model tree //! Writes token "exp(arg1)" to model tree
expr_t add_exp(expr_t arg1); expr_t add_exp(expr_t arg1);
//! Writes token "log(arg1)" to model tree //! Writes token "log(arg1)" to model tree