# What percentage of the time does White win in the Lomonosov tablebase?

Studies show a slight advantage for White for having the first move. In the tablebase of trillions of 7-piece endgames, with White to move, how many of those endgames end up as wins, how many as losses, and how many as draws for White? And what are the numbers for 6, 5, 4, etc piece endgames?

• It's 50-50, because if White wins a position, White loses the position with colors reversed, and both are in the database. The rest is drawn. Jul 9, 2020 at 19:11
• As @77and33is100 notes, the winning percentage for black and white is the same because of symmetry. Without having checked I would strongly suspect that only one version is stored in the data. Jul 9, 2020 at 20:24
• The question could be made more interesting by rephrasing it to read: What percentage are wins as compared to draws? Jul 9, 2020 at 20:24
• The question was not intended to compare black and white, as user1583209 detected. For each tablebase entry, with white to move, are the totals 50% win, 49% loss, 1% draw, or what? Jul 9, 2020 at 20:35
• I've edited the original question to try and phrase it better. Jul 10, 2020 at 2:22

As I do not have access to the full Lomosonov tablebases, here is an answer based on the Syzygy tablebases, which are available online in machine-readable format. I interpret your question as "how often does the side to move win, lose or draw". As the Syzygy tablebases only include positions where White has material advantage, we have to add the statistics with White to move to the statistics with Black to move.

## You are going to be disappointed

It seems that there are actually more positions in which the side to move loses. The reason seems to lie in the positions with large material imbalance. For example, consider KQQQQQvK. If you check that link, you will see that:

• with White to move, there are 37 099 315 080 winning positions for White (see "histogram":"white":"wdl":"2", the format is explained here)
• with Black to move, there are 334 280 290 500 winning positions for White (losing positions for Black), which is about 9 times more! (see "histogram":"black":"wdl":"-2")

The reason for this is that, in KQQQQQvK, most of the positions are checks or checkmates. These positions are legal with Black to move, but illegal with White to move. This strongly biases the statistics to the point that the non-moving side (White) actually has more winning positions than the moving side.

I wrote a Python program to count the wins, draws and loses of the side to move for 3 to 7 pieces. Here are the results. In the spirit of open source/reproducible research, the source code is also included below. As these results are somewhat surprising, I will be happy to be informed of possible mistakes I may have made.

``````3- to 7-man Syzygy tablebases
Total positions: 945907910147154
Side to move loses: 439240886147124 (46.4359%)
Side to move loss saved by 50-move rule: 1405811609374 (0.1486%)
Draws: 124655757593757 (13.1784%)
Side to move win saved by 50-move rule: 1511382741156 (0.1598%)
Side to move wins: 379094072055743 (40.0773%)

3-man Syzygy tablebases
Total positions: 367868
Side to move loses: 99222 (26.9722%)
Side to move loss saved by 50-move rule: 0 (0.0000%)
Draws: 166126 (45.1591%)
Side to move win saved by 50-move rule: 0 (0.0000%)
Side to move wins: 102520 (27.8687%)

4-man Syzygy tablebases
Total positions: 143702885
Side to move loses: 48712335 (33.8980%)
Side to move loss saved by 50-move rule: 0 (0.0000%)
Draws: 45850555 (31.9065%)
Side to move win saved by 50-move rule: 0 (0.0000%)
Side to move wins: 49139995 (34.1956%)

5-man Syzygy tablebases
Total positions: 32612482961
Side to move loses: 12895319023 (39.5411%)
Side to move loss saved by 50-move rule: 38951980 (0.1194%)
Draws: 7248043033 (22.2248%)
Side to move win saved by 50-move rule: 33205648 (0.1018%)
Side to move wins: 12396963277 (38.0129%)

6-man Syzygy tablebases
Total positions: 6170694290902
Side to move loses: 2634258815181 (42.6898%)
Side to move loss saved by 50-move rule: 8110268813 (0.1314%)
Draws: 1075100392347 (17.4227%)
Side to move win saved by 50-move rule: 7817500373 (0.1267%)
Side to move wins: 2445407314188 (39.6294%)

