def test_cache(self): a = Leaf(3.0) b = 1 / a self.assertEqual(b.node.tid, ID_INV) c = 12.0 / sin(a) d = 12.0 - sin(a) self.assertEqual(id(c.node.childs[0].tid), id(d.node.childs[0].tid))
def test_sin(self): a = Leaf(2.0) c = sin(a) res = sparse_derivative([c], [a])[0][0].value self.assertEqual(res, math.cos(2.0)) del c self.assertEqual(a.node.ref_count, 1)
def test_a_bit_more(self): N = 10000 a, b = map(Leaf, (2.0, 3.0)) c = [sin(a + b) for _ in range(N)] dups = simplify(c) self.assertEqual(dups, 2 * N - 2) self.assertEqual(a.node.ref_count, 2)
def test_nested(self): N = 300 # not much more, stack would be exhausted c = a = Leaf(2.0) for _ in range(N): c = c + sin(a) dups = simplify(c) self.assertEqual(dups, N - 1) self.assertEqual(a.node.ref_count, 3)
def _do_calcs(self, a, b): av, bv = a.value, b.value self.assertEqual((a * b).value, av * bv) self.assertEqual((a / b).value, av / bv) self.assertEqual((a - b).value, av - bv) self.assertEqual((-a).value, -av) self.assertEqual((a ** b).value, av ** bv) self.assertEqual(sin(a).value, math.sin(av)) self.assertEqual(cos(a).value, math.cos(av)) self.assertEqual(tan(a).value, math.tan(av)) a.value = av = 0.6 self.assertEqual(asin(a).value, math.asin(av)) self.assertEqual(acos(a).value, math.acos(av)) self.assertEqual(atan(a).value, math.atan(av)) self.assertEqual(sinh(a).value, math.sinh(av)) self.assertEqual(cosh(a).value, math.cosh(av)) self.assertEqual(tanh(a).value, math.tanh(av)) self.assertEqual(sqrt(a).value, math.sqrt(av)) self.assertEqual(log(a).value, math.log(av)) self.assertEqual(exp(a).value, math.exp(av)) self.assertEqual(squ(a).value, av*av) self.assertEqual(inv(a).value, 1.0 / av)
def test_sparse(self): ind = [Leaf(i) for i in range(5)] dep = [ind[0] * ind[1], ind[3] + ind[4], ind[1] / ind[4], sin(ind[3])] deri = sparse_derivative(dep, ind) ref = { 0: { 0: 1.0, 1: 0.0 }, 1: { 3: 1.0, 4: 1.0 }, 2: { 1: 1 / 4, 4: -1 / 16 }, 3: { 3: math.cos(3) } } for d, di in deri.items(): for i, v in di.items(): self.assertAlmostEqual(v.value, ref[d][i], delta=1e-10)