From 7c83ba7ea7150c26eaee19f55355fd783336cdfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=28Charybdis=29?= Date: Wed, 26 Sep 2018 22:47:32 +0200 Subject: [PATCH 01/21] Fixed documentation header. --- matlab/imcforecast.m | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/matlab/imcforecast.m b/matlab/imcforecast.m index 0f7e2ffce..564747467 100644 --- a/matlab/imcforecast.m +++ b/matlab/imcforecast.m @@ -1,30 +1,32 @@ function imcforecast(constrained_paths, constrained_vars, options_cond_fcst) + % Computes conditional forecasts. % % INPUTS -% o constrained_paths [double] m*p array, where m is the number of constrained endogenous variables and p is the number of constrained periods. -% o constrained_vars [char] m*x array holding the names of the controlled endogenous variables. -% o options_cond_fcst [structure] containing the options. The fields are: -% + replic [integer] scalar, number of monte carlo simulations. -% + parameter_set [char] values of the estimated parameters: -% "posterior_mode", -% "posterior_mean", -% "posterior_median", -% "prior_mode" or -% "prior mean". -% [double] np*1 array, values of the estimated parameters. -% + controlled_varexo [char] m*x array, list of controlled exogenous variables. -% + conf_sig [double] scalar in [0,1], probability mass covered by the confidence bands. +% - consnstrained_paths [double] m*p array, where m is the number of constrained endogenous variables and p is the number of constrained periods. +% - constrained_vars [integer] m*1 array, indices in M_.endo_names of the constrained variables. +% - options_cond_fcst [structure] containing the options. The fields are: +% +% + replic [integer] scalar, number of monte carlo simulations. +% + parameter_set [char] values of the estimated parameters: +% 'posterior_mode', +% 'posterior_mean', +% 'posterior_median', +% 'prior_mode' or +% 'prior mean'. +% [double] np*1 array, values of the estimated parameters. +% + controlled_varexo [cell] m*1 cell of row char array, list of controlled exogenous variables. +% + conf_sig [double] scalar in [0,1], probability mass covered by the confidence bands. % % OUTPUTS -% None. +% None. % % SPECIAL REQUIREMENTS -% This routine has to be called after an estimation statement or an estimated_params block. +% This routine has to be called after an estimation statement or an estimated_params block. % % REMARKS -% [1] Results are stored in a structure which is saved in a mat file called conditional_forecasts.mat. -% [2] Use the function plot_icforecast to plot the results. +% [1] Results are stored in a structure which is saved in a mat file called conditional_forecasts.mat. +% [2] Use the function plot_icforecast to plot the results. % Copyright (C) 2006-2018 Dynare Team % From 07141a8681456e348ecb3b171367b0b1bb1fb0d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=28Charybdis=29?= Date: Wed, 26 Sep 2018 22:49:41 +0200 Subject: [PATCH 02/21] Various optimizations. --- matlab/imcforecast.m | 41 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/matlab/imcforecast.m b/matlab/imcforecast.m index 564747467..4760dfa1d 100644 --- a/matlab/imcforecast.m +++ b/matlab/imcforecast.m @@ -126,7 +126,8 @@ if estimated_model qz_criterium_old=options_.qz_criterium; options_=select_qz_criterium_value(options_); options_smoothed_state_uncertainty_old = options_.smoothed_state_uncertainty; - [atT,innov,measurement_error,filtered_state_vector,ys,trend_coeff,aK,T,R,P,PK,decomp,trend_addition,state_uncertainty,M_,oo_,options_,bayestopt_] = DsgeSmoother(xparam,gend,data,data_index,missing_value,M_,oo_,options_,bayestopt_,estim_params_); + [atT, ~, ~, ~,ys, ~, ~, ~, ~, ~, ~, ~, ~, ~,M_,oo_,options_,bayestopt_] = ... + DsgeSmoother(xparam, gend, data, data_index, missing_value, M_, oo_, options_, bayestopt_, estim_params_); options_.smoothed_state_uncertainty = options_smoothed_state_uncertainty_old; %get constant part if options_.noconstant @@ -148,7 +149,7 @@ if estimated_model end % add trend to constant for obs_iter=1:length(options_.varobs) - j = strmatch(options_.varobs{obs_iter}, M_.endo_names, 'exact'); + j = strcmp(options_.varobs{obs_iter}, M_.endo_names); constant(j,:) = constant(j,:) + trend_addition(obs_iter,:); end trend = constant(oo_.dr.order_var,:); @@ -170,7 +171,7 @@ if options_.logged_steady_state %if steady state was previously logged, undo thi options_.logged_steady_state=0; end -[T,R,ys,info,M_,options_,oo_] = dynare_resolve(M_,options_,oo_); +[T, R, ys, ~, M_, options_, oo_] = dynare_resolve(M_, options_, oo_); if options_.loglinear && isfield(oo_.dr,'ys') && options_.logged_steady_state==0 %log steady state oo_.dr.ys=log_variable(1:M_.endo_nbr,oo_.dr.ys,M_); @@ -216,25 +217,21 @@ ExoSize = M_.exo_nbr; n1 = size(constrained_vars,1); n2 = size(options_cond_fcst.controlled_varexo,1); -constrained_vars(:,1)=oo_.dr.inv_order_var(constrained_vars); % must be in decision rule order + +constrained_vars = oo_.dr.inv_order_var(constrained_vars); % must be in decision rule order if n1 ~= n2 - error(['imcforecast:: The number of constrained variables doesn''t match the number of controlled shocks']) + error('imcforecast:: The number of constrained variables doesn''t match the number of controlled shocks') end -idx = []; -jdx = []; +% Get indices of controlled varexo. +[~, controlled_varexo] = ismember(options_cond_fcst.controlled_varexo,M_.exo_names); -for i = 1:n1 - idx = [idx ; constrained_vars(i,:)]; - % idx = [idx ; oo_.dr.inv_order_var(constrained_vars(i,:))]; - jdx = [jdx ; strmatch(options_cond_fcst.controlled_varexo{i},M_.exo_names,'exact')]; -end -mv = zeros(n1,NumberOfStates); -mu = zeros(ExoSize,n2); +mv = zeros(n1, NumberOfStates); +mu = zeros(ExoSize, n2); for i=1:n1 - mv(i,idx(i)) = 1; - mu(jdx(i),i) = 1; + mv(i,constrained_vars(i)) = 1; + mu(controlled_varexo(i),i) = 1; end % number of periods with constrained values @@ -243,7 +240,7 @@ cL = size(constrained_paths,2); %transform constrained periods into deviations from steady state; note that %trend includes last actual data point and therefore we need to start in %period 2 -constrained_paths = bsxfun(@minus,constrained_paths,trend(idx,2:1+cL)); +constrained_paths = bsxfun(@minus,constrained_paths,trend(constrained_vars,2:1+cL)); FORCS1_shocks = zeros(n1,cL,options_cond_fcst.replic); @@ -251,7 +248,7 @@ FORCS1_shocks = zeros(n1,cL,options_cond_fcst.replic); for b=1:options_cond_fcst.replic %conditional forecast using cL set to constrained values shocks = sQ*randn(ExoSize,options_cond_fcst.periods); - shocks(jdx,:) = zeros(length(jdx),options_cond_fcst.periods); + shocks(controlled_varexo,:) = zeros(n1, options_cond_fcst.periods); [FORCS1(:,:,b), FORCS1_shocks(:,:,b)] = mcforecast3(cL,options_cond_fcst.periods,constrained_paths,shocks,FORCS1(:,:,b),T,R,mv, mu); FORCS1(:,:,b)=FORCS1(:,:,b)+trend; %add trend end @@ -283,11 +280,9 @@ clear FORCS1 mFORCS1_shocks; FORCS2 = zeros(NumberOfStates,options_cond_fcst.periods+1,options_cond_fcst.replic); FORCS2(:,1,:) = repmat(InitState,1,options_cond_fcst.replic); %set initial steady state to deviations from steady state in first period -%randn('state',0); - for b=1:options_cond_fcst.replic %conditional forecast using cL set to 0 shocks = sQ*randn(ExoSize,options_cond_fcst.periods); - shocks(jdx,:) = zeros(length(jdx),options_cond_fcst.periods); + shocks(controlled_varexo,:) = zeros(n1, options_cond_fcst.periods); FORCS2(:,:,b) = mcforecast3(0,options_cond_fcst.periods,constrained_paths,shocks,FORCS2(:,:,b),T,R,mv, mu)+trend; end @@ -298,8 +293,8 @@ for i = 1:EndoSize tmp = sort(squeeze(FORCS2(i,:,:))'); forecasts.uncond.ci.(M_.endo_names{oo_.dr.order_var(i)}) = [tmp(t1,:)' ,tmp(t2,:)' ]'; end -forecasts.graph.title=graph_title; -forecasts.graph.fname=M_.fname; +forecasts.graph.title = graph_title; +forecasts.graph.fname = M_.fname; %reset qz_criterium options_.qz_criterium=qz_criterium_old; From feeda74dfb6e325dd481406fbba295548df45ad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Thu, 27 Sep 2018 12:24:39 +0200 Subject: [PATCH 03/21] Remove spurious executable permission --- configure.ac | 0 mex/build/octave/configure.ac | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 configure.ac mode change 100755 => 100644 mex/build/octave/configure.ac diff --git a/configure.ac b/configure.ac old mode 100755 new mode 100644 diff --git a/mex/build/octave/configure.ac b/mex/build/octave/configure.ac old mode 100755 new mode 100644 From 39110b3087cafa69b54624e93b5a8e24dae3aafb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Thu, 27 Sep 2018 15:05:14 +0200 Subject: [PATCH 04/21] Test for analytical_derivatives: use mode_compute=9 This optimizer seems more robust accross different hardware (with other optimizers, the algorithm does not converge to a local maximum, e.g. on the runner "lupi"). --- tests/analytic_derivatives/fs2000_analytic_derivation.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/analytic_derivatives/fs2000_analytic_derivation.mod b/tests/analytic_derivatives/fs2000_analytic_derivation.mod index 3e5b74d90..1d514405c 100644 --- a/tests/analytic_derivatives/fs2000_analytic_derivation.mod +++ b/tests/analytic_derivatives/fs2000_analytic_derivation.mod @@ -81,7 +81,7 @@ varobs gp_obs gy_obs; options_.solve_tolf = 1e-12; -estimation(order=1,mode_compute=5,analytic_derivation,kalman_algo=1,datafile=fsdat_simul,nobs=192,mh_replic=0,mh_nblocks=2,mh_jscale=0.8); +estimation(order=1,mode_compute=9,analytic_derivation,kalman_algo=1,datafile=fsdat_simul,nobs=192,mh_replic=0,mh_nblocks=2,mh_jscale=0.8); estimation(order=1,mode_compute=5,mode_file=fs2000_analytic_derivation_mode,analytic_derivation,kalman_algo=2,datafile=fsdat_simul,nobs=192,mh_replic=0,mh_nblocks=2,mh_jscale=0.8); estimation(order=1,mode_compute=4,mode_file=fs2000_analytic_derivation_mode,analytic_derivation,kalman_algo=1,datafile=fsdat_simul,nobs=192,mh_replic=0,mh_nblocks=2,mh_jscale=0.8); estimation(order=1,mode_compute=4,mode_file=fs2000_analytic_derivation_mode,analytic_derivation,kalman_algo=2,datafile=fsdat_simul,nobs=192,mh_replic=0,mh_nblocks=2,mh_jscale=0.8); From 3ad654b9b8fcf0028aabda93bb747d5f0361555b Mon Sep 17 00:00:00 2001 From: Michel Juillard Date: Thu, 27 Sep 2018 15:08:33 +0200 Subject: [PATCH 05/21] Allowing for different number of periods in conditional_forecast_path. Updated preprocessor submodule. --- doc/dynare.texi | 8 ++++++++ matlab/mcforecast3.m | 10 ++++++++-- preprocessor | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/doc/dynare.texi b/doc/dynare.texi index 72d8758a1..61cd82db7 100644 --- a/doc/dynare.texi +++ b/doc/dynare.texi @@ -8208,6 +8208,14 @@ variables between the first and last specified period. If an intermediate period is not specified, a value of 0 is assumed. That is, if you specify only values for periods 1 and 3, the values for period 2 will be 0. Currently, it is not possible to have uncontrolled intermediate periods. + +It is however possible to +have different number of controlled periods for different variables. In that +case, the order of declaration of endogenenous controlled variables and of +controlled_varexo matters: if the second endogenous variable is controlled for +less periods than the first one, the second controlled_varexo isn't set for +the last periods. + In case of the presence of @code{observation_trends}, the specified controlled path for these variables needs to include the trend component. When using the @ref{loglinear} option, it is necessary to specify the logarithm of the controlled variables. diff --git a/matlab/mcforecast3.m b/matlab/mcforecast3.m index b318d46f4..31215e434 100644 --- a/matlab/mcforecast3.m +++ b/matlab/mcforecast3.m @@ -27,6 +27,10 @@ function [forcs, e]= mcforecast3(cL,H,mcValue,shocks,forcs,T,R,mv,mu) % This is then solved to get: % shocks_controlled_t=(y_t(controlled_vars_index)-(T*y_{t-1}(controlled_vars_index)+R(controlled_vars_index,uncontrolled_shocks_index)*shocks_uncontrolled_t)/R(controlled_vars_index,controlled_shocks_index) % +% Variable number of controlled vars are allowed in different +% periods. Missing control information are indicated by NaN in +% y_t(controlled_vars_index). +% % After obtaining the shocks, and for uncontrolled periods, the state-space representation % y_t=T*y_{t-1}+R*shocks(:,t) % is used for forecasting @@ -51,8 +55,10 @@ function [forcs, e]= mcforecast3(cL,H,mcValue,shocks,forcs,T,R,mv,mu) if cL e = zeros(size(mcValue,1),cL); for t = 1:cL - e(:,t) = inv(mv*R*mu)*(mcValue(:,t)-mv*T*forcs(:,t)-mv*R*shocks(:,t)); - forcs(:,t+1) = T*forcs(:,t)+R*(mu*e(:,t)+shocks(:,t)); + % missing conditional values are indicated by NaN + k = find(isfinite(mcValue(:,t))); + e(k,t) = inv(mv(k,:)*R*mu(:,k))*(mcValue(k,t)-mv(k,:)*T*forcs(:,t)-mv(k,:)*R*shocks(:,t)); + forcs(:,t+1) = T*forcs(:,t)+R*(mu(:,k)*e(k,t)+shocks(:,t)); end end for t = cL+1:H diff --git a/preprocessor b/preprocessor index fbeae9619..680fb72d0 160000 --- a/preprocessor +++ b/preprocessor @@ -1 +1 @@ -Subproject commit fbeae9619ab9603410a11a11af92a7dfeea0af81 +Subproject commit 680fb72d0dcb15ea4831fc9dd71acb04661d9519 From 76c4df129c05ba4746ef08ef22500f795af0006d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=28Charybdis=29?= Date: Thu, 27 Sep 2018 18:56:41 +0200 Subject: [PATCH 06/21] Added integration tests. --- tests/Makefile.am | 2 + tests/conditional_forecasts/6/fs2000_cal.mod | 82 ++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 tests/conditional_forecasts/6/fs2000_cal.mod diff --git a/tests/Makefile.am b/tests/Makefile.am index 6cfc204eb..255c748d0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -188,10 +188,12 @@ MODFILES = \ simul/simul_ZLB_purely_forward_no_solution.mod \ simul/Irreversible_investment.mod \ simul/linear_state_space_arma.mod \ + conditional_forecasts/1/fs2000_cal.mod \ conditional_forecasts/2/fs2000_est.mod \ conditional_forecasts/3/fs2000_conditional_forecast_initval.mod \ conditional_forecasts/4/fs2000_conditional_forecast_histval.mod \ conditional_forecasts/5/fs2000_cal.mod \ + conditional_forecasts/6/fs2000_cal.mod \ recursive/ls2003.mod \ recursive/ls2003_bayesian.mod \ recursive/ls2003_bayesian_xls.mod \ diff --git a/tests/conditional_forecasts/6/fs2000_cal.mod b/tests/conditional_forecasts/6/fs2000_cal.mod new file mode 100644 index 000000000..9dd610a74 --- /dev/null +++ b/tests/conditional_forecasts/6/fs2000_cal.mod @@ -0,0 +1,82 @@ +// See fs2000.mod in the examples/ directory for details on the model + +var m P c e W R k d n l gy_obs gp_obs y dA; +varexo e_a e_m; + +parameters alp bet gam mst rho psi del; + +alp = 0.33; +bet = 0.99; +gam = 0.003; +mst = 1.011; +rho = 0.7; +psi = 0.787; +del = 0.02; + +model; +dA = exp(gam+e_a); +log(m) = (1-rho)*log(mst) + rho*log(m(-1))+e_m; +-P/(c(+1)*P(+1)*m)+bet*P(+1)*(alp*exp(-alp*(gam+log(e(+1))))*k^(alp-1)*n(+1)^(1-alp)+(1-del)*exp(-(gam+log(e(+1)))))/(c(+2)*P(+2)*m(+1))=0; +W = l/n; +-(psi/(1-psi))*(c*P/(1-n))+l/n = 0; +R = P*(1-alp)*exp(-alp*(gam+e_a))*k(-1)^alp*n^(-alp)/W; +1/(c*P)-bet*P*(1-alp)*exp(-alp*(gam+e_a))*k(-1)^alp*n^(1-alp)/(m*l*c(+1)*P(+1)) = 0; +c+k = exp(-alp*(gam+e_a))*k(-1)^alp*n^(1-alp)+(1-del)*exp(-(gam+e_a))*k(-1); +P*c = m; +m-1+d = l; +e = exp(e_a); +y = k(-1)^alp*n^(1-alp)*exp(-alp*(gam+e_a)); +gy_obs = dA*y/y(-1); +gp_obs = (P/P(-1))*m(-1)/dA; +end; + +steady_state_model; + dA = exp(gam); + gst = 1/dA; + m = mst; + khst = ( (1-gst*bet*(1-del)) / (alp*gst^alp*bet) )^(1/(alp-1)); + xist = ( ((khst*gst)^alp - (1-gst*(1-del))*khst)/mst )^(-1); + nust = psi*mst^2/( (1-alp)*(1-psi)*bet*gst^alp*khst^alp ); + n = xist/(nust+xist); + P = xist + nust; + k = khst*n; + + l = psi*mst*n/( (1-psi)*(1-n) ); + c = mst/P; + d = l - mst + 1; + y = k^alp*n^(1-alp)*gst^alp; + R = mst/bet; + W = l/n; + ist = y-c; + q = 1 - d; + + e = 1; + + gp_obs = m/dA; + gy_obs = dA; +end; + +shocks; +var e_a; stderr 0.014; +var e_m; stderr 0.005; +end; + +steady; + +check; + +stoch_simul(irf=0); + +conditional_forecast_paths; +var gy_obs; +periods 1 2 3:5; +values 0.01 -0.02 0; +var gp_obs; +periods 1:7; +values 0.05; +end; + +conditional_forecast(parameter_set=calibration, controlled_varexo=(e_a,e_m)); + +plot_conditional_forecast(periods=10) gy_obs gp_obs; + From 59642c331232175ce8167eba81108e712fb8031b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Mon, 1 Oct 2018 16:10:47 +0200 Subject: [PATCH 07/21] C output of preprocessor now splits generated fcts into several smaller fcts Adapt the k-order DLL as a consequence. --- .../k_order_perturbation/dynamic_dll.cc | 57 ++++++++++++++++--- .../k_order_perturbation/dynamic_dll.hh | 15 +++-- preprocessor | 2 +- 3 files changed, 60 insertions(+), 14 deletions(-) diff --git a/mex/sources/k_order_perturbation/dynamic_dll.cc b/mex/sources/k_order_perturbation/dynamic_dll.cc index 707fb6bfe..a352d5e03 100644 --- a/mex/sources/k_order_perturbation/dynamic_dll.cc +++ b/mex/sources/k_order_perturbation/dynamic_dll.cc @@ -35,21 +35,45 @@ DynamicModelDLL::DynamicModelDLL(const string &modName) throw (DynareException) dynamicHinstance = LoadLibrary(fName.c_str()); if (dynamicHinstance == NULL) throw 1; - Dynamic = (DynamicDLLFn) GetProcAddress(dynamicHinstance, "Dynamic"); - if (Dynamic == NULL) + ntt = (int *) GetProcAddress(dynamicHinstance, "ntt"); + dynamic_resid_tt = (dynamic_tt_fct) GetProcAddress(dynamicHinstance, "dynamic_resid_tt"); + dynamic_resid = (dynamic_resid_fct) GetProcAddress(dynamicHinstance, "dynamic_resid"); + dynamic_g1_tt = (dynamic_tt_fct) GetProcAddress(dynamicHinstance, "dynamic_g1_tt"); + dynamic_g1 = (dynamic_g1_fct) GetProcAddress(dynamicHinstance, "dynamic_g1"); + dynamic_g2_tt = (dynamic_tt_fct) GetProcAddress(dynamicHinstance, "dynamic_g2_tt"); + dynamic_g2 = (dynamic_g2_fct) GetProcAddress(dynamicHinstance, "dynamic_g2"); + dynamic_g3_tt = (dynamic_tt_fct) GetProcAddress(dynamicHinstance, "dynamic_g3_tt"); + dynamic_g3 = (dynamic_g3_fct) GetProcAddress(dynamicHinstance, "dynamic_g3"); + if (ntt == NULL + || dynamic_resid_tt == NULL || dynamic_resid == NULL + || dynamic_g1_tt == NULL || dynamic_g1 == NULL + || dynamic_g2_tt == NULL || dynamic_g2 == NULL + || dynamic_g3_tt == NULL || dynamic_g3 == NULL) { FreeLibrary(dynamicHinstance); // Free the library throw 2; } #else // Linux or Mac dynamicHinstance = dlopen(fName.c_str(), RTLD_NOW); - if ((dynamicHinstance == NULL) || dlerror()) + if (dynamicHinstance == NULL) { cerr << dlerror() << endl; throw 1; } - Dynamic = (DynamicDLLFn) dlsym(dynamicHinstance, "Dynamic"); - if ((Dynamic == NULL) || dlerror()) + ntt = (int *) dlsym(dynamicHinstance, "ntt"); + dynamic_resid_tt = (dynamic_tt_fct) dlsym(dynamicHinstance, "dynamic_resid_tt"); + dynamic_resid = (dynamic_resid_fct) dlsym(dynamicHinstance, "dynamic_resid"); + dynamic_g1_tt = (dynamic_tt_fct) dlsym(dynamicHinstance, "dynamic_g1_tt"); + dynamic_g1 = (dynamic_g1_fct) dlsym(dynamicHinstance, "dynamic_g1"); + dynamic_g2_tt = (dynamic_tt_fct) dlsym(dynamicHinstance, "dynamic_g2_tt"); + dynamic_g2 = (dynamic_g2_fct) dlsym(dynamicHinstance, "dynamic_g2"); + dynamic_g3_tt = (dynamic_tt_fct) dlsym(dynamicHinstance, "dynamic_g3_tt"); + dynamic_g3 = (dynamic_g3_fct) dlsym(dynamicHinstance, "dynamic_g3"); + if (ntt == NULL + || dynamic_resid_tt == NULL || dynamic_resid == NULL + || dynamic_g1_tt == NULL || dynamic_g1 == NULL + || dynamic_g2_tt == NULL || dynamic_g2 == NULL + || dynamic_g3_tt == NULL || dynamic_g3 == NULL) { dlclose(dynamicHinstance); // Free the library cerr << dlerror() << endl; @@ -65,13 +89,13 @@ DynamicModelDLL::DynamicModelDLL(const string &modName) throw (DynareException) if (i == 1) msg << "can't dynamically load the file"; if (i == 2) - msg << "can't locate the 'Dynamic' symbol"; + msg << "can't locate the relevant dynamic symbols within the MEX file"; msg << ")"; throw DynareException(__FILE__, __LINE__, msg.str()); } catch (...) { - throw DynareException(__FILE__, __LINE__, string("Can't find Dynamic function in ") + fName); + throw DynareException(__FILE__, __LINE__, string("Can't find the relevant dynamic symbols in ") + fName); } } @@ -90,6 +114,21 @@ void DynamicModelDLL::eval(const Vector &y, const Vector &x, const Vector &modParams, const Vector &ySteady, Vector &residual, TwoDMatrix *g1, TwoDMatrix *g2, TwoDMatrix *g3) throw (DynareException) { - Dynamic(y.base(), x.base(), 1, modParams.base(), ySteady.base(), 0, residual.base(), g1->base(), - g2 == NULL ? NULL : g2->base(), g3 == NULL ? NULL : g3->base()); + double *T = (double *) malloc(sizeof(double) * (*ntt)); + dynamic_resid_tt(y.base(), x.base(), 1, modParams.base(), ySteady.base(), 0, T); + dynamic_resid(y.base(), x.base(), 1, modParams.base(), ySteady.base(), 0, T, residual.base()); + if (g1 || g2 || g3) + dynamic_g1_tt(y.base(), x.base(), 1, modParams.base(), ySteady.base(), 0, T); + if (g1) + dynamic_g1(y.base(), x.base(), 1, modParams.base(), ySteady.base(), 0, T, g1->base()); + if (g2 || g3) + dynamic_g2_tt(y.base(), x.base(), 1, modParams.base(), ySteady.base(), 0, T); + if (g2) + dynamic_g2(y.base(), x.base(), 1, modParams.base(), ySteady.base(), 0, T, g2->base()); + if (g3) + { + dynamic_g3_tt(y.base(), x.base(), 1, modParams.base(), ySteady.base(), 0, T); + dynamic_g3(y.base(), x.base(), 1, modParams.base(), ySteady.base(), 0, T, g3->base()); + } + free(T); } diff --git a/mex/sources/k_order_perturbation/dynamic_dll.hh b/mex/sources/k_order_perturbation/dynamic_dll.hh index 15b4acfe9..de2696508 100644 --- a/mex/sources/k_order_perturbation/dynamic_dll.hh +++ b/mex/sources/k_order_perturbation/dynamic_dll.hh @@ -34,9 +34,11 @@ #include "dynamic_abstract_class.hh" #include "dynare_exception.h" -// _Dynamic DLL pointer -typedef void (*DynamicDLLFn)(const double *y, const double *x, int nb_row_x, const double *params, const double *steady_state, - int it_, double *residual, double *g1, double *g2, double *g3); +typedef void (*dynamic_tt_fct)(const double *y, const double *x, int nb_row_x, const double *params, const double *steady_state, int it_, double *T); +typedef void (*dynamic_resid_fct) (const double *y, const double *x, int nb_row_x, const double *params, const double *steady_state, int it_, const double *T, double *residual); +typedef void (*dynamic_g1_fct)(const double *y, const double *x, int nb_row_x, const double *params, const double *steady_state, int it_, const double *T, double *g1); +typedef void (*dynamic_g2_fct)(const double *y, const double *x, int nb_row_x, const double *params, const double *steady_state, int it_, const double *T, double *v2); +typedef void (*dynamic_g3_fct)(const double *y, const double *x, int nb_row_x, const double *params, const double *steady_state, int it_, const double *T, double *v3); /** * creates pointer to Dynamic function inside _dynamic.dll @@ -45,7 +47,12 @@ typedef void (*DynamicDLLFn)(const double *y, const double *x, int nb_row_x, con class DynamicModelDLL : public DynamicModelAC { private: - DynamicDLLFn Dynamic; // pointer to the Dynamic function in DLL + int *ntt; + dynamic_tt_fct dynamic_resid_tt, dynamic_g1_tt, dynamic_g2_tt, dynamic_g3_tt; + dynamic_resid_fct dynamic_resid; + dynamic_g1_fct dynamic_g1; + dynamic_g2_fct dynamic_g2; + dynamic_g3_fct dynamic_g3; #if defined(_WIN32) || defined(__CYGWIN32__) HINSTANCE dynamicHinstance; // DLL instance pointer in Windows #else diff --git a/preprocessor b/preprocessor index 680fb72d0..15d026e54 160000 --- a/preprocessor +++ b/preprocessor @@ -1 +1 @@ -Subproject commit 680fb72d0dcb15ea4831fc9dd71acb04661d9519 +Subproject commit 15d026e54e6c4aaaa2f7c26fe6e872ee188f1432 From c6a17abc72f5a039df577096bbea550587e4ef1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Mon, 1 Oct 2018 16:40:26 +0200 Subject: [PATCH 08/21] Testsuite: suppress MATLAB splash screen when generating .m.tls file --- tests/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Makefile.am b/tests/Makefile.am index 255c748d0..046df274f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -909,7 +909,7 @@ check-octave: $(O_XFAIL_TRS_FILES) $(O_TRS_FILES) %.m.tls : %.m @echo "`tput bold``tput setaf 8`MATLAB: $(CURDIR)/$*... `tput sgr0`" @TOP_TEST_DIR="$(CURDIR)" FILESTEM="$*" \ - $(MATLAB)/bin/matlab -nosplash -nodisplay -r run_m_script 2> /dev/null + $(MATLAB)/bin/matlab -nosplash -nodisplay -r run_m_script >/dev/null 2>&1 @touch $*.m.tls @echo "`tput bold`MATLAB`tput setaf 8`: $(CURDIR)/$* Done!`tput sgr0`" From 24cb1c071949e83a8709b3cd6784ff0c5b947220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Mon, 1 Oct 2018 18:26:03 +0200 Subject: [PATCH 09/21] Provisions for MATLAB R2018b (9.5) --- m4/ax_matlab_version.m4 | 3 +++ windows/dynare.nsi | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/m4/ax_matlab_version.m4 b/m4/ax_matlab_version.m4 index 1004b91b9..cbd6325b1 100644 --- a/m4/ax_matlab_version.m4 +++ b/m4/ax_matlab_version.m4 @@ -22,6 +22,9 @@ AC_REQUIRE([AX_MATLAB]) AC_MSG_CHECKING([for MATLAB version]) if test "x$MATLAB_VERSION" != "x"; then case $MATLAB_VERSION in + *2018b | *2018B) + MATLAB_VERSION="9.5" + ;; *2018a | *2018A) MATLAB_VERSION="9.4" ;; diff --git a/windows/dynare.nsi b/windows/dynare.nsi index 7bad24fd4..2b7cf7601 100644 --- a/windows/dynare.nsi +++ b/windows/dynare.nsi @@ -103,9 +103,9 @@ Section "MEX files for MATLAB 64-bit, version 7.8 to 9.3 (R2009a to R2017b)" File ..\mex\matlab\win64-7.8-9.3\*.mexw64 SectionEnd -Section "MEX files for MATLAB 64-bit, version 9.4 (R2018a)" - SetOutPath $INSTDIR\mex\matlab\win64-9.4 - File ..\mex\matlab\win64-9.4\*.mexw64 +Section "MEX files for MATLAB 64-bit, version 9.4 to 9.5 (R2018a to R2018b)" + SetOutPath $INSTDIR\mex\matlab\win64-9.4-9.5 + File ..\mex\matlab\win64-9.4-9.5\*.mexw64 SectionEnd SectionGroupEnd From 8f6b89ab56ba07a8ebe22d02389fb1e24fabb8e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Tue, 2 Oct 2018 15:51:55 +0200 Subject: [PATCH 10/21] Gitlab CI: include test results at 2nd level of the filesystem hierarchy --- .gitlab-ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d05eada9d..d7045ecca 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -45,6 +45,8 @@ testsuite_matlab: - tests/*.m.trs - tests/*/*.m.log - tests/*/*.m.trs + - tests/*/*/*.m.log + - tests/*/*/*.m.trs - tests/run_test_matlab_output.txt when: always dependencies: @@ -64,6 +66,8 @@ testsuite_matlab: - tests/*.o.trs - tests/*/*.o.log - tests/*/*.o.trs + - tests/*/*/*.o.log + - tests/*/*/*.o.trs - tests/run_test_octave_output.txt when: always dependencies: From ffb36e5713288385fbf900916966ebadd541b772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Tue, 2 Oct 2018 17:10:36 +0200 Subject: [PATCH 11/21] Remove obsolete kludges for MinGW --- mex/sources/bytecode/ErrorHandling.hh | 14 -------------- mex/sources/sobol/gaussian.hh | 12 ------------ 2 files changed, 26 deletions(-) diff --git a/mex/sources/bytecode/ErrorHandling.hh b/mex/sources/bytecode/ErrorHandling.hh index e94b84dc9..cf6bea93d 100644 --- a/mex/sources/bytecode/ErrorHandling.hh +++ b/mex/sources/bytecode/ErrorHandling.hh @@ -146,20 +146,6 @@ public: }; #endif -#ifdef __MINGW32__ -# define __CROSS_COMPILATION__ -#endif - -#ifdef __MINGW64__ -# define __CROSS_COMPILATION__ -#endif - -#ifdef __CROSS_COMPILATION__ -# define M_PI 3.14159265358979323846 -# define M_SQRT2 1.41421356237309504880 -# define finite(x) !std::isfinite(x) -#endif - //#define DEBUG using namespace std; diff --git a/mex/sources/sobol/gaussian.hh b/mex/sources/sobol/gaussian.hh index 6dd00ca22..d1fcd1b88 100644 --- a/mex/sources/sobol/gaussian.hh +++ b/mex/sources/sobol/gaussian.hh @@ -40,18 +40,6 @@ using namespace std; #endif #define DEBUG_OMP 0 -#ifdef __MINGW32__ -# define __CROSS_COMPILATION__ -#endif - -#ifdef __MINGW64__ -# define __CROSS_COMPILATION__ -#endif - -#ifdef __CROSS_COMPILATION__ -# define M_PI 3.14159265358979323846 -#endif - template T icdf(const T uniform) From 03bd2b73e6cc53e43498b9718be5196774b06cdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?= Date: Wed, 3 Oct 2018 18:21:16 +0200 Subject: [PATCH 12/21] Fixed integration test for the automatic tuning of mh_jscale. --- tests/estimation/tune_mh_jscale/fs2000.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/estimation/tune_mh_jscale/fs2000.mod b/tests/estimation/tune_mh_jscale/fs2000.mod index b243c924f..7986745c2 100644 --- a/tests/estimation/tune_mh_jscale/fs2000.mod +++ b/tests/estimation/tune_mh_jscale/fs2000.mod @@ -100,6 +100,6 @@ estimation(order=1, datafile='../fsdat_simul', nobs=192, loglinear, mh_replic=20 mhdata = load('fs2000/metropolis/fs2000_mh_history_0.mat'); -if any(abs(mhdata.record.AcceptanceRatio-options_.mh_tune_jscale.target)>options_.mh_tune_jscale.c1) +if any(abs(mhdata.record.AcceptanceRatio-options_.mh_tune_jscale.target)>options_.mh_tune_jscale.c2) error('Automagic tuning of the MCMC proposal scale parameter did not work as expected!') end \ No newline at end of file From 6a847931dc590c79c0828e6d2cc576ecc64a263a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?= Date: Wed, 3 Oct 2018 23:22:33 +0200 Subject: [PATCH 13/21] Dynare computes the excess kurtosis. See https://forum.dynare.org/t/simulated-kurtosis-reported-incorrectly/12534 --- doc/dynare.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/dynare.texi b/doc/dynare.texi index 61cd82db7..6e1186af0 100644 --- a/doc/dynare.texi +++ b/doc/dynare.texi @@ -4585,7 +4585,7 @@ The variables are arranged in declaration order. @end defvr @defvr {MATLAB/Octave variable} oo_.kurtosis -After a run of @code{stoch_simul} contains the kurtosis (standardized fourth moment) +After a run of @code{stoch_simul} contains the excess kurtosis (standardized fourth moment) of the simulated variables if the @code{periods} option is present. The variables are arranged in declaration order. @end defvr From 084b7ac537806294a776b7cb7f319e82afa4e784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?= Date: Thu, 4 Oct 2018 12:02:31 +0200 Subject: [PATCH 14/21] Changed optimization algorithm in integration tests. fs2000_uncorr_ME_missing was failing on some servers due to a numerical precision issue. It appears that the problem drops off if the smoothed variables are computed on another point (given by another optimization algorithm). --- tests/kalman/likelihood_from_dynare/fs2000_estimation_check.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/kalman/likelihood_from_dynare/fs2000_estimation_check.inc b/tests/kalman/likelihood_from_dynare/fs2000_estimation_check.inc index c95262c22..c6a040695 100644 --- a/tests/kalman/likelihood_from_dynare/fs2000_estimation_check.inc +++ b/tests/kalman/likelihood_from_dynare/fs2000_estimation_check.inc @@ -1,6 +1,6 @@ %%default options_.lik_init=1; -estimation(kalman_algo=0,mode_compute=4,order=1,datafile=@{data_file_name},smoother,filter_decomposition,forecast = 8,filtered_vars,filter_step_ahead=[1,3],irf=20) m P c e W R k d y gy_obs; +estimation(kalman_algo=0,mode_compute=8,order=1,datafile=@{data_file_name},smoother,filter_decomposition,forecast = 8,filtered_vars,filter_step_ahead=[1,3],irf=20) m P c e W R k d y gy_obs; fval_algo_0=oo_.likelihood_at_initial_parameters; %%Multivariate Kalman Filter options_.lik_init=1; From 2d674e0c55ff5a10bff53d110b9c849553775154 Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Fri, 5 Oct 2018 23:07:28 +0200 Subject: [PATCH 15/21] update year in license file --- license.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/license.txt b/license.txt index afb06aa4b..8f75e037d 100644 --- a/license.txt +++ b/license.txt @@ -1,6 +1,6 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: Dynare -Upstream-Contact: Dynare Team, whose members in 2017 are: +Upstream-Contact: Dynare Team, whose members in 2018 are: Stéphane Adjemian Houtan Bastani Michel Juillard @@ -13,7 +13,7 @@ Upstream-Contact: Dynare Team, whose members in 2017 are: Source: http://www.dynare.org Files: * -Copyright: 1996-2017 Dynare Team +Copyright: 1996-2018 Dynare Team License: GPL-3+ Files: matlab/AIM/SP* @@ -117,8 +117,8 @@ Files: matlab/gsa/cumplot.m matlab/gsa/tcrit.m matlab/gsa/teff.m matlab/gsa/trank.m -Copyright: 2011-2017 European Commission - 2011-2017 Dynare Team +Copyright: 2011-2018 European Commission + 2011-2018 Dynare Team License: GPL-3+ Files: matlab/gsa/pick.m @@ -196,7 +196,7 @@ Copyright: 2005-2010 Pascal Getreuer License: BSD-2-clause Files: doc/dynare.texi doc/*.tex doc/*.svg doc/*.pdf doc/*.bib -Copyright: 1996-2017 Dynare Team +Copyright: 1996-2018 Dynare Team License: GFDL-NIV-1.3+ Files: doc/macroprocessor/* @@ -204,7 +204,7 @@ Copyright: 2008-2015 Dynare Team License: CC-BY-SA-4.0 Files: doc/preprocessor/* -Copyright: 2007-2017 Dynare Team +Copyright: 2007-2018 Dynare Team License: CC-BY-SA-4.0 Files: doc/dr.tex doc/bvar_a_la_sims.tex From 108854a4842dc3a2bfd97f446699ea2488f2ca47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemia=20=28Scylla=29?= Date: Sat, 6 Oct 2018 17:50:37 +0200 Subject: [PATCH 16/21] Bug fix. verbosity option was not honoured in simplex algorithm (8). Thanks to Reuben for reporting. --- matlab/optimization/dynare_minimize_objective.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/matlab/optimization/dynare_minimize_objective.m b/matlab/optimization/dynare_minimize_objective.m index b51617010..6103fa167 100644 --- a/matlab/optimization/dynare_minimize_objective.m +++ b/matlab/optimization/dynare_minimize_objective.m @@ -295,14 +295,14 @@ switch minimizer_algorithm case 'InitialSimplexSize' simplexOptions.delta_factor = options_list{i,2}; case 'verbosity' - simplexOptions.verbose = options_list{i,2}; + simplexOptions.verbosity = options_list{i,2}; otherwise warning(['simplex: Unknown option (' options_list{i,1} ')!']) end end end if options_.silent_optimizer - simplexOptions.verbose = options_list{i,2}; + simplexOptions.verbosity = 0; end [opt_par_values,fval,exitflag] = simplex_optimization_routine(objective_function,start_par_value,simplexOptions,parameter_names,varargin{:}); case 9 From e5317b17dee1d4c7cab715e5d8619f4f0d77ed04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemia=20=28Scylla=29?= Date: Sat, 6 Oct 2018 17:52:58 +0200 Subject: [PATCH 17/21] Cosmetic change. --- matlab/optimization/simplex_optimization_routine.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/matlab/optimization/simplex_optimization_routine.m b/matlab/optimization/simplex_optimization_routine.m index 7c103a933..ab0d181e7 100644 --- a/matlab/optimization/simplex_optimization_routine.m +++ b/matlab/optimization/simplex_optimization_routine.m @@ -197,8 +197,10 @@ if ~nopenalty error('simplex_optimization_routine:: Initial condition is wrong!') else [v,fv,delta] = simplex_initialization(objective_function,initial_point,initial_score,delta,zero_delta,1,varargin{:}); - disp('Done!') - skipline() + if verbose + disp('Done!') + skipline() + end func_count = number_of_variables + 1; iter_count = 1; if verbose From d4bfd6c9f053a5f2d9d0ca4c0c7890928e66d8d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemia=20=28Scylla=29?= Date: Sat, 6 Oct 2018 21:37:27 +0200 Subject: [PATCH 18/21] Another attempt to fix numerical accuracy issues in integration tests. --- .../likelihood_from_dynare/fs2000_estimation_check.inc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/kalman/likelihood_from_dynare/fs2000_estimation_check.inc b/tests/kalman/likelihood_from_dynare/fs2000_estimation_check.inc index c6a040695..0cef5554b 100644 --- a/tests/kalman/likelihood_from_dynare/fs2000_estimation_check.inc +++ b/tests/kalman/likelihood_from_dynare/fs2000_estimation_check.inc @@ -1,6 +1,6 @@ %%default options_.lik_init=1; -estimation(kalman_algo=0,mode_compute=8,order=1,datafile=@{data_file_name},smoother,filter_decomposition,forecast = 8,filtered_vars,filter_step_ahead=[1,3],irf=20) m P c e W R k d y gy_obs; +estimation(kalman_algo=0,mode_compute=4,order=1,datafile=@{data_file_name},smoother,filter_decomposition,forecast = 8,filtered_vars,filter_step_ahead=[1,3],irf=20) m P c e W R k d y gy_obs; fval_algo_0=oo_.likelihood_at_initial_parameters; %%Multivariate Kalman Filter options_.lik_init=1; @@ -52,15 +52,15 @@ SmoothedShocks(:,:,6)=cell2mat(struct2cell(oo_.SmoothedShocks)); SmoothedVariables(:,:,6)=cell2mat(struct2cell(oo_.SmoothedVariables)); -if max(max(abs(SmoothedMeasurementErrors-repmat(SmoothedMeasurementErrors(:,:,1),[1,1,6]))))>1e-8 +if max(max(abs(SmoothedMeasurementErrors-repmat(SmoothedMeasurementErrors(:,:,1),[1,1,6]))))>1e-6 error('SmoothedMeasurementErrors do not match') end -if max(max(abs(SmoothedShocks-repmat(SmoothedShocks(:,:,1),[1,1,6]))))>1e-8 +if max(max(abs(SmoothedShocks-repmat(SmoothedShocks(:,:,1),[1,1,6]))))>1e-6 error('SmoothedShocks do not match') end -if max(max(abs(SmoothedVariables-repmat(SmoothedVariables(:,:,1),[1,1,6]))))>1e-8 +if max(max(abs(SmoothedVariables-repmat(SmoothedVariables(:,:,1),[1,1,6]))))>1e-6 error('SmoothedVariables do not match') end From 3263fdc9bc541cd7a0314fda97a980985d2120b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Tue, 16 Oct 2018 17:08:59 +0200 Subject: [PATCH 19/21] Submodules migrated to git.dynare.org --- .gitmodules | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitmodules b/.gitmodules index 7efeef8ac..3d5849e4e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,15 +1,15 @@ [submodule "contrib/ms-sbvar/utilities_dw"] path = contrib/ms-sbvar/utilities_dw - url = http://www.dynare.org/git/frbatlanta/utilities_dw.git + url = https://git.dynare.org/contrib/utilities_dw.git [submodule "contrib/ms-sbvar/switch_dw"] path = contrib/ms-sbvar/switch_dw - url = http://www.dynare.org/git/frbatlanta/switch_dw.git + url = https://git.dynare.org/contrib/switch_dw.git [submodule "contrib/ms-sbvar/TZcode"] path = contrib/ms-sbvar/TZcode - url = http://www.dynare.org/git/frbatlanta/TZcode.git + url = https://git.dynare.org/contrib/TZcode.git [submodule "contrib/dmm"] path = contrib/dmm - url = http://www.dynare.org/git/dmm.git + url = https://git.dynare.org/contrib/dmm.git [submodule "matlab/utilities/tests"] path = matlab/utilities/tests url = https://git.dynare.org/Dynare/m-unit-tests.git From c11cdff2c2d1ccb1b4cc0132381e525e7fffcd15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Thu, 18 Oct 2018 10:58:45 +0200 Subject: [PATCH 20/21] Update preprocessor submodule --- preprocessor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/preprocessor b/preprocessor index 15d026e54..1089a223c 160000 --- a/preprocessor +++ b/preprocessor @@ -1 +1 @@ -Subproject commit 15d026e54e6c4aaaa2f7c26fe6e872ee188f1432 +Subproject commit 1089a223c46f9f171030dd065f3b35b74f49142c From de0ed40f144f5d68e59f6849cde5c4e6b7c69694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemia=20=28Scylla=29?= Date: Wed, 24 Oct 2018 18:27:46 +0200 Subject: [PATCH 21/21] Updated preprocessor submodule. --- preprocessor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/preprocessor b/preprocessor index 1089a223c..bef7c2a19 160000 --- a/preprocessor +++ b/preprocessor @@ -1 +1 @@ -Subproject commit 1089a223c46f9f171030dd065f3b35b74f49142c +Subproject commit bef7c2a1938f1201cffbddc8d597b2a486fd36c6