diff --git a/src/ExprNode.cc b/src/ExprNode.cc index bd36441d9e96517292f044daa9dbabcba3347a01..b2bf1a19f162e66e49326abe9dd170f169eb9fd3 100644 --- a/src/ExprNode.cc +++ b/src/ExprNode.cc @@ -1,5 +1,5 @@ /* - * Copyright © 2007-2021 Dynare Team + * Copyright © 2007-2022 Dynare Team * * This file is part of Dynare. * @@ -3471,7 +3471,10 @@ UnaryOpNode::substituteUnaryOpNodes(const lag_equivalence_table_t &nodes, subst_ must be substituted. We create the auxiliary variable and fill the substitution table for all those similar nodes, in an iteration going from leads to lags. */ - int base_index = 0; + int base_index = it->second.rbegin()->first; // Within the equivalence class, + // index of the node that will + // be used as the definition for + // the aux var. VariableNode *aux_var = nullptr; for (auto rit = it->second.rbegin(); rit != it->second.rend(); ++rit) if (rit == it->second.rbegin()) @@ -3486,9 +3489,9 @@ UnaryOpNode::substituteUnaryOpNodes(const lag_equivalence_table_t &nodes, subst_ exit(EXIT_FAILURE); } + auto argsubst_shifted = argsubst->decreaseLeadsLags(index - base_index); int symb_id; - auto vn = dynamic_cast<VariableNode *>(argsubst); - if (!vn) + if (auto vn = dynamic_cast<VariableNode *>(argsubst_shifted); !vn) symb_id = datatree.symbol_table.addUnaryOpAuxiliaryVar(this->idx, dynamic_cast<UnaryOpNode *>(rit->second), unary_op); else symb_id = datatree.symbol_table.addUnaryOpAuxiliaryVar(this->idx, dynamic_cast<UnaryOpNode *>(rit->second), unary_op, @@ -3497,7 +3500,6 @@ UnaryOpNode::substituteUnaryOpNodes(const lag_equivalence_table_t &nodes, subst_ neweqs.push_back(datatree.AddEqual(aux_var, dynamic_cast<UnaryOpNode *>(rit->second))); subst_table[rit->second] = dynamic_cast<VariableNode *>(aux_var); - base_index = rit->first; } else subst_table[rit->second] = dynamic_cast<VariableNode *>(aux_var->decreaseLeadsLags(base_index - rit->first));