Use a cache¶
Whilst for stochastic strategies, every repetition of a Match will give a
different result, for deterministic strategies, when there is no noise there is
no need to re run the match. The library has a DeterministicCache
class
that allows us to quickly replay matches.
Caching a Match¶
To illustrate this, let us time the play of a match without a cache:
>>> import axelrod as axl
>>> import timeit
>>> def run_match():
... p1, p2 = axl.GoByMajority(), axl.Alternator()
... match = axl.Match((p1, p2), turns=200)
... return match.play()
>>> time_with_no_cache = timeit.timeit(run_match, number=500)
>>> time_with_no_cache
2.2295279502868652
Here is how to create a new empty cache:
>>> cache = axl.DeterministicCache()
>>> len(cache)
0
Let us rerun the above match but using the cache:
>>> p1, p2 = axl.GoByMajority(), axl.Alternator()
>>> match = axl.Match((p1, p2), turns=200, deterministic_cache=cache)
>>> match.play()
[(C, C), ..., (C, D)]
We can take a look at the cache:
>>> cache
{('Soft Go By Majority', 'Alternator'): [(C, C), ..., (C, D)]}
>>> len(cache)
1
>>> len(cache[(axl.GoByMajority(), axl.Alternator())])
200
This maps a triplet of 2 player names and the match length to the resulting interactions. We can rerun the code and compare the timing:
>>> def run_match_with_cache():
... p1, p2 = axl.GoByMajority(), axl.Alternator()
... match = axl.Match((p1, p2), turns=200, deterministic_cache=cache)
... return match.play()
>>> time_with_cache = timeit.timeit(run_match_with_cache, number=500)
>>> time_with_cache
0.04215192794799805
>>> time_with_cache < time_with_no_cache
True
We can write the cache to file:
>>> cache.save("cache.txt")
True
Caching a Tournament¶
Tournaments will automatically create caches as needed on a match by match basis.
Caching a Moran Process¶
A prebuilt cache can also be used in a Moran process (by default a new cache is used):
>>> cache = axl.DeterministicCache("cache.txt")
>>> players = [axl.GoByMajority(), axl.Alternator(),
... axl.Cooperator(), axl.Grudger()]
>>> mp = axl.MoranProcess(players, deterministic_cache=cache)
>>> populations = mp.play()
>>> mp.winning_strategy_name
Defector
We see that the cache has been augmented, although note that this particular number will depend on the stochastic behaviour of the Moran process:
>>> len(cache)
18