diff --git a/pyomo/solvers/plugins/solvers/SAS.py b/pyomo/solvers/plugins/solvers/SAS.py index d7b09e29fde..572f091a9e6 100644 --- a/pyomo/solvers/plugins/solvers/SAS.py +++ b/pyomo/solvers/plugins/solvers/SAS.py @@ -195,7 +195,9 @@ def _presolve(self, *args, **kwds): def available(self, exception_flag=False): """True if the solver is available""" - return self._python_api_exists + if not self._python_api_exists: + return False + return self.start_sas_session() is not None def _has_integer_variables(self): """True if the problem has integer variables.""" @@ -285,12 +287,7 @@ def __init__(self, **kwds): # Store other options for the SAS session self._session_options = kwds - - # Create the session - try: - self._sas_session = self._sas.SASsession(**self._session_options) - except: - self._sas_session = None + self._sas_session = None def __del__(self): # Close the session, if we created one @@ -314,6 +311,15 @@ def _create_statement_str(self, statement): def sas_version(self): return self._sasver + def start_sas_session(self): + if self._sas_session is None: + # Create (and cache) the session + try: + self._sas_session = self._sas.SASsession(**self._session_options) + except: + pass + return self._sas_session + def _apply_solver(self): """ "Prepare the options and run the solver. Then store the data to be returned.""" logger.debug("Running SAS") @@ -374,10 +380,7 @@ def _apply_solver(self): sas_options = "option notes nonumber nodate nosource pagesize=max;" # Get the current SAS session, submit the code and return the results - if not self._sas_session: - sas = self._sas_session = self._sas.SASsession(**self._session_options) - else: - sas = self._sas_session + sas = self.start_sas_session() # Find the version of 9.4 we are using self._sasver = sas.sasver @@ -585,12 +588,7 @@ def __init__(self, **kwds): self._python_api_exists = True self._session_options = kwds - - # Create the session - try: - self._sas_session = self._sas.CAS(**self._session_options) - except: - self._sas_session = None + self._sas_session = None def __del__(self): # Close the session, if we created one @@ -598,6 +596,15 @@ def __del__(self): self._sas_session.close() del self._sas_session + def start_sas_session(self): + if self._sas_session is None: + # Create (and cache) the session + try: + self._sas_session = self._sas.CAS(**self._session_options) + except: + pass + return self._sas_session + def _uploadMpsFile(self, s, unique): # Declare a unique table name for the mps table mpsdata_table_name = "mps" + unique diff --git a/pyomo/solvers/tests/checks/test_SAS.py b/pyomo/solvers/tests/checks/test_SAS.py index 6dd662bdb21..65f466508e8 100644 --- a/pyomo/solvers/tests/checks/test_SAS.py +++ b/pyomo/solvers/tests/checks/test_SAS.py @@ -26,7 +26,7 @@ Suffix, ) from pyomo.opt.results import SolverStatus, TerminationCondition, ProblemSense -from pyomo.opt import SolverFactory, check_available_solvers +from pyomo.opt import SolverFactory import warnings CFGFILE = os.environ.get("SAS_CFG_FILE_PATH", None) @@ -38,7 +38,10 @@ } -sas_available = check_available_solvers("sas") +try: + sas94_available = SolverFactory('_sas94').available() +except: + sas94_available = False class SASTestAbc: @@ -292,7 +295,7 @@ def test_solver_with_milp(self): ) -@unittest.skipIf(not sas_available, "The SAS solver is not available") +@unittest.skipIf(not sas94_available, "The SAS94 solver interface is not available") class SASTestLP94(SASTestLP, unittest.TestCase): @mock.patch( "pyomo.solvers.plugins.solvers.SAS.SAS94.sas_version", @@ -325,7 +328,7 @@ def test_solver_error(self, submit_mock, symget_mock): self.assertEqual(results.solver.status, SolverStatus.error) -# @unittest.skipIf(not sas_available, "The SAS solver is not available") +# @unittest.skipIf(not sascas_available, "The SAS solver is not available") @unittest.skip("Tests not yet configured for SAS Viya interface.") class SASTestLPCAS(SASTestLP, unittest.TestCase): solver_io = "_sascas" @@ -526,13 +529,13 @@ def test_solver_warmstart_capable(self): self.assertTrue(self.opt_sas.warm_start_capable()) -# @unittest.skipIf(not sas_available, "The SAS solver is not available") +# @unittest.skipIf(not sas94_available, "The SAS solver is not available") @unittest.skip("MILP94 tests disabled.") class SASTestMILP94(SASTestMILP, unittest.TestCase): pass -# @unittest.skipIf(not sas_available, "The SAS solver is not available") +# @unittest.skipIf(not sascas_available, "The SAS solver is not available") @unittest.skip("Tests not yet configured for SAS Viya interface.") class SASTestMILPCAS(SASTestMILP, unittest.TestCase): solver_io = "_sascas"