From ac9d2e7277f3eb597b46e01e0deeb4516cd4776c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Wed, 19 Jan 2022 15:05:59 +0100
Subject: [PATCH] Fix orig_lead_lag field for unary op auxiliary variables

Ref. dynare#1843

(cherry picked from commit 064a3dcd773c8c27afa5a64385d84b1444202820)
---
 src/ExprNode.cc | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/ExprNode.cc b/src/ExprNode.cc
index bd36441d..b2bf1a19 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));
-- 
GitLab