mpsge11.gms : MPSGE test - multiple fixed income levels

Description

Usually only one numeraire is fixed in an MPSGE model: either a price
or income level chosen by the user or an income level chosen by
MPSGE.  But in some cases the user fixes multiple income levels.  The
MPSGE function evaluator must check for this and use the fixed income
levels instead of the usual computed ones.

To test this we adapt the scarfmge model from gamslib.

Contributor: Tom Rutherford, Steve Dirkse


Small Model of Type : MPSGE


Category : GAMS Test library


Main file : mpsge11.gms

$TITLE MPSGE test -  multiple fixed income levels (MPSGE11,SEQ=481)

$ontext
Usually only one numeraire is fixed in an MPSGE model: either a price
or income level chosen by the user or an income level chosen by
MPSGE.  But in some cases the user fixes multiple income levels.  The
MPSGE function evaluator must check for this and use the fixed income
levels instead of the usual computed ones.

To test this we adapt the scarfmge model from gamslib.

Contributor: Tom Rutherford, Steve Dirkse

$offtext


SET SC TAX RATE SCENARIOS /ZERO, LOW, MEDIUM, HIGH/;

PARAMETER  T(SC)        TAX RATES / LOW 0.05, MEDIUM 0.20, HIGH 0.50/;

SETS
       C       COMMODITIES

               /UNSKLAB, SKILLAB, CAPEOP, NONDURBL, DURABLE, CAPBOP/

       K(C)    CAPITAL INPUT IDENTIFIER /CAPBOP/,

       H       CONSUMERS /AGENT1,AGENT2,AGENT3,AGENT4,AGENT5/

       S       SECTORS /D1, D2, N1, N2, N3, CD, C1, C2/;

ALIAS (C,CC);

TABLE E(C,H)  Commodity endowments

            AGENT1     AGENT2     AGENT3     AGENT4     AGENT5
CAPBOP         3         0.1         2          1           6
SKILLAB        5         0.1         6          0.1         0.1
UNSKLAB        0.1       7           0.1        8           0.5
DURABLE        1         2           1.5        1           2

PARAMETER       TR(H)   TAX DISTRIBUTION RULE /AGENT1 1/;

SCALAR          TK      TAX ON CAPITAL IN CURRENT SCENARIO;

TABLE D(C,H) Reference demands

            AGENT1     AGENT2     AGENT3     AGENT4     AGENT5
CAPEOP         4         0.4          2         5          3
SKILLAB        0.2                    0.5
UNSKLAB                  0.6                    0.2        0.2
NONDURBL       2         4           2          5          4
DURABLE        3.2       1           1.5        4.5        2

PARAMETER  ESUB(H)  Elasticities in demand

/       AGENT1          1.2,
       AGENT2          1.6,
       AGENT3          0.8,
       AGENT4          0.5,
       AGENT5          0.6  /;

TABLE DATA(*,C,S)  Activity analysis matrix

                        D1          D2          N1          N2          N3

OUTPUT.NONDURBL                                 6.0         8.0         7.0
OUTPUT.DURABLE          4.0         3.5
OUTPUT.CAPEOP           4.0         4.0         1.6         1.6         1.6
INPUT .CAPBOP           5.3         5.0         2.0         2.0         2.0
INPUT .SKILLAB          2.0         1.0         2.0         4.0         1.0
INPUT .UNSKLAB          1.0         6.0         3.0         1.0         8.0

             +          CD          C1          C2

OUTPUT.CAPEOP           0.9         7.0         8.0
INPUT .CAPBOP           1.0         4.0         5.0
INPUT .SKILLAB                      3.0         2.0
INPUT .UNSKLAB                      1.0         8.0;


$ONTEXT

$MODEL: SCARF

$SECTORS:
       Y(S)    ! Activity level

$COMMODITIES:
       P(C)    ! Market price
       PT$TK   ! Price index for lumpsum redistribution of tax revenue.

$CONSUMERS:
       HH(H)   ! Household income
       GOVT$TK ! Government tax revenue (only included when taxes are levied).

$REPORT:
       V:WELFARE(H)    W:HH(H)

$PROD:Y(S)
       O:P(C)          Q:DATA("OUTPUT",C,S)
       I:P(C)          Q:DATA("INPUT" ,C,S)  A:GOVT$TK  T:TK$K(C)

$DEMAND:HH(H)  s:ESUB(H)
       D:P(C)          Q:D(C,H)
       E:P(C)          Q:E(C,H)
       E:PT$TK         Q:TR(H)

$DEMAND:GOVT$TK
       D:PT

$REPORT:
       V:X(c,h)        D:P(C)  DEMAND:HH(h)

$OFFTEXT

*       READ THE HEADER:
$SYSINCLUDE mpsgeset SCARF

TK = 1;

* Fix income levels to arbitrary values:
HH.FX(h) = sum(c, E(c,h));

* Solve the fixed income relaxation:
$INCLUDE SCARF.GEN
SOLVE SCARF USING MCP;


* verify a correct GAMS/MPSGE function evaluator
parameter   err(h,*)  Error in the solution returned by MPSGE;
scalar dt;
err(h,"HH.L") = HH.L(h);
err(h,"P*X")  = sum(c, P.L(c)*X.L(c,h));
err(h,"Diff") = HH.L(h) - sum(c, P.L(c)*X.L(c,h));
dt = sum{h, abs(err(h,"Diff"))};
display err, dt;
* if this is too greedy we can always ask for less precision
abort$[dt > 1e-8] 'error in solution returned by MPSGE', err, dt;