Devlog of Leorik

Discussion of chess software programming and technical issues.

Moderator: Ras

User avatar
lithander
Posts: 915
Joined: Sun Dec 27, 2020 2:40 am
Location: Bremen, Germany
Full name: Thomas Jahn

Re: Devlog of Leorik

Post by lithander »

mvanthoor wrote: Thu Feb 17, 2022 4:30 pm I'd expect the engine to score in CCRL:

2160 (+/- 30) + 40 (staged move generation) + 20 (max? better tuned tables) = ~2220 +/- 30. Take a bit of variance into account due to playing a gauntlet against 20-30 different opponents (with probably more features for most of them), so my expectation would be 2170 - 2230 for this version. I'd be surprised to see it lower or higher than this.
I've set up a gauntlet on fast time controls with the current build and anchored all the other engines based on their CCRL blitz rating and it seems to confirm your guess!

Code: Select all

./cutechess-cli.exe -tournament gauntlet -rounds 2000 -games 2 -repeat -concurrency 5 -each tc=10+0.2 book=varied.bin option.Hash=50

Code: Select all

   # PLAYER           :  RATING  POINTS  PLAYED   (%)
   1 Dumb 1.4         :  2356.0   155.5     264    59
   2 MadChess 2.0     :  2286.0   151.0     264    57
   3 Leorik 0.2.10    :  2229.1   801.5    1587    51
   4 Bit-Genie 4      :  2229.0   133.0     265    50
   5 Ct800 1.32       :  2226.0   134.5     264    51
   6 Blunder 6.1      :  2155.0   113.5     264    43
   7 Zahak 2.0        :  2103.0    98.0     266    37
