Skip to content

Commit f38cfad

Browse files
authored
Merge pull request #662 from Axelrod-Python/661
Non default games fixed
2 parents b4c0c1c + 428cc40 commit f38cfad

File tree

4 files changed

+70
-15
lines changed

4 files changed

+70
-15
lines changed

axelrod/result_set.py

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from numpy import mean, nanmedian, std
66

77
from . import eigen
8+
from .game import Game
89
import axelrod.interaction_utils as iu
910

1011
try:
@@ -33,7 +34,7 @@ def wrapper(*args):
3334
class ResultSet(object):
3435
"""A class to hold the results of a tournament."""
3536

36-
def __init__(self, players, interactions, progress_bar=True):
37+
def __init__(self, players, interactions, progress_bar=True, game=None):
3738
"""
3839
Parameters
3940
----------
@@ -45,6 +46,10 @@ def __init__(self, players, interactions, progress_bar=True):
4546
progress_bar : bool
4647
Whether or not to create a progress bar which will be updated
4748
"""
49+
if game is None:
50+
self.game = Game()
51+
else:
52+
self.game = game
4853
self.players = players
4954
self.nplayers = len(players)
5055
self.interactions = interactions
@@ -162,7 +167,8 @@ def build_scores(self):
162167
for index_pair, repetitions in self.interactions.items():
163168
if index_pair[0] != index_pair[1]: # Ignoring self interactions
164169
for repetition, interaction in enumerate(repetitions):
165-
final_scores = iu.compute_final_score(interaction)
170+
final_scores = iu.compute_final_score(interaction,
171+
self.game)
166172
for player in range(2):
167173
player_index = index_pair[player]
168174
player_score = final_scores[player]
@@ -211,7 +217,8 @@ def build_wins(self):
211217
player_index = index_pair[player]
212218

213219
for rep, interaction in enumerate(repetitions):
214-
winner_index = iu.compute_winner_index(interaction)
220+
winner_index = iu.compute_winner_index(interaction,
221+
self.game)
215222
if winner_index is not False and player == winner_index:
216223
wins[player_index][rep] += 1
217224

@@ -246,7 +253,9 @@ def build_normalised_scores(self):
246253
for index_pair, repetitions in self.interactions.items():
247254
for repetition, interaction in enumerate(repetitions):
248255
if index_pair[0] != index_pair[1]: # Ignore self interactions
249-
scores_per_turn = iu.compute_final_score_per_turn(interaction)
256+
scores_per_turn = iu.compute_final_score_per_turn(
257+
interaction,
258+
self.game)
250259
for player in range(2):
251260
player_index = index_pair[player]
252261
score_per_turn = scores_per_turn[player]
@@ -308,10 +317,14 @@ def build_payoffs(self):
308317

309318
if (player, opponent) == index_pair:
310319
for interaction in repetitions:
311-
utilities.append(iu.compute_final_score_per_turn(interaction)[0])
320+
utilities.append(iu.compute_final_score_per_turn(
321+
interaction,
322+
self.game)[0])
312323
elif (opponent, player) == index_pair:
313324
for interaction in repetitions:
314-
utilities.append(iu.compute_final_score_per_turn(interaction)[1])
325+
utilities.append(iu.compute_final_score_per_turn(
326+
interaction,
327+
self.game)[1])
315328

316329
payoffs[player][opponent] = utilities
317330

@@ -419,13 +432,15 @@ def build_score_diffs(self):
419432
for opponent in plist:
420433
if (player, opponent) in self.interactions:
421434
for repetition, interaction in enumerate(self.interactions[(player, opponent)]):
422-
scores = iu.compute_final_score_per_turn(interaction)
435+
scores = iu.compute_final_score_per_turn(interaction,
436+
self.game)
423437
diff = (scores[0] - scores[1])
424438
score_diffs[player][opponent][repetition] = diff
425439

426440
if (opponent, player) in self.interactions:
427441
for repetition, interaction in enumerate(self.interactions[(opponent, player)]):
428-
scores = iu.compute_final_score_per_turn(interaction)
442+
scores = iu.compute_final_score_per_turn(interaction,
443+
self.game)
429444
diff = (scores[1] - scores[0])
430445
score_diffs[player][opponent][repetition] = diff
431446

