$title	Define the model:
display "com: Define the model:";
parameter
    ictax(r)		Implicit carbon tax (inflated by p_u)
    inc_pc		Per capita real income (thousand dollar)
    a_hat		Least square estimate of intercept
    b_hat		Least square estimate of coefficient
    proj_inctax		Projected implicit carbon tax
    resi		Residual
    pop_		Population (mil)
    av_ictax		Average of ictax
    av_inc		Average of real income per capita (thousand dollar)
    n_o_r		The number of regions
    const_tax(r)	Real carbon tax
;
n_o_r = card(r);
display n_o_r;
a_hat = 1;
b_hat = 1;
proj_inctax(r) = 1;
resi(r) = 1;
inc_pc(r) = 1;
pop_(r) = 1;
const_tax(r) = 0;
display "com: Cost parameters.";
parameter
    cost_o(i,r)		Cost of production
    cost_il(i,r)	Cost of non-resource inputs in xe
    cost_pfe(i,r)	Cost of primary factor-energy composite
    cost_pf(i,r)	Cost of primary factor composite
    cost_ea(i,r)	Cost of energy inputs in nxe
    cost_nel(i,r)	Cost of non-energy inputs in nxe
    cost_lqd(i,r)	Cost of liquidity energy in nxe
    cost_ceg(r)		Cost of energy goods in consumption
    cost_cneg(r)	Cost of non-energy goods in consumption
;
cost_il(xe,r)$vom(xe,r)
    = sum(j, pai0(j,xe,r) * vafm(j,xe,r)) + ld0(xe,r);
display cost_il;
cost_pf(nxe,r)$vom(nxe,r) = ld0(nxe,r) + kd0(nxe,r);
cost_pfe(nxe,r)$vom(nxe,r)
    = cost_pf(nxe,r) + sum(eg, pai0(eg,nxe,r) * vafm(eg,nxe,r));
cost_pf(nxe,r) = round(cost_pf(nxe,r), 4);
cost_pfe(nxe,r) = round(cost_pfe(nxe,r), 4);
display cost_pf, cost_pfe;
cost_o(i,r)$vom(i,r) = (1-ty(i,r)) * vom(i,r);
cost_o(nxe,r)$vom(nxe,r) = sum(neg, pai0(neg,nxe,r)*vafm(neg,nxe,r))
    + cost_pfe(nxe,r);
display cost_o;
cost_ea(nxe,r)$vom(nxe,r) = voei(nxe,r);
display cost_ea;
cost_nel(nxe,r)$vom(nxe,r) = sum(nele, pai0(nele,nxe,r) * vafm(nele,nxe,r));
display cost_nel;
cost_lqd(nxe,r)$vom(nxe,r) = sum(lqd, pai0(lqd,nxe,r) * vafm(lqd,nxe,r));
display cost_lqd;
cost_ceg(r) = sum(eg, pc0(eg,r) * vcm(eg,r));
cost_cneg(r) = sum(neg, pc0(neg,r) * vcm(neg,r));
display cost_ceg, cost_cneg;
display "com: Share parameters.";
parameter
    sh_x(i,r)		Share of export supply in output
    sh_xer(i,r)		Share of resource input in xe
    sh_xe(*,i,r)	Share of non-resource inputs in xe
    sh_neg(j,i,r)	Share of non-energy inpputs in nxe
    sh_pfe(i,r)		Share of PFE composite in nxe
    sh_pf(i,r)		Share of primary factor composite in nxe
    sh_lab(i,r)		Share of primary factor in nxe
    sh_ele(i,r)		Share of electricity in nxe
    sh_col(i,r)		Share of coal in nxe
    sh_lqd(lqd, i,r)	Share of liquidity energy in nxe
    sh_m(i,r)		Share of import goods in Armington aggregation
    sh_mm(i,r,s)	Share of import goods
    gamma(i,s,r)	goods share of unit import cost
    sh_ce(r)		Share of energy composite in consumption
    sh_cneg(i,r)	Share of non-energy goods in consumption
    sh_ceg(i,r)		Share of energy goods in consumption
    sh_t(i,r)		Share of inputs in transport
    sh_cc(r)		Share of aggregate consumption
    sh_inv(r)		Share in global investment
;
sh_x(i,r)$vom(i,r) = vxm(i,r) / vom(i,r);
display sh_x;
sh_xer(xe,r)$cost_o(xe,r) = rd0(xe,r) / cost_o(xe,r);
display sh_xer;
sh_xe("l",xe,r)$cost_il(xe,r) = ld0(xe,r) / cost_il(xe,r);
sh_xe(j,xe,r)$cost_il(xe,r) = pai0(j,xe,r) * vafm(j,xe,r) / cost_il(xe,r);
display sh_xe;
sh_neg(neg,nxe,r)$cost_o(nxe,r)
    = pai0(neg,nxe,r) * vafm(neg,nxe,r) / cost_o(nxe,r);
sh_pfe(nxe,r)$cost_o(nxe,r)
    = cost_pfe(nxe,r) / cost_o(nxe,r);
display sh_neg, sh_pfe;
sh_pf(nxe,r)$cost_pfe(nxe,r)
    = cost_pf(nxe,r) / cost_pfe(nxe,r);
display sh_pf;
sh_lab(nxe,r)$cost_pf(nxe,r) = ld0(nxe,r) / cost_pf(nxe,r);
display sh_lab;
sh_ele(nxe,r)$cost_ea(nxe,r)
    = pai0("ele",nxe,r) * vafm("ele",nxe,r) / cost_ea(nxe,r);
display sh_ele;
sh_col(nxe,r)$cost_nel(nxe,r)
    = pai0("col",nxe,r) * vafm("col",nxe,r) / cost_nel(nxe,r);
display sh_col;
sh_lqd(lqd,nxe,r)$cost_lqd(nxe,r)
    = pai0(lqd,nxe,r) * vafm(lqd,nxe,r) / cost_lqd(nxe,r);
display sh_lqd;
sh_m(i,r)$a0(i,r) = m0(i,r) / a0(i,r);
display sh_m;
sh_ce(r) = cost_ceg(r) / vc(r);
display sh_ce;
sh_ceg(eg,r)$cost_ceg(r) = pc0(eg,r) * vcm(eg,r) / cost_ceg(r);
sh_cneg(neg,r)$cost_cneg(r) = pc0(neg,r) * vcm(neg,r) / cost_cneg(r);
display sh_ceg, sh_cneg;
sh_t(i,r) = vst(i,r) / vt;
display sh_t;
sh_mm(i,s,r)$vim(i,r) =
    (vxmd(i,s,r) * pmx0(i,s,r) + vtwr(i,s,r) * pmt0(i,s,r) ) / vim(i,r);
display sh_mm;
gamma(i,s,r)$vxmd(i,s,r) = vxmd(i,s,r) * pmx0(i,s,r) /
    (vxmd(i,s,r) * pmx0(i,s,r) + vtwr(i,s,r) * pmt0(i,s,r) );
display gamma;
sh_cc(r) = vc(r) / u0(r);
display sh_cc;
sh_inv(r) = ninv(r) / gninv;
display sh_inv;
display "com: Variable definitions.";
variables
    c_y(i,r)		Unit cost of production
    c_ea(i,r)		Unit cost of energy aggregation
    c_a(i,r)		Unit cost of Armington aggregation
    c_m(i,r)		Unit cost of import aggregation
    c_c(r)		Unit cost of consumption
    c_t			Unit cost of transport services
    c_u(r)		Unit cost of utility
    c_ginv		Unit cost of global investment
    p_y(i,r)		Price index of output
    p_il(i,r)		Price index of intermediate input-labor composite
    p_pfe(i,r)		Price index of primary factor-energy composite
    p_pf(i,r)		Price index of primary factor composite
    p_nel(i,r)		Price index of non-electricity energy composite
    p_lqd(i,r)		Price index of liquidity energy composite
    p_mm(i,r,s)		Price index of import
    p_cne(r)		Price index of non-energy goods in consumption
    p_ce(r)		Price index of energy goods in consumption
    p_e(i,j,r)		Price of final energy for intermediate inputs
    p_efd(i,r)		Price of final energy for final demand
    p_x(i,r)		Price of export goods
    p_d(i,r)		Price of domestic goods
    p_m(i,r)		Price of import goods
    p_t			Price of transport services
    p_ea(i,r)		Price of energy composite
    p_l(r)		Wage rate
    p_r(i,r)		Price of resource inputs
    r_k(r)		Rental price
    p_a(i,r)		Price of Armington goods
    p_c(r)		Price index of aggregate consumption
    p_inv		Price of regional investment
    p_u(r)		Price of utility
    p_save		Price of savings
    a_xer(i,r)		Demand for resource inputs
    a_xel(i,r)		Demand for labor
    a_xei(i,j,r)	Demand for intermediate inputs
    a_fl(i,r)		Demand for labor
    a_fk(i,r)		Demand for capital
    a_ea(i,r)		Demand for energy composite
    a_e(j,i,r)		Demand for energy
    a_ad(i,r)		Demand for domestic goods
    a_am(i,r)		Demand for aggregate import
    a_mm(i,s,r)		Demand for import goods
    a_cne(i,r)		Demand for non-energy goods
    a_ce(i,r)		Demand for energy goods
    a_x(i,r)		Export supply
    a_d(i,r)		Domestic supply
    a_t(i,r)		Demand from transport sector
    a_cc(r)		Demand for aggregate consumption
    a_s(r)		Demand for savings
    d_ca(r)		Total emissions
    d_c_e(i,j,r)	Emissions from intermediate inputs
    d_c_fd(i,r)		Emissions from final demand
    y(i,r)		Production level
    ea(i,r)		Energy aggregation
    a(i,r)		Armington aggregation
    m(i,r)		Import aggregation
    c(r)		Consumption aggregation
    yt			Transport sector
    u(r)		Price of utility
    r_c(r)		Current rate of return from capital stock
    r_e(r)		Expected rate of return from capital stock
    k_e(r)		End-of-period capital stock
    r_g			Global rate of return
    inc_ra(r)		Income of representative agent
    ginv		Global investment
    grossinv(r)		Gross domestic investment
    netinv(r)		Regional net investment (gross minus depreciation)
    rsave(r)		Regional savings
    ic_tax(r)		Implicit carbon tax
    c_tax(r)		Endogenous carbon tax
    rc_tax(r)		Endogenous carbon tax (real)
