Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions axelrod/player.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,17 @@

# Strategy classifiers

def is_basic(s):
"""
Defines criteria for a strategy to be considered 'basic'
"""
stochastic = s.classifier['stochastic']
depth = s.classifier['memory_depth']
inspects_source = s.classifier['inspects_source']
manipulates_source = s.classifier['manipulates_source']
manipulates_state = s.classifier['manipulates_state']
return (not stochastic) and (not inspects_source) and (not manipulates_source) and (not manipulates_state) and (depth in (0, 1))

def is_cheater(s):
"""
A function to check if a strategy cheats.
Expand Down
7 changes: 3 additions & 4 deletions axelrod/strategies/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from ..player import is_cheater
from ..player import is_basic, is_cheater
from ._strategies import *

# `from ._strategies import *` import the collection `strategies`
Expand All @@ -11,8 +11,7 @@
# Distinguished strategy collections in addition to
# `strategies` from _strategies.py

demo_strategies = [Cooperator, Defector, TitForTat, Grudger, Random]
basic_strategies = [s for s in strategies if is_basic(s())]
ordinary_strategies = [s for s in strategies if not is_cheater(s())]
cheating_strategies = [s for s in strategies if is_cheater(s())]

# Defined by fiat for demo purposes
basic_strategies = [Alternator, Cooperator, Defector, Random, TitForTat]
3 changes: 1 addition & 2 deletions axelrod/strategies/_strategies.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,7 @@
SuspiciousTitForTat, AntiTitForTat, HardTitForTat, HardTitFor2Tats)


# Note: Meta* strategies are handled in .__init__.py, so this is not the
# final form of the list
# Note: Meta* strategies are handled in .__init__.py

strategies = [
Aggravater,
Expand Down
44 changes: 35 additions & 9 deletions axelrod/tests/unit/test_classification.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,16 @@ def test_is_cheater(self):
axelrod.MindWarper,
axelrod.MindReader]

known_basic = [axelrod.Alternator,
axelrod.AntiTitForTat,
axelrod.Bully,
axelrod.Cooperator,
axelrod.Defector,
axelrod.GoByMajority,
axelrod.SuspiciousTitForTat,
axelrod.TitForTat,
axelrod.WinStayLoseShift]

known_ordinary = [axelrod.AverageCopier,
axelrod.ForgivingTitForTat,
axelrod.GoByMajority20,
Expand All @@ -72,26 +82,42 @@ def test_is_cheater(self):

for strategy in known_cheaters:
self.assertTrue(axelrod.is_cheater(strategy()), msg=strategy)
self.assertFalse(axelrod.is_basic(strategy()), msg=strategy)

for strategy in known_basic:
self.assertTrue(axelrod.is_basic(strategy()), msg=strategy)
self.assertFalse(axelrod.is_cheater(strategy()), msg=strategy)

for strategy in known_ordinary:
self.assertFalse(axelrod.is_basic(strategy()), msg=strategy)
self.assertFalse(axelrod.is_cheater(strategy()), msg=strategy)


class TestStrategies(unittest.TestCase):

def test_strategy_list(self):
self.assertTrue(hasattr(axelrod, "strategies"))
self.assertTrue(hasattr(axelrod, "basic_strategies"))
self.assertTrue(hasattr(axelrod, "ordinary_strategies"))
self.assertTrue(hasattr(axelrod, "cheating_strategies"))
for strategy_list in ["strategies",
"demo_strategies",
"basic_strategies",
"ordinary_strategies",
"cheating_strategies"]:
self.assertTrue(hasattr(axelrod, strategy_list))

def test_lists_not_empty(self):
self.assertTrue(len(axelrod.strategies) > 0)
self.assertTrue(len(axelrod.basic_strategies) > 0)
self.assertTrue(len(axelrod.ordinary_strategies) > 0)
self.assertTrue(len(axelrod.cheating_strategies) > 0)
for strategy_list in [axelrod.strategies,
axelrod.demo_strategies,
axelrod.basic_strategies,
axelrod.ordinary_strategies,
axelrod.cheating_strategies]:
self.assertTrue(len(strategy_list) > 0)

def test_meta_inclusion(self):
self.assertTrue(axelrod.MetaMajority in axelrod.strategies)


def test_demo_strategies(self):
demo_strategies = [axelrod.Cooperator,
axelrod.Defector,
axelrod.TitForTat,
axelrod.Grudger,
axelrod.Random]
self.assertTrue(demo_strategies, axelrod.demo_strategies)
Loading