diff --git a/CodeInterpreter.hh b/CodeInterpreter.hh index ed695fc2..43577a49 100644 --- a/CodeInterpreter.hh +++ b/CodeInterpreter.hh @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2016 Dynare Team + * Copyright (C) 2007-2017 Dynare Team * * This file is part of Dynare. * @@ -152,7 +152,8 @@ enum SymbolType eTrend = 13, //!< Trend variable eStatementDeclaredVariable = 14, //!< Local variable assigned within a Statement (see subsample statement for example) eLogTrend = 15, //!< Log-trend variable - eUnusedEndogenous = 16 + eUnusedEndogenous = 16, + eEndogenousVAR = 17 //!< Variables declared in a var_model statement }; enum ExpressionType diff --git a/ComputingTasks.cc b/ComputingTasks.cc index 15b3a982..c51a29ed 100644 --- a/ComputingTasks.cc +++ b/ComputingTasks.cc @@ -173,12 +173,10 @@ PriorPosteriorFunctionStatement::writeOutput(ostream &output, const string &base VarModelStatement::VarModelStatement(const SymbolList &symbol_list_arg, const OptionsList &options_list_arg, - const string &name_arg, - const SymbolTable &symbol_table_arg) : + const string &name_arg) : symbol_list(symbol_list_arg), options_list(options_list_arg), - name(name_arg), - symbol_table(symbol_table_arg) + name(name_arg) { } @@ -191,14 +189,6 @@ VarModelStatement::getVarModelNameAndVarList(map > void VarModelStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) { - vector symbols = symbol_list.get_symbols(); - for (vector::const_iterator it = symbols.begin(); it != symbols.end(); it++) - if (symbol_table.getType(*it) != eEndogenous) - { - cerr << "ERROR: You can only run VARs on endogenous variables." << endl; - exit(EXIT_FAILURE); - } - OptionsList::num_options_t::const_iterator it = options_list.num_options.find("var.order"); if (it == options_list.num_options.end()) { diff --git a/ComputingTasks.hh b/ComputingTasks.hh index 118eed49..1cbbafaa 100644 --- a/ComputingTasks.hh +++ b/ComputingTasks.hh @@ -116,12 +116,10 @@ private: const SymbolList symbol_list; const OptionsList options_list; const string &name; - const SymbolTable &symbol_table; public: VarModelStatement(const SymbolList &symbol_list_arg, const OptionsList &options_list_arg, - const string &name_arg, - const SymbolTable &symbol_table_arg); + const string &name_arg); void getVarModelNameAndVarList(map > &var_model_info); virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings); virtual void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const; diff --git a/DynamicModel.cc b/DynamicModel.cc index c44dd26d..d63692c8 100644 --- a/DynamicModel.cc +++ b/DynamicModel.cc @@ -3240,8 +3240,8 @@ DynamicModel::addEquationsForVar(map > var_model_i map::const_iterator it1 = model_endos_and_lags.find(it->first); if (it1 == model_endos_and_lags.end()) { - cerr << "ERROR: Variable used in var that is not used in the model: " << it->first << endl; - exit(EXIT_FAILURE); + cerr << "WARNING: Variable used in var that is not used in the model: " << it->first << endl; + // exit(EXIT_FAILURE); } else if (it->second < it1->second) diff --git a/DynareBison.yy b/DynareBison.yy index 39cff55b..6eb1207f 100644 --- a/DynareBison.yy +++ b/DynareBison.yy @@ -349,7 +349,15 @@ var : VAR var_list ';' { driver.end_nonstationary_var(true, $6); } ; -var_model : VAR_MODEL '(' var_model_options_list ')' symbol_list ';' { driver.var_model(); } ; +var_model : VAR_MODEL '(' var_model_options_list ')' var_symbol_list ';' { driver.var_model(); } ; + +var_symbol_list : var_symbol_list symbol + { driver.declare_var_endogenous($2); } + | var_symbol_list COMMA symbol + { driver.declare_var_endogenous($3); } + | symbol + { driver.declare_var_endogenous($1); } + ; var_model_options_list : var_model_options_list COMMA var_model_options | var_model_options diff --git a/ExprNode.cc b/ExprNode.cc index cda13bcf..c6194ead 100644 --- a/ExprNode.cc +++ b/ExprNode.cc @@ -581,6 +581,7 @@ VariableNode::prepareForDerivation() // Such a variable is never derived break; case eExternalFunction: + case eEndogenousVAR: cerr << "VariableNode::prepareForDerivation: impossible case" << endl; exit(EXIT_FAILURE); } @@ -613,6 +614,7 @@ VariableNode::computeDerivative(int deriv_id) cerr << "eUnusedEndogenous is not derivable" << endl; exit(EXIT_FAILURE); case eExternalFunction: + case eEndogenousVAR: cerr << "Impossible case!" << endl; exit(EXIT_FAILURE); } @@ -865,6 +867,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type, case eLogTrend: case eStatementDeclaredVariable: case eUnusedEndogenous: + case eEndogenousVAR: cerr << "Impossible case" << endl; exit(EXIT_FAILURE); } @@ -1071,6 +1074,7 @@ VariableNode::getChainRuleDerivative(int deriv_id, const map &recur cerr << "eUnusedEndogenous is not derivable" << endl; exit(EXIT_FAILURE); case eExternalFunction: + case eEndogenousVAR: cerr << "Impossible case!" << endl; exit(EXIT_FAILURE); } @@ -1108,6 +1112,7 @@ VariableNode::computeXrefs(EquationInfo &ei) const case eStatementDeclaredVariable: case eUnusedEndogenous: case eExternalFunction: + case eEndogenousVAR: break; } } diff --git a/ParsingDriver.cc b/ParsingDriver.cc index 7c6c02b0..6665bb35 100644 --- a/ParsingDriver.cc +++ b/ParsingDriver.cc @@ -195,6 +195,23 @@ ParsingDriver::declare_endogenous(string *name, string *tex_name, vectorsymbol_table.exists(*name)) + { + SymbolType type = mod_file->symbol_table.getType(*name); + if (type != eEndogenous && type != eExogenous && type != eExogenousDet) + error("Symbol " + *name + " used in a VAR must be either endogenous or " + + "exogenous if it is also used elsewhere in the .mod file"); + add_in_symbol_list(name); + return; + } + + declare_symbol(name, eEndogenousVAR, NULL, NULL); + add_in_symbol_list(name); +} + void ParsingDriver::declare_exogenous(string *name, string *tex_name, vector *> *partition_value) { @@ -1286,7 +1303,7 @@ ParsingDriver::var_model() if (it == options_list.string_options.end()) error("You must pass the model_name option to the var_model statement."); 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)); symbol_list.clear(); options_list.clear(); } diff --git a/ParsingDriver.hh b/ParsingDriver.hh index dd4cae6c..1d090da4 100644 --- a/ParsingDriver.hh +++ b/ParsingDriver.hh @@ -301,6 +301,8 @@ public: void declare_exogenous_det(string *name, string *tex_name = NULL, vector *> *partition_value = NULL); //! Declares a parameter void declare_parameter(string *name, string *tex_name = NULL, vector *> *partition_value = NULL); + //! Declares a VAR variable and adds to symbol_list + void declare_var_endogenous(string *name); //! Declares a statement local variable void declare_statement_local_variable(string *name); //! Completes a subsample statement