Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
f2066ea
working on a model observer
michaelbynum May 18, 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
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
25c48e7
Merge branch 'main' into observer_gurobi_refactor
michaelbynum Aug 12, 2025
d718e9a
Merge branch 'main' into observer
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
1788ff3
dont free gurobi models twice
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
873f176
merge observer
michaelbynum Aug 14, 2025
a43a38b
forgot to inherit from PersistentSolverBase
michaelbynum Aug 16, 2025
e76baae
bug
michaelbynum Aug 16, 2025
c2a0177
bug
michaelbynum Aug 18, 2025
a424cfb
Minor changes - removing unused imports
mrmundt Aug 25, 2025
2c7208f
Merge branch 'main' into observer_gurobi_refactor
mrmundt Aug 26, 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
99ac089
Update pyomo/contrib/observer/model_observer.py
michaelbynum Oct 6, 2025
213d353
update check for unknown ctypes
michaelbynum Oct 6, 2025
065f43e
Merge remote-tracking branch 'michaelbynum/observer' into observer
michaelbynum Oct 6, 2025
ddf0a39
observer: use PauseGC()
michaelbynum Oct 6, 2025
643f546
Merge branch 'main' into observer
michaelbynum Oct 7, 2025
f569d43
observer: give reason for variable changes
michaelbynum Oct 9, 2025
be0e043
observer: variable bounds might depend on parameters
michaelbynum Oct 16, 2025
0739cf6
observer: imports
michaelbynum Oct 16, 2025
dfbdce0
refactoring observer
michaelbynum Oct 17, 2025
3408913
observer: refactor
michaelbynum Oct 21, 2025
9bee2bd
observer: typos
michaelbynum Oct 21, 2025
1568e1f
observer: bug
michaelbynum Oct 21, 2025
817f274
observer: update tests
michaelbynum Oct 21, 2025
a000db6
Merge remote-tracking branch 'origin/main' into observer
michaelbynum Oct 21, 2025
2d54b54
run black
michaelbynum Oct 21, 2025
036a320
observer typos
michaelbynum Oct 21, 2025
9b236b6
observer: more tests
michaelbynum Oct 21, 2025
ab3400f
run black
michaelbynum Oct 21, 2025
af51971
observer: update docstring
michaelbynum Oct 21, 2025
7d09c27
run black
michaelbynum Oct 21, 2025
880dfe8
observer: more tests
michaelbynum Oct 23, 2025
4cea685
run black
michaelbynum Oct 23, 2025
d96283e
Merge branch 'main' into observer
mrmundt Oct 27, 2025
2fbe49f
Merge remote-tracking branch 'origin/main' into observer
michaelbynum Oct 28, 2025
cfdf7d6
Merge remote-tracking branch 'michaelbynum/observer' into observer
michaelbynum Oct 28, 2025
6ccbaef
merge observer into observer_gurobi_refactor
michaelbynum Oct 28, 2025
cf000a1
directory for all gurobi interfaces
michaelbynum Nov 1, 2025
9abb4bf
merge main into observer_gurobi_refactor
michaelbynum Nov 1, 2025
7b20095
clean up gurobi interfaces
michaelbynum Nov 1, 2025
8edfb8f
Merge remote-tracking branch 'origin/main' into observer
michaelbynum Nov 1, 2025
43a864f
Merge branch 'observer' into observer_gurobi_refactor
michaelbynum Nov 1, 2025
5073ba0
update gurobi persistent to use observer
michaelbynum Nov 2, 2025
5e280dc
gurobi refactor: bugs
michaelbynum Nov 2, 2025
8bff218
run black
michaelbynum Nov 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: 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.
# ___________________________________________________________________________
118 changes: 118 additions & 0 deletions pyomo/contrib/observer/component_collector.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
# ___________________________________________________________________________
#
# 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
from pyomo.common.collections import ComponentSet


def handle_var(node, collector):
collector.variables.add(node)
return None


def handle_param(node, collector):
collector.params.add(node)
return None


def handle_named_expression(node, collector):
collector.named_expressions.add(node)
return None


def handle_external_function(node, collector):
collector.external_functions.add(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 = ComponentSet()
self.variables = ComponentSet()
self.params = ComponentSet()
self.external_functions = ComponentSet()
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 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 (
_visitor.named_expressions,
_visitor.variables,
_visitor.params,
_visitor.external_functions,
)
Loading
Loading