// Ramsey problem for Laffer curve
// Mattia Ricci
// Glasgow University, February 2015

// Dynare version 4.4.3

//----------------------------------------------------------------
// 0. Housekeeping
//----------------------------------------------------------------
close all;
warning off;

//----------------------------------------------------------------
// 1. Defining variables
//----------------------------------------------------------------

// 1.1 Endogenous variables of the model
var

c                       // Consumption 
k                       // Capital
l                       // Labour
m                       // Capital capacity utilization


xi1                    
xi2
xi3

k_ratio
;

// 1.2 Exogenous variables of the model
varexo

Wbar
;


//----------------------------------------------------------------
// 2. Parameters of the model
//----------------------------------------------------------------

parameters

beta      $\beta$       // Discount rate
chi0      $\chi_0$      // depreciation funct. parameter 
chi1      $\chi_1$      // depreciation funct. parameter 
alpha     $\alpha$      // Elasticity of output with respect to private capital
gamma     $\gamma$      // Exogenous rate of labour augmenting technical process
sigma     $\sigma$      // Risk adversion coefficient
a                        // Leisure preference
eta       $\eta$         // Coefficient of capital adjustment cost
deltabar  $\bar{\delta}$ // Capital devaluation
z                        // Steady state ratio i/k 
g                        // PO/initial/final level of consumption  


//INITIAL CONDITIONS:
c0                      // initial consumption                    
l0                      // initial labour
W0                      // initial Welfare  
k0                      // initial capital        
xi10                    // initial lambda1    
xi20                    // initial lambda2       
xi30                    // initial lambda3    

//TERMINAL CONDITIONS:
css                     // terminal consumption 
lss                     // terminal labour
Wss                     // terminal Welfare
kss                     // terminal capital     
xi1ss                   // terminal lambda1    
xi2ss                   // terminal lambda2    
xi3ss                   // terminal lambda3   


k_ratioss                    
;


//----------------------------------------------------------------
// 3. Calibration of parameters
//----------------------------------------------------------------

// we borrow from Mendoza, see table 2 pag. 41 of "Saving Europe..."

beta=0.9942;  
alpha=0.61;     
gamma=0.0022;    
sigma=2;     
a=2.675;                 
eta=2;
deltabar=0.0164;     
z=gamma+deltabar; //Set it so as adjustment cost are zero in SS
chi1=(1+gamma-beta)/beta*(1/deltabar)+1; //Set it so as deltabar= calibration target.
chi0=(1+gamma-beta)/beta*chi1/(chi1-1); //Set it so as m=1 in SS.
g=0.3901;

//SETTING THE EXERCISE:

W0=-569.9679;               //initial Welfare
//Wss=-580;              //terminal Welfare
Wss=-580;              //terminal Welfare


k_ratioss=(1/(1-alpha)*((1+gamma)/beta-(1-deltabar)))^(-1/alpha); 

//Initial conditions:

[Endo0,fval] =fsolve(@RamseyInitial,0.5*ones(1,7),[],W0,beta,chi0,chi1,sigma,eta,z,alpha,gamma,a,g);

xi10=Endo0(1);                       
xi20=Endo0(2);                          
xi30=Endo0(3);                     
c0=Endo0(4);
l0=Endo0(5);
k0=Endo0(6);
m0=Endo0(7);

//Terminal conditions

[Endoss,fval] = fsolve(@RamseySS,0.5*ones(1,7),[],Wss,c0,l0,beta,chi0,chi1,sigma,eta,z,alpha,gamma,a,g);

xi1ss=Endoss(1);                       
xi2ss=Endoss(2);                          
xi3ss=Endoss(3);                     
css=Endoss(4);
lss=Endoss(5);
kss=Endoss(6);
mss=Endoss(7);



//----------------------------------------------------------------
// 4. Model
//----------------------------------------------------------------
model;


