From 4aadc533a84e9270bc31dbaa2f447bcce3d2854e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Argos=29?=
 <stepan@adjemian.eu>
Date: Thu, 13 Mar 2025 15:48:42 +0100
Subject: [PATCH] Efficiency change. Update initial condition of SEP auxiliary
 model...

In each iteration using the solution from previous step. Previously
the initial guess for the auxiliary stochastic perfect forsight model
was the steady state in all periods and (future) worlds.
---
 matlab/ep/extended_path.m                     | 10 ++++---
 matlab/ep/extended_path_core.m                | 27 +++++++++++--------
 ...lve_stochastic_perfect_foresight_model_0.m |  6 +++--
 ...lve_stochastic_perfect_foresight_model_1.m |  6 +++--
 4 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/matlab/ep/extended_path.m b/matlab/ep/extended_path.m
index c4a590d0c..1072698f3 100644
--- a/matlab/ep/extended_path.m
+++ b/matlab/ep/extended_path.m
@@ -68,23 +68,25 @@ while (t <= samplesize)
         initialguess = [];
     end
     if t>2
-        [endogenous_variables_paths(:,t), info_convergence, endogenousvariablespaths] = extended_path_core(innovations.positive_var_indx, ...
+        [endogenous_variables_paths(:,t), info_convergence, endogenousvariablespaths, y] = extended_path_core(innovations.positive_var_indx, ...
                                                                                                            spfm_exo_simul, ...
                                                                                                            endogenous_variables_paths(:,t-1), ...
                                                                                                            pfm, ...
                                                                                                            M_, ...
                                                                                                            options_, ...
                                                                                                            oo_, ...
-                                                                                                           initialguess);
+                                                                                                           initialguess, ...
+                                                                                                           y);
     else
-        [endogenous_variables_paths(:,t), info_convergence, endogenousvariablespaths, pfm, options_] = extended_path_core(innovations.positive_var_indx, ...
+        [endogenous_variables_paths(:,t), info_convergence, endogenousvariablespaths, y, pfm, options_] = extended_path_core(innovations.positive_var_indx, ...
                                                                                                                           spfm_exo_simul, ...
                                                                                                                           endogenous_variables_paths(:,t-1), ...
                                                                                                                           pfm, ...
                                                                                                                           M_, ...
                                                                                                                           options_, ...
                                                                                                                           oo_, ...
-                                                                                                                          initialguess);
+                                                                                                                          initialguess, ...
+                                                                                                                          []);
     end
     if ~info_convergence
         msg = sprintf('No convergence of the (stochastic) perfect foresight solver (in period %s)!', int2str(t));
diff --git a/matlab/ep/extended_path_core.m b/matlab/ep/extended_path_core.m
index 237d99b80..ec0aa4736 100644
--- a/matlab/ep/extended_path_core.m
+++ b/matlab/ep/extended_path_core.m
@@ -1,11 +1,12 @@
-function [y, info_convergence, endogenousvariablespaths, pfm, options_] = extended_path_core(positive_var_indx, ...
+function [y1, info_convergence, endogenousvariablespaths, y, pfm, options_] = extended_path_core(positive_var_indx, ...
                                                                                              exo_simul, ...
                                                                                              initial_conditions ,...
                                                                                              pfm, ...
                                                                                              M_, ...
                                                                                              options_, ...
                                                                                              oo_, ...
-                                                                                             initialguess)
+                                                                                             initialguess, ...
+                                                                                             y)
 
 % Copyright © 2016-2025 Dynare Team
 %
@@ -41,7 +42,7 @@ stack_solve_algo = ep.stack_solve_algo;
 if init% Compute first order solution (Perturbation)...
     endo_simul = simult_(M_,options_,initial_conditions,oo_.dr,exo_simul(2:end,:),1);
 else
-    if nargin==8 && ~isempty(initialguess)
+    if nargin>7 && ~isempty(initialguess)
         % Note that the first column of initialguess should be equal to initial_conditions.
         endo_simul = initialguess;
     else
@@ -49,6 +50,10 @@ else
     end
 end
 
+if nargin~=9
+    y = [];
+end
+
 oo_.endo_simul = endo_simul;
 
 if debug
@@ -77,17 +82,17 @@ else
     switch(algo)
       case 0
         % Full tree of future trajectories.
