The last couple of nights several versions of the engines have been running tests.
Rustic Alpha 2 is the current version.
2.3.99 is Alpha 2 with two killer moves.
2.4.99 is Alpha 2 with two killer moves + history heuristic indexed by [piece][to], on alpha cuts
2.5.99 is Alpha 2 with two killer moves + history heuristic indexed by [side][piece][to], on both alpha and beta cuts
The results, without a TT, start position:
Code: Select all
Alpha 2, no TT, no killers, no history
info score cp 15 depth 7 seldepth 24 time 3532 nodes 33252202 nps 9414553
info score cp 5 depth 8 seldepth 26 time 29272 nodes 261511445 nps 8933843
Alpha 2.3.99, two killers, no history
info score cp 15 depth 7 seldepth 20 time 145 nodes 1108358 nps 7643848
info score cp 5 depth 8 seldepth 23 time 998 nodes 7191252 nps 7205663
Alpha 2.4.99, two killers, history by [piece][to] (on alpha cutoff)
info score cp 15 depth 7 seldepth 18 time 123 nodes 828468 nps 6735512
info score cp 5 depth 8 seldepth 23 time 885 nodes 5111010 nps 5775153
Alpha 2.5.99, two killlers, history by [side][piece][to] (on both alpha & beta cutoffs)
info score cp 15 depth 7 seldepth 16 time 106 nodes 736443 nps 6947575
info score cp 5 depth 8 seldepth 22 time 741 nodes 4449979 nps 6005370
The killer moves have a massive impact: almost as big as hash move sorting. (Maybe I should have put them into Alpha 1 already.) History heuristic has a noticeable improvement in speed, at least in the start position. The version with the [side][piece][to] indexing (which is basically a combination between what seems to be called "butterfly" history heuristic and "traditional" history heuristic) and increasing the heuristic on both alpha and beta cuts seems to be the fastest.
With a 32MB TT, mainly to be able to use the TT Move sorting:
Code: Select all
Alpha 2, 32MB TT, no killers, no history
info score cp 15 depth 7 seldepth 21 time 204 nodes 1631280 nps 7996471 hashfull 49
info score cp 5 depth 8 seldepth 23 time 598 nodes 4131456 nps 6908789 hashfull 148
info score cp 15 depth 9 seldepth 27 time 3677 nodes 26807077 nps 7290475 hashfull 737
Alpha 2.3.99, 32MB TT, two killers, no history
info score cp 15 depth 7 seldepth 18 time 57 nodes 375646 nps 6590281 hashfull 16
info score cp 5 depth 8 seldepth 21 time 258 nodes 1528494 nps 5924395 hashfull 79
info score cp 15 depth 9 seldepth 25 time 1101 nodes 7273534 nps 6606298 hashfull 307
Alpha 2.4.99, 32MB TT, two killers, history [piece][to] on alpha-cutoff
info score cp 15 depth 7 seldepth 18 time 56 nodes 337747 nps 6031196 hashfull 14
info score cp 5 depth 8 seldepth 22 time 296 nodes 1619808 nps 5472324 hashfull 83
info score cp 15 depth 9 seldepth 23 time 1397 nodes 7862014 nps 5627784 hashfull 355
Alpha 2.5.99, 32MB TT, two killers, history [piece][piece][to] on both alpha & beta cutoffs
info score cp 15 depth 7 seldepth 18 time 56 nodes 323766 nps 5781536 hashfull 14
info score cp 5 depth 8 seldepth 22 time 287 nodes 1537274 nps 5356355 hashfull 77
info score cp 20 depth 9 seldepth 23 time 1255 nodes 6846554 nps 5455422 hashfull 323
Killers still have a big influence, but less than without the TT. The history heuristic gets a bit wonky: it can cause a larger time to depth, while still searching less nodes; at least in the starting positions. Chess Programming Wiki says that in current-day algorithms, the history heuristic may be useless and to be considered "random noise".
I tested these version on a very fast 5s+0.1 time control, in gauntlets running for 5500 games, always against the same pool:
Code: Select all
# PLAYER : RATING POINTS PLAYED (%)
1 MinimalChess 0.4.1 : 2417.3 1215.5 2000 61
2 Rustic Alpha 2.5.99 : 2355.5 3273.5 5500 60
3 Rustic Alpha 2.4.99 : 2351.9 3247.5 5500 59
4 Rustic Alpha 2.3.99 : 2348.3 3221.0 5500 59
5 Chareth 0.1.0 : 2340.0 999.0 2000 50
6 CDrill Build 4 : 2314.4 926.5 2000 46
7 Clueless 1.4 : 2305.8 902.0 2000 45
8 Rustic Alpha 2 : 2305.5 2900.5 5500 53
9 Bit Genie 1.0.0 : 2299.9 885.5 2000 44
10 Wukong JS 1.5 : 2281.4 834.0 2000 42
11 Zahak 0.3.0 : 2278.9 827.0 2000 41
12 Loki 1.2.0 : 2274.5 815.0 2000 41
13 Pigeon 1.5.1 : 2263.2 784.0 2000 39
14 Zahak 0.2.1 : 2233.0 704.0 2000 35
15 Wukong JS 1.4 : 2130.4 465.0 2000 23
(Rustic performed better than expected; it seems lots of engines aren't really that good for superfast time controls. In a 2m+1s time control, Rustic is somewhere just above the middle of the list.)
The 2.5.99 version with the side-piece-to indexing, on both alpha and beta cuts has the highest Elo-rating. OK; it's only 7 elo compared to the version without any history heuristics. As this heuristic is a last ditch effort to SOMEHOW sort moves if it had a cut ANYWHERE, that's not surprising. I didn't yet run a test for 2.5.99 on a longer time control, but I don't expect it to gain much Elo. Version 2.4.99 only gained 2 Elo.
Because the history heuristic seems to have a positive impact if the transposition table is disabled, or the when the time control is very fast, I'll leave it in for now, but I could see a point where I'll remove it from the engine.
The current development version of Rustic is about 40 Elo (+/- 10, depending on the opponents and how the list is calibrated) stronger than Alpha 2. I don't really think that's enough for a release, so I'll first implement aspiration windows, and PVS.
By the way: the killers and history information are in the SearchInfo struct, so they will be reset on each new search. I've tried to move both one level up into the Search struct, but because the search is already designed to be(come) multi-threaded, I'd have to put the heuristics in a Mutex.
First: having the heuristics available for the entire game without resetting dit not bring a significant reduction in node count compared to the resetting version. (On some positions, the node-count even was worse...)
Second: having to lock and unlock the mutex cost so much time that any positive change with regard to the availability of the heuristics was completely obliterated. (To be honest: as expected.) I have nuked this branch and I'm not even going to test it. A time-to-depth that is about 75% longer than the previous version can't be any good.
===
PS: I also updated a few pages in Rustic's book/documentation. The beginning with the technical stuff has been made.