From e576dc8c81878978a410a9dec0416cfcc8422db6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Tue, 6 Oct 2020 18:31:13 +0200
Subject: [PATCH] Block decomposition: fix evaluation of recursive variables in
 solved blocks

Ref. #1726
---
 matlab/solve_one_boundary.m   | 5 +++--
 matlab/solve_two_boundaries.m | 3 ++-
 preprocessor                  | 2 +-
 3 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/matlab/solve_one_boundary.m b/matlab/solve_one_boundary.m
index af9b655925..f4009b077f 100644
--- a/matlab/solve_one_boundary.m
+++ b/matlab/solve_one_boundary.m
@@ -92,9 +92,10 @@ for it_=start:incr:finish
     g1=spalloc( Blck_size, Blck_size, nze);
     while ~(cvg==1 || iter>maxit_)
         if is_dynamic
-            [r, ~, T(:, it_), g1] = feval(fname, Block_Num, dynvars_from_endo_simul(y, it_, M), x, params, steady_state, T(:, it_), it_, false);
+            [r, yy, T(:, it_), g1] = feval(fname, Block_Num, dynvars_from_endo_simul(y, it_, M), x, params, steady_state, T(:, it_), it_, false);
+            y(:, it_) = yy(M.lead_lag_incidence(M.maximum_endo_lag+1,:));
         else
-            [r, ~, T, g1] = feval(fname, Block_Num, y, x, params, T);
+            [r, y, T, g1] = feval(fname, Block_Num, y, x, params, T);
         end
         if ~isreal(r)
             max_res=(-(max(max(abs(r))))^2)^0.5;
diff --git a/matlab/solve_two_boundaries.m b/matlab/solve_two_boundaries.m
index d1c595f6b6..25524a0173 100644
--- a/matlab/solve_two_boundaries.m
+++ b/matlab/solve_two_boundaries.m
@@ -83,7 +83,8 @@ while ~(cvg==1 || iter>maxit_)
     r = NaN(Blck_size, periods);
     g1a = spalloc(Blck_size*periods, Blck_size*periods, nze*periods);
     for it_ = y_kmin+(1:periods)
-        [r(:, it_-y_kmin), ~, T(:, it_), g1]=feval(fname, Block_Num, dynvars_from_endo_simul(y, it_, M), x, params, steady_state, T(:, it_), it_, false);
+        [r(:, it_-y_kmin), yy, T(:, it_), g1]=feval(fname, Block_Num, dynvars_from_endo_simul(y, it_, M), x, params, steady_state, T(:, it_), it_, false);
+        y(:, it_) = yy(M.lead_lag_incidence(M.maximum_endo_lag+1,:));
         if periods == 1
             g1a = g1(:, Blck_size+(1:Blck_size));
         elseif it_ == y_kmin+1
diff --git a/preprocessor b/preprocessor
index e4687bb976..4560639eb4 160000
--- a/preprocessor
+++ b/preprocessor
@@ -1 +1 @@
-Subproject commit e4687bb97616a19432e1b46565b6b6065276b657
+Subproject commit 4560639eb4035448cc8adc4535a1957fa82924ab
-- 
GitLab