$title 'Test dumpOpt with dumpOptGDX' (DUMPOPT2,SEQ=884) $onText This test ensures correct behavior of the command line parameter dumpOptGDX in combination with dumpOpt. Contributor: Lutz Westermann, November 2021 $offText $onCheckErrorLevel option CheckErrorLevel = 1; Set duVals / 1*4, 11, 21 / restartRecov(duVals) / 1*4 / reWriteInput(duVals) / 11, 21 /; $onEcho > tran1.gms $title A Transportation Problem (TRNSPORT,SEQ=1) $onText This problem finds a least cost shipping schedule that meets requirements at markets and supplies at factories. Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions. Princeton University Press, Princeton, New Jersey, 1963. This formulation is described in detail in: Rosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide. The Scientific Press, Redwood City, California, 1988. The line numbers will not match those in the book because of these comments. Keywords: linear programming, transportation problem, scheduling $offText * Add some complexity display 'hello'; $onEmbeddedCode Python: pass $offEmbeddedCode embeddedCode Python: pass endEmbeddedCode file fx; put fx; $onPut xxx $offPut Set i 'canning plants' / seattle, san-diego / j 'markets' / new-york, chicago, topeka /; Parameter a(i) 'capacity of plant i in cases' / seattle 350 san-diego 600 / b(j) 'demand at market j in cases' / new-york 325 chicago 300 topeka 275 /; Table d(i,j) 'distance in thousands of miles' new-york chicago topeka seattle 2.5 1.7 1.8 san-diego 2.5 1.8 1.4; Scalar f 'freight in dollars per case per thousand miles' / 90 /; Parameter c(i,j) 'transport cost in thousands of dollars per case'; c(i,j) = f*d(i,j)/1000; Variable x(i,j) 'shipment quantities in cases' z 'total transportation costs in thousands of dollars'; Positive Variable x; Equation cost 'define objective function' supply(i) 'observe supply limit at plant i' demand(j) 'satisfy demand at market j'; cost.. z =e= sum((i,j), c(i,j)*x(i,j)); supply(i).. sum(j, x(i,j)) =l= a(i); demand(j).. sum(i, x(i,j)) =g= b(j); Model transport / all /; $offEcho * Generate the base case: This creates a restart and GDX file to be used and compared to with different runs $call gams tran1.gms lo=%GAMS.lo% s=base GDX=trans1base * W/o dumpOptGDX loop(duVals$reWriteInput(duVals), put_utility 'shell' / 'gams tran1.gms lo=%GAMS.lo% dumpOpt=' duVals.tl:0; put_utility 'shell' / 'gams tran1.dmp lo=%GAMS.lo% GDX=trans1' duVals.tl:0; put_utility 'shell' / 'gdxdiff trans1base.gdx trans1' duVals.tl:0 '.gdx > %system.nullfile%'; ); * W/ dumpOptGDX loop(duVals$reWriteInput(duVals), put_utility 'shell' / 'gams tran1.gms lo=%GAMS.lo% dumpOptGDX=trans1 dumpOpt=' duVals.tl:0; put_utility 'shell' / 'gams tran1.dmp lo=%GAMS.lo% GDX=trans1' duVals.tl:0; put_utility 'shell' / 'gdxdiff trans1base.gdx trans1' duVals.tl:0 '.gdx > %system.nullfile%'; ); $onEcho > tran2.gms solve transport using lp minimizing z ; $offEcho * Restart recovery w/ and w/o dumpOptGDX loop(duVals$restartRecov(duVals), put_utility 'shell' / 'gams tran2.gms lo=%GAMS.lo% r=base dumpOpt=' duVals.tl:0; put_utility 'shell' / 'gams tran2.dmp lo=%GAMS.lo% GDX=trans2' duVals.tl:0; put_utility 'shell' / 'gams tran2.gms lo=%GAMS.lo% r=base dumpOptGDX=trans2 dumpOpt=' duVals.tl:0; put_utility 'shell' / 'gams tran2.dmp lo=%GAMS.lo% GDX=trans2' duVals.tl:0 'GDX'; put_utility 'shell' / 'gdxdiff trans2' duVals.tl:0 '.gdx trans2' duVals.tl:0 'GDX.gdx > %system.nullfile%'; ); * Check some constructed cases $onEcho > data1.gms Set i / i1*i3/; Parameter a(i) / i1 1 i2 2/; $onMulti Parameter a(i) / i1 0, i3 3/; Scalar b / 7 /; Scalar b / 77 /; Set i / i2*i5/; Scalar y /1/, x; $onVerbatim Set i / i3*i6/; $eval Y y $offVerbatim Set xx /x1*x%y%/; $onVerbatim $ifThenE %Y%=1 x=1; $else x=2; $endIf $offVerbatim $offEcho * Generate new base case execute 'gams data1.gms lo=%GAMS.lo% GDX=database'; * W/o dumpOptGDX loop(duVals$reWriteInput(duVals), put_utility 'shell' / 'gams data1.gms lo=%GAMS.lo% dumpOpt=' duVals.tl:0; put_utility 'shell' / 'gams data1.dmp lo=%GAMS.lo% GDX=data' duVals.tl:0; put_utility 'shell' / 'gdxdiff database.gdx data' duVals.tl:0 '.gdx > %system.nullfile%'; ); * W/ dumpOptGDX loop(duVals$reWriteInput(duVals), put_utility 'shell' / 'gams data1.gms lo=%GAMS.lo% dumpOptGDX=data dumpOpt=' duVals.tl:0; put_utility 'shell' / 'gams data1.dmp lo=%GAMS.lo% GDX=data' duVals.tl:0; put_utility 'shell' / 'gdxdiff database.gdx data' duVals.tl:0 '.gdx > %system.nullfile%'; ); * Deal with empty data statements $onEcho > data2.gms Set empty(*); $gdxOut test.gdx $unLoad empty $gdxOut $gdxIn test.gdx $$load empty $gdxIn Set test(*) / / test2(*) / / ; Set i emptyI(i) / /; $offEcho * Generate new base case execute 'gams data2.gms lo=%GAMS.lo% GDX=database'; * W/o dumpOptGDX loop(duVals$reWriteInput(duVals), put_utility 'shell' / 'gams data2.gms lo=%GAMS.lo% dumpOpt=' duVals.tl:0; put_utility 'shell' / 'gams data2.dmp lo=%GAMS.lo% GDX=data' duVals.tl:0; put_utility 'shell' / 'gdxdiff database.gdx data' duVals.tl:0 '.gdx > %system.nullfile%'; ); * W/ dumpOptGDX loop(duVals$reWriteInput(duVals), put_utility 'shell' / 'gams data2.gms lo=%GAMS.lo% dumpOptGDX=data dumpOpt=' duVals.tl:0; put_utility 'shell' / 'gams data2.dmp lo=%GAMS.lo% GDX=data' duVals.tl:0; put_utility 'shell' / 'gdxdiff database.gdx data' duVals.tl:0 '.gdx > %system.nullfile%'; ); * Deal with subsets $onEcho > data3.gms Set i(i) / i1 /; Set jj j(jj); Set jj / j1 /; $offEcho * Generate new base case execute 'gams data3.gms lo=%GAMS.lo% GDX=database'; * W/o dumpOptGDX loop(duVals$reWriteInput(duVals), put_utility 'shell' / 'gams data3.gms lo=%GAMS.lo% dumpOpt=' duVals.tl:0; put_utility 'shell' / 'gams data3.dmp lo=%GAMS.lo% GDX=data' duVals.tl:0; put_utility 'shell' / 'gdxdiff database.gdx data' duVals.tl:0 '.gdx > %system.nullfile%'; ); * W/ dumpOptGDX loop(duVals$reWriteInput(duVals), put_utility 'shell' / 'gams data3.gms lo=%GAMS.lo% dumpOptGDX=data dumpOpt=' duVals.tl:0; put_utility 'shell' / 'gams data3.dmp lo=%GAMS.lo% GDX=data' duVals.tl:0; put_utility 'shell' / 'gdxdiff database.gdx data' duVals.tl:0 '.gdx > %system.nullfile%'; ); * Deal with merged sets $onEcho > data4.gms Set i; Parameter p(i); $gdxIn trans1base.gdx $load i %system.nullfile%'; ); * W/ dumpOptGDX loop(duVals$reWriteInput(duVals), put_utility 'shell' / 'gams data4.gms lo=%GAMS.lo% dumpOptGDX=data dumpOpt=' duVals.tl:0; put_utility 'shell' / 'gams data4.dmp lo=%GAMS.lo% GDX=data' duVals.tl:0; put_utility 'shell' / 'gdxdiff database.gdx data' duVals.tl:0 '.gdx > %system.nullfile%'; ); * Some more tables $onEcho > data5.gms Table randomEmptyTable(*,*),randomDelimTable(*,*) $onDelim bli,bla,blubb t1,123 t2,456 $offDelim ; $offEcho * Generate new base case execute 'gams data5.gms lo=%GAMS.lo% GDX=database'; * W/o dumpOptGDX loop(duVals$reWriteInput(duVals), put_utility 'shell' / 'gams data5.gms lo=%GAMS.lo% dumpOpt=' duVals.tl:0; put_utility 'shell' / 'gams data5.dmp lo=%GAMS.lo% GDX=data' duVals.tl:0; put_utility 'shell' / 'gdxdiff database.gdx data' duVals.tl:0 '.gdx > %system.nullfile%'; ); * W/ dumpOptGDX loop(duVals$reWriteInput(duVals), put_utility 'shell' / 'gams data5.gms lo=%GAMS.lo% dumpOptGDX=data dumpOpt=' duVals.tl:0; put_utility 'shell' / 'gams data5.dmp lo=%GAMS.lo% GDX=data' duVals.tl:0; put_utility 'shell' / 'gdxdiff database.gdx data' duVals.tl:0 '.gdx > %system.nullfile%'; );