TCEC Season 20


The 20th season of the Top Chess Engine Championship began on 1 December 2020 and ended on 1 February 2021. The defending champion was Stockfish, which defeated Leela Chess Zero in the previous season's superfinal. The season 20 superfinal was a rematch between the same two engines. Stockfish once again came out ahead, winning by 6 games.

Overview

TCEC underwent some major changes for season 20. There were a plethora of new engines participating in the Qualification League for the first time. Furthermore, two major new rules changes went into effect:
  1. Engines are no longer disqualified if they crash three times, although crashes are still treated as losses.
  2. The "TCEC win rule", which stated that games are adjudicated as won if both engines showed a +10 eval or greater for 5 consecutive moves, is abolished. Instead, games are played until mate, 3-fold repetition, the 50-move rule is reached, a Syzygy 6-piece tablebase position is reached, or if the "TCEC draw rule" kicks in.
The decision to treat crashes differently also meant that the number of crashes was no longer used for tiebreaks. Furthermore, r-mobility was lifted to the second tiebreak condition.
Finally, the advent of NNUE in the previous season led to several engines that implemented NNUE showing quantum leaps in strength. To keep the participant lineup unique, TCEC implemented guidelines for engines that utilize NNUE: one is allowed to use basic NNUE code freely, but modifications are encouraged, and all training data should be generated from the engine's own search and eval code.

Qualification League

When the qualification league started, several engines had not responded to the invitations sent by TCEC. As a result, the number of promoting engines increased from the original two to four.
The qualification league contained mostly engines playing in TCEC for the first time. New entrant Seer wound up winning the league easily, scoring 8 wins and conceding none. Fellow new entrant Halogen finished second, a point behind, after losing the head-to-head against Seer. Koivisto had the most polarized performance: in its 12 games, it won five times but crashed the remaining seven games. The result left it half a point behind A0lite and just out of the promotion spots.
Koivisto's polarized performance led TCEC to implement an exceptional ruling: although updates are not usually allowed between the lower leagues, if an engine promotes, it would be allowed to fix any crash-causing bugs.

League table

Results

Engines play each other twice, once as white and once as black.

League 4

Similar to the qualification league, the number of engines promoting from League 4 was increased to three because of the lack of response from Gogobello.
QL winner Seer won League 4 with a dominating performance, scoring 8 wins and only losing one game. It further scored a win against 2nd-placed Weiss, as well as defeating tail-enders A0lite, Bagatur, and FabChess 2-0. Weiss remained in contention until the very last round in spite of its loss to Seer. It won 9 games, but also lost three, to finally finish half a point behind. Fourth-place finisher Monolith scored a win against Weiss and third-place finisher Tucano, but nonetheless finished behind Tucano because of Tucano's strong performance against the bottom half of the field: Tucano scored +5 against the four bottom-placed engines, while Monolith was only even. With three promotion slots only, Tucano squeezed past Monolith, half a point ahead.

League table

Results

Engines play each other twice, once as white and once as black.

League 3

Wielding new NNUE evaluation functions, Minic and Nemorino finished comfortably above the competition in first and second place. The two engines tied in points - Nemorino had one fewer win, but also lost no games - and the head-to-head score was even as well. The tie was eventually broken by r-mobility, the first time this criterion was used. Nemorino wound up ahead. r-mobility also broke the tie between third-placed Seer, fourth-placed Tucano and fifth-placed Combusken, this time causing Seer to promote. The three engines, along with six-placed Weiss, were very close with each other throughout the league. Seer threw away one game against Weiss, who also scored a win against Combusken. However, Weiss lost both games against Nemorino, and was only even against Counter, Topple and Pirarucu. This caused Weiss to eventually finish sixth, half a point behind its other three rivals.

League table

League 2

After an update before the start, League 3 winner Nemorino won League 2, scoring 8 wins and only losing one game. Second place was closely contested, with eventual third-place finisher Vajolet getting whitewashed by both Nemorino and fourth-placed Pedone, but dominating the bottom half of the table. Both Vajolet and Defenchess managed to finish a point ahead of Pedone, but r-mobility tiebreaks had to be used to decide Defenchess as the promoting engine.
At the other end of the table, in a surprising reversal of fortunes, fellow promoted engine Minic, which had finished level on points with Nemorino in League 3, suffered 6 losses with only one win to finish in the relegation zone. r-mobility tiebreaks then condemned Minic to relegation, with the third promoted engine Seer finishing just above Minic in spite of not winning any games.

