♠ GTO

Are these numbers right?

Every test in this project checks its code against its own code. That catches a thing that broke and cannot catch a thing that was wrong from the start. These compare against work by other people: eval7, a separate hand evaluator written in C, and the published solutions the preflop charts claim to be transcribed from.

6 passed, 0 failed, 1 not run · generated 2026-08-27 19:59 UTC at 46ad114.

vs eval7 Hand ranking pass
does evaluate() order two hands the way eval7 does?
20,000 random pairs on a full board, every one ordered identically.
vs eval7's own sampler The reference itself pass
is the enumeration every row above is checked against right?
Worst gap 0.146 points against a 0.335-point sampling band at 200,000 draws.
spotourstheirsdiff
As Ks vs Qh Jd on 7c 2d 9s77.47577.340.135
Ac Ad vs Kc Kd on 2h 7s Ts91.61691.6150.001
Jh Th vs Ad Kc on 9h 8c 2h69.69769.843-0.146
7c 7d vs As Kh on Kd 4s 2c 9h4.5454.613-0.068
Qs Jc vs Ah Ts on Kd Qd 3h 8s86.36486.2720.092
5h 5c vs Ac Qd on Kh 9s 4d 2c 7h100.0100.00.0
vs eval7's evaluator, enumerated here Hand versus hand pass
is exact enumeration exact?
Every spot agrees to the last place a float has.
spotourstheirsdiff
As Ks vs Qh Jd on 7c 2d 9s77.474777.47470.0
Ac Ad vs Kc Kd on 2h 7s Ts91.616291.61620.0
Jh Th vs Ad Kc on 9h 8c 2h69.69769.6970.0
7c 7d vs As Kh on Kd 4s 2c 9h4.54554.54550.0
Qs Jc vs Ah Ts on Kd Qd 3h 8s86.363686.36360.0
5h 5c vs Ac Qd on Kh 9s 4d 2c 7h100.0100.00.0
vs eval7's evaluator, enumerated here Hand versus range pass
does the sampler agree with an exact solve, inside its own error bar?
Worst gap 1.45 standard errors, over 8,000 samples a spot.
spotourstheirsdiffsigma
As Ks vs QQ+,AKs,AQs on 7c 2d 9s35.63135.5360.0950.17
Jh Th vs TT+,AJs+,KQs on 9h 8c 2h56.21255.9850.2270.41
7c 7d vs 22+,A2s+,KTs+ on Kd 4s 2c 9h45.13145.942-0.811.45
Qs Jc vs 88+,ATo+,KJo+ on Kd Qd 3h 8s46.32546.333-0.0080.01
vs eval7's evaluator, enumerated here Equity per holding pass
is the per-holding pass right, one holding at a time and pooled?
Exact on every street that enumerates, both per combination and pooled.
spotcombosourstheirsdiff
As Ks vs QQ+,AKs,AQs on 7c 2d 9s1835.535935.53590.0
Jh Th vs TT+,AJs+,KQs on 9h 8c 2h3955.985555.98550.0
7c 7d vs 22+,A2s+,KTs+ on Kd 4s 2c 9h11245.941645.9416-0.0
Qs Jc vs 88+,ATo+,KJo+ on Kd Qd 3h 8s7546.333346.3333-0.0
vs published 6-max 100bb solutions Opening ranges pass
does a chart labelled `solver` open as often as the solve it names?
Worst gap 2.4 points of opening frequency, against a 3-point band.
spotourstheirsdiffequal blindwidened by
UTG17.915.52.419.21.2
HJ21.619.52.123.11.5
CO26.126.5-0.430.03.9
BTN43.644.0-0.450.56.9
vs TexasSolver Postflop strategy not run
do the postflop numbers match a real solve?
No solver binary. Build TexasSolver and point TEXASSOLVER_BIN at its console_solver, or put that on the path. Until then nothing here is checked against a postflop solve, and `rollout.py`'s numbers are `model` - exact against these five bots, and not a claim about equilibrium.

What is still not checked

The postflop numbers. Nothing on this page tests them against a solver, because a postflop comparison needs a binary this repository does not ship. That is why every postflop number in a review is labelled model and not solver: it is exact against these five bots, whose strategies are known functions, and it is not a claim about equilibrium. The bet-sizing curve stops at showdown on the street you are on, so it understates a small bet that sets up a bigger one on the next card.

Back to the table