From df9c7d85b80784faa646c516281ae966d3e03e01 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Fri, 20 Oct 2023 15:13:11 -0400
Subject: [PATCH] =?UTF-8?q?Error=20out=20if=20perfect=5Fforesight=5Fsolver?=
 =?UTF-8?q?=20is=20called=20with=20shocks(learnt=5Fin=3D=E2=80=A6)=20or=20?=
 =?UTF-8?q?endval(learnt=5Fin=3D=E2=80=A6)=20blocks?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This is to prevent the accidental use of the regular perfect foresight solver
when one actually wants the one with expectation errors.
---
 .../perfect_foresight_solver.m                | 13 ++++++++++--
 ...foresight_with_expectation_errors_solver.m |  2 +-
 tests/deterministic_simulations/pfwee.mod     | 20 +++++++++++--------
 .../pfwee_constant_sim_length.mod             | 20 +++++++++++--------
 .../pfwee_learnt_in.mod                       | 20 +++++++++++--------
 5 files changed, 48 insertions(+), 27 deletions(-)

diff --git a/matlab/perfect-foresight-models/perfect_foresight_solver.m b/matlab/perfect-foresight-models/perfect_foresight_solver.m
index 1f2586524e..a7fa866c53 100644
--- a/matlab/perfect-foresight-models/perfect_foresight_solver.m
+++ b/matlab/perfect-foresight-models/perfect_foresight_solver.m
@@ -1,8 +1,10 @@
-function perfect_foresight_solver()
+function perfect_foresight_solver(no_error_if_learnt_in_is_present)
 % Computes deterministic simulations
 %
 % INPUTS
-%   None
+%   no_error_if_learnt_in_is_present [boolean, optional]
+%       if true, then do not error out if a shocks(learnt_in=…) or endval(learnt_in=…)
+%       block is present
 %
 % OUTPUTS
 %   none
@@ -33,6 +35,13 @@ global M_ options_ oo_ ys0_ ex0_
 
 check_input_arguments(options_, M_, oo_);
 
+if nargin == 0
+    no_error_if_learnt_in_is_present = false;
+end
+if (~isempty(M_.learnt_shocks) || ~isempty(M_.learnt_endval)) && ~no_error_if_learnt_in_is_present
+    error('A shocks(learnt_in=...) or endval(learnt_in=...) block is present. You want to call perfect_foresight_with_expectations_error_setup and perfect_foresight_with_expectations_error_solver.')
+end
+
 periods = options_.periods;
 
 if options_.debug
diff --git a/matlab/perfect-foresight-models/perfect_foresight_with_expectation_errors_solver.m b/matlab/perfect-foresight-models/perfect_foresight_with_expectation_errors_solver.m
index 5c05102eba..dad8e57a79 100644
--- a/matlab/perfect-foresight-models/perfect_foresight_with_expectation_errors_solver.m
+++ b/matlab/perfect-foresight-models/perfect_foresight_with_expectation_errors_solver.m
@@ -67,7 +67,7 @@ while info_period <= periods
 
     options_.periods = sim_length;
 
-    perfect_foresight_solver;
+    perfect_foresight_solver(true);
 
     if ~oo_.deterministic_simulation.status
         error('perfect_foresight_with_expectation_errors_solver: failed to compute solution for information available at period %d\n', info_period)
diff --git a/tests/deterministic_simulations/pfwee.mod b/tests/deterministic_simulations/pfwee.mod
index fb7f4cf015..8867998f7a 100644
--- a/tests/deterministic_simulations/pfwee.mod
+++ b/tests/deterministic_simulations/pfwee.mod
@@ -42,11 +42,13 @@ oo_.exo_steady_state = orig_exo_steady_state;
 
 perfect_foresight_setup;
 
-// Information arriving in period 1 (temp shock now)
+verbatim;
+
+% Information arriving in period 1 (temp shock now)
 oo_.exo_simul(2,1) = 1.2;
-perfect_foresight_solver;
+perfect_foresight_solver(true);
 
-// Information arriving in period 2 (temp shock now + permanent shock in future)
+% Information arriving in period 2 (temp shock now + permanent shock in future)
 oo_.exo_simul(3,1) = 1.3;
 oo_.exo_steady_state = 1.1;
 oo_.exo_simul(end, 1) = oo_.exo_steady_state;
