@AndyGrant AndyGrant released this Sep 6, 2018 · 5 commits to master since this release

Assets 7
10.56   : Skip Null Move Pruning when the TT entry is poor
10.57 * : Remove OCB scaling for the Bishop + 2 Knights case
10.58   : Allocate even more time when the score drops between searches
10.59   : Tune BaseKingSafety, and KingSafetyNoQueen constants
10.60   : Reduce Counter Move Pruning for improving nodes
10.61   : Implement "Follow-up History" (SF calls it (ss-2)->contHist)
10.62   : Use Follow-up History for low depth pruning
10.63   : Cleanup Zobrist key implementations
10.64   : Slightly faster Zobrist for non-normal move functions
10.65   : Remove separate Zobrist table for Pawns & Kings
10.66   : Limit Futility Pruning based on History values
10.67   : Tune threat evaluations using NDEPTHS=5 tuning session
10.68   : No longer bound the return value from a TT cutoff
10.69   : Move time management code to a new file, time.c
10.70   : Do ProbCut when in check, use Depth 2 verification search
10.71   : Bonus for Minors in front of our own, or our enemies, pawns
10.72   : Move JChess, EtherealV1, EtherealV2, Ethereal0xFF, to legacy branch
10.73   : Tune PSQT and assorted bonuses for Knights and Bishops
10.74   : Evaluate distance between Passers and each King
10.75 + : Cleanup draw detect and fix a bug, suggested by Ratosh (Pirarucu)
10.76   : Bonus when a Passer has a safe promotion pathway
10.77   : One-time compute of King squares for evaluation function
10.78   : Do more Counter Move / Follow-up Move pruning for non improving nodes
10.79   : Extend ThreatByPawnPush to understand double moves and enpass threats
10.80   : Speedup the move picker, and use SEE(1) for qsearch moves
10.81   : Try at least one quiet move after hitting LMP or FMP conditions
10.82 * : Increase time usage for large score jumps (Hold onto possible wins)
10.83 * : Increase time usage for small score jumps (Hold onto possible wins)
10.84 + : Update chess programming wiki link by Captflint
10.85 + : Fix bug with history hashing for Null Moves, found by Aloril
10.86   : Begrudgingly implement pondering support for Ethereal
10.87   : Simplify time management updates when the PV changes
10.88   : Add NUMA support for Windows as per Stockfish as per Texel
10.89   : Cleanup the Tuner, simplify adding additional terms to the tuner
10.90 + : Tweak Magic Bitboard workings for better cache usage, inspired by Laser
10.91   : Evaluate Pawn storm threats to our King
10.92   : Remove OCB scaling for the Bishop + 2 Rooks case
10.93   : Tune the Pawn Storm threats array
10.94   : NUMA fix when running many copies of Ethereal at once, found by CoffeeOne
10.95   : Use a different SEE margin for quiet vs noisy moves in pruning
10.96   : Don't let a player try two Null moves in a row
10.97 * : Remove OCB scaling for the Bishop + <*> case
10.98 * : Tuning session using NDEPTHS=8
10.99   : Tuning session using NDEPTHS=10
11.00   : Small code cleanups in attacks.c and board.c

@AndyGrant AndyGrant released this Jul 16, 2018 · 50 commits to master since this release

