From 9d3f104b8c1d430b92f4ce1824d9bdbc859e1991 Mon Sep 17 00:00:00 2001 From: Houtan Bastani <houtan@dynare.org> Date: Fri, 7 Dec 2018 14:30:52 +0100 Subject: [PATCH] fix epilogue block --- src/CodeInterpreter.hh | 5 +-- src/DynareBison.yy | 83 +-------------------------------------- src/ExprNode.cc | 50 ++++------------------- src/ModelEquationBlock.cc | 71 ++++++++------------------------- src/ModelEquationBlock.hh | 8 +--- src/ParsingDriver.cc | 35 +---------------- src/ParsingDriver.hh | 6 --- 7 files changed, 29 insertions(+), 229 deletions(-) diff --git a/src/CodeInterpreter.hh b/src/CodeInterpreter.hh index d9c21d5e..a29f03bc 100644 --- a/src/CodeInterpreter.hh +++ b/src/CodeInterpreter.hh @@ -152,10 +152,7 @@ enum class SymbolType statementDeclaredVariable = 14, //!< Local variable assigned within a Statement (see subsample statement for example) logTrend = 15, //!< Log-trend variable unusedEndogenous = 16, - endogenousVAR = 17, //!< Variables declared in a var_model statement - endogenousEpilogue = 18, //!< Endogenous Variables used in the epilogue block - exogenousEpilogue = 19, //!< Variables used in the epilogue block - parameterEpilogue = 20 //!< Variables used in the epilogue block + endogenousVAR = 17 //!< Variables declared in a var_model statement }; enum ExpressionType diff --git a/src/DynareBison.yy b/src/DynareBison.yy index ffbf5006..f3416e9b 100644 --- a/src/DynareBison.yy +++ b/src/DynareBison.yy @@ -349,7 +349,6 @@ log_trend_var_list : log_trend_var_list symbol ; var : VAR var_list ';' - | VAR '(' EPILOGUE ')' epilogue_var_list ';' | VAR '(' DEFLATOR EQUAL { driver.begin_trend(); } hand_side ')' nonstationary_var_list ';' { driver.end_nonstationary_var(false, $6); } | VAR '(' LOG_DEFLATOR EQUAL { driver.begin_trend(); } hand_side ')' nonstationary_var_list ';' @@ -545,7 +544,6 @@ nonstationary_var_list : nonstationary_var_list symbol ; varexo : VAREXO varexo_list ';' - | VAREXO '(' EPILOGUE ')' epilogue_varexo_list ';' ; varexo_det : VAREXO_DET varexo_det_list ';'; @@ -553,7 +551,6 @@ varexo_det : VAREXO_DET varexo_det_list ';'; predetermined_variables : PREDETERMINED_VARIABLES predetermined_variables_list ';'; parameters : PARAMETERS parameter_list ';'; - | PARAMETERS '(' EPILOGUE ')' epilogue_parameter_list ';'; ; model_local_variable : MODEL_LOCAL_VARIABLE model_local_variable_list ';'; @@ -609,32 +606,6 @@ var_list : var_list symbol { driver.declare_endogenous($1, $2, $3); } ; -epilogue_var_list : epilogue_var_list symbol - { driver.declare_epilogue_endogenous($2); } - | epilogue_var_list COMMA symbol - { driver.declare_epilogue_endogenous($3); } - | symbol - { driver.declare_epilogue_endogenous($1); } - | epilogue_var_list symbol named_var - { driver.declare_epilogue_endogenous($2, "", $3); } - | epilogue_var_list COMMA symbol named_var - { driver.declare_epilogue_endogenous($3, "", $4); } - | symbol named_var - { driver.declare_epilogue_endogenous($1, "", $2); } - | epilogue_var_list symbol TEX_NAME - { driver.declare_epilogue_endogenous($2, $3); } - | epilogue_var_list COMMA symbol TEX_NAME - { driver.declare_epilogue_endogenous($3, $4); } - | symbol TEX_NAME - { driver.declare_epilogue_endogenous($1, $2); } - | epilogue_var_list symbol TEX_NAME named_var - { driver.declare_epilogue_endogenous($2, $3, $4); } - | epilogue_var_list COMMA symbol TEX_NAME named_var - { driver.declare_epilogue_endogenous($3, $4, $5); } - | symbol TEX_NAME named_var - { driver.declare_epilogue_endogenous($1, $2, $3); } - ; - varexo_list : varexo_list symbol { driver.declare_exogenous($2); } | varexo_list COMMA symbol @@ -687,32 +658,6 @@ varexo_det_list : varexo_det_list symbol { driver.declare_exogenous_det($1, $2, $3); } ; -epilogue_varexo_list : epilogue_varexo_list symbol - { driver.declare_epilogue_exogenous($2); } - | epilogue_varexo_list COMMA symbol - { driver.declare_epilogue_exogenous($3); } - | symbol - { driver.declare_epilogue_exogenous($1); } - | epilogue_varexo_list symbol named_var - { driver.declare_epilogue_exogenous($2, "", $3); } - | epilogue_varexo_list COMMA symbol named_var - { driver.declare_epilogue_exogenous($3, "", $4); } - | symbol named_var - { driver.declare_epilogue_exogenous($1, "", $2); } - | epilogue_varexo_list symbol TEX_NAME - { driver.declare_epilogue_exogenous($2, $3); } - | epilogue_varexo_list COMMA symbol TEX_NAME - { driver.declare_epilogue_exogenous($3, $4); } - | symbol TEX_NAME - { driver.declare_epilogue_exogenous($1, $2); } - | epilogue_varexo_list symbol TEX_NAME named_var - { driver.declare_epilogue_exogenous($2, $3, $4); } - | epilogue_varexo_list COMMA symbol TEX_NAME named_var - { driver.declare_epilogue_exogenous($3, $4, $5); } - | symbol TEX_NAME named_var - { driver.declare_epilogue_exogenous($1, $2, $3); } - ; - parameter_list : parameter_list symbol { driver.declare_parameter($2); } | parameter_list COMMA symbol @@ -739,32 +684,6 @@ parameter_list : parameter_list symbol { driver.declare_parameter($1, $2, $3); } ; -epilogue_parameter_list : epilogue_parameter_list symbol - { driver.declare_parameter($2); } - | epilogue_parameter_list COMMA symbol - { driver.declare_parameter($3); } - | symbol - { driver.declare_parameter($1); } - | epilogue_parameter_list symbol named_var - { driver.declare_parameter($2, "", $3); } - | epilogue_parameter_list COMMA symbol named_var - { driver.declare_parameter($3, "", $4); } - | symbol named_var - { driver.declare_parameter($1, "", $2); } - | epilogue_parameter_list symbol TEX_NAME - { driver.declare_parameter($2, $3); } - | epilogue_parameter_list COMMA symbol TEX_NAME - { driver.declare_parameter($3, $4); } - | symbol TEX_NAME - { driver.declare_parameter($1, $2); } - | epilogue_parameter_list symbol TEX_NAME named_var - { driver.declare_parameter($2, $3, $4); } - | epilogue_parameter_list COMMA symbol TEX_NAME named_var - { driver.declare_parameter($3, $4, $5); } - | symbol TEX_NAME named_var - { driver.declare_parameter($1, $2, $3); } - ; - predetermined_variables_list : predetermined_variables_list symbol { driver.add_predetermined_variable($2); } | predetermined_variables_list COMMA symbol @@ -961,7 +880,7 @@ epilogue_equation_list : epilogue_equation_list epilogue_equation | epilogue_equation ; -epilogue_equation : symbol EQUAL expression ';' +epilogue_equation : NAME EQUAL expression ';' { driver.add_epilogue_equal($1, $3); } ; diff --git a/src/ExprNode.cc b/src/ExprNode.cc index 73ef9978..ba901edc 100644 --- a/src/ExprNode.cc +++ b/src/ExprNode.cc @@ -755,9 +755,6 @@ VariableNode::prepareForDerivation() break; case SymbolType::externalFunction: case SymbolType::endogenousVAR: - case SymbolType::endogenousEpilogue: - case SymbolType::exogenousEpilogue: - case SymbolType::parameterEpilogue: cerr << "VariableNode::prepareForDerivation: impossible case" << endl; exit(EXIT_FAILURE); } @@ -791,9 +788,6 @@ VariableNode::computeDerivative(int deriv_id) exit(EXIT_FAILURE); case SymbolType::externalFunction: case SymbolType::endogenousVAR: - case SymbolType::endogenousEpilogue: - case SymbolType::exogenousEpilogue: - case SymbolType::parameterEpilogue: cerr << "VariableNode::computeDerivative: Impossible case!" << endl; exit(EXIT_FAILURE); } @@ -860,15 +854,6 @@ VariableNode::writeJsonAST(ostream &output) const case SymbolType::endogenousVAR: output << "endogenousVAR"; break; - case SymbolType::endogenousEpilogue: - output << "endogenousEpilogue"; - break; - case SymbolType::exogenousEpilogue: - output << "exogenousEpilogue"; - break; - case SymbolType::parameterEpilogue: - output << "parameterEpilogue"; - break; } output << "\", \"lag\" : " << lag << "}"; } @@ -927,7 +912,6 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type, switch (type) { case SymbolType::parameter: - case SymbolType::parameterEpilogue: if (output_type == ExprNodeOutputType::matlabOutsideModel) output << "M_.params" << "(" << tsid + 1 << ")"; else @@ -999,11 +983,9 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type, output << LEFT_ARRAY_SUBSCRIPT(output_type) << lag << RIGHT_ARRAY_SUBSCRIPT(output_type); break; case ExprNodeOutputType::epilogueFile: - output << datatree.symbol_table.getName(symb_id) - << LEFT_ARRAY_SUBSCRIPT(output_type) << "epilogue_it__"; - if (lag != 0) - output << lag; - output << RIGHT_ARRAY_SUBSCRIPT(output_type); + output << "dseries__." << datatree.symbol_table.getName(symb_id); + if (lag != 0) + output << LEFT_ARRAY_SUBSCRIPT(output_type) << lag << RIGHT_ARRAY_SUBSCRIPT(output_type); break; default: cerr << "VariableNode::writeOutput: should not reach this point" << endl; @@ -1059,11 +1041,9 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type, output << LEFT_ARRAY_SUBSCRIPT(output_type) << lag << RIGHT_ARRAY_SUBSCRIPT(output_type); break; case ExprNodeOutputType::epilogueFile: - output << datatree.symbol_table.getName(symb_id) - << LEFT_ARRAY_SUBSCRIPT(output_type) << "epilogue_it__"; + output << "dseries__." << datatree.symbol_table.getName(symb_id); if (lag != 0) - output << lag; - output << RIGHT_ARRAY_SUBSCRIPT(output_type); + output << LEFT_ARRAY_SUBSCRIPT(output_type) << lag << RIGHT_ARRAY_SUBSCRIPT(output_type); break; default: cerr << "VariableNode::writeOutput: should not reach this point" << endl; @@ -1119,25 +1099,15 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type, output << LEFT_ARRAY_SUBSCRIPT(output_type) << lag << RIGHT_ARRAY_SUBSCRIPT(output_type); break; case ExprNodeOutputType::epilogueFile: - output << datatree.symbol_table.getName(symb_id) - << LEFT_ARRAY_SUBSCRIPT(output_type) << "epilogue_it__"; + output << "dseries__." << datatree.symbol_table.getName(symb_id); if (lag != 0) - output << lag; - output << RIGHT_ARRAY_SUBSCRIPT(output_type); + output << LEFT_ARRAY_SUBSCRIPT(output_type) << lag << RIGHT_ARRAY_SUBSCRIPT(output_type); break; default: cerr << "VariableNode::writeOutput: should not reach this point" << endl; exit(EXIT_FAILURE); } break; - case SymbolType::endogenousEpilogue: - case SymbolType::exogenousEpilogue: - output << datatree.symbol_table.getName(symb_id) - << LEFT_ARRAY_SUBSCRIPT(output_type) << "epilogue_it__"; - if (lag != 0) - output << lag; - output << RIGHT_ARRAY_SUBSCRIPT(output_type); - break; case SymbolType::externalFunction: case SymbolType::trend: case SymbolType::logTrend: @@ -1364,9 +1334,6 @@ VariableNode::getChainRuleDerivative(int deriv_id, const map<int, expr_t> &recur exit(EXIT_FAILURE); case SymbolType::externalFunction: case SymbolType::endogenousVAR: - case SymbolType::endogenousEpilogue: - case SymbolType::exogenousEpilogue: - case SymbolType::parameterEpilogue: cerr << "VariableNode::getChainRuleDerivative: Impossible case" << endl; exit(EXIT_FAILURE); } @@ -1405,9 +1372,6 @@ VariableNode::computeXrefs(EquationInfo &ei) const case SymbolType::unusedEndogenous: case SymbolType::externalFunction: case SymbolType::endogenousVAR: - case SymbolType::endogenousEpilogue: - case SymbolType::exogenousEpilogue: - case SymbolType::parameterEpilogue: break; } } diff --git a/src/ModelEquationBlock.cc b/src/ModelEquationBlock.cc index 04747614..cdd5d123 100644 --- a/src/ModelEquationBlock.cc +++ b/src/ModelEquationBlock.cc @@ -295,9 +295,7 @@ Epilogue::Epilogue(SymbolTable &symbol_table_arg, } Epilogue::Epilogue(const Epilogue &m) : - DynamicModel {m}, - endogs {m.endogs}, - exogs {m.exogs} + DynamicModel {m} { for (const auto &it : m.def_table) def_table.push_back(make_pair(it.first, it.second->clone(*this))); @@ -308,9 +306,6 @@ Epilogue::operator=(const Epilogue &m) { DynamicModel::operator=(m); - endogs = m.endogs; - exogs = m.exogs; - def_table.clear(); for (const auto &it : m.def_table) def_table.push_back(make_pair(it.first, it.second->clone(*this))); @@ -319,17 +314,9 @@ Epilogue::operator=(const Epilogue &m) } void -Epilogue::addDefinition(int symb_id, expr_t expr) +Epilogue::addDefinition(string varname, expr_t expr) { - AddVariable(symb_id); // Create the variable node to be used in write method - def_table.emplace_back(symb_id, expr); - endogs.emplace(symb_id); - expr->collectVariables(SymbolType::endogenous, exogs); - expr->collectVariables(SymbolType::exogenous, exogs); - expr->collectVariables(SymbolType::endogenousEpilogue, exogs); - expr->collectVariables(SymbolType::exogenousEpilogue, exogs); - for (auto it : endogs) - exogs.erase(it); + def_table.emplace_back(varname, expr); } void @@ -338,17 +325,16 @@ Epilogue::checkPass(WarningConsolidation &warnings) const if (def_table.size() == 0) return; - vector<int> so_far_defined; + vector<string> so_far_defined; for (const auto & it : def_table) - { - if (find(so_far_defined.begin(), so_far_defined.end(), it.first) != so_far_defined.end()) - { - cerr << "WARNING: in the 'epilogue' block, variable '" << symbol_table.getName(it.first) - << "' is declared twice" << endl; - exit(EXIT_FAILURE); - } + if (find(so_far_defined.begin(), so_far_defined.end(), it.first) != so_far_defined.end()) + { + cerr << "WARNING: in the 'epilogue' block, variable '" << it.first + << "' is declared twice" << endl; + exit(EXIT_FAILURE); + } + else so_far_defined.push_back(it.first); - } } void @@ -367,46 +353,23 @@ Epilogue::writeEpilogueFile(const string &basename) const } ExprNodeOutputType output_type = ExprNodeOutputType::epilogueFile; - output << "function epilogue_dseries__ = epilogue(params, epilogue_dseries__)" << endl - << "% function epilogue_dseries__ = epilogue(params, epilogue_dseries__)" << endl - << "% Epilogue file generated by Dynare preprocessor" << endl << endl - << "% loop range variables" << endl - << "epilogue_loop_begin_idx__ = lastdate(epilogue_dseries__) - epilogue_dseries__.lastobservedperiod;" << endl - << "epilogue_loop_end_idx__ = lastdate(epilogue_dseries__) - firstdate(epilogue_dseries__) + 1;" << endl << endl; - - output << "% endogenous" << endl; - for (auto symb_id : endogs) - output << symbol_table.getName(symb_id) << " = epilogue_dseries__." << symbol_table.getName(symb_id) << ".data;" << endl; - output << endl - << "% exogenous" << endl; - for (auto symb_id : exogs) - output << symbol_table.getName(symb_id) << " = epilogue_dseries__." << symbol_table.getName(symb_id) << ".data;" << endl; - output << endl - << "for epilogue_it__ = epilogue_loop_begin_idx__:epilogue_loop_end_idx__" << endl; + output << "function dseries__ = epilogue(params, dseries__)" << endl + << "% function dseries__ = epilogue(params, dseries__)" << endl + << "% Epilogue file generated by Dynare preprocessor" << endl; deriv_node_temp_terms_t tef_terms; temporary_terms_t temporary_terms; temporary_terms_idxs_t temporary_terms_idxs; for (const auto & it : def_table) if (it.second->containsExternalFunction()) - { - output << " "; - it.second->writeExternalFunctionOutput(output, output_type, temporary_terms, temporary_terms_idxs, tef_terms); - } + it.second->writeExternalFunctionOutput(output, output_type, temporary_terms, temporary_terms_idxs, tef_terms); output << endl; for (const auto & it : def_table) { - output << " "; - getVariable(it.first)->ExprNode::writeOutput(output, output_type); - output << " = "; + output << "dseries__." << it.first << " = "; it.second->writeOutput(output, output_type, temporary_terms, temporary_terms_idxs, tef_terms); output << ";" << endl; } - output << "end" << endl << endl; - for (auto symb_id : endogs) - output << "epilogue_dseries__." << symbol_table.getName(symb_id) << " = dseries(" << symbol_table.getName(symb_id) - << ", epilogue_dseries__.firstdate);" << endl; - output << endl - << "end" << endl; + output << "end" << endl; output.close(); } diff --git a/src/ModelEquationBlock.hh b/src/ModelEquationBlock.hh index 4391c8ad..d9cdeb2c 100644 --- a/src/ModelEquationBlock.hh +++ b/src/ModelEquationBlock.hh @@ -70,11 +70,7 @@ class Epilogue : public DynamicModel { private: //! Associates a set of symbol IDs (the variable(s) assigned in a given statement) to an expression (their assigned value) - vector<pair<int, expr_t>> def_table; - - //! List of variables found in block - set<int> endogs; - set<int> exogs; + vector<pair<string, expr_t>> def_table; public: Epilogue(SymbolTable &symbol_table_arg, NumericalConstants &num_constants_arg, @@ -88,7 +84,7 @@ public: Epilogue & operator=(Epilogue &&) = delete; //! Add an expression of the form "var = expr;" - void addDefinition(int symb_id, expr_t expr); + void addDefinition(string varname, expr_t expr); //! Checks that no variable is declared twice void checkPass(WarningConsolidation &warnings) const; diff --git a/src/ParsingDriver.cc b/src/ParsingDriver.cc index 38c94840..25efbb73 100644 --- a/src/ParsingDriver.cc +++ b/src/ParsingDriver.cc @@ -201,14 +201,6 @@ ParsingDriver::declare_endogenous(const string &name, const string &tex_name, co declare_symbol(name, SymbolType::endogenous, tex_name, partition_value); } -void -ParsingDriver::declare_epilogue_endogenous(const string &name, - const string &tex_name, - const vector<pair<string, string>> &partition_value) -{ - declare_symbol(name, SymbolType::endogenousEpilogue, tex_name, partition_value); -} - void ParsingDriver::declare_var_endogenous(const string &name) { @@ -238,28 +230,12 @@ ParsingDriver::declare_exogenous_det(const string &name, const string &tex_name, declare_symbol(name, SymbolType::exogenousDet, tex_name, partition_value); } -void -ParsingDriver::declare_epilogue_exogenous(const string &name, - const string &tex_name, - const vector<pair<string, string>> &partition_value) -{ - declare_symbol(name, SymbolType::exogenousEpilogue, tex_name, partition_value); -} - void ParsingDriver::declare_parameter(const string &name, const string &tex_name, const vector<pair<string, string>> &partition_value) { declare_symbol(name, SymbolType::parameter, tex_name, partition_value); } -void -ParsingDriver::declare_epilogue_parameter(const string &name, - const string &tex_name, - const vector<pair<string, string>> &partition_value) -{ - declare_symbol(name, SymbolType::parameterEpilogue, tex_name, partition_value); -} - void ParsingDriver::declare_statement_local_variable(const string &name) { @@ -859,16 +835,7 @@ ParsingDriver::end_epilogue() void ParsingDriver::add_epilogue_equal(const string &varname, expr_t expr) { - int id; - try - { - id = mod_file->symbol_table.getID(varname); - } - catch (SymbolTable::UnknownSymbolNameException &e) - { - error("Variable " + varname + " used in the epilogue block but was not declared."); - } - mod_file->epilogue.addDefinition(id, expr); + mod_file->epilogue.addDefinition(varname, expr); } void diff --git a/src/ParsingDriver.hh b/src/ParsingDriver.hh index 39648a7a..c6895454 100644 --- a/src/ParsingDriver.hh +++ b/src/ParsingDriver.hh @@ -354,18 +354,12 @@ public: void initval_file(const string &filename); //! Declares an endogenous variable void declare_endogenous(const string &name, const string &tex_name = "", const vector<pair<string, string>> &partition_value = {}); - //! Declares an endogenous variable in the epilogue block - void declare_epilogue_endogenous(const string &name, const string &tex_name = "", const vector<pair<string, string>> &partition_value = {}); //! Declares an exogenous variable void declare_exogenous(const string &name, const string &tex_name = "", const vector<pair<string, string>> &partition_value = {}); - //! Declares an exogenous variable in the epilogue block - void declare_epilogue_exogenous(const string &name, const string &tex_name = "", const vector<pair<string, string>> &partition_value = {}); //! Declares an exogenous deterministic variable void declare_exogenous_det(const string &name, const string &tex_name = "", const vector<pair<string, string>> &partition_value = {}); //! Declares a parameter void declare_parameter(const string &name, const string &tex_name = "", const vector<pair<string, string>> &partition_value = {}); - //! Declare a parameter in the epilogue block - void declare_epilogue_parameter(const string &name, const string &tex_name = "", const vector<pair<string, string>> &partition_value = {}); //! Declares a VAR variable and adds to symbol_list void declare_var_endogenous(const string &name); //! Declares a model local variable -- GitLab