$OFFSYMLIST OFFSYMXREF OFFUPPER
$TITLE  TWO SECTOR OPEN ECONOMY GENERAL EQUILIBRIUM MODEL
*
*This GAMS program is prepared for the
*Ec562-TOPICS IN MICROECONOMICS: GENERAL EQUILIBRIUM MODELING
*course offered at the BILKENT UNIVERSITY.
*
* The model introduces basic elements of a 2*2 general equilibrium
*model of a productive economy which engages into trade at the
*fixed world terms of trade. There are two goods and two types of
*individuals in the economy, workers and the capitalists.
*Capitalists own the stock of capital and workers are endowed with
*(as the famous dictum goes) nothing but their labor.
*
* In this version of the model capital stocks are sector specific
*However the economy adjusts to profit rate diferentials
*between the sectors.  In the long run capital moves from
*the low profit sector to the higher profit sector until the
*profit rate differential is eliminated.
*
* For further documentation of the model equations refer to:
*    YELDAN, E. (1991) "Trade Theory in a Dynamic Open Economy
*    with Sluggish Physical Capital" METU STUDIES IN DEVELOPMENT
*    18(3): 283-505.
*
*##*##*##*##*##*##*##THE GAMS PROGRAM*##*##*##*##*##*##*##**
*
*##SET DEFINITIONS
SET
 HH  INDIVIDUALS /WHH  WORKER HOUSEHOLD
                  KHH  CAPITALIST HOUSEHOLD /

 I  GOODS  / A  AGRICULTURAL GOOD
             N  INDUSTRIAL GOOD /

 TP TIME PERIODS /0*50/
 T(TP) CURRENT TIME PERIOD

         ;

*##PARAMETER DEFINITIONS
PARAMETER
 AD(I)      SHIFT PARAMETER IN PROD FUNC
 ALFA(I)    CES FUNCTION SHARE PARAMETER
 CLES(I,HH) SECTORAL CONSUMPTION DEMAND BY HOUSEHOLDS
 PW(I)      WORLD PRICES
 RHO(I)     PRODUCTION EXPONENTIAL PARAMETER
 SIGP(I)    PRODUCTION FUNCTION ELASTICITY OF SUBSTITUTION

*DUMMIES TO HOLD INITIAL DATA
 IG0(HH)  HOUSEHOLD WEIGHTS IN THE SOCIAL WELFARE FUNCTION
 K0(I)   CAPITAL DEMAND IN SECTOR I
 KSTAR(HH) HOUSEHOLD CAPITAL ENDOWMENT
 LD0(I)  SECTORAL LABOR DEMANDS
 LSTAR(HH) HOUSEHOLD LABOR ENDOWMENT
 P0(I)   DOMESTIC PRICES
 QS0(I)  COMMODITY SUPPLIES
 RP0(I)  SECTORAL PROFITS
 RK0(I)  SECTORAL PROFIT RATE
 V0(HH)   HOUSEHOLD INDIRECT UTILITIES
 WL0(I)  SECTORAL WAGES
 Y0(HH)  HOUSEHOLD INCOME
       ;

SCALAR
 W0    NOMINAL WAGE RATE
 QX0   EXPORTS
 QM0   IMPORTS
 ER0   EXCHANGE RATE /1.0/
     ;

*TABLES TO DISPLAY RESULTS
PARAMETER
 HOUSE(*,HH,TP)     HOUSEHOLD RESULTS
 PRODUCT(*,I,TP)    PRODUCT MARKET RESULTS
 SCALRES(*,TP)      SCALAR RESULTS
 RK(I)              PROFIT RATE AT PERIOD T
 QDT(I,HH,TP)       HOUSEHOLD DEMAND TABLE
     ;

*##INITIAL DATA FROM SAM TABLE
TABLE MATBAL(*,I) MATERIAL BALANCES

           A               N
PW         1               1
WL0     0.98600675      1.90298535
QS0     2.20599375      5.72100625
LD0     3.41297837      6.58702163
SIGP      0.8             0.4
               ;

