diff --git a/doc/manual/source/the-model-file.rst b/doc/manual/source/the-model-file.rst index 253190d5d..bb7000b5e 100644 --- a/doc/manual/source/the-model-file.rst +++ b/doc/manual/source/the-model-file.rst @@ -4015,6 +4015,23 @@ speed-up on large models. ``1+M_.maximum_lag``, and the total number of rows is ``M_.maximum_lag+periods+M_.maximum_lead``. +.. matvar:: oo_.initial_steady_state + + If a permanent shock is simulated through the use of both ``initval`` and + ``endval`` blocks, this variable contains the initial steady state, as + determined by the ``initval`` block (when followed by a ``steady`` + command). This variable has the same structure as :mvar:`oo_.steady_state` + (and this latter variable contains the terminal steady state, if the + ``endval`` block is followed by a ``steady`` command). + +.. matvar:: oo_.initial_exo_steady_state + + If a permanent shock is simulated through the use of both ``initval`` and + ``endval`` blocks, this variable contains the initial steady state of the + exogenous variables, as specified in the ``initval`` block. This variable + has the same structure as :mvar:`oo_.exo_steady_state` (and this latter + variable contains the terminal steady state of the exogenous variables). + .. matvar:: M_.maximum_lag |br| The maximum number of lags in the model. Note that this value is diff --git a/matlab/+gui/+perfect_foresight/run.m b/matlab/+gui/+perfect_foresight/run.m index 03ff8f947..2a817effc 100644 --- a/matlab/+gui/+perfect_foresight/run.m +++ b/matlab/+gui/+perfect_foresight/run.m @@ -30,7 +30,7 @@ function run(json) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -global M_ options_ oo_ ys0_ ex0_ +global M_ options_ oo_ %% Check Inputs if nargin ~= 1 || ~ischar(json) @@ -64,12 +64,12 @@ end %% ENDVAL instructions % initialize exogenous shocks to zero and compute final ss unless there is a permanent shock -ys0_ = []; -ex0_ = []; +oo_.initial_steady_state = []; +oo_.initial_exo_steady_state = []; M_.det_shocks = []; if ~isempty(jm.anticipated_permanent_shocks) || ~isempty(jm.endval_endo) - ys0_= oo_.steady_state; - ex0_ = oo_.exo_steady_state; + oo_.initial_steady_state= oo_.steady_state; + oo_.initial_exo_steady_state = oo_.exo_steady_state; for i = 1:length(jm.endval_endo) oo_.steady_state(jm.endval_endo(i).id) = jm.endval_endo(i).value; end @@ -152,10 +152,10 @@ end % surprise shocks present % in case there are unanticipated shocks... -if isempty(ys0_) +if isempty(oo_.initial_steady_state) yy = oo_.steady_state; else - yy = ys0_; + yy = oo_.initial_steady_state; end if mapkeys(1) ~= 1 diff --git a/matlab/global_initialization.m b/matlab/global_initialization.m index f76c01d42..3853e28d3 100644 --- a/matlab/global_initialization.m +++ b/matlab/global_initialization.m @@ -11,7 +11,7 @@ function global_initialization() % SPECIAL REQUIREMENTS % none -% Copyright © 2003-2018 Dynare Team +% Copyright © 2003-2023 Dynare Team % % This file is part of Dynare. % @@ -28,7 +28,7 @@ function global_initialization() % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -global oo_ M_ options_ estim_params_ bayestopt_ estimation_info ex0_ ys0_ dataset_ dataset_info +global oo_ M_ options_ estim_params_ bayestopt_ estimation_info dataset_ dataset_info estim_params_ = []; bayestopt_ = []; dataset_=[]; @@ -86,13 +86,13 @@ estimation_info.joint_parameter = {'index','domain','interval','mean','median',' oo_.exo_simul = []; oo_.endo_simul = []; -ys0_ = []; -ex0_ = []; oo_.dr = []; oo_.exo_steady_state = []; oo_.exo_det_steady_state = []; oo_.exo_det_simul = []; oo_.initval_series = dseries(); +oo_.initial_steady_state = []; +oo_.initial_exo_steady_state = []; oo_.gui.ran_estimation = false; oo_.gui.ran_stoch_simul = false; diff --git a/matlab/perfect-foresight-models/make_ex_.m b/matlab/perfect-foresight-models/make_ex_.m index 8533805d6..3234afbec 100644 --- a/matlab/perfect-foresight-models/make_ex_.m +++ b/matlab/perfect-foresight-models/make_ex_.m @@ -10,7 +10,7 @@ function oo_ = make_ex_(M_, options_, oo_) % OUTPUTS % - oo_ [struct] Updated dynare results structure -% Copyright © 1996-2021 Dynare Team +% Copyright © 1996-2023 Dynare Team % % This file is part of Dynare. % @@ -27,8 +27,6 @@ function oo_ = make_ex_(M_, options_, oo_) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -global ex0_ - if isempty(oo_.exo_steady_state) oo_.exo_steady_state = zeros(M_.exo_nbr,1); end @@ -39,13 +37,13 @@ end % Initialize oo_.exo_simul if isempty(oo_.initval_series) if isempty(M_.exo_histval) - if isempty(ex0_) + if isempty(oo_.initial_exo_steady_state) oo_.exo_simul = repmat(oo_.exo_steady_state',M_.maximum_lag+options_.periods+M_.maximum_lead,1); else - oo_.exo_simul = [ repmat(ex0_',M_.maximum_lag,1) ; repmat(oo_.exo_steady_state',options_.periods+M_.maximum_lead,1) ]; + oo_.exo_simul = [ repmat(oo_.initial_exo_steady_state',M_.maximum_lag,1) ; repmat(oo_.exo_steady_state',options_.periods+M_.maximum_lead,1) ]; end else - if isempty(ex0_) + if isempty(oo_.initial_exo_steady_state) oo_.exo_simul = [M_.exo_histval'; repmat(oo_.exo_steady_state',options_.periods+M_.maximum_lead,1)]; else error('histval and endval cannot be used simultaneously') @@ -92,10 +90,10 @@ if isfield(M_, 'det_shocks') case 'multiply_steady_state' oo_.exo_simul(k,ivar) = oo_.exo_steady_state(ivar) * v; case 'multiply_initial_steady_state' - if isempty(ex0_) + if isempty(oo_.initial_exo_steady_state) error('Option relative_to_initval of mshocks block cannot be used without an endval block') end - oo_.exo_simul(k,ivar) = ex0_(ivar) * v; + oo_.exo_simul(k,ivar) = oo_.initial_exo_steady_state(ivar) * v; end else switch M_.det_shocks(i).type diff --git a/matlab/perfect-foresight-models/make_y_.m b/matlab/perfect-foresight-models/make_y_.m index 07af24ce3..c42142103 100644 --- a/matlab/perfect-foresight-models/make_y_.m +++ b/matlab/perfect-foresight-models/make_y_.m @@ -10,7 +10,7 @@ function oo_=make_y_(M_, options_, oo_) % OUTPUTS % - oo_ [struct] Updated dynare results structure -% Copyright © 1996-2020 Dynare Team +% Copyright © 1996-2023 Dynare Team % % This file is part of Dynare. % @@ -27,21 +27,19 @@ function oo_=make_y_(M_, options_, oo_) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -global ys0_ - if isempty(oo_.steady_state) oo_.steady_state = zeros(M_.endo_nbr,1); end if isempty(oo_.initval_series) if isempty(M_.endo_histval) - if isempty(ys0_) + if isempty(oo_.initial_steady_state) oo_.endo_simul = repmat(oo_.steady_state, 1, M_.maximum_lag+options_.periods+M_.maximum_lead); else - oo_.endo_simul = [repmat(ys0_, 1, M_.maximum_lag) repmat(oo_.steady_state, 1,options_.periods+M_.maximum_lead)]; + oo_.endo_simul = [repmat(oo_.initial_steady_state, 1, M_.maximum_lag) repmat(oo_.steady_state, 1,options_.periods+M_.maximum_lead)]; end else - if ~isempty(ys0_) + if ~isempty(oo_.initial_steady_state) error('histval and endval cannot be used simultaneously') end % the first NaNs take care of the case where there are lags > 1 on @@ -54,7 +52,7 @@ else oo_.endo_simul = y(M_.orig_maximum_lag - M_.maximum_lag + 1:M_.orig_maximum_lag + options_.periods + ... M_.maximum_lead, :)'; if ~isempty(M_.endo_histval) - if ~isempty(ys0_) + if ~isempty(oo_.initial_steady_state) error('histval and endval cannot be used simultaneously') end oo_.endo_simul(:,1:M_.maximum_lag) ... diff --git a/matlab/perfect-foresight-models/perfect_foresight_solver.m b/matlab/perfect-foresight-models/perfect_foresight_solver.m index a7fa866c5..5179c6922 100644 --- a/matlab/perfect-foresight-models/perfect_foresight_solver.m +++ b/matlab/perfect-foresight-models/perfect_foresight_solver.m @@ -31,7 +31,7 @@ function perfect_foresight_solver(no_error_if_learnt_in_is_present) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -global M_ options_ oo_ ys0_ ex0_ +global M_ options_ oo_ check_input_arguments(options_, M_, oo_); @@ -103,13 +103,13 @@ lastperiods = M_.maximum_lag+periods+(1:M_.maximum_lead); % Create base scenario for homotopy, which corresponds to the initial steady % state (i.e. a known solution to the perfect foresight problem, assuming that -% oo_.steady_state/ys0_ effectively contains a steady state) -if isempty(ys0_) +% oo_.steady_state/oo_.initial_steady_state effectively contains a steady state) +if isempty(oo_.initial_steady_state) endobase = repmat(oo_.steady_state, 1,M_.maximum_lag+periods+M_.maximum_lead); exobase = repmat(oo_.exo_steady_state',M_.maximum_lag+periods+M_.maximum_lead,1); else - endobase = repmat(ys0_, 1, M_.maximum_lag+periods+M_.maximum_lead); - exobase = repmat(ex0_', M_.maximum_lag+periods+M_.maximum_lead, 1); + endobase = repmat(oo_.initial_steady_state, 1, M_.maximum_lag+periods+M_.maximum_lead); + exobase = repmat(oo_.initial_exo_steady_state', M_.maximum_lag+periods+M_.maximum_lead, 1); end % Determine whether to recompute the final steady state (either because @@ -117,7 +117,7 @@ end % terminal condition is a steady state) if options_.simul.endval_steady recompute_final_steady_state = true; -elseif ~isempty(ys0_) +elseif ~isempty(oo_.initial_steady_state) recompute_final_steady_state = true; for j = lastperiods endval_resid = evaluate_static_model(oo_.endo_simul(:,j), oo_.exo_simul(j,:)', M_.params, M_, options_); @@ -398,7 +398,7 @@ function [steady_success, endo_simul, exo_simul, steady_state, exo_steady_state] % steady_state [vector] steady state of endogenous corresponding to the scenario (equal to the input if terminal steady state not recomputed) % exo_steady_state [vector] steady state of exogenous corresponding to the scenario (equal to the input if terminal steady state not recomputed) -global M_ options_ oo_ ys0_ +global M_ options_ oo_ % Compute convex combination for the path of exogenous exo_simul = exoorig*share + exobase*(1-share); @@ -432,10 +432,10 @@ if recompute_final_steady_state [endo_simul(:, j), ~, info] = evaluate_steady_state(endo_simul(:, j), exo_simul(j, :)', M_, options_, true); if info(1) % If this fails, then try again using the initial steady state as guess value - if isempty(ys0_) + if isempty(oo_.initial_steady_state) guess_value = oo_.steady_state; else - guess_value = ys0_; + guess_value = oo_.initial_steady_state; end [endo_simul(:, j), ~, info] = evaluate_steady_state(guess_value, exo_simul(j, :)', M_, options_, true); if info(1) diff --git a/matlab/perfect-foresight-models/perfect_foresight_with_expectation_errors_setup.m b/matlab/perfect-foresight-models/perfect_foresight_with_expectation_errors_setup.m index 3c5465bdd..86752ec1c 100644 --- a/matlab/perfect-foresight-models/perfect_foresight_with_expectation_errors_setup.m +++ b/matlab/perfect-foresight-models/perfect_foresight_with_expectation_errors_setup.m @@ -17,7 +17,7 @@ function perfect_foresight_with_expectation_errors_setup % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -global M_ oo_ options_ ys0_ ex0_ +global M_ oo_ options_ if ~isempty(M_.endo_histval) error('perfect_foresight_with_expectation_errors_setup: cannot be used in conjunction with histval') @@ -33,7 +33,7 @@ oo_.pfwee.terminal_info = NaN(M_.exo_nbr, periods); % 2nd dimension is informati oo_.pfwee.shocks_info = NaN(M_.exo_nbr, periods, periods); % 2nd dimension is real time, 3rd dimension is informational time if exist(options_.datafile, 'file') - if ~isempty(M_.det_shocks) || ~isempty(M_.learnt_shocks) || ~isempty(ys0_) || ~isempty(M_.learnt_endval) + if ~isempty(M_.det_shocks) || ~isempty(M_.learnt_shocks) || ~isempty(oo_.initial_steady_state) || ~isempty(M_.learnt_endval) warning('perfect_foresight_with_expectation_errors_setup: since you passed the datafile option, the contents of shocks and endval blocks will be ignored') end %% Read CSV file @@ -81,10 +81,10 @@ else case 'multiply_steady_state' oo_.pfwee.shocks_info(exo_id, prds, 1) = oo_.exo_steady_state(exo_id) * v; case 'multiply_initial_steady_state' - if isempty(ex0_) + if isempty(oo_.initial_exo_steady_state) error('Option relative_to_initval of mshocks block cannot be used without an endval block') end - oo_.pfwee.shocks_info(exo_id, prds, 1) = ex0_(exo_id) * v; + oo_.pfwee.shocks_info(exo_id, prds, 1) = oo_.initial_exo_steady_state(exo_id) * v; end end end @@ -135,13 +135,13 @@ else end % Build initial paths for endos and exos (only initial conditions are set, the rest is NaN) -if isempty(ys0_) +if isempty(oo_.initial_steady_state) oo_.endo_simul = repmat(oo_.steady_state, 1, M_.maximum_lag+periods+M_.maximum_lead); else - oo_.endo_simul = [repmat(ys0_, 1, M_.maximum_lag) repmat(oo_.steady_state, 1, periods+M_.maximum_lead)]; + oo_.endo_simul = [repmat(oo_.initial_steady_state, 1, M_.maximum_lag) repmat(oo_.steady_state, 1, periods+M_.maximum_lead)]; end -if isempty(ex0_) +if isempty(oo_.initial_exo_steady_state) oo_.exo_simul = repmat(oo_.exo_steady_state', M_.maximum_lag+periods+M_.maximum_lead, 1); else - oo_.exo_simul = [repmat(ex0_', M_.maximum_lag, 1); repmat(oo_.exo_steady_state', periods+M_.maximum_lead, 1)]; + oo_.exo_simul = [repmat(oo_.initial_exo_steady_state', M_.maximum_lag, 1); repmat(oo_.exo_steady_state', periods+M_.maximum_lead, 1)]; end 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 dad8e57a7..14ea5a48c 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 @@ -17,7 +17,7 @@ function perfect_foresight_with_expectation_errors_solver % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -global M_ oo_ options_ ys0_ +global M_ oo_ options_ % Same for periods (it will be modified before calling perfect_foresight_solver if constants_simulation_length option is false) periods = options_.periods; diff --git a/matlab/steady.m b/matlab/steady.m index 106f4c201..7153e1b6c 100644 --- a/matlab/steady.m +++ b/matlab/steady.m @@ -28,7 +28,7 @@ function steady() % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -global M_ oo_ options_ ex0_ +global M_ oo_ options_ test_for_deep_parameters_calibration(M_); @@ -64,12 +64,12 @@ if options_.homotopy_mode ~= 0 % If the “from_initval_to_endval” option was passed to the “homotopy_setup” block, add the relevant homotopy information if options_.homotopy_from_initval_to_endval - if isempty(ex0_) + if isempty(oo_.initial_exo_steady_state) error('HOMOTOPY_SETUP: the from_initval_to_endval option cannot be used without an endval block') end for i = 1:M_.exo_nbr if ~any(hv(:,1)==1 & hv(:,2)==i) % Do not overwrite information manually specified by the user - hv = vertcat(hv, [ 1 i ex0_(i) oo_.exo_steady_state(i)]); + hv = vertcat(hv, [ 1 i oo_.initial_exo_steady_state(i) oo_.exo_steady_state(i)]); end end end diff --git a/preprocessor b/preprocessor index 6235e6907..9b50a8a15 160000 --- a/preprocessor +++ b/preprocessor @@ -1 +1 @@ -Subproject commit 6235e6907526d468e2c35f14c38db1e308698bc9 +Subproject commit 9b50a8a159b7f0904809a726a55fcd1ad0e4acfb