Complicating code in C#

Discussion of chess software programming and technical issues.

Moderators: hgm, Rebel, chrisw

Henk
Posts: 7216
Joined: Mon May 27, 2013 10:31 am

Re: Complicating code in C#

Post by Henk »

Henk wrote: Sat Mar 27, 2021 12:41 pm
Henk wrote: Fri Mar 26, 2021 4:57 pm Pity looks like something went wrong. For analysis stops when exception thrown. I don't know yet.

LMR = 1000

Code: Select all

 
197      19       121046      111396605    b1c3  b8c6  g1f3  e7e5  e2e4  g8f6  f1c4  f8c5  e1g1  e8g8  d2d3  d7d6  c1e3  c8e6  c3d5  c6d4  c2c3  d4f3  g2f3  c7c6  d5f6  g7f6  a2a4  e6c4  d3c4  a7a5  b2b3  a8b8  f1e1  b7b6  h2h3  f8e8  e1e2  e8e6  f3f4  h7h6  a1b1  g8h7  b1b2  e6e8  b2c2  e8e6  c2d2  h7g8  g1h1  g8h7  d2c2  e6e8  h1h2  e8e6  h2g1  e6e8  c2d2  e8e6  g1h1  h7g8  d2c2  g8h7  e2d2  h7g8  h1g1  g8h7  d2d3  h7h8  c2e2  h8h7  e2d2  d8c8  f4f5  e6e8  d2e2  e8d8  d3d2  d8e8  g1h1  e8d8  h1h2  d8e8  h2g1  e8d8  d2c2  d8e8  e2d2  e8d8  g1h1  d8e8  h1h2  e8d8  h2g1  d8e8  d2d3  e8d8  c2e2  d8e8  g1h1  e8h8  e2e1  h8d8  d3d2  d8e8  e1f1  e8d8  h1g1  d8e8  g1h2  e8d8  h2h1  d8e8  h1g1  e8d8  d2e2  d8e8  f1e1  c8d8  e2d2  d8c8  g1h1  e8g8  e1g1  g8d8  g1g2  d8e8  h1g1  e8d8  g2g4  d8e8  g4g3  e8d8  g3f3  d8e8  g1h1  e8d8  h1h2  d8h8  d2d3  h8e8  h2h1  e8h8  f3g3  h8d8  d3d2  c8d7  h1h2  d7e8  g3f3  e8d7  h2g1  d7c8  g1h1  d8e8  f3g3  e8d8  h1g1  d8e8  g3g4  e8d8  d2e2  c8d7  g4g2  d7e8  e2c2  e8d7  g1h2  d7c8  c2d2  c8d7  h2h1  d7e8  d2c2  e8d7  h1g1  d7c8  c2d2  d8e8  g1h1  e8d8  d2e2  c8d7  h1h2  d8e8  e2d2
Analysis stopped
O o. Found a bug in test whether move from hash table is valid. So might be that this PV may contain an invalid move.
Reconstruction of PV. No illegal moves were played. But it did not apply fifty move rule.
So at about move 85 it should already haven been a draw.

[pgn]
[Event "Edited game"]
[Site "LAPTOP-1FK7MTIP"]
[Date "2021.03.27"]
[Round "-"]
[White "-"]
[Black "-"]
[Result "1/2-1/2"]

