def _hessian(xs, f_x_expr): hess = ComponentMap() df_dx_map = reverse_sd(f_x_expr) for x in xs: ddf_ddx_map = reverse_sd(df_dx_map[x]) hess[x] = ddf_ddx_map return hess
def test_cos(self): m = pe.ConcreteModel() m.x = pe.Var(initialize=2.0) e = pe.cos(m.x) derivs = reverse_ad(e) symbolic = reverse_sd(e) self.assertAlmostEqual(derivs[m.x], pe.value(symbolic[m.x]), tol+3) self.assertAlmostEqual(derivs[m.x], approx_deriv(e, m.x), tol)
def test_sum(self): m = pe.ConcreteModel() m.x = pe.Var(initialize=2.0) m.y = pe.Var(initialize=3.0) e = 2.0*m.x + 3.0*m.y - m.x*m.y derivs = reverse_ad(e) symbolic = reverse_sd(e) self.assertAlmostEqual(derivs[m.x], pe.value(symbolic[m.x]), tol+3) self.assertAlmostEqual(derivs[m.y], pe.value(symbolic[m.y]), tol+3) self.assertAlmostEqual(derivs[m.x], approx_deriv(e, m.x), tol) self.assertAlmostEqual(derivs[m.y], approx_deriv(e, m.y), tol)
def test_nested(self): m = pe.ConcreteModel() m.x = pe.Var(initialize=2) m.y = pe.Var(initialize=3) m.p = pe.Param(initialize=0.5, mutable=True) e = pe.exp(m.x**m.p + 3.2*m.y - 12) derivs = reverse_ad(e) symbolic = reverse_sd(e) self.assertAlmostEqual(derivs[m.x], pe.value(symbolic[m.x]), tol+3) self.assertAlmostEqual(derivs[m.y], pe.value(symbolic[m.y]), tol+3) self.assertAlmostEqual(derivs[m.p], pe.value(symbolic[m.p]), tol+3) self.assertAlmostEqual(derivs[m.x], approx_deriv(e, m.x), tol) self.assertAlmostEqual(derivs[m.y], approx_deriv(e, m.y), tol) self.assertAlmostEqual(derivs[m.p], approx_deriv(e, m.p), tol)
def test_expressiondata(self): m = pe.ConcreteModel() m.x = pe.Var(initialize=3) m.e = pe.Expression(expr=m.x * 2) @m.Expression([1, 2]) def e2(m, i): if i == 1: return m.x + 4 else: return m.x ** 2 m.o = pe.Objective(expr=m.e + 1 + m.e2[1] + m.e2[2]) derivs = reverse_ad(m.o.expr) symbolic = reverse_sd(m.o.expr) self.assertAlmostEqual(derivs[m.x], pe.value(symbolic[m.x]), tol)
def test_expressiondata(self): m = pe.ConcreteModel() m.x = pe.Var(initialize=3) m.e = pe.Expression(expr=m.x * 2) @m.Expression([1, 2]) def e2(m, i): if i == 1: return m.x + 4 else: return m.x**2 m.o = pe.Objective(expr=m.e + 1 + m.e2[1] + m.e2[2]) derivs = reverse_ad(m.o.expr) symbolic = reverse_sd(m.o.expr) self.assertAlmostEqual(derivs[m.x], pe.value(symbolic[m.x]), tol)
import pyomo.environ as pe from pyomo.contrib.derivatives.differentiate import reverse_ad, reverse_sd m = pe.ConcreteModel() m.x = pe.Var(initialize=2) m.y = pe.Var(initialize=3) m.p = pe.Param(initialize=0.5, mutable=True) e = pe.exp(m.x**m.p + 0.1*m.y) derivs = reverse_ad(e) print('dfdx: ', derivs[m.x]) print('dfdy: ', derivs[m.y]) print('dfdp: ', derivs[m.p]) derivs = reverse_sd(e) print('dfdx: ', derivs[m.x]) print('dfdy: ', derivs[m.y]) print('dfdp: ', derivs[m.p])
def _build_multivariate_underestimator(xs, f): df = reverse_sd(f) result = pyo.value(f) for x in xs: result += pyo.value(df[x]) * (x - x.value) return result