From 4c13589c08a87f62c3362f30467854447338ae21 Mon Sep 17 00:00:00 2001 From: John Siirola Date: Wed, 18 Oct 2023 13:30:42 -0600 Subject: [PATCH] Track change in general expression API (use arg(0) and not expr). Fixes #2986 --- pyomo/core/expr/calculus/diff_with_pyomo.py | 2 +- pyomo/core/tests/unit/test_derivs.py | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pyomo/core/expr/calculus/diff_with_pyomo.py b/pyomo/core/expr/calculus/diff_with_pyomo.py index 952e8ec6dd3..0e3ba3cc2b2 100644 --- a/pyomo/core/expr/calculus/diff_with_pyomo.py +++ b/pyomo/core/expr/calculus/diff_with_pyomo.py @@ -328,7 +328,7 @@ def _diff_GeneralExpression(node, val_dict, der_dict): val_dict: ComponentMap der_dict: ComponentMap """ - der_dict[node.expr] += der_dict[node] + der_dict[node.arg(0)] += der_dict[node] def _diff_ExternalFunctionExpression(node, val_dict, der_dict): diff --git a/pyomo/core/tests/unit/test_derivs.py b/pyomo/core/tests/unit/test_derivs.py index 9e89f2beac9..23a5a8bc7d1 100644 --- a/pyomo/core/tests/unit/test_derivs.py +++ b/pyomo/core/tests/unit/test_derivs.py @@ -230,6 +230,17 @@ def e2(m, i): symbolic = reverse_sd(m.o.expr) self.assertAlmostEqual(derivs[m.x], pyo.value(symbolic[m.x]), tol) + def test_constant_named_expressions(self): + m = pyo.ConcreteModel() + m.x = pyo.Var(initialize=3) + m.e = pyo.Expression(expr=2) + + e = m.x * m.e + derivs = reverse_ad(e) + symbolic = reverse_sd(e) + self.assertAlmostEqual(derivs[m.x], pyo.value(symbolic[m.x]), tol + 3) + self.assertAlmostEqual(derivs[m.x], approx_deriv(e, m.x), tol) + def test_multiple_named_expressions(self): m = pyo.ConcreteModel() m.x = pyo.Var()