1. Nc3 Nc6 2. Nf3 e5 3. e4 Nf6 4. Bc4 Bc5 5. O-O O-O 6. d3 d6 7. Be3 Be6 8.
Nd5 Nd4 9. c3 Nxf3+ 10. gxf3 c6 11. Nxf6+ gxf6 12. a4 Bxc4 13. dxc4 a5 14.
b3 Rb8 15. Re1 b6 16. h3 Re8 17. Re2 Re6 18. f4 h6 19. Rb1 Kh7 20. Rbb2 Re8
21. Rbc2 Re6 22. Rcd2 Kg8 23. Kh1 Kh7 24. Rc2 Re8 25. Kh2 Re6 26. Kg1 Re8
27. Rcd2 Re6 28. Kh1 Kg8 29. Rc2 Kh7 30. Red2 Kg8 31. Kg1 Kh7 32. Rd3 Kh8
33. Re2 Kh7 34. Red2 Qc8 35. f5 Re8 36. Re2 Rd8 37. Rdd2 Re8 38. Kh1 Rd8
39. Kh2 Re8 40. Kg1 Rd8 41. Rc2 Re8 42. Red2 Rd8 43. Kh1 Re8 44. Kh2 Rd8
45. Kg1 Re8 46. Rd3 Rd8 47. Re2 Re8 48. Kh1 Rh8 49. Re1 Rd8 50. Rd2 Re8 51.
Rf1 Rd8 52. Kg1 Re8 53. Kh2 Rd8 54. Kh1 Re8 55. Kg1 Rd8 56. Re2 Re8 57.
Rfe1 Qd8 58. Rd2 Qc8 59. Kh1 Rg8 60. Rg1 Rd8 61. Rg2 Re8 62. Kg1 Rd8 63.
Rg4 Re8 64. Rg3 Rd8 65. Rf3 Re8 66. Kh1 Rd8 67. Kh2 Rh8 68. Rd3 Re8 69. Kh1
Rh8 70. Rg3 Rd8 71. Rd2 Qd7 72. Kh2 Qe8 73. Rf3 Qd7 74. Kg1 Qc8 75. Kh1 Re8
76. Rg3 Rd8 77. Kg1 Re8 78. Rg4 Rd8 79. Re2 Qd7 80. Rg2 Qe8 81. Rc2 Qd7 82.
Kh2 Qc8 83. Rd2 Qd7 84. Kh1 Qe8 85. Rc2 Qd7 86. Kg1 Qc8 87. Rd2 Re8 88. Kh1
Rd8 89. Re2 Qd7 90. Kh2 Re8 91. Rd2
{Draw by fifty move rule} 1/2-1/2
[/pgn]
Henk
Posts: 7216
Joined: Mon May 27, 2013 10:31 am

Re: Complicating code in C#

Post by Henk »

By the way record already broken. But pv not complete only 171 plies displayed.

Code: Select all

220      11       490312      370148685    b1c3  g8f6  g1f3  d7d5  d2d4  e7e6  c1f4  b8c6  g2g3  f8d6  f1g2  c8d7  e2e3  e8e7  a1c1  b7b6  e1d2  h8g8  a2a3  d6f4  g3f4  h7h6  d2d3  h6h5  e3e4  d5e4  c3e4  f6d5  d1d2  f7f5  e4c3  g7g6  h2h3  g8h8  c1e1  e7d6  d2c1  a8c8  a3a4  c8a8  e1g1  a7a6  g1e1  a8a7  e1f1  h5h4  f1e1  h8f8  e1g1  f8g8  g1d1  g8h8  d1f1  d5f6  f1e1  a7b7  d3d2  f6d5  d2d1  d5f6  e1e3  b7a7  e3d3  h8h5  d3d2  f6d5  d2e2  h5h8  h1e1  h8h5  e1f1  d5f6  e2e3  h5h6  f1g1  h6h5  g1e1  h5h8  e1h1  h8h7  e3e1  h7h8  d1d2  f6d5  d2e2  h8h7  e2d1  h7h5  e1g1  d5f6  g1f1  d6e7  d1d2  f6d5  d2d3  e7d6  d3e2  d6e7  f1e1  e7d6  e1g1  h5h8  e2d1  h8h5  d1e1  d6e7  e1f1  e7d6  h1h2  h5h8  f1e1  h8h7  h2h1  h7h5  e1f1  d6e7  f1e2  d5f6  c1d1  f6d5  d1d2  e7f6  g1c1  f6e7  e2d3  e7d6  c1f1  h5h6  f1d1  d5f6  d2c1  h6h8  d1d2  f6d5  d2e2  h8f8  e2e1  f8g8  d3e2  g8h8  e1d1  h8h5  e2e1  d5f6  e1d2  h5h8  h1g1  f6d5  d2d3  h8h5  d1e1  h5h8  g1f1  d5f6  c1d1  f6d5  d1d2  h8h5  d2c1  h5h7  f1h1  h7h8  h1h2  d5f6  c1d1  f6d5  d1d2  h8h5  d2c1  h5h8  e1f1
Henk
Posts: 7216
Joined: Mon May 27, 2013 10:31 am

Re: Complicating code in C#

Post by Henk »

Taking too much time now. So this is the last one.

Code: Select all

