% -----------------------------------
%  A Financial accelerator model
%
%       with ZLB?
% ------ Non Linear Version -----
% -----------------------------------


var     lambda, c, R, pip, rreal, lh, w, piw, y, l, k, s, we, z, Q1, Q2, Pstar, il,
        Q1w, Q2w, Wstar, lomegatilde, clag,
        Fome, Fnome, omegatilde, SIG, muG, ffome, deltau, deltauu, adji, adjii, 
        nw, i, ktilde, b, xx, q, rk, rr, LAM, v, ce, SIGp, muGp,
        gammat, pref, em, techno, chil, g, sigome, a;

varexo      eps_gamma ; 
//varexo_det  eps_em;

parameters  bc sigmac betaa alpha Omega alphap tetap mup gammap muW mu varrho rhoi ap ay eps_tax delta d kapai sigmal sigmaWbar
        eps_taxw muww alphaw tetaw gammaw Q1wbar Q2wbar Wstarbar lomebar muGpbar pi SEome
        lambdabar cbar Rbar pipbar rrealbar lhbar wbar piwbar ybar lbar kbar sbar webar zbar Q1bar Q2bar Pstarbar Fomebar abar rhoA sigmaA
        Fnomebar omebar SIGbar muGbar SIGpbar ffomebar deltaubar deltauubar adjibar  adjiibar nwbar ibar ubar gbar chilbar rhoChil rhoG
        ktildebar bbar xxbar qbar rkbar rrbar LAMbar vbar cebar  gammabar deltatild rhoGamma rhoPref rhoEm rhoTechno prefbar embar technobar
        sigmaGamma sigmaPref sigmaTechno sigmaEm sigmaChil sigmaG sigmaSIG rhoSIG;


load_params_and_steady_state(ParamMatrix);


model;


    // ---- Household's Preferences
    lambda     = pref*(c-bc*c(-1))^(-1/sigmac) - betaa*bc*pref(1)*(c(1)-bc*c)^(-1/sigmac);
    (1/R)      = betaa*(lambda(1)/lambda)*(1/(pip(1)));
    rreal      = R/pip(1);
    clag       = c(-1);

    // ---- Wage Setting
    //chil*lh^(sigmal) = lambda*w;
    piw                = (w*pip)/w(-1);
    Q1w                = chilbar*lh^(sigmal) + alphaw*betaa*Q1w(1);
    Q2w                = (1+eps_taxw)*lambda + alphaw*betaa*Q2w(1);
    Wstar              = muww*(Q1w/Q2w);
    //Q1w                = 0;
    //Q2w                = 0;
    //Wstar              = 0;
    1                  = (1-alphaw)*(Wstar/w)^(1-tetaw) + alphaw*(pip(-1)^(gammaw*(1-tetaw)))*(piw^(tetaw-1));

    // ---- Production Sector
    y          = techno*((l)^(1-alpha))*(k^(alpha));
    l          = lh^(Omega);
    w          = s*Omega*(1-alpha)*(y/lh);
    we         = s*(1-Omega)*(1-alpha)*y;
    z          = s*alpha*(y/k);

    // ---- Price Setting
    Q1         = y*s + alphap*betaa*Q1(1);
    Q2         = (1+eps_tax)*y + alphap*betaa*Q2(1);
    Pstar      = mup*Q1/Q2;
    1          = (1-alphap)*Pstar^(1-tetap) + alphap*(pip(-1)^(gammap*(1-tetap)))*(pip^(tetap-1));

    // ---- Financial Accelerator: Definitions
    lomegatilde = log(omegatilde);
    Fome        = normcdf(lomegatilde,muW,sigmaWbar);
    ffome       = exp(-0.5 * ((log(omegatilde) - muW)/sigmaWbar)^2) / (omegatilde * sqrt(2*3.14) * sigmaWbar);
    Fnome       = 1 - exp(muW+sigome*sigome/2)*normcdf(((muW - lomegatilde)/sigome)+sigome,0,1);
    SIG         = omegatilde*(1-Fome) + Fnome;
    muG         = mu*Fnome;
    SIGp        = 1 - Fome;
    muGp        = mu*omegatilde*ffome;
    il          = i(-1);
    deltau      = delta;
    deltauu     = 0;
    adji        = (kapai/2)*(i/i(-1) - 1)^2;
    adjii       = (kapai)*(i/i(-1))*(i/i(-1) - 1);
    b           = q(-1)*ktilde(-1) - nw(-1);
    xx          = q(-1)*ktilde(-1)/nw(-1);
    rr          = rk(1)/rreal;

    // ---- Financial Accelerator Contract
    LAM(1)     = (rk(1)/rreal)*(1 - SIG(1) + LAM(1)*(SIG(1) - muG(1)));
    SIGp       = LAM*(SIGp - muGp);
    a*(xx - 1) = (rk/rreal(-1))*xx*(SIG - muG);

    // ---- Financial Intermediate Sector
    rk         = (z + (1-deltau)*q)/q(-1);
    nw         = gammat*v + we;
    v          = rk*q(-1)*ktilde(-1) - rreal(-1)*q(-1)*ktilde(-1) + rreal(-1)*nw(-1) - muG*rk*q(-1)*ktilde(-1);
    ce         = (1-gammat)*varrho*v;

    // ---- Capital Producer Sector
    ktilde     = (1-deltau)*ktilde(-1) + (1-adji)*i;
    1/q        = 1 - adji - adjii + betaa*(q(1)/q)*(lambda(1)/lambda)*pip(1)*adjii(1)*(i(1)/i);
    k          = ktilde(-1);

    // ---- Resource Constraint & Monetary Policy
    y          = c + i + g + ce + muG*rk*q(-1)*ktilde(-1);
    //(R)/(R) = ((((R(-1))/(Rbar))^(rhoi))*((pip/pipbar)^((1-rhoi)*ap))*((y/ybar)^((1-rhoi)*ay)))+ (1-eps_em)*1;

    //(R)/(R) = ((((R(-1))/(Rbar))^(rhoi))*((pip/pipbar)^((1-rhoi)*ap))*((y/ybar)^((1-rhoi)*ay))) ;


    // ---- Shocks    
    (gammat/gammabar) - ((gammat(-1)/gammabar)^rhoGamma)*exp((sigmaGamma)*eps_gamma);
    pref = prefbar;
    techno = technobar;
    chil = chilbar;
    g = gbar;
    sigome = sigmaWbar;
    a = abar;
    em = embar;


