diff --git a/StaticModel.cc b/StaticModel.cc index 5a2fbdec7dc0f83be3a48ede5facb9c2fb373b69..bd14af7ce54db67b5e56c76362b380eb0b36f023 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 79fa548813bdbba01f58fbf41b5bfb6b011b2a33..0a15fc070e1bdd60c21495d8bcf2477bc9585ecc 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 826d7a9868e5773f3aaaf14542a1c649a5e0dec7..4f623dfdd6416bb912f48c676426a0f265724e69 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; };