221      11       603051      444126968    b1c3  g8f6  g1f3  d7d5  d2d4  e7e6  c1f4  b8c6  g2g3  f8d6  f1g2  c8d7  e2e3  e8e7  a1c1  b7b6  e1d2  h8g8  a2a3  d6f4  g3f4  h7h6  d2d3  h6h5  e3e4  d5e4  c3e4  f6d5  d1d2  f7f5  e4c3  g7g6  h2h3  g8h8  c1e1  e7d6  d2c1  a8c8  a3a4  c8a8  e1g1  a7a6  g1e1  a8a7  e1f1  h5h4  f1e1  h8f8  e1g1  f8g8  g1d1  g8h8  d1f1  d5f6  f1e1  a7b7  d3d2  f6d5  d2d1  d5f6  e1e3  b7a7  e3d3  h8h5  d3d2  f6d5  d2e2  h5h8  h1e1  h8h5  e1f1  d5f6  e2e3  h5h6  f1g1  h6h5  g1e1  h5h8  e1h1  h8h7  e3e1  h7h8  d1d2  f6d5  d2e2  h8h7  e2d1  h7h5  e1g1  d5f6  g1f1  d6e7  d1d2  f6d5  d2d3  e7d6  d3e2  d6e7  f1e1  e7d6  e1g1  h5h8  e2d1  h8h5  d1e1  d6e7  e1f1  e7d6  h1h2  h5h8  f1e1  h8h7  h2h1  h7h5  e1f1  d6e7  f1e2  d5f6  c1d1  f6d5  d1d2  e7f6  g1c1  f6e7  e2d3  e7d6  c1f1  h5h6  f1d1  d5f6  d2c1  h6h8  d1d2  f6d5  d2e2  h8f8  e2e1  f8g8  d3e2  g8h8  e1d1  h8h5  e2e1  d5f6  e1d2  h5h8  h1g1  f6d5  d2d3  h8h5  d1e1  h5h8  g1f1  d5f6  c1d1  f6d5  d1d2  h8h5  d2c1  h5h7  f1h1  h7h8  h1h2  h8g8  e1d1  g8f8  d1h1  f8g8  d3e2
Henk
Posts: 7216
Joined: Mon May 27, 2013 10:31 am

Re: Complicating code in C#

Post by Henk »

Ok back to normal
LMR = (1) + 1
NULL Move = (1) + 2

Code: Select all

 
   1      32            8              5    d2d4
   2     -12           11             13    d2d4  d7d5
   3      27           12            301    d2d4  d7d5  g1f3
   4     -11           14            747    d2d4  d7d5  g1f3  g8f6
   4       0           18           1526    b1c3  d7d5  e2e4  c7c6
   4       4           21           2421    d2d3  g8h6  e2e4  e7e5
   5     -17           29           5161    d2d3  b8c6  g2g3  d7d5  g1f3
   5      26           35           7392    d2d4  d7d5  g1f3  g8f6  c1e3
   6       3           47          11605    d2d4  d7d5  c1d2  g8h6  g1f3  c8f5
   7      -7           81          28415    d2d4  d7d5  c1d2  e7e6  b1a3  g8f6  g1f3
   7       5          135          63257    e2e4  b8c6  d2d4  e7e5  g1f3  g8f6  b1c3
   8      12          256         174260    e2e4  b8c6  d2d4  e7e5  d4d5  f8b4  b1c3  c6d4
   9      26          480         367282    e2e4  d7d5  e4d5  g8f6  f1b5  c7c6  d5c6  b7c6  b5d3
  10      24          677         530463    e2e4  d7d5  e4d5  g8f6  b1c3  f6d5  c3d5  d8d5  d2d4  c8f5
  11       5         3266        2645145    e2e4  e7e5  g1f3  g8f6  b1c3  b8c6
  12      -1         7022        5743521    e2e4  e7e5  g1f3  g8f6  b1c3  b8c6  d2d3  f8c5  c1e3  d7d6  e3c5  d6c5
  13       9        12174        9403891    e2e4  e7e5  g1f3  g8f6  b1c3  b8c6  f1c4  f8c5  d2d3  d7d6  c3a4  c5b4  a4c3
Henk
Posts: 7216
Joined: Mon May 27, 2013 10:31 am

Re: Complicating code in C#

Post by Henk »

No LMR, no null move. But futility pruning and aspiration search.

Code: Select all

 
   1      69            7              5    e2e4
   2      28           11             22    e2e4  g8f6
   3      63           12            250    e2e4  g8f6  b1c3
   4      22           17            739    e2e4  g8f6  e4e5  f6d5
   5      54           46           7170    e2e4  e7e5  f1c4  f8c5  b1c3
   6      24          109          21007    e2e4  e7e5  g1f3  f8d6  d2d4  b8c6
   7      52          289         129832    e2e4  e7e5  g1f3  b8c6  b1c3  f8c5  f1c4
   8      12          875         456092    e2e4  e7e5  g1f3  b8c6  b1c3  f8c5  f1c4  g8f6
   9      38         4505        2741559    e2e4  e7e5  c2c3  g8f6  d2d4  f8d6  f1d3  e8g8  c1e3
 