-        if nargout>3
-            [flag, endogenousvariablespaths, errorcode, ~, pfm, options_] = solve_stochastic_perfect_foresight_model_0(endo_simul, exo_simul, options_, M_, pfm);
+        if nargout>4
+            [flag, endogenousvariablespaths, errorcode, y, pfm, options_] = solve_stochastic_perfect_foresight_model_0(endo_simul, exo_simul, y, options_, M_, pfm);
         else
-            [flag, endogenousvariablespaths, errorcode] = solve_stochastic_perfect_foresight_model_0(endo_simul, exo_simul, options_, M_, pfm);
+            [flag, endogenousvariablespaths, errorcode, y] = solve_stochastic_perfect_foresight_model_0(endo_simul, exo_simul, y, options_, M_, pfm);
         end
       case 1
         % Sparse tree of future histories.
-        if nargout>3
-            [flag, endogenousvariablespaths, errorcode, ~, pfm, options_] = solve_stochastic_perfect_foresight_model_1(endo_simul, exo_simul, options_, M_, pfm);
+        if nargout>4
+            [flag, endogenousvariablespaths, errorcode, y, pfm, options_] = solve_stochastic_perfect_foresight_model_1(endo_simul, exo_simul, y, options_, M_, pfm);
         else
-            [flag, endogenousvariablespaths, errorcode] = solve_stochastic_perfect_foresight_model_1(endo_simul, exo_simul, options_, M_, pfm);
+            [flag, endogenousvariablespaths, errorcode, y] = solve_stochastic_perfect_foresight_model_1(endo_simul, exo_simul, y, options_, M_, pfm);
         end
     end
     info_convergence = ~flag;
@@ -98,7 +103,7 @@ if ~info_convergence && ~options_.no_homotopy
 end
 
 if info_convergence
-    y = endogenousvariablespaths(:,2);
+    y1 = endogenousvariablespaths(:,2);
 else
-    y = NaN(size(endo_nbr,1));
+    y1 = NaN(size(endo_nbr,1));
 end
diff --git a/matlab/ep/solve_stochastic_perfect_foresight_model_0.m b/matlab/ep/solve_stochastic_perfect_foresight_model_0.m
index 19e77a831..efdaf6247 100644
--- a/matlab/ep/solve_stochastic_perfect_foresight_model_0.m
+++ b/matlab/ep/solve_stochastic_perfect_foresight_model_0.m
@@ -1,4 +1,4 @@
-function [errorflag, endo_simul, errorcode, y, pfm, options_] = solve_stochastic_perfect_foresight_model_0(endo_simul, exo_simul, options_, M_, pfm)
+function [errorflag, endo_simul, errorcode, y, pfm, options_] = solve_stochastic_perfect_foresight_model_0(endo_simul, exo_simul, y, options_, M_, pfm)
 
 % Copyright © 2025 Dynare Team
 %
@@ -148,7 +148,9 @@ end
 
 pfm.Y = repmat(endo_simul(:),1,pfm.world_nbr);
 
-y = repmat(pfm.steady_state, pfm.dimension/pfm.ny, 1);
+if isempty(y)
+    y = repmat(pfm.steady_state, pfm.dimension/pfm.ny, 1);
+end
 
 if update_options_struct
     % Set algorithm
diff --git a/matlab/ep/solve_stochastic_perfect_foresight_model_1.m b/matlab/ep/solve_stochastic_perfect_foresight_model_1.m
index ccdc882f6..19eb06738 100644
--- a/matlab/ep/solve_stochastic_perfect_foresight_model_1.m
+++ b/matlab/ep/solve_stochastic_perfect_foresight_model_1.m
@@ -1,4 +1,4 @@
-function [errorflag, endo_simul, errorcode, y, pfm, options_] = solve_stochastic_perfect_foresight_model_1(endo_simul, exo_simul, options_, M_, pfm)
+function [errorflag, endo_simul, errorcode, y, pfm, options_] = solve_stochastic_perfect_foresight_model_1(endo_simul, exo_simul, y, options_, M_, pfm)
 
 % Copyright © 2012-2025 Dynare Team
 %
@@ -113,7 +113,9 @@ if update_pfm_struct
 
 end
 
-y = repmat(pfm.steady_state, pfm.block_nbr, 1);
+if isempty(y)
+    y = repmat(pfm.steady_state, pfm.block_nbr, 1);
+end
 
 if update_options_struct
     % Set algorithm
-- 
GitLab