From b7b0a6f73a294ac706f98a3e8744fe47250f78c1 Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan@dynare.org>
Date: Fri, 30 Jun 2017 15:56:56 +0200
Subject: [PATCH] declare parameters when adl is encountered

---
 ExprNode.cc      |  6 +++---
 ParsingDriver.cc |  5 +++++
 SymbolTable.cc   | 23 -----------------------
 SymbolTable.hh   |  7 -------
 4 files changed, 8 insertions(+), 33 deletions(-)

diff --git a/ExprNode.cc b/ExprNode.cc
index 1705c2f9..c81a24d3 100644
--- a/ExprNode.cc
+++ b/ExprNode.cc
@@ -4316,12 +4316,12 @@ BinaryOpNode::substituteAdlAndDiff() const
 
   expr_t arg1subst = arg1->substituteAdlAndDiff();
   int i = 1;
-  expr_t retval = datatree.AddTimes(datatree.AddVariable(datatree.symbol_table.addAdlParameter(adlparam, i), 0),
-                                    arg1subst->decreaseLeadsLags(i));
+  int param_symb_id = datatree.symbol_table.getID(adlparam + "_lag_" + to_string(i));
+  expr_t retval = datatree.AddTimes(datatree.AddVariable(param_symb_id, 0), arg1subst->decreaseLeadsLags(i));
   i++;
   for (; i <= (int) arg2->eval(eval_context_t()); i++)
     retval = datatree.AddPlus(retval,
-                              datatree.AddTimes(datatree.AddVariable(datatree.symbol_table.addAdlParameter(adlparam, i), 0),
+                              datatree.AddTimes(datatree.AddVariable(datatree.symbol_table.getID(adlparam + "_lag_" + to_string(i)), 0),
                                                 arg1subst->decreaseLeadsLags(i)));
   return retval;
 }
diff --git a/ParsingDriver.cc b/ParsingDriver.cc
index cb7e82e8..9072fc3b 100644
--- a/ParsingDriver.cc
+++ b/ParsingDriver.cc
@@ -2596,6 +2596,11 @@ ParsingDriver::add_adl(expr_t arg1, string *name, string *lag)
 {
   expr_t id = data_tree->AddAdl(arg1, *name,
                                 data_tree->AddNonNegativeConstant(*lag));
+
+  // Declare parameters here so that parameters can be initialized after the model block
+  for (int i = 0; i < atoi(lag->c_str()); i++)
+    declare_parameter(new string(*name + "_lag_" + to_string(i+1)));
+
   delete name;
   delete lag;
   return id;
diff --git a/SymbolTable.cc b/SymbolTable.cc
index dff6b9e1..9a04d4ca 100644
--- a/SymbolTable.cc
+++ b/SymbolTable.cc
@@ -649,29 +649,6 @@ SymbolTable::addLagAuxiliaryVarInternal(bool endo, int orig_symb_id, int orig_le
   return symb_id;
 }
 
-int
-SymbolTable::addAdlParameter(const string &basename, int lag) throw (FrozenException)
-{
-  ostringstream varname;
-  varname << basename << "_lag_" << lag;
-
-  try
-    {
-      int symb_id = addSymbol(varname.str(), eParameter);
-      adl_params.push_back(symb_id);
-      return symb_id;
-    }
-  catch (AlreadyDeclaredException &e)
-    {
-      int symb_id = getID(varname.str());
-      if (find(adl_params.begin(), adl_params.end(), symb_id) != adl_params.end())
-        return symb_id;
-
-      cerr << "ERROR: you should rename your variable called " << varname.str() << ", this name is internally used by Dynare" << endl;
-      exit(EXIT_FAILURE);
-    }
-}
-
 int
 SymbolTable::addEndoLeadAuxiliaryVar(int index, expr_t expr_arg) throw (FrozenException)
 {
diff --git a/SymbolTable.hh b/SymbolTable.hh
index 81070b00..cf09c59a 100644
--- a/SymbolTable.hh
+++ b/SymbolTable.hh
@@ -153,9 +153,6 @@ private:
   //! Stores the list of observed exogenous variables
   vector<int> varexobs;
 
-  //! Stores list of parameters declared in adl substitution
-  vector<int> adl_params;
-
 public:
   SymbolTable();
   //! Thrown when trying to access an unknown symbol (by name)
@@ -287,10 +284,6 @@ public:
   //! Adds an auxiliary variable when var_model is used with an order that is greater in absolute value
   //! than the largest lag present in the model.
   int addVarModelEndoLagAuxiliaryVar(int orig_symb_id, int orig_lead_lag, expr_t expr_arg) throw (AlreadyDeclaredException, FrozenException);
-  /*
-  // Adds a parameter for the transformation of the adl operator
-  */
-  int addAdlParameter(const string &basename, int lag) throw (FrozenException);
   //! Returns the number of auxiliary variables
   int
   AuxVarsSize() const
-- 
GitLab