League table

League 1

A new, high-bias opening book led to a very bloody League 1, as engine after engine took turns to win an opening. By the end of the league there had been 13 game pairs in which engines traded wins. Nonetheless, there were also a lot of decisive game pairs, and every engine lost at least one opening. When the dust settled Ethereal finished first, two points ahead of rofChade and Igel. rofChade lost both openings to Ethereal, but beat Nemorino and Defenchess twice. Comparatively, Igel won both openings against Ethereal, but also lost both openings to Xiphos, eventually missing out on promotion to rofChade on r-mobility tiebreaks.
At the other end of the table, Defenchess was quickly left behind, but the last relegation spot was closely contested, with only one point separating four engines. Ultimately Nemorino was relegated.

League table

Premier Division

A high-bias opening book, similar to that used in League 1, meant that Premier Division also saw many decisive games. However, many of the stronger engines were able to defend when they had the black pieces while winning game after game with the white pieces. Defending champion Stockfish cruised to an early lead when it not only defended with black successfully, but even won two games with black, against Scorpio and rofChade. It further won an opening against season 19 runner-up Leela Chess Zero in round two. As the division progressed, however, Leela kept up a relentless chase: at the end of the third round robin, it had won all but two games it played with white, and narrowed the gap further by winning an opening against Stockfish. Leela finally caught Stockfish in the fourth round robin when Stockfish lost with black against Stoofvlees. Behind for the first time, Stockfish kept things interesting with a streak of wins against rofChade, Scorpio, Ethereal, and the reverse game against Stoofvlees. It came down to the final game between Stoofvlees and Leela, which Leela needed to hold with the black pieces. This would have let it tie Stockfish on points, and win the division because it had better r-mobility tiebreaks. It successfully managed to draw, allowing Leela to win the Premier Division for the second time.
For the other contestants, traditional powerhouse Komodo played with a NNUE evaluation function for the first time. The effect was immediately apparent, as after flirting with relegation in previous seasons it finished solidly third this season, well behind Stockfish and Leela but ahead of AllieStein and Stoofvlees. Komodo was also the only engine other than Stockfish to win a game with the black pieces. AllieStein was the only engine to play without an update from the previous season, but still managed to finish fourth. Scorpio and Ethereal fought a close battle to avoid relegation. Scorpio blundered a few mate-in-ones due to an apparent bug in its code, but scored a head-to-head win, and was also able to draw two more games against AllieStein than Ethereal. It finally finished sixth, 1.5 points clear of the relegation zone. rofChade, the only engine playing without neural network-based eval, finished solidly last without winning a single opening.

League table

Superfinal

Stockfish won the superfinal. Jeroen Noomen, who writes the opening book used, decided to order the openings such that the most balanced openings are played first. As a result, the first half of the superfinal saw draw after draw, with Stockfish narrowly in the lead after winning games 33 and 49. At the start of the second half, Leela narrowed the score by winning games 52 and 56. There followed a tense period where the superfinalists traded wins, but beginning from game 71 Stockfish scored six wins without reply to take a big, and as it turned out decisive, lead. Stockfish mathematically won the superfinal after drawing game 95. The final score was +14 -8 =78 in favor of Stockfish.

Notable games

In an article published shortly after the superfinal, GM Matthew Sadler called the superfinal a 'captivating' affair which Stockfish won because it was better at defending inferior positions. The following are selected from the many games analyzed by GM Sadler.

Games 5/6

