def test_ge(): x = AutoDiff(2.0, 10.0) y = AutoDiff(2.0, 8.0) assert y >= x x = AutoDiff([1.0, 2.0], 10.0) y = AutoDiff([2.0, 2.0], 10.0) assert np.array_equal(y >= x, np.array([True, True])) x = AutoDiff([3.0, 1.0], 3.0) y = AutoDiff([2.0, 2.0], 10.0) assert np.array_equal(x >= y, np.array([True, False])) x = AutoDiff(1.0, 10.0) assert x >= 0 # Test for raising TypeError with pytest.raises(TypeError): x = AutoDiff([1.0, 2.0], 10.0) y = AutoDiff([2.0], 10.0) x >= y # Test for raising TypeError with pytest.raises(TypeError): x = AutoDiff([1.0, 2.0], 10.0) y = 2 x >= y
def test_le(): x = AutoDiff(1.0, 10.0) y = AutoDiff(2.0, 10.0) assert x <= y x = AutoDiff(2.0, 10.0) y = AutoDiff(2.0, 10.0) assert x <= y x = AutoDiff([1.0, 2.0], 10.0) y = AutoDiff([2.0, 2.0], 10.0) assert np.array_equal(x <= y, np.array([True, True])) x = AutoDiff(1.0, 10.0) assert x < 2 # Test for raising TypeError with pytest.raises(TypeError): x = AutoDiff([1.0, 2.0], 10.0) y = AutoDiff([2.0], 10.0) x <= y # Test for raising TypeError with pytest.raises(TypeError): x = AutoDiff([1.0, 2.0], 10.0) y = 2 x <= y
def test_rmul(): x = AutoDiff([8, 4], name='x') y = AutoDiff([9, 12], name='y') f1 = y * x assert np.array_equal(f1.val, np.array([72, 48])) assert np.array_equal(f1.der["x"], np.array([9, 12])) assert np.array_equal(f1.der["y"], np.array([8, 4]))
def test_equal(): x = AutoDiff(2.0, 10.0, "x") y = AutoDiff(2.0, 10.0, "y") assert x == y x = AutoDiff(2.0, name="x") y = 2 assert x == y
def test_sin(): x = AutoDiff(2, name="x") x1 = AutoDiff.sin(x) assert x1.val == [np.sin(2)] assert x1.der['x'] == [np.cos(2)] x = AutoDiff(2.0, 1.0, "x") f1 = AutoDiff.sin(3 * x + 2) assert f1.val == np.sin(8.0) assert f1.der["x"] == 3 * np.cos(8.0)
def test_exp_base(): x = AutoDiff(5.0, 1.0, "x") f1 = 3 * x + 2 f2 = AutoDiff.exp_base(f1, 4) assert f2.val == 4**17 assert f2.der["x"] == (4**17) * 3 * np.log(4) x = AutoDiff([-5.0, -1], 1.0, "x") f1 = 3 * x + 2 f2 = AutoDiff.exp_base(f1, 4) assert np.array_equal(f2.val, np.array([4**(-13), 0.25])) assert np.array_equal( f2.der["x"], np.array([4**(-13) * np.log(4) * 3, 0.25 * np.log(4) * 3]))
def test_truediv(): x = AutoDiff(4, 3, "x") f1 = x / 2.0 assert f1.val == 2.0 assert f1.der["x"] == 1.5 x = AutoDiff(2, name="x") f2 = x / x assert f2.val == [1] assert f2.der['x'] == [0] x = AutoDiff([16, 0], name="x") y = AutoDiff([8, -1], name="y") f3 = x / y assert np.array_equal(f3.val, np.array([2, 0])) assert np.array_equal(f3.der['x'], np.array([0.125, -1.0])) assert np.array_equal(f3.der['y'], np.array([-0.25, -0.0]))
def test_vector(): # handling multiple input; each input is a vector; multiple functions x = AutoDiff([3, 1, 9], name='x') y = AutoDiff([5, 2, 4], name='y') f1 = (2 * x ** (-2)) + (3 * y ** 4) f2 = AutoDiff.cos(x + (4 * y ** 2)) v = Vector_Forward([f1, f2]) assert np.array_equal(v.val()[0], np.array([16877/9, np.cos(103)])) assert np.array_equal(v.val()[1], np.array([50, np.cos(17)])) assert np.array_equal(v.val()[2], np.array([62210/81, np.cos(73)])) index_x = v.jacobian()[0].index("x") index_y = v.jacobian()[0].index("y") assert np.array_equal(v.jacobian()[1][0][:, index_x], np.array([-4/27, -np.sin(103)])) assert np.array_equal(v.jacobian()[1][1][:, index_x], np.array([-4, -np.sin(17)])) assert np.array_equal(v.jacobian()[1][2][:, index_x], np.array([-4/729, -np.sin(73)])) assert np.array_equal(v.jacobian()[1][0][:, index_y], np.array([12*(5**3), -40*np.sin(103)])) assert np.array_equal(v.jacobian()[1][1][:, index_y], np.array([96, -16*np.sin(17)])) assert np.array_equal(v.jacobian()[1][2][:, index_y], np.array([12*(4**3), -32*np.sin(73)]))
def test_sub(): x = AutoDiff(5, 10, "x") f1 = x - 100 assert f1.val == -95 assert f1.der["x"] == 10 x = AutoDiff(5, [10, 11], "x") f1 = x - 100 assert f1.val == -95 assert np.array_equal(f1.der["x"], np.array([10, 11])) x = AutoDiff([8, 4], [10, 11], 'x') y = AutoDiff([9, 12], [20, 33], 'y') f1 = x - y assert np.array_equal(f1.val, np.array([-1, -8])) assert np.array_equal(f1.der["x"], np.array([10, 11])) assert np.array_equal(f1.der["y"], np.array([-20, -33])) # Test TypeError with pytest.raises(TypeError): x = AutoDiff(5, 10, "x") f1 = x - 'InvalidInput'
def test_add(): x = AutoDiff(5, 10, "x") f1 = x + 100 assert f1.val == 105 assert f1.der["x"] == 10 x = AutoDiff(5, [10, 11], "x") f1 = x + 100 assert f1.val == 105 assert np.array_equal(f1.der["x"], np.array([10, 11])) x = AutoDiff([8, 4], [10, 11], 'x') y = AutoDiff([9, 12], [20, 33], 'y') f1 = x + y assert np.array_equal(f1.val, np.array([17, 16])) assert np.array_equal(f1.der["x"], np.array([10, 11])) assert np.array_equal(f1.der["y"], np.array([20, 33])) # Test TypeError with pytest.raises(TypeError): x = AutoDiff(5, 10, "x") f1 = x + 'InvalidInput'
def test_unequal(): x = AutoDiff(4.0, 10.0) y = AutoDiff(2.0, 10.0) assert x != y x = AutoDiff(4.0, 10.0) assert x != 2 x = AutoDiff([2.0, 2.0], 10.0) y = AutoDiff(2.0, 10.0) assert x != y x = AutoDiff([1.0, 2.0], 10.0) y = AutoDiff([2.0, 3, 4], 10.0) assert x != y
def test_complicated_func(): tol = 1e-4 x = AutoDiff(2.0, name="x") f1 = AutoDiff.sin((AutoDiff.cos(x)**2.0 + x**2.0)**0.5) assert abs(f1.val - 0.890643) < tol assert abs(f1.der["x"] - (-0.529395)) < tol x = AutoDiff([1.0, 3.0, 5.0, 7.0], name="x") f2 = AutoDiff.sin(AutoDiff.ln(x) + (3 * x**2) + (2 * x) + 7) assert np.array_equal( f2.val, np.array([ np.sin(12), np.sin(40 + np.log(3)), np.sin(92 + np.log(5)), np.sin(168 + np.log(7)) ])) assert np.array_equal( f2.der["x"], np.array([ 9 * np.cos(12), 61 / 3 * np.cos(40 + np.log(3)), 161 / 5 * np.cos(92 + np.log(5)), 309 / 7 * np.cos(168 + np.log(7)) ])) x = AutoDiff([-1.0, -3.0, -5.0, -7.0, 0.1], name="x") f3 = AutoDiff.logistic(AutoDiff.tan(x) + (3 * x**(-2)) + (2 * x) + 7) assert np.less( abs(f3.val - np.array([ 1 / (1 + np.exp(np.tan(1) - 8)), 1 / (1 + np.exp(np.tan(3) - 4 / 3)), 1 / (1 + np.exp(np.tan(5) + 72 / 25)), 1 / (1 + np.exp(np.tan(7) + 340 / 49)), 1 ])), np.ones((5, 1)) * tol).all() assert np.less( abs(f3.der["x"] - np.array([0.018135, 0.49104, 3.40145666, 0.001531, 0])), np.ones((5, 1)) * tol).all()
def test_mul(): x = AutoDiff(5, 30, "x") f1 = x * 5 assert f1.val == 25 assert f1.der["x"] == 150 x = AutoDiff(5, 15, "x") y = AutoDiff(2, 3, "y") result = x * y assert result.val == 10 assert result.der["x"] == 30 assert result.der["y"] == 15 x = AutoDiff([8, 4], name='x') y = AutoDiff([9, 12], name='y') f1 = x * y assert np.array_equal(f1.val, np.array([72, 48])) assert np.array_equal(f1.der["x"], np.array([9, 12])) assert np.array_equal(f1.der["y"], np.array([8, 4])) # Test TypeError with pytest.raises(TypeError): x = AutoDiff(5, 10, "x") f1 = x * 'InvalidInput'
def test_logistic(): tol = 1e-6 x = AutoDiff(2, name="x") f = AutoDiff.logistic(x) assert f.val == [1 / (1 + np.exp(-2))] assert abs(f.der['x'] - np.exp(2) / ((1 + np.exp(2))**2)) < tol
def test_pow(): x = AutoDiff(2, 5, "x") f1 = x**2 assert f1.val == 4.0 assert f1.der["x"] == 20.0 x = AutoDiff(2, 1, "x") f2 = x**x assert f2.val == 4 assert f2.der["x"] == 4.0 * (np.log(x.val) + 1) x = AutoDiff(2, name="x") y = AutoDiff(4, name='y') f2 = x**y assert f2.val == 16 assert f2.der["x"] == 32 assert f2.der["y"] == 16 * np.log(2) x = AutoDiff(3, name='x') y = AutoDiff(4, name='y') f3 = (x**2) * (y**3) assert np.array_equal(f3.val, np.array([576])) assert np.array_equal(f3.der['x'], np.array([384])) assert np.array_equal(f3.der['y'], np.array([432])) tol = 1e-6 x = AutoDiff([3, 2], name='x') y = AutoDiff([-2, -5], name='y') f3 = (x**y) assert np.array_equal(f3.val, np.array([1 / 9, 2**(-5)])) assert np.array_equal(f3.der['x'], np.array([-2 * (3)**(-3), (-5) * (2)**(-6)])) assert np.less( abs(f3.der['y'] - np.array([1 / 9 * np.log(3), 2**(-5) * np.log(2)])), np.ones((2, 1)) * tol).all() tol = 1e-6 x = AutoDiff([3, 2], name='x') y = AutoDiff([-2], name='y') f3 = (x**y) assert np.array_equal(f3.val, np.array([1 / 9, 2**(-2)])) assert np.array_equal(f3.der['x'], np.array([-2 * (3)**(-3), (-2) * (2)**(-3)])) assert np.less( abs(f3.der['y'] - np.array([1 / 9 * np.log(3), 2**(-2) * np.log(2)])), np.ones((2, 1)) * tol).all() x = AutoDiff([8, 4], name='x') y = AutoDiff([9, 12], name='y') f4 = (x**2) * (y**3) assert np.array_equal(f4.val, np.array([46656, 27648])) assert np.array_equal(f4.der['x'], np.array([11664, 13824])) assert np.array_equal(f4.der['y'], np.array([15552, 6912])) # Test TypeError with pytest.raises(TypeError): x = AutoDiff(5, 10, "x") f1 = x**'InvalidInput'
def test_exp(): x = AutoDiff(5.0, 1.0, "x") f1 = 3 * x + 2 f2 = AutoDiff.exp(f1) assert f2.val == np.exp(17) assert f2.der["x"] == 3 * np.exp(17)
def test_log(): x = AutoDiff(5.0, 1.0, "x") f1 = 3 * x + 2 f2 = AutoDiff.log(f1, 4) assert f2.val == np.log(17) / np.log(4) assert f2.der["x"] == 3 / (np.log(4) * (17))
def test_tanh(): x = AutoDiff(5.0, 1.0, "x") f1 = 3 * x + 2 f2 = AutoDiff.tanh(f1) assert f2.val == np.tanh(17) assert f2.der["x"] == 3 / ((np.cosh(17))**2)
def test_rsub(): x = AutoDiff(5, 1, "x") f1 = 100 - x assert f1.val == 95 assert f1.der["x"] == -1
def test_rpow(): x = AutoDiff(2, name="x") f1 = 2**x assert f1.val == 4.0 assert f1.der["x"] == 4.0 * np.log(2) x = AutoDiff(2, name="x") y = AutoDiff(5, name="y") # use ** for two AutoDiff f2 = x.__rpow__(y) assert f2.val == 25.0 assert f2.der["x"] == 25.0 * np.log(5) assert f2.der["y"] == 10.0 x = AutoDiff([3, 2], name='x') y = AutoDiff([2], name='y') # use ** for two AutoDiff f3 = x.__rpow__(y) assert np.array_equal(f3.val, np.array([(2)**3, 4])) assert np.array_equal(f3.der['x'], np.array([(2)**3 * np.log(2), 4 * np.log(2)])) assert np.array_equal(f3.der['y'], np.array([12, 4])) # Test TypeError with pytest.raises(TypeError): x = AutoDiff(5, 10, "x") f1 = 'InvalidInput'**x
def test_rtruediv(): x_val = 2.0 x = AutoDiff(x_val, name="x") f1 = 2.0 / x assert f1.val == 2.0 / x_val assert f1.der["x"] == -0.5
def test_arccos(): tol = 1e-6 x = AutoDiff(0.5, name="x") f = AutoDiff.arccos(x) assert f.val == np.arccos(0.5) assert abs(f.der["x"] + 1.1547) < tol
def test_sqrt(): x = AutoDiff(5.0, 1.0, "x") f1 = 3 * x + 2 f2 = AutoDiff.sqrt(f1) assert f2.val == (17)**0.5 assert f2.der["x"] == 3 / (2 * (17**0.5))
def test_arctan(): tol = 1e-6 x = AutoDiff(0.5, name="x") f = AutoDiff.arctan(x) assert f.val == np.arctan(0.5) assert abs(f.der["x"] - 0.8) < tol
def test_ln(): x = AutoDiff(5.0, 1.0, "x") f1 = 3 * x + 2 f2 = AutoDiff.ln(f1) assert f2.val == np.log(17) assert f2.der["x"] == (1 / 17) * 3
def test_radd(): x = AutoDiff(3, 10, "x") f1 = 100 + x assert f1.val == 103 assert f1.der["x"] == 10
def test_neg(): x = AutoDiff(2.0, 10.0, "x") f1 = -x assert f1.val == -2.0 assert f1.der["x"] == -10.0
def test_cosh(): x = AutoDiff(5.0, 1.0, "x") f1 = 3 * x + 2 f2 = AutoDiff.cosh(f1) assert f2.val == np.cosh(17) assert f2.der["x"] == 3 * np.sinh(17)
def test_init_fail(): with pytest.raises(TypeError): x = AutoDiff('InvalidInput')