Assets 7
10.01 * : Make the bench able to be run from the command line
10.02   : Increase King Safety in the mid game by 12%
10.03   : Remove some bad FENs from the perft test suite
10.04 * : Remove UCI bench command (only run from command line)
10.05 * : Merge piece.h and types.h (-30 lines of code)
10.06   : Rewrite the Late Move Reductions from scratch
10.07   : More aggressive Late Move Pruning, and simplified
10.08   : Use the same value for SEE Pruning in improving and non improving nodes
10.09   : Remove all trailing white space from the files
10.10   : Fix a compilation issue for debug builds caused by 10.05
10.11   : Cleanup and simplify applyMove() & revertMove() (-100 lines of code)
10.12   : Track Counter Moves for move ordering hueristics
10.13   : Fix an off-by-one issue with the fifty move rule (Seen in a TCEC game)
10.14 * : Correct two wrong FENs in the bench command's list of positions
10.15   : More aggressive LMP for non improving nodes
10.16   : Cap the evaluation difference's contribution to Null Move Pruning
10.17   : Simplify the Aspiration Window search (Torwards Stockfish style)
10.18   : Extend quiet moves coming from in check positions, when good
10.19   : Remove some check extensions that occured before the move loop
10.20   : Hand tune the values for Knight & Bishop outposts
10.21   : Hand tune King Safety contribution from safe checks
10.22   : Update the upper bound when failing low on an Aspiration search
10.23   : Implement Counter Move History, Pruning, and Sorting
10.24   : Swap Counter Move Pruning & Late Move Pruning for a 1% speed gain
10.25   : Apply all of our early pruning techniques to PvNodes (But not RootNodes)
10.26   : Reduce Counter Move History Pruning (CMHP) threshold to 0
10.27   : Cap History contribution to LMR by [-2, 2]
10.28   : Use fail-soft for Razoring, Beta Pruning, and Prob Cut Pruning
10.29 + : Remove the evaluation of the # of rammed pawns when we have Knights
10.30   : Swap the Stockfish's US/THEM naming convention for the Evaluation
10.31   : Evaluate threats by safe pawn pushes
10.32   : Use SEE() to place bad captures after quiet moves in sorting
10.33   : Use different CMHP threshold for improving nodes
10.34   : Remove the Estimated Usage heuristic from Time Managment
10.35   : Changes in an attempt to make Android build work
10.36   : Changed my mind about patch 10.35 and reverted
10.37 + : Evaluate threats on rooks by pawns and minor pieces
10.38   : Adjust some tuning code to match changes in patch 10.37
10.39   : Tweak the LMR formula part 1
10.40   : Tweak the LMR formula part 2
10.41   : Speedgain by using information from move sorting to reduce SEE() calls
10.42   : Only perform razoring at depth 1
10.43   : Simplify time managment: No time adjustments when the score jumps
10.44   : Remove thread dependence from the Aspiration Window values
10.45 + : Tuning by Laldon, a slight bugfix to Threat evaluation, and a KS tweak
10.46   : Evaluate Oppisite Coloured Bishop endgames with a simple scaling factor
10.47   : Cleanup some logic around the Pawn King Evaluation table
10.48   : Use "normal" piece values for SEE() and friends
10.49   : Bugfix-ish: Count Null Moves torwards the 50 move rule counter
10.50   : Speedup by delaying calls to SEE() from the Move Picker
10.51   : Even more aggressive Late Move Pruning
10.52 + : Tweak the definition of Unsupported/Weak pawns in Threat evaluation
10.53   : Remove an extra brace commited in 10.52
10.54   : Use the same definition as 10.52 to evaluate major threats on minors
10.55   : Remove an extra call to hashfull() when reporting TB hits at the root

@AndyGrant AndyGrant released this May 30, 2018 · 105 commits to master since this release

Assets 6
 9.66   : Cleanup some issues in Fathom's code base
        : Use Ethereal's movegen and bit functions
 9.67   : Simplify the way in which helper thread are stopped
        : Move some time management code to its own file
        : Added the UCI option MoveOverhead
 9.68   : There was an eval term for Minor threads against
        : Majors. Changed this to be against just Queens
 9.69   : Remove about 40 Lines from moveIsPsuedoLegal()
 9.70   : Implement SEE(). Use to prune in QSearch
 9.71   : Use SEE() to prune captures and quiets in Search
 9.72   : Penalize weak squares in the King area
 9.73   : Use different SEE() pruning values for improving nodes
 9.74   : Use SEE() for ProbCut, define it for special moves
 9.75   : Change to the definition for Check Extension
 9.76   : Only Check Extend for captures in the search
 9.77 * : Cleanup some code dealing with Bitboards
 9.78 * : Cleanup some code using bit functions (+Speedup)
 9.79 * : Rewrite Knight and King Attack generation
 9.80 * : Rewrite Magic Bitboard generation (-300 Lines)
 9.81   : Use the aging replacement scheme for the TT from Stockfish
 9.82 * : Precompute pawnAttacks(square) (+Speedup)
 9.83 * : Enable PEXT compiles using (+Speedup)
 9.84   : Add nopopcnt, popcnt, and pext targets to the makefile
 9.85   : Store a static eval in the TT
 9.86   : Adjust version number and fix makefile typos
 9.87 * : Adjust the Bitboard masks to be functions instead of arrays
 9.88 * : Retire square.c and square.h, merge with other units
 9.89 * : Add code for printBitboard(), simplify printBoard()
 9.90 * : Rewrite FEN parser, add FEN output to board printing
 9.91   : Simplify some conditions for doing less Late Move Reductions
 9.92   : Remove the eval term QueenAttackedByMinor
 9.93   : Retune threat values after the last change
 9.94   : Do less Move Count Pruning when in an improving node
 9.95   : Condense the Tuner, remove 500+ Lines. More useable.
 9.96   : Evaluate overloaded minors and majors as per Stockfish
 9.97   : Full King Safety rewrite
 9.98 * : Simplify some conversion of moves to strings
 9.99   : Evaluate Safe Checks in King Safety