Minimal Chess (simple, open source, C#) - Youtube & Github
Leorik (competitive, in active development, C#) - Github & Lichess
User avatar
mvanthoor
Posts: 1784
Joined: Wed Jul 03, 2019 4:42 pm
Location: Netherlands
Full name: Marcel Vanthoor

Re: Devlog of Leorik

Post by mvanthoor »

Wow. That really is at the top end of the margin. It seems to bode well for the addition of staged move generatiom to Rustic.

Rustic 4 scores 2160; where it obtains 2105 with worst performance, and 2210 with best performance, depending on the opponent.
Author of Rustic, an engine written in Rust.
Releases | Code | Docs | Progress | CCRL
eligolf
Posts: 114
Joined: Sat Nov 14, 2020 12:49 pm
Full name: Elias Nilsson

Re: Devlog of Leorik

Post by eligolf »

lithander wrote: Thu Feb 17, 2022 11:42 pm I've set up a gauntlet on fast time controls with the current build and anchored all the other engines based on their CCRL blitz rating and it seems to confirm your guess!

Code: Select all

./cutechess-cli.exe -tournament gauntlet -rounds 2000 -games 2 -repeat -concurrency 5 -each tc=10+0.2 book=varied.bin option.Hash=50

Code: Select all

   # PLAYER           :  RATING  POINTS  PLAYED   (%)
   1 Dumb 1.4         :  2356.0   155.5     264    59
   2 MadChess 2.0     :  2286.0   151.0     264    57
   3 Leorik 0.2.10    :  2229.1   801.5    1587    51
   4 Bit-Genie 4      :  2229.0   133.0     265    50
   5 Ct800 1.32       :  2226.0   134.5     264    51
   6 Blunder 6.1      :  2155.0   113.5     264    43
   7 Zahak 2.0        :  2103.0    98.0     266    37
Cool to see, that is really strong with the setup you have! Out of curiosity, how much depth can you reach with that kind of time control for each move on average, not counting quiescense or other extensions depth?
User avatar
mvanthoor
Posts: 1784
Joined: Wed Jul 03, 2019 4:42 pm
Location: Netherlands
Full name: Marcel Vanthoor

Re: Devlog of Leorik

Post by mvanthoor »

eligolf wrote: Fri Feb 18, 2022 5:30 am Cool to see, that is really strong with the setup you have! Out of curiosity, how much depth can you reach with that kind of time control for each move on average, not counting quiescense or other extensions depth?
This doesn't only depend on engine features, but also on CPU power.

My engine Rustic (which now has the same features as Leorik, except staged move generation) can reach depths 7-9 in the middle game and 10+ in the end-game, on an older i7-6700K when running with 10s+0.1s time controls. Rustic doesn't have any pruning or null-move yet, so as soon as that is added, the depth will become higher.
Author of Rustic, an engine written in Rust.
Releases | Code | Docs | Progress | CCRL
User avatar
lithander
Posts: 915
Joined: Sun Dec 27, 2020 2:40 am
Location: Bremen, Germany
Full name: Thomas Jahn

Re: Devlog of Leorik

Post by lithander »

eligolf wrote: Thu Feb 17, 2022 2:22 pm Very cool! I agree that the state you are in now is my favourite because you can somewhat understand why the engine is doing as it should. With other prunings such as null moves it is so hard to find bugs and understand if things get better or just breaks. Looking forward to try it out!
Leorik reaches depths of 7-8 in the beginning and in the endgame, on an almost empty board, it can reach depth 9-10.

With the features I currently have the branching factor is around 5-6 so each next iteration takes 5-6x longer than the previous one. This rather high branching factor means that even if you give the engine a lot more time it doesn't really manage to convert that into a significantly deeper searches. If the other engines from the gaunlet have a lower branching factor due to already implementing more aggressive pruning (e.g. Null-move pruning, late move reduction, razoring etc) they will benefit more from being given extra time.

This is also confirmed by the gauntlet I ran overnight with the time control settings that CCRL uses for Blitz games, 2 minutes and 1 second increment, where Leorik 0.2.10 only achieved 2164.1 ELO against the same opponents!

That's 65 ELO less than on the ultra fast TC but I think it's to be expected. I would expect Rustic to share a similar fate when pitted against the same opponents under the same conditions.

MadChess 2.0 for example searches almost twice as deep as Leorik if you give it a few seconds but only visits 1/3 of the nodes. The engines are not comparable feature wise. Which explains why their strength scales differently based on time controls.
Minimal Chess (simple, open source, C#) - Youtube & Github
Leorik (competitive, in active development, C#) - Github & Lichess
User avatar
mvanthoor
Posts: 1784
Joined: Wed Jul 03, 2019 4:42 pm
Location: Netherlands
Full name: Marcel Vanthoor

Re: Devlog of Leorik

Post by mvanthoor »

lithander wrote: Fri Feb 18, 2022 11:36 am That's 65 ELO less than on the ultra fast TC but I think it's to be expected. I would expect Rustic to share a similar fate when pitted against the same opponents under the same conditions.
True.
MadChess 2.0 for example searches almost twice as deep as Leorik if you give it a few seconds but only visits 1/3 of the nodes. The engines are not comparable feature wise. Which explains why their strength scales differently based on time controls.
Also true. Brute speed can only get you so far. When i let Rustic run to depth 10 on the KiwiPete position (with a 32 MB TT), I get this, on a 6700K:

Code: Select all

go depth 10
info score cp 72 depth 1 seldepth 11 time 0 nodes 1032 nps 0 hashfull 411 pv e2a6 b4c3
info score cp 72 depth 2 seldepth 11 time 0 nodes 1251 nps 0 hashfull 411 pv e2a6 b4c3
info score cp -3 depth 3 seldepth 11 time 1 nodes 1574 nps 1574000 hashfull 411 pv e2a6 b4c3
info score cp -3 depth 4 seldepth 11 time 2 nodes 2902 nps 1451000 hashfull 411 pv e2a6 b4c3
info score cp -3 depth 5 seldepth 19 time 5 nodes 15264 nps 3052800 hashfull 411 pv e2a6 b4c3
info score cp -17 depth 6 seldepth 19 time 10 nodes 56182 nps 5618200 hashfull 411 pv e2a6 e6d5 c3d5 f6d5 e5c4 b6c4 a6c4 h3g2 f3g2
info score cp -39 depth 7 seldepth 21 time 14 nodes 82207 nps 5871929 hashfull 411 pv e2a6 e6d5 e1g1 e7e5 c3d5 f6d5 e4d5 h3g2 f3g2 e5d5 d2b4 d5g2 g1g2 g7b2
info score cp -39 depth 8 seldepth 22 time 31 nodes 186856 nps 6027613 hashfull 412 pv e2a6 e6d5 e1g1 h3g2 f3g2 e7e5 c3d5 f6d5 e4d5 e5d5 d2b4 d5g2 g1g2 g7b2
info score cp -26 depth 9 seldepth 25 time 4007 nodes 24016984 nps 5993757 hashfull 877 pv e2a6 e6d5 c3d5 b6d5 a6b7 h3g2 f3g2 a8b8 e4d5 b8b7
info score cp -37 depth 10 seldepth 27 time 22089 nodes 122801444 nps 5559394 hashfull 999 pv e2a6 e6d5 c3b5 d5e4 b5c7 e8d8 f3g3 h3g2 h1g1 f6h5 d2b4 h5g3 b4e7 d8c7 h2g3 g7e5 g1g2 e5b2
bestmove e2a6
It reaches depth 8 almost instantly, at 0.31s, but then it takes roughly 4 seconds and 22 seconds to reach depths 9 and 10. In ultra-fast time controls it's never going to reach those depths. Even if you give the engine _a lot_ more time, it _might_ reach depth 9 in positions such as this, but it still won't reach depth 10. This is indeed because of the branching factor, and that's the reason why engines with a larger feature set benefit more from longer time controls, and thus the result in Elo against those engines will drop.

@eligolf: staged move generation doesn't decrease the engine's branching factor. It only saves on move generation time; in case you were wondering. Branching factor gets decreased because of pruning, where you decide to just throw away/not search some branches for one reason or another.
Author of Rustic, an engine written in Rust.
Releases | Code | Docs | Progress | CCRL
User avatar
lithander
Posts: 915
Joined: Sun Dec 27, 2020 2:40 am
Location: Bremen, Germany
Full name: Thomas Jahn

Devlog of Leorik - Version 1.0 released!

Post by lithander »

Yeserday I implemented a last test I wanted to make.

I had found thousands of "mate in X" positions here and to the best of my knowledge all the pruning I do in Leorik (alpha/beta, PVS and TT hits) should be safe in such a way that if you know there's a mate in X plies the engine should be able to find it at exactly search depth X.

And Leorik passed that test with 100% accuracy on literally thousands of positions. :D I wanted to preserve this state in a first release because as soon as I implement null-moves and similar search improvements this feat is no longer possible.

So I decided it's time. But then I took way to long to clean up the codebase, create builds for all major platforms, write a github readme, worry about the license (still haven't decided so for now there's none) and in the end when I had everything ready and had just set the repository to public I looked at the clock and postponed the release for a day because it was almost 4 am in the night. O_o

When I woke up Günther had already noticed the newly public repo and announced the release of Leorik 1.0! :shock: It's great to see that people around here still care about the release of yet another mediocre engine! ;)

He's right to call it "my baby" of course and I'm curious about how the "adult" version of Leorik will turn out to be!

So... anway.

Version 1.0 is released:
https://github.com/lithander/Leorik

I'd be honored if you'd give the engine some play and report back if everything is working. Especially the builds for Linux, Mac and Linux ARM (should run on the Raspy) I can't test myself!
Minimal Chess (simple, open source, C#) - Youtube & Github
Leorik (competitive, in active development, C#) - Github & Lichess
amanjpro
Posts: 883
Joined: Sat Mar 13, 2021 1:47 am
Full name: Amanj Sherwany

Re: Devlog of Leorik - Version 1.0 released!

Post by amanjpro »

lithander wrote: Sat Feb 19, 2022 10:13 pm Yeserday I implemented a last test I wanted to make.

I had found thousands of "mate in X" positions here and to the best of my knowledge all the pruning I do in Leorik (alpha/beta, PVS and TT hits) should be safe in such a way that if you know there's a mate in X plies the engine should be able to find it at exactly search depth X.

And Leorik passed that test with 100% accuracy on literally thousands of positions. :D I wanted to preserve this state in a first release because as soon as I implement null-moves and similar search improvements this feat is no longer possible.

So I decided it's time. But then I took way to long to clean up the codebase, create builds for all major platforms, write a github readme, worry about the license (still haven't decided so for now there's none) and in the end when I had everything ready and had just set the repository to public I looked at the clock and postponed the release for a day because it was almost 4 am in the night. O_o

When I woke up Günther had already noticed the newly public repo and announced the release of Leorik 1.0! :shock: It's great to see that people around here still care about the release of yet another mediocre engine! ;)

He's right to call it "my baby" of course and I'm curious about how the "adult" version of Leorik will turn out to be!

So... anway.

Version 1.0 is released:
https://github.com/lithander/Leorik

I'd be honored if you'd give the engine some play and report back if everything is working. Especially the builds for Linux, Mac and Linux ARM (should run on the Raspy) I can't test myself!
Congrats! I am looking forward to see this kid grow up :)
User avatar
algerbrex
Posts: 608
Joined: Sun May 30, 2021 5:03 am
Location: United States
Full name: Christian Dean

Re: Devlog of Leorik - Version 1.0 released!

Post by algerbrex »

lithander wrote: Sat Feb 19, 2022 10:13 pm Yeserday I implemented a last test I wanted to make.

I had found thousands of "mate in X" positions here and to the best of my knowledge all the pruning I do in Leorik (alpha/beta, PVS and TT hits) should be safe in such a way that if you know there's a mate in X plies the engine should be able to find it at exactly search depth X.

And Leorik passed that test with 100% accuracy on literally thousands of positions. :D I wanted to preserve this state in a first release because as soon as I implement null-moves and similar search improvements this feat is no longer possible.

So I decided it's time. But then I took way to long to clean up the codebase, create builds for all major platforms, write a github readme, worry about the license (still haven't decided so for now there's none) and in the end when I had everything ready and had just set the repository to public I looked at the clock and postponed the release for a day because it was almost 4 am in the night. O_o

When I woke up Günther had already noticed the newly public repo and announced the release of Leorik 1.0! :shock: It's great to see that people around here still care about the release of yet another mediocre engine! ;)

He's right to call it "my baby" of course and I'm curious about how the "adult" version of Leorik will turn out to be!

So... anway.

Version 1.0 is released:
https://github.com/lithander/Leorik

I'd be honored if you'd give the engine some play and report back if everything is working. Especially the builds for Linux, Mac and Linux ARM (should run on the Raspy) I can't test myself!
Congratulations Thomas! I'm excited to Leorik develop, and I hope it'll be a useful and challenging sparring partner for future releases of Blunder (whenever I find the time again to work on releasing another version :lol: ).
Mike Sherwin
Posts: 965
Joined: Fri Aug 21, 2020 1:25 am
Location: Planet Earth, Sol system
Full name: Michael J Sherwin

Re: Devlog of Leorik

Post by Mike Sherwin »

A real fight this time! :)
[pgn][Event "Computer chess game"]
[Site "DESKTOP-HFVHK2B"]
[Date "2022.02.19"]
[Round "?"]
[White "Leorik-1.0"]
[Black "Mike Sherwin"]
[Result "*"]
[BlackElo "2400"]
[ECO "D01"]
[Opening "Richter-Veresov, 3.Nf3"]
[Time "18:02:36"]
[Variation "2.Nf3 Nf6"]
[WhiteElo "2000"]
[TimeControl "600+30"]
[Termination "normal"]
[PlyCount "153"]
[WhiteType "program"]
[BlackType "human"]

1. d4 {(d2-d4 d7-d5 Ng1-f3 Ng8-f6 e2-e3 e7-e6 Nb1-c3 Bf8-d6 Bf1-d3 O-O O-O)
+0.33/11 27} d5 2. Nf3 {(Ng1-f3 Ng8-f6 Bc1-f4 e7-e6 e2-e3 Bf8-d6 Bf1-d3 O-O
O-O Nb8-c6 Nb1-c3) +0.26/11 65} Nf6 3. Nc3 {(Nb1-c3 e7-e6 e2-e3 Bf8-d6
Bf1-d3 Nb8-c6 Nc3-b5 O-O O-O Nf6-e4) +0.01/10 25} h6 4. Bf4 {(Bc1-f4 g7-g5
Bf4-e5 g5-g4 Nf3-d2 Nb8-c6 Nc3-b5 Nc6xe5 d4xe5 a7-a6) +0.18/10 22} e6 5. e3
{(e2-e3 Bf8-e7 Bf1-d3 O-O O-O c7-c5 Bf4-e5 Nb8-d7 Ra1-c1 Nd7xe5) +0.15/10
30} c6 6. Bd3 {(Bf1-d3 Bf8-e7 O-O b7-b5 a2-a3 O-O Ra1-c1 Nb8-d7 Nf3-e5
Bc8-b7) +0.43/10 57} Bd6 7. Bxd6 {(Bf4xd6 Qd8xd6 O-O O-O e3-e4 d5xe4 Nc3xe4
Nf6xe4 Bd3xe4 Qd6-f4) +0.51/10 23} Qxd6 8. O-O {(O-O O-O e3-e4 d5xe4 Nc3xe4
Nf6xe4 Bd3xe4 Qd6-f4 Rf1-e1 Nb8-d7) +0.41/10 42} O-O 9. e4 {(e3-e4 d5xe4
Nc3xe4 Nf6xe4 Bd3xe4 Nb8-d7 c2-c4 Nd7-f6 c4-c5 Qd6-f4) +0.35/10 32} dxe4
10. Nxe4 {(Nc3xe4 Nf6xe4 Bd3xe4 Nb8-d7 Be4-d3 Nd7-f6 c2-c3 Bc8-d7 Qd1-b3
Qd6-c7 Ra1-d1) +0.32/11 69} Nxe4 11. Bxe4 {(Bd3xe4 Nb8-d7 c2-c3 Nd7-f6
Be4-c2 Bc8-d7 Nf3-e5 Ra8-d8 Ra1-c1 Rf8-e8 Rf1-e1) +0.30/11 42} Nd7 12. c3
{(c2-c3 b7-b6 Nf3-e5 Bc8-b7 Rf1-e1 Ra8-e8 Ne5xd7 Qd6xd7 Ra1-c1 Qd7-c7)
+0.19/10 16} Nf6 13. Bc2 {(Be4-c2 b7-b6 Qd1-e2 Bc8-b7 Ra1-d1 Ra8-d8 Nf3-e5
Rf8-e8 Rf1-e1 Nf6-d7 Ne5-g4) +0.29/11 64} b5 14. a4 {(a2-a4 b5-b4 c3xb4
Qd6xb4 b2-b3 Bc8-b7 a4-a5 c6-c5 d4xc5 Qb4xc5) +0.18/10 32} a6 15. Ne5
{(Nf3-e5 Bc8-b7 Qd1-d3 Rf8-e8 Qd3-g3 Ra8-d8 a4xb5 a6xb5 Ra1-a7 Qd6-c7)
+0.27/10 24} Bb7 16. Qd3 {(Qd1-d3 Rf8-e8 Ra1-d1 Ra8-d8 a4-a5 Qd6-c7 b2-b4
Rd8-c8 Qd3-g3 Rc8-d8) +0.27/10 80} Rfd8 17. h3 {(h2-h3 c6-c5 Ne5-g4 Nf6-e4
a4xb5 a6xb5 Qd3xb5 Ra8xa1 Rf1xa1 Qd6-d5) +0.41/10 68} c5 18. Ng4 {(Ne5-g4
Nf6-e4 a4xb5 f7-f5 Ng4-e3 a6xb5 Qd3xb5 c5xd4 c3xd4 Ra8-b8) +0.55/10 17}
Nxg4 19. Qh7+ {(Qd3-h7+ Kg8-f8 h3xg4 Qd6-d5 f2-f3 c5xd4 Qh7-h8+ Kf8-e7
Qh8xg7 Qd5-g5 Qg7-h7 Qg5-e3+) +0.28/12 87} Kf8 20. hxg4 {(h3xg4 c5xd4 a4xb5
Qd6-d5 f2-f3 d4-d3 Bc2-b1 Qd5xb5 Qh7-h8+ Kf8-e7 Qh8xg7) +0.14/11 27} cxd4
21. Qh8+ {(Qh7-h8+ Kf8-e7 Qh8xg7 Qd6-d5 f2-f3 d4-d3 Bc2-b1 Qd5-g5 Qg7-h7
d3-d2) -0.26/10 12} Ke7 22. Qxg7 {(Qh8xg7 Qd6-d5 f2-f3 d4-d3 Bc2-b1 Qd5-c5+
Rf1-f2 Qc5-g5 Qg7xg5+ h6xg5 a4-a5) -0.38/11 16} Qd5 23. f3 {(f2-f3 d4-d3
Bc2-d1 Qd5-g5 Qg7-h7 d3-d2 Bd1-c2 Qg5-e3+ Rf1-f2 Qe3-e1+ Rf2-f1) -0.47/11
20} d3 24. Bd1 {(Bc2-d1 Qd5-g5 Qg7-h7 d3-d2 Bd1-c2 Qg5-e3+ Rf1-f2 Rd8-h8
Qh7-d3 Qe3xd3 Bc2xd3) -0.65/11 21} Qc5+ 25. Rf2 {(Rf1-f2 Qc5-g5 Qg7xg5+
h6xg5 Rf2-d2 Bb7-c6 a4-a5 Ra8-c8 Kg1-f2 Rc8-c7 Bd1-b3 Rc7-c8) -0.53/12 39}
Qe3 26. f4 {(f3-f4 Bb7-d5 Qg7xh6 Rd8-h8 Qh6-g5+ Ke7-d7 Bd1-f3 Bd5xf3 g2xf3
Rh8-h2 Ra1-f1) -0.18/11 23} d2 27. Be2 {(Bd1-e2 b5xa4 g4-g5 Bb7-e4 Qg7xh6
Ra8-b8 Qh6-f6+ Ke7-e8 Qf6-h8+ Ke8-e7 Qh8-f6+) -0.16/11 31} Bd5 28. g5
{(g4-g5 h6xg5 Qg7xg5+ Ke7-d6 Qg5-f6 Rd8-g8 Be2-f1 Rg8-g6 Qf6-e5+ Qe3xe5
f4xe5+) -0.25/11 43} hxg5 29. Qxg5+ {(Qg7xg5+ Ke7-f8 Qg5-h6+ Kf8-g8 Qh6-g5+
Kg8-h7 a4xb5 a6xb5 Ra1xa8 Rd8xa8 Be2xb5) -0.34/11 20} Kd6 30. axb5 {(a4xb5
a6xb5 Ra1xa8 Rd8xa8 Qg5-e5+ Qe3xe5 f4xe5+ Kd6xe5 Be2-d1 Ra8-a1) -0.70/10
22} axb5 31. Rd1 {(Ra1-d1 Bd5-b3 Rd1-f1 f7-f5 Qg5-g7 Rd8-g8 Qg7-e5+ Qe3xe5
f4xe5+ Kd6-c5 Be2-d3) -0.90/11 34} Bb3 32. Rb1 {(Rd1-b1 Kd6-c7 Qg5xb5
d2-d1Q+ Be2xd1 Rd8xd1+ Rb1xd1 Bb3xd1 Qb5-e5+ Qe3xe5 f4xe5) -1.17/11 30} Bc2
33. Rf1 {(Rb1-f1 f7-f5 Qg5-g7 Rd8-d7 Qg7-d4+ Qe3xd4 c3xd4 Ra8-a2 Be2-f3
Bc2-d3 Rf1-d1) -1.08/11 37} Kc7 34. Qe5+ {(Qg5-e5+ Qe3xe5 f4xe5 Bc2-f5
Rf1-d1 Ra8-a2 b2-b4 Kc7-b6 c3-c4 b5xc4 Be2xc4 Ra2-c2) -1.32/12 68} Qxe5 35.
fxe5 {(f4xe5 d2-d1Q Be2xd1 Bc2xd1 Rf2xf7+ Kc7-c6 b2-b4 Bd1-b3 Rf7-e7 Rd8-d3
Rf1-c1 Ra8-a2) -1.31/12 23} d1=Q 36. Bxd1 {(Be2xd1 Bc2xd1 Rf2xf7+ Kc7-c6
b2-b4 Bd1-e2 Rf1-e1 Ra8-a2 Rf7-e7 Be2-c4 Re7-f7 Rd8-d2 g2-g3) -1.54/13 21}
Bxd1 37. Rxf7+ {(Rf2xf7+ Kc7-b6 b2-b4 Ra8-c8 Rf7-f6 Bd1-b3 Rf1-c1 Rd8-d2
Rf6-f2 Rd2-d3 Rf2-f3 Rd3-d2) -1.61/12 14} Kc6 38. R1f6 {(Rf1-f6 Bd1-b3
Rf6-f1 Ra8-a2 Rf7-f2 Rd8-d3 Rf1-e1 Bb3-d5 Rf2-e2 Kc6-b6 Kg1-f2 Kb6-c5)
-1.75/12 25} Kd5 39. Rf1 {(Rf6-f1 Bd1-b3 Rf1-e1 Ra8-a2 Re1-e2 Kd5-c6 Rf7-f2
Bb3-c4 Re2-e1 Rd8-d3 Re1-c1 Kc6-c5) -1.74/12 24} Bg4 40. Re1 {(Rf1-e1
Kd5-c6 Re1-e4 Bg4-f5 Re4-e2 Ra8-a1+ Kg1-h2 Rd8-d3 Rf7-e7 Ra1-d1 Re2-f2
Kc6-c5) -1.61/12 27} Bf5 41. Re3 {(Re1-e3 Ra8-a1+ Kg1-f2 Kd5-c6 b2-b4
Ra1-c1 Kf2-f3 Rd8-d2 Rf7-e7 Rc1-c2 g2-g3) -1.66/11 27} Be4 42. Rf4 {(Rf7-f4
Be4-c2 Re3-e1 Kd5-c6 b2-b4 Bc2-f5 c3-c4 Ra8-a2 c4xb5+ Kc6xb5 g2-g4 Bf5-d3)
-1.53/12 27} Bc2 43. Kh2 {(Kg1-h2 Kd5-c6 Re3-e2 Bc2-b3 Rf4-d4 Bb3-d5 Re2-f2
Ra8-a1 Rf2-f6 Ra1-b1 Rf6xe6+) -1.51/11 14} Kc5 44. b4+ {(b2-b4+ Kc5-c6
c3-c4 Bc2-d3 c4xb5+ Kc6xb5 Re3-h3 Bd3-c4 Rh3-h4 Ra8-c8 Rf4-f6 Kb5xb4)
-1.56/12 21} Kb6 45. Rf6 {(Rf4-f6 Bc2-b3 g2-g4 Rd8-d2+ Kh2-g3 Ra8-g8 Kg3-f4
Rg8-c8 g4-g5 Rc8-c4+ Kf4-g3) -1.44/11 16} Bb3 46. g4 {(g2-g4 Rd8-d2+ Kh2-h3
Ra8-h8+ Kh3-g3 Rh8-g8 Kg3-h4 Rd2-d1 Rf6-f4 Rd1-c1 Rf4-d4) -1.63/11 17} Rh8+
47. Kg3 {(Kh2-g3 Bb3-c4 Re3-e1 Ra8-d8 Re1-c1 Rd8-d3+ Rf6-f3 Rd3-d5 Rc1-e1
Rh8-d8 Rf3-f2 Rd5-d3+) -1.59/12 20} Rh1 48. Rd3 {(Re3-d3 Ra8-c8 g4-g5
Rh1-g1+ Kg3-f4 Rg1-f1+ Kf4-g4 Rf1-d1 Rd3-d6+ Rd1xd6 e5xd6 Kb6-c6 c3-c4)
-1.46/13 75} Rc8 49. Kf2 {(Kg3-f2 Bb3-c4) 0.00/14 33} Rc6 50. g5 {(g4-g5
Rh1-h2+ Kf2-g3 Rh2-e2 g5-g6 Re2xe5 Kg3-g4 Re5-e1 g6-g7 Re1-g1+ Rd3-g3
Rg1xg3+ Kg4xg3) -1.47/13 74} Bc2 51. Rg3 {(Rd3-g3 Rh1-h2+ Kf2-g1 Rh2-h7
g5-g6 Rh7-g7 Kg1-f2 Bc2-f5 Rg3-g5 Bf5-d3 Kf2-e3 Rc6xc3 Rf6xe6+) -0.77/13
57} Rh7 52. g6 {(g5-g6 Rh7-g7 Kf2-e2 Bc2-f5 Rg3-g5 Kb6-b7 Rg5-g3 Kb7-b8
Rg3-g5 Rc6xc3 Rf6-f8+ Kb8-b7 Rf8-f7+) -1.25/13 115} Rg7 53. Rg1 {(Rg3-g1
Bc2-f5 Rg1-g5 Kb6-b7 Rg5-g1 Rc6-c7 Rg1-g5 Kb7-b8 Rg5-g3 Rc7-c8 Rg3-f3
Rc8-g8) -1.34/12 15} Bf5 54. Rg5 {(Rg1-g5 Kb6-b7 Rg5-g3 Kb7-b8 Kf2-e2
Rc6-c8 Ke2-e1 Rc8-g8 Ke1-f2 Rg7xg6 Rg3xg6 Rg8xg6 Rf6xg6) -1.67/13 22} Kb7
55. Rg3 {(Rg5-g3 Kb7-c8 Rf6-f8+ Kc8-d7 Rf8-b8 Rg7xg6 Rg3xg6 Bf5xg6 Rb8-b7+
Rc6-c7 Rb7xc7+ Kd7xc7 Kf2-e3) -1.88/13 25} Rc8 56. Rf3 {(Rg3-f3 Rc8-c7
Kf2-e1 Rc7-e7 Rf3-f4 Bf5xg6 c3-c4 b5xc4 Rf4xc4 Bg6-d3 Rc4-c5 Rg7-g3 b4-b5)
-2.00/13 83} Rcg8 57. Rf4 {(Rf3-f4 Rg7xg6 Rf6xg6 Rg8xg6 c3-c4 Rg6-h6 c4xb5
Kb7-b6 Rf4-d4 Rh6-h3 Rd4-d7 Kb6xb5 Rd7-d4) -2.02/13 30} Rxg6 58. Rxg6
{(Rf6xg6 Rg8xg6 Rf4-d4 Rg6-g7 c3-c4 b5xc4 Rd4xc4 Kb7-a6 Rc4-c5 Rg7-g4
b4-b5+ Ka6-b6 Rc5-c8 Kb6xb5 Kf2-e3) -2.73/15 139} Rxg6 59. Rd4 {(Rf4-d4
Rg6-g7 c3-c4 b5xc4 Rd4xc4 Kb7-a6 Rc4-c8 Rg7-b7 Rc8-a8+ Ka6-b5 Kf2-e3 Kb5xb4
Ra8-d8 Rb7-b5 Ke3-d4) -2.90/15 31} Rg4 60. Rxg4 {(Rd4xg4 Bf5xg4 Kf2-e3
Kb7-c6 Ke3-d4 Bg4-f5 c3-c4 b5xc4 Kd4xc4 Bf5-e4 b4-b5+ Kc6-b6 Kc4-b4 Be4-d5
Kb4-a4 Bd5-c4 Ka4-b4 Bc4xb5) -2.98/18 15} Bxg4 61. Ke3 {(Kf2-e3 Kb7-c6
Ke3-d4 Bg4-f5 c3-c4 Bf5-h3 Kd4-c3 Bh3-f1 c4xb5+ Kc6xb5 Kc3-b3 Bf1-e2 Kb3-c3
Be2-c4 Kc3-d4 Kb5xb4 Kd4-e3 Kb4-c3 Ke3-f4 Kc3-d4 Kf4-g5 Kd4xe5 Kg5-g6
Ke5-f4 Kg6-f6 Kf4-g3) -4.02/26 27} Bd1 62. Kf4 {(Ke3-f4 Kb7-c6 Kf4-e4
Bd1-c2+ Ke4-d4 Bc2-b1 c3-c4 b5xc4 Kd4xc4 Bb1-a2+ Kc4-d4 Kc6-b5 Kd4-c3
Ba2-d5 Kc3-d2 Kb5xb4 Kd2-e3 Kb4-c3 Ke3-f4 Kc3-d4 Kf4-g5 Kd4xe5 Kg5-g6
Ke5-f4 Kg6-f6 Kf4-g3 Kf6-g6) -4.06/27 48} Kc6 63. Ke4 {(Kf4-e4 Bd1-b3
Ke4-d4 Bb3-c2 c3-c4 b5xc4 Kd4xc4 Bc2-d1 b4-b5+ Kc6-b6 Kc4-c3 Kb6xb5 Kc3-d2
Bd1-a4 Kd2-e3 Kb5-c4 Ke3-f4 Kc4-d5 Kf4-g5 Ba4-c2 Kg5-f6 Bc2-d1 Kf6-g5
Bd1-a4 Kg5-h5 Kd5xe5) -4.10/26 21} Bb3 64. Kd4 {(Ke4-d4 Bb3-c2 c3-c4 b5xc4
Kd4xc4 Bc2-d1 b4-b5+ Kc6-b6 Kc4-c3 Kb6xb5 Kc3-d2 Bd1-g4 Kd2-e3 Kb5-c4
Ke3-f4 Bg4-f5 Kf4-g3 Bf5-c2 Kg3-g2 Kc4-d4 Kg2-g3 Bc2-d1 Kg3-f2 Kd4-d5
Kf2-e3) -4.11/25 17} Kd7 65. Kc5 {(Kd4-c5 Bb3-c4 Kc5-b6 Kd7-e7 Kb6-c5
Ke7-f7 Kc5-d4 Kf7-g6 Kd4-e3 Kg6-f5 Ke3-f2 Kf5xe5 Kf2-f3 Ke5-d5 Kf3-e3 e6-e5
Ke3-d2 e5-e4 Kd2-c1 e4-e3 Kc1-d1 e3-e2+ Kd1-e1 Kd5-e5 Ke1-d2) -4.66/25 30}
Bc4 66. Kd4 {(Kc5-d4 Kd7-e7 Kd4-e3 Ke7-f7 Ke3-f3 Kf7-g6 Kf3-f4 Kg6-h5
Kf4-f3 Kh5-g5 Kf3-e4 Bc4-f1 Ke4-e3 Kg5-f5 Ke3-d2 Bf1-c4 Kd2-e3 Kf5xe5
Ke3-f3 Ke5-d5 Kf3-e3 Kd5-e5 Ke3-f3 Bc4-a2 Kf3-e2 Ba2-b3 Ke2-f3 Bb3-c4)
-4.67/28 16} Ke7 67. Ke3 {(Kd4-e3 Ke7-f7 Ke3-f3 Kf7-g6 Kf3-f4 Kg6-h5 Kf4-f3
Kh5-g5 Kf3-e4 Kg5-g4 Ke4-e3 Kg4-f5 Ke3-f3 Kf5xe5 Kf3-e3 Ke5-f5 Ke3-f3 e6-e5
Kf3-e3 e5-e4 Ke3-d2 Kf5-f4 Kd2-c1 e4-e3 Kc1-c2 e3-e2 Kc2-d2) -4.79/28 16}
Kf7 68. Kf3 {(Ke3-f3 Bc4-a2 Kf3-f4 Kf7-g6 Kf4-g4 Ba2-d5 Kg4-f4 Kg6-h5
Kf4-e3 Kh5-g5 Ke3-d2 Kg5-f5 Kd2-e2 Kf5xe5 Ke2-d2 Ke5-e4 Kd2-c2 Bd5-b7 c3-c4
b5xc4 Kc2-c1 Ke4-d4 Kc1-d1 Bb7-d5 Kd1-d2 c4-c3+ Kd2-e2) -4.88/27 83} Kg6
69. Kf4 {(Kf3-f4 Kg6-h5 Kf4-f3 Kh5-g5 Kf3-e4 Bc4-a2 Ke4-e3 Kg5-f5 Ke3-f2
Kf5xe5 Kf2-e3 Ke5-d5 Ke3-d3 Ba2-b1+ Kd3-e3 Kd5-c4 Ke3-f4 Kc4xc3 Kf4-g5
Bb1-f5 Kg5-f6 Kc3xb4 Kf6-f7 Kb4-a3) -5.00/26 23} Kh5 70. Kf3 {(Kf4-f3
Kh5-g5 Kf3-e4 Bc4-a2 Ke4-e3 Kg5-f5 Ke3-d3 Kf5xe5 Kd3-e3 Ba2-d5 Ke3-d3
Ke5-f4 c3-c4 Bd5xc4+ Kd3-d4 e6-e5+ Kd4-c5 e5-e4 Kc5-d4 e4-e3 Kd4-c3 e3-e2
Kc3-d2 Kf4-f3 Kd2-c3) -5.63/25 21} Kg5 71. Ke4 {(Kf3-e4 Kg5-g4 Ke4-e3
Kg4-f5 Ke3-f3 Kf5xe5 Kf3-g4 Ke5-e4 Kg4-g3 e6-e5 Kg3-f2 Ke4-d3 Kf2-f3 e5-e4+
Kf3-f2 e4-e3+ Kf2-f3 e3-e2 Kf3-f2 Kd3-d2 Kf2-f3 e2-e1Q Kf3-f4 Kd2xc3)
-12.69/24 15} Kg4 72. Ke3 {(Ke4-e3 Kg4-f5 Ke3-f3 Kf5xe5 Kf3-g4 Ke5-e4
Kg4-g5 e6-e5 Kg5-g4 Ke4-d3 Kg4-f5 e5-e4 Kf5-f4 e4-e3 Kf4-e5 e3-e2 Ke5-f6
e2-e1Q Kf6-f5 Kd3xc3 Kf5-g5 Qe1-e4 Kg5-f6 Kc3xb4) -13.50/24 21} Kf5 73. Kf2
{(Ke3-f2 Kf5-e4 Kf2-g3 Ke4-d3 Kg3-f4 Kd3xc3 Kf4-e3 Kc3xb4 Ke3-d2 Kb4-b3
Kd2-c1 Kb3-c3 Kc1-b1 b5-b4 Kb1-a1 b4-b3 Ka1-b1 Bc4-d3+ Kb1-a1 b3-b2+ Ka1-a2
b2-b1Q+ Ka2-a3) -12.71/23 31} Kxe5 74. Kf3 {(Kf2-f3 Ke5-d5 Kf3-f4 Bc4-d3
Kf4-e3 Kd5-c4 Ke3-f4 Kc4xc3 Kf4-e5 Bd3-f5 Ke5-f6 Kc3xb4 Kf6-e5 Kb4-c3
Ke5-d6 b5-b4 Kd6-d7 b4-b3 Kd7-e7 b3-b2 Ke7-f6 b2-b1Q) -13.16/22 25} Kf5 75.
Ke3 {(Kf3-e3 e6-e5 Ke3-f3 e5-e4+ Kf3-e3 Bc4-g8 Ke3-e2 Kf5-f4 Ke2-f2 e4-e3+
Kf2-e2 Bg8-f7 Ke2-d3 Kf4-f3 Kd3-d4 e3-e2 Kd4-e5 e2-e1Q+ Ke5-f6 Bf7-c4
Kf6-f5 Qe1xc3) -13.42/22 17 White resigns} *
[/pgn]