Watch a solver learn

Can you watch game-theoretic strategy learning actually happen? Below, counterfactual regret minimization plays Kuhn poker against itself in your browser and converges toward an equilibrium.

This is real computation, not an animation. Every point on the curve is the exact exploitability of the current average strategy, computed in your browser by a best response over the full Kuhn game tree.

This is the SAME vanilla-CFR algorithm as PokerAlpha’s Python reference, ported to TypeScript and test-validated against a committed Python-generated trace at 13 checkpoints (strategies agree to 4+ decimals). Hold’em adds abstraction, a C++ training backend, independent seeds and confidence gating on top of this exact idea.

0iterations0.33333exploitability (chips/hand, exact)0.00000game value (known: −1/18 ≈ −0.05556)

The strategy, live

p (pass/fold)b (bet/call)
situationcurrent average strategybet%reference @10k
J — first to act50.0%21.6%
J — opponent checked50.0%33.6%
J — facing a bet50.0%0.0%
J — checked, now facing a bet50.0%0.0%
Q — first to act50.0%0.0%
Q — opponent checked50.0%0.0%
Q — facing a bet50.0%33.7%
Q — checked, now facing a bet50.0%55.4%
K — first to act50.0%66.8%
K — opponent checked50.0%100.0%
K — facing a bet50.0%100.0%
K — checked, now facing a bet50.0%100.0%

Watch the Jack rows develop a genuine BLUFFING frequency and the King facing a bet converge to always-call — mixing is the equilibrium, not indecision. Kuhn has a one-parameter family of equilibria, so exact frequencies can differ between runs while exploitability still goes to zero.

Where this leads

PokerAlpha’s Hold’em strategy was trained by the sampling variant of this algorithm (external-sampling MCCFR) over an abstraction with 144,025 information sets on a bit-exact C++17 training backend (74.2× the Python reference’s training throughput), across three independent seeds. It is then gated by a calibrated confidence layer because, unlike here, Hold’em’s exploitability cannot be computed exactly.

How the backend was built Play against the trained Kuhn policy Research Lab