#Transf_lead=exp(-m(+1))/(1+exp(-m(+1)));
#Transf_lag=exp(-m(-1))/(1+exp(-m(-1)));
#Transf=exp(-m)/(1+exp(-m));



(xi3*(1 - l)^a)/((c*(1 - l)^a)^sigma*(beta - 1)) - xi1 + (c0^sigma*sigma*(1 - l0)^(a*(sigma - 1))*(l^alpha*(k(-1)*Transf)^(1 - alpha) - chi0*k(-1)*Transf^chi1 + (a*c*l)/(l - 1) + chi0*eta*k(-1)*Transf*Transf^(chi1 - 1)*(z - (k*(gamma + 1) + k(-1)*((chi0*Transf^chi1)/chi1 - 1))/k(-1))))/(c^(sigma + 1)*(1 - l)^(a*(sigma - 1))) - (a*c0^sigma*l*(1 - l0)^(a*(sigma - 1)))/(c^sigma*(1 - l)^(a*(sigma - 1))*(l - 1)) - (c(+1)^sigma*sigma*xi2*(1 - l(+1))^(a*(sigma - 1))*(gamma - eta*(gamma + 1)*(z - (k*(gamma + 1) + k(-1)*((chi0*Transf^chi1)/chi1 - 1))/k(-1)) + 1))/(beta*c^(sigma + 1)*(1 - l)^(a*(sigma - 1))) + (c^(sigma - 1)*sigma*xi2(-1)*(1 - l)^(a*(sigma - 1))*(gamma - eta*(gamma + 1)*(z - (k(-1)*(gamma + 1) + k(-1)*((chi0*Transf_lag^chi1)/chi1 - 1))/k(-1)) + 1))/(beta^2*c(-1)^sigma*(1 - l(-1))^(a*(sigma - 1)))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        =0;
 alpha*l^(alpha - 1)*xi1*(k(-1)*Transf)^(1 - alpha) - (c0^sigma*(1 - l0)^(a*(sigma - 1))*(alpha*l^(alpha - 1)*(k(-1)*Transf)^(1 - alpha) + (a*c)/(l - 1) - (a*c*l)/(l - 1)^2))/(c^sigma*(1 - l)^(a*(sigma - 1))) - (a*c*xi3*(1 - l)^(a - 1))/((c*(1 - l)^a)^sigma*(beta - 1)) - (a*c0^sigma*(1 - l0)^(a*(sigma - 1))*(sigma - 1)*(l^alpha*(k(-1)*Transf)^(1 - alpha) - chi0*k(-1)*Transf^chi1 + (a*c*l)/(l - 1) + chi0*eta*k(-1)*Transf*Transf^(chi1 - 1)*(z - (k*(gamma + 1) + k(-1)*((chi0*Transf^chi1)/chi1 - 1))/k(-1))))/(c^sigma*(1 - l)^(a*(sigma - 1) + 1)) + (a*c(+1)^sigma*xi2*(1 - l(+1))^(a*(sigma - 1))*(sigma - 1)*(gamma - eta*(gamma + 1)*(z - (k*(gamma + 1) + k(-1)*((chi0*Transf^chi1)/chi1 - 1))/k(-1)) + 1))/(beta*c^sigma*(1 - l)^(a*(sigma - 1) + 1)) - (a*c^sigma*xi2(-1)*(1 - l)^(a*(sigma - 1) - 1)*(sigma - 1)*(gamma - eta*(gamma + 1)*(z - (k(-1)*(gamma + 1) + k(-1)*((chi0*Transf_lag^chi1)/chi1 - 1))/k(-1)) + 1))/(beta^2*c(-1)^sigma*(1 - l(-1))^(a*(sigma - 1)))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             =0;
 xi2*(eta*k*(((chi0*Transf_lead^chi1)/chi1 - 1)/k - (k(+1)*(gamma + 1) + k*((chi0*Transf_lead^chi1)/chi1 - 1))/k^2)^2 - 2*eta*(((chi0*Transf_lead^chi1)/chi1 - 1)/k - (k(+1)*(gamma + 1) + k*((chi0*Transf_lead^chi1)/chi1 - 1))/k^2)*(z - (k(+1)*(gamma + 1) + k*((chi0*Transf_lead^chi1)/chi1 - 1))/k) + eta*k*((2*((chi0*Transf_lead^chi1)/chi1 - 1))/k^2 - (2*(k(+1)*(gamma + 1) + k*((chi0*Transf_lead^chi1)/chi1 - 1)))/k^3)*(z - (k(+1)*(gamma + 1) + k*((chi0*Transf_lead^chi1)/chi1 - 1))/k) - chi0*eta*Transf_lead*Transf_lead^(chi1 - 1)*(((chi0*Transf_lead^chi1)/chi1 - 1)/k - (k(+1)*(gamma + 1) + k*((chi0*Transf_lead^chi1)/chi1 - 1))/k^2) + (c(+1)^sigma*eta*(gamma + 1)^2*(1 - l(+1))^(a*(sigma - 1)))/(beta*c^sigma*k(-1)*(1 - l)^(a*(sigma - 1)))) + beta*(xi1(+1)*((l(+1)^alpha*Transf_lead)/(k*Transf_lead)^alpha - eta*z - (eta*z^2)/2 - eta/2 + (eta*k(+1)^2)/(2*k^2) - (chi0*Transf_lead^chi1)/chi1 + (chi0*eta*Transf_lead^chi1)/chi1 + (eta*gamma^2*k(+1)^2)/(2*k^2) - (alpha*l(+1)^alpha*Transf_lead)/(k*Transf_lead)^alpha + (eta*gamma*k(+1)^2)/k^2 - (chi0^2*eta*Transf_lead^(2*chi1))/(2*chi1^2) + (chi0*eta*Transf_lead^chi1*z)/chi1 + 1) + (c0^sigma*(1 - l0)^(a*(sigma - 1))*(chi0*Transf_lead^chi1 - (l(+1)^alpha*Transf_lead)/(k*Transf_lead)^alpha - chi0*eta*Transf_lead^chi1 + (alpha*l(+1)^alpha*Transf_lead)/(k*Transf_lead)^alpha - chi0*eta*Transf_lead^chi1*z + (chi0^2*eta*Transf_lead^(2*chi1))/chi1))/(c(+1)^sigma*(1 - l(+1))^(a*(sigma - 1))) - (eta*k(+1)*xi2(+1)*(gamma + 1)^2)/(beta*k^2)) - xi1*(gamma - eta*(gamma + 1)*(z - (k*(gamma + 1) + k(-1)*((chi0*Transf^chi1)/chi1 - 1))/k(-1)) + 1) - (eta*xi2(-1)*(gamma + 1)*(k + gamma*k + chi0*k(-1)*Transf^chi1))/(beta*k(-1)^2) + (c0^sigma*chi0*eta*Transf*Transf^(chi1 - 1)*(gamma + 1)*(1 - l0)^(a*(sigma - 1)))/(c^sigma*(1 - l)^(a*(sigma - 1))) =0;
 (c0^sigma*(1 - l0)^(a*(sigma - 1))*((k(-1)*l^alpha*(alpha - 1))/(k(-1)*Transf)^alpha + chi0*chi1*k(-1)*Transf^(chi1 - 1) + chi0^2*eta*k(-1)*Transf*Transf^(2*chi1 - 2) - chi0*eta*k(-1)*Transf^(chi1 - 1)*(z - (k*(gamma + 1) + k(-1)*((chi0*Transf^chi1)/chi1 - 1))/k(-1)) - chi0*eta*k(-1)*Transf*Transf^(chi1 - 2)*(chi1 - 1)*(z - (k*(gamma + 1) + k(-1)*((chi0*Transf^chi1)/chi1 - 1))/k(-1))))/(c^sigma*(1 - l)^(a*(sigma - 1))) - xi1*(chi0*k(-1)*Transf^(chi1 - 1) + (k(-1)*l^alpha*(alpha - 1))/(k(-1)*Transf)^alpha - chi0*eta*k(-1)*Transf^(chi1 - 1)*(z - (k*(gamma + 1) + k(-1)*((chi0*Transf^chi1)/chi1 - 1))/k(-1))) - (chi0*Transf^chi1*xi2(-1)*(chi1^2*k(-1) - chi1*k(-1) + chi1*eta*k(-1) + chi1^2*eta*k - chi1^2*eta*k(-1) + chi1*eta*k(-1)*z + chi1^2*eta*gamma*k - chi1^2*eta*k(-1)*z - chi0*eta*k(-1)*Transf^chi1 + 2*chi0*chi1*eta*k(-1)*Transf^chi1))/(beta*chi1*k(-1)*Transf) + (chi0*c(+1)^sigma*eta*Transf^(chi1 - 1)*xi2*(gamma + 1)*(1 - l(+1))^(a*(sigma - 1)))/(beta*c^sigma*(1 - l)^(a*(sigma - 1)))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        =0;
 l^alpha*(k(-1)*Transf)^(1 - alpha) - g - c - k*(gamma + 1) - k(-1)*((chi0*Transf^chi1)/chi1 - 1) - (eta*k(-1)*(z - (k*(gamma + 1) + k(-1)*((chi0*Transf^chi1)/chi1 - 1))/k(-1))^2)/2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             =0;
 (eta*(z - (k(+1)*(gamma + 1) + k*((chi0*Transf_lead^chi1)/chi1 - 1))/k)^2)/2 - chi0*Transf_lead^chi1 + (chi0*Transf_lead^chi1)/chi1 - eta*k*(((chi0*Transf_lead^chi1)/chi1 - 1)/k - (k(+1)*(gamma + 1) + k*((chi0*Transf_lead^chi1)/chi1 - 1))/k^2)*(z - (k(+1)*(gamma + 1) + k*((chi0*Transf_lead^chi1)/chi1 - 1))/k) + chi0*eta*Transf_lead*Transf_lead^(chi1 - 1)*(z - (k(+1)*(gamma + 1) + k*((chi0*Transf_lead^chi1)/chi1 - 1))/k) + (c(+1)^sigma*(1 - l(+1))^(a*(sigma - 1))*(gamma - eta*(gamma + 1)*(z - (k*(gamma + 1) + k(-1)*((chi0*Transf^chi1)/chi1 - 1))/k(-1)) + 1))/(beta*c^sigma*(1 - l)^(a*(sigma - 1))) - 1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               =0;
 Wbar - (c*(1 - l)^a)^(1 - sigma)/((beta - 1)*(sigma - 1))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        =0;
 k_ratio=k(-1)/l;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

end;


write_latex_dynamic_model;
write_latex_static_model;

model_info;

//----------------------------------------------------------------
// 5. Initial conditions
//----------------------------------------------------------------

initval;
c        = c0;
l        = l0;
k        = k0;
m        = log(1/m0-1);
Wbar     = W0;
xi1      =  xi10; 
xi2      =  xi20;
xi3      =  xi30;
k_ratio= k_ratioss;

end;

endval;
c        = css;
l        = lss;
k        = kss;
m        = log(1/mss-1);
Wbar     = Wss;
xi1      = xi1ss;
xi2      = xi2ss;
xi3      = xi3ss;
k_ratio= k_ratioss;

end;

//----------------------------------------------------------------
// 6. Deterministic Simulation
//----------------------------------------------------------------


shocks;
var Wbar;
periods 1:1;
values (Wss);
end;


steady(solve_algo=3);
model_diagnostics;
check;
resid;

simul(periods=10, maxit=2000);




