1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
|
/*
The model in this file is used to test all combinations of algorithms with
block and bytecode options.
It is designed is such a way that it includes the 8 possible types of blocks:
– Solve {forward, backward, two boundaries} {simple, complete}
– Evaluate {forward, backward}
All the “Solve” blocks are also present in both linear and nonlinear forms
(since the codepaths are typically different depending on the linearity of
the block).
Note that there is no such thing as a nonlinear “Evaluate” block, since the
endogenous variables of the block always enter linearly (on the LHS).
*/
var y y_s R pie dq pie_s de A;
var eb sfc1 sfc2 sbc1 sbc2 sbc3 stbs sfs sbs;
var nsfc1 nsfc2 nsbc1 nsbc2 nsbc3 nstbs nsfs nsbs;
var nstbc_c nstbc_y nstbc_k nstbc_h;
varexo e_R e_q e_ys e_pies e_A;
varexo e_eb e_sfc1 e_sfc2 e_sbc e_stbs e_sbs e_sfs;
varexo e_nsfc1 e_nsfc2 e_nsbc e_nstbs e_nsbs e_nsfs;
varexo e_nstbc;
parameters psi1 psi2 psi3 rho_R tau alpha rr k rho_q rho_A rho_ys rho_pies;
parameters nstbc_beta nstbc_alpha nstbc_delta nstbc_theta nstbc_psi;
psi1 = 1.54;
psi2 = 0.25;
psi3 = 0.25;
rho_R = 0.5;
alpha = 0.3;
rr = 2.51;
k = 0.5;
tau = 0.5;
rho_q = 0.4;
rho_A = 0.2;
rho_ys = 0.9;
rho_pies = 0.7;
nstbc_alpha = 0.36;
nstbc_beta = 0.99;
nstbc_delta = 0.025;
nstbc_psi = 0;
nstbc_theta = 2.95;
@#if !block && !bytecode && !use_dll
model;
@#elseif block && !bytecode && !use_dll
model(block, cutoff=0);
@#elseif !block && bytecode
model(bytecode);
@#elseif block && bytecode
model(block, bytecode, cutoff=0);
@#elseif !block && use_dll
model(use_dll);
@#else
model(block, use_dll, cutoff=0);
@#endif
// Block of type “Solve two boundaries complete” (linear)
y = y(+1) - (tau +alpha*(2-alpha)*(1-tau))*(R-pie(+1))-alpha*(tau +alpha*(2-alpha)*(1-tau))*dq(+1) + alpha*(2-alpha)*((1-tau)/tau)*(y_s-y_s(+1))-A(+1);
pie = exp(-rr/400)*pie(+1)+alpha*exp(-rr/400)*dq(+1)-alpha*dq+(k/(tau+alpha*(2-alpha)*(1-tau)))*y+alpha*(2-alpha)*(1-tau)/(tau*(tau+alpha*(2-alpha)*(1-tau)))*y_s;
pie = de+(1-alpha)*dq+pie_s;
R = rho_R*R(-1)+(1-rho_R)*(psi1*pie+psi2*(y+alpha*(2-alpha)*((1-tau)/tau)*y_s)+psi3*de)+e_R;
// Block of type “Evaluate forward”
dq = rho_q*dq(-1)+e_q;
y_s = rho_ys*y_s(-1)+e_ys;
pie_s = rho_pies*pie_s(-1)+e_pies;
A = rho_A*A(-1)+e_A;
// Block of type “Solve forward complete” (linear)
sfc1 = 0.2*sfc2+0.5*sfc1(-1)+e_sfc1;
sfc2 = 0.1*sfc1+0.5*sfc2(-1)+e_sfc2;
// Block of type “Solve backward complete” (linear)
sbc1 = sbc1(1)-0.5*(sbc3-sbc2(1))+e_sbc;
sbc2 = 0.1*sbc1 + 0.9*sbc2(1);
sbc3 = 1.5*sbc2+0.5*sbc1;
// Block of type “Evaluate backward”, see #1727
eb = 0.9*eb(+1) + e_eb;
// Block of type “Solve two boundaries simple” (linear)
stbs - 0.8*stbs(-1) = 0.9*(stbs(+1)-0.8*stbs) + e_stbs;
// Block of type “Solve backward simple” (linear)
// NB: The LHS is deliberately not a single variable, otherwise is would be classified as “Evaluate backward”
sbs - 0.8*sbs(1) = e_sbs;
// Block of type “Solve forward simple” (linear)
// NB: The LHS is deliberately not a single variable, otherwise is would be classified as “Evaluate forward”
sfs - 0.8*sfs(-1) = e_sfs;
// Block of type “Solve forward complete” (nonlinear)
log(nsfc1) = 0.2*log(nsfc2)+0.5*log(nsfc1(-1))+e_nsfc1;
log(nsfc2) = 0.1*log(nsfc1)+0.5*log(nsfc2(-1))+e_nsfc2;
// Block of type “Solve backward complete” (nonlinear)
log(nsbc1) = log(nsbc1(1))-0.5*(log(nsbc3)-log(nsbc2(1)))+e_nsbc;
log(nsbc2) = 0.1*log(nsbc1) + 0.9*log(nsbc2(1));
log(nsbc3) = 1.5*log(nsbc2)+0.5*log(nsbc1);
// Block of type “Solve two boundaries simple” (nonlinear)
log(nstbs) - 0.8*log(nstbs(-1)) = 0.9*(log(nstbs(+1))-0.8*log(nstbs)) + e_nstbs;
// Block of type “Solve backward simple” (nonlinear)
log(nsbs) = 0.8*log(nsbs(1)) + e_nsbs;
// Block of type “Solve forward simple” (nonlinear)
log(nsfs) = 0.8*log(nsfs(-1)) + e_nsfs;
// Block of type “Solve two boundaries complete” (nonlinear)
// NB: This is a variation of example1.mod
nstbc_c*nstbc_theta*nstbc_h^(1+nstbc_psi)=(1-nstbc_alpha)*nstbc_y;
nstbc_k = nstbc_beta*(((exp(e_nstbc)*nstbc_c)/(exp(e_nstbc(+1))*nstbc_c(+1)))*(exp(e_nstbc(+1))*nstbc_alpha*nstbc_y(+1)+(1-nstbc_delta)*nstbc_k));
nstbc_y = (nstbc_k(-1)^nstbc_alpha)*(nstbc_h^(1-nstbc_alpha));
nstbc_k = exp(e_nstbc)*(nstbc_y-nstbc_c)+(1-nstbc_delta)*nstbc_k(-1);
end;
initval;
nsfc1=1;
nsfc2=1;
nsbc1=1;
nsbc2=1;
nsbc3=1;
nstbs=1;
nsfs=1;
nsbs=1;
nstbc_y = 1.1;
nstbc_c = 0.8;
nstbc_h = 0.3;
nstbc_k = 11.1;
end;
steady(solve_algo = @{solve_algo}, tolf = 1e-11);
@#if block
model_info;
@#endif
@#if bytecode
print_bytecode_static_model;
print_bytecode_dynamic_model;
@#endif
check;
shocks;
var e_R;
periods 3;
values 0.01;
var e_q;
periods 1;
values 0.5;
var e_eb;
periods 19;
values 1;
var e_sfc1;
periods 9;
values 0.2;
var e_sfc2;
periods 12;
values -0.4;
var e_sbc;
periods 17 18;
values 0.3 -0.1;
var e_stbs;
periods 15;
values -0.15;
var e_sbs;
periods 5;
values 0.2;
var e_sfs;
periods 7;
values -0.2;
var e_nsfc1;
periods 9;
values 0.2;
var e_nsfc2;
periods 12;
values -0.4;
var e_nsbc;
periods 17 18;
values 0.3 -0.1;
var e_nstbs;
periods 15;
values -0.15;
var e_nsbs;
periods 5;
values 0.2;
var e_nsfs;
periods 7;
values -0.2;
var e_nstbc;
periods 3;
values 0.009;
end;
perfect_foresight_setup(periods=20);
perfect_foresight_solver(no_homotopy, markowitz=0, stack_solve_algo = @{stack_solve_algo});
|