• 1.4.2 dfc3f00b09

    nocturn9x released this 2025-09-25 18:11:43 +02:00 | 60 commits to master since this release

    Nothing to see here, move along

    Greetings! This release exists mostly to address a nasty bug caused by incorrect score clamping that would make heimdall find non-existent M127 lines in positions with a very high evaluation

    What changed

    • The aforementioned bug has been fixed
    • All of heimdall's parameters were tuned to account for the addition of correction history
    • The TT score is used in place of the static eval in RFP when possible

    Strength

    Nothing particularly interesting here, I'm just adding this section for completeness

    UHO_Lichess_4852_v1.epd

    STC:

    Elo   | 4.34 +- 7.76 (95%)
    Conf  | 40.0+0.40s Threads=1 Hash=64MB
    Games | N: 2002 W: 453 L: 428 D: 1121
    Penta | [4, 229, 512, 250, 6]
    

    https://kelseyde.pythonanywhere.com/test/1688/

    LTC:

    Elo   | 1.56 +- 5.48 (95%)
    Conf  | 40.0+0.40s Threads=1 Hash=64MB
    Games | N: 2002 W: 160 L: 151 D: 1691
    Penta | [0, 123, 748, 128, 2]
    

    https://kelseyde.pythonanywhere.com/test/1693/

    No 8moves_v3 testing this release: the gains are already insignificant enough with an UHO book so I'm not going to waste additional compute on balanced book testing for it to tell me the elo change is near-zero.

    Also, we purple now boy! As of version 1.4.1, Heimdall has officially broken the 3600 Elo barrier in the CCRL Blitz list. Exciting!

    See you for 1.5!

    Downloads
  • 1.4.1 471aba51e0

    nocturn9x released this 2025-09-03 19:25:32 +02:00 | 84 commits to master since this release

    Corrhistdall is here. Please do not panic.

    Hewwo, not much has changed since the last release... except for the fact I finally managed to get correction history to work! Turns out when your A/B isn't broken, stuff gains. Go figure

    What changed

    • Added the following correction histories:
      • Pawn
      • Non-pawn
      • Minor piece
      • Major Piece
    • Multi-cut pruning is now implemented
    • Heimdall will now be more pedantic when it comes to pondering: a go ponder command sent without checking the Ponder option will cause the engine to complain on screen and resign
    • Added a few options to generate training data via UCI (check the commits for more info)

    Strength

    Not groundbreaking, but corrhist and multicut were a decent chunk of Elo nonetheless

    UHO_Lichess_4852_v1.epd

    STC:

    Elo   | 19.46 +- 8.28 (95%)
    Conf  | 8.0+0.08s Threads=1 Hash=16MB
    Games | N: 2002 W: 532 L: 420 D: 1050
    Penta | [7, 200, 490, 282, 22]
    

    https://kelseyde.pythonanywhere.com/test/1374/

    LTC:

    Elo   | 33.11 +- 7.72 (95%)
    Conf  | 40.0+0.40s Threads=1 Hash=64MB
    Games | N: 2000 W: 567 L: 377 D: 1056
    Penta | [7, 146, 504, 336, 7]
    

    https://kelseyde.pythonanywhere.com/test/1376/

    8moves_v3.epd

    STC:

    Elo   | 16.92 +- 7.03 (95%)
    Conf  | 8.0+0.08s Threads=1 Hash=16MB
    Games | N: 2014 W: 290 L: 192 D: 1532
    Penta | [12, 121, 644, 217, 13]
    

    https://kelseyde.pythonanywhere.com/test/1375/

    LTC:

    Elo   | 14.43 +- 5.62 (95%)
    Conf  | 40.0+0.40s Threads=1 Hash=64MB
    Games | N: 2000 W: 200 L: 117 D: 1683
    Penta | [0, 88, 750, 153, 9]
    

    https://kelseyde.pythonanywhere.com/test/1385/

    Given that Heimdall 1.4 hasn't yet been tested on the CCRL Blitz list, its estimated rating is likely going to be wrong, but still: this should put Heimdall at around ~3659 (UHO) and ~3616 (balanced) Elo, hopefully finally breaking through the 3600 Elo mark (outside of error bars, of course)

    See ya for Heimdall 1.5!

    Downloads
  • 1.4.0 1b3057575a

    nocturn9x released this 2025-07-28 09:43:15 +02:00 | 99 commits to master since this release

    Or did I?

    Well, actually it was @__arandomnoob. After a LONG time, I'm finally releasing a new version of Heimdall

    What better way to start the release notes than showing off this BEAUTIFUL bugfix test?

    Elo   | 89.69 +- 12.09 (95%)
    SPRT  | 8.0+0.08s Threads=1 Hash=16MB
    LLR   | 2.92 (-2.25, 2.89) [0.00, 3.00]
    Games | N: 978 W: 363 L: 116 D: 499
    Penta | [2, 37, 187, 238, 25]
    

    https://chess.n9x.co/test/3266/

    What changed

    • Fixed a critical bug in the alpha-beta implementation of both PVS and Quiescence where a beta cutoff would not be considered an alpha raise, causing the best move not to be stored (see test above)
    • Merged a slightly improved neural network trained on the new data from mistilteinn-v2 using a training schedule cooked up by @ciekce, thanks!
    • Implemented ttpv tracking: nodes that were previously part of a principal variation are now reduced less aggresively
    • Some fixes to time management which should hopefully address the time loss issues in high concurrency environments at fast time controls (bullet) like at CCC (Thanks Andrew for the precious debugging help and time on the chesscom machines!)
    • Both RFP and NMP are now avoided in nodes that were previously in the principal variation
    • History depth is now increased if bestScore beats beta by some threshold
    • Added threat indexing to capture history
    • Added support for static contempt with the Contempt UCI option
    • TT scores are now used in qsearch standpat cutoffs when possible
    • The ShowWDL option was renamed to UCI_ShowWDL to comply with the UCI specification
    • Tweaked the initial size of the aspiration window
    • Improving is no longer true if we were in check 2 plies ago
    • The evaluation is now immediately cached to the TT if we didn't get a hit in the current node
    • Separated the weights used for material scaling from the ones used for SEE and made both sets tunable
    • Parameterized RFP to allow tuning the improving margin separately
    • Implemented mate distance pruning
    • Search is reduced less when improving is true
    • Futility pruning is now more aggressive
    • Fixed an overflow bug when handling mated TT scores
    • Fixed some rare PV reporting bugs and optimize clearing the triangular table
    • The position's static evaluation is now returned instead of 0 when hitting the ply limit
    • When SIMD is available (in the avx2 and avx512 targets), it's used to speed up refreshes and finny table updates
    • SEE is not re-run for known good/bad moves in qsearch
    • All captures are now ordered by their MVV score, not just losing ones
    • Killer and counter moves are reduced less aggressively
    • Captures are reduced far less aggressively (reduction is halved)
    • A bunch of internal code changes. Refactoring, cleanup, etc.
    • The neural network is now embedded in the engine in a way that avoids weight duplication even across multiple, independent processes
    • A healthy dose of SPSA tuning

    So, yeah, a lot of stuff. Although now that Heimdall's search is no longer broken, I expect many things to gain. Correction history in Heimdall 1.5? Who knows. Time will tell...

    Strength

    This is the first triple digit improvement after a long Elo drought. Exciting!

    UHO_Lichess_4852_v1.epd

    STC:

    Elo   | 99.70 +- 8.95 (95%)
    Conf  | 8.0+0.08s Threads=1 Hash=16MB
    Games | N: 2012 W: 807 L: 245 D: 960
    Penta | [5, 73, 363, 485, 80]
    

    https://chess.n9x.co/test/3538/

    LTC:

    Elo   | 117.55 +- 8.24 (95%)
    Conf  | 40.0+0.40s Threads=1 Hash=64MB
    Games | N: 2000 W: 841 L: 189 D: 970
    Penta | [0, 48, 320, 564, 68]
    

    https://chess.n9x.co/test/3544/

    8moves_v3.epd

    STC:

    Elo   | 88.92 +- 8.62 (95%)
    Conf  | 8.0+0.08s Threads=1 Hash=16MB
    Games | N: 2000 W: 621 L: 120 D: 1259
    Penta | [3, 60, 453, 401, 83]
    

    https://chess.n9x.co/test/3539/

    LTC:

    Elo   | 93.57 +- 7.40 (95%)
    Conf  | 40.0+0.40s Threads=1 Hash=64MB
    Games | N: 2000 W: 569 L: 43 D: 1388
    Penta | [0, 22, 485, 438, 55]
    

    https://chess.n9x.co/test/3545/

    Extrapolating from the CCRL Blitz rating of Heimdall 1.3.0 (3509) and using the LTC result for consistency, this puts Heimdall's estimated Elo at ~3626 (UHO) and 3602 (balanced), respectively. As always, expect big rating swings for the first few days/weeks post-release, as it takes a while for ratings to stabilize on most continually updated lists. I also expect compression to start hitting Heimdall MUCH harder on CCRL (especially 40/15, but Blitz is also very compressed around the 3600 Elo mark). Oh, by the way, for those interested I have become a CCRL tester and started a DFRC rating list using a book of unbalanced openings. Come check it out! Thanks a lot to Bastii and Graham Banks for the support :)

    P.S.: The next major Heimdall release, 1.5, will feature a multi-layer network. Such tech, much SIMD, very OwO.

    See you all very soon. Can't stop me now :3

    P.P.S.: The release binaries now contain the version number for Heimdall, since some cats people complained about that :)

    P.P.P.S.: The AVX512 binary for windows is coming soon!

    Downloads
  • 1.3.2 a55f09765b

    nocturn9x released this 2025-04-01 14:08:18 +02:00 | 221 commits to master since this release

    Happy April Fools!

    This release is not a joke though! I have noticed some issues in the new SMP system relating to the way state is (not) reset after ucinewgame, leading to all sorts of weird behavior and incorrect node/nps reporting. This release addresses that

    PSA: The executables have been temporarily removed due to a minor issue with startup time when using many threads. The issue has been fixed and the release binaries will be available shortly

    PSA 2: The issue has been fixed and the new executables are now available. To make sure you have the correct version, please download them again

    What changed

    Even less stuff compared to the release of 1.3.1, actually:

    • Quiescence search now skips pruning for recapturing moves
    • Implemented a new idea by @cj regarding LMR in previous plies
    • lmrDepth is now used in PVS SEE pruning
    • Quiet moves are now reduced more in LMR
    • Fix bookkeeping of reduction offsets in the search stack (bugfix for child node LMR extensions)
    • If SE search fails high, reductions are also applied at expected cut nodes
    • The thread pool now gets properly reset (but not restarted!) upon receiving ucinewgame

    Strength

    As for the previous bugfix release, I do not expect Heimdall's balanced opening rating to have changed much, so I'll be providing UHO results only. These tests have been ran against version 1.3 as that is the one I have the best outside strength references for

    STC:

    Elo   | 17.72 +- 8.41 (95%)
    Conf  | 8.0+0.08s Threads=1 Hash=16MB
    Games | N: 2002 W: 505 L: 403 D: 1094
    Penta | [14, 194, 490, 282, 21]
    

    https://chess.n9x.co/test/1206/

    LTC (I accidentally ran an SPRT instead of a fixed game test :P):

    Elo   | 22.28 +- 8.37 (95%)
    SPRT  | 8.0+0.08s Threads=1 Hash=16MB
    LLR   | 2.01 (-2.25, 2.89) [0.00, 3.00]
    Games | N: 2186 W: 609 L: 469 D: 1108
    Penta | [14, 222, 498, 328, 31]
    https://chess.n9x.co/test/1207/
    

    Here follows the latest 2v1 scaling test to ensure the new thread pool fix is working as intended: from +68 to +80!

    Elo   | 80.17 +- 11.41 (95%)
    SPRT  | 8.0+0.08s Threads=2 Hash=32MB
    LLR   | 2.91 (-2.25, 2.89) [0.00, 3.00]
    Games | N: 1032 W: 360 L: 126 D: 546
    Penta | [2, 38, 224, 228, 24]
    

    https://chess.n9x.co/test/1202/

    Scaling test after fixing the startup slowdowns:

    Elo   | 78.60 +- 11.69 (95%)
    SPRT  | 8.0+0.08s Threads=2 Hash=32MB
    LLR   | 2.89 (-2.25, 2.89) [0.00, 3.00]
    Games | N: 1016 W: 343 L: 117 D: 556
    Penta | [0, 49, 207, 229, 23]
    

    https://chess.n9x.co/test/1213/

    P.S.: Windows executables coming soon!

    Downloads
  • 1.3.1 4cdc2338d4

    nocturn9x released this 2025-03-19 18:40:43 +01:00 | 238 commits to master since this release

    Bugs, bugs everywhere...

    Greetings! Today I'm releasing a bugfix version of Heimdall that fixes the pondering issues introduced in the previous release. Thanks to RBB (Discord) and @FischerRandomChess in the TCEC twitch chat for reporting the issue to me! :)

    ⚠️ Multithreading has some issues in this version. Please wait for the next release to run any SMP testing!

    What changed

    Honestly, not a lot strenght-wise, but still:

    • UCI option names and values are now case insensitive in accordance with the spec
    • Pondering is now fixed and behaves as expected
    • "Fail mid" is now implemented in reverse futility pruning
    • 4-ply continuation history
    • A slightly improved neural network
    • A completely new SMP system that uses a custom thread pool and no longer wastes time spawning threads at each go command
    • The UCI command loop now also uses a persistent worker thread instead of creating one each time
    • Triple extensions (after singular search result)
    • Child node LMR extensions
    • TT initialization is now multithreaded: Heimdall will use as many workers as configured by Threads
    • TT prefetching in quiescence search
    • Support for the mimalloc allocator has been dropped
    • Use "fail-medium" in stand-pat cutoffs in quiescence search
    • Improvements and fixes to repetition detection
    • Many small fixes (OOB errors, safety, etc.)
    • Refactored many helpers to be branchless
    • Fix bugs related to EnableWeirdTCs
    • Fix a bug that caused crashes when parsing FENs without full-move numbers
    • PV nodes are reduced if the TT probe result suggests a cutoff
    • Development/beta builds will now feature the commit hash in the version string even on Windows

    Strength

    This release isn't that much stronger than the previous one (it is a bugfix, after all), but there have been some gainers still. I won't be publishing numbers with balanced books, as this kind of testing already takes a lot of time and I only want to bother with it for strength-significant releases, so these tests were run with the usual UHO_Lichess_4852_v1.epd book:

    STC:

    Elo   | 15.76 +- 8.81 (95%)
    Conf  | 8.0+0.08s Threads=1 Hash=16MB
    Games | N: 2008 W: 537 L: 446 D: 1025
    Penta | [20, 207, 465, 286, 26]
    

    https://chess.n9x.co/test/1130/

    LTC:

    Elo   | 6.25 +- 7.76 (95%)
    Conf  | 40.0+0.40s Threads=1 Hash=64MB
    Games | N: 2000 W: 447 L: 411 D: 1142
    Penta | [4, 218, 527, 240, 11]
    

    https://chess.n9x.co/test/1131/

    Here also follows a test showing the scaling for the new SMP system (2v1 went from +55 to +68!):

    Elo   | 68.32 +- 11.03 (95%)
    SPRT  | 8.0+0.08s Threads=2 Hash=16MB
    LLR   | 2.92 (-2.25, 2.89) [0.00, 3.00]
    Games | N: 1128 W: 363 L: 144 D: 621
    Penta | [2, 54, 256, 227, 25]
    

    https://chess.n9x.co/test/794/

    See you at the next release!

    P.S.: Windows releases coming soon™️ as always

    Downloads
  • 1.3 42d7b81ac0

    nocturn9x released this 2025-02-01 16:52:47 +01:00 | 301 commits to master since this release

    Long time no see

    Hello there! Today I'm releasing a new version of Heimdall with lots of exciting new changes

    ⚠️ Pondering is bugged in this version! Please don't use it. I'll fix it ASAP

    What changed

    • SEE has been completely stolen from Stormphrax ahem, I mean rewritten, to use a faster, more efficient iterative algorithm
    • Heimdall now caches accumulator refreshes (aka "finny tables")
    • A healthy dose of LTC SPSA tuning
    • LMR is increased if the current move is quiet while the hash move is a capture
    • The network architecture has changed: the L1 is now 1536 neurons long instead of 1280
    • Heimdall's networks now use merged king planes, allowing for a nice 8% FT size reduction at no cost
    • Futility pruning now uses base LMR depth for its limit condition
    • History LMR divisors have been separated (and tuned) for noisy vs quiet moves
    • A lot of cleanup in subcommand parsing/handling
    • Various cosmetic fixes and addition to the pretty logs
    • Heimdall can now generate standard chess data (the new network was trained with a mix of standard and dfrc data)
    • Added a new, experimental data filtering tool
    • Node TM was actually fixed this time (for realsies tho)
    • The TT now only stores partial zobrist keys
    • NMP now features verification search
    • MAX_DEPTH is now respected exactly in search (it was off by one)
    • Quiescence search now stores a lower bound score to the TT before stand-pat cutoffs
    • NMP now uses TT information in its condition
    • Various minor fixes to many parts of the codebase
    • Improving is now used in RFP
    • NMP reduction is now increased based on static eval and beta

    Also many many thanks to @Ciekce for adding AVX512 support!

    Strength

    Wow, that was a lot huh? Elo is getting harder and harder to get, but we still have some nice gains here.

    Since it was requested to me by the author of the ipmanchess list, I will now be providing both STC and LTC progtests played with a balanced book (8moves_v3.epd) alongside the usual ones with the UHO_Lichess one. The estimated Elo will still always be
    based on the UHO results, as I feel those are more representative of engine strength (you are free to disagree :))

    UHO_Lichess_4852_v1.epd

    STC:

    Elo   | 86.08 +- 9.36 (95%)
    Conf  | 8.0+0.08s Threads=1 Hash=16MB
    Games | N: 2014 W: 774 L: 285 D: 955
    Penta | [3, 114, 366, 439, 85]
    

    https://chess.n9x.co/test/699/

    LTC:

    Elo   | 72.61 +- 8.36 (95%)
    Conf  | 40.0+0.40s Threads=1 Hash=64MB
    Games | N: 2000 W: 704 L: 292 D: 1004
    Penta | [2, 105, 413, 439, 41]
    

    https://chess.n9x.co/test/701/

    8moves_v3.epd

    STC:

    Elo   | 68.67 +- 8.49 (95%)
    Conf  | 8.0+0.08s Threads=1 Hash=16MB
    Games | N: 2004 W: 547 L: 156 D: 1301
    Penta | [4, 91, 480, 364, 63]
    

    https://chess.n9x.co/test/709/

    LTC:

    Elo   | 57.14 +- 7.39 (95%)
    Conf  | 40.0+0.40s Threads=1 Hash=64MB
    Games | N: 2000 W: 431 L: 105 D: 1464
    Penta | [1, 70, 569, 322, 38]
    

    https://chess.n9x.co/test/710/

    Using the CCRL Blitz rating of Heimdall 1.2.2 (3476) and using the LTC result for consistency, this puts Heimdall's estimated Elo at ~3548!

    Notes

    In the interest of delivering the best performance to as many machines as possible and increasing transparency, the way binaries are named has changed. The -core2 builds are now the lowest common denominator, with -haswell (previously -modern) being a more modern alternative (only works on supported CPUs, just try it) and -zen2 being the most performant option that is still somewhat generic. There's also -avx512 binaries that should work on recent CPUs (AMD Zen 4/Intel Kaby Lake or later) and can net a substantial speedup depending on the underlying hardware implementation. To get the best possible performing binary, please build it on your machine with the make native command

    Downloads
  • 1.2.2 0b31f63d63

    nocturn9x released this 2024-12-13 11:01:50 +01:00 | 369 commits to master since this release

    Upsie

    This release addresses a bug that I had inadvertently introduced while refactoring Heimdall's SMP functionality. For simplicity (and my own sanity), I have reverted the change and switched back to the old way of spawning threads, which means they are re-created at every go command (inefficient, but at least it works!)

    Please refer to 1.2's release notes for an accurate changelog and strength improvements

    SMP Scaling

    Here follows the results of a 2v1 threads test I ran to verify that I had indeed fixed my multithreading support:

    Elo   | 55.14 +- 10.85 (95%)
    SPRT  | 8.0+0.08s Threads=2 Hash=16MB
    LLR   | 2.89 (-2.25, 2.89) [0.00, 3.00]
    Games | N: 1328 W: 419 L: 210 D: 699
    Penta | [4, 94, 288, 245, 33]
    https://chess.n9x.co/test/475/
    

    I would've ran a 4v2 test as well, but my workers choke with that many threads so no dice :(

    P.S.: Windows binaries coming soon™️

    Downloads
  • 1.2.1 a28900ae64

    nocturn9x released this 2024-12-12 21:56:41 +01:00 | 373 commits to master since this release

    I bring thee great news

    ⚠️ ⚠️ Notes for testers ⚠️ ⚠️

    SMP is currently broken in this version, so please don't test it with anything other than Threads=1! I will fix this ASAP and release version 1.2.2 soon!

    Hello again! A few things have changed since the release of Heimdall 1.2

    What changed

    • The crashing issues have been resolved. Many thanks to all the folks who helped in the Nim discord server, but especially @tsoj for finding the actual bug!
    • Heimdall now implements eval normalization (displayed scores are now anchored such that +1 means a 50% win probability, similarly to Stockfish) as well as WDL estimation (with the ShowWDL option). Many thanks to the developers who created the WDL model!
    • Negative extensions are now more aggressive
    • The second killer move has been simplified out
    • The Makefile can now be used to build release-ready binaries on all supported platforms (Windows, Linux)
    • The search has been refactored to be faster and nicer to develop for in general (+15 STC Elo!)

    P.S.: Heimdall's search rewrite is now officially on hold (since the original goal was to address some pain points in the search, which I have done with the refactor, and fix the crashing which is no longer a problem)

    P.P.S.: Eval normalization can be turned on or off with the NormalizeScore option, which is true by default (if you care about raw engine unit values, for some reason, the option is there. Weirdo.)

    Progtest

    Here follow the STC progtest against the previous version using the UHO_Lichess_4852_v1 book:

    Elo   | 9.36 +- 12.33 (95%)
    Conf  | 8.0+0.08s Threads=1 Hash=16MB
    Games | N: 1002 W: 249 L: 222 D: 531
    Penta | [11, 105, 244, 128, 13]
    https://chess.n9x.co/test/472/
    

    This places this version's estimated Elo at around 3500!

    Downloads
  • 1.2.0 87f01164ec

    nocturn9x released this 2024-12-06 16:36:41 +01:00 | 390 commits to master since this release

    Well well well

    Hiya! After much work, here comes a brand spanking new version of Heimdall.

    What Changed

    • go mate now works as intended
    • The clock is now started as soon as the go command is parsed, so Heimdall should hopefully behave correctly at tournaments like CCC
    • The neural network now has 4 times more buckets than before (from 4 to 16) and the hidden layer is now 1280 neurons instead of 1024. That comes out to roughly 6 times more weights than the previous version!
    • Implemented negative and double extensions
    • Fix marlinformat serialization reporting the wrong score (turns out it's supposed to be white-relative!)
    • Twofold repetition is now used whenever possible, speeding things up significantly in drawn positions
    • Minor tweaks and fixes

    Progtests

    As usual, here follow the STC and LTC progtests against the previous version using the UHO_Lichess_4852_v1 book:

    STC:

    Elo   | 99.89 +- 14.64 (95%)
    Conf  | 8.0+0.08s Threads=1 Hash=16MB
    Games | N: 1022 W: 453 L: 167 D: 402
    Penta | [6, 53, 167, 219, 66]
    https://chess.n9x.co/test/433/
    

    LTC:

    Elo   | 87.26 +- 12.69 (95%)
    Conf  | 40.0+0.40s Threads=1 Hash=16MB
    Games | N: 1000 W: 408 L: 162 D: 430
    Penta | [7, 41, 177, 249, 26]
    https://chess.n9x.co/test/435/
    

    This puts 1.2's estimated Elo at around 3490! (top 50 maybe? who knows!)

    Notes

    In recent testing I've noticed some rare crashes that I have been unable to reproduce. If you do encounter a crash, please report it to me with the PGN of the offending game so I can track the issue down! Hopefully this issue will just disappear with version 1.3, which I plan to be a complete search rewrite

    Downloads
  • 1.1.1 8ab4837b52

    nocturn9x released this 2024-10-20 22:24:24 +02:00 | 427 commits to master since this release

    Well, that's embarassing

    What changed

    This is a hotfix for Heimdall 1.1 that addresses a bug in the implementation of node time management worth about 53 SPRT Elo at LTC (40+0.4). For more info see https://chess.n9x.co/test/359/

    The same rules for picking a binary apply as for Heimdall 1.1, please refer to that release for a more complete changelog and other info

    Downloads