From 32fb90d5f3c729f0744ad97ffc7c51e31cb3731b Mon Sep 17 00:00:00 2001
From: Michel Juillard <michel.juillard@mjui.fr>
Date: Mon, 21 Mar 2016 11:51:48 +0100
Subject: [PATCH] completing replacement of auxiliary variables in static model

---
 StaticModel.cc | 26 ++++++++++++--------------
 SymbolTable.cc |  9 +++++++++
 SymbolTable.hh |  2 ++
 3 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/StaticModel.cc b/StaticModel.cc
index 5a2fbdec..bd14af7c 100644
--- a/StaticModel.cc
+++ b/StaticModel.cc
@@ -1052,17 +1052,11 @@ StaticModel::computingPass(const eval_context_t &eval_context, bool no_tmp_terms
   initializeVariablesAndEquations();
 
   vector<BinaryOpNode *> neweqs;
-  for (unsigned int eq = 0; eq < equations.size(); eq++)
-    if (eq < equations.size() - aux_equations.size())
-      {
-        expr_t eq_tmp = equations[eq]->substituteStaticAuxiliaryVariable();
-        neweqs.push_back(dynamic_cast<BinaryOpNode *>(eq_tmp->toStatic(*this)));
-      }
-    else
-      {
-        expr_t eq_tmp = equations[eq]->substituteStaticAuxiliaryDefinition();
-        neweqs.push_back(dynamic_cast<BinaryOpNode *>(eq_tmp->toStatic(*this)));
-      }
+  for (unsigned int eq = 0; eq < equations.size() - aux_equations.size(); eq++)
+    {
+      expr_t eq_tmp = equations[eq]->substituteStaticAuxiliaryVariable();
+      neweqs.push_back(dynamic_cast<BinaryOpNode *>(eq_tmp->toStatic(*this)));
+    }
 
   equations.clear();
   copy(neweqs.begin(),neweqs.end(),back_inserter(equations));
@@ -1070,8 +1064,12 @@ StaticModel::computingPass(const eval_context_t &eval_context, bool no_tmp_terms
   set<int> vars;
 
   for (int i = 0; i < symbol_table.endo_nbr(); i++)
-    vars.insert(getDerivID(symbol_table.getID(eEndogenous, i), 0));
-
+    {
+      int id = symbol_table.getID(eEndogenous, i);
+      if (!symbol_table.isAuxiliaryVariableButNotMultiplier(id))
+                vars.insert(getDerivID(id, 0));
+    }        
+ 
   // Launch computations
   cout << "Computing static model derivatives:" << endl
        << " - order 1" << endl;
@@ -2126,7 +2124,7 @@ void StaticModel::writeAuxVarRecursiveDefinitions(const string &basename, const
 
   for (int i = 0; i < (int) aux_equations.size(); i++)
     {
-      dynamic_cast<ExprNode *>(aux_equations[i])->writeOutput(output, oMatlabStaticModel, temporary_terms, tef_terms);
+      dynamic_cast<ExprNode *>(aux_equations[i]->substituteStaticAuxiliaryDefinition())->writeOutput(output, oMatlabStaticModel, temporary_terms, tef_terms);
       output << ";" << endl;
     }
 }
diff --git a/SymbolTable.cc b/SymbolTable.cc
index 79fa5488..0a15fc07 100644
--- a/SymbolTable.cc
+++ b/SymbolTable.cc
@@ -786,6 +786,15 @@ SymbolTable::isAuxiliaryVariable(int symb_id) const
   return false;
 }
 
+bool
+SymbolTable::isAuxiliaryVariableButNotMultiplier(int symb_id) const
+{
+  for (int i = 0; i < (int) aux_vars.size(); i++)
+    if (aux_vars[i].get_symb_id() == symb_id && aux_vars[i].get_type() != avMultiplier)
+      return true;
+  return false;
+}
+
 set<int>
 SymbolTable::getOrigEndogenous() const
 {
diff --git a/SymbolTable.hh b/SymbolTable.hh
index 826d7a98..4f623dfd 100644
--- a/SymbolTable.hh
+++ b/SymbolTable.hh
@@ -325,6 +325,8 @@ public:
   set <int> getEndogenous() const;
   //! Is a given symbol an auxiliary variable
   bool isAuxiliaryVariable(int symb_id) const;
+  //! Is a given symbol an auxiliary variable but not a Lagrange multiplier
+  bool isAuxiliaryVariableButNotMultiplier(int symb_id) const;
   //! Get list of endogenous variables without aux vars
   set <int> getOrigEndogenous() const;
 };
-- 
GitLab