From 8acee8fd54763f891e1903e1a8d3d0ae792418da Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan@dynare.org>
Date: Tue, 11 Sep 2018 15:29:51 +0200
Subject: [PATCH] fix AR and EC matrices for double diff

---
 src/ExprNode.cc    | 48 ++++++++++++++++++++++++++++------------------
 src/SymbolTable.cc |  3 +--
 2 files changed, 30 insertions(+), 21 deletions(-)

diff --git a/src/ExprNode.cc b/src/ExprNode.cc
index f2af63bf..6f4878bf 100644
--- a/src/ExprNode.cc
+++ b/src/ExprNode.cc
@@ -5464,6 +5464,11 @@ BinaryOpNode::fillAutoregressiveRowHelper(expr_t arg1, expr_t arg2,
   if (endogs.size() != 1)
     return;
 
+  arg1->collectDynamicVariables(SymbolType::endogenous, tmp);
+  arg1->collectDynamicVariables(SymbolType::exogenous, tmp);
+  if (tmp.size() != 0)
+    return;
+
   int lhs_symb_id = endogs.begin()->first;
   int lag = endogs.begin()->second;
   if (datatree.symbol_table.isAuxiliaryVariable(lhs_symb_id))
@@ -5471,14 +5476,10 @@ BinaryOpNode::fillAutoregressiveRowHelper(expr_t arg1, expr_t arg2,
       int orig_lhs_symb_id = datatree.symbol_table.getOrigSymbIdForDiffAuxVar(lhs_symb_id);
       if (find(lhs.begin(), lhs.end(), orig_lhs_symb_id) == lhs.end())
         return;
-      lag = -(datatree.symbol_table.getOrigLeadLagForDiffAuxVar(lhs_symb_id) - 1);
+      lag = -1 * datatree.symbol_table.getOrigLeadLagForDiffAuxVar(lhs_symb_id);
       lhs_symb_id = orig_lhs_symb_id;
     }
 
-  arg1->collectDynamicVariables(SymbolType::endogenous, tmp);
-  arg1->collectDynamicVariables(SymbolType::exogenous, tmp);
-  if (tmp.size() != 0)
-    return;
 
   if (AR.find(make_tuple(eqn, -lag, lhs_symb_id)) != AR.end())
     {
@@ -5525,20 +5526,29 @@ BinaryOpNode::fillErrorCorrectionRowHelper(expr_t arg1, expr_t arg2,
   int lhs_symb_id = -1;
   int max_lag = 0;
   for (const auto & it : endogs)
-    if (find(lhs.begin(), lhs.end(), it.first) != lhs.end())
-      if (encountered_trend_var)
-        {
-          cerr << "BinaryOpNode::fillErrorCorrectionRowHelper: Error filling EC matrix: "
-               << "two trend variables encountered in EC term" << endl;
-          exit(EXIT_FAILURE);
-        }
-      else
-        {
-          lhs_symb_id = it.first;
-          if (it.second < max_lag)
-            max_lag = it.second;
-          encountered_trend_var = true;
-        }
+    {
+      bool isauxvar = datatree.symbol_table.isAuxiliaryVariable(it.first);
+      int tmp_symb_id = isauxvar ?
+        datatree.symbol_table.getOrigSymbIdForDiffAuxVar(it.first) : it.first;
+
+      if (find(lhs.begin(), lhs.end(), tmp_symb_id) != lhs.end())
+        if (encountered_trend_var)
+          {
+            cerr << "BinaryOpNode::fillErrorCorrectionRowHelper: Error filling EC matrix: "
+                 << "two trend variables encountered in EC term" << endl;
+            exit(EXIT_FAILURE);
+          }
+        else
+          {
+            encountered_trend_var = true;
+            lhs_symb_id = tmp_symb_id;
+            int tmp_lag = it.second;
+            if (isauxvar)
+              tmp_lag = -1 * datatree.symbol_table.getOrigLeadLagForDiffAuxVar(it.first);
+            if (tmp_lag < max_lag)
+              max_lag = tmp_lag;
+          }
+    }
 
   if (!encountered_trend_var)
     return;
diff --git a/src/SymbolTable.cc b/src/SymbolTable.cc
index 335a5418..78198671 100644
--- a/src/SymbolTable.cc
+++ b/src/SymbolTable.cc
@@ -879,8 +879,7 @@ SymbolTable::getOrigLeadLagForDiffAuxVar(int diff_aux_var_symb_id) const noexcep
 {
   int lag = 0;
   for (const auto & aux_var : aux_vars)
-    if ((aux_var.get_type() == AuxVarType::diff
-         || aux_var.get_type() == AuxVarType::diffLag)
+    if (aux_var.get_type() == AuxVarType::diffLag
         && aux_var.get_symb_id() == diff_aux_var_symb_id)
       lag += 1 + getOrigLeadLagForDiffAuxVar(aux_var.get_orig_symb_id());
   return lag;
-- 
GitLab