Skip to content
Snippets Groups Projects
Verified Commit 0213b140 authored by Sébastien Villemot's avatar Sébastien Villemot
Browse files

Perfect foresight: move test about “learnt_in” blocks from pf_solver to pf_setup

Leads to a simpler code.
parent afaed36f
No related branches found
No related tags found
No related merge requests found
Pipeline #11419 passed
...@@ -14,7 +14,7 @@ function oo_=perfect_foresight_setup(M_, options_, oo_) ...@@ -14,7 +14,7 @@ function oo_=perfect_foresight_setup(M_, options_, oo_)
% SPECIAL REQUIREMENTS % SPECIAL REQUIREMENTS
% none % none
% Copyright © 1996-2024 Dynare Team % Copyright © 1996-2025 Dynare Team
% %
% This file is part of Dynare. % This file is part of Dynare.
% %
...@@ -72,5 +72,9 @@ if options_.simul.endval_steady && M_.maximum_lead == 0 ...@@ -72,5 +72,9 @@ if options_.simul.endval_steady && M_.maximum_lead == 0
error('PERFECT_FORESIGHT_SETUP: Option endval_steady cannot be used on a purely backward or static model.') error('PERFECT_FORESIGHT_SETUP: Option endval_steady cannot be used on a purely backward or static model.')
end end
if ~isempty(M_.learnt_shocks) || ~isempty(M_.learnt_endval)
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
oo_ = make_ex_(M_,options_,oo_); oo_ = make_ex_(M_,options_,oo_);
oo_ = make_y_(M_,options_,oo_); oo_ = make_y_(M_,options_,oo_);
function [oo_, ts]=perfect_foresight_solver(M_, options_, oo_, no_error_if_learnt_in_is_present, marginal_linearization_previous_raw_sims) function [oo_, ts]=perfect_foresight_solver(M_, options_, oo_, marginal_linearization_previous_raw_sims)
% Computes deterministic simulations % Computes deterministic simulations
% %
% INPUTS % INPUTS
% M_ [structure] describing the model % M_ [structure] describing the model
% options_ [structure] describing the options % options_ [structure] describing the options
% oo_ [structure] storing the results % oo_ [structure] storing the results
% 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
% marginal_linearization_previous_raw_sims [struct, optional] % marginal_linearization_previous_raw_sims [struct, optional]
% if not empty, contains the two simulations used to compute the extrapolation by marginal % if not empty, contains the two simulations used to compute the extrapolation by marginal
% linearization in a previous informational period, in the context of % linearization in a previous informational period, in the context of
...@@ -23,7 +20,7 @@ function [oo_, ts]=perfect_foresight_solver(M_, options_, oo_, no_error_if_learn ...@@ -23,7 +20,7 @@ function [oo_, ts]=perfect_foresight_solver(M_, options_, oo_, no_error_if_learn
% SPECIAL REQUIREMENTS % SPECIAL REQUIREMENTS
% none % none
% Copyright © 1996-2024 Dynare Team % Copyright © 1996-2025 Dynare Team
% %
% This file is part of Dynare. % This file is part of Dynare.
% %
...@@ -43,14 +40,8 @@ function [oo_, ts]=perfect_foresight_solver(M_, options_, oo_, no_error_if_learn ...@@ -43,14 +40,8 @@ function [oo_, ts]=perfect_foresight_solver(M_, options_, oo_, no_error_if_learn
check_input_arguments(options_, M_, oo_); check_input_arguments(options_, M_, oo_);
if nargin < 4 if nargin < 4
no_error_if_learnt_in_is_present = false;
end
if nargin < 5
marginal_linearization_previous_raw_sims = []; marginal_linearization_previous_raw_sims = [];
end 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, first_simulation_period, last_simulation_period] = get_simulation_periods(options_); [periods, first_simulation_period, last_simulation_period] = get_simulation_periods(options_);
......
...@@ -7,7 +7,7 @@ function [oo_, ts] = perfect_foresight_with_expectation_errors_solver(M_, option ...@@ -7,7 +7,7 @@ function [oo_, ts] = perfect_foresight_with_expectation_errors_solver(M_, option
% OUTPUTS % OUTPUTS
% oo_ [structure] storing the results % oo_ [structure] storing the results
% Copyright © 2021-2024 Dynare Team % Copyright © 2021-2025 Dynare Team
% %
% This file is part of Dynare. % This file is part of Dynare.
% %
...@@ -85,7 +85,7 @@ while info_period <= periods ...@@ -85,7 +85,7 @@ while info_period <= periods
marginal_linearization_previous_raw_sims = []; marginal_linearization_previous_raw_sims = [];
end end
oo_= perfect_foresight_solver(M_, options_, oo_, true, marginal_linearization_previous_raw_sims); oo_= perfect_foresight_solver(M_, options_, oo_, marginal_linearization_previous_raw_sims);
if ~oo_.deterministic_simulation.status 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) error('perfect_foresight_with_expectation_errors_solver: failed to compute solution for information available at period %d\n', info_period)
......
...@@ -37,29 +37,30 @@ perfect_foresight_with_expectation_errors_solver; ...@@ -37,29 +37,30 @@ perfect_foresight_with_expectation_errors_solver;
pfwee_simul = oo_.endo_simul; pfwee_simul = oo_.endo_simul;
// Now compute the solution by hand to verify the results // Now compute the solution by hand to verify the results
verbatim;
oo_.steady_state = orig_steady_state; oo_.steady_state = orig_steady_state;
oo_.exo_steady_state = orig_exo_steady_state; oo_.exo_steady_state = orig_exo_steady_state;
perfect_foresight_setup; oo_ = make_ex_(M_,options_,oo_);
oo_ = make_y_(M_,options_,oo_);
verbatim;
% Information arriving in period 1 (temp shock now) % Information arriving in period 1 (temp shock now)
oo_.exo_simul(2,1) = 1.2; oo_.exo_simul(2,1) = 1.2;
oo_=perfect_foresight_solver(M_, options_, oo_, true); oo_=perfect_foresight_solver(M_, options_, oo_);
% 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_simul(3,1) = 1.3;
oo_.exo_steady_state = 1.1; oo_.exo_steady_state = 1.1;
oo_.exo_simul(end, 1) = oo_.exo_steady_state; oo_.exo_simul(end, 1) = oo_.exo_steady_state;
oo_.steady_state = evaluate_steady_state(oo_.steady_state, oo_.exo_steady_state, M_, options_, true); oo_.steady_state = evaluate_steady_state(oo_.steady_state, oo_.exo_steady_state, M_, options_);
oo_.endo_simul(:, end) = oo_.steady_state; oo_.endo_simul(:, end) = oo_.steady_state;
options_.periods = 6; options_.periods = 6;
saved_endo = oo_.endo_simul(:, 1); saved_endo = oo_.endo_simul(:, 1);
saved_exo = oo_.exo_simul(1, :); saved_exo = oo_.exo_simul(1, :);
oo_.endo_simul = oo_.endo_simul(:, 2:end); oo_.endo_simul = oo_.endo_simul(:, 2:end);
oo_.exo_simul = oo_.exo_simul(2:end, :); oo_.exo_simul = oo_.exo_simul(2:end, :);
oo_=perfect_foresight_solver(M_, options_, oo_, true); oo_=perfect_foresight_solver(M_, options_, oo_);
oo_.endo_simul = [ saved_endo oo_.endo_simul ]; oo_.endo_simul = [ saved_endo oo_.endo_simul ];
oo_.exo_simul = [ saved_exo; oo_.exo_simul ]; oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
...@@ -67,14 +68,14 @@ oo_.exo_simul = [ saved_exo; oo_.exo_simul ]; ...@@ -67,14 +68,14 @@ oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
oo_.exo_simul(4,1) = 1.4; oo_.exo_simul(4,1) = 1.4;
oo_.exo_steady_state = 1.2; oo_.exo_steady_state = 1.2;
oo_.exo_simul(end, 1) = oo_.exo_steady_state; oo_.exo_simul(end, 1) = oo_.exo_steady_state;
oo_.steady_state = evaluate_steady_state(oo_.steady_state, oo_.exo_steady_state, M_, options_, true); oo_.steady_state = evaluate_steady_state(oo_.steady_state, oo_.exo_steady_state, M_, options_);
oo_.endo_simul(:, end) = oo_.steady_state; oo_.endo_simul(:, end) = oo_.steady_state;
options_.periods = 5; options_.periods = 5;
saved_endo = oo_.endo_simul(:, 1:2); saved_endo = oo_.endo_simul(:, 1:2);
saved_exo = oo_.exo_simul(1:2, :); saved_exo = oo_.exo_simul(1:2, :);
oo_.endo_simul = oo_.endo_simul(:, 3:end); oo_.endo_simul = oo_.endo_simul(:, 3:end);
oo_.exo_simul = oo_.exo_simul(3:end, :); oo_.exo_simul = oo_.exo_simul(3:end, :);
oo_=perfect_foresight_solver(M_, options_, oo_, true); oo_=perfect_foresight_solver(M_, options_, oo_);
oo_.endo_simul = [ saved_endo oo_.endo_simul ]; oo_.endo_simul = [ saved_endo oo_.endo_simul ];
oo_.exo_simul = [ saved_exo; oo_.exo_simul ]; oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
...@@ -83,14 +84,14 @@ oo_.exo_simul(7,1) = 1.1; ...@@ -83,14 +84,14 @@ oo_.exo_simul(7,1) = 1.1;
oo_.exo_simul(8,1) = 1.1; oo_.exo_simul(8,1) = 1.1;
oo_.exo_steady_state = 1.1; oo_.exo_steady_state = 1.1;
oo_.exo_simul(end, 1) = oo_.exo_steady_state; oo_.exo_simul(end, 1) = oo_.exo_steady_state;
oo_.steady_state = evaluate_steady_state(oo_.steady_state, oo_.exo_steady_state, M_, options_, true); oo_.steady_state = evaluate_steady_state(oo_.steady_state, oo_.exo_steady_state, M_, options_);
oo_.endo_simul(:, end) = oo_.steady_state; oo_.endo_simul(:, end) = oo_.steady_state;
options_.periods = 2; options_.periods = 2;
saved_endo = oo_.endo_simul(:, 1:5); saved_endo = oo_.endo_simul(:, 1:5);
saved_exo = oo_.exo_simul(1:5, :); saved_exo = oo_.exo_simul(1:5, :);
oo_.endo_simul = oo_.endo_simul(:, 6:end); oo_.endo_simul = oo_.endo_simul(:, 6:end);
oo_.exo_simul = oo_.exo_simul(6:end, :); oo_.exo_simul = oo_.exo_simul(6:end, :);
oo_=perfect_foresight_solver(M_, options_, oo_,true); oo_=perfect_foresight_solver(M_, options_, oo_);
oo_.endo_simul = [ saved_endo oo_.endo_simul ]; oo_.endo_simul = [ saved_endo oo_.endo_simul ];
oo_.exo_simul = [ saved_exo; oo_.exo_simul ]; oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
......
...@@ -36,16 +36,17 @@ perfect_foresight_with_expectation_errors_solver(constant_simulation_length); ...@@ -36,16 +36,17 @@ perfect_foresight_with_expectation_errors_solver(constant_simulation_length);
pfwee_simul = oo_.endo_simul; pfwee_simul = oo_.endo_simul;
// Now compute the solution by hand to verify the results // Now compute the solution by hand to verify the results
verbatim;
oo_.steady_state = orig_steady_state; oo_.steady_state = orig_steady_state;
oo_.exo_steady_state = orig_exo_steady_state; oo_.exo_steady_state = orig_exo_steady_state;
perfect_foresight_setup; oo_ = make_ex_(M_,options_,oo_);
oo_ = make_y_(M_,options_,oo_);
verbatim;
% Information arriving in period 1 (temp shock now) % Information arriving in period 1 (temp shock now)
oo_.exo_simul(2,1) = 1.2; oo_.exo_simul(2,1) = 1.2;
oo_=perfect_foresight_solver(M_, options_, oo_, true); oo_=perfect_foresight_solver(M_, options_, oo_);
% 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_simul(3,1) = 1.3;
...@@ -57,7 +58,7 @@ saved_endo = oo_.endo_simul(:, 1); ...@@ -57,7 +58,7 @@ saved_endo = oo_.endo_simul(:, 1);
saved_exo = oo_.exo_simul(1, :); saved_exo = oo_.exo_simul(1, :);
oo_.endo_simul = oo_.endo_simul(:, 2:end); oo_.endo_simul = oo_.endo_simul(:, 2:end);
oo_.exo_simul = oo_.exo_simul(2:end, :); oo_.exo_simul = oo_.exo_simul(2:end, :);
oo_=perfect_foresight_solver(M_, options_, oo_, true); oo_=perfect_foresight_solver(M_, options_, oo_);
oo_.endo_simul = [ saved_endo oo_.endo_simul ]; oo_.endo_simul = [ saved_endo oo_.endo_simul ];
oo_.exo_simul = [ saved_exo; oo_.exo_simul ]; oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
...@@ -71,7 +72,7 @@ saved_endo = oo_.endo_simul(:, 1:2); ...@@ -71,7 +72,7 @@ saved_endo = oo_.endo_simul(:, 1:2);
saved_exo = oo_.exo_simul(1:2, :); saved_exo = oo_.exo_simul(1:2, :);
oo_.endo_simul = oo_.endo_simul(:, 3:end); oo_.endo_simul = oo_.endo_simul(:, 3:end);
oo_.exo_simul = oo_.exo_simul(3:end, :); oo_.exo_simul = oo_.exo_simul(3:end, :);
oo_=perfect_foresight_solver(M_, options_, oo_, true); oo_=perfect_foresight_solver(M_, options_, oo_);
oo_.endo_simul = [ saved_endo oo_.endo_simul ]; oo_.endo_simul = [ saved_endo oo_.endo_simul ];
oo_.exo_simul = [ saved_exo; oo_.exo_simul ]; oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
...@@ -87,7 +88,7 @@ saved_endo = oo_.endo_simul(:, 1:5); ...@@ -87,7 +88,7 @@ saved_endo = oo_.endo_simul(:, 1:5);
saved_exo = oo_.exo_simul(1:5, :); saved_exo = oo_.exo_simul(1:5, :);
oo_.endo_simul = oo_.endo_simul(:, 6:end); oo_.endo_simul = oo_.endo_simul(:, 6:end);
oo_.exo_simul = oo_.exo_simul(6:end, :); oo_.exo_simul = oo_.exo_simul(6:end, :);
oo_=perfect_foresight_solver(M_, options_, oo_, true); oo_=perfect_foresight_solver(M_, options_, oo_);
oo_.endo_simul = [ saved_endo oo_.endo_simul ]; oo_.endo_simul = [ saved_endo oo_.endo_simul ];
oo_.exo_simul = [ saved_exo; oo_.exo_simul ]; oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
......
...@@ -112,12 +112,13 @@ perfect_foresight_with_expectation_errors_solver; ...@@ -112,12 +112,13 @@ perfect_foresight_with_expectation_errors_solver;
pfwee_simul = oo_.endo_simul; pfwee_simul = oo_.endo_simul;
// Now compute the solution by hand to verify the results // Now compute the solution by hand to verify the results
verbatim;
oo_.steady_state = orig_steady_state; oo_.steady_state = orig_steady_state;
oo_.exo_steady_state = orig_exo_steady_state; oo_.exo_steady_state = orig_exo_steady_state;
perfect_foresight_setup; oo_ = make_ex_(M_,options_,oo_);
oo_ = make_y_(M_,options_,oo_);
verbatim;
@#if dates @#if dates
% Reset {first,last}_simulation_period since were going to manipulate options_.periods % Reset {first,last}_simulation_period since were going to manipulate options_.periods
...@@ -132,7 +133,7 @@ oo_.exo_simul(4:end,1) = 1.05; ...@@ -132,7 +133,7 @@ oo_.exo_simul(4:end,1) = 1.05;
oo_.exo_steady_state = 1.05; oo_.exo_steady_state = 1.05;
oo_.steady_state = evaluate_steady_state(oo_.steady_state, oo_.exo_steady_state, M_, options_, true); oo_.steady_state = evaluate_steady_state(oo_.steady_state, oo_.exo_steady_state, M_, options_, true);
oo_.endo_simul(:, end) = oo_.steady_state; oo_.endo_simul(:, end) = oo_.steady_state;
oo_=perfect_foresight_solver(M_, options_, oo_, true); oo_=perfect_foresight_solver(M_, options_, oo_);
% 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_simul(3,1) = 1.3;
...@@ -145,7 +146,7 @@ saved_endo = oo_.endo_simul(:, 1); ...@@ -145,7 +146,7 @@ saved_endo = oo_.endo_simul(:, 1);
saved_exo = oo_.exo_simul(1, :); saved_exo = oo_.exo_simul(1, :);
oo_.endo_simul = oo_.endo_simul(:, 2:end); oo_.endo_simul = oo_.endo_simul(:, 2:end);
oo_.exo_simul = oo_.exo_simul(2:end, :); oo_.exo_simul = oo_.exo_simul(2:end, :);
oo_=perfect_foresight_solver(M_, options_, oo_, true); oo_=perfect_foresight_solver(M_, options_, oo_);
oo_.endo_simul = [ saved_endo oo_.endo_simul ]; oo_.endo_simul = [ saved_endo oo_.endo_simul ];
oo_.exo_simul = [ saved_exo; oo_.exo_simul ]; oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
...@@ -162,7 +163,7 @@ saved_endo = oo_.endo_simul(:, 1:2); ...@@ -162,7 +163,7 @@ saved_endo = oo_.endo_simul(:, 1:2);
saved_exo = oo_.exo_simul(1:2, :); saved_exo = oo_.exo_simul(1:2, :);
oo_.endo_simul = oo_.endo_simul(:, 3:end); oo_.endo_simul = oo_.endo_simul(:, 3:end);
oo_.exo_simul = oo_.exo_simul(3:end, :); oo_.exo_simul = oo_.exo_simul(3:end, :);
oo_=perfect_foresight_solver(M_, options_, oo_, true); oo_=perfect_foresight_solver(M_, options_, oo_);
oo_.endo_simul = [ saved_endo oo_.endo_simul ]; oo_.endo_simul = [ saved_endo oo_.endo_simul ];
oo_.exo_simul = [ saved_exo; oo_.exo_simul ]; oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
...@@ -178,7 +179,7 @@ saved_endo = oo_.endo_simul(:, 1:5); ...@@ -178,7 +179,7 @@ saved_endo = oo_.endo_simul(:, 1:5);
saved_exo = oo_.exo_simul(1:5, :); saved_exo = oo_.exo_simul(1:5, :);
oo_.endo_simul = oo_.endo_simul(:, 6:end); oo_.endo_simul = oo_.endo_simul(:, 6:end);
oo_.exo_simul = oo_.exo_simul(6:end, :); oo_.exo_simul = oo_.exo_simul(6:end, :);
oo_=perfect_foresight_solver(M_, options_, oo_, true); oo_=perfect_foresight_solver(M_, options_, oo_);
oo_.endo_simul = [ saved_endo oo_.endo_simul ]; oo_.endo_simul = [ saved_endo oo_.endo_simul ];
oo_.exo_simul = [ saved_exo; oo_.exo_simul ]; oo_.exo_simul = [ saved_exo; oo_.exo_simul ];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment