Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
0537f5f
Add 'SolutionStatus.unknown'
jsiirola Nov 15, 2025
516685b
Rework SOL file parser to be self-contained
jsiirola Nov 15, 2025
4935a63
Rework solution loaders for improved efficiency/consistency
jsiirola Nov 18, 2025
ddd525b
Allow constructing "empty" NLWriterInfo objects
jsiirola Nov 18, 2025
05919bf
Refactor Ipopt solve() to simplify logic and break apart monster func…
jsiirola Nov 18, 2025
f6bdc82
Raise correct exception when Ipopt fails to return a solution
jsiirola Nov 18, 2025
22e6458
NFC: line wrapping
jsiirola Nov 18, 2025
732ccc9
Update / extend Ipopt testing
jsiirola Nov 18, 2025
2832869
NFC: typos
jsiirola Nov 18, 2025
6562296
Fix logic for verifying the length of the iteration log
jsiirola Nov 18, 2025
82bd2d5
Shorten the temporary file names
jsiirola Nov 28, 2025
0ff622f
More updates / simplifications of ippot log parser
jsiirola Nov 28, 2025
a991e9b
Save the Ipopt command line in the results object
jsiirola Nov 28, 2025
8c107d9
bugfix: imports (plus sort them)
jsiirola Nov 28, 2025
1657948
NFC: update comment
jsiirola Nov 28, 2025
1f176d5
Move available/version cache to class method
jsiirola Nov 29, 2025
4c772f4
Merge _create_command_line, _verify_options, and _write_options_file
jsiirola Nov 29, 2025
21dca81
Add 'delete=' option to context mkstemp/mkdtemp
jsiirola Dec 1, 2025
1bee4dc
Switch to using tempfile to generate solver inputs
jsiirola Dec 1, 2025
c1cb704
Simplify how we process options (single pass, direct to string)
jsiirola Dec 1, 2025
9268b3f
Make version identification more robust
jsiirola Dec 1, 2025
503c219
NFC: update comments, report log parse time
jsiirola Dec 1, 2025
6cd177b
Record solver name earlier
jsiirola Dec 1, 2025
6ab1cd5
Simplify processing timer/timeout options
jsiirola Dec 1, 2025
8b6ce80
Make nlwriter instance ephemeral; reduce writer config copies
jsiirola Dec 1, 2025
225e772
bugfix: local var name
jsiirola Dec 2, 2025
19fe4a9
Move options processing to one location
jsiirola Dec 2, 2025
bad7a1a
There shouldn't be a solution loader if there is no solution
jsiirola Dec 2, 2025
3e182b8
Expand ipopt interface testing
jsiirola Dec 2, 2025
a32a07b
Add a standard test for external functions
jsiirola Dec 2, 2025
849e649
Rename sol reader to emphasize it reads ASL sol files
jsiirola Dec 2, 2025
6088d31
Rename sol_reader -> asl_sol_reader
jsiirola Dec 2, 2025
85ff4e1
Fix test failures on Windows
jsiirola Dec 2, 2025
9937f42
Remove legacy typing classes
jsiirola Dec 2, 2025
8074593
Minor cleanup to make logic more clear
jsiirola Dec 2, 2025
e2ac142
NFC: update comments
jsiirola Dec 2, 2025
c465356
NFC: typo
jsiirola Dec 2, 2025
ee93237
Merge branch 'main' into ipopt-sol-parser
jsiirola Dec 2, 2025
ad25548
Update timezone references from UTC to timezone.utc
jsiirola Dec 2, 2025
ac35d76
NFC: apply black
jsiirola Dec 2, 2025
4c9e4d1
Resolve Windows test failure (open file handle)
jsiirola Dec 2, 2025
88816e0
Resolve bad regex
jsiirola Dec 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions pyomo/common/tempfiles.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ def __enter__(self):
def __exit__(self, exc_type, exc_val, exc_tb):
self.release()

