From b55e89349dd05550da38d7d79d2d732486099269 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Tue, 5 Nov 2024 18:09:53 +0100
Subject: [PATCH] Drop M_.exo_det_length, rather use a field in dr structure

This will facilitate the introduction of dates in shock sequences.
---
 matlab/+gui/+perfect_foresight/run.m          |  3 +--
 matlab/+gui/+stochastic-simulation/read.m     |  3 +--
 matlab/stochastic_solver/simultxdet.m         |  4 ++--
 matlab/stochastic_solver/stochastic_solvers.m | 24 ++++++++++++-------
 preprocessor                                  |  2 +-
 5 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/matlab/+gui/+perfect_foresight/run.m b/matlab/+gui/+perfect_foresight/run.m
index 9b4b22c72..28bc3bd6a 100644
--- a/matlab/+gui/+perfect_foresight/run.m
+++ b/matlab/+gui/+perfect_foresight/run.m
@@ -13,7 +13,7 @@ function run(json)
 % SPECIAL REQUIREMENTS
 %   none
 
-% Copyright © 2019-2023 Dynare Team
+% Copyright © 2019-2024 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -103,7 +103,6 @@ if ~isempty(jm.anticipated_transitory_shocks)
             'periods', s.start_date:s.end_date, ...
             'value', s.value)];
     end
-    M_.exo_det_length = 0;
 end
 
 %% Make unanticipated shock map
diff --git a/matlab/+gui/+stochastic-simulation/read.m b/matlab/+gui/+stochastic-simulation/read.m
index 080b0d331..f5b767fb8 100644
--- a/matlab/+gui/+stochastic-simulation/read.m
+++ b/matlab/+gui/+stochastic-simulation/read.m
@@ -13,7 +13,7 @@ function read(json)
 % SPECIAL REQUIREMENTS
 %   none
 
-% Copyright © 2019-2020 Dynare Team
+% Copyright © 2019-2024 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -36,7 +36,6 @@ global M_ options_ oo_
 jm = loadjson_(json, 'SimplifyCell', 1);
 data2json=struct();
 
-M_.exo_det_length = 0;
 for nshocks = 1:length(jm.stochasticshocksdescription)
 	covartype=jm.stochasticshocksdescription{nshocks}.shockattributevalue;
 	thisshock=(jm.stochasticshocksdescription{nshocks}.shockindex)+1;
diff --git a/matlab/stochastic_solver/simultxdet.m b/matlab/stochastic_solver/simultxdet.m
index 55806e2c1..c0a10c28b 100644
--- a/matlab/stochastic_solver/simultxdet.m
+++ b/matlab/stochastic_solver/simultxdet.m
@@ -87,7 +87,7 @@ if iorder == 1
         tempx2 = tempx1-repmat(dr.ys(dr.order_var),1,ykmin);
         tempx = tempx2(k2);
         y_(dr.order_var,i) = dr.ys(dr.order_var)+dr.ghx*tempx+dr.ghu*ex(i-ykmin,:)';
-        for j=1:min(ykmin+M_.exo_det_length+1-i,M_.exo_det_length)
+        for j=1:min(ykmin+dr.exo_det_length+1-i,dr.exo_det_length)
             y_(dr.order_var,i) = y_(dr.order_var,i) + dr.ghud{j}*(ex_det(i+j-1,:)'-exo_det_steady_state);
         end
 
@@ -105,7 +105,7 @@ elseif iorder == 2
         y_(dr.order_var,i) = dr.ys(dr.order_var)+dr.ghs2/2+dr.ghx*tempx+ ...
             dr.ghu*tempu+0.5*(dr.ghxx*tempxx+dr.ghuu*tempuu)+dr.ghxu* ...
             tempxu;
-        for j=1:min(ykmin+M_.exo_det_length+1-i,M_.exo_det_length)
+        for j=1:min(ykmin+dr.exo_det_length+1-i,dr.exo_det_length)
             tempud = ex_det(i+j-1,:)'-exo_det_steady_state;
             tempudud = kron(tempud,tempud);
             tempxud = kron(tempx,tempud);
diff --git a/matlab/stochastic_solver/stochastic_solvers.m b/matlab/stochastic_solver/stochastic_solvers.m
index d382d34e4..787f68708 100644
--- a/matlab/stochastic_solver/stochastic_solvers.m
+++ b/matlab/stochastic_solver/stochastic_solvers.m
@@ -263,9 +263,17 @@ if M_.exo_det_nbr > 0
     fudet = g1(:,3*M_.endo_nbr+M_.exo_nbr+1:end);
     M1 = inv(f0+[zeros(M_.endo_nbr,nstatic) f1*gx zeros(M_.endo_nbr,nsfwrd-nboth)]);
     M2 = M1*f1;
-    dr.ghud = cell(M_.exo_det_length,1);
+
+    dr.exo_det_length = 0;
+    for i = 1:length(M_.det_shocks)
+        if M_.det_shocks(i).exo_id
+            dr.exo_det_length = max(dr.exo_det_length, max(M_.det_shocks(i).periods));
+        end
+    end
+
+    dr.ghud = cell(dr.exo_det_length,1);
     dr.ghud{1} = -M1*fudet;
-    for i = 2:M_.exo_det_length
+    for i = 2:dr.exo_det_length
         dr.ghud{i} = -M2*dr.ghud{i-1}(end-nsfwrd+1:end,:);
     end
 
@@ -290,31 +298,31 @@ if M_.exo_det_nbr > 0
                                                           M_.exo_nbr)];
         zud=[zeros(nspred,M_.exo_det_nbr);dr.ghud{1};gx(:,1:nspred)*hud;zeros(M_.exo_nbr,M_.exo_det_nbr);eye(M_.exo_det_nbr)];
         R1 = g2_reordered*kron(zx,zud);
