From bdbafdc34c7bf11baa6df47e0191b5d8edf38856 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Fri, 19 Nov 2021 18:01:11 +0100
Subject: [PATCH] =?UTF-8?q?No=20longer=20consider=20an=20equation=20of=20t?=
 =?UTF-8?q?he=20form=20=E2=80=9Cx(+1)=20=3D=200=E2=80=9D=20as=20defining?=
 =?UTF-8?q?=20x=20to=20be=20a=20constant?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Fix this by restricting the detection of constant equations to those where the
variable appears without a lead or lag.

Closes: #83
(cherry picked from commit 1cc512962c292b7cafecfb0550ecd7373e80fd9b)
---
 src/ExprNode.cc | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/ExprNode.cc b/src/ExprNode.cc
index 3432f2cc..a0fc3922 100644
--- a/src/ExprNode.cc
+++ b/src/ExprNode.cc
@@ -5469,10 +5469,13 @@ BinaryOpNode::findConstantEquations(map<VariableNode *, NumConstNode *> &table)
 {
   if (op_code == BinaryOpcode::equal)
     {
-      if (dynamic_cast<VariableNode *>(arg1) && dynamic_cast<NumConstNode *>(arg2))
-        table[dynamic_cast<VariableNode *>(arg1)] = dynamic_cast<NumConstNode *>(arg2);
-      else if (dynamic_cast<VariableNode *>(arg2) && dynamic_cast<NumConstNode *>(arg1))
-        table[dynamic_cast<VariableNode *>(arg2)] = dynamic_cast<NumConstNode *>(arg1);
+      // The variable must be contemporaneous (see #83)
+      if (auto varg1 = dynamic_cast<VariableNode *>(arg1);
+          varg1 && varg1->lag == 0 && dynamic_cast<NumConstNode *>(arg2))
+        table[varg1] = dynamic_cast<NumConstNode *>(arg2);
+      else if (auto varg2 = dynamic_cast<VariableNode *>(arg2);
+               varg2 && varg2->lag == 0 && dynamic_cast<NumConstNode *>(arg1))
+        table[varg2] = dynamic_cast<NumConstNode *>(arg1);
     }
 }
 
-- 
GitLab