Coverage for Adifpy/test/test_forward_mode.py: 26%

34 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2022-11-22 19:44 -0500

1from typing import TypeVar 

2 

3import numpy as np 

4import pytest 

5 

6from Adifpy.differentiate import elementary_functions as ef 

7from Adifpy.differentiate.dual_number import DualNumber 

8from Adifpy.differentiate.forward_mode import forward_mode 

9 

10 

11class TestForwardMode(DualNumber): 

12 """Test class for forward mode""" 

13 

14 def test_forward_mode(self): 

15 """Test basic forward mode method functionality""" 

16 def f(x): return x + 1 

17 

18 with pytest.raises(ValueError): 

19 # Invalid number of arguments 

20 forward_mode(f, 0.5, 2, 3) 

21 

22 # Invalid argument types 

23 forward_mode(4, f, 0.5) 

24 forward_mode(f, f, 1) 

25 forward_mode(f, '3', 1) 

26 forward_mode(None, 2, 1) 

27 

28 fm = forward_mode(f, 0.45, 1) 

29 

30 # Return value 

31 assert isinstance(fm, tuple) 

32 float(fm[0]) 

33 float(fm[1]) 

34 

35 def test_elementary_functions(self): 

36 """Test elementary functions used in forward mode""" 

37 

38 # Constant function 

39 assert forward_mode(lambda x: 1, 1, 1) == 1, 0 

40 

41 # Exp 

42 assert forward_mode(ef.exp, 0.5, 3) == np.exp(0.5), np.exp(0.5) * 3 

43 

44 # Trig functions 

45 assert forward_mode(ef.sin, 0.5, 3) == np.sin(0.5), np.cos(0.5) * 3 

46 assert forward_mode(ef.cos, 0.5, 3) == np.cos(0.5), -np.sin(0.5) * 3 

47 assert forward_mode(ef.tan, 0.5, 3) == np.tan( 

48 0.5), (1 / pow(np.cos(0.5), 2)) * 3 

49 assert forward_mode(ef.arcsin, 0.5, 3) == np.arcsin( 

50 0.5), pow(1 - pow(0.5, 2), -1 / 2) * 3 

51 assert forward_mode(ef.arccos, 0.5, 3) == np.arccos( 

52 0.5), -pow(1 - pow(0.5, 2), -1 / 2) * 3 

53 assert forward_mode(ef.arctan, 0.5, 3) == np.arctan( 

54 0.5), 1 / (1 + pow(0.5, 2)) * 3 

55 

56 # Hyperbolic Trig functions 

57 assert forward_mode(ef.sinh, 0.5, 3) == np.sinh(0.5), np.cosh(0.5) * 3 

58 assert forward_mode(ef.cosh, 0.5, 3) == np.cosh(0.5), np.sinh(0.5) * 3 

59 assert forward_mode(ef.tanh, 0.5, 3) == np.tanh( 

60 0.5), 1 - pow(np.tanh(0.5), 2) * 3 

61 

62 # Inverse Hyperbolic Trig functions 

63 assert forward_mode(ef.arcsinh, 0.5, 3) == np.arcsinh( 

64 0.5), pow(pow(0.5, 2) + 1, -1 / 2) * 3 

65 assert forward_mode(ef.arccosh, 0.5, 3) == np.arccosh( 

66 0.5), pow(pow(0.5, 2) - 1, -1 / 2) * 3 

67 assert forward_mode(ef.arctanh, 0.5, 3) == np.arctanh( 

68 0.5), pow(1 - pow(0.5, 2), -1) * 3