10.00   : Redefine Safe Checks, and retune

@AndyGrant AndyGrant released this Apr 29, 2018 · 140 commits to master since this release

Assets 5

9.31 : Don't count pawns as threat material in King safety
9.32 : Move time managment code to its own file ( REVERTED )
9.33 : Break LMR researches into 3 steps for PV nodes
9.34 : Quick speedup around move legality and late move pruning
9.35 : Added support for popcount ( Kept the old support too )
9.36 : Reduce probcut margin from 150 to 100 cp
9.37 : Fix some issues when I moved over the TM code
9.38 : More ideal and max alloc time in X+Y
9.39 : Revert recent time managment changes
9.40 : More time control safety, use a lock to respond to isready
9.41 : Evaluate minors based on rammed pawns
9.42 : Skip some futility pruning when in an improving node with good history
9.43 : Rework time managment to something more reasonable
9.44 : Do check extensions before IID and setting the futility margin
9.45 : Merge MG and EG scores into one value, like SF
9.46 : Implement Singular Extensions with depth 10
9.47 : Forgot to commit the depth change from 8 to 10
9.48 : Once we start Late Move Pruning, prune all quiets
9.49 : Fix an issue with calloc when using gcc-4.8 on my Ryzen box
9.50 : Raise in loop futility pruning margin from 85 to 100 per depth
9.51 : Do Late move pruning even when we give check
9.52 : Cleanup logic in move generation ( Reduce LOC )
9.53 : Evaluate threats and weak pawns
9.54 : Report MATE and MATED scores, report upper and lower bounds
9.55 : Report actual bounds, ( fail-hard reporting )
9.56 : Fail hard when probing the Transposition Table ( Surprised )
9.57 : Some cleanup around reporting MATE and MATED scores
9.58 : New Hash replacment, with concern for SMP ( Tested well on many threads )
9.59 : Don't always perform check extensions in non Root PV nodes
9.60 : Speedup around some pruning decisions ( Slight bug fix, really )
9.61 : Tune Late Move Pruning Margins ( More aggressive )
9.62 : More check extensions when in an improving node
9.63 : Add a condition for LMP ( not improving or semi-okay history )
9.64 : Round of Tuning (All parameters but King Safety)
9.65 : Support for Syzygy Tables using Fathom's API (Jon Dart's fork)

@AndyGrant AndyGrant released this Mar 20, 2018 · 175 commits to master since this release

Assets 4

Hello once again. It's only been about a month since I posted the
release of Ethereal9.00, but I think I have made enough gains since
to warrant a new release. I've made a fair number of improvements with
the evaluation, as well as the tuning process behind it. Some search
changes have been made, but mostly speedups and a few parameter tweaks.
As for SMP, nothing has been changed, although not for a lack of trying.
Time management has been as issue as well, or so was reported to me when
watching some of Graham's tournament games. I have made one fix which
should help that issue out, but nothing too ground breaking.

Since Ethereal9.00 I've had some help from someone named Laldon, a
follower of TCEC. He provided a great deal of CPU power for some of
these tuning tests, and identified a very large bug in the Tuner.
He has given me a handful of other patches to try, mostly dealing with
imbalances. We've not gotten them to work yet, but his input and his ideas
are very valuable. Patches that he submitted, or that he suggested /
played a role in are marked in the change log with a *

Some results to give an idea of how much stronger Ethereal is now.
I expect many of the lowest time control scores to be inflated. I
made many changes which provide reasonable speedups, which of course
scale away as the time control increases.

Ethereal 9.30 vs Ethereal 9.00: 450 - 182 - 368  [0.634] 1000 +95 @5s.05s 1-CPU 2MB-HASH
Ethereal 9.30 vs Ethereal 9.00: 375 - 153 - 472  [0.611] 1000 +78 @20+.2s 1-CPU 8MB-HASH

