%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dmitri Bogonos
% dmitri.bogonos@rwi-essen.de
% 05.08.2015
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Define variables, shocks and parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


var y c g p_k j i z_k z_y v_k v_y n_y a_k a_y h_k h_y x k l o_k o_y pi_k pi_y p_k_st p_k_et n_k j_y j_k i_s i_e lambda_y lambda_k p_k_bar chi Lambda;
varexo eps sigma varrho eps_st;
parameters mu_k_bar mu mu_k beta rho_lambda vartheta alpha delta theta gamma ksi_k ksi_y mu_w zeta u delta_der_u chi_k_bar chi_y_bar phi lambda_y_bar lambda_k_bar;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Give your parameters values
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
beta = 0.98;
%Lambda = 1;
delta = 0.015;
alpha = 0.35;
gamma = 1 - 0.17/alpha;
zeta = 1;
theta = 1.4; 
vartheta = 1.25;
%theta_bar = 0.8;
u = 0.9;
mu = 1.1;
mu_w = 1.2;
mu_k = 1.15;
mu_k_bar = (mu_k*theta)/(theta*gamma + 1 - gamma);
chi_y_bar = 0.0202;
chi_k_bar = 0.0304;
phi = 0.99;
rho_lambda = 0.9;
ksi_k = 1;
ksi_y = ksi_k*log((1 - phi)/chi_y_bar)/log((1 - phi)/chi_k_bar);
lambda_y_bar = 0.1;
lambda_k_bar = 0.1;
%rho = 0.9;
%eta = 0.9;
%nu = 0.9;
%rho_st = 0.85;
delta_der_u = (1/beta + delta - 1)/u;




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Define your model equations
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
model;
% Resource constraint
y/mu = c + g + i*(2*mu_k - 1)/mu_k + (z_k - a_k)*h_k + (z_y - a_y)*h_y; %1
% aggregate production function
y = x*((a_y)^(vartheta - 1))*((n_y)^(mu - 1))*((u*k(-1))^alpha)*(l^(1 - alpha)); %2
% capital accumulation
k = (1 - delta)*k(-1) + (mu_k_bar*i)/p_k; %3
% product amount
a_y(+1) = lambda_y*(z_y - a_y) + phi*a_y; %4
a_k(+1) = lambda_k*(z_k - a_k) + phi*a_k; %5
% stock of new technologies
z_y(+1) = (chi_y_bar*(chi^ksi_y) + phi)*z_y; %6
z_k(+1) = (chi_k_bar*(chi^ksi_k) + phi)*z_k; %7
% factor market equilibria
(1 - alpha)*y/l = mu*mu_w*(l^zeta)*c; %8
alpha*y/u = mu*delta_der_u*p_k*k(-1); %9
% new capital 
(p_k*j)/mu_k_bar = i; %10
(theta*i_e)/i_s = (1 - gamma)/gamma; %11
j = (mu_k_bar*i)/p_k; %12
% euler equation
p_k = beta*Lambda(+1)*((alpha*y(+1))/(mu*k) + (1 - delta)*p_k(+1)); %13
Lambda(+1) = c/c(+1); %14
% optimal adoption
1 = phi*beta*Lambda*(v_y(+1) - j_y(+1))*lambda_y*rho_lambda/h_y; %15
1 = phi*beta*Lambda*(v_k(+1) - j_k(+1))*lambda_k*rho_lambda/h_k; %16
v_y = pi_y + phi*beta*(Lambda*v_y(+1)); %17
v_k = pi_k + phi*beta*(Lambda*v_k(+1)); %18
pi_k = ((theta - 1)/theta)*(1 - gamma)*(i/(a_k*mu_k)); %19
pi_y = ((vartheta - 1)/vartheta)*y/(a_y*mu); %20
j_y = -h_y + phi*beta*(Lambda*(lambda_y*v_y(+1) + (1 - lambda_y)*j_y(+1))); %21
j_k = -h_k + phi*beta*(Lambda*(lambda_k*v_k(+1) + (1 - lambda_k)*j_k(+1))); %22
lambda_y = lambda_y_bar*((a_y*h_y/o_y)^(rho_lambda)); %23
lambda_k = lambda_k_bar*((a_k*h_k/o_k)^(rho_lambda)); %24
((mu - 1)/mu)*(y/n_y) = o_y; %25
((mu_k - 1)/mu_k)*(i/n_k) = o_k; %26
p_k = mu_k*(n_k^(1 - mu_k))*(p_k_st^gamma)*(p_k_et^(1 - gamma)); %27
p_k_et = theta*(a_k^(1-theta)); %28
p_k_bar = (theta^(1 - gamma))*(a_k^((gamma - 1)*(theta - 1)))*(p_k_st^gamma); %29
i = theta*i_e + i_s; %30
% stochastic processes
log(chi) = log(chi(-1)) + eps; %31
log(x) = log(x(-1)) + sigma; %32
log(g) = log(g(-1)) + varrho; %33
log(p_k_st) = log(p_k_st(-1)) + eps_st; %34




