Exemple #1
0
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
Exemple #2
0
 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)
Exemple #3
0
 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)
Exemple #4
0
 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)
Exemple #5
0
 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)
Exemple #6
0
 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)
Exemple #7
0
 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)
Exemple #8
0
    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)
Exemple #9
0
    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)
Exemple #10
0
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])
Exemple #11
0
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