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.
| spot | ours | theirs | diff |
| As Ks vs Qh Jd on 7c 2d 9s | 77.475 | 77.34 | 0.135 |
| Ac Ad vs Kc Kd on 2h 7s Ts | 91.616 | 91.615 | 0.001 |
| Jh Th vs Ad Kc on 9h 8c 2h | 69.697 | 69.843 | -0.146 |
| 7c 7d vs As Kh on Kd 4s 2c 9h | 4.545 | 4.613 | -0.068 |
| Qs Jc vs Ah Ts on Kd Qd 3h 8s | 86.364 | 86.272 | 0.092 |
| 5h 5c vs Ac Qd on Kh 9s 4d 2c 7h | 100.0 | 100.0 | 0.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.
| spot | ours | theirs | diff |
| As Ks vs Qh Jd on 7c 2d 9s | 77.4747 | 77.4747 | 0.0 |
| Ac Ad vs Kc Kd on 2h 7s Ts | 91.6162 | 91.6162 | 0.0 |
| Jh Th vs Ad Kc on 9h 8c 2h | 69.697 | 69.697 | 0.0 |
| 7c 7d vs As Kh on Kd 4s 2c 9h | 4.5455 | 4.5455 | 0.0 |
| Qs Jc vs Ah Ts on Kd Qd 3h 8s | 86.3636 | 86.3636 | 0.0 |
| 5h 5c vs Ac Qd on Kh 9s 4d 2c 7h | 100.0 | 100.0 | 0.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.
| spot | ours | theirs | diff | sigma |
| As Ks vs QQ+,AKs,AQs on 7c 2d 9s | 35.631 | 35.536 | 0.095 | 0.17 |
| Jh Th vs TT+,AJs+,KQs on 9h 8c 2h | 56.212 | 55.985 | 0.227 | 0.41 |
| 7c 7d vs 22+,A2s+,KTs+ on Kd 4s 2c 9h | 45.131 | 45.942 | -0.81 | 1.45 |
| Qs Jc vs 88+,ATo+,KJo+ on Kd Qd 3h 8s | 46.325 | 46.333 | -0.008 | 0.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.
| spot | combos | ours | theirs | diff |
| As Ks vs QQ+,AKs,AQs on 7c 2d 9s | 18 | 35.5359 | 35.5359 | 0.0 |
| Jh Th vs TT+,AJs+,KQs on 9h 8c 2h | 39 | 55.9855 | 55.9855 | 0.0 |
| 7c 7d vs 22+,A2s+,KTs+ on Kd 4s 2c 9h | 112 | 45.9416 | 45.9416 | -0.0 |
| Qs Jc vs 88+,ATo+,KJo+ on Kd Qd 3h 8s | 75 | 46.3333 | 46.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.
| spot | ours | theirs | diff | equal blind | widened by |
| UTG | 17.9 | 15.5 | 2.4 | 19.2 | 1.2 |
| HJ | 21.6 | 19.5 | 2.1 | 23.1 | 1.5 |
| CO | 26.1 | 26.5 | -0.4 | 30.0 | 3.9 |
| BTN | 43.6 | 44.0 | -0.4 | 50.5 | 6.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