diff --git a/pyomo/contrib/fbbt/fbbt.py b/pyomo/contrib/fbbt/fbbt.py index 047e1396efa..b8a2bf20c04 100644 --- a/pyomo/contrib/fbbt/fbbt.py +++ b/pyomo/contrib/fbbt/fbbt.py @@ -444,7 +444,7 @@ def _prop_bnds_leaf_to_root_GeneralExpression(node, bnds_dict, feasibility_tol): is more conservative). """ if node.expr.__class__ in native_types: - expr_lb = expr_up = node.expr + expr_lb = expr_ub = node.expr else: expr_lb, expr_ub = bnds_dict[node.expr] bnds_dict[node] = (expr_lb, expr_ub) diff --git a/pyomo/contrib/fbbt/tests/test_fbbt.py b/pyomo/contrib/fbbt/tests/test_fbbt.py index 5fafad4a992..5e8d656eeab 100644 --- a/pyomo/contrib/fbbt/tests/test_fbbt.py +++ b/pyomo/contrib/fbbt/tests/test_fbbt.py @@ -1317,6 +1317,20 @@ def test_external_function(self): self.assertAlmostEqual(m.y.lb, 0) self.assertAlmostEqual(m.y.ub, 3) + def test_named_expr(self): + m = pyo.ConcreteModel() + m.x = pyo.Var(bounds=(0, None)) + m.y = pyo.Var(bounds=(1, 6)) + m.e_const = pyo.Expression(expr=3) + m.e_var = pyo.Expression(expr=m.y + m.e_const) + + m.c = pyo.Constraint(expr=m.x**2 == m.e_var) + + self.tightener(m) + self.tightener(m) + self.assertAlmostEqual(m.x.lb, 2) + self.assertAlmostEqual(m.x.ub, 3) + class TestFBBT(FbbtTestBase, unittest.TestCase): def setUp(self) -> None: