forked from CodeReclaimers/neat-python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_feedforward_network.py
114 lines (92 loc) · 3.38 KB
/
test_feedforward_network.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
from neat import activations
from neat.nn import FeedForwardNetwork
def assert_almost_equal(x, y, tol):
assert abs(x - y) < tol, "{!r} !~= {!r}".format(x, y)
def test_unconnected():
# Unconnected network with no inputs and one output neuron.
node_evals = [(0, activations.sigmoid_activation, sum, 0.0, 1.0, [])]
r = FeedForwardNetwork([], [0], node_evals)
assert r.values[0] == 0.0
result = r.activate([])
assert_almost_equal(r.values[0], 0.5, 0.001)
assert result[0] == r.values[0]
result = r.activate([])
assert_almost_equal(r.values[0], 0.5, 0.001)
assert result[0] == r.values[0]
def test_basic():
# Very simple network with one connection of weight one to a single sigmoid output node.
node_evals = [(0, activations.sigmoid_activation, sum, 0.0, 1.0, [(-1, 1.0)])]
r = FeedForwardNetwork([-1], [0], node_evals)
assert r.values[0] == 0.0
result = r.activate([0.2])
assert r.values[-1] == 0.2
assert_almost_equal(r.values[0], 0.731, 0.001)
assert result[0] == r.values[0]
result = r.activate([0.4])
assert r.values[-1] == 0.4
assert_almost_equal(r.values[0], 0.881, 0.001)
assert result[0] == r.values[0]
# TODO: Update this test for the current implementation.
# def test_simple_nohidden():
# config_params = {
# 'num_inputs':2,
# 'num_outputs':1,
# 'num_hidden':0,
# 'feed_forward':True,
# 'compatibility_threshold':3.0,
# 'excess_coefficient':1.0,
# 'disjoint_coefficient':1.0,
# 'compatibility_weight_coefficient':1.0,
# 'conn_add_prob':0.5,
# 'conn_delete_prob':0.05,
# 'node_add_prob':0.1,
# 'node_delete_prob':0.05}
# config = DefaultGenomeConfig(config_params)
# config.genome_config.set_input_output_sizes(2, 1)
# g = DefaultGenome(0, config)
# g.add_node(0, 0.0, 1.0, 'sum', 'tanh')
# g.add_connection(-1, 0, 1.0, True)
# g.add_connection(-2, 0, -1.0, True)
#
# net = nn.create_feed_forward_phenotype(g, config)
#
# v00 = net.serial_activate([0.0, 0.0])
# assert_almost_equal(v00[0], 0.0, 1e-3)
#
# v01 = net.serial_activate([0.0, 1.0])
# assert_almost_equal(v01[0], -0.76159, 1e-3)
#
# v10 = net.serial_activate([1.0, 0.0])
# assert_almost_equal(v10[0], 0.76159, 1e-3)
#
# v11 = net.serial_activate([1.0, 1.0])
# assert_almost_equal(v11[0], 0.0, 1e-3)
# TODO: Update this test for the current implementation.
# def test_simple_hidden():
# config = Config()
# config.genome_config.set_input_output_sizes(2, 1)
# g = DefaultGenome(0, config)
#
# g.add_node(0, 0.0, 1.0, 'sum', 'identity')
# g.add_node(1, -0.5, 5.0, 'sum', 'sigmoid')
# g.add_node(2, -1.5, 5.0, 'sum', 'sigmoid')
# g.add_connection(-1, 1, 1.0, True)
# g.add_connection(-2, 2, 1.0, True)
# g.add_connection(1, 0, 1.0, True)
# g.add_connection(2, 0, -1.0, True)
# net = nn.create_feed_forward_phenotype(g, config)
#
# v00 = net.serial_activate([0.0, 0.0])
# assert_almost_equal(v00[0], 0.195115, 1e-3)
#
# v01 = net.serial_activate([0.0, 1.0])
# assert_almost_equal(v01[0], -0.593147, 1e-3)
#
# v10 = net.serial_activate([1.0, 0.0])
# assert_almost_equal(v10[0], 0.806587, 1e-3)
#
# v11 = net.serial_activate([1.0, 1.0])
# assert_almost_equal(v11[0], 0.018325, 1e-3)
if __name__ == '__main__':
test_unconnected()
test_basic()