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