diff --git a/doc/dynare.texi b/doc/dynare.texi index bea99bac5..3010eb738 100644 --- a/doc/dynare.texi +++ b/doc/dynare.texi @@ -3172,13 +3172,17 @@ Determines the method used to compute the decision rule. Possible values for @co @table @code @item default -Uses the default method to compute the decision rule based on the generalized Schur decomposition +Uses the default method to compute the decision rule based on the generalized Schur decomposition (see @cite{Villemot (2011)} for more information). @item cycle_reduction -Uses the cycle reduction algorithm to solve the polynomial equation for retrieving the coefficients +Uses the cycle reduction algorithm to solve the polynomial equation for retrieving the coefficients associated to the endogenous variables in the decision rule. This method is faster than the @code{default} one for large scale models. +@item logarithmic_reduction +Uses the logarithmic reduction algorithm to solve the polynomial equation for retrieving the coefficients +associated to the endogenous variables in the decision rule. This method is in general slower than the @code{cycle_reduction}. + @end table @noindent @@ -3186,7 +3190,16 @@ Default value is @code{default} @item dr_cycle_reduction_tol = @var{DOUBLE} @anchor{dr_cycle_reduction_tol} -It is the convergence criterion used in the cycle reduction algorithm. Its default value is 1e-7. +The convergence criterion used in the cycle reduction algorithm. Its default value is 1e-7. + +@item dr_logarithmic_reduction_tol = @var{DOUBLE} +@anchor{dr_logarithmic_reduction_tol} +The convergence criterion used in the logarithmic reduction algorithm. Its default value is 1e-12. + +@item dr_logarithmic_reduction_maxiter = @var{INTEGER} +@anchor{dr_logarithmic_reduction_maxiter} +The maximum number of iterations used in the logarithmic reduction algorithm. Its default value is 100. + @end table diff --git a/matlab/dyn_first_order_solver.m b/matlab/dyn_first_order_solver.m index 988be3ffc..74fbe6213 100644 --- a/matlab/dyn_first_order_solver.m +++ b/matlab/dyn_first_order_solver.m @@ -149,11 +149,15 @@ A = aa(:,index_m); % Jacobain matrix for lagged endogeneous variables B = aa(:,index_c); % Jacobian matrix for contemporaneous endogeneous variables C = aa(:,index_p); % Jacobain matrix for led endogeneous variables -if task ~= 1 && DynareOptions.dr_cycle_reduction == 1 +if task ~= 1 && (DynareOptions.dr_cycle_reduction || DynareOptions.dr_logarithmic_reduction) A1 = [aa(row_indx,index_m ) zeros(ndynamic,nfwrd)]; B1 = [aa(row_indx,index_0m) aa(row_indx,index_0p) ]; C1 = [zeros(ndynamic,npred) aa(row_indx,index_p)]; - [ghx, info] = cycle_reduction(A1, B1, C1, DynareOptions.dr_cycle_reduction_tol); + if DynareOptions.dr_cycle_reduction == 1 + [ghx, info] = cycle_reduction(A1, B1, C1, DynareOptions.dr_cycle_reduction_tol); + else + [ghx, info] = logarithmic_reduction(C1, B1, A1, DynareOptions.dr_logarithmic_reduction_tol, DynareOptions.dr_logarithmic_reduction_maxiter); + end ghx = ghx(:,index_m); hx = ghx(1:npred+nboth,:); gx = ghx(1+npred:end,:); diff --git a/matlab/global_initialization.m b/matlab/global_initialization.m index 77be2a119..ce0a43109 100644 --- a/matlab/global_initialization.m +++ b/matlab/global_initialization.m @@ -28,8 +28,7 @@ function global_initialization() % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -global oo_ M_ options_ estim_params_ bayestopt_ estimation_info ex0_ ys0_ ... - ex_det0_ +global oo_ M_ options_ estim_params_ bayestopt_ estimation_info ex0_ ys0_ ex_det0_ estim_params_ = []; bayestopt_ = []; @@ -450,6 +449,14 @@ options_.dr_cycle_reduction = 0; % convergence criterion for iteratives methods to solve the decision rule options_.dr_cycle_reduction_tol = 1e-7; +% if equal to 1 use a logarithmic reduction method to compute the decision rule (for large scale models) +options_.dr_logarithmic_reduction = 0; + +% convergence criterion for iteratives methods to solve the decision rule +options_.dr_logarithmic_reduction_tol = 1e-12; + +% convergence criterion for iteratives methods to solve the decision rule +options_.dr_logarithmic_reduction_maxiter = 100; % dates for historical time series options_.initial_date.freq = 1; diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy index 5c0e5e8f5..2ee59d062 100644 --- a/preprocessor/DynareBison.yy +++ b/preprocessor/DynareBison.yy @@ -95,8 +95,8 @@ class ParsingDriver; %token BVAR_PRIOR_DECAY BVAR_PRIOR_FLAT BVAR_PRIOR_LAMBDA %token BVAR_PRIOR_MU BVAR_PRIOR_OMEGA BVAR_PRIOR_TAU BVAR_PRIOR_TRAIN %token BVAR_REPLIC BYTECODE -%token CALIB_SMOOTHER CHANGE_TYPE CHECK CONDITIONAL_FORECAST CONDITIONAL_FORECAST_PATHS CONF_SIG CONSTANT CONTROLLED_VAREXO CORR COVAR CUTOFF CYCLE_REDUCTION -%token DATAFILE FILE DOUBLING DR_CYCLE_REDUCTION_TOL DR_ALGO DROP DSAMPLE DYNASAVE DYNATYPE CALIBRATION +%token CALIB_SMOOTHER CHANGE_TYPE CHECK CONDITIONAL_FORECAST CONDITIONAL_FORECAST_PATHS CONF_SIG CONSTANT CONTROLLED_VAREXO CORR COVAR CUTOFF CYCLE_REDUCTION LOGARITHMIC_REDUCTION +%token DATAFILE FILE DOUBLING DR_CYCLE_REDUCTION_TOL DR_LOGARITHMIC_REDUCTION_TOL DR_LOGARITHMIC_REDUCTION_MAXITER DR_ALGO DROP DSAMPLE DYNASAVE DYNATYPE CALIBRATION %token END ENDVAL EQUAL ESTIMATION ESTIMATED_PARAMS ESTIMATED_PARAMS_BOUNDS ESTIMATED_PARAMS_INIT EXTENDED_PATH %token FILENAME FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS LAST_OBS SET_TIME %token FLOAT_NUMBER @@ -939,6 +939,8 @@ stoch_simul_options : o_dr_algo | o_sylvester_fixed_point_tol | o_dr | o_dr_cycle_reduction_tol + | o_dr_logarithmic_reduction_tol + | o_dr_logarithmic_reduction_maxiter ; symbol_list : symbol_list symbol @@ -1508,6 +1510,8 @@ estimation_options : o_datafile | o_lyapunov_doubling_tol | o_dr | o_dr_cycle_reduction_tol + | o_dr_logarithmic_reduction_tol + | o_dr_logarithmic_reduction_maxiter | o_analytic_derivation ; @@ -2318,8 +2322,11 @@ o_lyapunov : LYAPUNOV EQUAL FIXED_POINT {driver.option_num("lyapunov_fp", "1"); o_lyapunov_fixed_point_tol : LYAPUNOV_FIXED_POINT_TOL EQUAL non_negative_number {driver.option_num("lyapunov_fixed_point_tol",$3);}; o_lyapunov_doubling_tol : LYAPUNOV_DOUBLING_TOL EQUAL non_negative_number {driver.option_num("lyapunov_doubling_tol",$3);}; o_dr : DR EQUAL CYCLE_REDUCTION {driver.option_num("dr_cycle_reduction", "1"); } - | DR EQUAL DEFAULT {driver.option_num("dr_cycle_reduction", "0"); }; + | DR EQUAL LOGARITHMIC_REDUCTION {driver.option_num("dr_logarithmic_reduction", "1"); } + | DR EQUAL DEFAULT {driver.option_num("dr_cycle_reduction", "0"); driver.option_num("dr_logarithmic_reduction", "0");}; o_dr_cycle_reduction_tol : DR_CYCLE_REDUCTION_TOL EQUAL non_negative_number {driver.option_num("dr_cycle_reduction_tol",$3);}; +o_dr_logarithmic_reduction_tol : DR_LOGARITHMIC_REDUCTION_TOL EQUAL non_negative_number {driver.option_num("dr_logarithmic_reduction_tol",$3);}; +o_dr_logarithmic_reduction_maxiter : DR_LOGARITHMIC_REDUCTION_MAXITER EQUAL INT_NUMBER {driver.option_num("dr_logarithmic_reduction_maxiter",$3);}; o_bvar_prior_tau : BVAR_PRIOR_TAU EQUAL signed_number { driver.option_num("bvar_prior_tau", $3); }; o_bvar_prior_decay : BVAR_PRIOR_DECAY EQUAL non_negative_number { driver.option_num("bvar_prior_decay", $3); }; diff --git a/preprocessor/DynareFlex.ll b/preprocessor/DynareFlex.ll index f77adc845..28d72ad0a 100644 --- a/preprocessor/DynareFlex.ll +++ b/preprocessor/DynareFlex.ll @@ -303,6 +303,7 @@ string eofbuff; doubling {return token::DOUBLING;} square_root_solver {return token::SQUARE_ROOT_SOLVER;} cycle_reduction {return token::CYCLE_REDUCTION;} +logarithmic_reduction {return token::LOGARITHMIC_REDUCTION;} default {return token::DEFAULT;} alpha { yylval->string_val = new string(yytext); @@ -514,6 +515,8 @@ string eofbuff; lyapunov_fixed_point_tol {return token::LYAPUNOV_FIXED_POINT_TOL;} lyapunov_doubling_tol {return token::LYAPUNOV_DOUBLING_TOL;} dr_cycle_reduction_tol {return token::DR_CYCLE_REDUCTION_TOL;} +dr_logarithmic_reduction_tol {return token::DR_LOGARITHMIC_REDUCTION_TOL;} +dr_logarithmic_reduction_maxiter {return token::DR_LOGARITHMIC_REDUCTION_MAXITER;} replic {return token::REPLIC;} ar {return token::AR;} nofunctions {return token::NOFUNCTIONS;}