From 9bbb8871d7407574bf22d25e52f4553d3f9da53e Mon Sep 17 00:00:00 2001 From: Miranda Mundt Date: Thu, 7 Mar 2024 11:23:25 -0700 Subject: [PATCH 1/2] Standardize subprocess_timeout import to 2; move to a central location --- pyomo/contrib/appsi/solvers/ipopt.py | 3 ++- pyomo/contrib/solver/ipopt.py | 6 +++--- pyomo/opt/base/__init__.py | 2 ++ pyomo/solvers/plugins/solvers/CONOPT.py | 4 ++-- pyomo/solvers/plugins/solvers/CPLEX.py | 10 ++++++++-- pyomo/solvers/plugins/solvers/GLPK.py | 3 ++- pyomo/solvers/plugins/solvers/IPOPT.py | 4 ++-- pyomo/solvers/plugins/solvers/SCIPAMPL.py | 4 ++-- 8 files changed, 23 insertions(+), 13 deletions(-) diff --git a/pyomo/contrib/appsi/solvers/ipopt.py b/pyomo/contrib/appsi/solvers/ipopt.py index 29e74f81c98..82f851ce02c 100644 --- a/pyomo/contrib/appsi/solvers/ipopt.py +++ b/pyomo/contrib/appsi/solvers/ipopt.py @@ -42,6 +42,7 @@ import os from pyomo.contrib.appsi.cmodel import cmodel_available from pyomo.core.staleflag import StaleFlagManager +from pyomo.opt.base import subprocess_timeout logger = logging.getLogger(__name__) @@ -158,7 +159,7 @@ def available(self): def version(self): results = subprocess.run( [str(self.config.executable), '--version'], - timeout=1, + timeout=subprocess_timeout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, diff --git a/pyomo/contrib/solver/ipopt.py b/pyomo/contrib/solver/ipopt.py index dc632adb184..8c5e13a534e 100644 --- a/pyomo/contrib/solver/ipopt.py +++ b/pyomo/contrib/solver/ipopt.py @@ -9,6 +9,7 @@ # This software is distributed under the 3-clause BSD License. # ___________________________________________________________________________ +import logging import os import subprocess import datetime @@ -38,8 +39,7 @@ from pyomo.core.expr.numvalue import value from pyomo.core.base.suffix import Suffix from pyomo.common.collections import ComponentMap - -import logging +from pyomo.opt.base import subprocess_timeout logger = logging.getLogger(__name__) @@ -229,7 +229,7 @@ def version(self, config=None): else: results = subprocess.run( [str(pth), '--version'], - timeout=1, + timeout=subprocess_timeout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, diff --git a/pyomo/opt/base/__init__.py b/pyomo/opt/base/__init__.py index 8d11114dd09..c625c09d1c0 100644 --- a/pyomo/opt/base/__init__.py +++ b/pyomo/opt/base/__init__.py @@ -22,3 +22,5 @@ from pyomo.opt.base.results import ReaderFactory, AbstractResultsReader from pyomo.opt.base.problem import AbstractProblemWriter, BranchDirection, WriterFactory from pyomo.opt.base.formats import ProblemFormat, ResultsFormat, guess_format + +subprocess_timeout = 2 diff --git a/pyomo/solvers/plugins/solvers/CONOPT.py b/pyomo/solvers/plugins/solvers/CONOPT.py index 89ee3848805..bde68d32c55 100644 --- a/pyomo/solvers/plugins/solvers/CONOPT.py +++ b/pyomo/solvers/plugins/solvers/CONOPT.py @@ -16,7 +16,7 @@ from pyomo.common.collections import Bunch from pyomo.common.tempfiles import TempfileManager -from pyomo.opt.base import ProblemFormat, ResultsFormat +from pyomo.opt.base import ProblemFormat, ResultsFormat, subprocess_timeout from pyomo.opt.base.solvers import _extract_version, SolverFactory from pyomo.opt.results import SolverStatus from pyomo.opt.solver import SystemCallSolver @@ -79,7 +79,7 @@ def _get_version(self): return _extract_version('') results = subprocess.run( [solver_exec], - timeout=1, + timeout=subprocess_timeout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, diff --git a/pyomo/solvers/plugins/solvers/CPLEX.py b/pyomo/solvers/plugins/solvers/CPLEX.py index b2b8c5e988d..f7a4774b073 100644 --- a/pyomo/solvers/plugins/solvers/CPLEX.py +++ b/pyomo/solvers/plugins/solvers/CPLEX.py @@ -21,7 +21,13 @@ from pyomo.common.tempfiles import TempfileManager from pyomo.common.collections import ComponentMap, Bunch -from pyomo.opt.base import ProblemFormat, ResultsFormat, OptSolver, BranchDirection +from pyomo.opt.base import ( + ProblemFormat, + ResultsFormat, + OptSolver, + BranchDirection, + subprocess_timeout, +) from pyomo.opt.base.solvers import _extract_version, SolverFactory from pyomo.opt.results import ( SolverResults, @@ -404,7 +410,7 @@ def _get_version(self): return _extract_version('') results = subprocess.run( [solver_exec, '-c', 'quit'], - timeout=1, + timeout=subprocess_timeout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, diff --git a/pyomo/solvers/plugins/solvers/GLPK.py b/pyomo/solvers/plugins/solvers/GLPK.py index 39948d465f4..2e09aae1668 100644 --- a/pyomo/solvers/plugins/solvers/GLPK.py +++ b/pyomo/solvers/plugins/solvers/GLPK.py @@ -29,6 +29,7 @@ SolutionStatus, ProblemSense, ) +from pyomo.opt.base import subprocess_timeout from pyomo.opt.base.solvers import _extract_version from pyomo.opt.solver import SystemCallSolver from pyomo.solvers.mockmip import MockMIP @@ -137,7 +138,7 @@ def _get_version(self, executable=None): [executable, "--version"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, - timeout=1, + timeout=subprocess_timeout, universal_newlines=True, ) return _extract_version(result.stdout) diff --git a/pyomo/solvers/plugins/solvers/IPOPT.py b/pyomo/solvers/plugins/solvers/IPOPT.py index deda4314a52..84017a7596e 100644 --- a/pyomo/solvers/plugins/solvers/IPOPT.py +++ b/pyomo/solvers/plugins/solvers/IPOPT.py @@ -16,7 +16,7 @@ from pyomo.common.collections import Bunch from pyomo.common.tempfiles import TempfileManager -from pyomo.opt.base import ProblemFormat, ResultsFormat +from pyomo.opt.base import ProblemFormat, ResultsFormat, subprocess_timeout from pyomo.opt.base.solvers import _extract_version, SolverFactory from pyomo.opt.results import SolverStatus, SolverResults, TerminationCondition from pyomo.opt.solver import SystemCallSolver @@ -79,7 +79,7 @@ def _get_version(self): return _extract_version('') results = subprocess.run( [solver_exec, "-v"], - timeout=1, + timeout=subprocess_timeout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, diff --git a/pyomo/solvers/plugins/solvers/SCIPAMPL.py b/pyomo/solvers/plugins/solvers/SCIPAMPL.py index be7415a19ef..50191d82e5e 100644 --- a/pyomo/solvers/plugins/solvers/SCIPAMPL.py +++ b/pyomo/solvers/plugins/solvers/SCIPAMPL.py @@ -18,7 +18,7 @@ from pyomo.common.collections import Bunch from pyomo.common.tempfiles import TempfileManager -from pyomo.opt.base import ProblemFormat, ResultsFormat +from pyomo.opt.base import ProblemFormat, ResultsFormat, subprocess_timeout from pyomo.opt.base.solvers import _extract_version, SolverFactory from pyomo.opt.results import ( SolverStatus, @@ -103,7 +103,7 @@ def _get_version(self, solver_exec=None): return _extract_version('') results = subprocess.run( [solver_exec, "--version"], - timeout=1, + timeout=subprocess_timeout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, From 78431b71f895aa87c875d811b5e05cd933ba4f8a Mon Sep 17 00:00:00 2001 From: Miranda Mundt Date: Thu, 7 Mar 2024 12:01:07 -0700 Subject: [PATCH 2/2] Change implementation: make private-esque attribute that user can alter --- pyomo/contrib/appsi/solvers/ipopt.py | 4 ++-- pyomo/contrib/solver/ipopt.py | 4 ++-- pyomo/opt/base/__init__.py | 2 -- pyomo/opt/solver/shellcmd.py | 1 + pyomo/solvers/plugins/solvers/CONOPT.py | 4 ++-- pyomo/solvers/plugins/solvers/CPLEX.py | 10 ++-------- pyomo/solvers/plugins/solvers/GLPK.py | 4 ++-- pyomo/solvers/plugins/solvers/IPOPT.py | 4 ++-- pyomo/solvers/plugins/solvers/SCIPAMPL.py | 4 ++-- 9 files changed, 15 insertions(+), 22 deletions(-) diff --git a/pyomo/contrib/appsi/solvers/ipopt.py b/pyomo/contrib/appsi/solvers/ipopt.py index 82f851ce02c..54e21d333e5 100644 --- a/pyomo/contrib/appsi/solvers/ipopt.py +++ b/pyomo/contrib/appsi/solvers/ipopt.py @@ -42,7 +42,6 @@ import os from pyomo.contrib.appsi.cmodel import cmodel_available from pyomo.core.staleflag import StaleFlagManager -from pyomo.opt.base import subprocess_timeout logger = logging.getLogger(__name__) @@ -148,6 +147,7 @@ def __init__(self, only_child_vars=False): self._primal_sol = ComponentMap() self._reduced_costs = ComponentMap() self._last_results_object: Optional[Results] = None + self._version_timeout = 2 def available(self): if self.config.executable.path() is None: @@ -159,7 +159,7 @@ def available(self): def version(self): results = subprocess.run( [str(self.config.executable), '--version'], - timeout=subprocess_timeout, + timeout=self._version_timeout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, diff --git a/pyomo/contrib/solver/ipopt.py b/pyomo/contrib/solver/ipopt.py index 8c5e13a534e..edc5799ae20 100644 --- a/pyomo/contrib/solver/ipopt.py +++ b/pyomo/contrib/solver/ipopt.py @@ -39,7 +39,6 @@ from pyomo.core.expr.numvalue import value from pyomo.core.base.suffix import Suffix from pyomo.common.collections import ComponentMap -from pyomo.opt.base import subprocess_timeout logger = logging.getLogger(__name__) @@ -207,6 +206,7 @@ def __init__(self, **kwds): self._writer = NLWriter() self._available_cache = None self._version_cache = None + self._version_timeout = 2 def available(self, config=None): if config is None: @@ -229,7 +229,7 @@ def version(self, config=None): else: results = subprocess.run( [str(pth), '--version'], - timeout=subprocess_timeout, + timeout=self._version_timeout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, diff --git a/pyomo/opt/base/__init__.py b/pyomo/opt/base/__init__.py index c625c09d1c0..8d11114dd09 100644 --- a/pyomo/opt/base/__init__.py +++ b/pyomo/opt/base/__init__.py @@ -22,5 +22,3 @@ from pyomo.opt.base.results import ReaderFactory, AbstractResultsReader from pyomo.opt.base.problem import AbstractProblemWriter, BranchDirection, WriterFactory from pyomo.opt.base.formats import ProblemFormat, ResultsFormat, guess_format - -subprocess_timeout = 2 diff --git a/pyomo/opt/solver/shellcmd.py b/pyomo/opt/solver/shellcmd.py index 94117779237..baa0369e1d6 100644 --- a/pyomo/opt/solver/shellcmd.py +++ b/pyomo/opt/solver/shellcmd.py @@ -60,6 +60,7 @@ def __init__(self, **kwargs): # a solver plugin may not report execution time. self._last_solve_time = None self._define_signal_handlers = None + self._version_timeout = 2 if executable is not None: self.set_executable(name=executable, validate=validate) diff --git a/pyomo/solvers/plugins/solvers/CONOPT.py b/pyomo/solvers/plugins/solvers/CONOPT.py index bde68d32c55..3455eede67b 100644 --- a/pyomo/solvers/plugins/solvers/CONOPT.py +++ b/pyomo/solvers/plugins/solvers/CONOPT.py @@ -16,7 +16,7 @@ from pyomo.common.collections import Bunch from pyomo.common.tempfiles import TempfileManager -from pyomo.opt.base import ProblemFormat, ResultsFormat, subprocess_timeout +from pyomo.opt.base import ProblemFormat, ResultsFormat from pyomo.opt.base.solvers import _extract_version, SolverFactory from pyomo.opt.results import SolverStatus from pyomo.opt.solver import SystemCallSolver @@ -79,7 +79,7 @@ def _get_version(self): return _extract_version('') results = subprocess.run( [solver_exec], - timeout=subprocess_timeout, + timeout=self._version_timeout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, diff --git a/pyomo/solvers/plugins/solvers/CPLEX.py b/pyomo/solvers/plugins/solvers/CPLEX.py index f7a4774b073..9f876b2d0f8 100644 --- a/pyomo/solvers/plugins/solvers/CPLEX.py +++ b/pyomo/solvers/plugins/solvers/CPLEX.py @@ -21,13 +21,7 @@ from pyomo.common.tempfiles import TempfileManager from pyomo.common.collections import ComponentMap, Bunch -from pyomo.opt.base import ( - ProblemFormat, - ResultsFormat, - OptSolver, - BranchDirection, - subprocess_timeout, -) +from pyomo.opt.base import ProblemFormat, ResultsFormat, OptSolver, BranchDirection from pyomo.opt.base.solvers import _extract_version, SolverFactory from pyomo.opt.results import ( SolverResults, @@ -410,7 +404,7 @@ def _get_version(self): return _extract_version('') results = subprocess.run( [solver_exec, '-c', 'quit'], - timeout=subprocess_timeout, + timeout=self._version_timeout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, diff --git a/pyomo/solvers/plugins/solvers/GLPK.py b/pyomo/solvers/plugins/solvers/GLPK.py index 2e09aae1668..e6d8576489d 100644 --- a/pyomo/solvers/plugins/solvers/GLPK.py +++ b/pyomo/solvers/plugins/solvers/GLPK.py @@ -19,6 +19,7 @@ from pyomo.common import Executable from pyomo.common.collections import Bunch +from pyomo.common.errors import ApplicationError from pyomo.opt import ( SolverFactory, OptSolver, @@ -29,7 +30,6 @@ SolutionStatus, ProblemSense, ) -from pyomo.opt.base import subprocess_timeout from pyomo.opt.base.solvers import _extract_version from pyomo.opt.solver import SystemCallSolver from pyomo.solvers.mockmip import MockMIP @@ -138,7 +138,7 @@ def _get_version(self, executable=None): [executable, "--version"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, - timeout=subprocess_timeout, + timeout=self._version_timeout, universal_newlines=True, ) return _extract_version(result.stdout) diff --git a/pyomo/solvers/plugins/solvers/IPOPT.py b/pyomo/solvers/plugins/solvers/IPOPT.py index 84017a7596e..4ebbbc07d3b 100644 --- a/pyomo/solvers/plugins/solvers/IPOPT.py +++ b/pyomo/solvers/plugins/solvers/IPOPT.py @@ -16,7 +16,7 @@ from pyomo.common.collections import Bunch from pyomo.common.tempfiles import TempfileManager -from pyomo.opt.base import ProblemFormat, ResultsFormat, subprocess_timeout +from pyomo.opt.base import ProblemFormat, ResultsFormat from pyomo.opt.base.solvers import _extract_version, SolverFactory from pyomo.opt.results import SolverStatus, SolverResults, TerminationCondition from pyomo.opt.solver import SystemCallSolver @@ -79,7 +79,7 @@ def _get_version(self): return _extract_version('') results = subprocess.run( [solver_exec, "-v"], - timeout=subprocess_timeout, + timeout=self._version_timeout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, diff --git a/pyomo/solvers/plugins/solvers/SCIPAMPL.py b/pyomo/solvers/plugins/solvers/SCIPAMPL.py index 50191d82e5e..fd69954b428 100644 --- a/pyomo/solvers/plugins/solvers/SCIPAMPL.py +++ b/pyomo/solvers/plugins/solvers/SCIPAMPL.py @@ -18,7 +18,7 @@ from pyomo.common.collections import Bunch from pyomo.common.tempfiles import TempfileManager -from pyomo.opt.base import ProblemFormat, ResultsFormat, subprocess_timeout +from pyomo.opt.base import ProblemFormat, ResultsFormat from pyomo.opt.base.solvers import _extract_version, SolverFactory from pyomo.opt.results import ( SolverStatus, @@ -103,7 +103,7 @@ def _get_version(self, solver_exec=None): return _extract_version('') results = subprocess.run( [solver_exec, "--version"], - timeout=subprocess_timeout, + timeout=self._version_timeout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True,