$title Ethanol CGE

sets inputs /cap,lab,egy,mat,land,agmat/
     outputs /agr,man,egy,eth/
     mkout(outputs) /agr,man,egy/;

alias(kinputs,inputs)
alias(koutputs,outputs);

scalar phi    Demand parameter /0.952914/
       ascale Demand scale /0.000163906/

parameters b(outputs)
     /agr 0.0782257,
      man 1.39557,
      egy 0.0335513/

parameter sprod(outputs)
     /agr 0.07216,
      man 1.49924,
      egy 0.70145,
      eth 0.50000/

parameters rhscons(inputs)
     /cap   125,
      lab   100,
      egy     0,
      land    1/

table aa(outputs,inputs)
          cap        lab        egy         mat        land        agmat
agr    0.230149   0.234483   0.0283736   0.541208    0.312047
man    0.295650   0.578655   0.0672622                           0.0271032
egy    0.414546   0.135291   0.2311580   0.232769
eth    0.200000   0.200000   0.0200000   0.440000                0.1400000

table aegy(outputs,koutputs,inputs)
           egy
agr.egy    1.0
man.egy    1.0
egy.egy    1.0

table amat(outputs,koutputs,inputs)
           mat
agr.man    1.0
egy.man    1.0

table aagr(outputs,koutputs,inputs)
           agmat
man.agr     1.0
egy.agr     1.0

table etout(mkout,outputs)
            eth
egy         1.0

variables
    x(outputs,inputs) Input demand levels
    yprod(outputs)    Production Levels
    ydemand(outputs)  Output demand
    w(inputs)         Input prices
    p(outputs)        Output prices
    income
    ssequal           Equalibrium;

equations
    close1             Income closure
    close2             Price normalization
    close3             Agricultural price closure
    close4             Energy price closure
    close5             Material price closure
    close6             Ethanol price closure
    xd(outputs,inputs) Input demand equations
    outputmkt(outputs) Output markets
    normp              Normalized prices
    sse                Equilibrium;

close1..     sum(inputs,sum(outputs,x(outputs,inputs))*w(inputs)) =e= income;

close2..     sum(inputs,w(inputs))+sum(mkout,p(mkout)) =e= 1.0;

close3..     w("agmat") =e= p("agr");

close4..     w("egy") =e= p("egy");

close5..     w("mat") =e= p("man");

close6..     p("eth") =e= 1.07*0.86*p("egy");

xd(outputs,inputs).. yprod(outputs)*aa(outputs,inputs)/
             ((w(inputs)**sprod(outputs))*
             sum(kinputs,aa(outputs,kinputs)*(w(kinputs)**(1-sprod(outputs))))
                   **(sprod(outputs)/(sprod(outputs)-1)))
                                          =e= x(outputs,inputs);

outputmkt(mkout).. ydemand(mkout) =e=
       - 0.8333*sum(outputs,yprod(outputs)*etout(mkout,outputs)) +
       sum((koutputs,inputs),aegy(koutputs,mkout,inputs)*x(koutputs,inputs)) +
       sum((koutputs,inputs),amat(koutputs,mkout,inputs)*x(koutputs,inputs)) +
       sum((koutputs,inputs),aagr(koutputs,mkout,inputs)*x(koutputs,inputs))
          + ascale*income/(b(mkout)*p(mkout)**phi*
             (sum(koutputs,b(koutputs)*p(koutputs)**(1-phi)))**(phi/(phi-1)));

normp..      sum(outputs,ydemand(outputs)*p(outputs))-
               sum(inputs,sum(outputs,x(outputs,inputs))*w(inputs))=e= 0;

sse..  sum(inputs,(sum(outputs,x(outputs,inputs))-rhscons(inputs))*
                  (sum(outputs,x(outputs,inputs))-rhscons(inputs)))+
       sum(outputs,(ydemand(outputs)-yprod(outputs))*
                              (ydemand(outputs)-yprod(outputs))) =e= ssequal;



x.lo(outputs,inputs) = 0;
w.lo(inputs) = 0.00001;
w.l(inputs) = 0.05;
p.lo(outputs) = 0.00001;
p.l(outputs) = 0.05;
ydemand.lo(mkout) = 0.00001;
ydemand.l(mkout) = 0.05;
yprod.lo(outputs) = 0.00001;
yprod.l(outputs) = 0.05;

display ydemand.l;

model ethcge /all/;
solve ethcge using nlp minimizing ssequal;