Code: Select all

   public record ChessBoardBits : IChessBoard
    {
       ...
        ImmutableArray<ulong> pieces;
        ...
    }
Maybe this immutable array making it extra slow.
Don't know yet.
Added extra bitboard for blackPieces. But made no difference in performance.
By the way adding (ulong) whitepieces and (ulong) blackpieces to this array made it somewhat slower.
Instead of keeping two separate fields.
Henk
Posts: 7216
Joined: Mon May 27, 2013 10:31 am

Re: Complicating code in C#

Post by Henk »

Using CoordSet instead of ulong for a bitboard is too slow for 64 square games.
Same holds for PieceColor etc. instead of int or enum {white, black} .

I am going to replace them as much as possible. No generic bitboards or other generic code. Only make it work for standard chess.

Procedure is:

Make it work
refactor
but most important make it efficient!!


Probably Costalba was right when he said you should spend first year on writing a fast movegenerator.
I thought he was joking.

Collecting captures is still one of most expensive operations in my code.

Writing chess engine is all about efficiency.

Hmm what about evaluation? Also need to write clean code to make it easy to change code when you get better ideas.
Henk
Posts: 7216
Joined: Mon May 27, 2013 10:31 am

Re: Complicating code in C#

Post by Henk »

Skipper 6 without null move and LMR able to draw against Skipper 5.
But bit of luck at end.

[pgn]
[Event "Computer Chess Game"]
[Site "LAPTOP-1FK7MTIP"]
[Date "2021.03.30"]
[Round "-"]
[White "Skipper_6"]
[Black "Skipper_5"]
[Result "1/2-1/2"]
[TimeControl "180+2"]
[Annotator "1. +0.20 1... -0.57"]

