def test_atan(self): a = Leaf(0.6) c = atan(a) res = Derivative([c], [a])[0, 0].value self.assertEqual(res, 1 / (1 + 0.6 * 0.6)) del c self.assertEqual(a.node.ref_count, 1)
def test_cos(self): a = Leaf(2.0) c = cos(a) res = Derivative([c], [a])[0, 0].value self.assertEqual(res, -math.sin(2.0)) del c self.assertEqual(a.node.ref_count, 1)
def test_acos(self): a = Leaf(0.6) c = acos(a) res = Derivative([c], [a])[0, 0].value self.assertEqual(res, -(1 - 0.36)**-0.5) del c self.assertEqual(a.node.ref_count, 1)
def test_log(self): a = Leaf(4.0) c = log(a) res = Derivative([c], [a])[0, 0].value self.assertEqual(res, 0.25) del c self.assertEqual(a.node.ref_count, 1)
def test_sqrt(self): a = Leaf(9.0) c = sqrt(a) res = Derivative([c], [a])[0, 0].value self.assertEqual(res, 1.0 / 6.0) del c self.assertEqual(a.node.ref_count, 1)
def test_inv(self): a = Leaf(2.0) c = inv(a) res = Derivative([c], [a])[0, 0].value self.assertEqual(res, -0.25) del c self.assertEqual(a.node.ref_count, 1)
def test_neg(self): a = Leaf(13.0) c = -a res = Derivative([c], [a])[0, 0].value self.assertEqual(res, -1.0) del c self.assertEqual(a.node.ref_count, 1)
def test_tanh(self): a = Leaf(2.0) c = tanh(a) res = Derivative([c], [a])[0, 0].value self.assertEqual(res, math.cosh(2.0)**-2) del c self.assertEqual(a.node.ref_count, 1)
def test_hook2(self): a = Leaf(1.0) b = exp(a) b_plain = b.plain() c = Derivative([b, b_plain], [a]).value self.assertEqual(c[0][0], b.value) self.assertEqual(c[1][0], 0.0)
def test_squ(self): a = Leaf(13.0) c = a * a d = squ(a) res = Derivative([c, d], [a]).value self.assertListEqual(res, [[26.0], [26.0]]) del c, d self.assertEqual(a.node.ref_count, 1)
def test_div(self): a, b = Leaf(6.0), Leaf(4.0) c = a / b res = Derivative([c], [a, b])[0].value self.assertListEqual(res, [0.25, -0.375]) del c self.assertEqual(a.node.ref_count, 1) self.assertEqual(b.node.ref_count, 1)
def test_mul(self): a, b = Leaf(11.0), Leaf(7.0) c = a * b res = Derivative([c], [a, b])[0].value self.assertListEqual(res, [7.0, 11.0]) del c self.assertEqual(a.node.ref_count, 1) self.assertEqual(b.node.ref_count, 1)
def test_pow(self): a, b = Leaf(3.0), Leaf(4.0) c = a**b res = Derivative([c], [a, b])[0].value self.assertListEqual(res, [108.0, 81 * math.log(3.0)]) del c self.assertEqual(a.node.ref_count, 1) self.assertEqual(b.node.ref_count, 1)
def test_sel(self): a, b = Leaf(13.0), Leaf(4.0) c = a.select(b) d = Derivative([c], [a, b]) self.assertListEqual(d.value, [[1.0, 0.0]]) b.value = -1.0 d[0][0].invalidate() self.assertListEqual(d.value, [[0.0, 0.0]]) del c, d self.assertEqual(a.node.ref_count, 1) self.assertEqual(b.node.ref_count, 1)
def test_empanadina(self): def func(x): y = x**6 J = 6 * x**5 return y, J a = Leaf(2.0) b = sqrt(a) y = empanadina(func, b) self.assertAlmostEqual(y.value, 8.0) self.assertAlmostEqual(Derivative([y], [a])[0, 0].value, 12.0)
def test_multiple(self): a, b, c, d, e = map(Leaf, range(5)) f = (a + b) * c g = b * b h = d * e i = h + f ref = [[2.0, 2.0, 1.0, 0.0], [0.0, 2.0, 0.0, 0.0], [0.0, 0.0, 0.0, 4.0], [2.0, 2.0, 1.0, 4.0]] res = Derivative([f, g, h, i], [a, b, c, d]).value self.assertListEqual(res, ref)
def test_empanada(self): from math import sin as fsin, cos as fcos, exp as fexp, sqrt as fsqrt def func(x): a, b = x c = fexp(a + b) y = [a, a * fsin(b), c] J = [[1.0, 0.0], [fsin(b), a * fcos(b)], [c, c]] return y, J x = Leaf(2.0) z = [x * x, sqrt(x)] y = empanada(func, z, dim_out=3) dydx = Derivative(y, [x]).value dydx = [entry[0] for entry in dydx] ref = [ 4.0, 4 * fsin(fsqrt(2)) + fsqrt(2) * fcos(fsqrt(2)), (4 + 0.5 / fsqrt(2)) * fexp(4 + fsqrt(2)) ] for r1, r2 in zip(dydx, ref): self.assertAlmostEqual(r1, r2)