def mkstemp(self, suffix=None, prefix=None, dir=None, text=False):
def mkstemp(self, suffix=None, prefix=None, dir=None, text=False, delete=True):
"""Create a unique temporary file using :func:`tempfile.mkstemp`

Parameters are handled as in :func:`tempfile.mkstemp`, with
Expand All @@ -289,10 +289,11 @@ def mkstemp(self, suffix=None, prefix=None, dir=None, text=False):
dir = self._resolve_tempdir(dir)
# Note: ans == (fd, fname)
ans = tempfile.mkstemp(suffix=suffix, prefix=prefix, dir=dir, text=text)
self.tempfiles.append(ans)
if delete:
self.tempfiles.append(ans)
return ans

def mkdtemp(self, suffix=None, prefix=None, dir=None):
def mkdtemp(self, suffix=None, prefix=None, dir=None, delete=True):
"""Create a unique temporary directory using :func:`tempfile.mkdtemp`

Parameters are handled as in :func:`tempfile.mkdtemp`, with
Expand All @@ -307,7 +308,8 @@ def mkdtemp(self, suffix=None, prefix=None, dir=None):
"""
dir = self._resolve_tempdir(dir)
dname = tempfile.mkdtemp(suffix=suffix, prefix=prefix, dir=dir)
self.tempfiles.append((None, dname))
if delete:
self.tempfiles.append((None, dname))
return dname

def gettempdir(self):
Expand Down
26 changes: 26 additions & 0 deletions pyomo/common/tests/test_tempfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,32 @@ def test_mkstemp(self):
os.close(fd)
context.release()

def test_mktemp_delete(self):
with self.TM.new_context() as context:
dname = context.mkdtemp()
with self.TM.new_context() as subcontext:
fd, fname1 = subcontext.mkstemp(dir=dname)
fd, fname2 = subcontext.mkstemp(dir=dname, delete=False)
# Note: because the context manager isn't going to
# delete fname2, we need to explicitly close the file
# here...
os.close(fd)
dname1 = subcontext.mkdtemp(dir=dname)
dname2 = subcontext.mkdtemp(dir=dname, delete=False)

self.assertTrue(os.path.exists(fname1))
self.assertTrue(os.path.exists(fname2))
self.assertTrue(os.path.exists(dname1))
self.assertTrue(os.path.exists(dname2))
self.assertFalse(os.path.exists(fname1))
self.assertTrue(os.path.exists(fname2))
self.assertFalse(os.path.exists(dname1))
self.assertTrue(os.path.exists(dname2))
self.assertFalse(os.path.exists(fname1))
self.assertFalse(os.path.exists(fname2))
self.assertFalse(os.path.exists(dname1))
self.assertFalse(os.path.exists(dname2))

def test_create_tempdir(self):
context = self.TM.push()
fname = self.TM.create_tempdir("suffix", "prefix")
Expand Down
6 changes: 6 additions & 0 deletions pyomo/contrib/solver/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,10 @@
version='6.9.2',
)

moved_module(
'pyomo.contrib.solver.solvers.sol_reader',
'pyomo.contrib.solver.solvers.asl_sol_reader',
version='6.10.0.dev0',
)

del _module, moved_module
3 changes: 3 additions & 0 deletions pyomo/contrib/solver/common/results.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@ class SolutionStatus(enum.Enum):
solutions was returned.
"""

unknown = 5
"Solution returned, but feasibility/optimality unknown."

infeasible = 10
"Solution point does not satisfy some domains and/or constraints."

Expand Down
5 changes: 5 additions & 0 deletions pyomo/contrib/solver/common/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@
from pyomo.core.base.objective import Objective


class SolverError(PyomoException):
"""General error raised by Pyomo solver interfaces when processing
Solver results."""


class NoFeasibleSolutionError(PyomoException):
default_message = (
'A feasible solution was not found, so no solution can be loaded. '
Expand Down
Loading
Loading