TABLE  HHINC(*,HH)  HOUSEHOLD PARAMETERS

            WHH          KHH
Y0      2.88899210    5.03800790
LSTAR       10.0
IG0         1.0           1.0
                   ;
 

TABLE QD0(I,HH)  HOUSEHOLD CONSUMPTION

            WHH         KHH
A       2.16699407  2.51900395
N       0.72199803  2.51900395
                  ;
 

*##MODEL CALIBRATION

PW(I)     = MATBAL("PW",I);
P0(I)     = ER0*PW(I);

LD0(I)    = MATBAL("LD0",I) ;
*K0(I)     = MATBAL("K0",I) ;
QS0(I)    = MATBAL("QS0",I) ;
WL0(I)    = MATBAL("WL0",I) ;
LSTAR(HH) = HHINC("LSTAR",HH) ;
*KSTAR(HH) = HHINC("KSTAR",HH) ;
 

*FIRST CALCULATE THE WAGE RATE
W0 = SUM(I, WL0(I) ) / SUM(HH, LSTAR(HH)) ;

*WE CALCULATE SECTORAL PROFITS BY DEDUCTING THE WAGE PAYMENTS
*FROM SECTORAL VALUE ADDED USING EULER'S LAW (OBSERVE THAT THE
*PRODUCTION FUNCTION IS CRTS).

RP0(I)    = P0(I)*QS0(I) - WL0(I) ;

*THEN WE CALCULATE THE PROFIT RATE
K0(I)   = RP0(I) ;
RK0(I)  = RP0(I)/K0(I) ;

*##CALIBRATE THE PRODUCTION FUNCTION: CES(K,L)
SIGP(I)   = MATBAL("SIGP",I);
RHO(I)    = (1/SIGP(I))-1;

ALFA(I) = (K0(I)/LD0(I))**(-1-RHO(I))*(W0/RK0(I)) ;
ALFA(I) = 1/(1+ALFA(I)) ;

AD(I) = QS0(I) / ((ALFA(I)*K0(I)**(-RHO(I)) + (1-ALFA(I))*LD0(I)
           **(-RHO(I)))**(-1/RHO(I))) ;

DISPLAY AD, ALFA, RHO;

*##CALCULATE HOUSEHOLD CONSUMPTION PARAMETERS
Y0(HH)    = HHINC("Y0",HH) ;

CLES(I,HH) = P0(I)*QD0(I,HH) / Y0(HH) ;

DISPLAY CLES ;

*##(INDIRECT) UTILITY LEVELS
IG0(HH)   = HHINC("IG0",HH);

V0(HH)    = PROD(I, QD0(I,HH)**CLES(I,HH) ) ;
 

*##EXPORTS AND IMPORTS
QX0 = QS0("N") - SUM(HH, QD0("N",HH)) ;
QM0 = SUM(HH, QD0("A",HH)) - QS0("A") ;
 

*##VARIABLE DEFINITIONS
POSITIVE VARIABLE
 PINDEX   PRICE INDEX
 ER       NOMINAL EXCHANGE RATE (CONVERSION FACTOR)
 P(I)     DOMESTIC PRICES
 RP(I)    SECTORAL PROFITS
 QS(I)    REAL OUTPUT SUPPLIES
 LD(I)    SECTORAL LABOR DEMANDS
 K(I)     SECTORAL CAPITAL DEMANDS
 W        NOMINAL WAGE RATE

 Y(HH)   HOUSEHOLD INCOME
 V(HH)   INDIRECT HOUSEHOLD UTILITY
 IG(HH)  HOUSEHOLD WEIGHTS ON THE SOCIAL WELFARE FUNCTION

 QD(I,HH) REAL HOUSEHOLD DEMAND

        ;

VARIABLE
 OMEGA   SOCIAL WELFARE FUNCTION VALUE
 QX      REAL EXPORTS (EXCESS SUPPLY)
 QM      REAL IMPORTS (EXCESS DEMAND)
       ;
 