Ethereal 9.30 vs Laser1.5: 384 - 308 - 308  [0.538] 1000 +26 @5s.05s 1-CPU 2MB-HASH
Ethereal 9.30 vs Laser1.5: 408 - 400 - 442  [0.503] 1250 + 2 @20+.2s 1-CPU 8MB-HASH

Change log for those interested:

9.01: * Tuning patch for all non King Safety evaluation parameters
9.02:   Use a smarter form of pseudo legal move generation
9.03: * Another Tuning patch for all non King Safety parameters
9.04:   Cleanup the tuner to allow it to be used more easily (non functional)
9.05:   Fix a bug caused by 9.04 (Lied about it being non functional)
9.06: * Tuning using a massive depth 9 search for all non King Safety
9.07:   Include the King in the Pawn hash (now PawnKing hash), speedup
9.08:   Only update one bound on a fail high or fail low at root
9.09:   Only apply RookOnSeventh when the enemy king is on the back 2 ranks
9.10: * Fix a problem where the tuner could miss-label positions as drawn
9.11:   Reduce ProbCut margin from 200 cp to 140cp
9.12: * Another tuning patch using depth 10 (Due to 9.10 bug fix)
9.13:   Reduce tempo from {20,10} -> {16, 8}
9.14:   Before it took two attacking pieces to trigger the King safety
        evaluation. Now it only takes 1, if the attacking piece is a Queen.
        Also, reduce the threat by pawns in the king safety calculation
9.15:   Scale up all internal values so that the pawn value is 100. Before
        the pawn value was around 60, which was annoying since we all deal
        in centipawns. Also, make the average of each PSQT zero.
9.16:   Tune back some of the pruning values after 9.15
9.17:   Fixed a slight move gen bug which caused slowdowns, not illegal moves
9.18: * Remove evaluation of BishopWings (Bishop with pawns on King and Queen side)
9.19:   Cleanup my simple SEE version called WeakCapturePruning
9.20:   Fix typo in reporting promotion moves caused by 9.19
9.21:   Speedup by skipping all quiet moves once we identify that we will skip all
9.22:   Probe the Trans Table before going into qsearch. I do not probe the 
        table while in qsearch.
9.23:   Ethereal will not take Trans Table exits in PvNodes. However, since Ethereal
        does not treat PvNodes differently in qsearch, we WILL take Trans Table exits
        if we would otherwise descend into qsearch.
9.24:   Allow Ethereal to respect the 'stop' and 'quit' command while searching. I 
        never did this before since no one uses Ethereal for analysis, but since I
        have started doing that while following TCEC, perhaps others might as well
9.25:   The tuner will take a position, generate an eval based on a depth N search,
        and then use the evaluation weights from the end of the PV generated by the
        depth N search. This causes problems since Evaluation is about the potential
        in a position, not the outcome. So now we get the weights from a qsearch instead
9.26:   Penalty for missing pawns in the King Area when doing the King Safety evaluation,
        which is separate from the King Shelter evaluation.
9.27:   Define the King Safety by a polynomial instead of an array. This passed as
        a non-regression. I hope to the grain of the king safety, and a poly allows that
9.28:   Remove something I coined scoreStability from the time management system. Similar
        to how SF defines PV stability, scoreStability reacts to changes in the score,
        which then define time allocations and deallocations
9.29:   Before we would penalize a queen for being attacked by a King. That clearly has
        some issues with it, so it has been removed. Also, fixed a bug where we would
        only evaluation a queen as being attacked by a pawn if the queen was in the
        king area of the opposing side of the queen
9.30:   Fixed an issue where if the first move tried resulted in being check mated,
        we might prune all other moves, and return a false MATED score. I noticed
        a somewhat similar issue in Laser, but overlooked my own issue. Jeffrey was
        able to pass a test for Laser with the fix, which convinced me to look deeper.

As always, a big thank you to the testers.
As well as those who have provided feedback on Ethereal's playing style.

@AndyGrant AndyGrant released this Feb 15, 2018 · 205 commits to master since this release

Assets 4

Hello Again Everyone,

Today I am announcing the release of Ethereal9.00. It's been a wild ride since
adding lazy SMP a few months ago in order to participate in TCEC. A big thanks
to Knight Moves and Anton for having me. It's provided inspriation for a few
patches, and for a handful of bug fixes.

Link to the Talk Chess Release Page: http://www.talkchess.com/forum/viewtopic.php?p=750973#750973

