Will Tipton Video Pack 2
Solving Poker

Will Tipton


Will Tipton’s Solving Poker With IPython And Fictitious Play

Anyone who has read Expert Heads Up No Limit Holdem knows that there is tons to learn from solving model games and analyzing the GTO strategies that result. The ability to solve large poker games was directly responsible for many of the insights in EHUNL and set it apart from poker advice available elsewhere. Unfortunately, this sort of work involves large computations, and software to perform these calculations was not publicly accessible – until now.

This video series will walk you through the development of computer code to solve for maximally exploitative and equilibrium strategies of arbitrary HUNL decision trees, to visualize the trees, and to investigate the resulting strategies and the EVs of playing them. You will learn to leverage the powerful but user-friendly iPython (interactive python) programming enviroment and create a tool that allows you to perform many of the calculations described in the books. Moreover, in learning how to build it rather than how to use a pre-existing software package, you will gain the understanding necessary to go beyond published work and to perform game theoretic studies of your own imagination. It’s an exciting time to be a poker player.


  • Is prior programming experience necessary? Absolutely not. The series was built to teach players without any programming knowledge at all, how to build the computer code to solve valuable situations. All you need is a willingness to learn.
  • How do I know if this series is for me? If you’re interested in solving poker situations to help you become a much stronger player, this series is for you. If you’re still unsure, we’ve included the first three videos of the series below, free, to show you how simple this is. Watch the first three videos and get a full idea of what the video pack is all about.


Note: This video pack is protected by a sharing protection system. These videos can be played on both your laptop and desktop, using Windows XP, Windows Vista, Windows 7, Windows 8 and / or Windows Server computers and both online and offline after a single entry of your serial key.


  • iPython setup
  • Intro to iPython and functions
  • Hand-vs-hand equity calcuations
  • Hand-vs-hand equities fast
  • A bit of homework: ranges
  • The Ranges class and hand-vs-range equities
  • Equity distributions
  • The shove/fold game
  • Decision points and trees
  • Visualizing trees with graphviz
  • Strategies
  • Max-EV play
  • Maximally exploitative strategies and FP
  • A turn and river spot and discussion
  • What’s next?


When writing my Range class, __repr_svg__ doesn’t seem to work: trying to display a range gives something like <__main__.Range instance at 0x0638DD00>.

That text is the default representation of a range (the name of the class and its memory address). This happens because it can’t use the image-generating display function we’ve written. There could be two reasons for this: (1) it can’t find the function, or (2) there’s an error when it tries to run it – in this case, it silently falls back on the default representation.

To address (1), make sure you’ve named the function correctly: _repr_svg_. One underscore at the beginning and end and one in the middle. Also make sure that indentation/whitespace is correct as in the video. If it is incorrect, python may not know that that function should be associated with the Range class.

To address (2), run the function manually. In other words, if you have a range called bob, run: bob._repr_svg_(). This way, if an error occurs, it will be displayed, and you can debug.


Note: some errors were made in early videos and then tracked down and corrected in later ones. This gave us a chance to demonstrate the debugging process, which is itself a very important skill. Only bugs that were not found by the end of the series are listed here.

In setMaxExplEVsAtNatureDP() and setMaxExplEVsAtVillainDP(), the loop over all hands is over numCards twice, as usual. In the video, one of the loops was over numHands by mistake. (Thanks erdnase!)

In the getRange function of the StrategyPair class, “range[n]” should be “ranges[n]”

In the setRangeString function of theRange class, there’s an issue with the case which covers unsuited (XYo) hands. As written, it only covers 6 of the 12 combos, e.g. AhKd but not AdKh. The following code fragment corrects this (only the 3rd and 4th lines changed). Thanks PN Houle!

else: # unsuited hands

for i in range(numSuits):

for j in range(numSuits):

if i != j:

self.setFrac(pe.string2card([rank1+suits[i], rank2+suits[j]]), value)

In video 11, we add a directory to the end of the Windows PATH variable. This directory should be the “bin/” subdirectory of the place where we installed GraphViz. What was shown on screen when I did this was correct, but I forgot the “bin/” part when describing it.

When renaming the argument to getEquityVsHand from “board” to “b”, I forgot to change it everywhere in the function body! After making the change, every instance of “board” except one in the function should have been changed to “b”. Furthermore, this led to incorrect EVs when solving the turn and river game. After 300 iterations, the correct numbers there are SB EV: 19.00 BB and BB EV: 21.04 BB. See this post and the surrounding discussion for more info. Keep in mind that if you were affected by this bug when you generated some EquityArrays, you’ll need to delete and re-generate them!

Video Information

01 July 2014
Video length
Approximately 12 hours
File size
2 GB
File type
.EXE (executable file)