MadChess 3.1 Beta 0c601ea (Singular Move)

I strengthened MadChess by extending the search horizon of singular moves. I gleaned the idea from the Stockfish chess engine.

Quoting from my Pull Request #17:

  • In the GetSearchHorizon method, added call to a new method, IsBestMoveSingular, that determines if best move that had failed high in recent searches is best by a significant margin.
  • If so, extend the search by one ply. A code comment explains why:
    • The best move (from the cache) is singular. That is, it’s the only good move in the position.
    • Evaluation of the current position relies on the accuracy of the singular move’s score.
    • If the engine misjudges the singular move, the position could deteriorate because no alternative strong moves exist.
    • To increase confidence in the singular move’s score, search it one ply deeper.

In addition, in Pull Request #16 I implemented asymptotic history scores. This simplifies keeping history scores within defined bounds. Also I fixed a bug in the Standard Algebraic Notation (SAN) parser for positions where the moving piece is disambiguated by square (not merely by rank or file). These changes improved code quality but did not increase playing strength.

Singular move increased the playing strength of MadChess 3.1 Beta by 13 Elo.

 

Feature Category Date Commit1 WAC2 Elo Rating3 Improvement
Singular Move Search 2021 Jun 14 0c601ea 290 2617 +13
Endgame Eval Scaling Evaluation 2021 Apr 08 4d22dec 286 2604 +12
Bishop Pair Evaluation 2021 Mar 14 2960ec9 285 2592 +22
Position Cache Optimization Search 2021 Feb 23 42d7702 286 2570 +8
Move Generation Optimization Search 2021 Feb 17 22002dc 287 2562 +12
PVS and Null Move Search 2021 Feb 09 f231dac 285 2550 +20
Remove Aspiration Windows Search 2020 Dec 20 4b7963b 290 2530 +9
Time Management Search 2020 Dec 19 d143bb5 286 2521 +8
Crash Bug Search 2020 Aug 29 2d855ec 288 2513 +0
King Safety Evaluation 2020 Aug 16 6794c89 288 2513 +63
Eval Param Tuning Evaluation 2020 Jul 23 bef88d5 283 2450 +30
Late Move Pruning Search 2020 Feb 08 6f3d17a 288 2420 +29
Piece Mobility Evaluation 2020 Feb 01 5c5d4fc 282 2391 +62
Passed Pawns Evaluation 2018 Dec 27 103 279 2329 +119
Staged Move Generation Search 2018 Dec 15 93 275 2210 +39
History Heuristics Search 2018 Dec 03 84 275 2171 +28
Eval Param Tuning Evaluation 2018 Nov 24 75 272 2143 +47
Sophisticated Search
Material and Piece Location
Baseline 2018 Nov 08 58 269 2096 0
  1. GitHub commit (hash) or Subversion source code revision (integer)
  2. Win At Chess position test, 3 seconds per position
  3. Bullet chess, 2 min / game + 1 sec / move

Banks 85th Amateur Series Division 7

MadChess 3.0 participated in Graham Banks’ 85th amateur tournament in division 7.

                                1    2    3    4    5    6    7    8    9    0    1    2    
1   Nawito 2103                 **** 0½11 11½0 11½1 ½01½ 1½11 ½½00 ½001 1½11 0111 1111 ½½11  30.0/44
2   Betsabe II 2020             1½00 **** 101½ 1110 0110 0½1½ ½½10 111½ 1101 1½1½ 101½ 1111  29.0/44
3   FrankWalter 2.4.0 64-bit    00½1 010½ **** ½½10 110½ 01½0 1011 1½11 0101 ½110 ½½1½ 01½½  24.5/44
4   MadChess 3.0 64-bit         00½0 0001 ½½01 **** 11½0 ½010 1001 ½11½ 1100 1010 ½½1½ 1111  23.0/44
5   Jumbo 0.7.0 64-bit          ½10½ 1001 001½ 00½1 **** 00½½ ½½1½ 001½ 1110 0111 ½01  0½1½  21.5/43  468.25
6   paulchen332 0.1.1 64-bit    0½00 1½0½ 10½1 ½101 11½½ **** 0010 ½01½ 111½ 0010 ½110 ½½00  21.5/44  466.75
7   Axolotl 1.9 64-bit          ½½11 ½½01 0100 0110 ½½0½ 1101 **** ½0½0 00½1 ½0½½ 011½ 1001  21.0/44
8   Delocto 200419 64-bit       ½110 000½ 0½00 ½00½ 110½ ½10½ ½1½1 **** 00½½ ½01½ 1½½0 11½½  20.0/44  425.00
9   RookieMonster 1.8.2 64-bit  0½00 0010 1010 0011 0001 000½ 11½0 11½½ **** 1111 0½½½ 1001  20.0/44  417.75
10  Galjoen 0.41.1 64-bit       1000 0½0½ ½001 0101 1000 1101 ½1½½ ½10½ 0000 **** 0101 1½½1  19.0/44
11  Detroid 1.0.1 64-bit        0000 010½ ½½0½ ½½0½ ½10  ½001 100½ 0½½1 1½½½ 1010 **** 110½  18.0/43
12  Waxman 2020                 ½½00 0000 10½½ 0000 1½0½ ½½11 0110 00½½ 0110 0½½0 001½ ****  15.5/44

Games

The Managerie

MadChess 2.2 participated in a tournament Graham Banks arranged, named The Managerie.

                                1    2    3    4    5    6    7    8    9    0    
1   Raven 1.10 64-bit           **** ½0½½ ½01½ ½1½1 ½½½1 1½10 ½11½ 11½1 1½10 1111  24.5/36
2   MadChess 2.2 64-bit         ½1½½ **** 10½0 010½ ½0½½ 1½11 ½11½ 1101 111½ ½011  22.5/36
3   RookieMonster 1.8.2 64-bit  ½10½ 01½1 **** 0011 ½010 1001 ½½01 ½1½1 10½½ 1111  21.0/36
4   Cosette 5.0 64-bit          ½0½0 101½ 1100 **** 1101 1½½0 ½101 ½0½½ 1½11 101½  20.5/36
5   Bearded N44.5 64-bit        ½½½0 ½1½½ ½101 0010 **** 0111 ½011 ½½01 ½11½ 1½½0  20.0/36
6   Waxman 2020                 0½01 0½00 0110 0½½1 1000 **** ½101 011½ ½½00 1110  16.0/36
7   Hedgehog 2.0 64-bit         ½00½ ½00½ ½½10 ½010 ½100 ½010 **** 11½0 ½½01 1½10  15.5/36
8   Myrddin 0.87 64-bit         00½0 0010 ½0½0 ½1½½ ½½10 100½ 00½1 **** 1001 0½01  13.5/36  240.75
9   NoC 4.20 64-bit             0½01 000½ 01½½ 0½00 ½00½ ½½11 ½½10 0110 **** 00½½  13.5/36  239.25
10  Bumblebee 1.0 64-bit        0000 ½100 0000 010½ 0½½1 0001 0½01 1½10 11½½ ****  13.0/36

Games

MadChess 3.0 Released

I have released version 3.0 of my chess engine. This is a complete rewrite of the engine using bitboards. I began the project two and a half years ago and worked on it sporadically, with long stretches of inactivity. I didn’t work on MadChess at all in 2019. Life got too busy, personally and professionally.

Gradually, I improved MadChess’ playing strength, surpassing the previous version, and crossing the 2600 Elo threshold. Considering MadChess 3.0 doesn’t have a sophisticated evaluation function, I’m satisfied to have reached that milestone. I’ll likely pursue evaluation improvements in a future version.

I have written MadChess 3.0, like its predecessors, in C#. I use preprocessor directives and Visual Studio solution configuration to include or exclude CPU intrinsics (PopCount and LeadingZeroCount) and target various platforms when compiling a binary executable: Windows 64 bit (x64) and Windows 32 bit (x86). When you click the 3.0 EXE link on the Downloads page, you’ll notice the ZIP file contains x64, x64 Non-PopCount, and x86 directories. Install the appropriate version for your computer’s CPU. The x64 binary is the strongest version of the engine.

MadChess 3.0 is built on Microsoft’s .NET 5 framework, which is open-source and cross-platform. On the Downloads page, I provide binaries only for Windows. However, .NET 5 supports Linux and Mac, so you’re welcome to compile it for those platforms. If you do attempt to compile a non-Windows binary, please let me know if you succeed or experience difficulties.

