Merge branch 'master' into ecb-master

time-shift
Stéphane Adjemia (Scylla) 2018-10-24 18:31:31 +02:00
commit dcea7514d9
Signed by untrusted user who does not match committer: stepan
GPG Key ID: A6D44CB9C64CE77B
21 changed files with 226 additions and 102 deletions

View File

@ -45,6 +45,8 @@ testsuite_matlab:
- tests/*.m.trs - tests/*.m.trs
- tests/*/*.m.log - tests/*/*.m.log
- tests/*/*.m.trs - tests/*/*.m.trs
- tests/*/*/*.m.log
- tests/*/*/*.m.trs
- tests/run_test_matlab_output.txt - tests/run_test_matlab_output.txt
when: always when: always
dependencies: dependencies:
@ -64,6 +66,8 @@ testsuite_matlab:
- tests/*.o.trs - tests/*.o.trs
- tests/*/*.o.log - tests/*/*.o.log
- tests/*/*.o.trs - tests/*/*.o.trs
- tests/*/*/*.o.log
- tests/*/*/*.o.trs
- tests/run_test_octave_output.txt - tests/run_test_octave_output.txt
when: always when: always
dependencies: dependencies:

0
configure.ac Executable file → Normal file
View File

View File

@ -4637,7 +4637,7 @@ The variables are arranged in declaration order.
@end defvr @end defvr
@defvr {MATLAB/Octave variable} oo_.kurtosis @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. of the simulated variables if the @code{periods} option is present.
The variables are arranged in declaration order. The variables are arranged in declaration order.
@end defvr @end defvr
@ -8278,6 +8278,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 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 values for periods 1 and 3, the values for period 2 will be 0. Currently, it is not
possible to have uncontrolled intermediate periods. 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 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, 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. it is necessary to specify the logarithm of the controlled variables.

View File

@ -1,6 +1,6 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: Dynare Upstream-Name: Dynare
Upstream-Contact: Dynare Team, whose members in 2017 are: Upstream-Contact: Dynare Team, whose members in 2018 are:
Stéphane Adjemian <stephane.adjemian@univ-lemans.fr> Stéphane Adjemian <stephane.adjemian@univ-lemans.fr>
Houtan Bastani <houtan@dynare.org> Houtan Bastani <houtan@dynare.org>
Michel Juillard <michel.juillard@mjui.fr> Michel Juillard <michel.juillard@mjui.fr>
@ -13,7 +13,7 @@ Upstream-Contact: Dynare Team, whose members in 2017 are:
Source: http://www.dynare.org Source: http://www.dynare.org
Files: * Files: *
Copyright: 1996-2017 Dynare Team Copyright: 1996-2018 Dynare Team
License: GPL-3+ License: GPL-3+
Files: matlab/AIM/SP* Files: matlab/AIM/SP*
@ -117,8 +117,8 @@ Files: matlab/gsa/cumplot.m
matlab/gsa/tcrit.m matlab/gsa/tcrit.m
matlab/gsa/teff.m matlab/gsa/teff.m
matlab/gsa/trank.m matlab/gsa/trank.m
Copyright: 2011-2017 European Commission Copyright: 2011-2018 European Commission
2011-2017 Dynare Team 2011-2018 Dynare Team
License: GPL-3+ License: GPL-3+
Files: matlab/gsa/pick.m Files: matlab/gsa/pick.m
@ -196,7 +196,7 @@ Copyright: 2005-2010 Pascal Getreuer
License: BSD-2-clause License: BSD-2-clause
Files: doc/dynare.texi doc/*.tex doc/*.svg doc/*.pdf doc/*.bib 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+ License: GFDL-NIV-1.3+
Files: doc/macroprocessor/* Files: doc/macroprocessor/*
@ -204,7 +204,7 @@ Copyright: 2008-2015 Dynare Team
License: CC-BY-SA-4.0 License: CC-BY-SA-4.0
Files: doc/preprocessor/* Files: doc/preprocessor/*
Copyright: 2007-2017 Dynare Team Copyright: 2007-2018 Dynare Team
License: CC-BY-SA-4.0 License: CC-BY-SA-4.0
Files: doc/dr.tex doc/bvar_a_la_sims.tex Files: doc/dr.tex doc/bvar_a_la_sims.tex

View File

@ -22,6 +22,9 @@ AC_REQUIRE([AX_MATLAB])
AC_MSG_CHECKING([for MATLAB version]) AC_MSG_CHECKING([for MATLAB version])
if test "x$MATLAB_VERSION" != "x"; then if test "x$MATLAB_VERSION" != "x"; then
case $MATLAB_VERSION in case $MATLAB_VERSION in
*2018b | *2018B)
MATLAB_VERSION="9.5"
;;
*2018a | *2018A) *2018a | *2018A)
MATLAB_VERSION="9.4" MATLAB_VERSION="9.4"
;; ;;

View File

@ -1,30 +1,32 @@
function imcforecast(constrained_paths, constrained_vars, options_cond_fcst) function imcforecast(constrained_paths, constrained_vars, options_cond_fcst)
% Computes conditional forecasts. % Computes conditional forecasts.
% %
% INPUTS % 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. % - consnstrained_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. % - constrained_vars [integer] m*1 array, indices in M_.endo_names of the constrained variables.
% o options_cond_fcst [structure] containing the options. The fields are: % - 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: % + replic [integer] scalar, number of monte carlo simulations.
% "posterior_mode", % + parameter_set [char] values of the estimated parameters:
% "posterior_mean", % 'posterior_mode',
% "posterior_median", % 'posterior_mean',
% "prior_mode" or % 'posterior_median',
% "prior mean". % 'prior_mode' or
% [double] np*1 array, values of the estimated parameters. % 'prior mean'.
% + controlled_varexo [char] m*x array, list of controlled exogenous variables. % [double] np*1 array, values of the estimated parameters.
% + conf_sig [double] scalar in [0,1], probability mass covered by the confidence bands. % + 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 % OUTPUTS
% None. % None.
% %
% SPECIAL REQUIREMENTS % 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 % REMARKS
% [1] Results are stored in a structure which is saved in a mat file called conditional_forecasts.mat. % [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. % [2] Use the function plot_icforecast to plot the results.
% Copyright (C) 2006-2018 Dynare Team % Copyright (C) 2006-2018 Dynare Team
% %
@ -124,7 +126,8 @@ if estimated_model
qz_criterium_old=options_.qz_criterium; qz_criterium_old=options_.qz_criterium;
options_=select_qz_criterium_value(options_); options_=select_qz_criterium_value(options_);
options_smoothed_state_uncertainty_old = options_.smoothed_state_uncertainty; 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; options_.smoothed_state_uncertainty = options_smoothed_state_uncertainty_old;
%get constant part %get constant part
if options_.noconstant if options_.noconstant
@ -146,7 +149,7 @@ if estimated_model
end end
% add trend to constant % add trend to constant
for obs_iter=1:length(options_.varobs) 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,:); constant(j,:) = constant(j,:) + trend_addition(obs_iter,:);
end end
trend = constant(oo_.dr.order_var,:); trend = constant(oo_.dr.order_var,:);
@ -168,7 +171,7 @@ if options_.logged_steady_state %if steady state was previously logged, undo thi
options_.logged_steady_state=0; options_.logged_steady_state=0;
end 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 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_); oo_.dr.ys=log_variable(1:M_.endo_nbr,oo_.dr.ys,M_);
@ -214,25 +217,21 @@ ExoSize = M_.exo_nbr;
n1 = size(constrained_vars,1); n1 = size(constrained_vars,1);
n2 = size(options_cond_fcst.controlled_varexo,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 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 end
idx = []; % Get indices of controlled varexo.
jdx = []; [~, controlled_varexo] = ismember(options_cond_fcst.controlled_varexo,M_.exo_names);
for i = 1:n1 mv = zeros(n1, NumberOfStates);
idx = [idx ; constrained_vars(i,:)]; mu = zeros(ExoSize, n2);
% 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);
for i=1:n1 for i=1:n1
mv(i,idx(i)) = 1; mv(i,constrained_vars(i)) = 1;
mu(jdx(i),i) = 1; mu(controlled_varexo(i),i) = 1;
end end
% number of periods with constrained values % number of periods with constrained values
@ -241,7 +240,7 @@ cL = size(constrained_paths,2);
%transform constrained periods into deviations from steady state; note that %transform constrained periods into deviations from steady state; note that
%trend includes last actual data point and therefore we need to start in %trend includes last actual data point and therefore we need to start in
%period 2 %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); FORCS1_shocks = zeros(n1,cL,options_cond_fcst.replic);
@ -249,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 for b=1:options_cond_fcst.replic %conditional forecast using cL set to constrained values
shocks = sQ*randn(ExoSize,options_cond_fcst.periods); 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_shocks(:,:,b)] = mcforecast3(cL,options_cond_fcst.periods,constrained_paths,shocks,FORCS1(:,:,b),T,R,mv, mu);
FORCS1(:,:,b)=FORCS1(:,:,b)+trend; %add trend FORCS1(:,:,b)=FORCS1(:,:,b)+trend; %add trend
end end
@ -281,11 +280,9 @@ clear FORCS1 mFORCS1_shocks;
FORCS2 = zeros(NumberOfStates,options_cond_fcst.periods+1,options_cond_fcst.replic); 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 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 for b=1:options_cond_fcst.replic %conditional forecast using cL set to 0
shocks = sQ*randn(ExoSize,options_cond_fcst.periods); 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; FORCS2(:,:,b) = mcforecast3(0,options_cond_fcst.periods,constrained_paths,shocks,FORCS2(:,:,b),T,R,mv, mu)+trend;
end end
@ -296,8 +293,8 @@ for i = 1:EndoSize
tmp = sort(squeeze(FORCS2(i,:,:))'); tmp = sort(squeeze(FORCS2(i,:,:))');
forecasts.uncond.ci.(M_.endo_names{oo_.dr.order_var(i)}) = [tmp(t1,:)' ,tmp(t2,:)' ]'; forecasts.uncond.ci.(M_.endo_names{oo_.dr.order_var(i)}) = [tmp(t1,:)' ,tmp(t2,:)' ]';
end end
forecasts.graph.title=graph_title; forecasts.graph.title = graph_title;
forecasts.graph.fname=M_.fname; forecasts.graph.fname = M_.fname;
%reset qz_criterium %reset qz_criterium
options_.qz_criterium=qz_criterium_old; options_.qz_criterium=qz_criterium_old;

View File

@ -27,6 +27,10 @@ function [forcs, e]= mcforecast3(cL,H,mcValue,shocks,forcs,T,R,mv,mu)
% This is then solved to get: % 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) % 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 % After obtaining the shocks, and for uncontrolled periods, the state-space representation
% y_t=T*y_{t-1}+R*shocks(:,t) % y_t=T*y_{t-1}+R*shocks(:,t)
% is used for forecasting % is used for forecasting
@ -51,8 +55,10 @@ function [forcs, e]= mcforecast3(cL,H,mcValue,shocks,forcs,T,R,mv,mu)
if cL if cL
e = zeros(size(mcValue,1),cL); e = zeros(size(mcValue,1),cL);
for t = 1:cL for t = 1:cL
e(:,t) = inv(mv*R*mu)*(mcValue(:,t)-mv*T*forcs(:,t)-mv*R*shocks(:,t)); % missing conditional values are indicated by NaN
forcs(:,t+1) = T*forcs(:,t)+R*(mu*e(:,t)+shocks(:,t)); 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
end end
for t = cL+1:H for t = cL+1:H

View File

@ -295,14 +295,14 @@ switch minimizer_algorithm
case 'InitialSimplexSize' case 'InitialSimplexSize'
simplexOptions.delta_factor = options_list{i,2}; simplexOptions.delta_factor = options_list{i,2};
case 'verbosity' case 'verbosity'
simplexOptions.verbose = options_list{i,2}; simplexOptions.verbosity = options_list{i,2};
otherwise otherwise
warning(['simplex: Unknown option (' options_list{i,1} ')!']) warning(['simplex: Unknown option (' options_list{i,1} ')!'])
end end
end end
end end
if options_.silent_optimizer if options_.silent_optimizer
simplexOptions.verbose = options_list{i,2}; simplexOptions.verbosity = 0;
end end
[opt_par_values,fval,exitflag] = simplex_optimization_routine(objective_function,start_par_value,simplexOptions,parameter_names,varargin{:}); [opt_par_values,fval,exitflag] = simplex_optimization_routine(objective_function,start_par_value,simplexOptions,parameter_names,varargin{:});
case 9 case 9

View File

@ -197,8 +197,10 @@ if ~nopenalty
error('simplex_optimization_routine:: Initial condition is wrong!') error('simplex_optimization_routine:: Initial condition is wrong!')
else else
[v,fv,delta] = simplex_initialization(objective_function,initial_point,initial_score,delta,zero_delta,1,varargin{:}); [v,fv,delta] = simplex_initialization(objective_function,initial_point,initial_score,delta,zero_delta,1,varargin{:});
disp('Done!') if verbose
skipline() disp('Done!')
skipline()
end
func_count = number_of_variables + 1; func_count = number_of_variables + 1;
iter_count = 1; iter_count = 1;
if verbose if verbose

0
mex/build/octave/configure.ac Executable file → Normal file
View File

View File

@ -146,20 +146,6 @@ public:
}; };
#endif #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 //#define DEBUG
using namespace std; using namespace std;

View File

@ -35,21 +35,45 @@ DynamicModelDLL::DynamicModelDLL(const string &modName) throw (DynareException)
dynamicHinstance = LoadLibrary(fName.c_str()); dynamicHinstance = LoadLibrary(fName.c_str());
if (dynamicHinstance == NULL) if (dynamicHinstance == NULL)
throw 1; throw 1;
Dynamic = (DynamicDLLFn) GetProcAddress(dynamicHinstance, "Dynamic"); ntt = (int *) GetProcAddress(dynamicHinstance, "ntt");
if (Dynamic == NULL) 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 FreeLibrary(dynamicHinstance); // Free the library
throw 2; throw 2;
} }
#else // Linux or Mac #else // Linux or Mac
dynamicHinstance = dlopen(fName.c_str(), RTLD_NOW); dynamicHinstance = dlopen(fName.c_str(), RTLD_NOW);
if ((dynamicHinstance == NULL) || dlerror()) if (dynamicHinstance == NULL)
{ {
cerr << dlerror() << endl; cerr << dlerror() << endl;
throw 1; throw 1;
} }
Dynamic = (DynamicDLLFn) dlsym(dynamicHinstance, "Dynamic"); ntt = (int *) dlsym(dynamicHinstance, "ntt");
if ((Dynamic == NULL) || dlerror()) 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 dlclose(dynamicHinstance); // Free the library
cerr << dlerror() << endl; cerr << dlerror() << endl;
@ -65,13 +89,13 @@ DynamicModelDLL::DynamicModelDLL(const string &modName) throw (DynareException)
if (i == 1) if (i == 1)
msg << "can't dynamically load the file"; msg << "can't dynamically load the file";
if (i == 2) if (i == 2)
msg << "can't locate the 'Dynamic' symbol"; msg << "can't locate the relevant dynamic symbols within the MEX file";
msg << ")"; msg << ")";
throw DynareException(__FILE__, __LINE__, msg.str()); throw DynareException(__FILE__, __LINE__, msg.str());
} }
catch (...) 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, DynamicModelDLL::eval(const Vector &y, const Vector &x, const Vector &modParams, const Vector &ySteady,
Vector &residual, TwoDMatrix *g1, TwoDMatrix *g2, TwoDMatrix *g3) throw (DynareException) 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(), double *T = (double *) malloc(sizeof(double) * (*ntt));
g2 == NULL ? NULL : g2->base(), g3 == NULL ? NULL : g3->base()); 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);
} }

View File

@ -34,9 +34,11 @@
#include "dynamic_abstract_class.hh" #include "dynamic_abstract_class.hh"
#include "dynare_exception.h" #include "dynare_exception.h"
// <model>_Dynamic DLL pointer 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 (*DynamicDLLFn)(const double *y, const double *x, int nb_row_x, const double *params, const double *steady_state, 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);
int it_, double *residual, double *g1, double *g2, double *g3); 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 <model>_dynamic.dll * creates pointer to Dynamic function inside <model>_dynamic.dll
@ -45,7 +47,12 @@ typedef void (*DynamicDLLFn)(const double *y, const double *x, int nb_row_x, con
class DynamicModelDLL : public DynamicModelAC class DynamicModelDLL : public DynamicModelAC
{ {
private: 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__) #if defined(_WIN32) || defined(__CYGWIN32__)
HINSTANCE dynamicHinstance; // DLL instance pointer in Windows HINSTANCE dynamicHinstance; // DLL instance pointer in Windows
#else #else

View File

@ -40,18 +40,6 @@ using namespace std;
#endif #endif
#define DEBUG_OMP 0 #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<typename T> template<typename T>
T T
icdf(const T uniform) icdf(const T uniform)

@ -1 +1 @@
Subproject commit 55b625b0168a200ee9ceb7cc7241ef3ed204fc25 Subproject commit bef7c2a1938f1201cffbddc8d597b2a486fd36c6

View File

@ -189,10 +189,12 @@ MODFILES = \
simul/simul_ZLB_purely_forward_no_solution.mod \ simul/simul_ZLB_purely_forward_no_solution.mod \
simul/Irreversible_investment.mod \ simul/Irreversible_investment.mod \
simul/linear_state_space_arma.mod \ simul/linear_state_space_arma.mod \
conditional_forecasts/1/fs2000_cal.mod \
conditional_forecasts/2/fs2000_est.mod \ conditional_forecasts/2/fs2000_est.mod \
conditional_forecasts/3/fs2000_conditional_forecast_initval.mod \ conditional_forecasts/3/fs2000_conditional_forecast_initval.mod \
conditional_forecasts/4/fs2000_conditional_forecast_histval.mod \ conditional_forecasts/4/fs2000_conditional_forecast_histval.mod \
conditional_forecasts/5/fs2000_cal.mod \ conditional_forecasts/5/fs2000_cal.mod \
conditional_forecasts/6/fs2000_cal.mod \
recursive/ls2003.mod \ recursive/ls2003.mod \
recursive/ls2003_bayesian.mod \ recursive/ls2003_bayesian.mod \
recursive/ls2003_bayesian_xls.mod \ recursive/ls2003_bayesian_xls.mod \
@ -994,7 +996,7 @@ check-octave: $(O_XFAIL_TRS_FILES) $(O_TRS_FILES)
%.m.tls : %.m %.m.tls : %.m
@echo "`tput bold``tput setaf 8`MATLAB: $(CURDIR)/$*... `tput sgr0`" @echo "`tput bold``tput setaf 8`MATLAB: $(CURDIR)/$*... `tput sgr0`"
@TOP_TEST_DIR="$(CURDIR)" FILESTEM="$*" \ @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 @touch $*.m.tls
@echo "`tput bold`MATLAB`tput setaf 8`: $(CURDIR)/$* Done!`tput sgr0`" @echo "`tput bold`MATLAB`tput setaf 8`: $(CURDIR)/$* Done!`tput sgr0`"

View File

@ -81,7 +81,7 @@ varobs gp_obs gy_obs;
options_.solve_tolf = 1e-12; 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=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=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); 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);

View File

@ -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;

View File

@ -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'); 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!') error('Automagic tuning of the MCMC proposal scale parameter did not work as expected!')
end end

View File

@ -52,15 +52,15 @@ SmoothedShocks(:,:,6)=cell2mat(struct2cell(oo_.SmoothedShocks));
SmoothedVariables(:,:,6)=cell2mat(struct2cell(oo_.SmoothedVariables)); 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') error('SmoothedMeasurementErrors do not match')
end 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') error('SmoothedShocks do not match')
end 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') error('SmoothedVariables do not match')
end end

View File

@ -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 File ..\mex\matlab\win64-7.8-9.3\*.mexw64
SectionEnd SectionEnd
Section "MEX files for MATLAB 64-bit, version 9.4 (R2018a)" Section "MEX files for MATLAB 64-bit, version 9.4 to 9.5 (R2018a to R2018b)"
SetOutPath $INSTDIR\mex\matlab\win64-9.4 SetOutPath $INSTDIR\mex\matlab\win64-9.4-9.5
File ..\mex\matlab\win64-9.4\*.mexw64 File ..\mex\matlab\win64-9.4-9.5\*.mexw64
SectionEnd SectionEnd
SectionGroupEnd SectionGroupEnd