Skip to content

Commit 6b3d1cb

Browse files
authored
Merge pull request #3642 from AnhTran01/UpdateGAMSImport
Modified _parse_gdx_results in GAMS.py to replace _parse_special_value and Updated Import Statement
2 parents bdcfa4f + 1f462e5 commit 6b3d1cb

File tree

1 file changed

+48
-16
lines changed
  • pyomo/solvers/plugins/solvers

1 file changed

+48
-16
lines changed

pyomo/solvers/plugins/solvers/GAMS.py

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,27 @@
4040
)
4141

4242
from 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

4665
logger = 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

Comments
 (0)