I've done some preliminary testing of some suggested changes in the delta pruning routine I posted at the beginning of this ridiculous thread.
The original routine:
Code: Select all
Exec<color>(*move, *child);
if (!(checks | child->checks | (move->Promo() == (color|Queen)) | (abs(alpha) >= WinningScore)) &
((standPat + ValueOf(move->Cap()) + _qsearchDelta[-depth]) < alpha))
{
_stats.deltaCount++;
Undo<color>(*move);
if (_stop) {
return beta;
}
continue;
}
This is inside the qsearch move loop. And in the results below it is referred to as "Clunk DELTA".
The 3 new configurations that have been added since the last time I posted the round-robin results are:
Clunk DELTA 150 = _qsearchDelta[-depth] replaced with hard-coded value of 150
Clunk DELTA 150 NoWS = Removed (abs(alpha) >= WinningScore) test from DELTA 150
Clunk DELTA NoWS = Removed (abs(alpha) >= WinningScore) test from original routine
The bullet round-robin results with these 3 new engine configurations added in:
Code: Select all
Engine Score Cl Cl Cl Cl Cl Cl Cl Ki Cl Cl Cl Cl Cl Cl Cl Cl Fa TS S-B
01: Clunk ALL 258.5/340 ······ 9-5-6 10-7-3 11-3-6 10-3-7 11-4-5 13-2-5 12-6-2 14-4-2 15-2-3 14-2-4 16-0-4 17-1-2 13-2-5 11-2-7 14-1-5 13-0-7 19-1-0 41146.
02: Clunk NO ALPHA 250.5/340 5-9-6 ······ 9-3-8 10-4-6 12-6-2 9-5-6 8-1-11 13-4-3 11-3-6 15-3-2 10-2-8 15-2-3 13-4-3 14-2-4 14-0-6 17-0-3 17-0-3 17-0-3 39343.
03: Clunk NO LMR 226.5/340 7-10-3 3-9-8 ······ 11-4-5 12-4-4 9-8-3 9-5-6 7-7-6 14-2-4 7-5-8 11-4-5 10-3-7 16-1-3 12-1-7 12-3-5 13-1-6 15-3-2 16-1-3 35600.
04: Clunk BETA 208.0/340 3-11-6 4-10-6 4-11-5 ······ 8-7-5 9-6-5 8-9-3 9-7-4 11-7-2 12-6-2 12-4-4 13-3-4 13-4-3 12-3-5 13-3-4 13-4-3 15-3-2 16-1-3 31996.
05: Clunk LMR 207.0/340 3-10-7 6-12-2 4-12-4 7-8-5 ······ 8-5-7 9-6-5 6-8-6 11-5-4 8-6-6 12-3-5 11-6-3 9-3-8 11-2-7 12-1-7 10-1-9 18-0-2 17-0-3 31581.
06: Clunk NMP 206.0/340 4-11-5 5-9-6 8-9-3 6-9-5 5-8-7 ······ 7-6-7 9-7-4 10-6-4 10-4-6 10-4-6 8-7-5 9-2-9 14-3-3 12-1-7 11-4-5 17-1-2 18-0-2 31637.
07: Clunk NO BETA 205.0/340 2-13-5 1-8-11 5-9-6 9-8-3 6-9-5 6-7-7 ······ 10-4-6 8-6-6 14-3-3 10-2-8 12-4-4 13-2-5 11-5-4 12-4-4 11-1-8 11-3-6 18-1-1 31428.
08: KingSlayer 189.5/340 6-12-2 4-13-3 7-7-6 7-9-4 8-6-6 7-9-4 4-10-6 ······ 10-9-1 7-10-3 9-8-3 9-4-7 8-4-8 13-5-2 12-4-4 11-4-5 17-1-2 16-1-3 29160.
09: Clunk FUTILITY 174.0/340 4-14-2 3-11-6 2-14-4 7-11-2 5-11-4 6-10-4 6-8-6 9-10-1 ······ 7-5-8 8-7-5 10-3-7 13-4-3 9-6-5 9-5-6 9-5-6 12-5-3 18-0-2 26314.
10: Clunk DELTA 150 NoWS 161.0/340 2-15-3 3-15-2 5-7-8 6-12-2 6-8-6 4-10-6 3-14-3 10-7-3 5-7-8 ······ 9-5-6 9-2-9 2-9-9 7-10-3 7-8-5 9-3-8 16-2-2 15-2-3 24455.
11: Clunk 149.0/340 2-14-4 2-10-8 4-11-5 4-12-4 3-12-5 4-10-6 2-10-8 8-9-3 7-8-5 5-9-6 ······ 4-8-8 12-6-2 8-8-4 10-5-5 6-9-5 11-4-5 13-2-5 22917.
12: Clunk DELTA 150 143.5/340 0-16-4 2-15-3 3-10-7 3-13-4 6-11-3 7-8-5 4-12-4 4-9-7 3-10-7 2-9-9 8-4-8 ······ 9-7-4 7-7-6 9-6-5 11-5-4 11-4-5 10-6-4 21981.
13: Clunk ALPHA 143.5/340 1-17-2 4-13-3 1-16-3 4-13-3 3-9-8 2-9-9 2-13-5 4-8-8 4-13-3 9-2-9 6-12-2 7-9-4 ······ 9-6-5 8-4-8 10-7-3 10-4-6 19-1-0 21040.
14: Clunk DELTA 141.0/340 2-13-5 2-14-4 1-12-7 3-12-5 2-11-7 3-14-3 5-11-4 5-13-2 6-9-5 10-7-3 8-8-4 7-7-6 6-9-5 ······ 9-7-4 8-7-5 11-5-4 16-3-1 21185.
15: Clunk RZR 132.0/340 2-11-7 0-14-6 3-12-5 3-13-4 1-12-7 1-12-7 4-12-4 4-12-4 5-9-6 8-7-5 5-10-5 6-9-5 4-8-8 7-9-4 ······ 7-4-9 8-5-7 16-1-3 19853.
16: Clunk DELTA NoWS 127.5/340 1-14-5 0-17-3 1-13-6 4-13-3 1-10-9 4-11-5 1-11-8 4-11-5 5-9-6 3-9-8 9-6-5 5-11-4 7-10-3 7-8-5 4-7-9 ······ 12-3-5 13-3-4 19000.
17: FairyMax 90.0/340 0-13-7 0-17-3 3-15-2 3-15-2 0-18-2 1-17-2 3-11-6 1-17-2 5-12-3 2-16-2 4-11-5 4-11-5 4-10-6 5-11-4 5-8-7 3-12-5 ······ 15-4-1 13312.
18: TSCP64 47.5/340 1-19-0 0-17-3 1-16-3 1-16-3 0-17-3 0-18-2 1-18-1 1-16-3 0-18-2 2-15-3 2-13-5 6-10-4 1-19-0 3-16-1 1-16-3 3-13-4 4-15-1 ······ 7583.7
Note the margin of error is very high in this round robin because it is a bullet tournament and the number of games (3060) is "relatively" low. But given that it takes days to complete even this small/fast tournament it's as much as I have patience for in my "preliminary" testing. The best looking options coming out of the preliminary tests will be put through more tournaments with longer time controls, etc.
Mostly what I look at here is the number of losses to weaker engines like TSCP and FairyMax. A higher than average number of losses to those engines is probably indicative of some major tactical weakness introduced by the routine(s) the engine is configured to use.
And a high win/loss ratio (like 10-3) is probably significant enough to be meaningful even under these conditions.
I also ran all the engine configs through some test positions. Results sorted by SCORE, then KNODES/SEC, then AVG_DEPTH
https://chessprogramming.wikispaces.com/Win+at+Chess 1 second per position
Code: Select all
ENGINE, SCORE, KNODES/SEC, AVG_DEPTH
clunk.no_alpha, 96.00, 1411.97, 22
clunk.all, 95.33, 1351.19, 22
clunk.beta, 95.00, 1447.83, 20
clunk.nmp, 95.00, 1431.39, 20
clunk.no_lmr, 95.00, 1369.70, 20
clunk.lmr, 94.33, 1369.80, 20
clunk.no_beta, 94.33, 1273.81, 20
clunk.futility, 92.33, 1444.39, 19
clunk, 92.00, 1416.61, 18
clunk.rzr, 92.00, 1372.86, 18
clunk.delta, 92.00, 1338.24, 18
clunk.delta_nows, 92.00, 1326.05, 18
clunk.delta150, 92.00, 1297.84, 18
clunk.alpha, 92.00, 1290.92, 18
clunk.delta150_nows, 92.00, 1284.00, 18
https://chessprogramming.wikispaces.com ... but+deadly 5 seconds per position
Code: Select all
ENGINE, SCORE, KNODES/SEC, AVG_DEPTH
clunk.futility, 80.60, 1153.86, 8
clunk.beta, 79.85, 1131.96, 10
clunk.no_alpha, 79.85, 1112.68, 13
clunk.no_beta, 79.85, 1019.30, 10
clunk.lmr, 79.10, 1101.99, 10
clunk.nmp, 78.36, 1115.88, 10
clunk.alpha, 78.36, 1047.43, 8
clunk.delta150_nows, 78.36, 1026.56, 8
clunk.delta150, 78.36, 1021.06, 8
clunk.rzr, 77.61, 1108.07, 8
clunk.delta_nows, 77.61, 1093.99, 8
clunk.delta, 77.61, 1085.98, 8
clunk.no_lmr, 77.61, 1037.67, 10
clunk, 76.87, 1148.65, 8
clunk.all, 76.87, 1026.93, 13
https://chessprogramming.wikispaces.com ... Kopec+Test 10 seconds per position
Code: Select all
ENGINE, SCORE, KNODES/SEC, AVG_DEPTH
clunk, 70.83, 1204.80, 12
clunk.rzr, 70.83, 1162.70, 12
clunk.delta_nows, 70.83, 1135.24, 12
clunk.delta, 70.83, 1125.40, 12
clunk.all, 70.83, 1099.33, 18
clunk.alpha, 70.83, 1090.00, 12
clunk.delta150_nows, 70.83, 1054.57, 12
clunk.delta150, 70.83, 1052.38, 12
clunk.beta, 66.67, 1201.89, 15
clunk.nmp, 66.67, 1187.36, 15
clunk.no_alpha, 66.67, 1175.56, 18
clunk.lmr, 66.67, 1168.08, 15
clunk.no_lmr, 66.67, 1107.50, 15
clunk.no_beta, 66.67, 1062.40, 15
clunk.futility, 62.50, 1213.10, 13
https://chessprogramming.wikispaces.com/Kaufman+Test 10 seconds per position
Code: Select all
ENGINE, SCORE, KNODES/SEC, AVG_DEPTH
clunk.beta, 92.00, 1378.55, 14
clunk.nmp, 92.00, 1350.68, 14
clunk.lmr, 92.00, 1321.05, 14
clunk.no_lmr, 92.00, 1319.46, 14
clunk.futility, 88.00, 1380.35, 11
clunk, 88.00, 1358.04, 11
clunk.no_alpha, 88.00, 1339.62, 17
clunk.rzr, 88.00, 1309.54, 11
clunk.all, 88.00, 1303.97, 18
clunk.delta, 88.00, 1302.58, 11
clunk.delta_nows, 88.00, 1295.84, 11
clunk.alpha, 88.00, 1258.98, 11
clunk.delta150, 88.00, 1243.16, 11
clunk.no_beta, 88.00, 1238.51, 14
clunk.delta150_nows, 88.00, 1236.75, 11
https://chessprogramming.wikispaces.com/LCT+II 15 seconds per position
Code: Select all
ENGINE, SCORE, KNODES/SEC, AVG_DEPTH
clunk.all, 60.00, 1214.06, 16
clunk.beta, 57.14, 1317.98, 13
clunk.nmp, 57.14, 1297.85, 12
clunk.no_alpha, 57.14, 1285.37, 16
clunk.lmr, 54.29, 1260.34, 13
clunk.no_lmr, 54.29, 1226.73, 13
clunk.no_beta, 48.57, 1153.65, 13
clunk.futility, 45.71, 1322.05, 10
clunk, 37.14, 1293.11, 10
clunk.rzr, 37.14, 1259.19, 10
clunk.delta, 37.14, 1222.25, 10
clunk.delta_nows, 37.14, 1209.28, 10
clunk.alpha, 37.14, 1190.69, 10
clunk.delta150, 37.14, 1176.58, 10
clunk.delta150_nows, 37.14, 1161.56, 10
I will also do tests with the following routine and the same variations (but I haven't gotten to it yet):
Code: Select all
if (!(checks | (move->Promo() == (color|Queen)) | (abs(alpha) >= WinningScore)) &
((standPat + ValueOf(move->Cap()) + _qsearchDelta[-depth]) < alpha))
{
_stats.deltaCount++;
if (_stop) {
return beta;
}
break; // don't examine any more moves
}
Exec<color>(*move, *child);
The above routine is what HGM suggests, if I'm not misinterpreting something. The main differences from the original are:
1) don't care whether a move gives check or not, so no need to make the move first (in order to figure out whether it gives check)
2) since moves are ordered in MVV/LVA fashion don't search any more moves once the first move that falls bellow the threshold is found.