Commit b0ce2dac authored by Marco Ratto's avatar Marco Ratto
Browse files

1) better trace all cases when the model does not solve, classifying cases...

1) better trace all cases when the model does not solve, classifying cases according to info output of dynare_resolve;
2) trap the case of memory allocation limit for too large model undergoing to reduced form mapping
parent d6993cec
...@@ -256,22 +256,36 @@ if fload==0, ...@@ -256,22 +256,36 @@ if fload==0,
M_.params(estim_params_.param_vals(:,1)) = lpmat(j,:)'; M_.params(estim_params_.param_vals(:,1)) = lpmat(j,:)';
%try stoch_simul([]); %try stoch_simul([]);
try try
[Tt,Rr,SteadyState,infox{j},M_,options_,oo_] = dynare_resolve(M_,options_,oo_,'restrict'); [Tt,Rr,SteadyState,info,M_,options_,oo_] = dynare_resolve(M_,options_,oo_,'restrict');
if infox{j}(1)==0 && ~exist('T'), infox(j,1)=info(1);
if infox(j,1)==0 && ~exist('T'),
dr_=oo_.dr; dr_=oo_.dr;
T=zeros(size(dr_.ghx,1),size(dr_.ghx,2)+size(dr_.ghu,2),Nsam); if prepSA,
try
T=zeros(size(dr_.ghx,1),size(dr_.ghx,2)+size(dr_.ghu,2),Nsam);
catch ME
if strcmp('MATLAB:nomem',ME.identifier),
prepSA=0;
disp('The model is too large for storing state space matrices ...')
disp('for mapping reduced form or for identification')
end
T=[];
end
else
T=[];
end
egg=zeros(length(dr_.eigval),Nsam); egg=zeros(length(dr_.eigval),Nsam);
end end
if infox{j}(1), if infox(j,1),
% disp('no solution'), % disp('no solution'),
if isfield(oo_.dr,'ghx'), if isfield(oo_.dr,'ghx'),
oo_.dr=rmfield(oo_.dr,'ghx'); oo_.dr=rmfield(oo_.dr,'ghx');
end end
if (infox{j}(1)<3 || infox{j}(1)>5) && isfield(oo_.dr,'eigval'), if (infox(j,1)<3 || infox(j,1)>5) && isfield(oo_.dr,'eigval'),
oo_.dr=rmfield(oo_.dr,'eigval'); oo_.dr=rmfield(oo_.dr,'eigval');
end end
end end
catch catch ME
if isfield(oo_.dr,'eigval'), if isfield(oo_.dr,'eigval'),
oo_.dr=rmfield(oo_.dr,'eigval'); oo_.dr=rmfield(oo_.dr,'eigval');
end end
...@@ -323,8 +337,10 @@ if fload==0, ...@@ -323,8 +337,10 @@ if fload==0,
dyn_waitbar(j/Nsam,h,['MC iteration ',int2str(j),'/',int2str(Nsam)]) dyn_waitbar(j/Nsam,h,['MC iteration ',int2str(j),'/',int2str(Nsam)])
end end
dyn_waitbar_close(h); dyn_waitbar_close(h);
if prepSA, if prepSA && jstab,
T=T(:,:,1:jstab); T=T(:,:,1:jstab);
else
T=[];
end end
istable=istable(find(istable)); % stable params istable=istable(find(istable)); % stable params
iunstable=iunstable(find(iunstable)); % unstable params iunstable=iunstable(find(iunstable)); % unstable params
...@@ -374,22 +390,22 @@ if fload==0, ...@@ -374,22 +390,22 @@ if fload==0,
if ~prepSA if ~prepSA
save([OutputDirectoryName '/' fname_ '_prior.mat'], ... save([OutputDirectoryName '/' fname_ '_prior.mat'], ...
'bkpprior','lpmat','lpmat0','iunstable','istable','iindeterm','iwrong', ... 'bkpprior','lpmat','lpmat0','iunstable','istable','iindeterm','iwrong', ...
'egg','yys','nspred','nboth','nfwrd') 'egg','yys','nspred','nboth','nfwrd','infox')
else else
save([OutputDirectoryName '/' fname_ '_prior.mat'], ... save([OutputDirectoryName '/' fname_ '_prior.mat'], ...
'bkpprior','lpmat','lpmat0','iunstable','istable','iindeterm','iwrong', ... 'bkpprior','lpmat','lpmat0','iunstable','istable','iindeterm','iwrong', ...
'egg','yys','T','nspred','nboth','nfwrd') 'egg','yys','T','nspred','nboth','nfwrd','infox')
end end
else else
if ~prepSA if ~prepSA
save([OutputDirectoryName '/' fname_ '_mc.mat'], ... save([OutputDirectoryName '/' fname_ '_mc.mat'], ...
'lpmat','lpmat0','iunstable','istable','iindeterm','iwrong', ... 'lpmat','lpmat0','iunstable','istable','iindeterm','iwrong', ...
'egg','yys','nspred','nboth','nfwrd') 'egg','yys','nspred','nboth','nfwrd','infox')
else else
save([OutputDirectoryName '/' fname_ '_mc.mat'], ... save([OutputDirectoryName '/' fname_ '_mc.mat'], ...
'lpmat','lpmat0','iunstable','istable','iindeterm','iwrong', ... 'lpmat','lpmat0','iunstable','istable','iindeterm','iwrong', ...
'egg','yys','T','nspred','nboth','nfwrd') 'egg','yys','T','nspred','nboth','nfwrd','infox')
end end
end end
else else
...@@ -398,7 +414,7 @@ else ...@@ -398,7 +414,7 @@ else
else else
filetoload=[OutputDirectoryName '/' fname_ '_mc.mat']; filetoload=[OutputDirectoryName '/' fname_ '_mc.mat'];
end end
load(filetoload,'lpmat','lpmat0','iunstable','istable','iindeterm','iwrong','egg','yys','nspred','nboth','nfwrd') load(filetoload,'lpmat','lpmat0','iunstable','istable','iindeterm','iwrong','egg','yys','nspred','nboth','nfwrd','infox')
Nsam = size(lpmat,1); Nsam = size(lpmat,1);
if pprior==0, if pprior==0,
eval(['load ' options_.mode_file '.mat;']); eval(['load ' options_.mode_file '.mat;']);
...@@ -467,14 +483,46 @@ delete([OutputDirectoryName,'/',fname_,'_',aunstname,'_corr_*.*']); ...@@ -467,14 +483,46 @@ delete([OutputDirectoryName,'/',fname_,'_',aunstname,'_corr_*.*']);
delete([OutputDirectoryName,'/',fname_,'_',aindname,'_corr_*.*']); delete([OutputDirectoryName,'/',fname_,'_',aindname,'_corr_*.*']);
if length(iunstable)>0 && length(iunstable)<Nsam, if length(iunstable)>0 && length(iunstable)<Nsam,
fprintf(['%4.1f%% of the prior support is stable.\n'],length(istable)/Nsam*100) fprintf(['%4.1f%% of the prior support gives unique saddle-path solution.\n'],length(istable)/Nsam*100)
fprintf(['%4.1f%% of the prior support is unstable.\n'],(length(iunstable)-length(iwrong)-length(iindeterm) )/Nsam*100) fprintf(['%4.1f%% of the prior support gives explosive dynamics.\n'],(length(iunstable)-length(iwrong)-length(iindeterm) )/Nsam*100)
if ~isempty(iindeterm), if ~isempty(iindeterm),
fprintf(['%4.1f%% of the prior support gives indeterminacy.'],length(iindeterm)/Nsam*100) fprintf(['%4.1f%% of the prior support gives indeterminacy.'],length(iindeterm)/Nsam*100)
end end
if ~isempty(iwrong), if ~isempty(iwrong),
disp(' '); disp(' ');
disp(['For ',num2str(length(iwrong)/Nsam*100,'%1.3f'),'\% of the prior support dynare could not find a solution.']) disp(['For ',num2str(length(iwrong)/Nsam*100,'%1.3f'),'\% of the prior support dynare could not find a solution.'])
disp(' ');
if any(infox==1),
disp([' For ',num2str(length(find(infox==1))/Nsam*100,'%1.3f'),'\% The model doesn''t determine the current variables uniquely.'])
end
if any(infox==2),
disp([' For ',num2str(length(find(infox==2))/Nsam*100,'%1.3f'),'\% MJDGGES returned an error code.'])
end
if any(infox==6),
disp([' For ',num2str(length(find(infox==6))/Nsam*100,'%1.3f'),'\% The jacobian evaluated at the deterministic steady state is complex.'])
end
if any(infox==19),
disp([' For ',num2str(length(find(infox==19))/Nsam*100,'%1.3f'),'\% The steadystate routine thrown an exception (inconsistent deep parameters).'])
end
if any(infox==20),
disp([' For ',num2str(length(find(infox==20))/Nsam*100,'%1.3f'),'\% Cannot find the steady state.'])
end
if any(infox==21),
disp([' For ',num2str(length(find(infox==21))/Nsam*100,'%1.3f'),'\% The steady state is complex.'])
end
if any(infox==22),
disp([' For ',num2str(length(find(infox==22))/Nsam*100,'%1.3f'),'\% The steady has NaNs.'])
end
if any(infox==23),
disp([' For ',num2str(length(find(infox==23))/Nsam*100,'%1.3f'),'\% M_.params has been updated in the steadystate routine and has complex valued scalars.'])
end
if any(infox==24),
disp([' For ',num2str(length(find(infox==24))/Nsam*100,'%1.3f'),'\% M_.params has been updated in the steadystate routine and has some NaNs.'])
end
if any(infox==30),
disp([' For ',num2str(length(find(infox==30))/Nsam*100,'%1.3f'),'\% Ergodic variance can''t be computed.'])
end
end end
disp(' '); disp(' ');
% Blanchard Kahn % Blanchard Kahn
...@@ -561,7 +609,7 @@ if length(iunstable)>0 && length(iunstable)<Nsam, ...@@ -561,7 +609,7 @@ if length(iunstable)>0 && length(iunstable)<Nsam,
end end
else else
if length(iunstable)==0, if length(iunstable)==0,
disp('All parameter values in the specified ranges are stable!') disp('All parameter values in the specified ranges give unique saddle-path solution!')
x0=0.5.*(bayestopt_.ub(1:nshock)-bayestopt_.lb(1:nshock))+bayestopt_.lb(1:nshock); x0=0.5.*(bayestopt_.ub(1:nshock)-bayestopt_.lb(1:nshock))+bayestopt_.lb(1:nshock);
x0 = [x0; lpmat(istable(1),:)']; x0 = [x0; lpmat(istable(1),:)'];
else else
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment