*---------------------------------------------------------------- * Regulatory Shocks (Bill Dean March 28, 2007) (PB for 0506 Oct 2009) *---------------------------------------------------------------- * * Reg.gms %1 %2 %3 %4 * * %1 - Reg ID, i.e., 1 for REG1, 16 for REG16, etc. * %2 - Ordval for first argement of REG, e.g., ORDVAL('TRANSP') for TRANSP sector; 0 to represent all relevant sectors * %3 - Ordval for second argement of REG, e.g., ORDVAL('TRANSP') for TRANSP sector; 0 to represent all relevant sectors * %4 - Size of shock, in billions of dollars. * * Example: * $BATINCLUDE Reg.gms 1 ORDVAL('TRANSP') 0 3.509 * translates to: * REG1('TRANSP',I) = (SUM(J,SAM('TRANSP',J)) + 3.509) / SUM(J,SAM('TRANSP',J)); * PARAMETER DENOM_LSTRA(GN) DENOMINATOR IN REG18 CALCULATION; PARAMETER DTPVA0 DELTA TPVA FOR CARBRATE OF 0; PARAMETER REGTEST TEST VALUE; PARAMETER TKTEST TEST VALUE; PARAMETER ALLONES(aZ) ALL ONES FOR COMPARISON WITH REGx DEFAULT VALUES; PARAMETER KK PROXY FOR INDEX K ; PARAMETER TEMP(AI,GN) Place to store SAM; *EOM adding oldreg1 4/8/08 PARAMETER OLDREG1(AI,AJ) UCB REG1 SCENARIO ORDERING CORRECTION; **EOM adding OLDREG16 4/8/08 PARAMETER OLDREG16(AI,C) UCB REG16 SCENARIO ORDERING CORRECTION; **EOM adding OLDREG18 4/8/08 PARAMETER OLDREG18(aZ,GN) UCB REG18 SCENARIO ORDERING CORRECTION; ALIAS (GF,GF1); ALLONES(Z) = 1; TKTEST = 0; if { %1 = 0, if { %2 = 0, * Reset all CARBRATE = 0; DTPVA(TI,K) = 0; TSEW(TI,K) = 0.5; REG1(I,J) = 1; REG11(J,TI,K) = 0; REG11(J,TI,'1') = 1; REG16(I,C) = 1; REG18(Z,GN) = 1; REG19(TI,K) = 0; LUMP(H,G) = 0; REGYD(H) = 0; REG1_ITK(I) = 0; REG1I_TK(I) = 0; REG1TRK(I,J) = 0; REG11_ITK(TI,K) = 0; REG11TRK(J,TI,K) = 0; REG16TRK(Z) = 0; REG16TK(I,C) = 0; else ABORT "REG%1 not recognized."; }; elseif %1 = 1, REGTEST = SUM(I,SUM(J,REG1(I,J))); if { %2 = 0, TKTEST = SUM(J,REG1_ITK(J)); REG1_ITK(I1)$(ORDVAL(I1) EQ %3) = 1; if { TKTEST = SUM(J,REG1_ITK(J)), ABORT "REG1(%2,%3) already set."; }; **EOM adding OLDREG1 for flexible ordering of scen shocks 4/8/08 *original REG1(I,I1)$(ORDVAL(I1) EQ %3) = (SUM(J,SAM(J,I1)) + (%4)) / SUM(J,SAM(J,I1)); OLDREG1(I,I1) = REG1(I,I1) ; REG1(I,I1)$(ORDVAL(I1) EQ %3) = (SUM(J,SAM(J,I1)) + (%4)) / SUM(J,SAM(J,I1)) + OLDREG1(I,I1)-1; elseif %3 = 0, TKTEST = SUM(J,REG1I_TK(J)); REG1I_TK(I1)$(ORDVAL(I1) EQ %2) = 1; if { TKTEST = SUM(J,REG1I_TK(J)), ABORT "REG1(%2,%3) already set."; }; **EOM adding OLDREG1 for flexible ordering of scen shocks 4/8/08 *original REG1(I1,I)$(ORDVAL(I1) EQ %2) = (SUM(J,SAM(I1,J)) + (%4)) / SUM(J,SAM(I1,J)); OLDREG1(I1,I) = REG1(I1,I) ; REG1(I1,I)$(ORDVAL(I1) EQ %2) = (SUM(J,SAM(I1,J)) + (%4)) / SUM(J,SAM(I1,J)) + OLDREG1(I1,I) - 1; else TKTEST = SUM(I,SUM(J,REG1TRK(I,J))); REG1TRK(I,J)$(ORDVAL(I) EQ %2 AND ORDVAL(J) EQ %3) = 1; if { TKTEST = SUM(I,SUM(J,REG1TRK(I,J))), ABORT "REG1(%2,%3) already set."; }; **EOM adding OLDREG1 for flexible ordering of scen shocks 4/8/08 *original REG1(I,J)$(ORDVAL(I) EQ %2 AND ORDVAL(J) EQ %3) = (SAM(I,J) + (%4)) / SAM(I,J); OLDREG1(I,J) = REG1(I,J) ; REG1(I,J)$(ORDVAL(I) EQ %2 AND ORDVAL(J) EQ %3) = ((SAM(I,J) + (%4)) / SAM(I,J)) + OLDREG1(I,J) - 1 ; }; if { SUM(I,SUM(J,REG1(I,J))) = REGTEST AND %4 NE 0, ABORT "REG1 Failure." }; elseif %1 = 16, REGTEST = SUM(I,SUM(C,REG16(I,C))); if { %2 = 0, TKTEST = SUM(Z,REG16TRK(Z)); REG16TRK(Z)$(ORDVAL(Z) EQ %3) = 1; if { TKTEST = SUM(Z,REG16TRK(Z)), ABORT "REG16(%2,%3) already set."; }; **EOM adding OLDREG16 for flexible ordering of scen shocks 4/8/08 *original REG16(I,C)$(ORDVAL(C) EQ %3) = (SUM(J,SAM(J,C)) + (%4)) / SUM(J,SAM(J,C)); OLDREG16(I,C) = REG16(I,C) ; REG16(I,C)$(ORDVAL(C) EQ %3) = (SUM(J,SAM(J,C)) + (%4)) / SUM(J,SAM(J,C) ) + OLDREG16(I,C) - 1 ; elseif %3 = 0, TKTEST = SUM(Z,REG16TRK(Z)); REG16TRK(Z)$(ORDVAL(Z) EQ %2) = 1; if { TKTEST = SUM(Z,REG16TRK(Z)), ABORT "REG16(%2,%3) already set."; }; **EOM adding OLDREG16 for flexible ordering of scen shocks 4/8/08 *original REG16(I1,C)$(ORDVAL(I1) EQ %2) = (SUM(C1,SAM(I1,C1)) + (%4)) / SUM(C1,SAM(I1,C1)); OLDREG16(I1,C) = REG16(I1,C) ; REG16(I1,C)$(ORDVAL(I1) EQ %2) = (SUM(C1,SAM(I1,C1)) + (%4)) / SUM(C1,SAM(I1,C1)) + OLDREG16(I1,C) - 1; else TKTEST = SUM(I,SUM(C,REG16TK(I,C))); REG16TK(I,C)$(ORDVAL(I) EQ %2 AND ORDVAL(C) EQ %3) = 1; if { TKTEST = SUM(I,SUM(C,REG16TK(I,C))), ABORT "REG16(%2,%3) already set."; }; **EOM adding OLDREG16 for flexible ordering of scen shocks 4/8/08 *original * REG16(I,C)$(ORDVAL(I) EQ %2 AND ORDVAL(C) EQ %3) = (SAM(I,C) + (%4)) / SAM(I,C); OLDREG16(I,C) = REG16(I,C) ; REG16(I,C)$(ORDVAL(I) EQ %2 AND ORDVAL(C) EQ %3) =( (SAM(I,C) + (%4)) / SAM(I,C) ) + OLDREG16(I,C)-1 ; }; if { SUM(I,SUM(C,REG16(I,C))) = REGTEST AND %4 NE 0, ABORT "REG16 Failure." }; elseif %1 = 18, REGTEST = SUM(I,SUM(GN,REG18(I,GN))); DENOM_LSTRA(GN)$(ORDVAL(GN) EQ %3) = SUM(J, SAM(J,GN) ) + SUM(F, SAM(F,GN) ) + SUM(GF, SAM(GF,GN) ); **EOM adding OLDREG18 for flexible ordering of scenario shocks 4/8/08 *original REG18(Z,GN)$(ORDVAL(GN) EQ %3) = 1 / (1 + (%4)/ DENOM_LSTRA(GN)); OLDREG18(Z,GN) = REG18(Z,GN) ; REG18(Z,GN)$(ORDVAL(GN) EQ %3) = ( 1 / (1 + (%4)/ DENOM_LSTRA(GN)) ) + OLDREG18(Z,GN) - 1; if { %2 = 0, **EOM adding OLDREG18 for flexible ordering of scenario shocks 4/8/08 *original REG18(I,GN)$(ORDVAL(GN) EQ %3) = (1 + (%4)/ SUM(J,SAM(J,GN)) ) / (1 + (%4)/ DENOM_LSTRA(GN)); REG18(I,GN)$(ORDVAL(GN) EQ %3) = ((1 + (%4)/ SUM(J,SAM(J,GN)) ) / (1 + (%4)/ DENOM_LSTRA(GN))) + OLDREG18(I,GN) - 1 ; else TEMP(I,GN)$(ORDVAL(I) EQ %2 AND ORDVAL(GN) EQ %3) = SAM(I,GN); * above sets temp = for desired element and all other elements equalt to zero DENOM_LSTRA(GN)$(ORDVAL(GN) EQ %3) = SUM(J, SAM(J,GN) ) + SUM(F, SAM(F,GN) ) + SUM(GF, SAM(GF,GN) )-SUM(I,TEMP(I,GN)); **EOM adding OLDREG18 for flexible ordering of scenario shocks 4/8/08 *original REG18(Z,GN)$(ORDVAL(GN) EQ %3) = (1 - (%4)/ DENOM_LSTRA(GN)); REG18(Z,GN)$(ORDVAL(GN) EQ %3) = ((1 - (%4)/ DENOM_LSTRA(GN))) + OLDREG18(Z,GN)- 1 ; * above is the value of all payments other than those to target sector **EOM adding OLDREG18 for flexible ordering of scenario shocks 4/8/08 *original REG18(I,GN)$(ORDVAL(I) EQ %2 AND ORDVAL(GN) EQ %3) = (1 + (%4)/ SAM(I,GN) ) ; REG18(I,GN)$(ORDVAL(I) EQ %2 AND ORDVAL(GN) EQ %3) = ((1 + (%4)/ SAM(I,GN) )) + OLDREG18(I,GN) - 1 ; }; * AG(GF,G)$(SUM(I, SAM(I,G) ) + SUM(F, SAM(F,G) ) + SUM(GF1, SAM(GF1,G) ) ) * = SAM(GF,G) / ( SUM(I, SAM(I,G) ) + SUM(F, SAM(F,G) ) + SUM(GF1, SAM(GF1,G) ) ); * * SUM_AG(GN)$(ORDVAL(GN) EQ %3) = SUM(J, AG(J,GN) * REG18(J,GN)) + * SUM(F, AG(F,GN) * REG18(F,GN)) + * SUM(GF, AG(GF,GN) * REG18(GF,GN)); if { SUM(I,SUM(GN,REG18(I,GN))) = REGTEST AND %4 NE 0, ABORT "REG18 Failure." }; elseif %1 = 19, REGTEST = SUM(I,SUM(K,REG19(I,K))); if { %2 = 0, ABORT "I = 0 not recognized for REG19." }; if { %3 = 0, ABORT "K = 0 not recognized for REG19." }; if { %3 > 3, ABORT "K > 3 not recognized for REG19." }; REG19(I,K)$(ORDVAL(I) EQ %2 AND ORD(K) = %3) = %4 / DS0(I); if { SUM(I,SUM(K,REG19(I,K))) = REGTEST AND %4 NE 0, ABORT "REG19 Failure." }; elseif %1 > 111, * A number between 112 and 113, inclusive, represents REG11 and K = 1,2,3 KK = %1 - 110; if { KK > 3, ABORT "K > 3 not recognized for REG11." }; REGTEST = SUM(J,SUM(TI,SUM(K,REG11(J,TI,K)))); if { %2 = 0, TKTEST = SUM(TI,SUM(K,REG11_ITK(TI,K))); REG11_ITK(TI,K)$(ORDVAL(TI) EQ %3 AND ORD(K) EQ KK) = 1; if { TKTEST = SUM(TI,SUM(K,REG11_ITK(TI,K))), if { KK = 2, ABORT "REG11(%2,%3,2) already set or not settable."; else ABORT "REG11(%2,%3,3) already set or not settable."; }; }; REG11(J,TI,K)$(ORDVAL(TI) EQ %3 AND ORD(K) EQ KK) = (SUM(I,SAM(I,TI)) + (%4)) / SUM(I,SAM(I,TI)); elseif %3 = 0, ABORT "Must specify a specific TI for REG11."; else TKTEST = SUM(J,SUM(TI,SUM(K,REG11TRK(J,TI,K)))); REG11TRK(J,TI,K)$(ORDVAL(J) EQ %2 AND ORDVAL(TI) EQ %3 AND ORD(K) EQ KK) = 1; if { TKTEST = SUM(J,SUM(TI,SUM(K,REG11TRK(J,TI,K)))), if { KK = 2, ABORT "REG11(%2,%3,2) already set or not settable."; else ABORT "REG11(%2,%3,3) already set or not settable."; }; }; REG11(J,TI,K)$(ORDVAL(J) EQ %2 AND ORDVAL(TI) EQ %3 AND ORD(K) EQ KK) = (SAM(J,TI) + (%4)) / SAM(J,TI); * Set to 1 for all other values of J, if not previously set. if { SUM(TI$(ORDVAL(TI) EQ %3),SUM(K$(ORD(K) EQ KK),SUM(J,REG11TRK(J,TI,K)))) = 1, REG11(J,TI,K)$(ORDVAL(J) NE %2 AND ORDVAL(TI) EQ %3 AND ORD(K) EQ KK) = 1; }; }; if { SUM(J,SUM(TI,SUM(K,REG11(J,TI,K)))) = REGTEST AND %4 NE 0, ABORT "REG11 Failure."; }; DTPVA0 = SUM(TI$(ORDVAL(TI) EQ %3), SUM(J, AD(J,TI) * REG1(J,TI) * (1 + SUM(GS,TAUQX(GS,J))) * (-1) * (SUM(K$(ORD(K) EQ KK), REG11(J,TI,K)) - REG11(J,TI,'1'))) * TSCALE); * Delta price value added, with prices replaced by initial value (1.0) DTPVA(TI,K)$(ORDVAL(TI) EQ %3 AND ORD(K) EQ KK) = MAX(REG19(TI,K) * CARBRATE * (1.0) - SUM(J, AD(J,TI) * REG1(J,TI) * (REG11(J,TI,K)-REG11(J,TI,'1')) * CINTENS(J,TI) * CARBRATE * (1.0)), 0) - SUM(J, AD(J,TI) * REG1(J,TI) * (REG11(J,TI,K)-REG11(J,TI,'1')) * (1.0) * ( 1 + SUM(GS, TAUQX(GS,J) ) ) ); TSEW(TI,K)$(ORDVAL(TI) EQ %3 AND ORD(K) EQ KK) = EXP(-DTPVA0) / (EXP(DTPVA0) + EXP(-DTPVA0)); * abort dtpva0, dtpva, tsew; else ABORT "REG%1 not recognized."; };