Fix extended_path with bytecode

By the way, document and enforce the fact that stochastic extended_path (i.e.
order > 0) is not compatible with either bytecode or block.

Closes: #1742
time-shift
Sébastien Villemot 2020-10-14 17:24:29 +02:00
parent 43311a230f
commit 71e3e0d49e
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
4 changed files with 110 additions and 37 deletions

View File

@ -4240,7 +4240,9 @@ which is described below.
the endogenous variables are generated by assuming that the the endogenous variables are generated by assuming that the
agents believe that there will no more shocks after period agents believe that there will no more shocks after period
:math:`t+S`. This is an experimental feature and can be quite :math:`t+S`. This is an experimental feature and can be quite
slow. Default: ``0``. slow. A non-zero value is not compatible with either the
``bytecode`` or the ``block`` option of the ``model`` block.
Default: ``0``.
.. option:: hybrid .. option:: hybrid

View File

@ -40,46 +40,39 @@ if debug
save ep_test_1.mat endo_simul exo_simul save ep_test_1.mat endo_simul exo_simul
end end
if bytecode_flag && ~ep.stochastic.order if bytecode_flag && order > 0
try error('Option order > 0 of extended_path command is not compatible with bytecode option.')
tmp = bytecode('dynamic', endo_simul, exo_simul, M.params, endo_simul, periods); end
flag = false; if options.block && order > 0
catch ME error('Option order > 0 of extended_path command is not compatible with block option.')
disp(ME.message);
flag = true;
end
else
flag = true;
end end
if flag if order == 0
if order == 0 options.periods = periods;
options.periods = periods; options.block = pfm.block;
options.block = pfm.block; oo.endo_simul = endo_simul;
oo.endo_simul = endo_simul; oo.exo_simul = exo_simul;
oo.exo_simul = exo_simul; oo.steady_state = steady_state;
oo.steady_state = steady_state; options.bytecode = bytecode_flag;
options.bytecode = bytecode_flag; options.lmmcp = olmmcp;
options.lmmcp = olmmcp; options.solve_algo = solve_algo;
options.solve_algo = solve_algo; options.stack_solve_algo = stack_solve_algo;
options.stack_solve_algo = stack_solve_algo; tmp = perfect_foresight_solver_core(M, options, oo);
tmp = perfect_foresight_solver_core(M, options, oo); if ~tmp.deterministic_simulation.status
if ~tmp.deterministic_simulation.status info_convergence = false;
info_convergence = false;
else
info_convergence = true;
end
else else
switch(algo) info_convergence = true;
case 0
[flag, tmp.endo_simul] = ...
solve_stochastic_perfect_foresight_model(endo_simul, exo_simul, pfm, ep.stochastic.quadrature.nodes, ep.stochastic.order);
case 1
[flag, tmp.endo_simul] = ...
solve_stochastic_perfect_foresight_model_1(endo_simul, exo_simul, options, pfm, ep.stochastic.order);
end
info_convergence = ~flag;
end end
else
switch(algo)
case 0
[flag, tmp.endo_simul] = ...
solve_stochastic_perfect_foresight_model(endo_simul, exo_simul, pfm, ep.stochastic.quadrature.nodes, ep.stochastic.order);
case 1
[flag, tmp.endo_simul] = ...
solve_stochastic_perfect_foresight_model_1(endo_simul, exo_simul, options, pfm, ep.stochastic.order);
end
info_convergence = ~flag;
end end
if ~info_convergence && ~options.no_homotopy if ~info_convergence && ~options.no_homotopy

View File

@ -289,6 +289,7 @@ MODFILES = \
ep/rbcii.mod \ ep/rbcii.mod \
ep/linearmodel0.mod \ ep/linearmodel0.mod \
ep/linearmodel1.mod \ ep/linearmodel1.mod \
ep/rbc_bytecode.mod \
stochastic_simulations/example1_noprint.mod \ stochastic_simulations/example1_noprint.mod \
stochastic-backward-models/solow_cd.mod \ stochastic-backward-models/solow_cd.mod \
stochastic-backward-models/solow_ces.mod \ stochastic-backward-models/solow_ces.mod \

77
tests/ep/rbc_bytecode.mod Normal file
View File

@ -0,0 +1,77 @@
// Test extended_path + bytecode (regression check for #1742)
var Capital, Output, Labour, Consumption, Efficiency, efficiency, ExpectedTerm;
varexo EfficiencyInnovation;
parameters beta, theta, tau, alpha, psi, delta, rho, effstar, sigma;
/*
** Calibration
*/
beta = 0.990;
theta = 0.357;
tau = 30.000;
alpha = 0.450;
psi = -5.000;
delta = 0.020;
rho = 0.950;
effstar = 1.000;
sigma = 0.010;
model(bytecode);
// Eq. n°1:
efficiency = rho*efficiency(-1) + sigma*EfficiencyInnovation;
// Eq. n°2:
Efficiency = effstar*exp(efficiency-.5*sigma*sigma/(1-rho*rho));
// Eq. n°3:
Output = Efficiency*(alpha*(Capital(-1)^psi)+(1-alpha)*(Labour^psi))^(1/psi);
// Eq. n°4:
Consumption + Capital - Output - (1-delta)*Capital(-1);
// Eq. n°5:
((1-theta)/theta)*(Consumption/(1-Labour)) - (1-alpha)*(Output/Labour)^(1-psi);
// Eq. n°6:
(((Consumption^theta)*((1-Labour)^(1-theta)))^(1-tau))/Consumption - ExpectedTerm(1);
// Eq. n°7:
ExpectedTerm = beta*((((Consumption^theta)*((1-Labour)^(1-theta)))^(1-tau))/Consumption)*(alpha*((Output/Capital(-1))^(1-psi))+1-delta);
end;
steady_state_model;
efficiency = 0;
Efficiency = effstar;
// Compute steady state ratios.
Output_per_unit_of_Capital=((1/beta-1+delta)/alpha)^(1/(1-psi));
Consumption_per_unit_of_Capital=Output_per_unit_of_Capital-delta;
Labour_per_unit_of_Capital=(((Output_per_unit_of_Capital/Efficiency)^psi-alpha)/(1-alpha))^(1/psi);
Output_per_unit_of_Labour=Output_per_unit_of_Capital/Labour_per_unit_of_Capital;
Consumption_per_unit_of_Labour=Consumption_per_unit_of_Capital/Labour_per_unit_of_Capital;
// Compute steady state share of capital.
ShareOfCapital=alpha/(alpha+(1-alpha)*Labour_per_unit_of_Capital^psi);
/// Compute steady state of the endogenous variables.
Labour=1/(1+Consumption_per_unit_of_Labour/((1-alpha)*theta/(1-theta)*Output_per_unit_of_Labour^(1-psi)));
Consumption = Consumption_per_unit_of_Labour*Labour;
Capital = Labour/Labour_per_unit_of_Capital;
Output = Output_per_unit_of_Capital*Capital;
ExpectedTerm = beta*((((Consumption^theta)*((1-Labour)^(1-theta)))^(1-tau))/Consumption)*(alpha*((Output/Capital)^(1-psi))+1-delta);
end;
shocks;
var EfficiencyInnovation = 1;
end;
steady(nocheck);
extended_path(periods=10, order=0);