A research project · Deep CFR on mini-drawmaha
A solver for a poker game nobody has solved.
Drawmaha is a split-pot draw and Omaha hybrid. This solver is built one game at a time: four smaller games, each solved and graded against a known answer before the next is started.
Results
Four games solved, each graded by exploitability
Exploitability is what a best response wins per hand against the solver's average strategy. Zero is a Nash equilibrium. Every grader reads the game's rules and nothing from the solver it grades.
| Game | Method | Graded against | Exploitability |
|---|---|---|---|
| Rock-paper-scissors | regret matching | the uniform Nash | 0.0009chips/round exploitable after 100k rounds |
| Kuhn poker | vanilla CFR | the closed-form equilibrium; all 64 pure strategies | 0.00063chips/hand; game value −0.05555 against −1/18 |
| Leduc poker | vanilla CFR | an OpenSpiel solve, frozen as a fixture | 0.011chips/hand; game value −0.0874 against −0.0856 |
| Mini-drawmaha, 6.2M infosets | lockstep MCCFR, four regret rules raced | the exact best-response walk | 0.061chips/hand at 20M hands per seat |
| Mini-drawmaha | Deep CFR | the same exact walk and the tabular answer | 0.086chips/hand at 2M hands per seat, where LCFR is at 0.630 |
| Full Drawmaha | Deep CFR at scale | head-to-head checkpoint matches and a trained exploiter | —not started; the range interface is built ahead of it |
Range explorer
Seat 0 opens with a bet 25% of the time, most often when it makes trips with the board
Rows are what the three held cards make on their own; columns are what they reach for with the board card. Each cell is its share of every opening hand and how often that share bets. The explorer opens any cell down to a single hand, at every spot of the game.
Research
Keeping negative regret wins the race, and a network passes the table at equal hands
One long write-up with its data and figures, a survey of the machine learning behind it, and the benchmarks every method was checked on first.
| Oct 2026 | Mini-drawmaha, solvedLinear CFR grades 0.061 at 20 million hands per seat, against 0.248 and 0.250 for the two rules that drop negative regret; a Deep CFR run passes the table at every hand count tried. | Write-up |
| Oct 2026 | Regret targets divided by √pot train a better network0.086 against 0.115 undivided at 2 million hands per seat, same network, same steps; dividing by the whole pot gives 0.084. | Chapter |
| Aug 2026 | The machine learning behind the solverA survey: regret matching, CFR and its sampled and discounted variants, Deep CFR, and how each is graded. | |
| Oct 2026 | Rock-paper-scissors, Kuhn and Leduc, gradedThe three small games against a closed form and an OpenSpiel solve, each with a live demo. | Benchmarks |
Play
Act against the solver, with its answer beside yours
A hand is dealt from a pack of 600. You act; the coach shows how the solver mixes at the same spot with the same cards. Settled hands go to a ledger.
rung4-deep-pot0.5-t200, exploitability 0.086Coach · the solver's mix here
Method
Graded by an exact best response
Each game is solved, then a best response is computed exactly against the average strategy. What it wins per hand is the grade. A game is not called solved on a learning curve.
A grader shares no code with its solver
Every grader imports the game's rules and nothing else, so a bug cannot sit in both and cancel. Hidden cards are summed over before the responder takes a maximum.
Every figure is regenerated
Python, NumPy and torch; training runs on Modal and the site on Vercel. Every chart and table here is written from committed data by a named command, never edited by hand.