7-man Syzygy tablebases
Total positions: 939704459302538
Side to move loses: 436593683201363 (46.4607%)
Side to move loss saved by 50-move rule: 1397662388581 (0.1487%)
Draws: 123573363141696 (13.1502%)
Side to move win saved by 50-move rule: 1503532035135 (0.1600%)
Side to move wins: 376636218535763 (40.0803%)
``````

## Source code

``````import json
import numpy as np

fd=open('stats.json')

wdl_keys=('-2', '-1', '0', '1', '2')
wdl=np.zeros((5, 5), dtype=np.uint)

for key, value in data.items():
n_pieces=len(key)-1
for i_wdl in range(5):
# add WDL data for White to move
wdl[n_pieces-3, i_wdl]+=value['histogram']['white']['wdl'][wdl_keys[i_wdl]]
# add WDL data for Black to move
wdl[n_pieces - 3, i_wdl] += value['histogram']['black']['wdl'][wdl_keys[i_wdl]]

total_positions=np.sum(wdl)
total_wdl=np.sum(wdl, axis=0)
print('3- to 7-man Syzygy tablebases')
print('Total positions: {:d}'.format(total_positions))
print('Side to move loses: {:d} ({:.4f}%)'.format(total_wdl[0], 100.0*float(total_wdl[0])/float(total_positions)))
print('Side to move loss saved by 50-move rule: {:d} ({:.4f}%)'.format(total_wdl[1], 100.0*float(total_wdl[1])/float(total_positions)))
print('Draws: {:d} ({:.4f}%)'.format(total_wdl[2], 100.0*float(total_wdl[2])/float(total_positions)))
print('Side to move win saved by 50-move rule: {:d} ({:.4f}%)'.format(total_wdl[3], 100.0*float(total_wdl[3])/float(total_positions)))
print('Side to move wins: {:d} ({:.4f}%)'.format(total_wdl[4], 100.0*float(total_wdl[4])/float(total_positions)))

positions=np.sum(wdl, axis=1)
for i_pieces in range(5):
print()
print('{:d}-man Syzygy tablebases'.format(i_pieces+3))
print('Total positions: {:d}'.format(positions[i_pieces]))
print('Side to move loses: {:d} ({:.4f}%)'.format(wdl[i_pieces, 0], 100.0 * float(wdl[i_pieces, 0]) / float(positions[i_pieces])))
print('Side to move loss saved by 50-move rule: {:d} ({:.4f}%)'.format(wdl[i_pieces, 1], 100.0 * float(wdl[i_pieces, 1]) / float(positions[i_pieces])))
print('Draws: {:d} ({:.4f}%)'.format(wdl[i_pieces, 2], 100.0 * float(wdl[i_pieces, 2]) / float(positions[i_pieces])))
print('Side to move win saved by 50-move rule: {:d} ({:.4f}%)'.format(wdl[i_pieces, 3], 100.0 * float(wdl[i_pieces, 3]) / float(positions[i_pieces])))
print('Side to move wins: {:d} ({:.4f}%)'.format(wdl[i_pieces, 4], 100.0 * float(wdl[i_pieces, 4]) / float(positions[i_pieces])))
``````
• Only 13-14% of all 3-7 piece endgames being technical draws is a very interesting data point at first glance, Jul 10, 2020 at 9:35
• however, a similar bias applies: these 13-14% are much more likely to occur from a real game than all the KQQQQQvKs that only happen in amateur games with one side refusing to give up and the other trolling. Jul 10, 2020 at 9:38
• @Annatar yes, not considering the prior (probability of those positions occurring) is definitely a large source of bias. It might be interesting to find the percentages for balanced positions (same material on both sides), though I suspect those will give an overwhelming advantage to the side to move
– wimi
Jul 10, 2020 at 11:15
• You could filter positions with both sides to move. Given the code, I might try it myself, but I am too lazy. Oct 1, 2022 at 20:56