def test_problematic(): a = Variable(val=2, name='a') with pytest.raises(ZeroDivisionError): t1 = Diff().auto_diff(function=div_zero, eval_point=[a]) with pytest.raises(NotImplementedError): t1 = Diff().hessian(functions=[add_function], eval_points=[a]) with pytest.raises(NotImplementedError): print(bm.arcsinh(1)) with pytest.raises(NotImplementedError): print(bm.arccosh(1)) with pytest.raises(NotImplementedError): print(bm.arctanh(1))
def test_non_alphabetical_22(): x = Variable(val=3, name='z') y = Variable(val=5, name='a') t1 = Diff().jacobian([f1,f2], [x,y]) assert(t1.shape == (2,2)) assert(t1[0][0] == 30) assert(t1[0][1] == 9) assert(t1[1][0] == 5) assert(t1[1][1] == bm.cos(5))
def test_jacobian_22(): x = Variable(val=3, name='x') y = Variable(val=5, name='y') t1 = Diff().jacobian([f1,f2], [x,y]) assert(t1.shape == (2,2)) assert(t1[0][0] == 30) assert(t1[0][1] == 9) assert(t1[1][0] == 5) assert(t1[1][1] == bm.cos(5))
def test_jacobian_32(): x = Variable(val=3, name='c') y = Variable(val=5, name='a') z = Variable(val=5, name='t') t1 = Diff().jacobian([f1,f2,f3], [x,y]) assert(t1.shape == (3,2)) assert(t1[0][0] == 30) assert(t1[0][1] == 9) assert(t1[1][0] == 5) assert(t1[1][1] == bm.cos(5)) assert(t1[2][0] == 5) assert(t1[2][1] == 4)
def test_jacobian_23(): x = Variable(val=3, name='x') y = Variable(val=5, name='y') z = Variable(val=2, name='z') t1 = Diff().jacobian([f1,f2], [x,y,z]) assert(t1.shape == (2,3)) assert(t1[0][0] == 30) assert(t1[0][1] == 9) assert(t1[0][2] == 1) assert(t1[1][0] == 5) assert(t1[1][1] == bm.cos(5)) assert(t1[0][2] == 1)
def test_more_operators(): a = Variable(val=4, name='a') # Power t1 = Diff().auto_diff(function=power_scalar, eval_point=[a]) assert (t1.val == 26) assert (t1.der['a'] == 8) # Square root t2 = Diff().auto_diff(function=sqrt_scalar, eval_point=[a]) assert (t2.val == 13) assert (t2.der['a'] == 1 / 3) # Power function t3 = Diff().auto_diff(function=power_function, eval_point=[a]) assert (t3.val == 16) assert (t3.der['a'] == bm.log(2) * 16) assert (t3.der['a'] == np.log(2) * 16) # Power function general t4 = Diff().auto_diff(function=power_function_general, eval_point=[a]) assert (t4.val == 256) assert (t4.der['a'] == 256 * (bm.log(4) + 1)) assert (t4.der['a'] == 256 * (np.log(4) + 1))
def test_sanity_checks(): assert (bm.log(4.1) == np.log(4.1)) assert (bm.exp(-10.1) == np.exp(-10.1)) assert (bm.sqrt(112.3) == np.sqrt(112.3)) assert (bm.sin(4.1) == np.sin(4.1)) assert (bm.cos(2.2) == np.cos(2.2)) assert (bm.tan(2) == np.tan(2.0)) assert (bm.arcsin(0) == np.arcsin(0)) assert (bm.arccos(0.2) == np.arccos(0.2)) assert (bm.arctan(2) == np.arctan(2)) assert (bm.sinh(2) == np.sinh(2)) assert (bm.cosh(2) == np.cosh(2)) assert (bm.tanh(2) == np.tanh(2)) assert (bm.logk(2, np.exp(1)) == np.log(2))
def logk_e(x): return bm.logk(x, bm.exp(1))
def cosh_fn(x, y): return -x * y * bm.cosh(x * y)
def sinh_cosh(x, y): return bm.sinh(x) + bm.cosh(y)
def logk_test(x): return bm.logk(x * x, base=10)
def sqrt_function(x, y): return bm.sqrt(x) + bm.sqrt(y)
def tan_function(x, y): return bm.tan(2 * x * y)
def arctan_fn(x, y): return -y * bm.arctan(x * y)
def sinh_fn(x, y): return -x * y * bm.sinh(x * y)
def arcsin_fn(x, y): return -y * bm.arcsin(x * y)
def arccos_fn(x, y): return -y * bm.arccos(x * y)
def tan_fn(x, y): return y * bm.tan(x * y)
def sin_cos(x, y): return y * bm.sin(x * x * x) + x * bm.cos(y)
def sqrt_fn(x, y): return x * bm.sqrt(x * y) + x * x * x
def sqrt_scalar(x): return 10 + bm.sqrt(2 * x + 1)
def tanh_fn(x, y): return -x * y * bm.tanh(x * y)
def log_exp_function(x, y): return bm.log(x) + bm.exp(y)
def tan_function(x): return bm.tan(2 * x)
def sin_cos(x, y): return bm.sin(x) + bm.cos(y)
def inverse_trig(x): # arcsin, arccos, arctan return bm.arcsin(x) - bm.arccos(x) + bm.arctan(x)
def inverse_trig(x, y, z): return bm.arcsin(x) - bm.arccos(y) + bm.arctan(z)
def logk_none(x): return bm.logk(x) + 40 - 40
def tanh(x, y): return bm.tanh(x * y)
def log_exp(x, y): return bm.log(x * x) + x * bm.exp(y)