;
display "com: Equation definitions.";
equations
    e_c_y(i,r)		Unit cost of production
    e_p_y(i,r)		Price index of output
    e_p_il(i,r)		Price index of intermediate input-labor composite
    e_p_pfe(i,r)	Price index of primary factor-energy composite
    e_p_pf(i,r)		Price index of primary factor composite
    e_c_ea(i,r)		Unit cost of energy aggregation
    e_p_nel(i,r)	Price index of non-electricity energy composite
    e_p_lqd(i,r)	Price index of liquidity energy composite
    e_c_a(i,r)		Unit cost of Armington aggregation
    e_c_m(i,r)		Unit cost of import aggregation
    e_p_mm(i,r,s)	Price index of import
    e_c_c(r)		Unit cost of consumption
    e_p_cne(r)		Price index of non-energy goods in consumption
    e_p_ce(r)		Price index of energy goods in consumption
    e_p_e(i,j,r)	Price of final energy for intermediate inputs
    e_p_efd(i,r)	Price of final energy for final demand
    e_c_t		Cost of transport services
    e_y(i,r)		Production level
    e_ea(i,r)		Energy aggregation
    e_a(i,r)		Armington aggregation
    e_m(i,r)		Import aggregation
    e_c(r)		Consumption aggregation
    e_yt		Transport sector
    e_a_xer(i,r)	Demand for resource inputs
    e_a_xel(i,r)	Demand for labor
    e_a_xei(i,j,r)	Demand for intermediate inputs
    e_a_fl(i,r)		Demand for labor
    e_a_fk(i,r)		Demand for capital
    e_a_ea(i,r)		Demand for energy composite
    e_a_e(j,i,r)	Demand for energy
    e_a_ad(i,r)		Demand for domestic goods
    e_a_am(i,r)		Demand for aggregate import
    e_a_mm(i,s,r)	Demand for import goods
    e_a_cne(i,r)	Demand for non-energy goods
    e_a_ce(i,r)		Demand for energy goods
    e_a_x(i,r)		Export supply
    e_a_d(i,r)		Domestic supply
    e_a_cc(r)		Demand for aggregate consumption
    e_a_s(r)		Demand for savings
    e_a_t(i,r)		Demand from transport sector
    e_d_ca(r)		Total demand for emission permits
    e_d_c_e(i,j,r)	Emissions from intermediate inputs
    e_d_c_fd(i,r)	Emissions from final demand
    e_p_x(i,r)		Price of export goods
    e_p_d(i,r)		Price of domestic goods
    e_p_m(i,r)		Price of import goods
    e_p_t		Price of transport services
    e_p_ea(i,r)		Price of energy composite
    e_p_l(r)		Wage rate
    e_p_r(i,r)		Price of resource inputs
    e_r_k(r)		Rental price
    e_p_a(i,r)		Price of Armington goods
    e_p_c(r)		Price index of aggregate consumption
    e_inc_ra(r)		Income of representative agent
    e_u(r)		Price of utility
    e_p_inv		Price of regional investment
    e_c_u(r)		Unit cost of utility
    e_p_u(r)		Price of utility
    e_p_save		Price of savings
    e_c_ginv		Unit cost of global investment
    e_ginv		Global investment
    e_grossinv		Gross domestic investment
    e_r_c(r)		Rate of return
    e_r_e(r)		Expected rate of return
    e_k_e(r)		End-of-period capital stock
    e_r_g		Global rate of return
    e_netinv(r)		Net investment
    e_rsave(r)		Regional savings
    e_ic_tax(r)		Implicit carbon tax
    e_c_tax(r)		Endogenous carbon tax
    e_rc_tax(r)		Endogenous carbon tax (real)
;
e_c_y(i,r)$vom(i,r) ..
    c_y(i,r) =e=
    ((sh_xer(i,r) * (p_r(i,r))**(1-sig_r(i,r))
    + (1-sh_xer(i,r)) * (p_il(i,r))**(1-sig_r(i,r)))**(1/(1-sig_r(i,r)))
    )$xe(i)
    +
    (sum(neg$sh_neg(neg,i,r),
    sh_neg(neg,i,r) * ((1+ti(neg,i,r))*p_a(neg,r)/pai0(neg,i,r)))
    + sh_pfe(i,r) * p_pfe(i,r)
    )$nxe(i);
e_p_y(i,r)$vom(i,r) ..
    p_y(i,r) =e=
    ((sh_x(i,r)*(p_x(i,r))**(1+eta_o))$sh_x(i,r)
    + (1-sh_x(i,r))*(p_d(i,r))**(1+eta_o)
    )**(1/(1+eta_o));
e_p_il(i,r)$cost_il(i,r) ..
    p_il(i,r) =e=
    sh_xe("l",i,r) * p_l(r)
    + sum(j$sh_xe(j,i,r),
    sh_xe(j,i,r) * ((1+ti(j,i,r))*p_a(j,r)/pai0(j,i,r)));
e_p_pfe(i,r)$cost_pfe(i,r) ..
    p_pfe(i,r) =e=
    ((sh_pf(i,r)*(p_pf(i,r))**(1-sig_pfe)
    + (1-sh_pf(i,r))*(p_ea(i,r))**(1-sig_pfe))**(1/(1-sig_pfe)))$(sig_pfe ne 1)
    +
    (p_pf(i,r)**(sh_pf(i,r)) * (p_ea(i,r))**(1-sh_pf(i,r)))$(sig_pfe = 1);