@@ -57,11 +59,11 @@ saved_endo = oo_.endo_simul(:, 1);
 saved_exo = oo_.exo_simul(1, :);
 oo_.endo_simul = oo_.endo_simul(:, 2:end);
 oo_.exo_simul = oo_.exo_simul(2:end, :);
-perfect_foresight_solver;
+perfect_foresight_solver(true);
 oo_.endo_simul = [ saved_endo oo_.endo_simul ];
 oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
 
-// Information arriving in period 3 (temp shock now + permanent shock in future)
+% Information arriving in period 3 (temp shock now + permanent shock in future)
 oo_.exo_simul(4,1) = 1.4;
 oo_.exo_steady_state = 1.2;
 oo_.exo_simul(end, 1) = oo_.exo_steady_state;
@@ -72,11 +74,11 @@ saved_endo = oo_.endo_simul(:, 1:2);
 saved_exo = oo_.exo_simul(1:2, :);
 oo_.endo_simul = oo_.endo_simul(:, 3:end);
 oo_.exo_simul = oo_.exo_simul(3:end, :);
-perfect_foresight_solver;
+perfect_foresight_solver(true);
 oo_.endo_simul = [ saved_endo oo_.endo_simul ];
 oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
 
-// Information arriving in period 6 (permanent shock arriving now)
+% Information arriving in period 6 (permanent shock arriving now)
 oo_.exo_simul(7,1) = 1.1;
 oo_.exo_simul(8,1) = 1.1;
 oo_.exo_steady_state = 1.1;
@@ -88,7 +90,7 @@ saved_endo = oo_.endo_simul(:, 1:5);
 saved_exo = oo_.exo_simul(1:5, :);
 oo_.endo_simul = oo_.endo_simul(:, 6:end);
 oo_.exo_simul = oo_.exo_simul(6:end, :);
-perfect_foresight_solver;
+perfect_foresight_solver(true);
 oo_.endo_simul = [ saved_endo oo_.endo_simul ];
 oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
 
@@ -97,3 +99,5 @@ oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
 if any(any(pfwee_simul-oo_.endo_simul ~= 0))
     error('Error in perfect_foresight_with_expectation_errors')
 end
+
+end; // verbatim
diff --git a/tests/deterministic_simulations/pfwee_constant_sim_length.mod b/tests/deterministic_simulations/pfwee_constant_sim_length.mod
index efe0d2efa2..109d047b2c 100644
--- a/tests/deterministic_simulations/pfwee_constant_sim_length.mod
+++ b/tests/deterministic_simulations/pfwee_constant_sim_length.mod
@@ -41,11 +41,13 @@ oo_.exo_steady_state = orig_exo_steady_state;
 
 perfect_foresight_setup;
 
-// Information arriving in period 1 (temp shock now)
+verbatim;
+
+% Information arriving in period 1 (temp shock now)
 oo_.exo_simul(2,1) = 1.2;
-perfect_foresight_solver;
+perfect_foresight_solver(true);
 
