Releases: kevlu8/PZChessBot
v6.1
PZChessBot v6.1 is here, primarily featuring bug fixes for SMP.
- SMP thread limit has been changed to 512 to reflect TCEC conditions
- Hash limit has been changed to 256GB to reflect TCEC conditions
- Several SMP bugs have been fixed - SMP no longer experiences occasional crashes
- QoL improvements - namely, scaling down printed evaluations based on PZ's internal measure of a pawn (roughly)
- Some other small search improvements
Once again, the NNUE is provided for those who wish to compile, but you do not need to download it to run PZChessBot.
Estimated Elo: ~3630 CCRL Blitz, 3510 CCRL 40/15
Goals
The next version of PZChessBot will likely be v7.0. v6.1 is the last version with balanced-book progression testing; the next release will only feature UHO progression tests. Furthermore, much of the focus for v7.0 will be improvements to the NNUE, with some small search features possibly added. Our aim for v7.0 will be to enter the top 20 worldwide; that is, as of the time of writing, a rating of 3700 on the CCRL blitz list.
Look forward to v7.0, hopefully coming in May or June 2026.
Tests
main vs v6.0 LTC (balanced book):
Elo | 35.88 +- 6.34 (95%)
Conf | 40.0+0.40s Threads=1 Hash=128MB
Games | N: 2002 W: 319 L: 113 D: 1570
Penta | [1, 74, 654, 262, 10]
https://ob.int0x80.ca/test/238/
main vs v6.0 LTC (UHO):
Elo | 62.90 +- 7.86 (95%)
Conf | 40.0+0.40s Threads=1 Hash=128MB
Games | N: 2122 W: 719 L: 339 D: 1064
Penta | [5, 121, 444, 471, 20]
https://ob.int0x80.ca/test/235/
main vs v6.0 STC (UHO):
Elo | 44.32 +- 8.66 (95%)
Conf | 8.0+0.08s Threads=1 Hash=32MB
Games | N: 2010 W: 639 L: 384 D: 987
Penta | [10, 155, 443, 364, 33]
https://ob.int0x80.ca/test/237/
What's Changed
- Add major correction history by @kevlu8 in #220
- Change SEE to use quadratic formula for captures by @kevlu8 in #221
- Rework TT to have clusters by @kevlu8 in #222
- Add futility pruning by @kevlu8 in #223
- Add minor correction history by @kevlu8 in #224
- Add continuation correction history by @kevlu8 in #225
- Fix illegal moves in SMP by @kevlu8 in #226
- Give more time to think by @kevlu8 in #227
- Reduce depth on fail-high by @kevlu8 in #228
- Remove move score bonus for killers by @kevlu8 in #229
- Do not search excluded move in probcut by @kevlu8 in #231
- Use a dedicated MVV array instead of re-using PieceValue by @kevlu8 in #232
- Fully rewrite LMR by @kevlu8 in #233
- Change node count to atomic by @kevlu8 in #234
- Add NMP verification search by @kevlu8 in #235
- Optional TT entries by @kevlu8 in #236
- Fix history malus handling by @kevlu8 in #237
- Reduce less in all ttpv nodes by @kevlu8 in #238
- Allow small extensions in LMR by @kevlu8 in #239
- Fix tteval handling regarding entries without an eval by @kevlu8 in #240
- Raise alpha on aspiration window fail by @kevlu8 in #241
- Allow more RFP when in a cutnode by @kevlu8 in #242
- Only enable aspiration windows after depth 3 by @kevlu8 in #243
- Add thread pooling by @wdotmathree in #244
- Change TT to be atomic by @kevlu8 in #245
- Fix OOB access by @kevlu8 in #246
- Fix TT store depth on probcut by @kevlu8 in #247
- Fix more overflows by @kevlu8 in #248
- Do some LMR for captures by @kevlu8 in #249
- Do deeper search on fail high by @kevlu8 in #250
- Add 6-ply continuation history by @kevlu8 in #251
- Modify futility pruning margin based on history by @kevlu8 in #252
- Add large memory support by @wdotmathree in #253
- Fix SMP crashes by @wdotmathree in 7364817
- Raise NMP R value and simplify improving by @kevlu8 in #254
- Run second SPSA by @kevlu8 in #255
- Add minimal UCI reporting by @kevlu8 in #256
- Add TT aging by @kevlu8 in #257
- Add multi-cut pruning by @kevlu8 in #258
- Optimize NNUE inference by @wdotmathree in #259
Full Changelog: v6.0...v6.1
v6.0
PZChessBot v6.0 is here, with:
- Bare-bones SMP support, tested up to 8 threads but up to 64 should be supported
- Much stronger NNUE evaluation
- Several search improvements along with a full search tune
Once again, the NNUE is provided for those who wish to compile, but you do not need to download it to run PZChessBot.
Estimated Elo: ~3600 CCRL blitz, 3520 CCRL 40/15
Tests:
main vs v5.0 STC (balanced book):
Elo | 122.83 +- 6.55 (95%)
Conf | 8.0+0.08s Threads=1 Hash=32MB
Games | N: 4044 W: 1813 L: 440 D: 1791
Penta | [5, 126, 604, 1065, 222]
https://ob.int0x80.ca/test/12/
main vs v5.0 LTC (balanced book):
Elo | 114.43 +- 5.95 (95%)
Conf | 40.0+0.40s Threads=1 Hash=128MB
Games | N: 4004 W: 1395 L: 122 D: 2487
Penta | [1, 61, 796, 952, 192]
https://ob.int0x80.ca/test/11/
main vs Tarnished v3.0 LTC (UHO):
Elo | 34.58 +- 8.52 (95%)
Conf | 40.0+0.40s Threads=1 Hash=128MB
Games | N: 2006 W: 646 L: 447 D: 913
Penta | [13, 165, 458, 344, 23]
https://ob.int0x80.ca/test/15/
main vs v4.0 LTC (balanced book):
Elo | 229.78 +- 11.92 (95%)
Conf | 40.0+0.40s Threads=1 Hash=128MB
Games | N: 2006 W: 1229 L: 67 D: 710
Penta | [0, 11, 161, 489, 342]
https://ob.int0x80.ca/test/16/
What's Changed
- Fix raw eval storing by @kevlu8 in #179
- Add an input bucket by @kevlu8 in #180
- Add 2-fold repetition detection by @kevlu8 in #181
- No RFP in ttpv nodes by @kevlu8 in #182
- Add insufficient material detection by @kevlu8 in #183
- Simplify FP and do more LMP by @kevlu8 in #184
- make SEE pruning more aggro by @JonathanHallstrom in #185
- make rfp quadratic by @JonathanHallstrom in #186
- use history to adjust lmr by @JonathanHallstrom in #187
- Fix tt corrected eval to use corrhist by @kevlu8 in #188
- Fix crashes by @kevlu8 in #189
- Use 4 input buckets by @kevlu8 in #190
- Only do SE on first move and do not raise depth of entire node by @kevlu8 in #192
- Do TT corrected eval in QS by @kevlu8 in #193
- Fix overflow in corrhist by @kevlu8 in #194
- Add more hashes for corrhist by @kevlu8 in #195
- Add 3-ply conthist by @kevlu8 in #196
- Adjust NMP return value when mate by @kevlu8 in #197
- Add 4-ply conthist by @kevlu8 in #198
- More LMP when not improving by @kevlu8 in #199
- Change corrhist to use gravity formula by @kevlu8 in #200
- No NMP in PVNodes by @kevlu8 in #202
- Modify corrhist update condition by @kevlu8 in #203
- Add material scaling by @kevlu8 in #204
- Fix aspiration window stuff by @kevlu8 in #205
- Add base reduction constant by @kevlu8 in #206
- Fix move handling and conthist by @kevlu8 in #207
- Remove check extensions by @kevlu8 in #208
- Fix corrhist update conditions by @kevlu8 in #209
- Add nonpawn corrhist by @kevlu8 in #210
- Simplify hash management by @kevlu8 in #211
- Do more SE by @kevlu8 in #212
- Use only 1 killer move by @kevlu8 in #213
- Don't do corrections in singular search by @kevlu8 in #214
- Lower corrhist size by @kevlu8 in #215
- Add major correction history by @kevlu8 in #216
- Revert "Add major correction history (#216)" by @wdotmathree in #217
- Add SPSA Values by @kevlu8 in #218
- Fix MAX_PLY issues and bump version number by @kevlu8 in #219
New Contributors
- @JonathanHallstrom made their first contribution in #185
Full Changelog: v5.0...v6.0
v5.0
This new version mainly features a full re-train of the NNUE from scratch again, with some small bugfixes (notably a ~30% speedup on Windows systems).
+120 Elo @ STC
+90 Elo @ LTC
Estimated CCRL Blitz: 3570 | 40/15: 3480
What's Changed
- Fix genfens functionality; begin retraining NNUE by @kevlu8 in #163
- Add 64HL net by @kevlu8 in #164
- Add output buckets by @kevlu8 in #165
- Add 128HL network by @kevlu8 in #166
- Add HM by @kevlu8 in #167
- Add HL128 network by @kevlu8 in #168
- Add HL512 network by @kevlu8 in #169
- Add tt-corrected eval by @kevlu8 in #170
- Fix mate handling and add MDP by @kevlu8 in #171
- Add HL1024 net by @kevlu8 in #172
- Add double extensions by @kevlu8 in #174
- Add proper CI by @kevlu8 in #175
- Lower HP margin by @kevlu8 in #176
- Lower RFP threshold by @kevlu8 in #177
- Always penalize bad captures by @kevlu8 in #178
Full Changelog: v4.0...v5.0
v4.0
PZChessBot v4.0 is now here! Featuring a fully self-trained NNUE, bootstrapped from a random network.
The network file is provided in case you want it, but is not necessary to run the program. It will work as a standalone executable.
+158 +/- 8 Elo to v3.0 @ STC (8 + 0.08)
+134 +/- 12 Elo to v3.0 @ LTC (60 + 0.6)
What's Changed
- Use TT eval (when available) instead of static eval by @kevlu8 in #69
- Change move selection to use a lazy method by @kevlu8 in #70
- Add razoring by @kevlu8 in #71
- Only probe tt once at beginning by @kevlu8 in #72
- Only do NMP when static eval is high enough by @kevlu8 in #73
- Add SPSA values by @kevlu8 in #74
- Do not reset TT on
positioncommand by @kevlu8 in #75 - Better ordering by @kevlu8 in #76
- Add LMP by @kevlu8 in #77
- Add Singular Extensions by @kevlu8 in #78
- Use improving flag to lower RFP margin by @kevlu8 in #79
- Add history pruning by @kevlu8 in #80
- Add negative extensions by @kevlu8 in #81
- Add QSearch futility pruning by @kevlu8 in #82
- Reduce pv nodes less by @kevlu8 in #83
- Reduce more if tentry is a capture by @kevlu8 in #84
- fix killer move handling by @kevlu8 in #85
- Add horizontal mirroring by @kevlu8 in #86
- Add is_pseudolegal function by @wdotmathree in #87
- Switch bucketing system by @kevlu8 in #88
- skip low depth nodes with bad see by @kevlu8 in #89
- Do not clear corrhist on search by @kevlu8 in #90
- Add pretty output by @kevlu8 in #91
- Raise the depth of the entire node when SE is done by @kevlu8 in #92
- Only allow tt cutoffs in PV and fix TT handling by @kevlu8 in #103
- Add MultiPV support by @kevlu8 in #104
- Completely overhaul PVS system by @kevlu8 in #106
- Change < to <= in razoring by @kevlu8 in #105
- Do not do eval correction when ttEval is mate by @kevlu8 in #107
- Return average of eval and beta in RFP by @kevlu8 in #110
- Add TT to qsearch by @kevlu8 in #111
- Use TT eval when available in QS by @kevlu8 in #112
- Reduce cutnodes more by @kevlu8 in #113
- Use a dynamic PVS SEE margin by @kevlu8 in #115
- Adjust NMP R-value based on depth by @kevlu8 in #116
- Allow razoring to depth 8 by @kevlu8 in #118
- Add corrhist based on a non-pawn position hash by @wdotmathree in #119
- Do shallower NMP when far exceeding beta by @kevlu8 in #120
- Only do LMR at depth over 2 by @kevlu8 in #121
- Don't do LMR on early moves by @kevlu8 in #122
- Add captures only movegen for quiescence by @wdotmathree in #123
- Use lazy move picking for QS by @kevlu8 in #124
- Test adding finny-like tables by @kevlu8 in #125
- Only store upper 32 bits of hash by @kevlu8 in #126
- Simplify out reset logic by @kevlu8 in #127
- Fail firm when failing high by @kevlu8 in #128
- Change time management by @kevlu8 in #129
- Add complexity time management by @kevlu8 in #130
- Disallow NMP at low depth by @kevlu8 in #131
- Test adding TT prefetching by @kevlu8 in #132
- Do not do complexity TM for captures, promotions, and in check by @kevlu8 in #133
- Reduce less on killer moves by @kevlu8 in #134
- Do more reduction in LMR by @kevlu8 in #135
- Do less LMR on rootnode by @kevlu8 in #137
- Do not allow entering QS when TT move is available by @kevlu8 in #136
- Do more NMP when improving by @kevlu8 in #138
- Do not allow NMP in singular searches by @kevlu8 in #139
- Improve makefile and add LTO by @kevlu8 in #140
- Fix ucinewgame behavior by @kevlu8 in #141
- Reduce history magnitudes for each search by @kevlu8 in #142
- Add soft node time management by @kevlu8 in #143
- Fix node counting by @kevlu8 in #144
- Attempt to fix mate score handling by @kevlu8 in #145
- Don't store new move in TT in allnodes by @kevlu8 in #146
- Do not update corrhist on mates by @kevlu8 in #147
- Only do IIR on PV and Cutnodes by @kevlu8 in #148
- Raise SE margin by @kevlu8 in #149
- Use ttDepth - 3 in SE by @kevlu8 in #150
- Break out of moveloop directly by @kevlu8 in #151
- Change history update formula by @kevlu8 in #152
- Do more LMR in nonPV nodes by @kevlu8 in #153
- Fix illegal move issue (disallow pruning when no best move) by @kevlu8 in #154
- Add TTPV flag and do more LMR in TTPV nodes by @kevlu8 in #155
- Add 1-ply conthist for move ordering only by @kevlu8 in #156
- Clean up square control by @wdotmathree in #159
- Use conthist for history pruning by @kevlu8 in #158
- 2-ply conthist by @kevlu8 in #157
- Remove counter-move history by @kevlu8 in #160
- Remove __search function by @kevlu8 in #162
Full Changelog: v3.0...v4.0
v3.0
What's Changed
- Improve aspiration window logic by @kevlu8 in #51
- add a soft time limit in ID loop by @kevlu8 in #52
- Add futility pruning by @kevlu8 in #53
- Vectorize nnue_eval() by @kevlu8 in #54
- add spsa tuned values by @kevlu8 in #55
- add gravity for history by @kevlu8 in #56
- test adding capture history by @kevlu8 in #57
- uncap rfp depth limit by @kevlu8 in #58
- bench: 242114 add spsa values by @kevlu8 in #59
- Input buckets ue by @kevlu8 in #60
- Fix refreshing logic by @kevlu8 in #61
- Precompute LMR tables by @kevlu8 in #62
- Fix bug in castling handling in zobrist by @kevlu8 in #63
- Add pawn correction history by @kevlu8 in #64
- Add correction history for material by @kevlu8 in #65
- Change network hidden layer size to 512 by @kevlu8 in #66
- Change NMP to avoid pruning in non-pawn endgames by @kevlu8 in #67
- Add static exchange evaluation in quiescence search by @kevlu8 in #68
Full Changelog: v2.0...v3.0
STC:
Elo | 211.83 +- 19.24 (95%)
Conf | 8.0+0.08s Threads=1 Hash=32MB
Games | N: 1002 W: 602 L: 57 D: 343
Penta | [2, 15, 109, 186, 189]
https://sscg13.pythonanywhere.com/test/405/
LTC:
Elo | 253.02 +- 18.50 (95%)
Conf | 60.0+0.60s Threads=1 Hash=128MB
Games | N: 1000 W: 633 L: 11 D: 356
Penta | [0, 6, 65, 230, 199]
v2.0
What's Changed
- bench: 120629 add lmr to main by @kevlu8 in #33
- Add output buckets to NNUE by @kevlu8 in #34
- bench: 299703 tune network on .65 wdl by @kevlu8 in #35
- bench: 309079 fully retrain network with low wdl by @kevlu8 in #36
- bench: 273173 add history by @kevlu8 in #37
- bench: 273173 Switch to proper move ordering scheme by @kevlu8 in #38
- bench: 273173 add pv printing by @kevlu8 in #40
- bench: 184778 add counter-move history by @kevlu8 in #41
- bench: 96074 add IIR by @kevlu8 in #42
- Fix 50-move rule handling - also fixes a part of illegal PV by @kevlu8 in #43
- Add reverse futility pruning by @kevlu8 in #44
- bench: 63404 disable nmp when pieces < 8 by @kevlu8 in #45
- Add EGNN evaluation for positions under 12 pieces by @kevlu8 in #47
- Prevent storing of the same killer move by @kevlu8 in #48
- bench: 192920 fix pvs pv issue, also partially fixing low nps issue by @kevlu8 in #50
Full Changelog: 1.0...v2.0
Should be around 3100 strength... I forgot to release so this is long overdue but its ok!
Thanks!
v1.0
What's Changed
- Add NNUE to PZChessBot by @kevlu8 in #23
- 50mr support and eradicate illegal moves by @kevlu8 in #26
- Finalize for release by @kevlu8 in #27
Full Changelog: 20250318T22...1.0
Hey guys! This is the first proper release of PZChessBot. It's been quite a journey these past 2 months, and I look forward to continuing with engine development!
By the way, if any CCRL people come across this, I would greatly appreciate if PZChessBot could get put on the rating list :)
Estimated CCRL rating: 2750
Thanks!
v1.0
Please see tag v1.0!
20250318T22 - NMP and co
- This is still a beta release. The engine has multiple weaknesses and issues.
- This release is approximately 100 ELO stronger than the previous release
- Added null-move pruning
- Minor tweaks to LMR
- Add pawn structure to eval
20250311T07 - Threefold fix
- This is still a beta release. The engine has multiple weaknesses and issues.
- Fixed threefold detection
- Added RFP
- Removed bot/ directory
- Fixed time management
- Overall ~350 ELO gain over previous release