Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
161 commits
Select commit Hold shift + click to select a range
e552439
Add first draft of SCIP persistent solving
Opt-Mucca Mar 18, 2024
6a14f10
Add SCIPPersistent to docs
Opt-Mucca Mar 18, 2024
c107909
Add SCIp to Github action scripts
Opt-Mucca Mar 19, 2024
e00ded8
Remove 5.0.0 specific version. Add conda to workflow
Opt-Mucca Mar 19, 2024
a0b6250
Standardise string formatting to fstring
Opt-Mucca Mar 19, 2024
d0816eb
Add parameter link to docstring
Opt-Mucca Mar 19, 2024
0e11f11
Remove redundant second objective sense check
Opt-Mucca Mar 19, 2024
068ec99
Clean up _post_solve with a helper function for status handling
Opt-Mucca Mar 19, 2024
63af6d8
Remove individual skip_test option
Opt-Mucca Mar 19, 2024
4075d9a
Update pyomo/solvers/plugins/solvers/scip_persistent.py
Opt-Mucca Mar 19, 2024
f55fcc5
Update from the black command
Opt-Mucca Mar 19, 2024
e2b49b2
Merge remote-tracking branch 'origin/main'
Opt-Mucca Mar 19, 2024
91eae7b
Fix typos
Opt-Mucca Mar 19, 2024
5ee2007
Replace trySol via more safe checkSol
Opt-Mucca Mar 19, 2024
f6ff092
Adds support for partial solution loading
Opt-Mucca Mar 20, 2024
e7ac980
Add error handling for setting non-linear objective
Opt-Mucca Mar 21, 2024
c90bb23
Merge branch 'main' into main
Opt-Mucca Apr 10, 2024
2540f65
Remove dual and rc loading for SCIP. Fix bug of ranged rows
Opt-Mucca Apr 19, 2024
9e5d944
Add safe con.body.constant check
Opt-Mucca Apr 19, 2024
f90dfad
Remove slack loading for SCIP
Opt-Mucca Apr 29, 2024
f703d1f
Remove dual loading test for SCIP
Opt-Mucca Apr 29, 2024
5c02d32
Remove slack for suffix in tests
Opt-Mucca Apr 29, 2024
8ebcf88
Remove TODO for nonlinear handling
Opt-Mucca Apr 29, 2024
236427f
Merge branch 'main' into main
mrmundt Apr 30, 2024
30d8cc6
Skip LP_trivial_constraints for SCIP persistent
Opt-Mucca Jun 13, 2024
8d787ae
Merge branch 'main' into main
Opt-Mucca Jun 13, 2024
30e5e65
Add transformation for add_cons with non float/int rhs e.g. np.int
Opt-Mucca Jun 13, 2024
9104a92
Add warning if type is converted. Tidy up logic
Opt-Mucca Jun 13, 2024
a0324af
Merge branch 'main' into main
blnicho Aug 6, 2024
cbcb96d
Merge branch 'main' into main
blnicho Oct 15, 2024
fecd201
Merge branch 'main' into main
mrmundt Oct 29, 2024
1a4663d
Merge branch 'main' into pr/3200
blnicho Nov 13, 2024
cadfe5c
Merge branch 'main' into main
blnicho Nov 19, 2024
f3f2d7c
Fix num. vars and cons from transformed. Silent warm start fail
Opt-Mucca Nov 20, 2024
e4cdc6e
Merge branch 'main' into main
blnicho Dec 10, 2024
f326493
Merge branch 'main' into main
blnicho Jan 27, 2025
d0df2fc
Merge branch 'main' into main
blnicho Feb 13, 2025
7b18354
Add minor changes
Opt-Mucca Feb 19, 2025
859a1b2
Merge branch 'main' into main
mrmundt Feb 19, 2025
9a6c3eb
Merge branch 'main' into main
mrmundt Mar 20, 2025
27e3d10
Change copyright 2024 to 2025
Opt-Mucca Mar 21, 2025
e916067
Merge branch 'main' into main
mrmundt Mar 24, 2025
ed2cf25
Merge branch 'main' into main
mrmundt Apr 16, 2025
5ea53cd
Merge branch 'main' into main
mrmundt Apr 22, 2025
f2066ea
working on a model observer
michaelbynum May 18, 2025
5aba506
Merge branch 'main' into main
mrmundt Jun 4, 2025
8caea1c
Merge branch 'main' into main
blnicho Jul 3, 2025
dbe63c0
Merge branch 'main' into main
mrmundt Jul 8, 2025
897c0ef
Merge remote-tracking branch 'origin/main' into observer
michaelbynum Jul 29, 2025
97aeb31
working on a model observer
michaelbynum Jul 30, 2025
a69d5e6
working on model change detector
michaelbynum Aug 6, 2025
9763e9a
observer
michaelbynum Aug 7, 2025
ff635b8
working on a model observer
michaelbynum Aug 8, 2025
b57ab07
updating solution loader
michaelbynum Aug 9, 2025
070811d
refactoring gurobi interfaces
michaelbynum Aug 9, 2025
27a3a14
Merge branch 'main' into observer_gurobi_refactor
michaelbynum Aug 10, 2025
d70dbb5
revert_gurobi_persistent
michaelbynum Aug 10, 2025
5b1d3f9
refactoring gurobi interfaces
michaelbynum Aug 11, 2025
4818130
refactoring gurobi interfaces
michaelbynum Aug 11, 2025
db0fda4
Apply black
mrmundt Aug 12, 2025
149ab06
Merge remote-tracking branch 'origin/main' into observer
michaelbynum Aug 12, 2025
42c8cc8
adding copyright statements
michaelbynum Aug 12, 2025
7998fda
refactoring gurobi interfaces
michaelbynum Aug 12, 2025
ccb6de4
Merge branch 'main' into observer
michaelbynum Aug 12, 2025
909be88
refactoring gurobi interfaces
michaelbynum Aug 12, 2025
862c387
bugs
michaelbynum Aug 12, 2025
8f7a61e
refactoring gurobi interfaces
michaelbynum Aug 12, 2025
92fa4f5
remove unused imports
michaelbynum Aug 12, 2025
8a9fc46
run black
michaelbynum Aug 12, 2025
7249b19
update solution loader
michaelbynum Aug 12, 2025
710807b
Merge remote-tracking branch 'origin/main' into solver_api
michaelbynum Aug 12, 2025
25c48e7
Merge branch 'main' into observer_gurobi_refactor
michaelbynum Aug 12, 2025
438b9b5
Merge remote-tracking branch 'michaelbynum/observer_gurobi_refactor' …
michaelbynum Aug 12, 2025
d718e9a
Merge branch 'main' into observer
michaelbynum Aug 12, 2025
ac42345
updating solution loader
michaelbynum Aug 12, 2025
df56887
Merge remote-tracking branch 'origin/main' into observer_gurobi_refactor
michaelbynum Aug 12, 2025
275d848
run black
michaelbynum Aug 12, 2025
cfa8633
Merge remote-tracking branch 'michaelbynum/observer_gurobi_refactor' …
michaelbynum Aug 12, 2025
70ca6e7
updating solution loader
michaelbynum Aug 13, 2025
1788ff3
dont free gurobi models twice
michaelbynum Aug 13, 2025
5ec0421
Merge branch 'observer_gurobi_refactor' into solver_api
michaelbynum Aug 13, 2025
2885f42
update solution loader
michaelbynum Aug 13, 2025
23ba4d9
typo
michaelbynum Aug 13, 2025
14f928b
Merge remote-tracking branch 'michaelbynum/observer' into observer
michaelbynum Aug 13, 2025
d7b9918
update observer tests
michaelbynum Aug 13, 2025
c313fe5
run black
michaelbynum Aug 13, 2025
d16bee5
adding tests for trivial constraints and fixing bugs
michaelbynum Aug 14, 2025
873f176
merge observer
michaelbynum Aug 14, 2025
c62a7b3
Merge branch 'observer_gurobi_refactor' into solver_api
michaelbynum Aug 14, 2025
a4e2b81
run black
michaelbynum Aug 14, 2025
2001d15
Merge branch 'solver_api' into trivial_constraints
michaelbynum Aug 14, 2025
d25e721
run black
michaelbynum Aug 14, 2025
16ecce0
Merge remote-tracking branch 'opt_mucca/main' into scip
michaelbynum Aug 14, 2025
9e7cd0d
moving scip to contrib solvers
michaelbynum Aug 14, 2025
bf204bb
moving scip to contrib solvers
michaelbynum Aug 14, 2025
dabf031
porting scip interface
michaelbynum Aug 15, 2025
9601768
porting scip interface
michaelbynum Aug 15, 2025
9d2f22a
porting scip interface
michaelbynum Aug 15, 2025
b483729
bugs and tests
michaelbynum Aug 15, 2025
37a31a7
scip direct
michaelbynum Aug 15, 2025
a43a38b
forgot to inherit from PersistentSolverBase
michaelbynum Aug 16, 2025
1750fc5
merge in observer_gurobi_refactor
michaelbynum Aug 16, 2025
02f383d
Merge branch 'solver_api' into trivial_constraints
michaelbynum Aug 16, 2025
3e3509c
Merge branch 'trivial_constraints' into scip_port
michaelbynum Aug 16, 2025
e76baae
bug
michaelbynum Aug 16, 2025
413d63d
Merge branch 'observer_gurobi_refactor' into solver_api
michaelbynum Aug 16, 2025
3d302a1
Merge branch 'solver_api' into trivial_constraints
michaelbynum Aug 16, 2025
6603db6
Merge branch 'trivial_constraints' into scip_port
michaelbynum Aug 16, 2025
0b84dcc
more expression types for scip
michaelbynum Aug 18, 2025
865b622
Merge remote-tracking branch 'michaelbynum/scip_port' into scip_port
michaelbynum Aug 18, 2025
c2a0177
bug
michaelbynum Aug 18, 2025
0bbdd70
Merge branch 'observer_gurobi_refactor' into solver_api
michaelbynum Aug 18, 2025
ecd602d
Merge branch 'solver_api' into trivial_constraints
michaelbynum Aug 18, 2025
efdcd69
Merge branch 'trivial_constraints' into scip_port
michaelbynum Aug 18, 2025
3180462
capture_fd for scip
michaelbynum Aug 20, 2025
b522edd
Merge remote-tracking branch 'michaelbynum/scip_port' into scip_port
michaelbynum Aug 20, 2025
72912e0
working on persistent interface to scip
michaelbynum Aug 22, 2025
a424cfb
Minor changes - removing unused imports
mrmundt Aug 25, 2025
2c7208f
Merge branch 'main' into observer_gurobi_refactor
mrmundt Aug 26, 2025
cfa1e91
minor fixes
michaelbynum Sep 1, 2025
33f831a
observer updates
michaelbynum Sep 16, 2025
5f3f403
observer fixes
michaelbynum Sep 16, 2025
79e1b47
observer config updates
michaelbynum Sep 16, 2025
7275176
minor observer updates
michaelbynum Sep 16, 2025
823e15a
disable gc for expensive parts of observer
michaelbynum Sep 16, 2025
73258f5
minor observer updates
michaelbynum Sep 16, 2025
5a8a5a6
minor observer updates
michaelbynum Sep 16, 2025
22c9169
Merge branch 'main' into observer
michaelbynum Sep 16, 2025
321755a
minor observer updates
michaelbynum Sep 16, 2025
f8cfc33
Merge remote-tracking branch 'michaelbynum/observer' into observer
michaelbynum Sep 16, 2025
2adefbc
docstring for the model change detector
michaelbynum Sep 16, 2025
df26c4e
run black
michaelbynum Sep 16, 2025
2dc566e
some comments for the observer
michaelbynum Sep 16, 2025
6b2ffbd
only need to descend into named expressions once
michaelbynum Sep 16, 2025
e68ee73
only need to descend into named expressions once
michaelbynum Sep 16, 2025
82e40b2
update observer tests
michaelbynum Sep 17, 2025
ae7e031
run black
michaelbynum Sep 17, 2025
5778688
fix docs
michaelbynum Sep 17, 2025
cd1c4ef
observer updates
michaelbynum Sep 18, 2025
3f30893
observer updates
michaelbynum Sep 18, 2025
4f7e93e
Merge branch 'main' into observer
michaelbynum Oct 2, 2025
ac9d952
Merge remote-tracking branch 'michaelbynum/observer' into observer
michaelbynum Oct 2, 2025
dc19b17
observer: docstring updates
michaelbynum Oct 2, 2025
bb60959
observer: typos
michaelbynum Oct 2, 2025
19fecf7
merge in main and observer
michaelbynum Oct 2, 2025
31e7e97
Merge remote-tracking branch 'michaelbynum/observer_gurobi_refactor' …
michaelbynum Oct 2, 2025
576a217
run black
michaelbynum Oct 2, 2025
ce99fb2
observer improvements
michaelbynum Oct 4, 2025
066e4fd
run black
michaelbynum Oct 4, 2025
a96b518
merge observer_gurobi_refactor into solver_api
michaelbynum Oct 5, 2025
92e77ba
merge solver_api into trivial_constraints
michaelbynum Oct 5, 2025
281ddc3
merge trivial_constraints into scip_port
michaelbynum Oct 5, 2025
e6331df
persistent interface to scip
michaelbynum Oct 6, 2025
98e2c9a
update docs
michaelbynum Oct 6, 2025
f0be4ff
update docs
michaelbynum Oct 6, 2025
7ec95a8
persistent interface to scip
michaelbynum Oct 6, 2025
75903d6
persistent interface to scip
michaelbynum Oct 6, 2025
0051024
updating tests
michaelbynum Oct 6, 2025
b037b9c
forgot to delete/revert some files
michaelbynum Oct 6, 2025
c200e2e
run black
michaelbynum Oct 6, 2025
960c531
typos
michaelbynum Oct 6, 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
8 changes: 7 additions & 1 deletion .github/workflows/test_branches.yml
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,12 @@ jobs:
|| echo "WARNING: Xpress Community Edition is not available"
python -m pip install --cache-dir cache/pip maingopy \
|| echo "WARNING: MAiNGO is not available"
if [[ ${{matrix.python}} == pypy* ]]; then
echo "skipping SCIP for pypy"
else
python -m pip install --cache-dir cache/pip pyscipopt \
|| echo "WARNING: SCIP is not available"
fi
if [[ ${{matrix.python}} == pypy* ]]; then
echo "skipping wntr for pypy"
else
Expand Down Expand Up @@ -390,7 +396,7 @@ jobs:
TIMEOUT_MSG="TIMEOUT: killing conda install process"
PYVER=$(echo "py${{matrix.python}}" | sed 's/\.//g')
echo "Installing for $PYVER"
for PKG in 'cplex>=12.10' docplex gurobi "$XPRESS" cyipopt pymumps scip; do
for PKG in 'cplex>=12.10' docplex gurobi "$XPRESS" cyipopt pymumps scip pyscipopt; do
echo ""
echo "*** Install $PKG ***"
echo ""
Expand Down
8 changes: 7 additions & 1 deletion .github/workflows/test_pr_and_main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,12 @@ jobs:
|| echo "WARNING: Xpress Community Edition is not available"
python -m pip install --cache-dir cache/pip maingopy \
|| echo "WARNING: MAiNGO is not available"
if [[ ${{matrix.python}} == pypy* ]]; then
echo "skipping SCIP for pypy"
else
python -m pip install --cache-dir cache/pip pyscipopt \
|| echo "WARNING: SCIP is not available"
fi
if [[ ${{matrix.python}} == pypy* ]]; then
echo "skipping wntr for pypy"
else
Expand Down Expand Up @@ -456,7 +462,7 @@ jobs:
TIMEOUT_MSG="TIMEOUT: killing conda install process"
PYVER=$(echo "py${{matrix.python}}" | sed 's/\.//g')
echo "Installing for $PYVER"
for PKG in 'cplex>=12.10' docplex gurobi "$XPRESS" cyipopt pymumps scip; do
for PKG in 'cplex>=12.10' docplex gurobi "$XPRESS" cyipopt pymumps scip pyscipopt; do
echo ""
echo "*** Install $PKG ***"
echo ""
Expand Down
10 changes: 10 additions & 0 deletions pyomo/contrib/observer/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# ___________________________________________________________________________
#
# Pyomo: Python Optimization Modeling Objects
# Copyright (c) 2008-2025
# National Technology and Engineering Solutions of Sandia, LLC
# Under the terms of Contract DE-NA0003525 with National Technology and
# Engineering Solutions of Sandia, LLC, the U.S. Government retains certain
# rights in this software.
# This software is distributed under the 3-clause BSD License.
# ___________________________________________________________________________
117 changes: 117 additions & 0 deletions pyomo/contrib/observer/component_collector.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# ___________________________________________________________________________
#
# Pyomo: Python Optimization Modeling Objects
# Copyright (c) 2008-2025
# National Technology and Engineering Solutions of Sandia, LLC
# Under the terms of Contract DE-NA0003525 with National Technology and
# Engineering Solutions of Sandia, LLC, the U.S. Government retains certain
# rights in this software.
# This software is distributed under the 3-clause BSD License.
# ___________________________________________________________________________