*##VARIABLE INITIALIZATIONS
P.L(I)  = P0(I);
PINDEX.L= SUM(I, 0.5*P.L(I)) ;
QS.L(I) = QS0(I) ;
K.L(I)  = K0(I) ;
LD.L(I) = LD0(I) ;

Y.L(HH)    = Y0(HH) ;
QD.L(I,HH) = QD0(I,HH);
V.L(HH)    = V0(HH);
IG.L(HH)   = IG0(HH) ;

ER.L = ER0;
W.L  = W0;
QX.L = QX0;
QM.L = QM0 ;
OMEGA.L = SUM(HH, IG.L(HH)*V.L(HH) ) ;

*##DISPLAY SAM VALUES (This will check our calibration method as well)
*SOLUTION VALUES AT TIME 0

T(TP) = NO;
T("0") = YES ;

RK(I) = (P.L(I)*QS.L(I)-W.L*LD.L(I)) / K.L(I) ;

SCALRES("WAGERATE",T)  = W.L ;
SCALRES("EXPORTS",T) = QX.L;
SCALRES("IMPORTS",T) = QM.L;
SCALRES("SOCWELFARE",T) = OMEGA.L;
SCALRES("RELATIVEPR",T) = P.L("A")/P.L("N") ;
SCALRES("EXCRATE",T) = ER.L ;

PRODUCT("DOMPRICE",I,T) = P.L(I);
PRODUCT("WRLDPRICE",I,T)= PW(I) ;
PRODUCT("LABDEMAND",I,T) = LD.L(I);
PRODUCT("CAPITAL",I,T)  = K.L(I);
PRODUCT("OUTPUT",I,T) = QS.L(I);
PRODUCT("KLRATIO",I,T) = K.L(I)/LD.L(I) ;
PRODUCT("PROFITS",I,T) = P.L(I)*QS.L(I)-W.L*LD.L(I) ;
PRODUCT("PROFITRATE",I,T) = RK(I);

HOUSE("INCOME",HH,T) = Y.L(HH);
HOUSE("UTILITY",HH,T) = V.L(HH);
HOUSE("WLFREWGHTS",HH,T) = IG.L(HH) ;

QDT(I,HH,T) = QD.L(I,HH);
 
 

*##EQUATION DEFINITIONS
EQUATION
 INDEX    PRICE NORMALIZATION RULE
 PRICE     DOMESTIC PRICES
 PRODUCTION    SUPPLY OF GOODS
 LABOR    DEMAND FOR LABOR
 LMEQL    LABOR MARKET EQUILIBRIUM

 WINC     WORKER HOUSEHOLD INCOME
 KINC     CAPITALIST HOUSEHOLD INCOME
 UTILW    WORKER-HOUSEHOLD INDIRECT UTILITY FUNCTION
 UTILK    CAPITALIST-HOUSEHOLD INDIRECT UTILITY FUNCTION

 DEMANDA  HOUSEHOLD DEMAND FOR A GOOD
 DEMANDN  HOUSEHOLD DEMAND FOR N GOOD
 EXPORT   EXCESS SUPPLY
 IMPORT   EXCESS DEMAND
