diff --git a/NEWS b/NEWS index 8cec1a2f2..41c273654 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,56 @@ +Announcement for Dynare 4.5.4 (on 2018-01-29) +============================================= + +We are pleased to announce the release of Dynare 4.5.4. + +This is a bugfix release. + +The Windows packages are already available for download at: + + http://www.dynare.org/download/dynare-stable + +The Mac and GNU/Linux packages (for Debian and Ubuntu LTS) should follow soon. + +This release is compatible with MATLAB versions 7.5 (R2007b) to 9.3 (R2017b) +and with GNU Octave versions 4.2. + +Here is a list of the problems identified in version 4.5.3 and that have been +fixed in version 4.5.4: + + - The `type` option of `plot_shock_decomposition` was always set to `qoq` regardless of what is specified. + + - Bug in GSA when no parameter was detected below pvalue threshold. + + - Various bug fixes in shock decompositions. + + - Bug in reading in macro arrays passed on `dynare` command line via the `-D` option. + + - Estimation with missing values was crashing if the `prefilter` option was used. + + - Added a workaround for a difference in behaviour between Octave and Matlab regarding the creation + of function handles for functions that do not exist in the path. With Octave 4.2.1, steady state + files did not work if no auxiliary variables were created. + + - The `stoch_simul` command was crashing with a cryptic message if option `order=3` was used without + setting `k_order_solver`. + + - In cases where the prior bounds are infinite and the mode is estimated at exactly 0, no `mode_check` + graphs were displayed. + + - Parallel execution of MCMC was broken in models without auxiliary variables. + + - Reading data with column names from Excel might crash. + + - The multivariate Kalman smoother was crashing in case of missing data in the observations and + `Finf` became singular. + + - The `plot_shock_decomposition` command ignored various user-defined options like `fig_name`, + `use_shock_groups` or `interactive` and instead used the default options. + + - Nested `@#ifdef` and `@#ifndef` statements don't work in the macroprocessor. + + + Announcement for Dynare 4.5.3 (on 2017-10-19) ============================================= @@ -12,7 +65,7 @@ The Windows packages are already available for download at: The Mac and GNU/Linux packages (for Debian and Ubuntu LTS) should follow soon. -This release is compatible with MATLAB versions 7.3 (R2006b) to 9.3 (R2017b) +This release is compatible with MATLAB versions 7.5 (R2007b) to 9.3 (R2017b) and with GNU Octave versions 4.2. Here is a list of the problems identified in version 4.5.2 and that have been @@ -37,7 +90,7 @@ The Windows packages are already available for download at: The Mac and GNU/Linux packages (for Debian and Ubuntu LTS) should follow soon. -This release is compatible with MATLAB versions 7.3 (R2006b) to 9.3 (R2017b) +This release is compatible with MATLAB versions 7.5 (R2007b) to 9.3 (R2017b) and with GNU Octave versions 4.2. Here is a list of the problems identified in version 4.5.1 and that have been @@ -116,7 +169,7 @@ The Windows packages are already available for download at: The Mac and GNU/Linux packages (for Debian and Ubuntu LTS) should follow soon. -This release is compatible with MATLAB versions 7.3 (R2006b) to 9.2 (R2017a) +This release is compatible with MATLAB versions 7.5 (R2007b) to 9.2 (R2017a) and with GNU Octave versions 4.2. Here is a list of the problems identified in version 4.5.0 and that have been @@ -162,7 +215,7 @@ The Mac and Debian/Ubuntu packages should follow soon. All users are strongly encouraged to upgrade. -This release is compatible with MATLAB versions ranging from 7.3 (R2006b) to +This release is compatible with MATLAB versions ranging from 7.5 (R2007b) to 9.2 (R2017a) and with GNU Octave version 4.2. Here is the list of major user-visible changes: diff --git a/doc/dynare.texi b/doc/dynare.texi index 5ef6a6e42..69de25400 100644 --- a/doc/dynare.texi +++ b/doc/dynare.texi @@ -7602,9 +7602,9 @@ model). (@xref{plot_shock_decomposition}). @item presample = @var{INTEGER} -@anchor{presample_shock_decomposition} First data point from which recursive +@anchor{presample_shock_decomposition} Data point above which recursive realtime shock decompositions are computed, @i{i.e.} for -@math{T=[@code{presample}@dots{}@code{nobs}]}. +@math{T=[@code{presample+1}@dots{}@code{nobs}]}. @item forecast = @var{INTEGER} @anchor{forecast_shock_decomposition} Compute shock decompositions up to @@ -7613,6 +7613,13 @@ realtime shock decompositions are computed, @i{i.e.} for @item save_realtime = @var{INTEGER_VECTOR} @anchor{save_realtime} Choose for which vintages to save the full realtime shock decomposition. Default: @math{0}. + +@item fast_realtime = @var{INTEGER} +@anchor{fast_realtime} Runs the smoother only twice: once for the last in-sample +and once for the last out-of-sample data point, where the provided integer defines the last observation +(equivalent to @ref{nobs}). +Default: not enabled. + @end table @outputhead diff --git a/matlab/DsgeSmoother.m b/matlab/DsgeSmoother.m index 6466ad2f1..793afa561 100644 --- a/matlab/DsgeSmoother.m +++ b/matlab/DsgeSmoother.m @@ -58,7 +58,7 @@ function [alphahat,etahat,epsilonhat,ahat,SteadyState,trend_coeff,aK,T,R,P,PK,de % SPECIAL REQUIREMENTS % None -% Copyright (C) 2006-2017 Dynare Team +% Copyright (C) 2006-2018 Dynare Team % % This file is part of Dynare. % @@ -183,7 +183,7 @@ elseif options_.lik_init == 3 % Diffuse Kalman filter Z = [Z, eye(vobs)]; end end - [Pstar,Pinf] = compute_Pinf_Pstar(mf,T,R,Q,options_.qz_criterium,oo_.dr.restrict_var_list); + [Pstar,Pinf] = compute_Pinf_Pstar(mf,T,R,Q,options_.qz_criterium); elseif options_.lik_init == 4 % Start from the solution of the Riccati equation. [err, Pstar] = kalman_steady_state(transpose(T),R*Q*transpose(R),transpose(build_selection_matrix(mf,np,vobs)),H); mexErrCheck('kalman_steady_state',err); diff --git a/matlab/check_list_of_variables.m b/matlab/check_list_of_variables.m index 332372665..8fabffe54 100644 --- a/matlab/check_list_of_variables.m +++ b/matlab/check_list_of_variables.m @@ -31,8 +31,7 @@ function varlist = check_list_of_variables(options_, M_, varlist) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -%get uniques - +% Get uniques [junk1, junk2, index_uniques] = varlist_indices(varlist, M_.endo_names); varlist = varlist(index_uniques); @@ -130,7 +129,7 @@ elseif isempty(varlist) && isempty(options_.endo_vars_for_moment_computations_in elseif choice==2 varlist = options_.varobs; elseif choice==3 - varlist = NaN; + varlist = cell(0); else skipline() disp('YOU HAVE TO ANSWER 1, 2 or 3!') @@ -138,7 +137,7 @@ elseif isempty(varlist) && isempty(options_.endo_vars_for_moment_computations_in end end end - if isnan(varlist) + if isempty(varlist) edit([M_.fname '.mod']) end skipline() diff --git a/matlab/compute_Pinf_Pstar.m b/matlab/compute_Pinf_Pstar.m index d847ffacc..0ccbd02d8 100644 --- a/matlab/compute_Pinf_Pstar.m +++ b/matlab/compute_Pinf_Pstar.m @@ -30,7 +30,7 @@ function [Pstar,Pinf] = compute_Pinf_Pstar(mf,T,R,Q,qz_criterium, restrict_colum % SPECIAL REQUIREMENTS % None -% Copyright (C) 2006-2017 Dynare Team +% Copyright (C) 2006-2018 Dynare Team % % This file is part of Dynare. % @@ -48,8 +48,22 @@ function [Pstar,Pinf] = compute_Pinf_Pstar(mf,T,R,Q,qz_criterium, restrict_colum % along with Dynare. If not, see . np = size(T,1); +if nargin == 6 + indx = restrict_columns; + indx0=find(~ismember([1:np],indx)); +else + indx=(find(max(abs(T))>=1.e-10)); + indx0=(find(max(abs(T))<1.e-10)); +end +np0=length(indx0); +Tbkp = T; +T0=T(indx0,indx); % static variables vs. dynamic ones +R0=R(indx0,:); % matrix of shocks for static variables -% perform Kitagawa transformation +% Perform Kitagawa transformation only for non-zero columns of T +T=T(indx,indx); +R=R(indx,:); +np = size(T,1); [QT,ST] = schur(T); e1 = abs(ordeig(ST)) > 2-qz_criterium; [QT,ST] = ordschur(QT,ST,e1); @@ -59,7 +73,6 @@ nk1 = nk+1; Pstar = zeros(np,np); R1 = QT'*R; B = R1*Q*R1'; -% computes variance of stationary block (lower right) i = np; while i >= nk+2 if ST(i,i-1) == 0 @@ -100,13 +113,64 @@ if i == nk+1 Pstar(nk1,nk1)=(B(nk1,nk1)+c)/(1-ST(nk1,nk1)*ST(nk1,nk1)); end +if np0 + ST1=ST; + % Now I recover stationarized static variables using + % ss = s-A*z + % and + % z-z(-1) (growth rates of unit roots) only depends on stationary variables + Pstar = blkdiag(zeros(np0),Pstar); + ST = [zeros(length(Pstar),length(indx0)) [T0*QT ;ST]]; + R1 = [R0; R1]; + % Build the matrix for stationarized variables + STinf = ST(np0+1:np0+nk,np0+1:np0+nk); + iSTinf = inv(STinf); + ST0=ST; + ST0(:,1:np0+nk)=0; % stationarized static + 1st difference only respond to lagged stationary states + ST00 = ST(1:np0,np0+1:np0+nk); + % A\B is the matrix division of A into B, which is roughly the + % same as INV(A)*B + ST0(1:np0,np0+nk+1:end) = ST(1:np0,np0+nk+1:end)-ST00*(iSTinf*ST(np0+1:np0+nk,np0+nk+1:end)); % snip non-stationary part + R10 = R1; + R10(1:np0,:) = R1(1:np0,:)-ST00*(iSTinf*R1(np0+1:np0+nk,:)); % snip non-stationary part + % Kill non-stationary part before projecting Pstar + ST0(np0+1:np0+nk,:)=0; + R10(np0+1:np0+nk,:)=0; % is this questionable???? IT HAS TO in order to match Michel's version!!! + % project Pstar onto static x + Pstar = ST0*Pstar*ST0'+R10*Q*R10'; + % QT(1:np0,np0+1:np0+nk) = QT(1:np0,np0+1:np0+nk)+ST(1:np0,np0+1:np0+nk); %%% is this questionable ???? + % reorder QT entries +else + STinf = ST(np0+1:np0+nk,np0+1:np0+nk); +end + % stochastic trends with no influence on observed variables are % arbitrarily initialized to zero Pinf = zeros(np,np); Pinf(1:nk,1:nk) = eye(nk); -for k = 1:nk - if norm(QT(mf,:)*ST(:,k)) < 1e-8 - Pinf(k,k) = 0; +if np0 + STtriu = STinf-eye(nk); +% A\B is the matrix division of A into B, which is roughly the +% same as INV(A)*B + STinf0 = ST00*(eye(nk)-iSTinf*STtriu); + Pinf = blkdiag(zeros(np0),Pinf); + QT = blkdiag(eye(np0),QT); + QTinf = QT; + QTinf(1:np0,np0+1:np0+nk) = STinf0; + QTinf([indx0(:); indx(:)],:) = QTinf; + STinf1 = [zeros(np0+np,np0) [STinf0; eye(nk); zeros(np-nk,nk)] zeros(np0+np,np-nk)]; + for k = 1:nk + if norm(QTinf(mf,:)*ST([indx0(:); indx(:)],k+np0)) < 1e-8 + Pinf(k+np0,k+np0) = 0; + end + end + Pinf = STinf1*Pinf*STinf1'; + QT([indx0(:); indx(:)],:) = QT; +else + for k = 1:nk + if norm(QT(mf,:)*ST(:,k)) < 1e-8 + Pinf(k+np0,k+np0) = 0; + end end end diff --git a/matlab/discretionary_policy_engine.m b/matlab/discretionary_policy_engine.m index 05c781ae4..ba12347b8 100644 --- a/matlab/discretionary_policy_engine.m +++ b/matlab/discretionary_policy_engine.m @@ -48,7 +48,7 @@ function [H,G,retcode]=discretionary_policy_engine(AAlag,AA0,AAlead,BB,bigw,inst % Dennis, Richard (2007): Optimal policy in rational expectations models: new solution algorithms, % Macroeconomic Dynamics, 11, 31–55. -% Copyright (C) 2007-2017 Dynare Team +% Copyright (C) 2007-2018 Dynare Team % % This file is part of Dynare. % @@ -112,9 +112,9 @@ F1=F10; while 1 iter=iter+1; P=SylvesterDoubling(W+beta*F1'*Q*F1,beta*H1',H1,discretion_tol,solve_maxit); - if any(any(isnan(P))) + if any(any(isnan(P))) || any(any(isinf(P))) P=SylvesterHessenbergSchur(W+beta*F1'*Q*F1,beta*H1',H1); - if any(any(isnan(P))) + if any(any(isnan(P))) || any(any(isinf(P))) retcode=2; return end diff --git a/matlab/disp_steady_state.m b/matlab/disp_steady_state.m index 70f52173b..8c1bd549b 100644 --- a/matlab/disp_steady_state.m +++ b/matlab/disp_steady_state.m @@ -32,9 +32,9 @@ function disp_steady_state(M,oo) skipline() disp('STEADY-STATE RESULTS:') skipline() -endo_names = M.endo_names; +endo_names = char(M.endo_names); steady_state = oo.steady_state; for i = 1:M.orig_endo_nbr - disp(sprintf('%s \t\t %g', endo_names{i}, steady_state(i))); + fprintf('%s \t\t %g\n', endo_names(i,:), steady_state(i)); end diff --git a/matlab/dsge_likelihood.m b/matlab/dsge_likelihood.m index c3e69b0ef..3ea377dcf 100644 --- a/matlab/dsge_likelihood.m +++ b/matlab/dsge_likelihood.m @@ -115,7 +115,7 @@ function [fval,info,exit_flag,DLIK,Hess,SteadyState,trend_coeff,Model,DynareOpti %! @end deftypefn %@eod: -% Copyright (C) 2004-2017 Dynare Team +% Copyright (C) 2004-2018 Dynare Team % % This file is part of Dynare. % @@ -372,7 +372,7 @@ switch DynareOptions.lik_init error(['The model requires Diffuse filter, but you specified a different Kalman filter. You must set options_.kalman_algo ' ... 'to 0 (default), 3 or 4']) end - [Pstar,Pinf] = compute_Pinf_Pstar(Z,T,R,Q,DynareOptions.qz_criterium,[1:length(T)]); + [Pstar,Pinf] = compute_Pinf_Pstar(Z,T,R,Q,DynareOptions.qz_criterium); Z =zeros(length(BayesInfo.mf),size(T,1)); for i = 1:length(BayesInfo.mf) Z(i,BayesInfo.mf(i))=1; diff --git a/matlab/dynare_estimation_1.m b/matlab/dynare_estimation_1.m index 49a48a3ec..200898e00 100644 --- a/matlab/dynare_estimation_1.m +++ b/matlab/dynare_estimation_1.m @@ -422,6 +422,7 @@ end if (any(bayestopt_.pshape >0 ) && options_.mh_replic) || ... (any(bayestopt_.pshape >0 ) && options_.load_mh_file) %% not ML estimation + bounds = prior_bounds(bayestopt_, options_.prior_trunc); %reset bounds as lb and ub must only be operational during mode-finding outside_bound_pars=find(xparam1 < bounds.lb | xparam1 > bounds.ub); if ~isempty(outside_bound_pars) for ii=1:length(outside_bound_pars) diff --git a/matlab/evaluate_steady_state_file.m b/matlab/evaluate_steady_state_file.m index 104ae71e5..be84e6f39 100644 --- a/matlab/evaluate_steady_state_file.m +++ b/matlab/evaluate_steady_state_file.m @@ -70,7 +70,14 @@ else updated_params_flag = 0; end -h_set_auxiliary_variables = str2func([M.fname '_set_auxiliary_variables']); +if M.set_auxiliary_variables + % Define function handle for the function setting the auxiliary + % variables only if the model has auxiliary variables. Otherwise + % Octave may crash (see https://savannah.gnu.org/bugs/?52568) because + % the function does not exist in the path. + h_set_auxiliary_variables = str2func([M.fname '_set_auxiliary_variables']); +end + if isnan(updated_params_flag) || (updated_params_flag && any(isnan(params(~isnan(params))-params1(~isnan(params))))) %checks if new NaNs were added info(1) = 24; info(2) = NaN; diff --git a/matlab/expand_group.m b/matlab/expand_group.m index c20d38c37..1793c9c21 100644 --- a/matlab/expand_group.m +++ b/matlab/expand_group.m @@ -34,16 +34,19 @@ mydata=get(findobj(gcf,'tag',['group' int2str(ic)]),'userdata'); if isfield(mydata,'shock_decomp') options.shock_decomp=mydata.shock_decomp; end +options.plot_shock_decomp=mydata.plot_shock_decomp; +options.first_obs=mydata.first_obs; +options.nobs=mydata.nobs; % define expanded group label = mydata.shock_group.label; shocks = mydata.shock_group.shocks; -options.shock_decomp.fig_name = [mydata.fig_name '. Expand']; -options.use_shock_groups = strrep(label,' ','_'); %[use_shock_groups_old int2str(ic)]; +options.plot_shock_decomp.fig_name = [mydata.fig_name '. Expand']; +options.plot_shock_decomp.use_shock_groups = strrep(label,' ','_'); %[use_shock_groups_old int2str(ic)]; for j=1:length(shocks) - M.shock_groups.(options.use_shock_groups).(['group' int2str(j)]).label=shocks{j}; - M.shock_groups.(options.use_shock_groups).(['group' int2str(j)]).shocks=shocks(j); + M.shock_groups.(options.plot_shock_decomp.use_shock_groups).(['group' int2str(j)]).label=shocks{j}; + M.shock_groups.(options.plot_shock_decomp.use_shock_groups).(['group' int2str(j)]).shocks=shocks(j); end -options.shock_decomp.interactive=0; -options.shock_decomp.expand=1; +options.plot_shock_decomp.interactive=0; +options.plot_shock_decomp.expand=1; plot_shock_decomposition(M,oo,options,var_list_); diff --git a/matlab/graph_decomp.m b/matlab/graph_decomp.m index 33793d276..81e971693 100644 --- a/matlab/graph_decomp.m +++ b/matlab/graph_decomp.m @@ -193,12 +193,15 @@ for j=1:nvar mydata.fig_name = DynareOptions.plot_shock_decomp.fig_name(2:end); mydata.use_shock_groups = DynareOptions.plot_shock_decomp.use_shock_groups; mydata.shock_group = shock_groups.(shock_ind{i}); - mydata.shock_decomp = DynareOptions.plot_shock_decomp; - if ~isempty(mydata.shock_group.shocks{1}) + mydata.shock_decomp = DynareOptions.shock_decomp; + mydata.plot_shock_decomp = DynareOptions.plot_shock_decomp; + mydata.first_obs = DynareOptions.first_obs; + mydata.nobs = DynareOptions.nobs; + if ~isempty(mydata.shock_group.shocks) c = uicontextmenu; hl.UIContextMenu=c; browse_menu = uimenu(c,'Label','Browse group'); - expand_menu = uimenu(c,'Label','Expand group','Callback',['expand_group(''' mydata.use_shock_groups ''',''' deblank(mydata.shock_decomp.orig_varlist(j,:)) ''',' int2str(i) ')']); + expand_menu = uimenu(c,'Label','Expand group','Callback',['expand_group(''' mydata.plot_shock_decomp.use_shock_groups ''',''' deblank(mydata.plot_shock_decomp.orig_varlist{j}) ''',' int2str(i) ')']); set(expand_menu,'UserData',mydata,'Tag',['group' int2str(i)]); for jmember = mydata.shock_group.shocks uimenu('parent',browse_menu,'Label',char(jmember)) diff --git a/matlab/graph_decomp_detail.m b/matlab/graph_decomp_detail.m index 39e6fd7cf..70dc4d640 100644 --- a/matlab/graph_decomp_detail.m +++ b/matlab/graph_decomp_detail.m @@ -195,12 +195,15 @@ for j=1:nvar mydata.fig_name = DynareOptions.plot_shock_decomp.fig_name(2:end); mydata.use_shock_groups = DynareOptions.plot_shock_decomp.use_shock_groups; mydata.shock_group = shock_groups.(shock_ind{ic}); - mydata.shock_decomp = DynareOptions.plot_shock_decomp; + mydata.shock_decomp = DynareOptions.shock_decomp; + mydata.plot_shock_decomp = DynareOptions.plot_shock_decomp; + mydata.first_obs = DynareOptions.first_obs; + mydata.nobs = DynareOptions.nobs; if ~isempty(mydata.shock_group.shocks) c = uicontextmenu; hax.UIContextMenu=c; browse_menu = uimenu(c,'Label','Browse group'); - expand_menu = uimenu(c,'Label','Expand group','Callback',['expand_group(''' mydata.use_shock_groups ''',''' deblank(mydata.shock_decomp.orig_varlist(j,:)) ''',' int2str(ic) ')']); + expand_menu = uimenu(c,'Label','Expand group','Callback',['expand_group(''' mydata.plot_shock_decomp.use_shock_groups ''',''' deblank(mydata.plot_shock_decomp.orig_varlist{j}) ''',' int2str(ic) ')']); set(expand_menu,'UserData',mydata,'Tag',['group' int2str(ic)]); for jmember = mydata.shock_group.shocks uimenu('parent',browse_menu,'Label',char(jmember)) diff --git a/matlab/gsa/redform_map.m b/matlab/gsa/redform_map.m index fbc56af00..4e5923ceb 100644 --- a/matlab/gsa/redform_map.m +++ b/matlab/gsa/redform_map.m @@ -232,10 +232,27 @@ for j = 1:length(anamendo) istable=[1:length(iy)]; save([xdir,filesep, fname_ '_' type '_' namendo,'_vs_', namexo '_threshold' ],'lpmat','lpmat0','istable','y0','x0','xx0','iy','iyc') lpmat=[]; lpmat0=[]; istable=[]; + if length(iy)<=10 || length(iyc)<=10 + icheck = []; % do the generic plot in any case + end else icheck=[]; end if isempty(icheck) + if length(iy)<=10 + if isempty(iy) + disp(['There are NO MC samples in the desired range [' num2str(threshold) ']!']) + else + disp(['There are TOO FEW (<=10) MC samples in the desired range [' num2str(threshold) ']!']) + end + elseif length(iyc)<=10 + if isempty(iyc) + disp(['ALL MC samples are in the desired range [' num2str(threshold) ']!']) + else + disp(['Almost ALL MC samples are in the desired range [' num2str(threshold) ']!']) + disp('There are TOO FEW (<=10) MC samples OUTSIDE the desired range!') + end + end atitle0=['Monte Carlo Filtering for ',namendo,' vs ', namexo]; options_mcf.title = atitle0; indmcf = redform_mcf(y0, x0, options_mcf, options_); @@ -280,6 +297,8 @@ for j = 1:length(anamendo) end end + else + disp(['This entry in the shock matrix is CONSTANT = ' num2str(mean(y0),3)]) end end end @@ -369,11 +388,28 @@ for j = 1:length(anamendo) istable=[1:length(iy)]; save([xdir,filesep, fname_ '_' type '_' namendo,'_vs_', namlagendo '_threshold' ],'lpmat','lpmat0','istable','y0','x0','xx0','iy','iyc') lpmat=[]; lpmat0=[]; istable=[]; + if length(iy)<=10 || length(iyc)<=10, + icheck = []; % do the generic plot in any case + end else icheck = []; end if isempty(icheck) + if length(iy)<=10 + if isempty(iy) + disp(['There are NO MC samples in the desired range [' num2str(threshold) ']!']) + else + disp(['There are TOO FEW (<=10) MC samples in the desired range [' num2str(threshold) ']!']) + end + elseif length(iyc)<=10 + if isempty(iyc) + disp(['ALL MC samples are in the desired range [' num2str(threshold) ']!']) + else + disp(['Almost ALL MC samples are in the desired range [' num2str(threshold) ']!']) + disp('There are TOO FEW (<=10) MC samples OUTSIDE the desired range!') + end + end atitle0=['Monte Carlo Filtering for ',namendo,' vs ', namlagendo]; options_mcf.title = atitle0; indmcf = redform_mcf(y0, x0, options_mcf, options_); @@ -417,6 +453,8 @@ for j = 1:length(anamendo) end end + else + disp(['This entry in the transition matrix is CONSTANT = ' num2str(mean(y0),3)]) end end end @@ -736,6 +774,11 @@ for jt=1:10 end [proba, dproba] = stab_map_1(x0, indy{1}, indy{end}, [],0); indmcf=find(proba1.') end t = t+1; end diff --git a/matlab/missing/nanmean/nanmean.m b/matlab/missing/nanmean/nanmean.m index 6b66bad0f..9babd1460 100644 --- a/matlab/missing/nanmean/nanmean.m +++ b/matlab/missing/nanmean/nanmean.m @@ -1,36 +1,20 @@ -function y = nanmean(x) -% Computes the mean of each column of a matrix with some NaNs. +function y = nanmean(x, dim) -%@info: -%! @deftypefn {Function File} {@var{y} =} nanmean (@var{x}) -%! @anchor{nanmean} -%! @sp 1 -%! Computes the mean of each column of a matrix with some NaNs. -%! @sp 2 -%! @strong{Inputs} -%! @table @ @var -%! @item x -%! Matlab matrix (T-by-N). -%! @end table -%! @sp 2 -%! @strong{Outputs} -%! @table @ @var -%! @item y -%! Matlab vector (1-by-N), the mean. -%! @end table -%! @sp 2 -%! @strong{This function is called by:} -%! @sp 1 -%! @ref{compute_cova}, @ref{compute_acov}, @ref{compute_std}, @ref{nandemean} -%! @sp 2 -%! @strong{This function calls:} -%! @sp 1 -%! @ref{ndim} -%! -%! @end deftypefn -%@eod: +% Returns the mean of a matrix with some NaNs. +% +% INPUTS +% - x [double] m*n matrix +% - dim [integer] scalar, dimension along which the mean has to be computed. +% +% OUTPUTS +% - y [double] 1*n vector (if dim=1) or m*1 vector (if dim=2). +% +% REMARKS +% (1) Default value for dim is the first non singleton dimension. +% (2) Works with vector and matrices, not implemented for arrays with more +% than two dimensions. -% Copyright (C) 2011 Dynare Team +% Copyright (C) 2011-2018 Dynare Team % % This file is part of Dynare. % @@ -47,16 +31,39 @@ function y = nanmean(x) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -% AUTHOR(S) stephane DOT adjemian AT univ DASH lemans DOT fr +if nargin<2 + % By default dim is the first non singleton dimension + nonsingletondims = find(find(size(x)>1)); + if ~isempty(nonsingletondims) + dim = nonsingletondims(1); + else + dim = NaN; + end +end -switch ndim(x) +switch ndims(x) case 1 - y = mean(x(find(~isnan(x)))); + if isnan(dim) + y = x; + else + y = mean(x(find(~isnan(x))), dim); + end case 2 - y = NaN(1,size(x,2)); - for i = 1:size(x,2) - y(i) = mean(x(find(~isnan(x(:,i))),i)); + if isnan(dim) + y = x; + else + if isequal(dim, 1) + y = NaN(1, size(x, 2)); + for i = 1:size(x, 2) + y(i) = mean(x(find(~isnan(x(:,i))),i)); + end + else + y = NaN(size(x, 1), 1); + for i = 1:size(x, 1) + y(i) = mean(x(i, find(~isnan(x(i,:))))); + end + end end otherwise - error('descriptive_statistics::nanmean:: This function is not implemented for arrays with dimension greater than two!') + error('This function is not implemented for arrays with dimension greater than two!') end \ No newline at end of file diff --git a/matlab/missing_DiffuseKalmanSmootherH1_Z.m b/matlab/missing_DiffuseKalmanSmootherH1_Z.m index 5ba614f94..0552da20b 100644 --- a/matlab/missing_DiffuseKalmanSmootherH1_Z.m +++ b/matlab/missing_DiffuseKalmanSmootherH1_Z.m @@ -49,7 +49,7 @@ function [alphahat,epsilonhat,etahat,atilde,P,aK,PK,decomp,V] = missing_DiffuseK % Durbin/Koopman (2012): "Time Series Analysis by State Space Methods", Oxford University Press, % Second Edition, Ch. 5 -% Copyright (C) 2004-2017 Dynare Team +% Copyright (C) 2004-2018 Dynare Team % % This file is part of Dynare. % @@ -134,9 +134,9 @@ while rank(Pinf(:,:,t+1),diffuse_kalman_tol) && t1.') end end diff --git a/matlab/mode_check.m b/matlab/mode_check.m index 3131f10cc..b9a24e315 100644 --- a/matlab/mode_check.m +++ b/matlab/mode_check.m @@ -111,14 +111,22 @@ for plt = 1:nbplt end end xx = x; - if x(kk)~=0 + if x(kk)~=0 || ~isinf(BoundsInfo.lb(kk)) || ~isinf(BoundsInfo.lb(kk)) l1 = max(BoundsInfo.lb(kk),(1-sign(x(kk))*ll)*x(kk)); m1 = 0; %lower bound l2 = min(BoundsInfo.ub(kk),(1+sign(x(kk))*ll)*x(kk)); %upper bound else %size info for 0 parameter is missing, use prior standard %deviation - l1 = max(BoundsInfo.lb(kk),-BayesInfo.p2(kk)); m1 = 0; %lower bound - l2 = min(BoundsInfo.ub(kk),BayesInfo.p2(kk)); %upper bound + upper_bound=BoundsInfo.lb(kk); + if isinf(upper_bound) + upper_bound=-1e-6*DynareOptions.huge_number; + end + lower_bound=BoundsInfo.ub(kk); + if isinf(lower_bound) + lower_bound=-1e-6*DynareOptions.huge_number; + end + l1 = max(lower_bound,-BayesInfo.p2(kk)); m1 = 0; %lower bound + l2 = min(upper_bound,BayesInfo.p2(kk)); %upper bound end binding_lower_bound=0; binding_upper_bound=0; diff --git a/matlab/model_diagnostics.m b/matlab/model_diagnostics.m index bfca7dda6..21084ead7 100644 --- a/matlab/model_diagnostics.m +++ b/matlab/model_diagnostics.m @@ -154,7 +154,7 @@ for b=1:nb break end end - disp(endo_names{k}) + fprintf('%s\n',endo_names{k}) end neq = null(jacob'); n_rel = size(neq,2); diff --git a/matlab/modules/dseries b/matlab/modules/dseries index cad90545b..656e63e36 160000 --- a/matlab/modules/dseries +++ b/matlab/modules/dseries @@ -1 +1 @@ -Subproject commit cad90545bd355f671c112fd072b9be1545cbb2c4 +Subproject commit 656e63e360d9fa979f932b601c46b1c1ea8aa1a4 diff --git a/matlab/parallel/AnalyseComputationalEnvironment.m b/matlab/parallel/AnalyseComputationalEnvironment.m index d00ca1b69..be01f3c8d 100644 --- a/matlab/parallel/AnalyseComputationalEnvironment.m +++ b/matlab/parallel/AnalyseComputationalEnvironment.m @@ -251,10 +251,7 @@ for Node=1:length(DataInput) % To obtain a recoursive function remove the 'for' % computer! if Environment - - % This check can be removed ... according to the dynare parser - % strategy. - + % This check can be removed ... according to the dynare parser strategy. if isempty(DataInput(Node).RemoteDirectory) disp('The field RemoteDirectory is empty!') skipline() @@ -263,10 +260,7 @@ for Node=1:length(DataInput) % To obtain a recoursive function remove the 'for' ErrorCode=5; return end - - % This check can be removed ... according to the dynare parser - % strategy. - + % This check can be removed ... according to the dynare parser strategy. if (~isempty(DataInput(Node).RemoteDrive)) disp('[WARNING] The fields RemoteDrive should be empty under unix or mac!') skipline() @@ -276,35 +270,14 @@ for Node=1:length(DataInput) % To obtain a recoursive function remove the 'for' skipline(2) ErrorCode=5; end - - si2=[]; - de2=[]; if ~isempty(DataInput(Node).Port) ssh_token = ['-p ',DataInput(Node).Port]; else ssh_token = ''; end - - [si2 de2]=system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' ls ',DataInput(Node).RemoteDirectory,'/',RemoteTmpFolder,'/']); - - if (si2) - disp ('Remote Directory does not exist or is not reachable!') - skipline() - disp('ErrorCode 5.') - skipline(2) - ErrorCode=5; - return - end - - disp('Check on RemoteDirectory Variable ..... Ok!') - skipline(2) - disp('Check on RemoteDrive Variable ..... Ok!') - skipline(2) - + command_string = ['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' ls ',DataInput(Node).RemoteDirectory,'/',RemoteTmpFolder,'/']; else - % This check can be removed ... according to the dynare parser - % strategy. - + % This check can be removed ... according to the dynare parser strategy. if (isempty(DataInput(Node).RemoteDrive)||isempty(DataInput(Node).RemoteDirectory)) disp('Remote RemoteDrive and/or RemoteDirectory is/are empty!') skipline() @@ -313,32 +286,31 @@ for Node=1:length(DataInput) % To obtain a recoursive function remove the 'for' ErrorCode=5; return end - - - si2=[]; - de2=[]; - [si2 de2]=system(['dir \\',DataInput(Node).ComputerName,'\',DataInput(Node).RemoteDrive,'$\',DataInput(Node).RemoteDirectory,'\',RemoteTmpFolder]); - - if (si2) - disp ('Remote Directory does not exist or it is not reachable!') - skipline() - disp('ErrorCode 5.') - skipline(2) - ErrorCode=5; - return - end - - disp('Check on RemoteDirectory Variable ..... Ok!') - skipline(2) - disp('Check on RemoteDrive Variable ..... Ok!') - skipline(2) - + command_string = ['dir \\',DataInput(Node).ComputerName,'\',DataInput(Node).RemoteDrive,'$\',DataInput(Node).RemoteDirectory,'\',RemoteTmpFolder]; end + [si2, de2] = system(command_string); - % Now we verify if it possible to exchange data with the remote - % computer: + if (si2) + disp ('Remote Directory does not exist or is not reachable!') + skipline() + disp('ErrorCode 5.') + skipline(2) + disp('The command causing the error was:') + disp(command_string) + disp('The system returned:') + disp(de2) + skipline(2) + ErrorCode=5; + return + end + disp('Check on RemoteDirectory Variable ..... Ok!') + skipline(2) + disp('Check on RemoteDrive Variable ..... Ok!') + skipline(2) + + % Now we verify if it possible to exchange data with the remote computer. % Build a command file to test the matlab execution and dynare path ... @@ -506,13 +478,8 @@ for Node=1:length(DataInput) % To obtain a recoursive function remove the 'for' % Now we verify if it is possible delete remote computational traces! - dynareParallelRmDir(RemoteTmpFolder,DataInput(Node)); - - si3=[]; - - si3=dynareParallelDir('Tracing.m', RemoteTmpFolder,DataInput(Node)); - + si3 = dynareParallelDir('Tracing.m', RemoteTmpFolder,DataInput(Node)); if (isempty(si3)) disp ('Check on Delete Remote Computational Traces ..... Ok!') skipline(2) @@ -550,22 +517,18 @@ for Node=1:length(DataInput) % To obtain a recoursive function remove the 'for' % We look for the information on local computer hardware. - - si0=[]; - de0=[]; - - Environment1=Environment; + Environment1 = Environment; disp('Checking Hardware please wait ...'); if (DataInput(Node).Local == 1) if Environment if ~ismac - [si0 de0]=system('grep processor /proc/cpuinfo'); + [si0, de0] = system('grep processor /proc/cpuinfo'); else - [si0 de0]=system('sysctl -n hw.ncpu'); - Environment1=2; + [si0, de0] = system('sysctl -n hw.ncpu'); + Environment1 = 2; end else - [si0 de0]=system(['psinfo \\']); + [si0, de0] = system(['psinfo \\']); end else if Environment @@ -576,19 +539,27 @@ for Node=1:length(DataInput) % To obtain a recoursive function remove the 'for' end if OStargetUnix if RemoteEnvironment ==1 - [si0 de0]=system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' grep processor /proc/cpuinfo']); + command_string = ['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' grep processor /proc/cpuinfo']; else % it is MAC - [si0 de0]=system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' sysctl -n hw.ncpu']); - Environment1=2; + command_string = ['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' sysctl -n hw.ncpu']; + Environment1 = 2; end else - [si0 de0]=system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' psinfo']); + command_string = ['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' psinfo']; end else - [si0 de0]=system(['psinfo \\',DataInput(Node).ComputerName,' -u ',DataInput(Node).UserName,' -p ',DataInput(Node).Password]); + command_string = ['psinfo \\',DataInput(Node).ComputerName,' -u ',DataInput(Node).UserName,' -p ',DataInput(Node).Password]; end + [si0, de0] = system(command_string); end + if (si0) + disp('The command causing the error was:') + disp(command_string) + disp('The system returned:') + disp(de0) + skipline(2) + end RealCPUnbr=''; % keyboard; diff --git a/matlab/parallel/masterParallel.m b/matlab/parallel/masterParallel.m index e51c6d023..4fbe69a8c 100644 --- a/matlab/parallel/masterParallel.m +++ b/matlab/parallel/masterParallel.m @@ -347,9 +347,9 @@ for j=1:totCPU end else % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa! if regexpi([Parallel(indPC).MatlabOctavePath], 'octave') - command1=['psexec -d -W "',DyMo, '" -a ',my_affinity,' -low ',Parallel(indPC).MatlabOctavePath,' -f --eval "default_save_options(''-v7''); addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; + command1=['psexec -accepteula -d -W "',DyMo, '" -a ',my_affinity,' -low ',Parallel(indPC).MatlabOctavePath,' -f --eval "default_save_options(''-v7''); addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; else - command1=['psexec -d -W "',DyMo, '" -a ',my_affinity,' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; + command1=['psexec -accepteula -d -W "',DyMo, '" -a ',my_affinity,' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; end end else % 0.2 Parallel(indPC).Local==0: Run using network on remote machine or also on local machine. @@ -387,20 +387,20 @@ for j=1:totCPU if ~strcmpi(Parallel(indPC).ComputerName,MasterName) % 0.3 Run on a remote machine! % Hybrid computing Matlab(Master)-> Octave(Slaves) and Vice Versa! if regexpi([Parallel(indPC).MatlabOctavePath], 'octave') - command1=['psexec \\',Parallel(indPC).ComputerName,' -d -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... + command1=['psexec \\',Parallel(indPC).ComputerName,' -accepteula -d -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... ' -low ',Parallel(indPC).MatlabOctavePath,' -f --eval "default_save_options(''-v7''); addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; else - command1=['psexec \\',Parallel(indPC).ComputerName,' -d -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... + command1=['psexec \\',Parallel(indPC).ComputerName,' -accepteula -d -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... ' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; end else % 0.4 Run on the local machine via the network % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa! if regexpi([Parallel(indPC).MatlabOctavePath], 'octave') - command1=['psexec \\',Parallel(indPC).ComputerName,' -d -e -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... + command1=['psexec \\',Parallel(indPC).ComputerName,' -accepteula -d -e -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... ' -low ',Parallel(indPC).MatlabOctavePath,' -f --eval "default_save_options(''-v7''); addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; else - command1=['psexec \\',Parallel(indPC).ComputerName,' -d -e -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... + command1=['psexec \\',Parallel(indPC).ComputerName,' -accepteula -d -e -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... ' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; end end @@ -418,9 +418,9 @@ for j=1:totCPU end else % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa! if regexpi([Parallel(indPC).MatlabOctavePath], 'octave') - command1=['psexec -d -W "',DyMo, '" -a ',my_affinity,' -low ',Parallel(indPC).MatlabOctavePath,' -f --eval "default_save_options(''-v7'');addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; + command1=['psexec -accepteula -d -W "',DyMo, '" -a ',my_affinity,' -low ',Parallel(indPC).MatlabOctavePath,' -f --eval "default_save_options(''-v7'');addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; else - command1=['psexec -d -W "',DyMo, '" -a ',my_affinity,' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; + command1=['psexec -accepteula -d -W "',DyMo, '" -a ',my_affinity,' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; end end elseif Parallel(indPC).Local==0 % 1.2 Run using network on remote machine or also on local machine. @@ -462,19 +462,19 @@ for j=1:totCPU if ~strcmpi(Parallel(indPC).ComputerName,MasterName) % 1.3 Run on a remote machine. % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa! if regexpi([Parallel(indPC).MatlabOctavePath], 'octave') - command1=['psexec \\',Parallel(indPC).ComputerName,' -d -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... + command1=['psexec \\',Parallel(indPC).ComputerName,' -accepteula -d -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... ' -low ',Parallel(indPC).MatlabOctavePath,' -f --eval "default_save_options(''-v7'');addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; else - command1=['psexec \\',Parallel(indPC).ComputerName,' -d -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... + command1=['psexec \\',Parallel(indPC).ComputerName,' -accepteula -d -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... ' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; end else % 1.4 Run on the local machine via the network. % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa! if regexpi([Parallel(indPC).MatlabOctavePath], 'octave') - command1=['psexec \\',Parallel(indPC).ComputerName,' -d -e -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... + command1=['psexec \\',Parallel(indPC).ComputerName,' -accepteula -d -e -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... ' -low ',Parallel(indPC).MatlabOctavePath,' -f --eval "default_save_options(''-v7''); addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; else - command1=['psexec \\',Parallel(indPC).ComputerName,' -d -e -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... + command1=['psexec \\',Parallel(indPC).ComputerName,' -accepteula -d -e -W "',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\" -a ',my_affinity, ... ' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; end end diff --git a/matlab/perfect-foresight-models/sim1_linear.m b/matlab/perfect-foresight-models/sim1_linear.m index af75a61b7..1f64e55c7 100644 --- a/matlab/perfect-foresight-models/sim1_linear.m +++ b/matlab/perfect-foresight-models/sim1_linear.m @@ -116,7 +116,7 @@ x = repmat(transpose(steadystate_x), 1+M.maximum_exo_lag+M.maximum_exo_lead, 1); [d1, jacobian] = dynamicmodel(z, x, params, steadystate_y, M.maximum_exo_lag+1); % Check that the dynamic model was evaluated at the steady state. -if max(abs(d1))>1e-12 +if max(abs(d1))>options.solve_tolf error('Jacobian is not evaluated at the steady state!') end diff --git a/matlab/posterior_sampler.m b/matlab/posterior_sampler.m index bfd209619..ea19c320d 100644 --- a/matlab/posterior_sampler.m +++ b/matlab/posterior_sampler.m @@ -127,7 +127,7 @@ else % which files have to be copied to run remotely NamFileInput(1,:) = {'',[ModelName '_static.m']}; NamFileInput(2,:) = {'',[ModelName '_dynamic.m']}; - if M.set_auxiliary_variables + if M_.set_auxiliary_variables NamFileInput(3,:) = {'',[M_.fname '_set_auxiliary_variables.m']}; end if options_.steadystate_flag diff --git a/matlab/read_variables.m b/matlab/read_variables.m index a50501252..354adf855 100644 --- a/matlab/read_variables.m +++ b/matlab/read_variables.m @@ -91,7 +91,7 @@ switch (extension) case { '.xls', '.xlsx' } [freq,init,data,varlist] = load_xls_file_data(fullname,xls_sheet,xls_range); for dyn_i_01=1:var_size_01 - iv = strmatch(strtrim(var_names_01(dyn_i_01,:)),varlist,'exact'); + iv = strmatch(strtrim(var_names_01{dyn_i_01}),varlist,'exact'); if ~isempty(iv) dyn_tmp_01 = [data(:,iv)]'; if length(dyn_tmp_01) > dyn_size_01 && dyn_size_01 > 0 @@ -101,7 +101,7 @@ switch (extension) dyn_data_01(:,dyn_i_01) = dyn_tmp_01; else cd(old_pwd) - error([strtrim(var_names_01(dyn_i_01,:)) ' not found in ' fullname]) + error([strtrim(var_names_01{dyn_i_01}) ' not found in ' fullname]) end end case '.csv' diff --git a/matlab/smoother2histval.m b/matlab/smoother2histval.m index 2668bbef9..8e981fa20 100644 --- a/matlab/smoother2histval.m +++ b/matlab/smoother2histval.m @@ -193,36 +193,38 @@ end % Handle auxiliary variables for lags (both on endogenous and exogenous) for i = 1:length(M_.aux_vars) - if M_.aux_vars(i).type ~= 1 && M_.aux_vars(i).type ~= 3 - continue - end - if M_.aux_vars(i).type == 1 - % Endogenous - orig_var = M_.endo_names{M_.aux_vars(i).orig_index}; - else - % Exogenous - orig_var = M_.exo_names{M_.aux_vars(i).orig_index}; - end - [m, k] = ismember(orig_var, outvars); - if m - if ~isempty(strmatch(invars{k}, M_.endo_names)) - s = getfield(smoothedvars, invars{k}); - else - s = getfield(smoothedshocks, invars{k}); + if ~ ismember(M_.endo_names{M_.aux_vars(i).endo_index},invars) + if M_.aux_vars(i).type ~= 1 && M_.aux_vars(i).type ~= 3 + continue end - l = M_.aux_vars(i).orig_lead_lag; - if period-M_.maximum_endo_lag+1+l < 1 - error('The period that you indicated is too small to construct initial conditions') - end - j = M_.aux_vars(i).endo_index; - v = s((period-M_.maximum_endo_lag+1+l):(period+l)); %+steady_state(j); - if ~isfield(opts, 'outfile') - M_.endo_histval(j, :) = v; + if M_.aux_vars(i).type == 1 + % Endogenous + orig_var = M_.endo_names{M_.aux_vars(i).orig_index}; else - % When saving to a file, x(-2) is in the variable called "x_l2" - lead_lag = num2str(l); - lead_lag = regexprep(lead_lag, '-', 'l'); - o = setfield(o, [ orig_var '_' lead_lag ], v); + % Exogenous + orig_var = M_.exo_names{M_.aux_vars(i).orig_index}; + end + [m, k] = ismember(orig_var, outvars); + if m + if ~isempty(strmatch(invars{k}, M_.endo_names)) + s = getfield(smoothedvars, invars{k}); + else + s = getfield(smoothedshocks, invars{k}); + end + l = M_.aux_vars(i).orig_lead_lag; + if period-M_.maximum_endo_lag+1+l < 1 + error('The period that you indicated is too small to construct initial conditions') + end + j = M_.aux_vars(i).endo_index; + v = s((period-M_.maximum_endo_lag+1+l):(period+l)); %+steady_state(j); + if ~isfield(opts, 'outfile') + M_.endo_histval(j, :) = v; + else + % When saving to a file, x(-2) is in the variable called "x_l2" + lead_lag = num2str(l); + lead_lag = regexprep(lead_lag, '-', 'l'); + o = setfield(o, [ orig_var '_' lead_lag ], v); + end end end end diff --git a/matlab/stochastic_solvers.m b/matlab/stochastic_solvers.m index e958056c2..6ba76fd5f 100644 --- a/matlab/stochastic_solvers.m +++ b/matlab/stochastic_solvers.m @@ -29,7 +29,7 @@ function [dr,info] = stochastic_solvers(dr,task,M_,options_,oo_) % none. % -% Copyright (C) 1996-2017 Dynare Team +% Copyright (C) 1996-2018 Dynare Team % % This file is part of Dynare. % @@ -57,6 +57,9 @@ if M_.hessian_eq_zero && local_order~=1 local_order = 1; warning('stochastic_solvers: using order = 1 because Hessian is equal to zero'); end +if options_.order>2 && ~options_.k_order_solver + error('You need to set k_order_solver for order>2') +end if (options_.aim_solver == 1) && (local_order > 1) error('Option "aim_solver" is incompatible with order >= 2') diff --git a/matlab/utilities/dataset/makedataset.m b/matlab/utilities/dataset/makedataset.m index c5c244b54..0e895f0ac 100644 --- a/matlab/utilities/dataset/makedataset.m +++ b/matlab/utilities/dataset/makedataset.m @@ -24,7 +24,7 @@ function [DynareDataset, DatasetInfo, newdatainterface] = makedataset(DynareOpti % % See also dynare_estimation_init -% Copyright (C) 2014-2017 Dynare Team +% Copyright (C) 2014-2018 Dynare Team % % This file is part of Dynare. % @@ -81,7 +81,7 @@ elseif isempty(DynareOptions.datafile) && ~isempty(DynareOptions.dataset.series) elseif ~isempty(DynareOptions.datafile) && isempty(DynareOptions.dataset.file) datafile = DynareOptions.datafile; newdatainterface = 0; -elseif isempty(DynareOptions.datafile) && ~isempty(DynareOptions.dataset.file) +elseif ~isempty(DynareOptions.datafile) && ~isempty(DynareOptions.dataset.file) error('makedataset: You cannot simultaneously use the data command and the datafile option (in the estimation command)!') else error('makedataset: You have to specify the datafile!') @@ -267,7 +267,7 @@ else end % Compute the empirical mean of the observed variables. -DatasetInfo.descriptive.mean = nanmean(DynareDataset.data); +DatasetInfo.descriptive.mean = nanmean(DynareDataset.data,1); % Compute the empirical covariance matrix of the observed variables. DatasetInfo.descriptive.covariance = nancovariance(DynareDataset.data); diff --git a/matlab/utilities/dataset/nancovariance.m b/matlab/utilities/dataset/nancovariance.m index 8e2e2b227..09f2a38af 100644 --- a/matlab/utilities/dataset/nancovariance.m +++ b/matlab/utilities/dataset/nancovariance.m @@ -51,7 +51,7 @@ function CovarianceMatrix = nancovariance(data) CovarianceMatrix = zeros(size(data,2)); if isanynan(data) - data = bsxfun(@minus,data,nanmean(data)); + data = bsxfun(@minus,data,nanmean(data,1)); for i=1:size(data,2) for j=i:size(data,2) CovarianceMatrix(i,j) = nanmean(data(:,i).*data(:,j)); @@ -61,7 +61,7 @@ if isanynan(data) end end else - data = bsxfun(@minus,data,mean(data)); + data = bsxfun(@minus,data,mean(data,1)); CovarianceMatrix = (transpose(data)*data)/size(data,1); end diff --git a/matlab/utilities/dataset/quarterly2annual.m b/matlab/utilities/dataset/quarterly2annual.m index 18f8d0dbb..f5d8bd7c8 100644 --- a/matlab/utilities/dataset/quarterly2annual.m +++ b/matlab/utilities/dataset/quarterly2annual.m @@ -14,6 +14,7 @@ function [ya, yass, gya, gyass] = quarterly2annual(y,yss,GYTREND0,type,islog,aux % 5 annual price as quantity weighted average % 6 annual quantity from average price % 7 annual nominal from Q real and deflator +% 8 annual ratio [e.g. trade balance to GDP] % islog 0 level (default) % 1 log-level % 2 growth rate Q frequency @@ -120,6 +121,19 @@ switch type yn = (y+yss).*(yaux+yauxss) - yss.*yauxss; [ya, yass] = quarterly2annual(yn,yss.*yauxss,GYTREND0+GYTREND0aux,typeaux,0,0); GYTREND0=GYTREND0+GYTREND0aux; + + case 8 + % numerator + yn = y; + [yna, ynass] = quarterly2annual(yn,yss,GYTREND0,typeaux(1),0,0); + % denominator + yd = yaux; + [yda, ydass] = quarterly2annual(yd,yauxss,GYTREND0aux,typeaux(2),0,0); + % ratio + yass = ynass/ydass; + ya = (yna+ynass)./(yda+ydass)-yass; + GYTREND0 = GYTREND0 - GYTREND0aux; + otherwise error('Wrong type input') end diff --git a/matlab/utilities/general/demean.m b/matlab/utilities/general/demean.m index 741a2f107..c56c47367 100644 --- a/matlab/utilities/general/demean.m +++ b/matlab/utilities/general/demean.m @@ -1,33 +1,14 @@ function c = demean(x) + % Removes the mean of each column of a matrix. +% +% INPUTS +% - x [double] T*N matrix of data. +% +% OUTPUTS +% - c [double] T*N matrix of demeaned data. -%@info: -%! @deftypefn {Function File} {@var{c} =} demean (@var{x}) -%! @anchor{demean} -%! This function removes the mean of each column of a matrix. -%! -%! @strong{Inputs} -%! @table @var -%! @item x -%! Matlab matrix (T-by-N). -%! @end table -%! -%! @strong{Outputs} -%! @table @var -%! @item c -%! Matlab matrix (T-by-N). The demeaned x matrix. -%! @end table -%! -%! @strong{This function is called by:} -%! @ref{compute_cova}, @ref{compute_acov}, @ref{compute_std}. -%! -%! @strong{This function calls:} -%! @ref{ndim}, -%! -%! @end deftypefn -%@eod: - -% Copyright (C) 2011-2017 Dynare Team +% Copyright (C) 2011-2018 Dynare Team % % This file is part of Dynare. % @@ -44,12 +25,8 @@ function c = demean(x) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -% Original author: stephane DOT adjemian AT univ DASH lemans DOT fr +if ndim(x)>2 + error('This function is not implemented for arrays with dimension greater than two!') +end -if ndim(x)==1 - c = x-mean(x); -elseif ndim(x)==2 - c = bsxfun(@minus,x,mean(x)); -else - error('descriptive_statistics::demean:: This function is not implemented for arrays with dimension greater than two!') -end \ No newline at end of file +c = bsxfun(@minus, x, nanmean(x)); \ No newline at end of file diff --git a/preprocessor/ComputingTasks.cc b/preprocessor/ComputingTasks.cc index f45a4e317..e2f60fc99 100644 --- a/preprocessor/ComputingTasks.cc +++ b/preprocessor/ComputingTasks.cc @@ -2686,7 +2686,7 @@ InitialConditionDecompositionStatement::writeOutput(ostream &output, const strin output << "options_ = set_default_initial_condition_decomposition_options(options_);" << endl; options_list.writeOutput(output); symbol_list.writeOutput("var_list_", output); - output << "initial_condition_decomposition(M_, oo_, options_, var_list_, bayestopt_, estim_params_);" << endl; + output << "oo_ = initial_condition_decomposition(M_, oo_, options_, var_list_, bayestopt_, estim_params_);" << endl; } ConditionalForecastStatement::ConditionalForecastStatement(const OptionsList &options_list_arg) : diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy index 8ec4ceeb8..53a9ea426 100644 --- a/preprocessor/DynareBison.yy +++ b/preprocessor/DynareBison.yy @@ -114,7 +114,7 @@ class ParsingDriver; %token CPF_WEIGHTS AMISANOTRISTANI MURRAYJONESPARSLOW WRITE_EQUATION_TAGS METHOD %token NONLINEAR_FILTER_INITIALIZATION FILTER_ALGORITHM PROPOSAL_APPROXIMATION CUBATURE UNSCENTED MONTECARLO DISTRIBUTION_APPROXIMATION %token NAME -%token USE_PENALIZED_OBJECTIVE_FOR_HESSIAN INIT_STATE RESCALE_PREDICTION_ERROR_COVARIANCE GENERATE_IRFS +%token USE_PENALIZED_OBJECTIVE_FOR_HESSIAN INIT_STATE FAST_REALTIME RESCALE_PREDICTION_ERROR_COVARIANCE GENERATE_IRFS %token NAN_CONSTANT NO_STATIC NOBS NOCONSTANT NODISPLAY NOCORR NODIAGNOSTIC NOFUNCTIONS NO_HOMOTOPY %token NOGRAPH POSTERIOR_NOGRAPH POSTERIOR_GRAPH NOMOMENTS NOPRINT NORMAL_PDF SAVE_DRAWS MODEL_NAME STDERR_MULTIPLES DIAGONAL_ONLY %token OBSERVATION_TRENDS OPTIM OPTIM_WEIGHTS ORDER OSR OSR_PARAMS MAX_DIM_COVA_GROUP ADVANCED OUTFILE OUTVARS OVERWRITE @@ -2827,6 +2827,7 @@ realtime_shock_decomposition_option : o_parameter_set | o_shock_decomposition_presample | o_shock_decomposition_forecast | o_save_realtime + | o_fast_realtime ; plot_shock_decomposition_options_list : plot_shock_decomposition_option COMMA plot_shock_decomposition_options_list @@ -2860,6 +2861,9 @@ initial_condition_decomposition_option : o_icd_type | o_icd_write_xls | o_icd_plot_init_date | o_icd_plot_end_date + | o_nodisplay + | o_graph_format + | o_psd_fig_name ; homotopy_setup: HOMOTOPY_SETUP ';' homotopy_list END ';' @@ -3240,6 +3244,7 @@ o_init_state : INIT_STATE EQUAL INT_NUMBER { driver.option_num("shock_decomp.ini o_shock_decomposition_presample : PRESAMPLE EQUAL INT_NUMBER { driver.option_num("shock_decomp.presample", $3); }; o_shock_decomposition_forecast : FORECAST EQUAL INT_NUMBER { driver.option_num("shock_decomp.forecast", $3); }; o_save_realtime : SAVE_REALTIME EQUAL vec_int { driver.option_vec_int("shock_decomp.save_realtime", $3); }; +o_fast_realtime : FAST_REALTIME EQUAL INT_NUMBER { driver.option_num("shock_decomp.fast_realtime", $3); }; o_nodisplay : NODISPLAY { driver.option_num("nodisplay","1"); }; o_psd_nodisplay : NODISPLAY { driver.option_num("plot_shock_decomp.nodisplay","1"); }; o_graph_format : GRAPH_FORMAT EQUAL allowed_graph_formats diff --git a/preprocessor/DynareFlex.ll b/preprocessor/DynareFlex.ll index 1ebe6a5c7..86f007568 100644 --- a/preprocessor/DynareFlex.ll +++ b/preprocessor/DynareFlex.ll @@ -594,6 +594,7 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2 controlled_varexo {return token::CONTROLLED_VAREXO; } parameter_set {return token::PARAMETER_SET; } init_state {return token::INIT_STATE; } +fast_realtime {return token::FAST_REALTIME; } save_realtime {return token::SAVE_REALTIME;} detail_plot {return token::DETAIL_PLOT;} interactive {return token::INTERACTIVE;} diff --git a/preprocessor/macro/MacroDriver.cc b/preprocessor/macro/MacroDriver.cc index bd15152b3..b0420b441 100644 --- a/preprocessor/macro/MacroDriver.cc +++ b/preprocessor/macro/MacroDriver.cc @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2017 Dynare Team + * Copyright (C) 2008-2018 Dynare Team * * This file is part of Dynare. * @@ -60,7 +60,11 @@ MacroDriver::parse(const string &f, const string &fb, const string &modfiletxt, } catch (boost::bad_lexical_cast &) { - file_with_endl << "@#define " << it->first << " = \"" << it->second << "\"" << endl; + if (!it->second.empty() && it->second.at(0) == '[' && it->second.at(it->second.length()-1) == ']') + // If the input is an array. Issue #1578 + file_with_endl << "@#define " << it->first << " = " << it->second << endl; + else + file_with_endl << "@#define " << it->first << " = \"" << it->second << "\"" << endl; } file_with_endl << modfiletxt << endl; diff --git a/preprocessor/macro/MacroFlex.ll b/preprocessor/macro/MacroFlex.ll index 5125ffa73..21a35a1c9 100644 --- a/preprocessor/macro/MacroFlex.ll +++ b/preprocessor/macro/MacroFlex.ll @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2017 Dynare Team + * Copyright (C) 2008-2018 Dynare Team * * This file is part of Dynare. * @@ -71,6 +71,8 @@ CONT \\\\ yylloc->step(); %} +["/"]["/"].* + ^{SPC}*@#{SPC}*includepath{SPC}+\"([^\"\r\n:;|<>]*){1}(:[^\"\r\n:;|<>]*)*\"{SPC}*{EOL} { yylloc->lines(1); yylloc->step(); @@ -303,6 +305,16 @@ CONT \\\\ then_body_tmp.append(yytext); yylloc->step(); } +^{SPC}*@#{SPC}*ifdef({SPC}|{CONT}) { + nested_if_nb++; + then_body_tmp.append(yytext); + yylloc->step(); + } +^{SPC}*@#{SPC}*ifndef({SPC}|{CONT}) { + nested_if_nb++; + then_body_tmp.append(yytext); + yylloc->step(); + } . { then_body_tmp.append(yytext); yylloc->step(); } <> { driver.error(if_stmt_loc_tmp, "@#if/@#ifdef/@#ifndef not matched by an @#endif or file does not end with a new line (unexpected end of file)"); } ^{SPC}*@#{SPC}*else{SPC}*(\/\/.*)?{EOL} { diff --git a/tests/shock_decomposition/ls2003_plot.mod b/tests/shock_decomposition/ls2003_plot.mod index 7faa00d0c..895de40e9 100644 --- a/tests/shock_decomposition/ls2003_plot.mod +++ b/tests/shock_decomposition/ls2003_plot.mod @@ -129,6 +129,12 @@ close all plot_shock_decomposition(detail_plot, interactive, use_shock_groups = row, type = qoq); plot_shock_decomposition(detail_plot, interactive, realtime = 3, vintage = 29); +close all, + + +// testing realtime decomposition with fast_realtime option +realtime_shock_decomposition(fast_realtime=75); + collect_latex_files; if system(['pdflatex -halt-on-error -interaction=batchmode ' M_.fname '_TeX_binder.tex']) error('TeX-File did not compile.') diff --git a/windows/README.txt b/windows/README.txt index 56d8a6aa4..c4b67a297 100644 --- a/windows/README.txt +++ b/windows/README.txt @@ -61,7 +61,7 @@ This version of Dynare is compiled for Octave 4.2.1 (MinGW, 32bit and 64bit), an with other versions of Octave. The recommended version of Octave can be downloaded at: - http://www.dynare.org/download/octave/windows + https://www.gnu.org/software/octave/download.html Every time you run Octave, you should type the two following commands (assuming that you have installed Dynare at the standard location, and replacing '4.x.y'