Skip to content

Commit 9d0d294

Browse files
committed
Adjust tests to cover left out lines
1 parent 98434e7 commit 9d0d294

File tree

7 files changed

+27
-26
lines changed

7 files changed

+27
-26
lines changed

axelrod/evolvable_player.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def create_new(self, **kwargs):
2929
init_kwargs.update(kwargs)
3030
return self.__class__(**init_kwargs)
3131

32-
# Serialization and Deserialization to strings. You may overwrite to obtain more human readable serializations
32+
# Serialization and deserialization. You may overwrite to obtain more human readable serializations
3333
# but you must overwrite both.
3434

3535
def serialize_parameters(self):

axelrod/strategies/ann.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ class EvolvableANN(ANN, EvolvablePlayer):
227227
def __init__(
228228
self, num_features: int, num_hidden: int,
229229
weights: List[float] = None,
230-
mutation_probability: float = 0.1,
230+
mutation_probability: float = None,
231231
mutation_distance: int = 5,
232232
) -> None:
233233
num_features, num_hidden, weights, mutation_probability = self._normalize_parameters(
@@ -274,7 +274,8 @@ def mutate(self):
274274
return self.create_new(weights=weights)
275275

276276
def crossover(self, other):
277-
# Assuming that the number of states is the same
277+
if not isinstance(other, self.__class__):
278+
raise TypeError("Crossover must be between the same player classes.")
278279
weights = crossover_lists(self.weights, other.weights)
279280
return self.create_new(weights=weights)
280281

axelrod/strategies/cycler.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,13 @@ def mutate(self):
152152
cycle, _ = self._normalize_parameters(cycle)
153153
return self.create_new(cycle=cycle)
154154

155-
def crossover(self, other_cycler):
155+
def crossover(self, other):
156156
"""
157157
Creates and returns a new Player instance with a single crossover point.
158158
"""
159-
if not isinstance(other_cycler, self.__class__):
160-
raise TypeError
161-
cycle_list = crossover_lists(self.cycle, other_cycler.cycle)
159+
if not isinstance(other, self.__class__):
160+
raise TypeError("Crossover must be between the same player classes.")
161+
cycle_list = crossover_lists(self.cycle, other.cycle)
162162
cycle = "".join(cycle_list)
163163
cycle, _ = self._normalize_parameters(cycle)
164164
return self.create_new(cycle=cycle)

axelrod/strategies/finite_state_machines.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,8 @@ def crossover_rows(rows1, rows2):
249249
return new_rows
250250

251251
def crossover(self, other):
252-
# Assuming that the number of states is the same
252+
if not isinstance(other, self.__class__):
253+
raise TypeError("Crossover must be between the same player classes.")
253254
transitions = self.crossover_rows(self.fsm.transitions(), other.fsm.transitions())
254255
transitions = self.normalize_transitions(transitions)
255256
return self.create_new(transitions=transitions)

axelrod/strategies/hmm.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def normalize_vector(vec):
4545
s = sum(vec)
4646
if s == 0.0:
4747
n = len(vec)
48-
return [1 / n for v in vec]
48+
return [1. / n for v in vec]
4949
vec = [v / s for v in vec]
5050
return vec
5151

@@ -307,7 +307,8 @@ def mutate(self):
307307
)
308308

309309
def crossover(self, other):
310-
# Assuming that the number of states is the same
310+
if not isinstance(other, self.__class__):
311+
raise TypeError("Crossover must be between the same player classes.")
311312
transitions_C = crossover_lists_of_lists(self.hmm.transitions_C, other.hmm.transitions_C)
312313
transitions_D = crossover_lists_of_lists(self.hmm.transitions_D, other.hmm.transitions_D)
313314
emission_probabilities = crossover_lists(

axelrod/strategies/lookerup.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,8 @@ def mutate(self):
501501
)
502502

503503
def crossover(self, other):
504+
if not isinstance(other, self.__class__):
505+
raise TypeError("Crossover must be between the same player classes.")
504506
lookup_dict = crossover_dictionaries(self.lookup_dict, other.lookup_dict)
505507
return self.create_new(lookup_dict=lookup_dict)
506508

axelrod/tests/strategies/test_evolvable_player.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,11 @@ def crossover(self, other):
2929
value = self.value + other.value
3030
return EvolvableTestOpponent(value)
3131

32-
def serialize_parameters(self):
33-
return str(self.value)
34-
35-
@classmethod
36-
def deserialize_parameters(cls, value):
37-
return EvolvableTestOpponent(int(value))
38-
3932

4033
class TestEvolvablePlayer(TestPlayer):
4134

4235
player_class = EvolvableTestOpponent
4336
init_parameters = dict()
44-
randomized = False
4537

4638
def player(self):
4739
return self.player_class(**self.init_parameters)
@@ -56,8 +48,8 @@ def test_initialisation(self):
5648

5749
def test_randomization(self):
5850
"""Test that randomization on initialization produces different strategies."""
59-
if not self.randomized:
60-
return True
51+
if self.init_parameters:
52+
return
6153
seed(0)
6254
player1 = self.player()
6355
seed(0)
@@ -70,24 +62,24 @@ def test_randomization(self):
7062
return
7163
self.assertFalse(True)
7264

73-
def test_mutate(self):
65+
def test_mutate_variations(self):
7466
"""Test that mutate produces different strategies."""
7567
seed(0)
7668
player = self.player()
77-
for seed_ in range(2, 20):
69+
variants_produced = False
70+
for seed_ in range(2, 200):
7871
seed(seed_)
7972
mutant = player.clone().mutate()
8073
if player != mutant:
81-
return
82-
self.assertFalse(True)
74+
variants_produced = True
75+
self.assertFalse(variants_produced)
8376

8477
def test_mutate_and_clone(self):
8578
"""Test that mutated players clone properly."""
8679
seed(0)
8780
player = self.player()
8881
mutant = player.clone().mutate()
8982
clone = mutant.clone()
90-
# compare_dicts(mutant.__dict__, clone.__dict__)
9183
self.assertEqual(clone, mutant)
9284

9385
def test_crossover(self):
@@ -106,13 +98,17 @@ def test_crossover(self):
10698
return
10799
self.assertFalse(True)
108100

101+
def test_crossover_mismatch(self):
102+
player = self.player()
103+
other = EvolvableTestOpponent()
104+
self.assertRaises(TypeError, self.player_class.crossover, other=other)
105+
109106
def test_serialization(self):
110107
"""Serializing and deserializing should return the original player."""
111108
seed(0)
112109
player = self.player()
113110
serialized = player.serialize_parameters()
114111
deserialized_player = player.__class__.deserialize_parameters(serialized)
115-
# compare_dicts(player.__dict__, deserialized_player.__dict__)
116112
self.assertEqual(player, deserialized_player)
117113
self.assertEqual(deserialized_player, deserialized_player.clone())
118114

0 commit comments

Comments
 (0)