e_p_pf(i,r)$cost_pf(i,r) ..
    p_pf(i,r) =e=
    ((sh_lab(i,r)*(p_l(r)/tp_kl(r))**(1-sig_pf)
    + (1-sh_lab(i,r))*(r_k(r)/tp_kl(r))**(1-sig_pf)
    )**(1/(1-sig_pf)))$(sig_pf ne 1)
    +
    ((p_l(r)/tp_kl(r))**(sh_lab(i,r))
    * (r_k(r)/tp_kl(r))**(1-sh_lab(i,r)))$(sig_pf = 1);
e_c_ea(i,r)$cost_ea(i,r) ..
    c_ea(i,r) =e=
    ((sh_ele(i,r)*((1+ti("ele",i,r))*p_a("ele",r)/pai0("ele",i,r))**(1-sig_e)
    + (1-sh_ele(i,r))*(p_nel(i,r))**(1-sig_e))**(1/(1-sig_e)))$(sig_e ne 1)
    +
    (((1+ti("ele",i,r))*p_a("ele",r)/pai0("ele",i,r))**(sh_ele(i,r))
    * (p_nel(i,r))**(1-sh_ele(i,r)))$(sig_e = 1);
e_p_nel(i,r)$cost_nel(i,r) ..
    p_nel(i,r) =e=
    ((sh_col(i,r)*(p_e("col",i,r))**(1-sig_nel)
    + (1-sh_col(i,r))*(p_lqd(i,r))**(1-sig_nel))**(1/(1-sig_nel)))$(sig_nel ne 1)
    +
    ((((p_e("col",i,r))**(sh_col(i,r)))$sh_col(i,r) + 1$(not sh_col(i,r)))
    * (p_lqd(i,r))**(1-sh_col(i,r)))$(sig_nel = 1);
e_p_lqd(i,r)$cost_lqd(i,r) ..
    p_lqd(i,r) =e=
    ((sum(lqd$sh_lqd(lqd,i,r),
    sh_lqd(lqd,i,r)*(p_e(lqd,i,r))**(1-sig_lqd)
    ))**(1/(1-sig_lqd)))$(sig_lqd ne 1)
    +
    (prod(lqd$sh_lqd(lqd,i,r),
    (p_e(lqd,i,r))**(sh_lqd(lqd,i,r))
    ))$(sig_lqd = 1);
e_c_a(i,r)$a0(i,r) ..
    c_a(i,r) =e=
    (((sh_m(i,r)*(p_m(i,r))**(1-sig_a))$sh_m(i,r)
    + ((1-sh_m(i,r))*(p_d(i,r))**(1-sig_a))$(sh_m(i,r) ne 1)
    )**(1/(1-sig_a)))$(sig_a ne 1)
    +
    ((1$(sh_m(i,r) = 0) +  ((p_m(i,r))**(sh_m(i,r)))$sh_m(i,r))
    * (1$(sh_m(i,r) = 1) +  ((p_d(i,r))**(1-sh_m(i,r)))$(sh_m(i,r) ne 1))
    )$(sig_a = 1);
e_c_m(i,r)$m0(i,r) ..
    c_m(i,r) =e=
    ((sum(s$sh_mm(i,s,r),
    sh_mm(i,s,r)*(p_mm(i,s,r))**(1-sig_m)))**(1/(1-sig_m)))$(sig_m ne 1)
    +
    (prod(s$sh_mm(i,s,r), (p_mm(i,s,r))**(sh_mm(i,s,r))))$(sig_m = 1);
e_p_mm(i,r,s)$vxmd(i,r,s) ..
    p_mm(i,r,s) =e=
    gamma(i,r,s)*(1+tm(i,r,s))*(1+tx(i,r,s))*p_x(i,r)/pmx0(i,r,s)
    + (1-gamma(i,r,s))*(1+tm(i,r,s))*p_t/pmt0(i,r,s);
e_c_c(r) ..
    c_c(r) =e=
    ((sh_ce(r)*(p_ce(r))**(1-sig_c) + (1-sh_ce(r))*(p_cne(r))**(1-sig_c)
    )**(1/(1-sig_c)))$(sig_c ne 1)
    +
    ((p_ce(r))**sh_ce(r) * (p_cne(r))**(1-sh_ce(r)))$(sig_c = 1);
e_p_cne(r) ..
    p_cne(r) =e=
    ((sum(neg$sh_cneg(neg,r),
    sh_cneg(neg,r)*((1+tc(neg,r))*p_a(neg,r)/pc0(neg,r))**(1-sig_cne)
    ))**(1/(1-sig_cne)))$(sig_cne ne 1)
    +
    (prod(neg$sh_cneg(neg,r),
    ((1+tc(neg,r))*p_a(neg,r)/pc0(neg,r))**(sh_cneg(neg,r)))
    )$(sig_cne = 1);
e_p_ce(r) ..
    p_ce(r) =e=
    ((sh_ceg("ele",r)*((1+tc("ele",r))*p_a("ele",r)/pc0("ele",r))**(1-sig_ce)
    + sum(fe$sh_ceg(fe,r),
    sh_ceg(fe,r)*(p_efd(fe,r))**(1-sig_ce))
    )**(1/(1-sig_ce)))$(sig_ce ne 1)
    +
    (((1+tc("ele",r))*p_a("ele",r)/pc0("ele",r))**(sh_ceg("ele",r))
    * prod(fe$sh_ceg(fe,r),
    (p_efd(fe,r))**(sh_ceg(fe,r)))
    )$(sig_ce = 1);
