From 6613d1d41e8d80e15e5a104ba0ba2e12af3432c0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Wed, 30 Oct 2024 14:19:21 +0100
Subject: [PATCH] get_ar_ec_matrices.m: use sparse representation for the model

Ref. #1859
---
 matlab/get_ar_ec_matrices.m | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/matlab/get_ar_ec_matrices.m b/matlab/get_ar_ec_matrices.m
index 38ddaa049..cddf260ff 100644
--- a/matlab/get_ar_ec_matrices.m
+++ b/matlab/get_ar_ec_matrices.m
@@ -68,12 +68,10 @@ else
 end
 
 %% Call Dynamic Function
-[~, g1] = feval([M_.fname '.dynamic'], ...
-    ones(max(max(M_.lead_lag_incidence)), 1), ...
-    ones(1, M_.exo_nbr), ...
-    M_.params, ...
-    zeros(M_.endo_nbr, 1), ...
-    1);
+g1 = feval([M_.fname '.sparse.dynamic_g1'], ones(3*M_.endo_nbr, 1), ones(1, M_.exo_nbr), ...
+           M_.params, zeros(M_.endo_nbr, 1), ...
+           M_.dynamic_g1_sparse_rowval, M_.dynamic_g1_sparse_colval, ...
+           M_.dynamic_g1_sparse_colptr);
 
 % Choose rows of Jacobian based on equation tags
 ntags = length(M_.(model_type).(model_name).eqtags);
@@ -88,8 +86,7 @@ g1 = -1 * g1(g1rows, :);
 
 % Check for leads
 if rows(M_.lead_lag_incidence) == 3
-    idxs = M_.lead_lag_incidence(3, M_.lead_lag_incidence(3, :) ~= 0);
-    assert(~any(any(g1(g1rows, idxs))), ...
+    assert(~any(any(g1(g1rows, 2*M_.endo_nbr+(1:M_.endo_nbr)))), ...
         ['You cannot have leads in the equations specified by ' strjoin(M_.(model_type).(model_name).eqtags, ',')]);
 end
 
@@ -152,11 +149,11 @@ for i = 1:length(lhs)
     for j = 1:length(rhsvars{i}.vars)
         var = rhsvars{i}.vars(j);
         if rhsvars{i}.lags(j) == -1
-            g1col = M_.lead_lag_incidence(1, var);
+            g1col = var;
         else
-            g1col = M_.lead_lag_incidence(2, var);
+            g1col = var + M_.endo_nbr;
         end
-        if g1col ~= 0 && any(g1(:, g1col))
+        if any(g1(:, g1col))
             if rhsvars{i}.arRhsIdxs(j) > 0
                 % Fill AR
                 lag = findLagForVar(var, -rhsvars{i}.lags(j), 0, lhs);
-- 
GitLab