Repository navigation
Releases: dberweger2017/CFR-NLHE-6max
Release list
v0.5.5 — HU200 three-seed blend vs Slumbot
v0.5.5 — HU200 three-seed blend vs Slumbot
v0.5.5 qualified under protocol version 2:
−19.67 [−38.57, −0.76] BB/100 against Slumbot over 30,000 fresh hands, 10,000
on each of three fresh accounts (#318). Its lower 95% bound clears the declared
−50 BB/100 threshold. In the protocol's wording it is not an embarrassing opponent,
but it loses to Slumbot by a small, detectable margin. It does not beat Slumbot.
The original protocol required every one of three training seeds to clear the
threshold. It failed on seed 2026101302 (#304), whose lower bound was −56.53.
#316's AIVAT analysis attributes that
failure mostly to card luck: about −9 BB/100 for that seed. This later analysis
does not change the original failed verdict. Protocol v2 was declared before
any qualifying blend hand; exploratory hands were excluded.
The model is #306's one audited sequence-form blend of the frozen 20B seeds
2026101302, 2026101421 and 2026101422. Its 156,208,331 entries, pinned PR163 K50
card tables and public-history translation (512 states /128 events) are unchanged.
There was no retraining, re-export or model selection for this release.
Internal results and limitations
#306 found blend-minus-seed results of
+3.61 [−1.15, +8.37], +0.37 [−4.30, +5.05] and +1.85 [−2.83, +6.52] BB/100,
respectively, over 131,072 duplicate blocks per seed. All are within noise;
no direct improvement is established. Its scripted panel used 16,384 paired
blocks per opponent, translation on throughout:
| Opponent | Blend BB/100 [nominal 95% interval] |
|---|---|
| Check/call | +160.50 [148.05, 172.96] |
| Half-pot pressure | +62.89 [47.24, 78.53] |
| Loose aggressive | +120.78 [97.44, 144.12] |
| Matched-pot pressure | +64.95 [49.60, 80.30] |
| 1.5× pot pressure | −29.39 [−55.24, −3.53] |
| Random | +186.17 [111.34, 261.01] |
| Tight aggressive | +68.10 [56.60, 79.60] |
The adverse 1.5× pot result remains part of the evidence. None of the 21 paired
scripted blend-minus-seed contrasts establishes a difference. These intervals
condition on fixed policies and deals; they do not measure training-seed population uncertainty.
#318 identifies flop folds (−12.9 BB/100) and big-blind play (−32.8 ±26.7 BB/100)
as weaknesses. This release covers heads-up, equal 200 BB stacks only: no HU100,
multiway, rake, search or general professional-strength claim.
Local play and assets
Human play supports restricted sizing and any legal free sizing; the spectator
shows self-play decisions. The runtime fixes 200 BB stacks and translation 512/128.
The HU20 default remains v0.4.2; existing HU100 releases remain available.
The blend was built and tested on a base 16 GB MacBook Pro M4, with #306's
measured simultaneous process-family peak RSS of 12,748,324,864 bytes
(12.75 GB /11.87 GiB). That is the research pipeline peak, not a runtime-load measurement.
First start builds a low-memory binary play cache from the verified model.
Every start verifies its model binding and file hashes and maps it read-only;
later starts avoid parsing the 156 million JSON rows. Corrupt or mismatched
caches stop startup and are preserved for diagnosis. Allow 25 GB free disk,
including the 9.33 GB derived cache, and a 16 GB machine.
Two fresh CLI starts on Linux with one CPU core and local SSD storage measured
20 min 15 s / 0.52 GB peak RSS for first-start verification, reassembly and
cache building, then 81 s / 0.59 GB peak RSS with the existing cache. These
process peaks include play; operating-system file caching is additional.
The measured cache occupies 9,331,096,671 bytes including its manifest.
Load time varies by CPU and storage.
See INSTALL.md for disk/RAM requirements and the verifier commands.
The release contains six ordered model parts of at most 1 GiB, three K50 tables,
these three public documents, release-manifest.json, SHA256SUMS and the
stdlib-only verify_hu200_bundle.py. The whole model is 6,282,968,150 bytes,
SHA256 ce3ecc2cb8ebffa1fb3e0a7f11c79d0900b74008b55d85093e1915ff4dde6485.
The separate hu200-frozen-20b-seeds research pre-release contains the ingredients;
it is not v0.5.5 and is not Latest.
hu200-frozen-20b-seeds
HU200 frozen 20B research seeds
This pre-release is not Latest and is not v0.5.5. It publishes the three
frozen 20B-node seeds that are the ingredients of v0.5.5's sequence-form blend:
2026101302, 2026101421 and 2026101422. Seed 2026101302 was the original v0.5.5
candidate. The collection includes each seed's average export and raw
checkpoint, in ordered parts no larger than 1 GiB, plus the pinned K50 tables,
original blend configuration and a standalone stdlib verifier. No private Drive
access is required to rebuild the blend from these GitHub assets.
The seeds did not qualify under their declared rule. Protocol 1 required
every seed's 10,000-hand raw 95% lower bound against Slumbot to exceed −50 BB/100.
#304 reported:
| Seed | Raw BB/100 [95% interval] | Original seed gate |
|---|---|---|
| 2026101302 | −23.08 [−56.53, +10.38] | Failed by 6.5 BB/100 |
| 2026101421 | −10.66 [−40.53, +19.21] | Passed |
| 2026101422 | −7.87 [−39.39, +23.65] | Passed |
The three-seed recipe failed. #316's later AIVAT analysis
attributes the failure mostly to card luck: seed 1302 had about −9 BB/100 of it.
That does not change the predeclared raw-statistic verdict or qualify these seeds
retrospectively. The separately published blend qualified under a new, prospective
protocol v2 at −19.67 [−38.57, −0.76] BB/100 over 30,000 fresh hands (#318); it still
loses to Slumbot by a small detectable margin.
#306's internal blend-minus-seed results are +3.61 /+0.37 /+1.85 BB/100, all within
noise. Its blend loses to scripted 1.5× pot pressure at −29.39 [−55.24, −3.53].
These research ingredients do not establish HU100, multiway or professional strength.
The blend was built and tested on a base 16 GB MacBook Pro M4. #306's full
construction/evaluation pipeline peaked at 12,748,324,864 bytes family RSS.
The install guide describes the self-contained reconstruction;
the model card pins all six original payloads. The table app
supports the qualified v0.5.5 blend; this seed collection is verification-only.
v0.5.3 — HU100 O5B menu-v2 average with translation
A new heads-up 100 BB model, trained on a larger betting menu (min, half pot, pot, 1.5× pot, 2× pot and all-in) with finer postflop card buckets. It beats v0.5.2 head to head by +37.10 [30.16, 44.04] BB/100, with translation on for both models, over 131,072 duplicate blocks. All three training seeds beat v0.5.2 on their own: +47.04, +40.95 and +45.42 BB/100 (#296).
-
Model: PR272's frozen linear-CFR opponent-sampled average, seed 2026100601, chosen before evaluation without seed selection. 5.0 billion nodes, 97.3 million stored entries, K50 postflop card buckets. Translation for off-menu bet sizes stays on, with a new adapter for this menu (512 states, 128 events).
-
Scripted opponents, BB/100 (#296):
Opponent BB/100 [95%] check/call +268.70 [252.02, 285.37] random +106.91 [71.01, 142.81] tight-aggressive +37.29 [27.87, 46.71] loose-aggressive +34.87 [15.09, 54.65] pot-size pressure +27.24 [15.27, 39.21] matched-pot pressure +20.46 [7.61, 33.30] half-pot pressure +16.18 [2.60, 29.75] Pot-size pressure, which beat v0.5.2, is now beaten. The margins against half-pot and matched-pot pressure are the smallest, and against matched-pot pressure this model scores less than v0.5.2 on the same deals: −26.57 [−40.79, −12.34] BB/100.
-
Translation: turning it on changes nothing against any of the seven scripted opponents (exactly 0.00 BB/100 on the same deals), so it does no harm. Those opponents almost never bet off this menu, so a benefit against human bet sizes is not measured yet.
-
Limits: scripted opponents and our own models only; no external benchmark. No human, multiplayer or exploitability claim. See the model card for every number and limit.
Running it. v0.5.3 runs with --hu100-release, which also loads v0.5.0–v0.5.2 bundles. On an M1 MacBook Pro it took about ten minutes to load and peaked at 1.7 GB of RAM. The HU20 releases are unchanged: v0.4.2 stays the default on the HU20 table.
Assets: the model in three ordered parts (each at most 1 GiB; the whole model is 3.2 GB), the flop, turn and river card-bucket tables, the model card, these notes, install instructions, release-manifest.json, SHA256SUMS and a standard-library verifier, verify_hu100_bundle.py. The verifier checks every part, the whole model's fixed hash, the tables and the publication binding to this release's source commit.
v0.5.2 — HU100 O4B average with translation
The third heads-up 100 BB release: the same recipe and training run as v0.5.0 and v0.5.1, continued to 4B nodes. Translation for off-menu bet sizes stays on.
Head to head, it beats v0.5.1 by +17.90 [14.98, 20.83] BB/100 (#226, 524,288 duplicate blocks, adjusted 98.33%).
Two independent seeds repeat the gain over their own 2B models (#236):
| Seed | Near-4B vs 2B, BB/100 [adjusted 97.5%] |
|---|---|
| 2026100901 (3.885B) | +18.67 [15.94, 21.40] |
| 2026100902 (3.967B) | +19.42 [15.58, 23.25] |
The three seeds' final models are within about ±2 BB/100 of each other head to head, so the gain doesn't come from a lucky seed.
Scripted opponents, translation on, BB/100 (#236):
| Opponent | BB/100 [95%] |
|---|---|
| check/call | +140.4 |
| random | +138.4 |
| loose-aggressive | +82.2 |
| tight-aggressive | +49.5 |
| pot-size pressure | −49.4 [−82.3, −16.6] |
No opponent shows a severe regression from v0.5.1 on the same deals; loose-aggressive improves by +35.1 [7.8, 62.4]. Pot-size pressure still beats both models.
Limits: no external benchmark has been played; v0.5.5 moves to 200 BB for Slumbot. See the model card for every number and limit.
Run it: download all seven assets into one directory, then follow INSTALL.md:
python3.11 verify_hu100_bundle.py DIR --expect-source 3a3bc4218bab96637d6a27a69b73383ee8bb196c --require-publicationpython -m src.play_api.server --hu100-release DIR
It peaks at about 4 GB of RAM and takes about six and a half minutes to load. v0.5.0, v0.5.1 and the 20 BB releases are unchanged; v0.4.2 stays the default on the HU20 table.
v0.5.1 — HU100 O2B average with translation
The second heads-up 100 BB release: v0.5.0's recipe and training run, trained twice as long, to 2B nodes. Translation for off-menu bet sizes stays on.
Head to head, it beats v0.5.0 by +29.51 [26.82, 32.20] BB/100 (#223, 524,288 duplicate blocks).
Two independent seeds repeat the step from 1B to 2B almost exactly (#226):
| Seed | 2B vs 1B, BB/100 [adjusted 98.33%] |
|---|---|
| 2026100901 | +28.14 [24.87, 31.41] |
| 2026100902 | +27.90 [24.65, 31.15] |
Scripted opponents, translation on, BB/100 (#223):
| Opponent | BB/100 [95%] |
|---|---|
| check/call | +132.1 |
| random | +106.9 |
| tight-aggressive | +54.9 |
| loose-aggressive | +42.2 |
| pot-size pressure | −37.1 [−69.7, −4.5] |
None of these differs significantly from v0.5.0 on the same deals. Pot-size pressure beats both models in this sample.
Limits: no external benchmark has been played; v0.5.5 moves to 200 BB for Slumbot. See the model card for every number and limit.
Run it: download all seven assets into one directory, then follow INSTALL.md:
python3.11 verify_hu100_bundle.py DIR --expect-source dca7547e6eca82ce77f3e42230b82fabc1c29a4c --require-publicationpython -m src.play_api.server --hu100-release DIR
It peaks at about 3.8 GB of RAM. v0.5.0 and the 20 BB releases are unchanged; v0.4.2 stays the default on the HU20 table.
v0.5.0 — HU100 O1B average with translation
The first heads-up 100 BB release. It's a 1B-node linear-CFR opponent-sampled average (seed 2026100601), with public-history translation for bet sizes off its menu. You can play it locally as a human, or watch it in self-play.
Results against scripted opponents, translation on (#215):
| Opponent | BB/100 [95%] |
|---|---|
| check/call | +100.5 [81.5, 119.5] |
| random | +76.9 [4.8, 149.0] |
| loose-aggressive | +57.1 [21.7, 92.5] |
| tight-aggressive | +36.3 [18.6, 54.0] |
| pot-size pressure | −9.3 [−39.1, 20.4] |
Two independent seeds show the same pattern.
Head to head (#223): this model beats its 500M checkpoint by +38.9 [35.9, 42.0] BB/100. A 2B checkpoint already beats it by +29.5 [26.8, 32.2], so stronger 100 BB releases will follow.
Limits: no external benchmark has been played; v0.5.5 moves to 200 BB for Slumbot. #215's formal recipe qualification failed on one inconclusive comparison. Profit against pot-size pressure is unproven. See the model card for every number and limit.
Run it: download all seven assets into one directory, then follow INSTALL.md:
python3.11 verify_v050_bundle.py DIR --expect-source b9c9bd161422e87371a2641ae4c60304c66eed79 --require-publicationpython -m src.play_api.server --v050 DIR
The 20 BB releases are unchanged: v0.4.2 remains the default on the HU20 table.
v0.4.2 — HU20 O10B opponent-sampled average
v0.4.2 — 10B-node opponent-sampled average
Owner-authorized stable Latest release; v0.4.0 and v0.4.1 remain available. The fixed first seed 2026100601 uses the same heads-up 20-BB linear-CFR opponent-sampled-average recipe as v0.4.1, trained to 10B nodes instead of 1B. Its inference export bytes are unchanged from #185 and retrieved from #188's canonical verified research/package/ archive directory. Compact storage changes memory representation only.
The matched-seed three-lineage direct comparison is +3.50 [+1.63, +5.37] BB/100. Native pressure and severe-regression checks pass from #185. Fresh bounded LBR in #188 is −1.092 [−4.965, +2.782] BB/100 target-profit difference, clearing the unchanged −5 safeguard narrowly; half-width 3.874 meets ≤5. This establishes the declared safeguard, not an LBR improvement. All pilot/final actions and settlements independently audit. Historical and pilot hands are excluded from the final estimate.
The inference package has seven files: fixed 10B average export, MODEL_CARD.md, these notes, release-manifest.json, catalog-manifest.json, SHA256SUMS and verify_v042_bundle.py. After retrieving it, use Python 3.11:
python verify_v042_bundle.py . --expect-source TAGGED_COMMIT --require-publicationThe expected source is the exact commit referenced by tag v0.4.2 and approved_release_source_commit in the publication manifest. The verifier pins the first-seed model hash, lineage, game, extraction, original #188 preparation provenance, every asset and consistent explicit publication approval/source/tag binding. The fixed catalog identity manifest is separately byte-pinned by the runtime and recorded in the publication manifest, avoiding a source-commit self-reference. The released local table defaults to v0.4.2; spectator pairings and human sessions retain all three versions. Missing/corrupt pinned models fail rather than silently substitute an older release.
LBR is bounded, intervals are conditional on saved lineages, and the game remains two players at 20 BB with no rake. No full-game exploitability, human-strength, six-player or 100-BB claim follows. See the model card for all evidence and the inherited engine license disclosure.
Tagged source: a53f167fa736a481339034d1a7235202d599418c. Release PR #198 passed independent review and all five checks before merge.
Model SHA256: 15736cc61a72baa1e6722b1566897917ffb6fdf8bea8874a82b5485fe95d4bae (249,237,403 bytes). Install and play from this tag.
Verify the seven downloaded assets with Python 3.11: python verify_v042_bundle.py . --expect-source a53f167fa736a481339034d1a7235202d599418c --require-publication.
v0.4.1 — opponent-sampled average
v0.4.1 — opponent-sampled average play
The local heads-up 20-BB table defaults to the exact #165 O1B opponent-sampled average, seed 2026100601. v0.4.0 remains selectable and its release remains available. This is linear CFR with a 1B-node budget, an unchanged inference export and uniform missing/zero-mass fallback; no CFR+ floor or current-policy zero-mass fallback.
Fresh direct play against shipped v0.4.0: +10.50 [7.90, 13.10] BB/100 across three O lineages; the selected seed alone +11.12 [7.85, 14.39]. Earlier independent replication: +11.45 [8.83, 14.07]. Bounded-LBR attacker returns are 28.17 [17.93, 38.42] against O versus 65.73 [56.84, 74.62] BB/100 against R. First-seed conditional turn/river E improves from 2.7147 [2.4922, 2.9323] to 1.0665 [1.0023, 1.1315] BB, Q from 2.6792 [2.3247, 3.0578] to 0.5226 [0.4807, 0.5768]. These are 95% intervals with different policy scopes. Full comparison, progress chart, all thirteen panels and limits.
All four predeclared #176 checks pass, including native-pressure O−R +6.92 [0.39, 13.45] BB/100. Every pilot/final action and settlement independently replays. Smaller panels remain imprecise. LBR is a bounded lower exploitability probe; turn/river measures fixed spots against a best response within retained trees, not a perfect full-game opponent. No full-game Nash certificate, human-strength claim, six-player or 100-BB claim follows.
Use Python 3.11, download both pinned inference models into an ignored models directory, verify their hashes and run python -m src.play_api.server --models-dir models. Choose a version before creating the session. Hash verification, durable model identity, native replay and the legal observation boundary are preserved. Install and play.
Assets: unchanged O inference export, model card, these notes, preparation/publication manifest and SHA256SUMS. Use python -m scripts.verify_v041_model PATH and python -m scripts.verify_v041_bundle DIRECTORY after download. No engine binary, training checkpoint, token or private journal is included. The inherited engine license disclosure remains.
v0.4 — Rebuilt Poker AI Research Preview
What you can do
Play, inspect and reproduce a learning poker agent. v0.4 introduces the rebuilt research system: a playable heads-up 20-big-blind policy, a local web table, replayable hands and documented training/evaluation results. The featured model is a tabular external-sampling CFR blueprint trained to 100 million traversal nodes. Strong six-player poker remains the destination, not a capability claimed here.
Quick start
Use the source-install and verified model instructions on Python 3.11 with Rust/Cargo and a native build toolchain. Download B100M-HU20-current-seed-2026093001.json.gz from this release and run python -m scripts.verify_v04_model before loading it. Follow the play and replay guide. The server binds to loopback with an access token; use an SSH tunnel for remote access. The tested fresh-install platform was macOS arm64. Other OS installs were not verified for this release.
What changed
The public entry point now leads to the maintained local HU20 table and pinned B100M inference export. Restricted research mode offers the trained concrete action menu. Experimental free sizing sends exact native-legal human wagers to the engine; the bot still uses its restricted menu and existing fallback. Human benchmark sessions record a planned number of hands, allow abort/restart and export sanitized results. They do not establish human strength or implement AIVAT. The historical neural Deep CFR work and newer research remain indexed.
Evidence
The fixed-first-seed export is 40,144,034 compressed bytes with SHA-256 4534e7db2f69bedd54098b7eaa3c9bd82450838405ae162270a3b7684db9bedf. SHA256SUMS, MODEL_CARD.md and release-manifest.json accompany it; the manifest pins source commit a2053bbeea8a5e5170a1d83bf5d440684f82283d and engine revision. The #116 recovery and completed diagnostics contain the measured comparisons and limits. Those principal comparisons aggregate three lineages; the download is one first-seed policy. The combined source passed 948 M1 tests and green PR #125 CI. Bounded real-model browser/HTTP checks completed both sizing modes and benchmark sessions with native replay, including one exact off-menu 201-chip raise. These are integration checks, not playing-strength evidence.
Limitations
This model supports only two-player no-limit Hold'em at 20 BB, resetting stacks each hand, without rake or ante. It is not a six-player, 100 BB or tournament policy. B100M still loses against a bounded local response; secondary panels are mixed and late-street coverage remains thin. The bundle contains an inference export, not resumable training checkpoints. The project code is MIT. I license my changes to the pinned pokers fork under MIT; the original authors' terms remain unverified pending direct confirmation. No engine binary or papers are bundled. See the license audit.
Migration from legacy releases
Earlier 0.x, 2.x and 3.x releases are retained as historical artifacts; some old titles, tags and binary package versions do not match. Their numbering does not establish the rebuilt roadmap's v1.0 strength milestone. Use this canonical v0.4.0 tag and its verified B100M asset for the maintained preview. No older binary has been renamed or republished as v0.4.
0.3.3
Legacy release — historical artifact. This historical 0.3.3 release has no downloadable assets. For the maintained playable research preview, use v0.4.0.
Clean state before new feature work.
Includes the focused training/evaluation quality pass:
- live strict/verbose runtime settings
- shared seeded evaluation helper
- metadata-based checkpoint agent loading
- regression coverage for the cleanup