end;



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Set initial values for some variables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%steady_state_model;
initval;
Lambda = 1;
k = 1;
j = delta*k;
lambda_k = 0.05;
lambda_y = 0.05;
z_k = 10;
z_y = 10;
a_y = (lambda_y*z_y)/(1 - phi + lambda_y);
a_k = (lambda_k*z_k)/(1 - phi + lambda_k);
chi = (chi_y_bar/chi_k_bar)^(1/(ksi_k - ksi_y));
y = (phi*beta*Lambda*rho_lambda*lambda_k*u*delta_der_u*mu_k_bar*mu*a_k*theta*mu_k*(vartheta-1)*(lambda_k_bar^(1/rho_lambda)))/((1 - phi*beta*Lambda*(1 - lambda_k))*(mu-1)*(theta-1)*(1-gamma)*vartheta*alpha*delta*(lambda_k^(1/rho_lambda)));
i = alpha*y*delta*k/(u*mu*delta_der_u*k*mu_k_bar);
pi_y = (y*(vartheta - 1))/(vartheta*a_y*mu);
pi_k = ((theta-1)*(1-gamma)*i)/(a_k*mu_k*theta);
v_k = pi_k/(1 - phi*beta*Lambda);
v_y = pi_y/(1 - phi*beta*Lambda);
h_k = ((1 - phi*beta*Lambda)*phi*beta*Lambda*rho_lambda*lambda_k*v_k)/(1 - phi*beta*Lambda + phi*beta*Lambda*lambda_k*(1 - rho_lambda));
h_y = ((1 - phi*beta*Lambda)*phi*beta*Lambda*rho_lambda*lambda_y*v_y)/(1 - phi*beta*Lambda + phi*beta*Lambda*lambda_y*(1 - rho_lambda));
o_k = (h_k*a_k*(lambda_k_bar^(1/rho_lambda)))/(lambda_k^(1/rho_lambda));
o_y = (h_y*a_y*(lambda_y_bar^(1/rho_lambda)))/(lambda_y^(1/rho_lambda));
j_k = (-h_k + phi*beta*Lambda*lambda_k*v_k)/(1 - phi*beta*Lambda*(1 - lambda_k));
j_y = (-h_y + phi*beta*Lambda*lambda_y*v_y)/(1 - phi*beta*Lambda*(1 - lambda_y));
n_k = (i*(mu_k-1)*(lambda_k^(1/rho_lambda)))/(a_k*h_k*mu_k*(lambda_k_bar^(1/rho_lambda)));
n_y = (y*(mu-1)*(lambda_y^(1/rho_lambda)))/(a_y*h_y*mu*(lambda_y_bar^(1/rho_lambda)));
p_k_et = theta*((a_k)^(1 - theta));
p_k = alpha*y/(u*mu*delta_der_u*k);
p_k_st = (p_k*(n_k^(mu_k - 1))*(p_k_et^(gamma - 1))/mu_k)^(1/gamma);
i_s = gamma*i;
i_e = (i - i_s)/theta;
p_k_bar = (p_k_et^(1 - gamma))*(p_k_st^gamma);
l = ((1 - alpha)/((1/mu - 0.2 - ((i*(2*mu_k - 1)/mu_k + (z_k - a_k)*h_k + (z_y - a_y)*h_y)/(y)))*mu*mu_w))^(1/(zeta + 1));
c = ((1 - alpha)*y)/(mu*mu_w*(l^(zeta + 1)));
g = y/5;
x = y*(a_y^(1 - vartheta))*(n_y^(1 - mu))*((u*k)^(-alpha))*(l^(alpha - 1));





end;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculate the steady state, check for existence
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
resid;
steady(maxit = 5000);
model_diagnostics;
check(qz_zero_threshold = 1e-50);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Add shocks
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
shocks;
var eps = 0.07^2;
var sigma = 0;
var varrho = 0;
var eps_st = 0;
end;



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Start simulation
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
options_.debug=1;
stoch_simul(order=1,irf=20,periods = 200,nograph);



