From 4f9241442c367420945efd1702aea56983447234 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Thu, 19 Jan 2023 10:59:36 +0100
Subject: [PATCH] =?UTF-8?q?Fix=20size=20of=20dynamic=20derivatives=20(lega?=
 =?UTF-8?q?cy=20representation)=20when=20there=20are=20unused=20exogenous?=
 =?UTF-8?q?=20and=20=E2=80=9Cnostrict=E2=80=9D=20option=20is=20given?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/DynamicModel.cc | 6 ++++++
 src/DynamicModel.hh | 4 +++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index 6fe3301d..9ed5a3ba 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -60,6 +60,7 @@ DynamicModel::DynamicModel(const DynamicModel &m) :
   deriv_id_table{m.deriv_id_table},
   inv_deriv_id_table{m.inv_deriv_id_table},
   dyn_jacobian_cols_table{m.dyn_jacobian_cols_table},
+  dyn_jacobian_ncols{m.dyn_jacobian_ncols},
   max_lag{m.max_lag},
   max_lead{m.max_lead},
   max_endo_lag{m.max_endo_lag},
@@ -104,6 +105,7 @@ DynamicModel::operator=(const DynamicModel &m)
   deriv_id_table = m.deriv_id_table;
   inv_deriv_id_table = m.inv_deriv_id_table;
   dyn_jacobian_cols_table = m.dyn_jacobian_cols_table;
+  dyn_jacobian_ncols = m.dyn_jacobian_ncols;
   max_lag = m.max_lag;
   max_lead = m.max_lead;
   max_endo_lag = m.max_endo_lag;
@@ -2931,6 +2933,10 @@ DynamicModel::computeDynJacobianCols()
       else if (type == SymbolType::exogenousDet)
         dyn_jacobian_cols_table[deriv_id] = ordered_dyn_endo.size() + symbol_table.exo_nbr() + tsid;
     }
+
+  /* NB: the following could differ from dyn_jacobian_cols_table.size() if
+     there are unused exogenous (and “nostrict” option is given) */
+  dyn_jacobian_ncols = ordered_dyn_endo.size() + symbol_table.exo_nbr() + symbol_table.exo_det_nbr();
 }
 
 void
diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh
index 7c47f0c7..6d3dedff 100644
--- a/src/DynamicModel.hh
+++ b/src/DynamicModel.hh
@@ -67,6 +67,8 @@ private:
      representation.
      Contains only endogenous, exogenous and exogenous deterministic */
   map<int, int> dyn_jacobian_cols_table;
+  // Number of columns of the dynamic Jacobian (legacy representation)
+  int dyn_jacobian_ncols;
 
   //! Maximum lag and lead over all types of variables (positive values)
   /*! Set by computeDerivIDs() */
@@ -471,7 +473,7 @@ public:
   {
     return sparse ?
       3*symbol_table.endo_nbr() + symbol_table.exo_nbr() + symbol_table.exo_det_nbr() :
-      dyn_jacobian_cols_table.size();
+      dyn_jacobian_ncols;
   }
 
   void addAllParamDerivId(set<int> &deriv_id_set) override;
-- 
GitLab