That is in line with my experience and that of others who've recently implemented a TT. I got 41 Elo from the TT cuts, 102 Elo from the move ordering, and 140 from the combination. That was a bit lower than the 160 some other engines were getting... and now I know why. I lost about 20 points due to that mate handling bug.algerbrex wrote: ↑Thu Sep 23, 2021 12:55 amI usually test at 3+0.08s and 15+0.1s time controls, so the larger TT size I'm using may be underperforming. I'll try reducing the size, although I remember the Elo gain was fine when I manually set the TT size before each game to 128 MB. I got around 55 Elo from the TT-cuts, 100 Elo from the move order, and 160 Elo from both combined.mvanthoor wrote: ↑Wed Sep 22, 2021 10:12 pm At what time control do you test? If you play really fast games like I do, at 10s+0.1s (at this time), it could be that a 64 MB TT doesn't get filled up during a game. Then it doesn't actually matter how large it is. To make sure the TT and its replacement scheme are fully used, I test with only a 16 MB TT. That fills up in about about 30 moves on my computer. (That is intentional, as 30 moves is about half the average game length. On a faster computer that can see farther in the same time, it may fill up faster, so I'd make the TT a bit larger.)
When I implemented the TT in Rustic Alpha 2, I noticed that some of the utterly devastating mating attacks were gone. I just ascribed this to the TT and its possible instability, etc... but now that I fixed the mate handling, these are back again! I've been watching some of the test games, and Rustic sometimes plays as if it's 1851 again: sacrifice everything, and mate with the last piece that's left.
The reason is that Rustic is a very fast engine compared to most others in its current rating range. These other engines get their rating from an extensive evaluation (i.e., good positional play), where Rustic gets its rating from search depth. So if Rustic doesn't get positionally outplayed early on, there's a high chance that it will see a mating attack long before the opponent does.
To be honest, I'm more happy with Rustic regaining that part of its personality than with the 15-20 Elo points

Personally I never saw any use in a separate root search. The root is when the number of ply's is 0, so I just have a variable "let is_root = (ply == 0)". When I want something to happen (or not happen) in the root, I just guard it with an if-statement. For me, that's much less confusing than having two almost the same, but not quite identical search functions.Strangely enough, now that I've rewritten my search routine to no longer have a dedicated negamax function for the root, the Elo gain from enabling vs disabling the TT is pretty awful, like ~15 ELo, so I'll need to look into that too, as I think going forward it'll be easier to just have one negamax function.
First get the search completely right, then the TT, and then try PVS.
Note: PVS should gain somewhere between 50-55 Elo. At least, it did for me. If you implement PVS, it can be that Aspiration Windows don't work (anymore), or they can interfere with PVS. If you have those, I'd remove them before implementing PVS, and then try re-adding them later, in different stages of development. Sometimes, adding function X will suddenly make function Y work, or work better, but it depends on the engine. (Speed, evaluation function, the specific implementation of functions...)