Skip to content

Commit c0f6902

Browse files
committed
Move is_basic and obey_axelrod to Classifiers class.
1 parent 09a02f5 commit c0f6902

File tree

6 files changed

+45
-48
lines changed

6 files changed

+45
-48
lines changed

axelrod/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from axelrod.game import DefaultGame, Game
1111
from axelrod.history import History, LimitedHistory
1212
from axelrod.player import Player
13-
from axelrod.classifier import Classifiers, is_basic, obey_axelrod
13+
from axelrod.classifier import Classifiers
1414
from axelrod.evolvable_player import EvolvablePlayer
1515
from axelrod.mock_player import MockPlayer
1616
from axelrod.match import Match

axelrod/classifier.py

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -203,37 +203,34 @@ def classify_player_for_this_classifier(
203203

204204
return classify_player_for_this_classifier
205205

206+
@classmethod
207+
def is_basic(cls, s: Union[Player, Type[Player]]):
208+
"""
209+
Defines criteria for a strategy to be considered 'basic'
210+
"""
211+
stochastic = cls.__getitem__("stochastic")(s)
212+
depth = cls.__getitem__("memory_depth")(s)
213+
inspects_source = cls.__getitem__("inspects_source")(s)
214+
manipulates_source = cls.__getitem__("manipulates_source")(s)
215+
manipulates_state = cls.__getitem__("manipulates_state")(s)
216+
return (
217+
not stochastic
218+
and not inspects_source
219+
and not manipulates_source
220+
and not manipulates_state
221+
and depth in (0, 1)
222+
)
206223

207-
Classifiers = _Classifiers()
208-
209-
210-
# Strategy classifiers
224+
@classmethod
225+
def obey_axelrod(cls, s: Union[Player, Type[Player]]):
226+
"""
227+
A function to check if a strategy obeys Axelrod's original tournament
228+
rules.
229+
"""
230+
for c in ["inspects_source", "manipulates_source", "manipulates_state"]:
231+
if cls.__getitem__(c)(s):
232+
return False
233+
return True
211234

212235

213-
def is_basic(s):
214-
"""
215-
Defines criteria for a strategy to be considered 'basic'
216-
"""
217-
stochastic = Classifiers["stochastic"](s)
218-
depth = Classifiers["memory_depth"](s)
219-
inspects_source = Classifiers["inspects_source"](s)
220-
manipulates_source = Classifiers["manipulates_source"](s)
221-
manipulates_state = Classifiers["manipulates_state"](s)
222-
return (
223-
not stochastic
224-
and not inspects_source
225-
and not manipulates_source
226-
and not manipulates_state
227-
and depth in (0, 1)
228-
)
229-
230-
231-
def obey_axelrod(s):
232-
"""
233-
A function to check if a strategy obeys Axelrod's original tournament
234-
rules.
235-
"""
236-
for c in ["inspects_source", "manipulates_source", "manipulates_state"]:
237-
if Classifiers[c](s):
238-
return False
239-
return True
236+
Classifiers = _Classifiers()

axelrod/strategies/__init__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from ..classifier import Classifiers, is_basic, obey_axelrod
1+
from ..classifier import Classifiers
22
from ._strategies import *
33
from ._filters import passes_filterset
44

@@ -80,16 +80,16 @@
8080
FirstByAnonymous,
8181
Random,
8282
]
83-
basic_strategies = [s for s in all_strategies if is_basic(s())]
84-
strategies = [s for s in all_strategies if obey_axelrod(s())]
83+
basic_strategies = [s for s in all_strategies if Classifiers.is_basic(s)]
84+
strategies = [s for s in all_strategies if Classifiers.obey_axelrod(s)]
8585

8686
long_run_time_strategies = [
8787
s for s in all_strategies if Classifiers["long_run_time"](s)
8888
]
8989
short_run_time_strategies = [
9090
s for s in strategies if not Classifiers["long_run_time"](s)
9191
]
92-
cheating_strategies = [s for s in all_strategies if not obey_axelrod(s())]
92+
cheating_strategies = [s for s in all_strategies if not Classifiers.obey_axelrod(s)]
9393

9494
ordinary_strategies = strategies # This is a legacy and will be removed
9595

axelrod/strategies/meta.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from numpy.random import choice
55

66
from axelrod.action import Action
7-
from axelrod.classifier import Classifiers, obey_axelrod
7+
from axelrod.classifier import Classifiers
88
from axelrod.player import Player
99
from axelrod.strategies import TitForTat
1010
from axelrod.strategy_transformers import NiceTransformer
@@ -20,7 +20,7 @@
2020
)
2121

2222
# Needs to be computed manually to prevent circular dependency
23-
ordinary_strategies = [s for s in all_strategies if obey_axelrod(s)]
23+
ordinary_strategies = [s for s in all_strategies if Classifiers.obey_axelrod(s)]
2424

2525
C, D = Action.C, Action.D
2626

axelrod/tests/unit/test_classification.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,13 +151,13 @@ def test_obey_axelrod(self):
151151
]
152152

153153
for strategy in known_cheaters:
154-
self.assertFalse(axl.obey_axelrod(strategy()), msg=strategy)
154+
self.assertFalse(axl.Classifiers.obey_axelrod(strategy), msg=strategy)
155155

156156
for strategy in known_basic:
157-
self.assertTrue(axl.obey_axelrod(strategy()), msg=strategy)
157+
self.assertTrue(axl.Classifiers.obey_axelrod(strategy), msg=strategy)
158158

159159
for strategy in known_ordinary:
160-
self.assertTrue(axl.obey_axelrod(strategy()), msg=strategy)
160+
self.assertTrue(axl.Classifiers.obey_axelrod(strategy), msg=strategy)
161161

162162
def test_is_basic(self):
163163
"""A test that verifies if the is_basic function works correctly"""
@@ -193,13 +193,13 @@ def test_is_basic(self):
193193
]
194194

195195
for strategy in known_cheaters:
196-
self.assertFalse(axl.is_basic(strategy()), msg=strategy)
196+
self.assertFalse(axl.Classifiers.is_basic(strategy), msg=strategy)
197197

198198
for strategy in known_basic:
199-
self.assertTrue(axl.is_basic(strategy()), msg=strategy)
199+
self.assertTrue(axl.Classifiers.is_basic(strategy), msg=strategy)
200200

201201
for strategy in known_ordinary:
202-
self.assertFalse(axl.is_basic(strategy()), msg=strategy)
202+
self.assertFalse(axl.Classifiers.is_basic(strategy), msg=strategy)
203203

204204

205205
def str_reps(xs):

docs/tutorials/advanced/classification_of_strategies.rst

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,12 @@ Some strategies have been classified as having a particularly long run time::
114114
18
115115

116116
Strategies that :code:`manipulate_source`, :code:`manipulate_state`
117-
and/or :code:`inspect_source` return :code:`False` for the :code:`obey_axelrod`
118-
function::
117+
and/or :code:`inspect_source` return :code:`False` for the
118+
:code:`Classifier.obey_axelrod` function::
119119

120120
>>> s = axl.MindBender()
121-
>>> axl.obey_axelrod(s)
121+
>>> axl.Classifier.obey_axelrod(s)
122122
False
123123
>>> s = axl.TitForTat()
124-
>>> axl.obey_axelrod(s)
124+
>>> axl.Classifier.obey_axelrod(s)
125125
True

0 commit comments

Comments
 (0)