Skip to content

Commit bd3e444

Browse files
authored
Merge pull request #3448 from jsiirola/sas-available
Defer starting the SAS session until needed
2 parents 8c2e601 + b5d9c24 commit bd3e444

File tree

2 files changed

+33
-23
lines changed

2 files changed

+33
-23
lines changed

pyomo/solvers/plugins/solvers/SAS.py

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,9 @@ def _presolve(self, *args, **kwds):
195195

196196
def available(self, exception_flag=False):
197197
"""True if the solver is available"""
198-
return self._python_api_exists
198+
if not self._python_api_exists:
199+
return False
200+
return self.start_sas_session() is not None
199201

200202
def _has_integer_variables(self):
201203
"""True if the problem has integer variables."""
@@ -285,12 +287,7 @@ def __init__(self, **kwds):
285287

286288
# Store other options for the SAS session
287289
self._session_options = kwds
288-
289-
# Create the session
290-
try:
291-
self._sas_session = self._sas.SASsession(**self._session_options)
292-
except:
293-
self._sas_session = None
290+
self._sas_session = None
294291

295292
def __del__(self):
296293
# Close the session, if we created one
@@ -314,6 +311,15 @@ def _create_statement_str(self, statement):
314311
def sas_version(self):
315312
return self._sasver
316313

314+
def start_sas_session(self):
315+
if self._sas_session is None:
316+
# Create (and cache) the session
317+
try:
318+
self._sas_session = self._sas.SASsession(**self._session_options)
319+
except:
320+
pass
321+
return self._sas_session
322+
317323
def _apply_solver(self):
318324
""" "Prepare the options and run the solver. Then store the data to be returned."""
319325
logger.debug("Running SAS")
@@ -374,10 +380,7 @@ def _apply_solver(self):
374380
sas_options = "option notes nonumber nodate nosource pagesize=max;"
375381

376382
# Get the current SAS session, submit the code and return the results
377-
if not self._sas_session:
378-
sas = self._sas_session = self._sas.SASsession(**self._session_options)
379-
else:
380-
sas = self._sas_session
383+
sas = self.start_sas_session()
381384

382385
# Find the version of 9.4 we are using
383386
self._sasver = sas.sasver
@@ -585,19 +588,23 @@ def __init__(self, **kwds):
585588
self._python_api_exists = True
586589

587590
self._session_options = kwds
588-
589-
# Create the session
590-
try:
591-
self._sas_session = self._sas.CAS(**self._session_options)
592-
except:
593-
self._sas_session = None
591+
self._sas_session = None
594592

595593
def __del__(self):
596594
# Close the session, if we created one
597595
if self._sas_session:
598596
self._sas_session.close()
599597
del self._sas_session
600598

599+
def start_sas_session(self):
600+
if self._sas_session is None:
601+
# Create (and cache) the session
602+
try:
603+
self._sas_session = self._sas.CAS(**self._session_options)
604+
except:
605+
pass
606+
return self._sas_session
607+
601608
def _uploadMpsFile(self, s, unique):
602609
# Declare a unique table name for the mps table
603610
mpsdata_table_name = "mps" + unique

pyomo/solvers/tests/checks/test_SAS.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
Suffix,
2727
)
2828
from pyomo.opt.results import SolverStatus, TerminationCondition, ProblemSense
29-
from pyomo.opt import SolverFactory, check_available_solvers
29+
from pyomo.opt import SolverFactory
3030
import warnings
3131

3232
CFGFILE = os.environ.get("SAS_CFG_FILE_PATH", None)
@@ -38,7 +38,10 @@
3838
}
3939

4040

41-
sas_available = check_available_solvers("sas")
41+
try:
42+
sas94_available = SolverFactory('_sas94').available()
43+
except:
44+
sas94_available = False
4245

4346

4447
class SASTestAbc:
@@ -292,7 +295,7 @@ def test_solver_with_milp(self):
292295
)
293296

294297

295-
@unittest.skipIf(not sas_available, "The SAS solver is not available")
298+
@unittest.skipIf(not sas94_available, "The SAS94 solver interface is not available")
296299
class SASTestLP94(SASTestLP, unittest.TestCase):
297300
@mock.patch(
298301
"pyomo.solvers.plugins.solvers.SAS.SAS94.sas_version",
@@ -325,7 +328,7 @@ def test_solver_error(self, submit_mock, symget_mock):
325328
self.assertEqual(results.solver.status, SolverStatus.error)
326329

327330

328-
# @unittest.skipIf(not sas_available, "The SAS solver is not available")
331+
# @unittest.skipIf(not sascas_available, "The SAS solver is not available")
329332
@unittest.skip("Tests not yet configured for SAS Viya interface.")
330333
class SASTestLPCAS(SASTestLP, unittest.TestCase):
331334
solver_io = "_sascas"
@@ -526,13 +529,13 @@ def test_solver_warmstart_capable(self):
526529
self.assertTrue(self.opt_sas.warm_start_capable())
527530

528531

529-
# @unittest.skipIf(not sas_available, "The SAS solver is not available")
532+
# @unittest.skipIf(not sas94_available, "The SAS solver is not available")
530533
@unittest.skip("MILP94 tests disabled.")
531534
class SASTestMILP94(SASTestMILP, unittest.TestCase):
532535
pass
533536

534537

535-
# @unittest.skipIf(not sas_available, "The SAS solver is not available")
538+
# @unittest.skipIf(not sascas_available, "The SAS solver is not available")
536539
@unittest.skip("Tests not yet configured for SAS Viya interface.")
537540
class SASTestMILPCAS(SASTestMILP, unittest.TestCase):
538541
solver_io = "_sascas"

0 commit comments

Comments
 (0)