def test_jacobian():
    ad1 = ad.AD_Object(1,'x', 2)
    ad2 = ad.AD_Object(1, {'x':'x', 'y':'y'},{'x':4, 'y':5})
    ad3 = ad.AD_Object(1, {'x':'x', 'y':'y'},{'x':6, 'y':7})\
    
    assert ad.jacobian(ad1, ['x']) == [2]
    res = ad.jacobian([ad1, ad2, ad3], ['x','y'])
    print(np.sum(res - np.array([[2, 0],[4,5],[6,7]])))
    assert np.sum(res - np.array([[2, 0],[4,5],[6,7]])) == 0
    with pytest.raises(TypeError):
        ad.jacobian(res, 'x')
def test_mul3():
    x = ad.AD_Object(2, "x", 1)
    y = ad.AD_Object(3, "y", 1)
    f = x*y 
    assert (f.derivative('x'), f.derivative('y'), f.val) == (3, 2, 6)
def test_sub3():
    x = ad.AD_Object(2, "x", 1)
    y = ad.AD_Object(3, "y", 1)
    f = 2*x**2 - y 
    assert (f.derivative('x'), f.derivative('y'), f.val) == (8, 1, 5)
def test_repr_AD_Object():
     ad1 = repr(ad.AD_Object(1, 'x'))
     val = 1
     der = 1
     assert ad1 == "AD Object: Value = %.3f, Derivative: d(x)= %.3f ; "%(val, der)
def test_AD_object_ge2():
    ad1 = ad.AD_Object(1,'x',1)
    with pytest.raises(AssertionError):
        ad1 >= 1
def test_AD_object_ge():
    ad1 = ad.AD_Object(1,'x',1)
    ad2 = ad.AD_Object(2,'x',1)
    assert(ad2 >= ad1)
def test_AD_object_le():
    ad1 = ad.AD_Object(1,'x',1)
    ad2 = ad.AD_Object(2,'x',1)
    assert(ad1 <= ad2)
def test_AD_object_eq4():
    ad1 = ad.AD_Object(1, 'x', 2)
    ad2 = ad.AD_Object(1, 'x', 4)
    assert((ad1 == ad2) == False)
def test_AD_object_derivative():
    with pytest.raises(AssertionError):
        ad1 = ad.AD_Object(1,'x')
        ad1.derivative(1)
def test_AD_object_eq3():
    ad1 = ad.AD_Object(1, 'x', 1)
    ad2 = ad.AD_Object(1, 'y', 1)
    assert((ad1 == ad2) == False)
def test_AD_object_input2():
    with pytest.raises(TypeError):
        ad1 = ad.AD_Object(value = 1, label = 'x', der_initial = '1')
def test_AD_object_input1():
    x = 1
    with pytest.raises(TypeError):
        ad1 = ad.AD_Object(value = 1, label = x, der_initial= 1)
def test_input_AD_Object():
    with pytest.raises(AssertionError):
        ad.AD_Object(value = '1', label = 'x')
def test_truediv3():
    x = ad.AD_Object(2, "x", 1)
    y = ad.AD_Object(1, "y", 1)
    f = x/y 
    assert (f.derivative('x'), f.derivative('y'), f.val) == (1, -2, 2)
def test_AD_object_ne():
    ad1 = ad.AD_Object(1,'x',1)
    ad1 == ad1
    assert((ad1 != ad1) == False)
def test_pow3():
    x = ad.AD_Object(2, "x", 1)
    y = ad.AD_Object(1, "y", 1)
    f = x**y 
    assert (f.derivative('x'), f.derivative('y'), f.val) == (1, 2*math.log(2), 2)
def test_sqrt():
    ad0 = ad.AD_eval('sqrt(x)','x', 4)
    ad1 = ad.AD_Object(4, 'x').sqrt()
    assert (ad0.derivative('x'), ad0.val) == (1/4,2)
    assert (ad1.der['x'], ad1.val) == (1/4,2)