Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 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
2c7208f
Merge branch 'main' into observer_gurobi_refactor
mrmundt Aug 26, 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.
# ___________________________________________________________________________
81 changes: 81 additions & 0 deletions pyomo/contrib/observer/component_collector.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# ___________________________________________________________________________
#
# 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,
NPV_ExternalFunctionExpression,
)
from pyomo.core.base.var import VarData, ScalarVar
from pyomo.core.base.param import ParamData, ScalarParam
from pyomo.core.base.expression import ExpressionData, ScalarExpression


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


collector_handlers = {
VarData: handle_var,
ScalarVar: handle_var,
ParamData: handle_param,
ScalarParam: handle_param,
ExpressionData: handle_named_expression,
ScalarExpression: handle_named_expression,
ExternalFunctionExpression: handle_external_function,
NPV_ExternalFunctionExpression: handle_external_function,
}


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):
nt = type(node)
if nt in collector_handlers:
return collector_handlers[nt](node, self)
else:
return 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