1. e4 {+0.20/7} Na6 {-0.57/7 4} 2. Nc3 {+0.52/6 4} Nc5 {-0.77/6 4} 3. d4
{+1.05/6 4} Ne6 {-0.92/6 4} 4. Be3 {+1.73/5 4} d6 {-0.95/6 4} 5. d5
{+1.53/5 4} Nc5 {-1.00/6 4} 6. b4 {+1.31/5 4} Na6 {-1.05/6 3} 7. Bb5+
{+1.15/5 3} Bd7 {-0.65/7 3} 8. Bxd7+ {+0.91/6 3} Qxd7 {-1.13/6 3} 9. b5
{+1.58/5 3} Nc5 {-0.78/6 3} 10. Nf3 {+1.42/5 3} Nf6 {-0.50/6 3} 11. e5
{+0.97/6 3} Nfe4 {-0.29/7 3} 12. Nxe4 {+0.58/6 3} Nxe4 {-0.45/6 3} 13. c4
{+0.89/5 3} e6 {-0.61/6 3} 14. O-O {+1.23/5 3} Be7 {-1.07/6 3} 15. Qd3
{+1.02/5 3} Nc5 {-1.06/6 3} 16. Qc2 {+0.64/5 3} exd5 {-0.33/5 3} 17. cxd5
{+0.51/5 3} Qxb5 {-0.24/5 3} 18. Bd4 {+0.12/5 3} O-O {-0.36/6 3} 19. Qc3
{-0.20/5 3} f6 {+0.20/6 3} 20. e6 {+0.93/5 3} Qe8 {-0.65/6 3} 21. Qc1
{+0.47/5 3} c6 {-0.23/6 3} 22. dxc6 {-0.20/6 3} bxc6 {+0.18/6 3} 23. Qe3
{-0.20/6 3} Qc8 {+0.47/6 3} 24. Rfe1 {-0.42/6 3} a5 {+0.31/6 3} 25. a4
{+0.21/5 3} Re8 {+0.61/5 3} 26. Bb2 {-0.28/5 3} d5 {+0.91/5 3} 27. Ba3
{-0.92/6 3} Ne4 {+1.15/7 3} 28. Bxe7 {-0.90/6 3} Rxe7 {+1.10/6 3} 29. Nd4
{-1.50/6 3} c5 {+1.50/6 3} 30. Qa3 {-1.36/5 3} Rb7 {+1.29/6 2.9} 31. Nc2
{-1.03/5 3} Re7 {+1.47/5 2.9} 32. Qa2 {-1.30/5 2.9} Qd8 {+1.37/6 2.9} 33.
Ne3 {-1.68/6 2.9} c4 {+1.27/6 2.9} 34. Nxc4 {-1.52/5 2.9} Rxe6
{+1.24/6 2.9} 35. Qe2 {-1.60/5 2.9} Rc6 {+1.12/6 2.9} 36. Ne3 {-1.37/5 2.9}
Nc3 {+1.27/6 2.8} 37. Qd2 {-1.33/6 2.8} Rc5 {+1.11/5 2.8} 38. Nf5
{-1.23/5 2.8} Rc7 {+1.23/4 2.8} 39. Re6 {-1.15/5 2.8} Rac8 {+0.76/4 2.8}
40. Rd6 {-1.14/5 2.8} Rd7 {+1.08/6 2.8} 41. Rxd7 {-1.46/6 2.8} Qxd7
{+1.13/5 2.8} 42. Qc2 {-1.67/5 2.8} d4 {+1.55/4 2.7} 43. Qd3 {-1.85/6 2.8}
Rc5 {+1.77/5 2.7} 44. Nxd4 {-0.38/5 2.7} Qxd4 {+4.02/6 2.7} 45. Qxd4
{-3.64/7 2.7} Ne2+ {+3.87/8 2.7} 46. Kf1 {-3.55/8 2.7} Nxd4 {+4.05/7 2.7}
47. g4 {-3.40/6 2.7} g5 {+3.26/7 2.7} 48. Kg2 {-3.41/7 2.7} Rc4
{+3.28/6 2.7} 49. Kg3 {-3.51/6 2.7} f5 {+3.51/6 2.7} 50. gxf5 {-3.65/7 2.7}
Nxf5+ {+3.54/7 2.6} 51. Kg2 {-3.69/7 2.7} h5 {+3.58/6 2.6} 52. h3
{-3.74/7 2.6} h4 {+3.58/6 2.6} 53. f3 {-3.77/7 2.6} Rc2+ {+3.67/7 2.6} 54.
Kg1 {-3.89/7 2.6} Nd4 {+4.33/7 2.6} 55. Rd1 {-4.66/7 2.6} Nxf3+
{+5.78/7 2.6} 56. Kf1 {-5.48/8 2.6} Ra2 {+5.67/6 2.6} 57. Rd8+
{-4.72/8 2.6} Kh7 {+5.30/7 2.6} 58. Rd7+ {-4.54/9 2.6} Kg8 {+5.35/7 2.6}
59. Rg7+ {-2.78/10 2.6} Kf8 {+2.28/8 2.5} 60. Rf7+ {-2.84/9 2.6} Kg8
{+2.53/7 2.5} 61. Rg7+ {-2.80/9 2.6} Kh8 {+0.00/10 2.5} 62. Rg8+
{+0.00/10 2.6} Kh7 {+5.37/7 2.5} 63. Rg7+ {+0.00/10 2.6} Kh6 {+0.00/9 2.5}
64. Rg6+ {+0.00/10 2.6} Kh7 {+0.00/9 2.5} 65. Rg7+ {+0.00/10 2.6} Kxg7
{+0.00/5423 16}
{Xboard adjudication: Stalemate} 1/2-1/2
[/pgn]
Henk
Posts: 7216
Joined: Mon May 27, 2013 10:31 am

Re: Complicating code in C#

Post by Henk »

Without LMR difficult to reach level 10. Taking 76 seconds. Already had to use null move with R = 1 + 2;

Code: Select all

  10       4         7577        5910711    e2e4  e7e5  b1c3  g8f6  g1f3  b8c6  f1c4  f8c5  e1g1  e8g8
Henk
Posts: 7216
Joined: Mon May 27, 2013 10:31 am

Re: Complicating code in C#

Post by Henk »

Interesting opening lines. To be continued. LMR = 1 +1

Code: Select all

 13      39         7107        8821817    e2e4  f7f5  e4f5  d7d5  d1h5  e8d7  h5d1  b8c6  g1f3  g8f6  b1c3  e7e5  f5e6  d7e6
 14      36        24481       31536257    e2e4  f7f5  e4f5  d7d5  d1h5  e8d7  h5d1  g8h6  f1d3  d7c6  g2g4  g7g6  f5g6  c8g4
Henk
Posts: 7216
Joined: Mon May 27, 2013 10:31 am

Re: Complicating code in C#

Post by Henk »

More ridiculous opening lines.
Lmr = 1 + 1, Null move R = 1 + 3. Futility delta pruning in QSearch

Code: Select all

 13       4         5854        7642073    e2e4  e7e5  b1c3  b8c6  f2f4  f7f5  f4e5  f5e4  c3e4  c6e5  d1h5  e5g6  h5d1
 14      -1        13686       16870168    e2e4  e7e5  b1c3  b8c6  f2f4  f7f5  e4f5  d7d6  f1d3  e5f4  g1e2  g8e7  g2g4  g7g5