Benchmarks & research
PulseGTO vs PioSOLVER: accuracy, time and memory
Public comparison tables and charts are below. These tests were performed by PulseGTO; they are not a third-party review or a general speed ranking. For preflop comparisons see PulseGTO vs GTO Wizard and HRC; for a full-game training run see the 6-max 100 bb benchmark.
This section primarily checks whether RangeCFR solves the same game to the same answer as an established solver. The reference runs used PioSOLVER Free 3.9.1; time and memory are also reported for these particular runs, not as a general product ranking. "Reference" below means that program; PIO_CFR and "original" are its two solving algorithms. These are independent measurements, not endorsed by or affiliated with PioSoft.
What each engine has been checked against
| Engine | Checked against | Result |
|---|---|---|
| Heads-up postflop (RangeCFR) | PioSOLVER, the same spots (river, turn and two flops) | Strategies, range EVs, best-response values and exploitability agree; see below. |
| PioSOLVER, the EV of every combo on a turn spot | 0.0005 chips apart on average over 77 combos, 0.005 at most. | |
| Three-way postflop | The heads-up engine, the same node solved with two players | Same EVs on river, turn and flop roots (for example −0.0566 vs −0.0565 bb). |
| A direct calculation of every payoff: side pots, folds, ties, rake | Equal to rounding. | |
| Internal consistency with three players | The three EVs add up to zero without rake (within 0.00001 bb); exploitability falls as it runs. No independent cross-solver comparison has been made yet; the validation consists of payoff consistency, the heads-up reduction and convergence. | |
| Preflop blueprint | An exactly solved preflop-only game (the full preflop tree with rake, showdown when the betting closes) | The engine's strategy is within 0.003 bb per hand of equilibrium after 4,000 iterations; its stored action EVs within 0.002 bb at the first decision. |
| Exact re-solves of flops from the same blueprint | Blueprint EVs within about 0.05 bb per hand of the exact re-solves on average over the tested flops; single spots can differ more. | |
| GTO Wizard and HRC, the same games (6-max and heads-up, 20 bb) | Opens within about one point; the small blind's value of the game within 0.005 bb per hand when the rake rule matches the reference's; see Preflop benchmarks. |
The preflop engine is the one that approximates: it groups hands and boards and samples the game. Its own accuracy figure measures the game it trains, so the error of the grouping shows only against exact re-solves and outside references like these.
Configuration of the flop trees: heads-up postflop, 100 chips effective, pot 10, rake 5% capped at 3. Bets are 33% and 75% of the pot on the flop and turn, and 33%, 75% and 125% on the river. Donk bets are 33%, raises 75%, and all-ins follow the reference's rules (threshold 67%, extra all-in only when the stack is at most 5× the pot). The same two ranges were used throughout. The reference's own tree file (366 lines) is rebuilt by PulseGTO line for line, with identical bet amounts. Exploitability is the reference's "Exploitable for": the average over both players of (best response − EV), in chips.
Step by step: river and turn trees
Five small trees on Qs Jh 2h 7c (3d), pot 10, 1,000-chip stacks except step 5, each adding one rule, solved to convergence by both solvers. EV in chips, OOP / IP.
| Step | Tree | PulseGTO | Reference |
|---|---|---|---|
| 1 | River, one 50% bet, no rake | 7.0095 / 2.9905 | 7.009 / 2.991 |
| 2 | Step 1 with 5% rake, cap 3 | 6.5441 / 2.7218 | 6.543 / 2.722 |
| 3 | Step 1 with a 50% raise | 6.8611 / 3.1389 | 6.861 / 3.139 |
| 4 | Turn and river, 50% bet and raise | 7.6841 / 2.3159 | 7.684 / 2.316 |
| 5 | Step 4 with 100-chip stacks and all-ins | 7.5322 / 2.4678 | 7.535 / 2.465 |
Step 5 differs by 0.003, which is within the reference run's own exploitability (0.006). Steps 1 to 3 were also checked against an independent exact river solver.
Full flop trees
| Flop | Solver | EV OOP | EV IP | Exploit. |
|---|---|---|---|---|
| Qs Jh 2h | PulseGTO | 7.103 | 1.937 | 0.027 |
| Qs Jh 2h | Reference, PIO_CFR | 7.100 | 1.946 | 0.029 |
| Qs Jh 2h | Reference, original | 7.104 | 1.944 | 0.026 |
| As 9h 4d | PulseGTO | 5.132 | 3.676 | 0.030 |
| As 9h 4d | Reference, PIO_CFR | 5.117 | 3.684 | 0.030 |
| As 9h 4d | Reference, original | 5.115 | 3.685 | 0.047 |
The EVs agree to within about 0.015 chips. That is less than the exploitability of the solutions themselves, so the remaining difference is convergence, not a different game. The expected rake agrees as well: 0.95 to 0.96 chips on Qs Jh 2h and 1.19 to 1.20 on As 9h 4d.
Flop strategy
Range-weighted frequencies of the 183 OOP combos. Exploitability at the end of each run: 0.030, 0.030 and 0.047 chips.
Per hand: half the sum of absolute frequency differences over the three actions, weighted by the range. The two reference algorithms differ from each other by more than PulseGTO differs from the first one.
170 of the 183 OOP combos are within 5 points of the reference's PIO_CFR run. The largest differences are hands that mix bet and check at almost equal EV, such as KdTc (check 45% vs 56%) and KcTc (17% vs 0%). The two reference algorithms disagree on the same kind of hand: KdTc checks 56% in one and 52% in the other.
Qs Jh 2h is harder to compare hand by hand. OOP almost never checks, and splits its bets between 33% and 75% of the pot, two sizes of nearly equal value. Over the whole range the results agree: PulseGTO bets 33% 75.3% of the time and 75% 24.7%; the reference's original algorithm bets 72.5% and 26.8%, and checks 0.7%. Per hand, though, the two differ by 10.8 points on average. The reference splits a hand such as Ac Qh 39/60 between the two sizes, while PulseGTO splits it 87/13. Two independent PulseGTO runs agree with each other to within 0.1–0.8 points per hand. So each program settles on its own split between two sizes that are worth almost the same, and both split with the same total value: the EVs agree to 0.01 chips.
EV of every combo
A turn spot, As 9h 4d 9c: pot 10, 100 chips effective, rake 5% capped at 3, bets 33% and 55%, raise 75%, donk 33%, 77 OOP combos against 51 IP combos. Both solvers were run to about 0.001 chips of exploitability.
| PulseGTO | Reference | |
|---|---|---|
| EV OOP / IP | 4.8611 / 4.2766 | 4.861 / 4.277 |
| Ah Ac | 17.269 | 17.266 |
| Ad Kc | 8.226 | 8.228 |
| Th Tc | 3.507 | 3.508 |
| Bet 33% with Ah Ac / Ad Ac | 48.9% / 38.0% | 48.9% / 38.1% |
Over the 77 OOP combos the EVs differ by 0.0005 chips on average and by 0.005 at most. At the root, the check frequency differs by 0.44 points per combo on average and by 2.3 at most.
Time and memory, for context only
These timings compare only the runs shown here; they do not establish which program is generally faster. There was one run of each, on one laptop (Intel i5-1235U) that throttles under sustained load. The reference was PioSOLVER Free 3.9.1, so results should not be extrapolated to every edition or hardware configuration. The two programs check exploitability at different intervals, and that check takes time of its own. We include the figures so the runs above can be reproduced.
Time until a check first showed each exploitability level or lower, in chips. A check happens only every 30–60 s, so each figure can be up to one interval late. A dash means the level was not reached before the run was stopped.
| Flop | Solver | 0.5 | 0.15 | 0.05 | 0.03 |
|---|---|---|---|---|---|
| Qs Jh 2h | PulseGTO | 93 s | 216 s | 401 s | 556 s |
| Qs Jh 2h | Reference, PIO_CFR | 125 s | 346 s | 522 s | 560 s |
| Qs Jh 2h | Reference, original | 82 s | 171 s | 355 s | 550 s |
| As 9h 4d | PulseGTO | 226 s | 479 s | 859 s | 1,203 s |
| As 9h 4d | Reference, PIO_CFR | 347 s | 572 s | 1,172 s | 1,282 s |
| As 9h 4d | Reference, original | 192 s | 381 s | 1,201 s | — |
| Flop | Solver | Memory |
|---|---|---|
| Qs Jh 2h | PulseGTO | 2.8 GB (peak working set) |
| Qs Jh 2h | Reference, PIO_CFR | 4.0 GB (its own figure) |
| Qs Jh 2h | Reference, original | 1.9 GB (its own figure) |
| As 9h 4d | PulseGTO | 4.2 GB (peak working set) |
| As 9h 4d | Reference, PIO_CFR | 6.2 GB (its own figure) |
| As 9h 4d | Reference, original | 2.7 GB (its own figure) |
Both programs use suit isomorphism. It removes about a quarter of the work on a two-tone flop such as Qs Jh 2h and nothing on a rainbow flop such as As 9h 4d, which is why both need more time there. Memory is measured differently for each program, so compare it only roughly.
One run each on the same laptop, 5 threads. The reference evaluated its exploitability less often, so its curve has fewer points.
One run each on the same laptop, 5 threads.
PulseGTO