e_p_e(fe,nxe,r)$vafm(fe,nxe,r) ..
    p_e(fe,nxe,r) =e= (1+ti(fe,nxe,r))*p_a(fe,r) / (pai0(fe,nxe,r)*tp_fe(r))
    + (delta(fe,nxe,r)
    * (ic_tax(r)$fl_it + c_tax(r)$fl_et + (rc_tax(r) * p_u(r))$fl_ct) / tp_fe(r)
    )$delta(fe,nxe,r);
e_p_efd(fe,r)$vcm(fe,r) ..
    p_efd(fe,r) =e= (1+tc(fe,r))*p_a(fe,r) / pc0(fe,r)
    + (delta(fe,"fd",r)
    * (ic_tax(r)$fl_it + c_tax(r)$fl_et + (rc_tax(r) * p_u(r))$fl_ct)
    )$delta(fe,"fd",r);
e_c_t ..
    c_t =e=
    ((sum((i,r)$sh_t(i,r),
    sh_t(i,r)*(p_x(i,r))**(1-sig_t)))**(1/(1-sig_t))
    )$(sig_t ne 1)
    +
    (prod((i,r)$sh_t(i,r), (p_x(i,r))**(sh_t(i,r))))$(sig_t = 1);
e_c_u(r) ..
    c_u(r) =e=
    ((sh_cc(r) * (p_c(r))**(1-sig_u) + (1-sh_cc(r)) * (p_save)**(1-sig_u)
    )**(1/(1-sig_u))
    )$(sig_u ne 1)
    +
    ((p_c(r))**(sh_cc(r)) * (p_save)**(1-sh_cc(r)))$(sig_u = 1);
e_y(i,r)$vom(i,r) ..
    c_y(i,r) =g= (1-ty(i,r)) * p_y(i,r) / py0(i,r);
e_ea(i,r)$cost_ea(i,r) ..
    c_ea(i,r) =g= p_ea(i,r);
e_a(i,r)$a0(i,r) ..
    c_a(i,r) =g= p_a(i,r);
e_m(i,r)$m0(i,r) ..
    c_m(i,r) =g= p_m(i,r);
e_c(r) ..
    c_c(r) =g= p_c(r);
e_yt ..
    c_t =g= p_t;
e_u(r) ..
    c_u(r) =g= p_u(r);
e_a_x(i,r)$vxm(i,r) ..
    a_x(i,r) =e= vxm(i,r) * (p_x(i,r)/p_y(i,r))**(eta_o);
e_a_d(i,r)$vdm(i,r) ..
    a_d(i,r) =e= vdm(i,r) * (p_d(i,r)/p_y(i,r))**(eta_o);
e_a_xer(i,r)$(xe(i) and rd0(i,r)) ..
    a_xer(i,r) =e= rd0(i,r) * (c_y(i,r)/p_r(i,r))**(sig_r(i,r));
e_a_xel(i,r)$(xe(i) and ld0(i,r)) ..
    a_xel(i,r) =e=
    ld0(i,r) * (c_y(i,r)/p_il(i,r))**(sig_r(i,r));
e_a_xei(j,i,r)$(xe(i) and vafm(j,i,r)) ..
    a_xei(j,i,r) =e=
    vafm(j,i,r) * (c_y(i,r)/p_il(i,r))**(sig_r(i,r));
e_a_fl(i,r)$(nxe(i) and ld0(i,r)) ..
    a_fl(i,r)
    =e= ld0(i,r) * (p_pf(i,r)/p_l(r))**(sig_pf) * (tp_kl(r))**(sig_pf - 1)
    * (p_pfe(i,r)/p_pf(i,r))**(sig_pfe);
e_a_fk(i,r)$(nxe(i) and kd0(i,r)) ..
    a_fk(i,r)
    =e= kd0(i,r) * (p_pf(i,r)/r_k(r))**(sig_pf) * (tp_kl(r))**(sig_pf - 1)
    * (p_pfe(i,r)/p_pf(i,r))**(sig_pfe);
e_a_ea(i,r)$(nxe(i) and voei(i,r)) ..
    a_ea(i,r) =e= voei(i,r) * (p_pfe(i,r)/p_ea(i,r))**(sig_pfe);
e_a_e(eg,i,r)$(cost_ea(i,r) and vafm(eg,i,r)) ..
    a_e(eg,i,r) =e=
    (vafm(eg,i,r)
    * (c_ea(i,r)/((1+ti(eg,i,r))*p_a(eg,r)/pai0(eg,i,r)))**(sig_e)
    )$ele(eg)
    +
    (vafm(eg,i,r) * (tp_fe(r))**(-1)
    * (p_nel(i,r)/p_e(eg,i,r))**(sig_nel)
    * (c_ea(i,r)/p_nel(i,r))**(sig_e)
    )$col(eg)
    +
    (vafm(eg,i,r) * (tp_fe(r))**(-1)
    * (p_lqd(i,r)/p_e(eg,i,r))**(sig_lqd)
    * (p_nel(i,r)/p_lqd(i,r))**(sig_nel)
    * (c_ea(i,r)/p_nel(i,r))**(sig_e)
    )$lqd(eg)
    ;
e_a_ad(i,r)$d0(i,r) ..
    a_ad(i,r) =e= d0(i,r) * (c_a(i,r)/p_d(i,r))**(sig_a);
e_a_am(i,r)$m0(i,r) ..
    a_am(i,r) =e= m0(i,r) * (c_a(i,r)/p_m(i,r))**(sig_a);