-// Information arriving in period 2 (temp shock now + permanent shock in future)
+% Information arriving in period 2 (temp shock now + permanent shock in future)
 oo_.exo_simul(3,1) = 1.3;
 oo_.exo_steady_state = 1.1;
 oo_.exo_simul(9:10, 1) = repmat(oo_.exo_steady_state', 2, 1);
@@ -55,11 +57,11 @@ saved_endo = oo_.endo_simul(:, 1);
 saved_exo = oo_.exo_simul(1, :);
 oo_.endo_simul = oo_.endo_simul(:, 2:end);
 oo_.exo_simul = oo_.exo_simul(2:end, :);
-perfect_foresight_solver;
+perfect_foresight_solver(true);
 oo_.endo_simul = [ saved_endo oo_.endo_simul ];
 oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
 
-// Information arriving in period 3 (temp shock now + permanent shock in future)
+% Information arriving in period 3 (temp shock now + permanent shock in future)
 oo_.exo_simul(4,1) = 1.4;
 oo_.exo_steady_state = 1.2;
 oo_.exo_simul(9:11, 1) = repmat(oo_.exo_steady_state', 3, 1);
@@ -69,11 +71,11 @@ saved_endo = oo_.endo_simul(:, 1:2);
 saved_exo = oo_.exo_simul(1:2, :);
 oo_.endo_simul = oo_.endo_simul(:, 3:end);
 oo_.exo_simul = oo_.exo_simul(3:end, :);
-perfect_foresight_solver;
+perfect_foresight_solver(true);
 oo_.endo_simul = [ saved_endo oo_.endo_simul ];
 oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
 
-// Information arriving in period 6 (permanent shock arriving now)
+% Information arriving in period 6 (permanent shock arriving now)
 oo_.exo_simul(7,1) = 1.1;
 oo_.exo_simul(8,1) = 1.1;
 oo_.exo_steady_state = 1.1;
@@ -85,7 +87,7 @@ saved_endo = oo_.endo_simul(:, 1:5);
 saved_exo = oo_.exo_simul(1:5, :);
 oo_.endo_simul = oo_.endo_simul(:, 6:end);
 oo_.exo_simul = oo_.exo_simul(6:end, :);
-perfect_foresight_solver;
+perfect_foresight_solver(true);
 oo_.endo_simul = [ saved_endo oo_.endo_simul ];
 oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
 
@@ -94,3 +96,5 @@ oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
 if any(any(pfwee_simul-oo_.endo_simul ~= 0))
     error('Error in perfect_foresight_with_expectation_errors')
 end
+
+end; // verbatim
diff --git a/tests/deterministic_simulations/pfwee_learnt_in.mod b/tests/deterministic_simulations/pfwee_learnt_in.mod
index 780117fd0c..3a4a45c47c 100644
--- a/tests/deterministic_simulations/pfwee_learnt_in.mod
+++ b/tests/deterministic_simulations/pfwee_learnt_in.mod
@@ -91,11 +91,13 @@ oo_.exo_steady_state = orig_exo_steady_state;
 
 perfect_foresight_setup;
 
-// Information arriving in period 1 (temp shock now and tomorrow)
+verbatim;
+
+% Information arriving in period 1 (temp shock now and tomorrow)
 oo_.exo_simul(2:3,1) = 1.2;
-perfect_foresight_solver;
+perfect_foresight_solver(true);
 
-// Information arriving in period 2 (temp shock now + permanent shock in future)
+% Information arriving in period 2 (temp shock now + permanent shock in future)
 oo_.exo_simul(3,1) = 1.3;
 oo_.exo_steady_state = 1.1;
 oo_.exo_simul(end, 1) = oo_.exo_steady_state;
@@ -106,11 +108,11 @@ saved_endo = oo_.endo_simul(:, 1);
 saved_exo = oo_.exo_simul(1, :);
 oo_.endo_simul = oo_.endo_simul(:, 2:end);
 oo_.exo_simul = oo_.exo_simul(2:end, :);
-perfect_foresight_solver;
+perfect_foresight_solver(true);
 oo_.endo_simul = [ saved_endo oo_.endo_simul ];
 oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
 
-// Information arriving in period 3 (temp shocks + permanent shock in future)
+% Information arriving in period 3 (temp shocks + permanent shock in future)
 oo_.exo_simul(4,1) = 1.4;
 oo_.exo_steady_state = 1.1+0.1;
 oo_.exo_simul(8,1) = (1.5/1.2)*oo_.exo_steady_state;
@@ -122,11 +124,11 @@ saved_endo = oo_.endo_simul(:, 1:2);
 saved_exo = oo_.exo_simul(1:2, :);
 oo_.endo_simul = oo_.endo_simul(:, 3:end);
 oo_.exo_simul = oo_.exo_simul(3:end, :);
-perfect_foresight_solver;
+perfect_foresight_solver(true);
 oo_.endo_simul = [ saved_endo oo_.endo_simul ];
 oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
 
-// Information arriving in period 6 (temp shocks + permanent shock)
+% Information arriving in period 6 (temp shocks + permanent shock)
 oo_.exo_simul(7,1) = 1*0.8;
 oo_.exo_simul(8,1) = 1.5*0.8;
 oo_.exo_steady_state = (1.1+0.1)*0.75;
@@ -138,7 +140,7 @@ saved_endo = oo_.endo_simul(:, 1:5);
 saved_exo = oo_.exo_simul(1:5, :);
 oo_.endo_simul = oo_.endo_simul(:, 6:end);
 oo_.exo_simul = oo_.exo_simul(6:end, :);
-perfect_foresight_solver;
+perfect_foresight_solver(true);
 oo_.endo_simul = [ saved_endo oo_.endo_simul ];
 oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
 
@@ -147,3 +149,5 @@ oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
 if any(any(pfwee_simul-oo_.endo_simul ~= 0))
     error('Error in perfect_foresight_with_expectation_errors')
 end
+
+end; // verbatim
-- 
GitLab