from pyomo.core.expr.visitor import StreamBasedExpressionVisitor
from pyomo.core.expr.numeric_expr import (
ExternalFunctionExpression,
NegationExpression,
PowExpression,
MaxExpression,
MinExpression,
ProductExpression,
MonomialTermExpression,
DivisionExpression,
SumExpression,
Expr_ifExpression,
UnaryFunctionExpression,
AbsExpression,
)
from pyomo.core.expr.relational_expr import (
RangedExpression,
InequalityExpression,
EqualityExpression,
)
from pyomo.core.base.var import VarData, ScalarVar
from pyomo.core.base.param import ParamData, ScalarParam
from pyomo.core.base.expression import ExpressionData, ScalarExpression
from pyomo.repn.util import ExitNodeDispatcher
from pyomo.common.numeric_types import native_numeric_types


def handle_var(node, collector):
collector.variables[id(node)] = node
return None


def handle_param(node, collector):
collector.params[id(node)] = node
return None


def handle_named_expression(node, collector):
collector.named_expressions[id(node)] = node
return None


def handle_external_function(node, collector):
collector.external_functions[id(node)] = node
return None


def handle_skip(node, collector):
return None


collector_handlers = ExitNodeDispatcher()
collector_handlers[VarData] = handle_var
collector_handlers[ParamData] = handle_param
collector_handlers[ExpressionData] = handle_named_expression
collector_handlers[ScalarExpression] = handle_named_expression
collector_handlers[ExternalFunctionExpression] = handle_external_function
collector_handlers[NegationExpression] = handle_skip
collector_handlers[PowExpression] = handle_skip
collector_handlers[MaxExpression] = handle_skip
collector_handlers[MinExpression] = handle_skip
collector_handlers[ProductExpression] = handle_skip
collector_handlers[MonomialTermExpression] = handle_skip
collector_handlers[DivisionExpression] = handle_skip
collector_handlers[SumExpression] = handle_skip
collector_handlers[Expr_ifExpression] = handle_skip
collector_handlers[UnaryFunctionExpression] = handle_skip
collector_handlers[AbsExpression] = handle_skip
collector_handlers[RangedExpression] = handle_skip
collector_handlers[InequalityExpression] = handle_skip
collector_handlers[EqualityExpression] = handle_skip


class _ComponentFromExprCollector(StreamBasedExpressionVisitor):
def __init__(self, **kwds):
self.named_expressions = {}
self.variables = {}
self.params = {}
self.external_functions = {}
super().__init__(**kwds)

def exitNode(self, node, data):
if type(node) in native_numeric_types:
# we need this here to handle numpy
# (we can't put numpy in the dispatcher?)
return None
return collector_handlers[node.__class__](node, self)

def beforeChild(self, node, child, child_idx):
if id(child) in self.named_expressions:
return False, None
return True, None


_visitor = _ComponentFromExprCollector()


def collect_components_from_expr(expr):
_visitor.__init__()
_visitor.walk_expression(expr)
return (
list(_visitor.named_expressions.values()),
list(_visitor.variables.values()),
list(_visitor.params.values()),
list(_visitor.external_functions.values()),
)
Loading
Loading