2021-07-09 18:12:10 +02:00
function perfect_foresight_with_expectation_errors_solver
2023-01-24 14:58:30 +01:00
% Copyright © 2021-2023 Dynare Team
2021-07-09 18:12:10 +02:00
%
% This file is part of Dynare.
%
% Dynare is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% Dynare is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <https://www.gnu.org/licenses/>.
2022-04-21 17:09:27 +02:00
global M_ oo_ options_ ys0_
2021-07-09 18:12:10 +02:00
2022-04-12 15:45:50 +02:00
% Same for periods (it will be modified before calling perfect_foresight_solver if constants_simulation_length option is false)
periods = options_ . periods ;
2021-07-09 18:12:10 +02:00
2023-06-15 16:59:37 +02:00
% Save some options
orig_homotopy_max_completion_share = options_ . simul . homotopy_max_completion_share ;
orig_endval_steady = options_ . simul . endval_steady ;
2021-07-09 18:12:10 +02:00
% Retrieve initial paths built by pfwee_setup
% (the versions in oo_ will be truncated before calling perfect_foresight_solver)
endo_simul = oo_ . endo_simul ;
exo_simul = oo_ . exo_simul ;
2023-06-15 16:59:37 +02:00
% Enforce the endval steady option in pf_solver
if M_ . maximum_lead > 0
options_ . simul . endval_steady = true ;
end
2021-07-09 18:12:10 +02:00
% Start main loop around informational periods
info_period = 1 ;
2022-04-12 15:45:50 +02:00
increment = 0 ;
2021-07-09 18:12:10 +02:00
while info_period < = periods
2023-06-15 16:57:59 +02:00
if ~ options_ . noprint
fprintf ( ' perfect_foresight_with_expectations_errors_solver: computing solution for information available at period %d\n' , info_period )
end
2021-07-09 18:12:10 +02:00
% Compute terminal steady state as anticipated
oo_ . exo_steady_state = oo_ . pfwee . terminal_info ( : , info_period ) ;
2023-06-15 16:59:37 +02:00
% oo_.steady_state will be updated by pf_solver (since endval_steady=true)
2021-07-09 18:12:10 +02:00
2022-04-12 15:45:50 +02:00
if options_ . pfwee . constant_simulation_length && increment > 0
2023-06-15 16:59:37 +02:00
% Use previous terminal steady state as guess value for: simulation periods that don’ t yet have an initial guess (i.e. are NaNs at this point); and also for the terminal steady state
endo_simul = [ endo_simul repmat ( oo_ . steady_state , 1 , increment ) ] ;
2022-04-12 15:45:50 +02:00
exo_simul = [ exo_simul ; NaN ( increment , M_ . exo_nbr ) ] ;
end
2021-07-09 18:12:10 +02:00
oo_ . endo_simul = endo_simul ( : , info_period : end ) ; % Take initial conditions + guess values from previous simulation
2022-04-12 15:45:50 +02:00
if options_ . pfwee . constant_simulation_length
sim_length = periods ;
else
sim_length = periods - info_period + 1 ;
end
2023-06-15 16:59:37 +02:00
2021-07-09 18:12:10 +02:00
oo_ . exo_simul = exo_simul ( info_period : end , : ) ;
oo_ . exo_simul ( M_ . maximum_lag + ( 1 : periods - info_period + 1 ) , : ) = oo_ . pfwee . shocks_info ( : , info_period : end , info_period ) ' ;
2023-01-24 14:58:30 +01:00
oo_ . exo_simul ( M_ . maximum_lag + periods - info_period + 2 : end , : ) = repmat ( oo_ . exo_steady_state ' , sim_length + M_ . maximum_lead - ( periods - info_period + 1 ) , 1 ) ;
2022-04-12 15:45:50 +02:00
options_ . periods = sim_length ;
2021-07-09 18:12:10 +02:00
perfect_foresight_solver ;
2023-06-15 16:57:59 +02:00
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 )
end
2023-06-15 16:59:37 +02:00
if info_period == 1
homotopy_completion_share = oo_ . deterministic_simulation . homotopy_completion_share ;
options_ . simul . homotopy_max_completion_share = homotopy_completion_share ;
elseif oo_ . deterministic_simulation . homotopy_completion_share ~= homotopy_completion_share
error ( ' perfect_foresight_solver_with_expectation_errors: could not find a solution for information available at period %d with the same homotopy completion share as period 1\n' , info_period )
end
2021-07-09 18:12:10 +02:00
endo_simul ( : , info_period : end ) = oo_ . endo_simul ;
exo_simul ( info_period : end , : ) = oo_ . exo_simul ;
% Increment info_period (as much as possible, if information set does not change for some time)
increment = 1 ;
while info_period + increment < = periods && ...
all ( oo_ . pfwee . terminal_info ( : , info_period ) == oo_ . pfwee . terminal_info ( : , info_period + increment ) ) && ...
all ( all ( oo_ . pfwee . shocks_info ( : , info_period + increment : end , info_period ) == oo_ . pfwee . shocks_info ( : , info_period + increment : end , info_period + increment ) ) )
increment = increment + 1 ;
end
info_period = info_period + increment ;
end
% Set final paths
oo_ . endo_simul = endo_simul ;
oo_ . exo_simul = exo_simul ;
2023-06-15 16:59:37 +02:00
% Restore some options
2021-07-09 18:12:10 +02:00
options_ . periods = periods ;
2023-06-15 16:59:37 +02:00
options_ . simul . homotopy_max_completion_share = orig_homotopy_max_completion_share ;
options_ . simul . endval_steady = orig_endval_steady ;