From 3740c4a28bc7100592ee1612362a78b402e022e0 Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan@dynare.org>
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)

---
 ModFile.cc          |  1 +
 SteadyStateModel.cc | 33 ++++++++++++++++++++++++++++++++-
 SteadyStateModel.hh |  4 +++-
 3 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/ModFile.cc b/ModFile.cc
index 862fd4ca..97ec4a20 100644
--- a/ModFile.cc
+++ b/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<Statement *> orig_statements = statements;
       statements.clear();
diff --git a/SteadyStateModel.cc b/SteadyStateModel.cc
index 7712e9f2..86599eaa 100644
--- a/SteadyStateModel.cc
+++ b/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<DataTree *> (this);
+  vector<int> new_symb_ids;
+  vector<pair<vector<int>, expr_t> > orig_def_table = def_table;
+  def_table.clear();
+  for (vector<pair<vector<int>, expr_t> >::const_iterator it = orig_def_table.begin();
+         it != orig_def_table.end(); it++)
+    try
+      {
+        new_symb_ids.clear();
+        for (vector<int>::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/SteadyStateModel.hh b/SteadyStateModel.hh
index 64b78573..8ed9d97d 100644
--- a/SteadyStateModel.hh
+++ b/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
-- 
GitLab