@@ -458,11 +473,13 @@ def build_payoff_diffs_means(self):
458473
for index_pair, repetitions in self.interactions.items():
459474
if (player, opponent) == index_pair:
460475
for interaction in repetitions:
461-
scores = iu.compute_final_score_per_turn(interaction)
476+
scores = iu.compute_final_score_per_turn(interaction,
477+
self.game)
462478
diffs.append(scores[0] - scores[1])
463479
elif (opponent, player) == index_pair:
464480
for interaction in repetitions:
465-
scores = iu.compute_final_score_per_turn(interaction)
481+
scores = iu.compute_final_score_per_turn(interaction,
482+
self.game)
466483
diffs.append(scores[1] - scores[0])
467484
if diffs:
468485
payoff_diffs_means[player][opponent] = mean(diffs)
@@ -689,7 +706,7 @@ class ResultSetFromFile(ResultSet):
689706
"""
690707

691708
def __init__(self, filename, progress_bar=True,
692-
num_interactions=False):
709+
num_interactions=False, game=None):
693710
"""
694711
Parameters
695712
----------
@@ -702,6 +719,10 @@ def __init__(self, filename, progress_bar=True,
702719
displaying the progress bar, if it is not known and progress_bar
703720
is set to True then an initial count will take place
704721
"""
722+
if game is None:
723+
self.game = Game()
724+
else:
725+
self.game = game
705726
self.players, self.interactions = self._read_csv(filename,
706727
progress_bar,
707728
num_interactions)

axelrod/tests/unit/test_resultset.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,12 @@ def test_init(self):
173173
self.assertIsInstance(interaction, list)
174174
self.assertEqual(len(interaction), self.turns)
175175

176+
def test_init_with_different_game(self):
177+
game = axelrod.Game(p=-1, r=-1, s=-1, t=-1)
178+
rs = axelrod.ResultSet(self.players, self.interactions,
179+
progress_bar=False, game=game)
180+
self.assertEqual(rs.game.RPST(), (-1, -1, -1, -1))
181+
176182
def test_with_progress_bar(self):
177183
rs = axelrod.ResultSet(self.players, self.interactions)
178184
self.assertTrue(rs.progress_bar)
@@ -217,6 +223,14 @@ def test_scores(self):
217223
self.assertEqual(len(rs.scores), rs.nplayers)
218224
self.assertEqual(rs.scores, self.expected_scores)
219225

226+
def test_scores_with_different_game(self):
227+
game = axelrod.Game(p=-1, r=-1, s=-1, t=-1)
228+
rs = axelrod.ResultSet(self.players, self.interactions,
229+
progress_bar=False, game=game)
230+
for player in rs.scores:
231+
for score in player:
232+
self.assertFalse(score > 0)
233+
220234
def test_ranking(self):
221235
rs = axelrod.ResultSet(self.players, self.interactions,
222236
progress_bar=False)
@@ -378,6 +392,12 @@ def test_init(self):
378392
(1, 1): [[('C', 'C'), ('C', 'C')]]}
379393
self.assertEqual(rs.interactions, expected_interactions)
380394

395+
def test_init_with_different_game(self):
396+
game = axelrod.Game(p=-1, r=-1, s=-1, t=-1)
397+
rs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=False,
398+
game=game)
399+
self.assertEqual(rs.game.RPST(), (-1, -1, -1, -1))
400+
381401
def test_progres_bar(self):
382402
rs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=True)
383403
self.assertEqual(rs.read_progress_bar.total, 6)

axelrod/tests/unit/test_tournament.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,18 @@ def test_serial_play(self):
126126
self.assertEqual(len(results.interactions), 15)
127127
self.assertEqual(tournament.num_interactions, 75)
128128

129+
def test_serial_play_with_different_game(self):
130+
# Test that a non default game is passed to the result set
131+
game = axelrod.Game(p=-1, r=-1, s=-1, t=-1)
132+
tournament = axelrod.Tournament(
133+
name=self.test_name,
134+
players=self.players,
135+
game=game,
136+
turns=1,
137+
repetitions=1)
138+
results = tournament.play(progress_bar=False)
139+
self.assertEqual(results.game.RPST(), (-1, -1, -1, -1))
140+
129141
def test_no_progress_bar_play(self):
130142
"""Test that progress bar is not created for progress_bar=False"""
131143
tournament = axelrod.Tournament(

axelrod/tournament.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717

1818
class Tournament(object):
19-
game = Game()
2019

2120
def __init__(self, players, match_generator=RoundRobinMatches,
2221
name='axelrod', game=None, turns=200, repetitions=10,
@@ -43,12 +42,14 @@ def __init__(self, players, match_generator=RoundRobinMatches,
4342
with_morality : boolean
4443
Whether morality metrics should be calculated
4544
"""
45+
if game is None:
46+
self.game = Game()
47+
else:
48+
self.game = game
4649
self.name = name
4750
self.turns = turns
4851
self.noise = noise
4952
self.num_interactions = 0
50-
if game is not None:
51-
self.game = game
5253
self.players = players
5354
self.repetitions = repetitions
5455
self.match_generator = match_generator(
@@ -119,7 +120,8 @@ def _build_result_set(self, progress_bar=True):
119120
result_set = ResultSetFromFile(
120121
filename=self.filename,
121122
progress_bar=progress_bar,
122-
num_interactions=self.num_interactions)
123+
num_interactions=self.num_interactions,
124+
game=self.game)
123125
self.outputfile.close()
124126
return result_set
125127

0 commit comments

Comments
 (0)