e_a_mm(i,r,s)$vxmd(i,r,s) ..
    a_mm(i,r,s) =e=
    vxmd(i,r,s) * (c_m(i,s) / p_mm(i,r,s))**(sig_m);
e_a_cne(i,r)$(neg(i) and vcm(i,r)) ..
    a_cne(i,r) =e= vcm(i,r)
    * (p_cne(r)/((1+tc(i,r))*p_a(i,r)/pc0(i,r)))**(sig_cne)
    * (c_c(r)/p_cne(r))**(sig_c);
e_a_ce(i,r)$(eg(i) and vcm(i,r)) ..
    a_ce(i,r) =e=
    (vcm(i,r)
    * (p_ce(r)/((1+tc(i,r))*p_a(i,r)/pc0(i,r)))**(sig_ce)
    * (c_c(r)/p_ce(r))**(sig_c))$ele(i)
    +
    (vcm(i,r)
    * (p_ce(r)/p_efd(i,r))**(sig_ce)
    * (c_c(r)/p_ce(r))**(sig_c))$(not ele(i));
;
e_a_t(i,r)$vst(i,r) ..
    a_t(i,r) =e= vst(i,r) * (c_t / p_x(i,r))**(sig_t);
e_a_cc(r) ..
    a_cc(r) =e= vc(r) * (p_u(r) / p_c(r))**(sig_u);
e_a_s(r) ..
    a_s(r) =e= save(r) * (p_u(r) / p_save)**(sig_u);
e_d_c_e(fe,nxe,r)$delta_(fe,nxe,r) ..
    d_c_e(fe,nxe,r) =e=
    delta_(fe,nxe,r) * a_e(fe,nxe,r) * ea(nxe,r);
e_d_c_fd(fe,r)$delta_(fe,"fd",r) ..
    d_c_fd(fe,r) =e= delta_(fe,"fd",r) * a_ce(fe,r) * c(r);
e_d_ca(r) ..
    d_ca(r) =e= sum((fe,nxe)$delta(fe,nxe,r), d_c_e(fe,nxe,r))
    + sum(fe$delta(fe,"fd",r), d_c_fd(fe,r));
e_p_x(i,r)$vxm(i,r) ..
    a_x(i,r)*y(i,r) =g=
    sum(s$vxmd(i,r,s), a_mm(i,r,s) * m(i,s))
    + (a_t(i,r) * yt)$vst(i,r);
e_p_d(i,r)$vdm(i,r) ..
    a_d(i,r) * y(i,r) =g=
    ( a_ad(i,r)*a(i,r) )$(not cgd(i))
    +
    (ninv(r)*netinv(r) + scale_k(r) * depr(r) * k_b(r))$cgd(i);
e_p_m(i,r)$vim(i,r) ..
    m0(i,r) * m(i,r) =g= a_am(i,r) * a(i,r);
e_p_t ..
    vt * yt =g= sum((i,r,s)$vxmd(i,r,s), tau(i,r,s) * a_mm(i,r,s) * m(i,s));
e_p_ea(i,r)$voei(i,r) ..
    voei(i,r) * ea(i,r) =g= a_ea(i,r) * y(i,r);
e_p_l(r) ..
    scale_l(r) * end_l(r) =e=
    sum(xe$ld0(xe,r), a_xel(xe,r) * y(xe,r))
    + sum(nxe$ld0(nxe,r), a_fl(nxe,r) * y(nxe,r));
e_r_k(r) ..
    scale_k(r) * end_k(r) =g= sum(nxe$kd0(nxe,r), a_fk(nxe,r) * y(nxe,r));
e_p_r(i,r)$(xe(i) and rd0(i,r)) ..
    scale_r(r) * rd0(i,r) =g= a_xer(i,r) * y(i,r);
e_p_a(i,r)$a0(i,r) ..
    a0(i,r) * a(i,r) =g=
    ( sum(xe$vafm(i,xe,r), a_xei(i,xe,r) * y(xe,r))
    + sum(nxe$vafm(i,nxe,r), vafm(i,nxe,r) * y(nxe,r))
    + (a_cne(i,r) * c(r))$vcm(i,r)
    )$neg(i)
    +
    ( sum(xe$vafm(i,xe,r), a_xei(i,xe,r) * y(xe,r))
    + sum(nxe$vafm(i,nxe,r), a_e(i,nxe,r) * ea(nxe,r))
    + (a_ce(i,r) * c(r))$vcm(i,r)
    )$eg(i)
    ;
e_p_c(r) ..
    vc(r) * c(r) =g= a_cc(r) * u(r);
e_ic_tax(r)$fl_it ..
    carblim(r) =g= d_ca(r);
e_p_u(r) ..
    inc_ra(r) =g= p_u(r) * u0(r) * u(r);
e_p_save ..
    gninv * ginv =g= sum(r, save(r) * rsave(r));