Because the openings were ordered in ascending bias, it was very unexpected for an opening pair this early to yield a 1-0, 1-0 result. In analyzing the book exit position, GM Sadler found that older versions of Stockfish could not tell how dangerous White's position is until it had searched to a high depth.
Stockfish–Leela Chess Zero, game 5 : 1. d4 Nf6 2. c4 e6 3. Nc3 Bb4 4. e3 O-O 5. Bd3 b6 6. e4 Bb7 7. e5 Bxg2 8. exf6 g6 9. Bg5 d5 10. Qg4 Bxh1 11. O-O-O dxc4 12. Bc2 Bb7 13. Nh3 Re8 14. Qh4 Bf3 15. Rg1 e5 16. Bd2 Nd7 17. Ng5 Nxf6 18. dxe5 Bxc3 19. Bxc3 Nh5 20. Qxc4 Qd5 21. Qh4 Qc6 22. Qh3 Rad8 23. Qxf3 Qxf3 24. Nxf3 Nf4 25. Bd1 b5 26. Kc2 a6 27. a3 c5 28. Rg4 Nd5 29. Ba5 Rd7 30. Bd2 f6 31. exf6 Nxf6 32. Rg1 c4 33. Kc1 Ne4 34. Be3 Rd5 35. h4 Rf5 36. Kb1 Kh8 37. Rg2 Rd5 38. Bc2 Kg7 39. Rg4 Nc5 40. Ng5 Nd3 41. b3 h6 42. Nf3 Rc8 43. Re4 Rf5 44. Nd2 Nxf2 45. Re7+ Kf6 46. Ra7 Nd3 47. Bxh6 Re8 48. Rxa6+ Re6 49. Bg5+ Ke5 50. Rxe6+ Kxe6 51. a4 bxa4 52. bxc4 Ne5 53. Bxf5+ Kxf5 54. Kb2 Ke6 55. Ka3 Kd7 56. Kxa4 Kc6 57. Nb3 Kd7 58. Kb5 Nf7 59. c5 Nd6+ 60. cxd6 Kxd6 1-0
Leela Chess Zero–Stockfish, game 6 :
1. d4 Nf6 2. c4 e6 3. Nc3 Bb4 4. e3 O-O 5. Bd3 b6 6. e4 Bb7 7. e5 Bxg2 8. exf6 g6 9. Bg5 d5 10. Qg4 Bxh1 11. O-O-O dxc4 12. Bc2 Bb7 13. Nh3 Re8 14. Qh4 Bf3 15. Rg1 e5 16. Be3 Nd7 17. Ng5 Nxf6 18. Nxf3 Bxc3 19. bxc3 e4 20. Ne5 Nd5 21. Qh5 Nxe3 22. fxe3 Qf6 23. Qe2 b5 24. Rf1 Qe7 25. Bxe4 Rad8 26. Qc2 f6 27. Nc6 Qa3+ 28. Kb1 f5 29. Bxf5 Rd6 30. Be4 Rf8 31. Ne7+ Kg7 32. Rxf8 Kxf8 33. Nd5 Rd7 34. h4 Rf7 35. Nf4 Rf6 36. Qb2 Qxb2+ 37. Kxb2 Ke8 38. a4 bxa4 39. Ka3 Kd8 40. Bc2 Kc8 41. Kxa4 Ra6+ 42. Kb5 Ra1 43. Nd5 Rc1 44. Ba4 Ra1 45. Kb4 Re1 46. Kxc4 h6 47. Ne7+ Kd8 48. Nc6+ Kc8 49. Nxa7+ Kb7 50. Nc6 g5 51. hxg5 hxg5 52. Kd3 Ra1 53. Bb5 Kb6 54. c4 g4 55. Ke2 Kb7 56. e4 Kc8 57. e5 Kd7 58. Nb8+ Ke7 59. d5 Ra2+ 60. Kf1 Ra1+ 61. Kf2 Kf7 62. Nc6 Kg6 63. c5 Ra2+ 64. Kg3 Kg5 65. e6 Ra3+ 66. Kg2 Kf4 67. Bf1 Rg3+ 68. Kf2 Rf3+ 69. Ke1 g3 70. Bg2 Rf2 71. e7 Rxg2 72. e8=Q Rg1+ 73. Ke2 Rg2+ 74. Kd3 Ra2 75. Qf8+ Kg5 76. Nd4 Rf2 77. Qe7+ Kg4 78. Qe6+ Kg5 79. Qe5+ Kh4 80. Ke3 Rf1 81. Qg7 Rf2 82. Ne2 Rxe2+ 83. Kxe2 g2 84. Qxg2 1-0