embpy13.gms : Test implicit/explicit loading in Embedded Code (execution time)

Description

This test ensures that ECImplicitLoad=on/off behaves correctly
with Embedded Code Python at execution time

Contributor: Michael Bussieck, March 2022


Small Model of Type : GAMS


Category : GAMS Test library


Main file : embpy13.gms

$title 'Test implicit/explicit loading in Embedded Code (execution time)' (EMBPY13,SEQ=899)

$ontext
This test ensures that ECImplicitLoad=on/off behaves correctly
with Embedded Code Python at execution time

Contributor: Michael Bussieck, March 2022
$offtext


* On the major platforms (Windows, Linux, Mac), GMSPYTHONLIB gets automatically set 
* to use the internal Python installation in sysdir/GMSPython.
$if not setEnv GMSPYTHONLIB $abort.noError Embedded code Python not ready to be used
$log --- Using Python library %sysEnv.GMSPYTHONLIB%

set uni / i1*i4, j1*j3 /;
set s1(*), s2(*);


* Load sets implicitly
EmbeddedCode Python:
gams.set('s1', ['i1', 'i2', 'i3'])
gams.set('s2', ['j1', 'j2', 'j3'])
endEmbeddedCode
EmbeddedCode Python:
if list(gams.get('s1')) != ['i1', 'i2', 'i3']:
   raise Exception("Unexpected Data in symbol s1")
if list(gams.get('s2')) != ['j1', 'j2', 'j3']:
   raise Exception("Unexpected Data in symbol s2")
endEmbeddedCode

* Load sets explicitly
option clear=s1, clear=s2;
EmbeddedCode Python:
gams.set('s1', ['i1', 'i3'])
gams.set('s2', ['j1', 'j3'])
endEmbeddedCode s1 s2
EmbeddedCode Python:
if list(gams.get('s1')) != ['i1', 'i3']:
   raise Exception("Unexpected Data in symbol s1")
if list(gams.get('s2')) != ['j1', 'j3']:
   raise Exception("Unexpected Data in symbol s2")
endEmbeddedCode

* Mix implicit and explicit loading
option clear=s1, clear=s2;
EmbeddedCode Python:
gams.set('s1', ['i1', 'i2', 'i3'])
gams.set('s2', ['j1', 'j2', 'j3'])
endEmbeddedCode s2
EmbeddedCode Python:
if list(gams.get('s1')) != ['i1', 'i2', 'i3']:
   raise Exception("Unexpected Data in symbol s1")
if list(gams.get('s2')) != ['j1', 'j2', 'j3']:
   raise Exception("Unexpected Data in symbol s2")
endEmbeddedCode

* Load parameter implicitly
set i / i1*i3 /, j / j1*j3 /;
parameter p1(i, j);
EmbeddedCode Python:
s1 = gams.get('i')
s2 = gams.get('j')
p1 = [(i, j, 3.14) for i,j in zip(s1, s2) ]
gams.set('p1', p1)
endEmbeddedCode
EmbeddedCode Python:
if list(gams.get('p1', keyFormat=KeyFormat.FLAT)) != p1:
   raise Exception("Unexpected Data in symbol p1")
endEmbeddedCode

* Generate a domain violation with implicit loading and DomainCheckType.CHECKED
abort$(execerror) 'terminate with execution errors';
option clear=p1;
EmbeddedCode Python:
p1 = [('i4', 'j1', 3.14)]
gams.set('p1', p1, domCheck=DomainCheckType.CHECKED)
endEmbeddedCode
abort$(execerror=0) 'expect execution errors';
execerror = 0;

EmbeddedCode Python:
if len(list(gams.get('p1'))):
   raise Exception("Unexpected Data in symbol p1")
endEmbeddedCode

* Generate a domain violation (unknow UEL) with implicit loading and DomainCheckType.CHECKED
abort$(execerror) 'terminate with execution errors';
option clear=p1;
EmbeddedCode Python:
p1 = [('i5', 'j1', 3.14)]
gams.set('p1', p1, domCheck=DomainCheckType.CHECKED)
endEmbeddedCode
abort$(execerror=0) 'expect execution errors';
execerror = 0;

EmbeddedCode Python:
if len(list(gams.get('p1'))):
   raise Exception("Unexpected Data in symbol p1")
endEmbeddedCode

* Filter a domain violation with implicit loading
option clear=p1;
EmbeddedCode Python:
p1 = [('i4', 'j1', 3.14)]
gams.set('p1', p1)
endEmbeddedCode

EmbeddedCode Python:
if len(list(gams.get('p1'))):
   raise Exception("Unexpected Data in symbol p1")
endEmbeddedCode

* Generate an execution error by loading a parameter that has not been set
parameter p4(i,j);
abort$(execerror) 'terminate with execution errors';
EmbeddedCode Python:
pass
endEmbeddedCode p4
abort$(execerror=0) 'expect execution errors';
execerror = 0;

option ECImplicitLoad=off;

abort$(execerror) 'terminate with execution errors';
EmbeddedCode Python:
s1 = gams.get('i')
s2 = gams.get('j')
p1 = [(i, j, 3.14) for i,j in zip(s1, s2) ]
gams.set('p1', p1)
endEmbeddedCode
abort$(execerror=0) 'expect execution errors';
execerror = 0;