e_inc_ra(r) ..
    inc_ra(r) =e=
    sum(i$vom(i,r), ty(i,r) * p_y(i,r) * vom(i,r) * y(i,r))
    + sum((xe,j)$vafm(j,xe,r), ti(j,xe,r) * p_a(j,r) * a_xei(j,xe,r) * y(xe,r))
    + sum((nxe,fe)$vafm(fe,nxe,r),
    ti(fe,nxe,r) * p_a(fe,r) * a_e(fe,nxe,r) * ea(nxe,r))
    + sum(nxe$vafm("ele",nxe,r),
    ti("ele",nxe,r) * p_a("ele",r) * a_e("ele",nxe,r) * ea(nxe,r))
    + sum((nxe,neg)$vafm(neg,nxe,r),
    ti(neg,nxe,r) * p_a(neg,r) * vafm(neg,nxe,r) * y(nxe,r))
    + sum((i,s)$vxmd(i,r,s), tx(i,r,s) * p_x(i,r) * a_mm(i,r,s) * m(i,s))
    + sum((i,s)$vxmd(i,s,r),
    tm(i,s,r) * ((1+tx(i,s,r)) * p_x(i,s) + p_t * tau(i,s,r))
    * a_mm(i,s,r) * m(i,r))
    + sum(neg$vcm(neg,r), tc(neg,r) * p_a(neg,r) * a_cne(neg,r) * c(r))
    + sum(fe$vcm(fe,r), tc(fe,r) * p_a(fe,r) * a_ce(fe,r) * c(r))
    + tc("ele",r) * p_a("ele",r) * a_ce("ele",r) * c(r)
    + p_l(r) * scale_l(r) * end_l(r)
    + r_k(r) * scale_k(r) * end_k(r)
    + sum(xe, p_r(xe,r) * scale_r(r) * rd0(xe,r))
    - sum(cgd, p_d(cgd,r) * scale_k(r) * depr(r) * k_b(r))
    + (ic_tax(r) * carblim(r))$fl_it
    + (c_tax(r) * d_ca(r))$fl_et
    + (p_u(r) * rc_tax(r) * d_ca(r))$fl_ct
;
e_p_inv(r) ..
    p_inv(r) =e= sum(cgd, p_d(cgd,r));
e_c_ginv$(not rordelta) ..
    c_ginv =e= sum(r, sh_inv(r) * p_inv(r));
e_ginv ..
    (gninv * ginv - sum(r, ninv(r) * netinv(r)))$rordelta
    +
    (c_ginv - p_save)$(not rordelta)
    =e= 0
    ;
e_grossinv(r) ..
    inv(r) * grossinv(r)
    =e= ninv(r) * netinv(r) + scale_k(r) * depr(r) * k_b(r);
e_r_c(r)$rordelta ..
    r_c(r) =e= r_k(r) / p_inv(r) - depr(r);
e_r_e(r)$rordelta ..
    r_e0(r) * r_e(r) =e=
    r_c(r) * (k_e(r)/(scale_k(r) * k_b(r)))**(-rorflex(r));
e_r_g$rordelta ..
    sum(r, p_inv(r) * ninv(r) * netinv(r)) =e= p_save * gninv * ginv;
e_k_e(r) ..
    k_e(r) =e= scale_k(r) * k_b(r) + ninv(r) * netinv(r);
e_netinv(r) ..
    (r_g - r_e(r))$rordelta
    +
    (netinv(r) - ginv)$(not rordelta)
    =e= 0;
e_rsave(r) ..
    save(r) * rsave(r) =e= a_s(r) * u(r);
e_c_tax(r)$fl_et ..
    rc_tax(r) =e=
    resi(r) + a_hat + c_reg * b_hat * inc_ra(r) * 10 / (pop_(r) * p_u(r))
    + (1 - c_reg) * b_hat * inc_pc(r);
e_rc_tax(r)$(fl_it or fl_et or fl_ct) ..
    rc_tax(r) =e=
    (ic_tax(r)$fl_it + c_tax(r)$fl_et) / p_u(r) + const_tax(r)$fl_ct;
display "com: Model definition.";
model end_reg_mcp A multi-region recursive model for carbon tax analysis /
      e_c_y.c_y, e_p_y.p_y, e_p_il.p_il, e_p_pfe.p_pfe, e_p_pf.p_pf,
      e_c_ea.c_ea, e_p_nel.p_nel, e_p_lqd.p_lqd, e_c_a.c_a, e_c_m.c_m,
      e_p_mm.p_mm, e_c_c.c_c, e_p_cne.p_cne, e_p_ce.p_ce, e_p_e.p_e,
      e_p_efd.p_efd, e_c_t.c_t,
      e_y.y, e_ea.ea, e_a.a, e_m.m, e_c.c, e_yt.yt,
      e_a_x.a_x, e_a_d.a_d, e_a_xer.a_xer, e_a_xel.a_xel, e_a_xei.a_xei,
      e_a_fl.a_fl, e_a_fk.a_fk, e_a_ea.a_ea, e_a_e.a_e, e_a_ad.a_ad,
      e_a_am.a_am, e_a_mm.a_mm, e_a_cne.a_cne, e_a_ce.a_ce, e_a_t.a_t,
      e_d_ca.d_ca, e_d_c_e.d_c_e, e_d_c_fd.d_c_fd,
      e_p_x.p_x, e_p_d.p_d, e_p_m.p_m, e_p_t.p_t, e_p_ea.p_ea, e_p_l.p_l,
      e_p_r.p_r, e_r_k.r_k, e_p_a.p_a, e_p_c.p_c, e_ic_tax.ic_tax,
      e_inc_ra.inc_ra,
      e_p_inv.p_inv, e_c_u.c_u, e_p_u.p_u, e_u.u, e_p_save.p_save,
      e_ginv.ginv, e_grossinv.grossinv, e_c_ginv.c_ginv, e_r_c.r_c, e_r_e.r_e,
      e_k_e.k_e, e_r_g.r_g, e_netinv.netinv, e_rsave.rsave, e_a_cc.a_cc,
      e_a_s.a_s, e_c_tax.c_tax, e_rc_tax.rc_tax
      /;
