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