Description
Test functionality of the GAMS embedded code facility for GAMS during execution time Contributor: Michael Bussieck, January 2023
Small Model of Type : GAMS
Category : GAMS Test library
Main file : embgms02.gms
$title 'Test for embedded code facility' (EMBGMS02,SEQ=926)
$onText
Test functionality of the GAMS embedded code facility for GAMS during execution time
Contributor: Michael Bussieck, January 2023
$offText
Set i / i1 text for i1
i2 text for i2 /
iout(i)
j / j1*j3 /
ij(i,j) / #i.#j /
i_want(i) / i1, i2 /
i_want_ex(i) / i1 text 1, i2 text 2 /
ij_want(i,j) / i1.j1, i1.j2 /
ij_want_merge(i,j) / i1.j1, i1.j2, i1.j3 /
ij_want_ex(i,j) / i1.j1 text 1, i1.j2 text 2/;
Scalar p0 /3.14/
p0_want / 3.14 /;
Parameter p1(i) / #i 3.14 /
p2(i,j) / #i.#j 3.14 /
p1_want(i) / #i 3.14 /
p2_want(i,j) / i1.j1 3.14, i1.j2 3.14 /
p2_want_merge(i,j) / i1.j1 3.14, i1.j2 3.14, i1.j3 3.14 /;
Variable v0 / fx 3.14 /
v1(i) / #i.fx 3.14 /
v2(i,j) / #i.#j.fx 3.14 /
v0_want / l 3.14, m 0, lo 0, up 10, scale 1 /
v1_want(i) / i1.(l 3.14, m 0, lo 0, up 10, scale 1),
i2.(l 3.14, m 0, lo 0, up 10, scale 1) /
v2_want(i,j) / i1.j1.(l 3.14, m 0, lo 0, up 10, scale 1),
i1.j2.(l 3.14, m 0, lo 0, up 10, scale 1) /
v2_want_merge(i,j) / i1.j1.(l 3.14, m 0, lo 0, up 10, scale 1),
i1.j2.(l 3.14, m 0, lo 0, up 10, scale 1),
i1.j3.(l 3.14, m 0, lo 0, up 10, scale 1) /;
equation e0 / fx 3.14 /
e1(i) / #i.fx 3.14 /
e2(i,j) / #i.#j.fx 3.14 /
e0_want / l 3.14, m 0, lo 0, up 10, scale 1 /
e1_want(i) / i1.(l 3.14, m 0, lo 0, up 10, scale 1),
i2.(l 3.14, m 0, lo 0, up 10, scale 1) /
e2_want(i,j) / i1.j1.(l 3.14, m 0, lo 0, up 10, scale 1),
i1.j2.(l 3.14, m 0, lo 0, up 10, scale 1) /
e2_want_merge(i,j) / i1.j1.(l 3.14, m 0, lo 0, up 10, scale 1),
i1.j2.(l 3.14, m 0, lo 0, up 10, scale 1),
i1.j3.(l 3.14, m 0, lo 0, up 10, scale 1) /;
$call rm -f embgms02_log.txt
$onEchoV > checkData
execute_unload 'have.gdx', %1;
execute 'gdxdiff wanted.gdx have.gdx >> embgms02_log.txt';
abort$errorlevel '%2';
$offEcho
put_utility 'save' / 'embgms02';
*** Test default list behavior ***
*Test 1.1: Test default list behavior of scalars
embeddedCode GAMS: r=embgms02
abort$(p0<>3.14) "p0 bad";
endEmbeddedCode
*Test 1.2: Test default list behavior of one dimensional parameters
embeddedCode GAMS: r=embgms02
loop(i, abort$(p1(i)<>3.14) 'p1 bad');
endEmbeddedCode
*Test 1.3: Test default list behavior of multi dimensional parameters
embeddedCode GAMS: r=embgms02
loop((i,j), abort$(p2(i,j)<>3.14) 'p2 bad');
endEmbeddedCode
*Test 1.4: Test default list behavior of one dimensional sets
embeddedCode GAMS: r=embgms02
set ix(i) / i1*i2 /, diff(i);
diff(i) = i(i) xor ix(i);
abort$(card(diff)) 'i1 bad', diff;
endEmbeddedCode
*Test 1.5: Test default list behavior of multi dimensional sets
embeddedCode GAMS: r=embgms02
set ijx(i,j) / #i.#j /, diff(i,j);
diff(i,j) = ij(i,j) xor ijx(i,j);
abort$(card(diff)) 'ij bad', diff;
endEmbeddedCode
*Test 1.6: Test default list behavior of scalar variables
embeddedCode GAMS: r=embgms02
abort$(v0.l <>3.14) 'bad v0.l';
abort$(v0.m <>0.00) 'bad v0.m';
abort$(v0.lo <>3.14) 'bad v0.lo';
abort$(v0.up <>3.14) 'bad v0.up';
abort$(v0.scale<>1.00) 'bad v0.scale';
endEmbeddedCode
*Test 1.7: Test default list behavior of one dimensional variables
embeddedCode GAMS: r=embgms02
loop(i,
abort$(v1.l (i)<>3.14) 'bad v1.l';
abort$(v1.m (i)<>0.00) 'bad v1.m';
abort$(v1.lo (i)<>3.14) 'bad v1.lo';
abort$(v1.up (i)<>3.14) 'bad v1.up';
abort$(v1.scale(i)<>1.00) 'bad v1.scale';
);
endEmbeddedCode
*Test 1.8: Test default list behavior of multi dimensional variables
embeddedCode GAMS: r=embgms02
loop((i,j),
abort$(v2.l (i,j)<>3.14) 'bad v2.l';
abort$(v2.m (i,j)<>0.00) 'bad v2.m';
abort$(v2.lo (i,j)<>3.14) 'bad v2.lo';
abort$(v2.up (i,j)<>3.14) 'bad v2.up';
abort$(v2.scale(i,j)<>1.00) 'bad v2.scale';
);
endEmbeddedCode
*Test 1.9: Test default list behavior of scalar equations
embeddedCode GAMS: r=embgms02
abort$(e0.l <>3.14) 'bad e0.l';
abort$(e0.m <>0.00) 'bad e0.m';
abort$(e0.lo <>3.14) 'bad e0.lo';
abort$(e0.up <>3.14) 'bad e0.up';
abort$(e0.scale<>1.00) 'bad e0.scale';
endEmbeddedCode
*Test 1.10: Test default list behavior of one dimensional equations
embeddedCode GAMS: r=embgms02
loop(i,
abort$(e1.l (i)<>3.14) 'bad e1.l';
abort$(e1.m (i)<>0.00) 'bad e1.m';
abort$(e1.lo (i)<>3.14) 'bad e1.lo';
abort$(e1.up (i)<>3.14) 'bad e1.up';
abort$(e1.scale(i)<>1.00) 'bad e1.scale';
);
endEmbeddedCode
*Test 1.11: Test default list behavior of multi dimensional equations
embeddedCode GAMS: r=embgms02
loop((i,j),
abort$(e2.l (i,j)<>3.14) 'bad e2.l';
abort$(e2.m (i,j)<>0.00) 'bad e2.m';
abort$(e2.lo (i,j)<>3.14) 'bad e2.lo';
abort$(e2.up (i,j)<>3.14) 'bad e2.up';
abort$(e2.scale(i,j)<>1.00) 'bad e2.scale';
);
endEmbeddedCode
*** Test writing symbol data using labels ***
execute_unload 'wanted.gdx', p0_want=p0;
option clear=p0;
put_utility 'xsave' / 'embgms02';
embeddedCode GAMS: r=embgms02
p0 = 3.14;
endEmbeddedCode p0
$batInclude checkData p0 'Test 4.1 failed in GAMS'
*Test 4.2: Test writing of one dimensional parameters
execute_unload 'wanted.gdx', p1_want=p1;
option clear=p1;
put_utility 'save' / 'embgms02';
embeddedCode GAMS: r=embgms02
p1(i) = 3.14;
endEmbeddedCode p1
$batInclude checkData p1 'Test 4.2 failed in GAMS'
*Test 4.3: Test writing of multi dimensional parameters
execute_unload 'wanted.gdx', p2_want=p2;
option clear=p2;
put_utility 'xsave' / 'embgms02';
embeddedCode GAMS: r=embgms02
p2('i1', 'j1') = 3.14;
p2('i1', 'j2') = 3.14;
endEmbeddedCode p2
$batInclude checkData p2 'Test 4.3 failed in GAMS'
*Test 4.4: Test writing of one dimensional sets
execute_unload 'wanted.gdx', i_want=iout;
option clear=iout;
put_utility 'save' / 'embgms02';
embeddedCode GAMS: r=embgms02
iout(i) = yes;
endEmbeddedCode iout
$batInclude checkData iout 'Test 4.4a failed in GAMS'
execute_unload 'wanted.gdx', i_want_ex=iout;
option clear=iout;
put_utility 'xsave' / 'embgms02';
embeddedCode GAMS: r=embgms02
$ onMultiR
set iout / 'i1' "text 1", 'i2' "text 2" /;
endEmbeddedCode iout
$batInclude checkData iout 'Test 4.4b failed in GAMS'
*Test 4.5: Test writing of multi dimensional sets
execute_unload 'wanted.gdx', ij_want=ij;
option clear=ij;
put_utility 'save' / 'embgms02';
embeddedCode GAMS: r=embgms02
ij('i1', 'j1') = yes;
ij('i1', 'j2') = yes;
endEmbeddedCode ij
$batInclude checkData ij 'Test 4.5a failed in GAMS'
execute_unload 'wanted.gdx', ij_want_ex=ij;
option clear=ij;
put_utility 'xsave' / 'embgms02';
embeddedCode GAMS: r=embgms02
$ onMultiR
set ij / 'i1'.'j1' "text 1", 'i1'.'j2' "text 2" /;
endEmbeddedCode ij
$batInclude checkData ij 'Test 4.5b failed in GAMS'
*Test 4.6: Test writing of scalar variable
execute_unload 'wanted.gdx', v0_want=v0;
option clear=v0;
put_utility 'save' / 'embgms02';
embeddedCode GAMS: r=embgms02
v0.l = 3.14;
v0.m = 0.00;
v0.lo = 0.00;
v0.up = 10.00;
v0.scale = 1.00;
endEmbeddedCode v0
$batInclude checkData v0 'Test 4.6 failed in GAMS'
*Test 4.7: Test writing of one dimensonal variables
execute_unload 'wanted.gdx', v1_want=v1;
option clear=v1;
put_utility 'xsave' / 'embgms02';
embeddedCode GAMS: r=embgms02
loop(i,
v1.l (i) = 3.14;
v1.m (i) = 0.00;
v1.lo (i) = 0.00;
v1.up (i) = 10.00;
v1.scale(i) = 1.00;
);
endEmbeddedCode v1
$batInclude checkData v1 'Test 4.7 failed in GAMS'
*Test 4.8: Test writing of multi dimensonal variables
execute_unload 'wanted.gdx', v2_want=v2;
option clear=v2;
put_utility 'save' / 'embgms02';
embeddedCode GAMS: r=embgms02
set ij2(i,j) / i1.j1, i1.j2 /;
loop(ij2(i,j),
v2.l (i,j) = 3.14;
v2.m (i,j) = 0.00;
v2.lo (i,j) = 0.00;
v2.up (i,j) = 10.00;
v2.scale(i,j) = 1.00;
);
endEmbeddedCode v2
$batInclude checkData v2 'Test 4.8 failed in GAMS'
*Test 4.9: Test writing of scalar equations
execute_unload 'wanted.gdx', e0_want=e0;
option clear=e0;
put_utility 'xsave' / 'embgms02';
embeddedCode GAMS: r=embgms02
e0.l = 3.14;
e0.m = 0.00;
e0.lo = 0.00;
e0.up = 10.00;
e0.scale = 1.00;
endEmbeddedCode e0
$batInclude checkData e0 'Test 4.9 failed in GAMS'
*Test 4.10: Test writing of one dimensonal equations
execute_unload 'wanted.gdx', e1_want=e1;
option clear=e1;
put_utility 'save' / 'embgms02';
embeddedCode GAMS: r=embgms02
loop(i,
e1.l (i) = 3.14;
e1.m (i) = 0.00;
e1.lo (i) = 0.00;
e1.up (i) = 10.00;
e1.scale(i) = 1.00;
);
endEmbeddedCode e1
$batInclude checkData e1 'Test 4.10 failed in GAMS'
*Test 4.11: Test writing of multi dimensonal equations
execute_unload 'wanted.gdx', e2_want=e2;
option clear=e2;
put_utility 'xsave' / 'embgms02';
embeddedCode GAMS: r=embgms02
set ij2(i,j) / i1.j1, i1.j2 /;
loop(ij2(i,j),
e2.l (i,j) = 3.14;
e2.m (i,j) = 0.00;
e2.lo (i,j) = 0.00;
e2.up (i,j) = 10.00;
e2.scale(i,j) = 1.00;
);
endEmbeddedCode e2
$batInclude checkData e2 'Test 4.11 failed in GAMS'