display "com: Set lower bounds and initial values";
$include end_reg_initial.gms
inc_ra.fx("usa") = inc_ra.l("usa");
display "com: Fix irrelevant values.";
parameter
    res_u		Utility
    res_p_u		Price of utility
    res_inc		Income
    res_inc_pc		Per capita income
    res_c		Consumption
    res_gdp		GDP
    res_k		Total capital stock
    res_kst		Total capital stock (capital earnings)
    res_save		Savings
    res_ninv		Regional net investment
    res_inv		Regional gross investment
    res_ginv		Global net investment
    res_carb		Carbon emissions (BtC)
    res_carb_fe		Carbon emissions (BtC)
    res_ene_fe		Energy (EJ)
    res_carb_sec	Carbon emissions by sector (BtC)
    res_c_tax		Carbon tax
    res_c_tax_		Carbon tax
    res_leakage		Leakage rate in 2010 (%)
    res_y		Output
    rc_carb		The rate of change in carbon emissions (%)
    pc_gdp		% change in GDP from BAU
    pc_carb		% change in carbon emissions from BAU
;
parameter
    chk_carb		Carbon emissions (BtC)
    chk_carb_fe		Carbon emissions (BtC)
    chk_carb_o		Carbon emissions from oil (BtC)
    chk_carb_c		Carbon emissions from coal (BtC)
    chk_carb_g		Carbon emissions from gas (BtC)
    chk_gdp		GDP
;
$include par_result_2010bau.gms
display "com: Benchmark replication in 1997:";
carblim(r) = 500000;
display carblim;
end_reg_mcp.iterlim = 0;
end_reg_mcp.optfile = 1;
solve end_reg_mcp using mcp;
display "com: Cleanup calculation in 1997:";
end_reg_mcp.iterlim = 8000;
solve end_reg_mcp using mcp;
display "Benchmark tolerance:", end_reg_mcp.objval;
abort$(end_reg_mcp.modelstat <> 1)
     "Model not normally completed", end_reg_mcp.modelstat;
abort$(end_reg_mcp.solvestat <> 1)
     "No local optimum found", end_reg_mcp.solvestat;
res_carb("bau","1997",r) = d_ca.l(r);
res_carb("bau","1997","world") = sum(r, res_carb("bau","1997",r));
display res_carb, carbon95;
res_carb_fe("bau","1997",fe,r)
    = sum(nxe$delta_(fe,nxe,r), d_c_e.l(fe,nxe,r)) + d_c_fd.l(fe,r);
res_carb_fe("bau","1997","total",r) = sum(fe, res_carb_fe("bau","1997",fe,r));
res_carb_sec("bau","1997",i,r) =
    sum(fe$delta_(fe,i,r), d_c_e.l(fe,i,r));
res_carb_sec("bau","1997","fd",r) = sum(fe$delta_(fe,"fd",r), d_c_fd.l(fe,r));
res_carb_sec("bau","1997","total",r) = sum(i, res_carb_sec("bau","1997",i,r))
    + res_carb_sec("bau","1997","fd",r);
display res_carb_fe, res_carb_sec;
if(scale_ch,
    display "com: Scale check:";
    scale_k(r) = 1.1;
    scale_l(r) = 1.1;
    scale_r(r) = 1.1;
    solve end_reg_mcp using mcp;
    display "Tolerance:", end_reg_mcp.objval;
    abort$(end_reg_mcp.modelstat <> 1)
	 "Model not normally completed", end_reg_mcp.modelstat;
    abort$(end_reg_mcp.solvestat <> 1)
	 "No local optimum found", end_reg_mcp.solvestat;
    scale_k(r) = 1;
    scale_l(r) = 1;
    scale_r(r) = 1;
);
$if %scale_ch%==1 $goto end
if(fl_test,
    display "com: Test solve:";
    fl_it = 1;
    display fl_it;
    carblim(r)$annexb(r) = 0.9 * res_carb("bau","1997",r);
    display carblim;
    solve end_reg_mcp using mcp;
    display "Tolerance:", end_reg_mcp.objval;
    abort$(end_reg_mcp.modelstat <> 1)
	 "Model not normally completed", end_reg_mcp.modelstat;
    abort$(end_reg_mcp.solvestat <> 1)
	 "No local optimum found", end_reg_mcp.solvestat;
    res_carb_fe("bau","1997_",fe,r)
	= sum(nxe$delta_(fe,nxe,r), d_c_e.l(fe,nxe,r)) + d_c_fd.l(fe,r);
    res_carb_fe("bau","1997_","total",r)
	= sum(fe, res_carb_fe("bau","1997_",fe,r));
    res_carb_sec("bau","1997_",i,r) =
	sum(fe$delta_(fe,i,r), d_c_e.l(fe,i,r));
    res_carb_sec("bau","1997_","fd",r)
	= sum(fe$delta_(fe,"fd",r), d_c_fd.l(fe,r));
    res_carb_sec("bau","1997_","total",r)
	= sum(i, res_carb_sec("bau","1997_",i,r))
	+ res_carb_sec("bau","1997_","fd",r);
    display res_carb_fe;
    res_carb("bau","1997_",r) = d_ca.l(r);
    res_carb("bau","1997_","world") = sum(r, res_carb("bau","1997_",r));
    display res_carb;
);
$if %fl_test%==1 $goto end
$label end