Everytime I take a guess at the elo gains it comes back to bite me, so I'll just
say this; Ethereal is a hell of a lot better with you throw many cores at it. In
fast testing with 4CPUs I am seeing over 250 elo. Obviously that number will not
hold in CCRL conditions, but I expect this version of Ethereal will perform far
better than Ethereal8.61 in conditions like TCEC with 43 cores to work with.

Here is the recap for changes since 8.61, for those interested:
8.61 : Fix a bug with how the main scheduling lock was setup
8.62 : More aggressive time allocation in X/Y games
8.63 : Allow the aspiration window to be as small as [-1, 1]
8.64 : Again more aggressive time allocation in X/Y games
8.65 : Penalty in the eval for a queen attacked by a pawn
8.66 : Prune weak captures that are likely to fail in QS, with
a short / cheap version of SEE. Idea by Dennis Sceviour!
8.67 : Don't apply the weak capture pruning to promotion moves
8.68 : Better time managment in X+Y and X/Y games
8.69 : Introduction of ProbCut, inspired by the Stockfish implementation
8.70 : Apply the weak capture pruning in the search as well as qsearch
8.71 : More aggressive use of weak capture pruning in the search (depth 5)
8.72 : Allow ProbCut to refute a null move (Unlike SF)
8.73 : Allow for a different upper and lower margin on the aspiration window,
by looking at the last 3 search scores. Minumum bound is 4. I believe
this idea is unique to Ethereal -- at least I have never seen it elsewhere
8.74 : Bonus for Pawns and Minors in the King's Safety Area
8.75 : Fix an issue where helper threads were able to allocate more search time,
such that with many threads the max time would be used with every move.
This was found thanks to TCEC, and was worth ~70 ELO in selfplay
8.76 : Take a guess at the time of the next search and consider stopping now
8.77 : Lower base time usage, and allow for much more massive time allocations
8.78 : Add an official Logo for Ethereal, created by DanishStyleFetta!
8.79 : Clean up some threading code (reduce LOC) and allow for max depth of 128
8.80 : Fix a bug where all helper threads would always use the aspiration window
centered around the value zero. This was worth ~80 ELO in selfplay
8.81 : Skip Weak Capture Pruning when in check
8.82 : Implement a basic form of Pawn/King Shelter
8.83 : Use a generalized Piece Square Table for sorting quiet moves
8.84 : Penalty for Minors attacked by Pawns
8.85 : Do not place any value on the R value for Null Move Pruning
8.86 : New time allocation scheme to unify X+Y and X/Y (later reworked...)
8.87 : Resolve a bug where Ethereal could, on very rare occasion, play an illegal
move as a result of the PV not being filled AT ALL, even in the root node
8.88 : Allow beta pruning (static null / futility) when we only have Pawns
8.89 : When doing early pruning (NMP, Razoring, Static Null, and Probcut), always
return alpha or beta. The goal was to make more conservative TT entries
8.90 : Lower the margin for futility pruning / beta pruning to about one pawn
8.91 : Make Ethereal's history counters more like the Stockfish history counters
8.92 : Yet another patch to allow for more aggressive time allocation
8.93 : (CURRENT TM) Allocate three things, an ideal usage, a max usage, and a max
alloc. We will NEVER exceed max usage, and will never start another iteration
after exceeding max alloc. Overtime we adjust a score and pv stability factor
to increase or decrease allocated time with respect to pv stability and scoring
8.94 : Fixed an issue with true-sharing of the transposition table used counter. Now
we sample the first entries in the TT and approximate the hashfull. This was a
huge elo winner with high thread counts
8.95 : Increase base LMR value by one, and reduce it by one when the best move is
a quiet move and the TT move has failed or this is our first quiet attempts
8.96 : Cleanup of capture value pruning decisions and some inconsitencies
8.97 : Remove a pointless flag from the makefile, thanks Laldon!
8.98 : New method of Pawn/King Shelter definition. Before we would be okay with a
King pushing past his pawns, so long as they were still close
8.99 : One big fat tuning patch to update everything the last tune
9.00 : Cleanup the Texel Tuning implementation by using about 10% of the memory
as before, resulting in a 700% speed up in a quick test of tuning

Thanks to everyone who has taken an interest in Ethereal over the last few months.
The ideas and suggestions from the TCEC chat have been incredible.
And, as always, thank you to the testers :)

Thanks,
Andrew Grant

@AndyGrant AndyGrant released this Dec 10, 2017 · 244 commits to master since this release

Assets 3

Hello all,

I'm very excited to announce the release of Ethereal8.60