* TRDBAL   TRADE BALANCE     (omitted!!!, by way of Walras'Law)

 OBJ  OBJECTIVE FUNCTION (TOTAL SOCIAL WELFARE)
           ;
 

*##EQUATION SPECIFICATIONS

INDEX.. SUM(I, P(I)*0.5) =E= PINDEX;

PRICE(I)..  P(I) =E= PW(I)*ER ;

PRODUCTION(I)..  QS(I) =E= AD(I) * ( ALFA(I)*K(I)**(-RHO(I))
              + (1-ALFA(I))*LD(I)**(-RHO(I)) )**(-1/RHO(I)) ;

LABOR(I)..  LD(I) =E= ( (P(I)/W)*(1-ALFA(I))*AD(I)**(-RHO(I)) )
                     **SIGP(I)*QS(I) ;

LMEQL..  SUM(I, LD(I) ) =E= SUM(HH, LSTAR(HH)) ;

WINC..   Y("WHH") =E= SUM(I, W*LD(I));

KINC..   Y("KHH") =E= SUM(I, P(I)*QS(I)-W*LD(I) ) ;

UTILW..  V("WHH") =E= PROD(I, QD(I,"WHH")**CLES(I,"WHH")) ;

UTILK..  V("KHH") =E= PROD(I, QD(I,"KHH")**CLES(I,"KHH")) ;

DEMANDA(HH)..  P("A")*QD("A",HH) =E= CLES("A",HH)*Y(HH) ;

DEMANDN(HH)..  P("N")*QD("N",HH) =E= CLES("N",HH)*Y(HH) ;

EXPORT..  QX =E= QS("N") - SUM(HH, QD("N",HH) ) ;

IMPORT..  QM =E= SUM(HH, QD("A",HH) ) - QS("A") ;

*TRDBAL..  PW("N")*QX =E= PW("A")*QM ;

OBJ..   OMEGA =E= SUM(HH,IG(HH)*V(HH) ) ;
 

*##VARIABLE BOUNDS TO IMPROVE SOLUTION ALGORITHM
W.LO = 0.001;
P.LO(I) = 0.001;

*##MODEL RESTRICTIONS
*CAPITAL IS SECTOR SPECIFIC
K.FX(I)  = K.L(I) ;

*HOUSEHOLDS HAVE NO CONTROL OVER SOCIAL WELFARE WEIGHTS
IG.FX(HH) = IG.L(HH) ;

*##PRICE NORMALIZATION
*CHOOSE ONE OF THE FOLLOWING AS NUMERAIRE
* PINDEX.FX = PINDEX.L;
 ER.FX    = ER.L    ;
* P.FX("N")= P.L("N") ;
 

*##MODEL DEFINITION

MODEL  GENEQM  OPEN ECONOMY GENERAL EQUILIBRIUM MODEL /ALL/  ;

OPTIONS  ITERLIM =1000, LIMROW = 0, LIMCOL = 0, SOLPRINT = OFF;
geneqm.holdfixed  = 1;
geneqm.optfile    = 1;

SOLVE GENEQM MAXIMIZING OMEGA USING NLP;
* SOLVE GENEQM USING MCP ;
 

*SOLUTION VALUES AT TIME 1

T(TP) = NO;
T("1") = YES ;

RK(I) = (P.L(I)*QS.L(I)-W.L*LD.L(I)) / K.L(I) ;

SCALRES("WAGERATE",T)  = W.L ;
SCALRES("EXPORTS",T) = QX.L;
SCALRES("IMPORTS",T) = QM.L;
SCALRES("SOCWELFARE",T) = OMEGA.L;
SCALRES("RELATIVEPR",T) = P.L("A")/P.L("N") ;
SCALRES("EXCRATE",T) = ER.L ;

PRODUCT("DOMPRICE",I,T) = P.L(I);
PRODUCT("WRLDPRICE",I,T)= PW(I) ;
PRODUCT("LABDEMAND",I,T) = LD.L(I);
PRODUCT("CAPITAL",I,T)  = K.L(I);
PRODUCT("OUTPUT",I,T) = QS.L(I);
PRODUCT("KLRATIO",I,T) = K.L(I)/LD.L(I) ;
PRODUCT("PROFITS",I,T) = P.L(I)*QS.L(I)-W.L*LD.L(I) ;
PRODUCT("PROFITRATE",I,T) = RK(I);

HOUSE("INCOME",HH,T) = Y.L(HH);
HOUSE("UTILITY",HH,T) = V.L(HH);
HOUSE("WLFREWGHTS",HH,T) = IG.L(HH) ;

QDT(I,HH,T) = QD.L(I,HH);

DISPLAY SCALRES, PRODUCT, HOUSE, QDT ;

*##*##*##**END OF PROGRAM*##*##*##*##**