From 8bc946c148b3e3321e23bfbace19c91feb2893dc Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Wed, 27 May 2015 15:03:27 +0200 Subject: [PATCH] preprocessor: replace extra exos in steady state model (commit lost in merge) (cherry picked from commit d7db5070e7cf8d1b043062b04d3bd3c4e18ce6c1) --- preprocessor/ModFile.cc | 1 + preprocessor/SteadyStateModel.cc | 33 +++++++++++++++++++++++++++++++- preprocessor/SteadyStateModel.hh | 4 +++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/preprocessor/ModFile.cc b/preprocessor/ModFile.cc index 862fd4ca6..97ec4a209 100644 --- a/preprocessor/ModFile.cc +++ b/preprocessor/ModFile.cc @@ -315,6 +315,7 @@ ModFile::transformPass(bool nostrict) symbol_table.rmExo(unusedExo); dynamic_model.reindex(orig_symbol_table); external_functions_table.reindex(symbol_table, orig_symbol_table); + steady_state_model.reindex(orig_symbol_table); vector orig_statements = statements; statements.clear(); diff --git a/preprocessor/SteadyStateModel.cc b/preprocessor/SteadyStateModel.cc index 7712e9f24..86599eaaf 100644 --- a/preprocessor/SteadyStateModel.cc +++ b/preprocessor/SteadyStateModel.cc @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2014 Dynare Team + * Copyright (C) 2010-2015 Dynare Team * * This file is part of Dynare. * @@ -104,6 +104,37 @@ SteadyStateModel::checkPass(bool ramsey_model, WarningConsolidation &warnings) c } } +void +SteadyStateModel::reindex(SymbolTable orig_symbol_table) +{ + if (def_table.empty()) + return; + + DataTree *dt = dynamic_cast (this); + vector new_symb_ids; + vector, expr_t> > orig_def_table = def_table; + def_table.clear(); + for (vector, expr_t> >::const_iterator it = orig_def_table.begin(); + it != orig_def_table.end(); it++) + try + { + new_symb_ids.clear(); + for (vector::const_iterator it1 = it->first.begin(); + it1 != it->first.end(); it1++) + if (symbol_table.getName(*it1) == orig_symbol_table.getName(*it1)) + new_symb_ids.push_back(*it1); + else + new_symb_ids.push_back(symbol_table.getID(orig_symbol_table.getName(*it1))); + addMultipleDefinitions(new_symb_ids, + it->second->cloneDynamicReindex(*dt, orig_symbol_table)); + } + catch (...) + { + cerr << "ERROR: an unused exogenous variable was found in the steady_state_model block" << endl; + exit(EXIT_FAILURE); + } +} + void SteadyStateModel::writeSteadyStateFile(const string &basename, bool ramsey_model) const { diff --git a/preprocessor/SteadyStateModel.hh b/preprocessor/SteadyStateModel.hh index 64b78573b..8ed9d97d8 100644 --- a/preprocessor/SteadyStateModel.hh +++ b/preprocessor/SteadyStateModel.hh @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2014 Dynare Team + * Copyright (C) 2010-2015 Dynare Team * * This file is part of Dynare. * @@ -51,6 +51,8 @@ public: void writeSteadyStateFile(const string &basename, bool ramsey_model) const; // in ExternalFiles.cc void writeSteadyStateFileC(const string &basename, bool ramsey_model) const; + //! Used to reindex def_table after removal of extra exogenous + void reindex(SymbolTable orig_symbol_table); }; #endif