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