I have taken a minimalist approach to engine configuration. MadChess 3.0 doesn’t expose many UCI options. However, it does support UCI_LimitStrength and UCI_Elo, so you may configure MadChess for a more enjoyable game- assuming you’re not a Grandmaster.

Enjoy! Leave a comment on this blog post or click the Contact Me link and let me know what you think of my chess engine.

Tactical Minefield in Won Game

I played an interesting blitz game a couple nights ago against MadChess 3.0 Beta. The engine is strong enough for me to release it. Before I do, I’m improving features not related to maximizing engine strength. In fact, quite the opposite: I’m working on UCI_LimitStrength and UCI_Elo options that reduce the engine’s playing strength. This enables us mere mortals to configure MadChess for a more enjoyable game- competitive but with winning chances gifted to us by an engine purposefully playing inaccuracies and blunders.

The game began as follows. Playing white, I develop my pieces. MadChess 3.0 Beta mindlessly pushes a few pawns forward before belatedly developing its pieces. MadChess and I play the opening and middlegame inaccurately- including a significant blunder on my 6th move. (See analysis at end of this blog post.)

1.e4 e5 2.Nf3 h5 3.Be2 f5 4.Nc3 b6 5.Nxe5 a6 6.Ng6 Rh7 7.Nxf8 Kxf8 8.exf5 c5 9.Bxh5 d6 10.Nd5 Rh8 11.Qf3 Qd7 12.Nxb6 Qe7+ 13.Kd1 Bb7 14.Qg4 Nh6 15.Qg6 Be4

rn3k1r/4q1p1/pN1p2Qn/2p2P1B/4b3/8/PPPP1PPP/R1BK3R w - - 7 16

Here the game quickly gets very tactical. Keep in mind I’m playing MadChess 3.0 Beta at reduced strength. I’ve capitalized on its weak moves and have obtained a winning position. That my position is winning is not in doubt: White has won a bishop for a knight, has the bishop pair, and is up four pawns. However, MadChess’ defense complicates my winning position. Despite its moves being suboptimal, MadChess increases the chance a patzer like me spoils the position.

The game continues 16.Re1 Ra7 17.f3 {Another big blunder by me.} Qd8 18.Rxe4 Rf7 19.d3 Re7 20.Bg5 Nc6 21.Kd2 Qe8

4qk1r/4r1p1/pNnp2Qn/2p2PBB/4R3/3P1P2/PPPK2PP/R7 w - - 5 22

Here I miss a mate in two. Can you spot it? It’s easy when given the hint. In the game, with the clock ticking, I thought, “I have a strong attack here. My queen is leading the attack. I don’t want to swap it off.” Instead I play Qxd6, pinning black’s rook on e7. If black takes my bishop on h5, I thought I’d follow by moving my queen to the back rank to check the black king and win black’s other rook. I overlooked black’s knight on c6 covers my queen’s two infiltration squares (b8 and d8). Damn.

The game continues 22.Qxd6 Qxh5 23.Bxe7+ Nxe7 24.Nd7+ Kg8 25.Rxe7 Qg5+ 26.Kc3 Nf7 27.Qb8+ Kh7 28.Qg3

7r/3NRnpk/p7/2p2Pq1/8/2KP1PQ1/PPP3PP/R7 b - - 6 28

Now I’m willing to trade queens. But black isn’t. MadChess takes my rook. I sensed (correctly) it didn’t matter because of the strength of my attack, but I fail to press my advantage maximally.

The game continues 28… Qxe7 29.Qg6+ Kg8

6kr/3Nqnp1/p5Q1/2p2P2/8/2KP1P2/PPP3PP/R7 w - - 2 30

Here, under time pressure, I overlook a crushing move. Afterwards, when reviewing the game I saw it immediately. Nonetheless, I went on to win without making any more significant mistakes:

30.Qe6 Qd8 31.Re1 Rh7 32.Qe8+ Qxe8 33.Rxe8#

A very enjoyable game! I had MadChess 3.0 Beta do post-game analysis. I set it to full strength and asked it to identify moves where I erred by a pawn or more. You may review MadChess’ suggested improvements in the variations it added to the game below.