Etherea8.60 is the first version of Ethereal allowing SMP!

Link to the release on GitHub (Includes Win64 Binary)


Progess since last release (V8.37)

    Ethereal8.60 vs Ethereal8.37

     4MB Hash @ 10s+.1s:  780 - 339 -  881  [0.610] 2000 (+ 78)
    
    32MB Hash @ 60s+.6s: 2425 - 614 - 2961  [0.651] 6000 (+108)
    

Ethereal8.60SMP vs Ethereal8.60

    2Thread vs 1Thread : 322 - 200 - 478  [0.561] 1000 ( +43)
    
    4Thread vs 1Thread : 339 - 157 - 504  [0.591] 1000 ( +64)
    
    8Thread vs 1Thread : 391 - 126 - 483  [0.632] 1000 ( +94)
    
    Too few games to give an exact formula for scaling, but I think
    it is safe to say Ethereal is making use of the extra CPU time
    
Summary Of Changes

    Removed evaluation of ability to castle and have castled
    Allocate more time on PV changes and score drops
    Factor Depth into the LMR equation
    Increase MG Tempo value by a factor of 4
    Do LMR On positions that are in check
    Tuned Late Move Pruning counts
    Compute a aspiration window based on fluxuation of scores
    Allow Beta Pruning (Parent Futility Pruning) up to D=8
    Compute R value for LMR based on depth and eval
    Evaluate Backwards pawns
    Treat many in check positions the same as non check searches
    Fixed a bug where depth went below zero
    No longer scale down safety when there are no rooks on the board
    More heaviliy scale down safety when there are no queens on the board
    Do not allow LMR to decend right into qsearch
    Apply a penalty for the queen being under attack
    Don't apply a connected bonus to a backwards pawn
    Texel Tuning using a depth 1 search instead of static eval
    
I would like to thank Lucas for his very clear implementation of SMP
in his engine Demolito. I used his implementation as a template for
how I would do it in Ethereal. They ended up being very different, but
are much the same at their core. From here I'll make my own tweaks to
improving the scaling of SMP

I'm hoping the changes, along with 4CPU, can push Ethereal over 3000

Andrew Grant

** EDIT : Fixed uninitialized pthread_mutex_t **

Dec 10, 2017
Add LazySMP to Ethereal
BENCH : 15,651,638

@AndyGrant AndyGrant released this Nov 10, 2017 · 268 commits to master since this release

Assets 3

Functional Changes:
Implemented Texel Tuning for almost all parameters
First tuned PSQT and PassedPawns (+24 ELO @ 30s+.03s)
Then tuned everything but king params (+40 ELO @ 30s+.03s)
Implemented the same SRNG that Stockfish uses in order to get a bench for all platforms
Lowered some futility margins (+9ELO @ 60s+.06s)

Non-Functional Changes
Added a bench marking output similar to stockfish
Extended PV Tracking to include qsearch (longer lines, no functional difference)
Make use of __builtin_ctzll(bb) for getLSB. Should be portable, assuming gcc?

Testing against a pool of engines shows about a +70 ELO gain, (more with the LSB change). My pool is becoming outdated, so that could be an inflated (or hopefully deflated) estimate.

@AndyGrant AndyGrant released this Sep 13, 2017 · 277 commits to master since this release

Assets 4

Functional Changes:

  • Clear History between games, not between searches & Reduce History before each search
  • Fixed an issue were the engine would crash with games going ~500 moves (Now crashes at ~2K)
  • Added a form of Late Move Pruning / Move Count Pruning, based on number of quiets tried
  • Added Razoring a la Stockfish, with a few more conditions
  • Fixed a bug where the same position could have two different hash representations, depending on whether it was set using a FEN or a startpos + move list
  • Fixed a bug with the rook psqt updates during castling
  • Now taking special care of MATE scores for the table (talkchess.com/forum/viewtopic.php?t=64937), thanks to a bug found by Werner Schüle
  • Combined the rootSearch and alphaBetaSearch (the general form) into one function

Non-functional Changes:

  • Reformatted the vast majority of the evaluation code in order to encapsulate evaluation for each piece in their own functions, which resulted in a measurable speed up (on my machines) of 2-4% depending on game phase.
  • Documented the main search() routine, a la Stockfish.
  • Removed 729 Lines of Code

Testing against a pool of opponents in EtherBench shows a gain of ~70 ELO. As always, I expect that figure to be inflated, but I hope not!