-        dr.ghxud = cell(M_.exo_det_length,1);
+        dr.ghxud = cell(dr.exo_det_length,1);
         kf = M_.endo_nbr-nfwrd-nboth+1:M_.endo_nbr;
         kp = nstatic+[1:nspred];
         dr.ghxud{1} = -M1*(R1+f1*dr.ghxx(kf,:)*kron(dr.ghx(kp,:),dr.ghud{1}(kp,:)));
         Eud = eye(M_.exo_det_nbr);
-        for i = 2:M_.exo_det_length
+        for i = 2:dr.exo_det_length
             hudi = dr.ghud{i}(kp,:);
             zudi=[zeros(nspred,M_.exo_det_nbr);dr.ghud{i};gx(:,1:nspred)*hudi;zeros(M_.exo_nbr+M_.exo_det_nbr,M_.exo_det_nbr)];
             R2 = g2_reordered*kron(zx,zudi);
             dr.ghxud{i} = -M2*(dr.ghxud{i-1}(kf,:)*kron(dr.Gy,Eud)+dr.ghxx(kf,:)*kron(dr.ghx(kp,:),dr.ghud{i}(kp,:)))-M1*R2;
         end
         R1 = g2_reordered*kron(zu,zud);
-        dr.ghudud = cell(M_.exo_det_length,1);
+        dr.ghudud = cell(dr.exo_det_length,1);
         dr.ghuud{1} = -M1*(R1+f1*dr.ghxx(kf,:)*kron(dr.ghu(kp,:),dr.ghud{1}(kp,:)));
         Eud = eye(M_.exo_det_nbr);
-        for i = 2:M_.exo_det_length
+        for i = 2:dr.exo_det_length
             hudi = dr.ghud{i}(kp,:);
             zudi=[zeros(nspred,M_.exo_det_nbr);dr.ghud{i};gx(:,1:nspred)*hudi;zeros(M_.exo_nbr+M_.exo_det_nbr,M_.exo_det_nbr)];
             R2 = g2_reordered*kron(zu,zudi);
             dr.ghuud{i} = -M2*dr.ghxud{i-1}(kf,:)*kron(hu,Eud)-M1*R2;
         end
         R1 = g2_reordered*kron(zud,zud);
-        dr.ghudud = cell(M_.exo_det_length,M_.exo_det_length);
+        dr.ghudud = cell(dr.exo_det_length,dr.exo_det_length);
         dr.ghudud{1,1} = -M1*R1-M2*dr.ghxx(kf,:)*kron(hud,hud);
-        for i = 2:M_.exo_det_length
+        for i = 2:dr.exo_det_length
             hudi = dr.ghud{i}(nstatic+1:nstatic+nspred,:);
             zudi=[zeros(nspred,M_.exo_det_nbr);dr.ghud{i};gx(:,1:nspred)*hudi+dr.ghud{i-1}(kf,:);zeros(M_.exo_nbr+M_.exo_det_nbr,M_.exo_det_nbr)];
             R2 = g2_reordered*kron(zudi,zudi);
diff --git a/preprocessor b/preprocessor
index b2b2801bc..a091c26ce 160000
--- a/preprocessor
+++ b/preprocessor
@@ -1 +1 @@
-Subproject commit b2b2801bcf063111214220a982c51b2c3eafe1f0
+Subproject commit a091c26ced0fba215851485e824502230fccb73f
-- 
GitLab