$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;