end;


initval; 
lambda      = lambdabar;
c           = cbar;
clag        = cbar;
R           = Rbar;
pip         = pipbar;
rreal       = rrealbar;
lh          = lhbar;
w           = wbar;
piw         = piwbar;
y           = ybar;
l           = lbar;
k           = kbar;
s           = sbar;
we          = webar;
z           = zbar;
Q1          = Q1bar;
Q2          = Q2bar;
Pstar       = Pstarbar;
Q1w         = Q1wbar;
Q2w         = Q2wbar;
Wstar       = Wstarbar;
Fome        = Fomebar;
Fnome       = Fnomebar;
omegatilde	= omebar;
lomegatilde	= lomebar;
SIG         = SIGbar;
SIGp        = SIGpbar;
muG         = muGbar;
muGp        = muGpbar;
ffome       = ffomebar;
deltau      = deltaubar;
deltauu     = deltauubar;
adji        = adjibar;
adjii       = adjiibar;
nw          = nwbar;
i           = ibar;
il          = ibar;
ktilde      = ktildebar;
b           = bbar;
xx          = xxbar;
q           = qbar;
rk          = rkbar;
rr          = rrbar;
LAM         = LAMbar;
v           = vbar;
ce          = cebar;
gammat      = gammabar;
pref        = prefbar;
em          = embar;
techno      = technobar;
chil        = chilbar;
g           = gbar;
sigome      = sigmaWbar;
a           = abar;
//eps_em      = 1;


end;



shocks;
    var eps_gamma=1; 
       //stderr 0.01;
    //var eps_em; 
    //periods 0:10 11:21;
    //values 1 0;

    //var eps_pref   = 0;
    //var eps_em     = 1;
    //var eps_techno = 0;
    //var eps_chil   = 0;
    //var eps_gv      = 0;
    //var eps_SIG     = 0;
    //var eps_av      = 0;

end;




//resid(1);
//steady(solve_algo=2);
//resid(1);
//check;

//planner_objective((sigmac/(sigmac-1))*(c-bc*clag)^((sigmac-1)/sigmac) - (1/(1+sigmal))*lh^(1+sigmal));

planner_objective(ln(c-bc*clag) - (1/(1+sigmal))*lh^(1+sigmal));
ramsey_policy(planner_discount=1,order=1,irf=30) y R c pip;

//options_.pruning = 1;
//stoch_simul(order=1,irf=30) y R c pip;     

//stoch_simul(dr_algo=0,ar=0,nocorr, order=1, irf=0, drop=0);
//forecast(periods=310) R pip;

//conditional_forecast_paths;
//var y;
//periods 1;
//values 1;
//end;
//conditional_forecast(parameter_set = ParamMatrix, controlled_varexo=(eps_gamma), replic=3000);


