From ffe6eb4d4079e630fb5bf1dda48fedf7bddbbc9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Tue, 28 Mar 2023 18:54:52 +0200 Subject: [PATCH] Preprocessor: overhaul of M_ fields counting Ramsey/discretionary orig endos/eqs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit – 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 --- matlab/display_problematic_vars_Jacobian.m | 4 ++-- matlab/dyn_ramsey_static.m | 15 +++++++------- matlab/evaluate_steady_state.m | 24 ++++++++++------------ matlab/model_diagnostics.m | 3 +-- matlab/resid.m | 20 +++++++++++++----- preprocessor | 2 +- 6 files changed, 37 insertions(+), 31 deletions(-) diff --git a/matlab/display_problematic_vars_Jacobian.m b/matlab/display_problematic_vars_Jacobian.m index 07fe5ecf1..f204b421a 100644 --- a/matlab/display_problematic_vars_Jacobian.m +++ b/matlab/display_problematic_vars_Jacobian.m @@ -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) diff --git a/matlab/dyn_ramsey_static.m b/matlab/dyn_ramsey_static.m index f23db49d8..c9bb88479 100644 --- a/matlab/dyn_ramsey_static.m +++ b/matlab/dyn_ramsey_static.m @@ -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) diff --git a/matlab/evaluate_steady_state.m b/matlab/evaluate_steady_state.m index b2be3d054..3ac5164e8 100644 --- a/matlab/evaluate_steady_state.m +++ b/matlab/evaluate_steady_state.m @@ -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) diff --git a/matlab/model_diagnostics.m b/matlab/model_diagnostics.m index 752d1416a..845bc8586 100644 --- a/matlab/model_diagnostics.m +++ b/matlab/model_diagnostics.m @@ -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