def test_inv(self): a = Leaf(2.0) c = inv(a) res = sparse_derivative([c], [a])[0][0].value self.assertEqual(res, -0.25) del c self.assertEqual(a.node.ref_count, 1)
def test_tanh(self): a = Leaf(2.0) c = tanh(a) res = sparse_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_sqrt(self): a = Leaf(9.0) c = sqrt(a) res = sparse_derivative([c], [a])[0][0].value self.assertEqual(res, 1.0 / 6.0) del c self.assertEqual(a.node.ref_count, 1)
def test_acos(self): a = Leaf(0.6) c = acos(a) res = sparse_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_atan(self): a = Leaf(0.6) c = atan(a) res = sparse_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_neg(self): a = Leaf(13.0) c = -a res = sparse_derivative([c], [a])[0][0].value self.assertEqual(res, -1.0) del c self.assertEqual(a.node.ref_count, 1)
def test_cos(self): a = Leaf(2.0) c = cos(a) res = sparse_derivative([c], [a])[0][0].value self.assertEqual(res, -math.sin(2.0)) del c self.assertEqual(a.node.ref_count, 1)
def test_pow(self): a, b = Leaf(3.0), Leaf(4.0) c = a**b res = sparse_derivative([c], [a, b]) res = [res[0][0].value, res[0][1].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_squ(self): a = Leaf(13.0) c = a * a d = squ(a) res = sparse_derivative([c, d], [a]) res = [res[0][0].value, res[1][0].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 = sparse_derivative([c], [a, b]) res = [res[0][0].value, res[0][1].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_sub(self): a, b = Leaf(11.0), Leaf(7.0) c = a - b res = sparse_derivative([c], [a, b]) res = [res[0][0].value, res[0][1].value] self.assertListEqual(res, [1.0, -1.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 = sparse_derivative([c], [a, b]) dv = [d[0][0].value, d[0][1].value] self.assertListEqual(dv, [1.0, 0.0]) b.value = -1.0 d[0][0].invalidate() self.assertEqual(d[0][0].value, 0.0) del c, d 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) print("Def a:", a.node.ref_count) c = a * b print("Def c:", a.node.ref_count) res = sparse_derivative([c], [a, b]) print("Der c:", a.node.ref_count) res = [res[0][0].value, res[0][1].value] self.assertListEqual(res, [7.0, 11.0]) print("Del res:", a.node.ref_count) del c print("Del c:", a.node.ref_count) self.assertEqual(a.node.ref_count, 1) self.assertEqual(b.node.ref_count, 1)
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)