4040)
4141
4242from pyomo .common .dependencies import attempt_import
43+ import struct
4344
44- gdxcc , gdxcc_available = attempt_import ('gdxcc' )
45+
46+ def _gams_importer ():
47+ try :
48+ import gams .core .gdx as gdx
49+
50+ return gdx
51+ except ImportError :
52+ try :
53+ # fall back to the pre-GAMS-45.0 API
54+ import gdxcc
55+
56+ return gdxcc
57+ except :
58+ # suppress the error from the old API and reraise the current API import error
59+ pass
60+ raise
61+
62+
63+ gdxcc , gdxcc_available = attempt_import ('gdxcc' , importer = _gams_importer )
4564
4665logger = logging .getLogger ('pyomo.solvers' )
4766
@@ -728,18 +747,6 @@ def _get_version(self):
728747 )
729748 return _extract_version (results .stdout )
730749
731- @staticmethod
732- def _parse_special_values (value ):
733- if value == 1.0e300 or value == 2.0e300 :
734- return float ('nan' )
735- if value == 3.0e300 :
736- return float ('inf' )
737- if value == 4.0e300 :
738- return - float ('inf' )
739- if value == 5.0e300 :
740- return sys .float_info .epsilon
741- return value
742-
743750 def _rewrite_path_win8p3 (self , path ):
744751 """
745752 Return the 8.3 short path on Windows; unchanged elsewhere.
@@ -1278,6 +1285,18 @@ def _parse_gdx_results(self, results_filename, statresults_filename):
12781285 if not ret [0 ]:
12791286 raise RuntimeError ("GAMS GDX failure (gdxOpenRead): %d." % ret [1 ])
12801287
1288+ specVals = gdxcc .doubleArray (gdxcc .GMS_SVIDX_MAX )
1289+ rc = gdxcc .gdxGetSpecialValues (pgdx , specVals )
1290+
1291+ specVals [gdxcc .GMS_SVIDX_EPS ] = sys .float_info .min
1292+ specVals [gdxcc .GMS_SVIDX_UNDEF ] = float ("nan" )
1293+ specVals [gdxcc .GMS_SVIDX_PINF ] = float ("inf" )
1294+ specVals [gdxcc .GMS_SVIDX_MINF ] = float ("-inf" )
1295+ specVals [gdxcc .GMS_SVIDX_NA ] = struct .unpack (
1296+ ">d" , bytes .fromhex ("fffffffffffffffe" )
1297+ )[0 ]
1298+ gdxcc .gdxSetSpecialValues (pgdx , specVals )
1299+
12811300 i = 0
12821301 while True :
12831302 i += 1
@@ -1299,7 +1318,7 @@ def _parse_gdx_results(self, results_filename, statresults_filename):
12991318 raise RuntimeError ("GAMS GDX failure (gdxDataReadRaw)." )
13001319
13011320 if stat in ('OBJEST' , 'OBJVAL' , 'ETSOLVE' ):
1302- stat_vars [stat ] = self . _parse_special_values ( ret [2 ][0 ])
1321+ stat_vars [stat ] = ret [2 ][0 ]
13031322 else :
13041323 stat_vars [stat ] = int (ret [2 ][0 ])
13051324
@@ -1311,6 +1330,18 @@ def _parse_gdx_results(self, results_filename, statresults_filename):
13111330 if not ret [0 ]:
13121331 raise RuntimeError ("GAMS GDX failure (gdxOpenRead): %d." % ret [1 ])
13131332
1333+ specVals = gdxcc .doubleArray (gdxcc .GMS_SVIDX_MAX )
1334+ rc = gdxcc .gdxGetSpecialValues (pgdx , specVals )
1335+
1336+ specVals [gdxcc .GMS_SVIDX_EPS ] = sys .float_info .min
1337+ specVals [gdxcc .GMS_SVIDX_UNDEF ] = float ("nan" )
1338+ specVals [gdxcc .GMS_SVIDX_PINF ] = float ("inf" )
1339+ specVals [gdxcc .GMS_SVIDX_MINF ] = float ("-inf" )
1340+ specVals [gdxcc .GMS_SVIDX_NA ] = struct .unpack (
1341+ ">d" , bytes .fromhex ("fffffffffffffffe" )
1342+ )[0 ]
1343+ gdxcc .gdxSetSpecialValues (pgdx , specVals )
1344+
13141345 i = 0
13151346 while True :
13161347 i += 1
@@ -1321,8 +1352,8 @@ def _parse_gdx_results(self, results_filename, statresults_filename):
13211352 ret = gdxcc .gdxDataReadRaw (pgdx )
13221353 if not ret [0 ] or len (ret [2 ]) < 2 :
13231354 raise RuntimeError ("GAMS GDX failure (gdxDataReadRaw)." )
1324- level = self . _parse_special_values ( ret [2 ][0 ])
1325- dual = self . _parse_special_values ( ret [2 ][1 ])
1355+ level = ret [2 ][0 ]
1356+ dual = ret [2 ][1 ]
13261357
13271358 ret = gdxcc .gdxSymbolInfo (pgdx , i )
13281359 if not ret [0 ]:
@@ -1335,6 +1366,7 @@ def _parse_gdx_results(self, results_filename, statresults_filename):
13351366 gdxcc .gdxClose (pgdx )
13361367
13371368 gdxcc .gdxFree (pgdx )
1369+ gdxcc .gdxLibraryUnload ()
13381370 return model_soln , stat_vars
13391371
13401372 def _parse_dat_results (self , results_filename , statresults_filename ):
0 commit comments