From 2ccd3d4a0e01d11d8b6dfcf18d8d2a825b1b88d2 Mon Sep 17 00:00:00 2001
From: Marco Ratto <marco.ratto@ec.europa.eu>
Date: Wed, 19 Oct 2022 18:59:53 +0200
Subject: [PATCH] if max_periods is set to finite number, enforce algorithm to
check ahead ONLY until max_periods (i.e. when we want agents to be myopic
beyond some future period)
---
matlab/+occbin/solve_one_constraint.m | 16 +++++++++++++---
matlab/+occbin/solve_two_constraints.m | 26 +++++++++++++++++++-------
2 files changed, 32 insertions(+), 10 deletions(-)
diff --git a/matlab/+occbin/solve_one_constraint.m b/matlab/+occbin/solve_one_constraint.m
index 97eec6a206..27d01a7204 100644
--- a/matlab/+occbin/solve_one_constraint.m
+++ b/matlab/+occbin/solve_one_constraint.m
@@ -140,6 +140,10 @@ for shock_period = 1:n_shocks_periods
binding_indicator = [binding_indicator; false ];
nperiods_0 = nperiods_0 + 1;
disp_verbose(['nperiods has been endogenously increased up to ' int2str(nperiods_0) '.'],opts_simul_.debug)
+ elseif nperiods_0>=opts_simul_.max_periods
+ % enforce endogenously increased nperiods to not violate max_periods
+ binding_indicator = binding_indicator(1:opts_simul_.max_periods+1);
+ binding_indicator(end)=false;
end
if length(binding_indicator)<(nperiods_0 + 1)
binding_indicator=[binding_indicator; false(nperiods_0 + 1-length(binding_indicator),1)];
@@ -184,11 +188,17 @@ for shock_period = 1:n_shocks_periods
[binding, relax, err]=feval([M_.fname,'.occbin_difference'],zdatalinear_+repmat(dr_base.ys',size(zdatalinear_,1),1),M_.params,dr_base.ys);
+ if ~isinf(opts_simul_.max_periods) && opts_simul_.max_periods<length(binding_indicator)
+ end_periods = opts_simul_.max_periods;
+ else
+ end_periods = length(binding_indicator);
+ end
% check if changes to the hypothesis of the duration for each
% regime
- if any(binding.constraint_1 & ~binding_indicator) || any(relax.constraint_1 & binding_indicator)
- err_viol = err.binding_constraint_1(binding.constraint_1 & ~binding_indicator);
- err_relax = err.relax_constraint_1(relax.constraint_1 & binding_indicator);
+ if any(binding.constraint_1(1:end_periods) & ~binding_indicator(1:end_periods)) || any(relax.constraint_1(1:end_periods) & binding_indicator(1:end_periods))
+
+ err_viol = err.binding_constraint_1(binding.constraint_1(1:end_periods) & ~binding_indicator(1:end_periods));
+ err_relax = err.relax_constraint_1(relax.constraint_1(1:end_periods) & binding_indicator(1:end_periods));
max_err(iter) = max(abs([err_viol;err_relax]));
regime_change_this_iteration = true;
else
diff --git a/matlab/+occbin/solve_two_constraints.m b/matlab/+occbin/solve_two_constraints.m
index 59cff8ff52..4e448b241f 100644
--- a/matlab/+occbin/solve_two_constraints.m
+++ b/matlab/+occbin/solve_two_constraints.m
@@ -148,6 +148,10 @@ for shock_period = 1:n_shocks_periods
binding_indicator = [binding_indicator; false(1,2)];
nperiods_0 = nperiods_0 + 1;
disp_verbose(['nperiods has been endogenously increased up to ' int2str(nperiods_0) '.'],opts_simul_.debug)
+ elseif nperiods_0>=opts_simul_.max_periods
+ % enforce endogenously increased nperiods to not violate max_periods
+ binding_indicator = binding_indicator(1:opts_simul_.max_periods+1,:);
+ binding_indicator(end,:)=false(1,2);
end
if size(binding_indicator,1)<(nperiods_0 + 1)
binding_indicator=[binding_indicator; false(nperiods_0 + 1-size(binding_indicator,1),2)];
@@ -179,6 +183,7 @@ for shock_period = 1:n_shocks_periods
if shock_period==1 || shock_period>1 && any(data.shocks_sequence(shock_period,:)) % first period or shock happening
if iter==1 && opts_simul_.reset_regime_in_new_period
if opts_simul_.reset_check_ahead_periods_in_new_period
+ % I re-set check ahead periods to initial value, when in previous period it was endogenously increased
nperiods_0 = max(opts_simul_.check_ahead_periods,n_periods-n_shocks_periods);
binding_indicator = false(nperiods_0+1,2);
else
@@ -200,16 +205,23 @@ for shock_period = 1:n_shocks_periods
data.exo_pos,data.shocks_sequence(shock_period,:),endo_init, update_flag);
[binding, relax, err]=feval([M_.fname,'.occbin_difference'],zdatalinear_+repmat(dr.ys',size(zdatalinear_,1),1),M_.params,dr.ys);
- binding_constraint_new=[binding.constraint_1;binding.constraint_2];
- relaxed_constraint_new = [relax.constraint_1;relax.constraint_2];
+
+ if ~isinf(opts_simul_.max_periods) && opts_simul_.max_periods<length(binding_indicator)
+ end_periods = opts_simul_.max_periods;
+ else
+ end_periods = length(binding_indicator);
+ end
+ binding_constraint_new=[binding.constraint_1(1:end_periods);binding.constraint_2(1:end_periods)];
+ relaxed_constraint_new = [relax.constraint_1(1:end_periods);relax.constraint_2(1:end_periods)];
+ my_binding_indicator = binding_indicator(1:end_periods,:);
- err_binding_constraint_new = [err.binding_constraint_1; err.binding_constraint_2];
- err_relaxed_constraint_new = [err.relax_constraint_1; err.relax_constraint_2];
+ err_binding_constraint_new = [err.binding_constraint_1(1:end_periods); err.binding_constraint_2(1:end_periods)];
+ err_relaxed_constraint_new = [err.relax_constraint_1(1:end_periods); err.relax_constraint_2(1:end_periods)];
% check if changes_
- if any(binding_constraint_new & ~binding_indicator(:)) || any(relaxed_constraint_new & binding_indicator(:))
- err_violation = err_binding_constraint_new(binding_constraint_new & ~binding_indicator(:));
- err_relax = err_relaxed_constraint_new(relaxed_constraint_new & binding_indicator(:));
+ if any(binding_constraint_new & ~my_binding_indicator(:)) || any(relaxed_constraint_new & my_binding_indicator(:))
+ err_violation = err_binding_constraint_new(binding_constraint_new & ~my_binding_indicator(:));
+ err_relax = err_relaxed_constraint_new(relaxed_constraint_new & my_binding_indicator(:));
max_err(iter) = max(abs([err_violation;err_relax]));
regime_change_this_iteration = true;
else
--
GitLab