Preprocessor: overhaul of M_ fields counting Ramsey/discretionary orig endos/eqs

– new fields: M_.ramsey_orig_{eq,endo}_nbr
– drop M_.ramsey_eq_nbr and M_.orig_eq_nbr
– new field: M_.discretionary_orig_eq_nbr
silicon
Sébastien Villemot 2023-03-28 18:54:52 +02:00
parent 674ebce84b
commit ffe6eb4d40
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
6 changed files with 37 additions and 31 deletions

View File

@ -16,7 +16,7 @@ function []=display_problematic_vars_Jacobian(problemrow,problemcol,M_,x,type,ca
% none.
%
% Copyright © 2014-2021 Dynare Team
% Copyright © 2014-2023 Dynare Team
%
% This file is part of Dynare.
%
@ -37,7 +37,7 @@ skipline();
if nargin<6
caller_string='';
end
initial_aux_eq_nbr=M_.ramsey_eq_nbr;
initial_aux_eq_nbr=M_.ramsey_orig_endo_nbr;
if strcmp(type,'dynamic')
for ii=1:length(problemrow)
if problemcol(ii)>max(M_.lead_lag_incidence)

View File

@ -100,10 +100,9 @@ params = M.params;
endo_nbr = M.endo_nbr;
endo_names = M.endo_names;
orig_endo_nbr = M.orig_endo_nbr;
aux_vars_type = [M.aux_vars.type];
orig_endo_aux_nbr = orig_endo_nbr + min(find(aux_vars_type == 6)) - 1;
orig_eq_nbr = M.orig_eq_nbr;
inst_nbr = orig_endo_aux_nbr - orig_eq_nbr;
ramsey_orig_endo_nbr = M.ramsey_orig_endo_nbr;
ramsey_orig_eq_nbr = M.ramsey_orig_eq_nbr;
inst_nbr = ramsey_orig_endo_nbr - ramsey_orig_eq_nbr;
% indices of Lagrange multipliers
fname = M.fname;
@ -161,7 +160,7 @@ end
% the auxiliary variables before the Lagrange multipliers are treated
% as ordinary endogenous variables
A = feval([fname '.ramsey_multipliers_static_g1'], xx, exo_ss, params, M.ramsey_multipliers_static_g1_sparse_rowval, M.ramsey_multipliers_static_g1_sparse_colval, M.ramsey_multipliers_static_g1_sparse_colptr);
y = res(1:orig_endo_aux_nbr);
y = res(1:ramsey_orig_endo_nbr);
mult = -A\y;
resids1 = y+A*mult;
@ -175,13 +174,13 @@ end
if options_.steadystate_flag
resids = r1;
else
resids = [res(orig_endo_aux_nbr+(1:orig_endo_nbr-inst_nbr)); r1];
resids = [res(ramsey_orig_endo_nbr+(1:orig_endo_nbr-inst_nbr)); r1];
end
rJ = [];
if needs_set_auxiliary_variables
steady_state = s_a_v_func([xx(1:orig_endo_aux_nbr); mult]);
steady_state = s_a_v_func([xx(1:ramsey_orig_endo_nbr); mult]);
else
steady_state = [xx(1:orig_endo_aux_nbr); mult];
steady_state = [xx(1:ramsey_orig_endo_nbr); mult];
end
function result = check_static_model(ys,M,options_,oo)

View File

@ -82,8 +82,7 @@ if options.ramsey_policy
else
[resids, ~ , jacob]= evaluate_static_model(ys,exo_ss,params,M,options);
end
n_ramsey_equations=M.ramsey_eq_nbr;
nan_indices=find(isnan(resids(n_ramsey_equations+1:n_ramsey_equations+M.orig_eq_nbr))); %
nan_indices=find(isnan(resids(M.ramsey_orig_endo_nbr+(1:M.ramsey_orig_eq_nbr))));
if ~isempty(nan_indices)
if options.debug
@ -106,7 +105,7 @@ if options.ramsey_policy
return
end
if any(imag(ys(n_ramsey_equations+1:n_ramsey_equations+M.orig_eq_nbr)))
if any(imag(ys(M.ramsey_orig_endo_nbr+(1:M.ramsey_orig_eq_nbr))))
if options.debug
fprintf('\nevaluate_steady_state: The steady state file computation for the Ramsey problem resulted in complex numbers.\n')
fprintf('evaluate_steady_state: The steady state was computed conditional on the following initial instrument values: \n')
@ -121,7 +120,7 @@ if options.ramsey_policy
return
end
if max(abs(resids(n_ramsey_equations+1:n_ramsey_equations+M.orig_eq_nbr))) > options.solve_tolf %does it solve for all variables except for the Lagrange multipliers
if max(abs(resids(M.ramsey_orig_endo_nbr+(1:M.ramsey_orig_eq_nbr)))) > options.solve_tolf %does it solve for all variables except for the Lagrange multipliers
if options.debug
fprintf('\nevaluate_steady_state: The steady state file does not solve the steady state for the Ramsey problem.\n')
fprintf('evaluate_steady_state: Conditional on the following instrument values: \n')
@ -129,9 +128,9 @@ if options.ramsey_policy
fprintf('\t %s \t %f \n',options.instruments{ii},ys_init(strmatch(options.instruments{ii},M.endo_names,'exact')))
end
fprintf('evaluate_steady_state: the following equations have non-zero residuals: \n')
for ii=n_ramsey_equations+1:M.endo_nbr
for ii=M.ramsey_orig_endo_nbr+1:M.endo_nbr
if abs(resids(ii)) > options.solve_tolf
fprintf('\t Equation number %d: %f\n',ii-n_ramsey_equations, resids(ii))
fprintf('\t Equation number %d: %f\n',ii-M.ramsey_orig_endo_nbr, resids(ii))
end
end
skipline(2)
@ -165,7 +164,7 @@ if options.ramsey_policy
end
end
if steadystate_flag
nan_indices_mult=find(isnan(resids(1:n_ramsey_equations)));
nan_indices_mult=find(isnan(resids(1:M.ramsey_orig_endo_nbr)));
if any(nan_indices_mult)
fprintf('evaluate_steady_state: The steady state results NaN for auxiliary equation %u.\n',nan_indices_mult);
fprintf('evaluate_steady_state: This is often a sign of problems.\n');
@ -200,9 +199,8 @@ if options.ramsey_policy
%check whether steady state really solves the model
resids = evaluate_static_model(ys,exo_ss,params,M,options);
n_ramsey_equations=M.ramsey_eq_nbr;
nan_indices_multiplier=find(isnan(resids(1:n_ramsey_equations)));
nan_indices=find(isnan(resids(n_ramsey_equations+1:end)));
nan_indices_multiplier=find(isnan(resids(1:M.ramsey_orig_endo_nbr)));
nan_indices=find(isnan(resids(M.ramsey_orig_endo_nbr+1:end)));
if ~isempty(nan_indices)
if options.debug
@ -248,14 +246,14 @@ if options.ramsey_policy
fprintf('\t %s \t %f \n',options.instruments{i},ys(strmatch(options.instruments{i},M.endo_names,'exact')))
end
fprintf('evaluate_steady_state: The following equations have non-zero residuals: \n')
for ii=1:n_ramsey_equations
for ii=1:M.ramsey_orig_endo_nbr
if abs(resids(ii)) > options.solve_tolf/100
fprintf('\t Auxiliary Ramsey equation number %d: %f\n',ii, resids(ii))
end
end
for ii=n_ramsey_equations+1:M.endo_nbr
for ii=M.ramsey_orig_endo_nbr+1:M.endo_nbr
if abs(resids(ii)) > options.solve_tolf/100
fprintf('\t Equation number %d: %f\n',ii-n_ramsey_equations, resids(ii))
fprintf('\t Equation number %d: %f\n',ii-M.ramsey_orig_endo_nbr, resids(ii))
end
end
skipline(2)

View File

@ -41,8 +41,7 @@ if options.ramsey_policy
%test whether specification matches
inst_nbr = size(options.instruments,1);
if inst_nbr~=0
orig_endo_aux_nbr = M.orig_endo_nbr + min(find([M.aux_vars.type] == 6)) - 1;
implied_inst_nbr = orig_endo_aux_nbr - M.orig_eq_nbr;
implied_inst_nbr = M.ramsey_orig_endo_nbr - M.ramsey_orig_eq_nbr;
if inst_nbr>implied_inst_nbr
warning('You have specified more steady state instruments than there are omitted equations. While there are use cases for this setup, it is rather unusual. Check whether this is desired.')
elseif inst_nbr<implied_inst_nbr

View File

@ -12,7 +12,7 @@ function z = resid(options_resid_)
% SPECIAL REQUIREMENTS
% none
% Copyright © 2001-2022 Dynare Team
% Copyright © 2001-2023 Dynare Team
%
% This file is part of Dynare.
%
@ -93,15 +93,25 @@ if nargout == 0
fprintf('Residuals of the static equations%s:',disp_string)
skipline()
any_non_zero_residual = false;
for i=1:M_.orig_eq_nbr
if abs(z(i+M_.ramsey_eq_nbr)) < options_.solve_tolf/100
if options_.ramsey_policy
first_eq = M_.ramsey_orig_endo_nbr+1;
last_eq = M_.ramsey_orig_endo_nbr+M_.ramsey_orig_eq_nbr;
elseif options_.discretionary_policy
first_eq = 1;
last_eq = M_.discretionary_orig_eq_nbr;
else
first_eq = 1;
last_eq = M_.orig_endo_nbr;
end
for i=first_eq:last_eq
if abs(z(i)) < options_.solve_tolf/100
tmp = 0;
else
tmp = z(i+M_.ramsey_eq_nbr);
tmp = z(i);
any_non_zero_residual = true;
end
if istag
tg = tags(cell2mat(tags(:,1)) == i+M_.ramsey_eq_nbr,2:3); % all tags for equation i
tg = tags(cell2mat(tags(:,1)) == i,2:3); % all tags for equation i
ind = strmatch('name', cellstr( tg(:,1) ) );
end
if ~(non_zero && tmp == 0)

@ -1 +1 @@
Subproject commit 70192aec718e5f1e13f1513a7a23e48c31f30714
Subproject commit 4282c98527817ed587d6df58b96a5d4432aa0072