Python Texas Hold'em hand evaluation library based on Anonymous7's codebase which is in turn based on Keith Rule's hand evaluator (which you can see here). Eval7 also provides a parser for an extended set of PokerStove style range strings, and approximate equity calculation for unweighted ranges.
Eval7 is a work in progress: only the functionality needed by Flop Ferret has been fully implemented. Time permitting, the goal is to provide a fully featured poker hand evaluator and range equity calculator with a clean native python interface and all performance critical parts implemented in Cython.
eval7 is tested on python 2.7 and 3.4 and likely works with any python ≥ 2.7. The build process requires cython (tested with 0.23). If you have a working copy of python:
pip install cython
should work. Once you have cython install with:
pip install eval7
Basic usage:
>>> import eval7, pprint >>> deck = eval7.Deck() >>> deck.shuffle() >>> hand = deck.deal(7) >>> pprint.pprint(hand) [Card("5c"), Card("9s"), Card("8d"), Card("5d"), Card("Ac"), Card("Qc"), Card("3d")] >>> eval7.evaluate(hand) 17025648 >>> eval7.handtype(17025648) 'Pair' >>> hand = [eval7.Card(s) for s in ('As', '2c', '3d', '5s', '4c')] >>> eval7.evaluate(hand) 67305472 >>> eval7.handtype(67305472) 'Straight'
Deck
objects provide sample
, shuffle
, deal
and peek
methods. The deck code is currently implemented in pure python and works well
for quick lightweight simulations, but is too slow for full range vs. range
equity calculations. Ideally this code will be rewritten in Cython.
eval7 also provides a parser for weighted PokerStove style hand ranges.
Examples:
>>> from pprint import pprint >>> hr = eval7.HandRange("AQs+, 0.4(AsKs)") >>> pprint(hr.hands) [((Card("Ac"), Card("Qc")), 1.0), ((Card("Ad"), Card("Qd")), 1.0), ((Card("Ah"), Card("Qh")), 1.0), ((Card("As"), Card("Qs")), 1.0), ((Card("Ac"), Card("Kc")), 1.0), ((Card("Ad"), Card("Kd")), 1.0), ((Card("Ah"), Card("Kh")), 1.0), ((Card("As"), Card("Ks")), 1.0), ((Card("As"), Card("Ks")), 0.4)] >>> hr = eval7.HandRange("AJ+, ATs, KQ+, 33-JJ, 0.8(QQ+, KJs)") >>> len(hr) 144
At present the HandRange objects are just a thin front-end for the range-string parser. Ultimately the hope is to add Cython backed sampling, enumeration, and HandRange vs. HandRange equity calculation.
eval7 also provides equity calculation functions: py_hand_vs_range_exact
,
py_hand_vs_range_monte_carlo
and py_all_hands_vs_range
. These don't yet
support weighted ranges and could probably benefit from optimization. See
equity.pyx
for documentaiton.