def test_reverse_mul(): x1 = sad.AutoDiffReverse(4, 'x1') x2 = sad.AutoDiffReverse(3, 'x2') f = x1 * 2 assert f.der['x1'] == pytest.approx(2.0) f = 2 * x1 assert f.der['x1'] == pytest.approx(2.0) f = x1 * x2 assert f.der['x1'] == pytest.approx(3.0) assert f.der['x2'] == pytest.approx(4.0)
def test_reverse_backpass(): # Currently this test is implemented to raise KeyError # the test passes when run outside pytest, but with pytest # there is some problem we weren't able to fix. with pytest.raises(KeyError): x1 = sad.AutoDiffReverse(4, 'x1') x2 = sad.AutoDiffReverse(7, 'x2') x3 = sad.AutoDiffReverse(3, 'x3') f = x1+2*x2-x3*4 assert f.val == 6 testdic = sad.reversepass(f.pass_table(),["x1","x2","x3"]) assert testdic == {'x1': 1, 'x2': 2, 'x3': -4} f.clear_table()
def test_reverse_add(): x1 = sad.AutoDiffReverse(4, 'x1') x2 = sad.AutoDiffReverse(3, 'x2') f = x1 + 1 assert f.der['x1'] == pytest.approx(1.0) f = 1 + x1 assert f.der['x1'] == pytest.approx(1.0) f = x1 + x2 assert f.der['x1'] == pytest.approx(1.0) assert f.der['x2'] == pytest.approx(1.0)
def test_reverse_div(): x1 = sad.AutoDiffReverse(4, 'x1') x2 = sad.AutoDiffReverse(3, 'x2') f = x1 / 2 assert f.der['x1'] == pytest.approx(0.5) f = 2 / x1 assert f.der['x1'] == pytest.approx(-2.0/(4**2)) f = x1 / x2 assert f.der['x1'] == pytest.approx(1/3) assert f.der['x2'] == pytest.approx(-4/(3**2))
def test_reverse_sub(): x1 = sad.AutoDiffReverse(4, 'x1') x2 = sad.AutoDiffReverse(3, 'x2') f = x1 - 1 assert f.der['x1'] == pytest.approx(1.0) f = 1 - x1 assert f.der['x1'] == pytest.approx(-1.0) f = x1 - x2 assert f.der['x1'] == pytest.approx(1.0) assert f.der['x2'] == pytest.approx(-1.0)
def test_reverse_pow(): x1 = sad.AutoDiffReverse(4, 'x1') f = x1 ** 2 assert f.der['x1'] == pytest.approx(8.0) f = 2 ** x1 assert f.der['x1'] == pytest.approx(2.0**4*np.log(2))
def _arccosR(x): """Returns the arccsine of the AutoDiffReverse object""" der = {x.var: 1 / -np.sqrt(1 - x.val**2)} return sad.AutoDiffReverse(np.arccos(x.val), None, der)
def _tanR(x): """Returns the rangent of the AutoDiffReverse object""" der = {x.var: 1 / (np.cos(x.val)**2)} return sad.AutoDiffReverse(np.tan(x.val), None, der)
def test_reverse_sin(): x1 = sad.AutoDiffReverse(4, 'x1') f = sad.sin(x1) assert f.der['x1'] == pytest.approx(np.cos(4))
def test_reverse_arccos(): x1 = sad.AutoDiffReverse(0.5, 'x1') f = sad.arccos(x1) assert f.der['x1'] == pytest.approx(1 / -np.sqrt(1 - 0.5 ** 2))
def _logR(x, base=math.e): """Returns the log of the AutoDiffReverse object""" der = {x.var: 1 / (x.val * math.log(base))} return sad.AutoDiffReverse(math.log(x.val, base), None, der)
def test_reverse_log10(): x1 = sad.AutoDiffReverse(4, 'x1') f = sad.log(x1, base=10) assert f.der['x1'] == pytest.approx(1 / (4 * math.log(10)))
def test_reverse_sqrt(): x1 = sad.AutoDiffReverse(4, 'x1') f = sad.sqrt(x1) assert f.der['x1'] == pytest.approx(1/4)
def test_reverse_log(): x1 = sad.AutoDiffReverse(4, 'x1') f = sad.log(x1) assert f.der['x1'] == pytest.approx(1 / (4 * math.log(math.e)))
def test_reverse_exp(): x1 = sad.AutoDiffReverse(4, 'x1') f = sad.exp(x1) assert f.der['x1'] == pytest.approx(np.exp(4))
def test_reverse_arctan(): x1 = sad.AutoDiffReverse(4, 'x1') f = sad.arctan(x1) assert f.der['x1'] == pytest.approx(1 / (1 + 4 * 4))
def _arctanR(x): """Returns the arctangent of the AutoDiffReverse object""" der = {x.var: 1 / (1 + x.val * x.val)} return sad.AutoDiffReverse(np.arctan(x.val), None, der)
def _tanhR(x): """Returns the sin_h of the AutoDiffReverse object""" der = {x.var: 1 / (cosh(x.val)**2)} der = Counter(der) return sad.AutoDiffReverse(np.tanh(x.val), None, der)
def _expR(x): """Returns the exp of the AutoDiffReverse object""" der = {x.var: np.exp(x.val)} return sad.AutoDiffReverse(np.exp(x.val), None, der)
def test_reverse_cosh(): x1 = sad.AutoDiffReverse(4, 'x1') f = sad.cosh(x1) assert f.der['x1'] == pytest.approx(-np.sinh(4))
def _coshR(x): """Returns the cos_h of the AutoDiffReverse object""" der = {x.var: -np.sinh(x.val)} der = Counter(der) return sad.AutoDiffReverse(np.cosh(x.val), None, der)
def test_reverse_tanh(): x1 = sad.AutoDiffReverse(4, 'x1') f = sad.tanh(x1) assert f.der['x1'] == pytest.approx(1 / (np.cosh(4) ** 2))
def _sinR(x): """Returns the sine of the AutoDiffReverse object""" der = {x.var: np.cos(x.val)} der = Counter(der) return sad.AutoDiffReverse(np.sin(x.val), None, der)
def test_reverse_neg(): x1 = sad.AutoDiffReverse(4, 'x1') f = -x1 assert f.der['x1'] == pytest.approx(-1.0)