Skip to content

Python Texas Hold'em hand evaluation and equity calculation library

License

Notifications You must be signed in to change notification settings

david-amirault/pyeval7

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

51 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

eval7

https://travis-ci.org/julianandrews/pyeval7.svg?branch=master

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.

Installation

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

Usage

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.

Hand Ranges

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.

Equity

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.

About

Python Texas Hold'em hand evaluation and equity calculation library

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C 75.6%
  • Python 24.4%