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
« prev ^ index » next coverage.py v6.5.0, created at 2022-11-22 19:44 -0500
1from typing import TypeVar
3import numpy as np
4import pytest
6from Adifpy.differentiate import elementary_functions as ef
7from Adifpy.differentiate.dual_number import DualNumber
8from Adifpy.differentiate.forward_mode import forward_mode
11class TestForwardMode(DualNumber):
12 """Test class for forward mode"""
14 def test_forward_mode(self):
15 """Test basic forward mode method functionality"""
16 def f(x): return x + 1
18 with pytest.raises(ValueError):
19 # Invalid number of arguments
20 forward_mode(f, 0.5, 2, 3)
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)
28 fm = forward_mode(f, 0.45, 1)
30 # Return value
31 assert isinstance(fm, tuple)
32 float(fm[0])
33 float(fm[1])
35 def test_elementary_functions(self):
36 """Test elementary functions used in forward mode"""
38 # Constant function
39 assert forward_mode(lambda x: 1, 1, 1) == 1, 0
41 # Exp
42 assert forward_mode(ef.exp, 0.5, 3) == np.exp(0.5), np.exp(0.5) * 3
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
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
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