you seem to enjoy being rude. help yourself then. as for my engine - google Cheng 4, that would be mine.
"It must be a clone of some sort..."
Moderators: hgm, Rebel, chrisw
-
- Posts: 2559
- Joined: Fri Nov 26, 2010 2:00 pm
- Location: Czech Republic
- Full name: Martin Sedlak
Re: "It must be a clone of some sort..."
Martin Sedlak
-
- Posts: 2559
- Joined: Fri Nov 26, 2010 2:00 pm
- Location: Czech Republic
- Full name: Martin Sedlak
Re: "It must be a clone of some sort..."
ok, a couple of notes about Sapeli's move generator:
1) you seem to copy the whole board per move generated unless I'm mistaken; in fact you actually seem to do makemove inside your movegen; this way it has to be very slow
2) you always do a full check whether king is left in check after move (per move generated) - this is also slow. a more common solution is to determine pinned pieces and only allow them to move inside their pin mask (of course evasions need a different idea => by determing checking opponent pieces instead ["checkers" if you want; double check implies king move]) => this is a bit tricky to implement, but you'll eventually get there.
the basic idea for pins is to do "bishop/rook" attacks from king position, then scan further for opponent's sliders
3) if you had a separate make/undo move routines instead, then you could easily know whether a move gives check. this is useful for two things:
a) extending moves that give check (instead of extending check evasions)
b) in the child node you immediately know whether you are in check or not (based on a flag or function argument)
also by postponing makemove (which can be expensive) until after the move generation, you can always get a cutoff inside search before actually processing all the moves, which will of course also save some extra time
it might be a good idea to merge some separate functions for white/black (either via macros or color/stm argument) into a single function. this will make it easier at later stages.
other than that, Sapeli is indeed a very original engine. you are at a very early stage in development, where you can get massive elo gains with very few changes/bugfixing. at this point, chess programming is still fun. simply adding a check extension might give you a nice elo gain, some new eval features will improve playing style and so on. so many possibilities!
1) you seem to copy the whole board per move generated unless I'm mistaken; in fact you actually seem to do makemove inside your movegen; this way it has to be very slow
2) you always do a full check whether king is left in check after move (per move generated) - this is also slow. a more common solution is to determine pinned pieces and only allow them to move inside their pin mask (of course evasions need a different idea => by determing checking opponent pieces instead ["checkers" if you want; double check implies king move]) => this is a bit tricky to implement, but you'll eventually get there.
the basic idea for pins is to do "bishop/rook" attacks from king position, then scan further for opponent's sliders
3) if you had a separate make/undo move routines instead, then you could easily know whether a move gives check. this is useful for two things:
a) extending moves that give check (instead of extending check evasions)
b) in the child node you immediately know whether you are in check or not (based on a flag or function argument)
also by postponing makemove (which can be expensive) until after the move generation, you can always get a cutoff inside search before actually processing all the moves, which will of course also save some extra time
it might be a good idea to merge some separate functions for white/black (either via macros or color/stm argument) into a single function. this will make it easier at later stages.
other than that, Sapeli is indeed a very original engine. you are at a very early stage in development, where you can get massive elo gains with very few changes/bugfixing. at this point, chess programming is still fun. simply adding a check extension might give you a nice elo gain, some new eval features will improve playing style and so on. so many possibilities!
Martin Sedlak
-
- Posts: 725
- Joined: Tue Dec 18, 2007 9:38 pm
- Location: Munich, Germany
- Full name: Dr. Oliver Brausch
Re: "It must be a clone of some sort..."
An effective search is probably the most difficult part of an engine.
-
- Posts: 1784
- Joined: Wed Jul 03, 2019 4:42 pm
- Location: Netherlands
- Full name: Marcel Vanthoor
Re: "It must be a clone of some sort..."
Strangely enough, PeSTO shows it just the other way around: that an engine can be very strong without having any evaluation at all except PSQT and material counting. This seems to mean that an engine can be very strong by having a lot of knowledge, or very strong by being fast and having a good search function. It would also mean, that if you add knowledge/evaluation, that this addition must gain you more Elo than the speed loss makes you lose Elo.Joost Buijs wrote: ↑Tue Sep 29, 2020 5:05 pm NNUE shows again that evaluation is the most important part of an engine and that speed is of secondary importance. It was somewhat different in the very distant past when the hardware was slow and the compilers were bad, at that time you had to code everything for speed to get the engine tactically sufficient.
-
- Posts: 1563
- Joined: Thu Jul 16, 2009 10:47 am
- Location: Almere, The Netherlands
Re: "It must be a clone of some sort..."
What to think about PeSTO, I dont know, but what I do know from experience is that an engine with only PSQT and material counting plays very badly, even when everything is optimally tuned. Just remove king-safety and pawn-structure evaluation from an engine and see how bad it plays.mvanthoor wrote: ↑Tue Sep 29, 2020 11:10 pmStrangely enough, PeSTO shows it just the other way around: that an engine can be very strong without having any evaluation at all except PSQT and material counting. This seems to mean that an engine can be very strong by having a lot of knowledge, or very strong by being fast and having a good search function. It would also mean, that if you add knowledge/evaluation, that this addition must gain you more Elo than the speed loss makes you lose Elo.Joost Buijs wrote: ↑Tue Sep 29, 2020 5:05 pm NNUE shows again that evaluation is the most important part of an engine and that speed is of secondary importance. It was somewhat different in the very distant past when the hardware was slow and the compilers were bad, at that time you had to code everything for speed to get the engine tactically sufficient.
-
- Posts: 491
- Joined: Sat Mar 02, 2013 11:31 pm
Re: "It must be a clone of some sort..."
Ok, thanks for the feedback.mar wrote: ↑Tue Sep 29, 2020 10:39 pm ok, a couple of notes about Sapeli's move generator:
1) you seem to copy the whole board per move generated unless I'm mistaken; in fact you actually seem to do makemove inside your movegen; this way it has to be very slow
2) you always do a full check whether king is left in check after move (per move generated) - this is also slow. a more common solution is to determine pinned pieces and only allow them to move inside their pin mask (of course evasions need a different idea => by determing checking opponent pieces instead ["checkers" if you want; double check implies king move]) => this is a bit tricky to implement, but you'll eventually get there.
the basic idea for pins is to do "bishop/rook" attacks from king position, then scan further for opponent's sliders
3) if you had a separate make/undo move routines instead, then you could easily know whether a move gives check. this is useful for two things:
a) extending moves that give check (instead of extending check evasions)
b) in the child node you immediately know whether you are in check or not (based on a flag or function argument)
also by postponing makemove (which can be expensive) until after the move generation, you can always get a cutoff inside search before actually processing all the moves, which will of course also save some extra time
it might be a good idea to merge some separate functions for white/black (either via macros or color/stm argument) into a single function. this will make it easier at later stages.
other than that, Sapeli is indeed a very original engine. you are at a very early stage in development, where you can get massive elo gains with very few changes/bugfixing. at this point, chess programming is still fun. simply adding a check extension might give you a nice elo gain, some new eval features will improve playing style and so on. so many possibilities!
A few things.
I've been thinking about getting rid of structs (replace as char arrays as HGM does) as compilers have hard time optimizing them. Maybe some new clang version will do magics in the future.
Most importantly I've been fixing bugs. The 1.90 contained 1 bug. I should have parenthesise everything in C. Compilers always get these things wrong.
1) Yes. Everything is copied. All the hard work goes to waste when there's a cutoff. Tho there's room for improvements. I used to incrementally update hash. But I benchmarked and calculating hash from scratch wasn't that slower. Got rid of lots of shitty code in the process.
2) Yes. I do full check. My check function is branchless. It can't be that slow. Tho there's room for improvements.
Yes I have black/white that's because its branchless(branch prediction). You could write more compact code with lots of ifs. But CPUs have hard time predicting operators. It's pretty damn fast. But that also means more stuff can't be added. What I have I try to tune. I have tried to remove stuff from eval. It clearly hurts.
I tune evaluation by hand playing 100ms seconds games tons. That's why its important that Sapeli is fast, it can be tuned by 100ms games. Obviously those are just Eval() tuning as there's no time to search anything.
-
- Posts: 725
- Joined: Tue Dec 18, 2007 9:38 pm
- Location: Munich, Germany
- Full name: Dr. Oliver Brausch
Re: "It must be a clone of some sort..."
This is very true!
I took a view at your engine and I am impressed! About 2000 l.o.c., which makes it the second smallest engine that can beat Stockfish.
I git cloned and compiled it. (PS: I needed to add "-D__unix__" as compiler option for clang, at least on MacOSX, perhaps you want to change this).
From your results against Stockfish your engine ist probably stronger than mine so I let them both play one game. In these cutechess-cli days I hardly watche games with an Chess GUI, so this was very entertaining.
There was a highly strategical position in this game. I am used to the fact that OlIThink really doesn't know what to do and make erratic moves, but not this time.
Here is the situation at move 68:
[d]2k5/2p2b2/2p1p1p1/2NpPnPp/1P1P1P2/2PK4/5B2/8 b - - 20 68
It is a draw.
The position in the middle of the board is completely closed. In order to move something, the white King has go over the a-File to other site of the board. But the white King can't leave, because it is needed to block black h-pawn.
Sapeli as black is not happy with the draw, it wants to promote his pawn and plays
Code: Select all
68...h4?
[d]2k5/5b2/2p1p1p1/2NpP1P1/1P1P3n/2P4p/7K/2B5 w - - 4 77
Code: Select all
77. Kxh3
Nevertheless the white King found his way to that corner and needed 15 moves for it:
[d]8/4kb2/2p1p1p1/K1NpP1P1/1P1P4/2P3n1/8/2B5 w - - 29 92
Code: Select all
92. Kb6!
[Event "Computer Chess Game"]
[Site "OliversMacBook2.local"]
[Date "2020.09.30"]
[Round "-"]
[White "OliThink 5.8.3"]
[Black "Sapeli 1.91"]
[Result "1-0"]
[TimeControl "40/60"]
[Annotator "4. +0.06 1... -0.10"]
1. e4 d5 {-0.10/11 2.0} 2. e5 Bf5 {+0.02/11 1.9} 3. g4 Bg6 {+0.12/11 1.9}
4. d4 {+0.06/15 1.4} Nc6 {+0.11/10 1.8} 5. h4 {+0.21/15 1.1} h5
{+0.06/10 1.7} 6. g5 {+0.18/18 0.5} e6 {+0.25/10 1.7} 7. a3 {+0.16/18 0.3}
Nge7 {+0.36/10 1.6} 8. Nc3 {+0.11/18 2.1} Nf5 {+0.31/10 1.6} 9. Nf3
{+0.18/19 1.8} Be7 {+0.28/10 1.5} 10. Bb5 {+0.26/19 0.1} O-O {+0.31/10 1.5}
11. O-O {+0.19/20 1.2} a6 {+0.42/10 1.4} 12. Bxc6 {+0.17/19 1.4} bxc6
{+0.43/10 1.4} 13. Na4 {+0.19/19 0.8} Qb8 {+0.58/10 1.4} 14. b4
{+0.23/16 0.1} a5 {+0.51/11 1.4} 15. c3 {-0.03/18} axb4 {+0.51/11 1.4} 16.
axb4 {+0.11/20 1.9} Qb5 {+0.49/10 1.4} 17. Re1 {+0.13/22 2.1} Ra7
{+0.69/10 1.4} 18. Re2 {+0.02/22} Rfa8 {+0.60/10 1.4} 19. Rea2
{+0.17/22 0.4} Qc4 {+0.54/10 1.4} 20. Ra3 {+0.20/19 1.6} Ra6 {+0.41/10 1.4}
21. Nb2 {+0.22/22 1.5} Qb5 {+0.38/11 1.4} 22. Rxa6 {+0.09/23 0.2} Rxa6
{+0.36/11 1.4} 23. Rxa6 {+0.00/22 0.1} Qxa6 {+0.33/12 1.4} 24. Bf4
{+0.00/25 0.5} Qa2 {+0.52/11 1.4} 25. Bc1 {+0.00/26 0.8} Qb1 {+0.58/11 1.4}
26. Nd2 {-0.31/30 6} Qa1 {+0.57/12 1.4} 27. Nf3 {-0.17/23 1.5} Qa2
{+0.57/11 1.4} 28. Kh2 {-0.12/23 1.5} Bh7 {+0.49/11 1.4} 29. Kh3
{+0.00/20 2.2} Qa3 {+0.47/11 1.4} 30. Na4 {-0.02/22 1.7} Qa1 {+0.40/11 1.4}
31. Ne1 {+0.00/22 1.0} Bg6 {+0.42/11 1.4} 32. Nb2 {+0.00/22 1.6} f6
{+0.42/11 1.4} 33. Ned3 {+0.02/22 2.2} fxg5 {+0.60/11 1.4} 34. hxg5
{+0.00/25 0.9} Qa3 {+0.58/11 1.4} 35. Na4 {+0.00/26 0.7} Qa1 {+0.45/12 1.4}
36. Nab2 {+0.00/33 0.8} Qa3 {+0.48/11 1.4} 37. Na4 {+0.00/29 5} Qa2
{+0.32/12 1.4} 38. Nab2 {+0.00/28 2.4} Qa1 {+0.42/11 1.4} 39. f4
{+0.00/27 2.9} Qa3 {+0.36/11 1.4} 40. Qc2 {+0.00/27 3} Qa6 {+0.42/11 1.4}
41. Bd2 {+0.00/22 1.4} Bh7 {+0.49/11 2.0} 42. Qb1 {+0.12/19 1.5} Qa3
{+0.51/11 2.0} 43. Qg1 {+0.10/17 1.0} Bg6 {+0.45/11 1.9} 44. Qf2
{+0.09/22 1.2} Be8 {+0.39/11 1.8} 45. Be1 {+0.18/20 1.7} Bg6 {+0.29/11 1.8}
46. Qd2 {+0.18/19 1.3} Be8 {+0.24/11 1.7} 47. Kh2 {+0.20/18 1.4} Bg6
{+0.24/11 1.7} 48. Bf2 {+0.21/21 0.3} Bf7 {+0.22/11 1.6} 49. Kg2
{+0.22/18 1.1} Qa1 {+0.21/10 1.6} 50. Nc1 {+0.30/19 1.4} Qb1 {+0.23/11 1.5}
51. Nbd3 {+0.44/19 1.1} Qa1 {+0.15/11 1.5} 52. Qb2 {+0.53/21 1.2} Qa4
{+0.23/11 1.4} 53. Qa2 {+0.38/19 1.9} Qxa2 {+0.16/12 1.4} 54. Nxa2
{+0.57/23 2.3} Kf8 {-0.01/12 1.4} 55. Nac1 {+0.54/22 1.2} g6 {-0.12/13 1.4}
56. Nb3 {+0.54/27 1.1} Be8 {-0.06/12 1.4} 57. Nbc5 {+0.57/32 0.3} Bxc5
{-0.42/13 1.4} 58. Nxc5 {+0.54/31} Ke7 {-0.47/13 1.4} 59. Kf3
{+0.60/32 0.3} Bf7 {-0.42/13 1.4} 60. Ke2 {+0.56/35 1.2} Kd8 {-0.42/13 1.4}
61. Be3 {+0.56/33 1.3} Kc8 {-0.37/12 1.4} 62. Bd2 {+0.57/30 1.4} Ng3+
{-0.37/13 1.4} 63. Kf2 {+0.55/33 1.4} Nf5 {-0.42/13 1.4} 64. Kf1
{+0.56/37 0.1} Kb8 {-0.38/14 1.4} 65. Be1 {+0.52/31 1.5} Bg8 {-0.37/13 1.4}
66. Bf2 {+0.55/34 2.5} Kc8 {-0.45/13 1.4} 67. Ke2 {+0.52/31 0.2} Bf7
{-0.35/13 1.4} 68. Kd3 {+0.57/33 1.6} h4 {-0.40/13 1.4} 69. Ke2
{+1.50/30 2.2} h3 {-1.44/14 1.4} 70. Kf1 {+1.41/35 0.6} Ng7 {-0.84/14 1.4}
71. Kg1 {+1.35/35 1.6} Nh5 {-1.32/15 1.4} 72. Nd3 {+1.37/34 0.4} c5
{-1.30/14 1.4} 73. Nxc5 {+1.35/35 0.7} Nxf4 {-1.43/15 1.4} 74. Kh2
{+1.34/38 1.3} c6 {-1.37/14 1.4} 75. Be3 {+1.82/35 2.7} Ng2 {-1.44/15 1.4}
76. Bc1 {+1.81/42 1.2} Nh4 {-1.42/15 1.4} 77. Kxh3 {+1.81/45 2.0} Nf5
{-1.40/14 1.4} 78. Kg2 {+1.81/44 2.0} Kd8 {-1.40/12 1.4} 79. Kf3
{+1.81/46 3} Ke7 {-1.45/13 1.4} 80. Bf4 {+1.81/45 5} Ke8 {-1.46/13 1.4} 81.
Ke2 {+1.82/42 1.3} Ng7 {-1.49/14 2.0} 82. Kd3 {+1.82/37 1.1} Kf8
{-1.55/14 2.0} 83. Kc2 {+1.81/31 1.1} Ke7 {-1.46/14 1.9} 84. Kb1
{+1.82/39 0.3} Nh5 {-1.44/14 1.8} 85. Be3 {+1.82/36 1.1} Ng3 {-1.43/14 1.8}
86. Kc2 {+1.82/38 1.4} Nf5 {-1.44/14 1.7} 87. Bd2 {+1.81/39 1.1} Nh4
{-1.46/14 1.7} 88. Kb3 {+1.88/29 1.3} Nf3 {-1.44/14 1.6} 89. Bc1
{+1.94/27 1.2} Nh4 {-1.44/13 1.6} 90. Ka4 {+1.94/32 1.1} Nf5 {-1.44/14 1.5}
91. Ka5 {+2.09/33 2.4} Ng3 {-1.45/14 1.5} 92. Kb6 {+2.78/27 1.4} Be8
{-1.50/15 1.4} 93. Ba3 {+3.06/27 0.5} Ne2 {-1.50/15 1.4} 94. Nb7
{+3.25/27 0.2} Kd7 {-1.73/15 1.4} 95. Bb2 {+3.42/28} Nf4 {-1.87/15 1.4} 96.
Nd6 {+5.61/31 1.4} Nd3 {-2.08/16 1.4} 97. Ba3 {+7.30/32 2.0} Ne1
{-3.01/16 1.4} 98. Nxe8 {+7.68/30 0.4} Kxe8 {-4.49/17 1.4} 99. Kxc6
{+14.16/35 0.4} Nc2 {-4.93/17 1.4} 100. Bc1 {+17.31/37 2.1} Na1
{-6.14/17 1.4} 101. b5 {+17.73/33 1.5} Nb3 {-8.02/17 1.4} 102. Kc7
{+23.68/28 0.1} Nxc1 {-9.06/18 1.4} 103. b6 {+1000.14/33 0.1} Ne2
{-9.22/17 1.4} 104. b7 {+1000.10/19} Kf7 {-9.23/15 1.4} 105. b8=Q
{+1000.11/22 0.1} Nxc3 {-9.59/13 1.4} 106. Kd7 {+1000.09/23 0.2} Ne4
{-104.85/12 0.4} 107. Qh8 {+1000.07/44} Nxg5 {-104.85/9} 108. Qf6+
{+1000.06/44} Kg8 109. Qxg6+ {+1000.05/49} Kf8 {-104.85/7} 110. Qxg5
{+1000.04/7} Kf7 111. Kd6 {+1000.03/6} Kf8 {-104.85/5} 112. Kxe6
{+1000.02/3} Ke8 113. Qe7# {+1000.01/1 0.1}
{Xboard adjudication: Checkmate} 1-0
[/pgn]
-
- Posts: 725
- Joined: Tue Dec 18, 2007 9:38 pm
- Location: Munich, Germany
- Full name: Dr. Oliver Brausch
Re: "It must be a clone of some sort..."
I am not sure if this is always correct. The are cases that branches do not cost any performance, because the compiler predicts them very well.
In your case, I am quite sure, your function is not slow. Your engine is really strong with this size.
I don't really understand, how there are branches for white/black. OliThink does hardly (never?) branch between white (0) and black(1), just using a parameter c (for "color").Yes I have black/white that's because its branchless(branch prediction).
-
- Posts: 491
- Joined: Sat Mar 02, 2013 11:31 pm
Re: "It must be a clone of some sort..."
Nice!OliverBr wrote: ↑Wed Sep 30, 2020 3:49 pmThis is very true!
I took a view at your engine and I am impressed! About 2000 l.o.c., which makes it the second smallest engine that can beat Stockfish.
I git cloned and compiled it. (PS: I needed to add "-D__unix__" as compiler option for clang, at least on MacOSX, perhaps you want to change this).
From your results against Stockfish your engine ist probably stronger than mine so I let them both play one game. In these cutechess-cli days I hardly watche games with an Chess GUI, so this was very entertaining.
There was a highly strategical position in this game. I am used to the fact that OlIThink really doesn't know what to do and make erratic moves, but not this time.
Here is the situation at move 68:
[d]2k5/2p2b2/2p1p1p1/2NpPnPp/1P1P1P2/2PK4/5B2/8 b - - 20 68
It is a draw.
The position in the middle of the board is completely closed. In order to move something, the white King has go over the a-File to other site of the board. But the white King can't leave, because it is needed to block black h-pawn.
Sapeli as black is not happy with the draw, it wants to promote his pawn and playsNow the black pawn can be eaten which happens eventually in move 77 withCode: Select all
68...h4?
[d]2k5/5b2/2p1p1p1/2NpP1P1/1P1P3n/2P4p/7K/2B5 w - - 4 77
Still, the white King must start his voyage to the upper left corner of the board. OliThink doesn't have any chess knowledge other than mobility, so it is not supposed to have any clue about what to do here.Code: Select all
77. Kxh3
Nevertheless the white King found his way to that corner and needed 15 moves for it:
[d]8/4kb2/2p1p1p1/K1NpP1P1/1P1P4/2P3n1/8/2B5 w - - 29 92
[pgn]Code: Select all
92. Kb6!
[Event "Computer Chess Game"]
[Site "OliversMacBook2.local"]
[Date "2020.09.30"]
[Round "-"]
[White "OliThink 5.8.3"]
[Black "Sapeli 1.91"]
[Result "1-0"]
[TimeControl "40/60"]
[Annotator "4. +0.06 1... -0.10"]
1. e4 d5 {-0.10/11 2.0} 2. e5 Bf5 {+0.02/11 1.9} 3. g4 Bg6 {+0.12/11 1.9}
4. d4 {+0.06/15 1.4} Nc6 {+0.11/10 1.8} 5. h4 {+0.21/15 1.1} h5
{+0.06/10 1.7} 6. g5 {+0.18/18 0.5} e6 {+0.25/10 1.7} 7. a3 {+0.16/18 0.3}
Nge7 {+0.36/10 1.6} 8. Nc3 {+0.11/18 2.1} Nf5 {+0.31/10 1.6} 9. Nf3
{+0.18/19 1.8} Be7 {+0.28/10 1.5} 10. Bb5 {+0.26/19 0.1} O-O {+0.31/10 1.5}
11. O-O {+0.19/20 1.2} a6 {+0.42/10 1.4} 12. Bxc6 {+0.17/19 1.4} bxc6
{+0.43/10 1.4} 13. Na4 {+0.19/19 0.8} Qb8 {+0.58/10 1.4} 14. b4
{+0.23/16 0.1} a5 {+0.51/11 1.4} 15. c3 {-0.03/18} axb4 {+0.51/11 1.4} 16.
axb4 {+0.11/20 1.9} Qb5 {+0.49/10 1.4} 17. Re1 {+0.13/22 2.1} Ra7
{+0.69/10 1.4} 18. Re2 {+0.02/22} Rfa8 {+0.60/10 1.4} 19. Rea2
{+0.17/22 0.4} Qc4 {+0.54/10 1.4} 20. Ra3 {+0.20/19 1.6} Ra6 {+0.41/10 1.4}
21. Nb2 {+0.22/22 1.5} Qb5 {+0.38/11 1.4} 22. Rxa6 {+0.09/23 0.2} Rxa6
{+0.36/11 1.4} 23. Rxa6 {+0.00/22 0.1} Qxa6 {+0.33/12 1.4} 24. Bf4
{+0.00/25 0.5} Qa2 {+0.52/11 1.4} 25. Bc1 {+0.00/26 0.8} Qb1 {+0.58/11 1.4}
26. Nd2 {-0.31/30 6} Qa1 {+0.57/12 1.4} 27. Nf3 {-0.17/23 1.5} Qa2
{+0.57/11 1.4} 28. Kh2 {-0.12/23 1.5} Bh7 {+0.49/11 1.4} 29. Kh3
{+0.00/20 2.2} Qa3 {+0.47/11 1.4} 30. Na4 {-0.02/22 1.7} Qa1 {+0.40/11 1.4}
31. Ne1 {+0.00/22 1.0} Bg6 {+0.42/11 1.4} 32. Nb2 {+0.00/22 1.6} f6
{+0.42/11 1.4} 33. Ned3 {+0.02/22 2.2} fxg5 {+0.60/11 1.4} 34. hxg5
{+0.00/25 0.9} Qa3 {+0.58/11 1.4} 35. Na4 {+0.00/26 0.7} Qa1 {+0.45/12 1.4}
36. Nab2 {+0.00/33 0.8} Qa3 {+0.48/11 1.4} 37. Na4 {+0.00/29 5} Qa2
{+0.32/12 1.4} 38. Nab2 {+0.00/28 2.4} Qa1 {+0.42/11 1.4} 39. f4
{+0.00/27 2.9} Qa3 {+0.36/11 1.4} 40. Qc2 {+0.00/27 3} Qa6 {+0.42/11 1.4}
41. Bd2 {+0.00/22 1.4} Bh7 {+0.49/11 2.0} 42. Qb1 {+0.12/19 1.5} Qa3
{+0.51/11 2.0} 43. Qg1 {+0.10/17 1.0} Bg6 {+0.45/11 1.9} 44. Qf2
{+0.09/22 1.2} Be8 {+0.39/11 1.8} 45. Be1 {+0.18/20 1.7} Bg6 {+0.29/11 1.8}
46. Qd2 {+0.18/19 1.3} Be8 {+0.24/11 1.7} 47. Kh2 {+0.20/18 1.4} Bg6
{+0.24/11 1.7} 48. Bf2 {+0.21/21 0.3} Bf7 {+0.22/11 1.6} 49. Kg2
{+0.22/18 1.1} Qa1 {+0.21/10 1.6} 50. Nc1 {+0.30/19 1.4} Qb1 {+0.23/11 1.5}
51. Nbd3 {+0.44/19 1.1} Qa1 {+0.15/11 1.5} 52. Qb2 {+0.53/21 1.2} Qa4
{+0.23/11 1.4} 53. Qa2 {+0.38/19 1.9} Qxa2 {+0.16/12 1.4} 54. Nxa2
{+0.57/23 2.3} Kf8 {-0.01/12 1.4} 55. Nac1 {+0.54/22 1.2} g6 {-0.12/13 1.4}
56. Nb3 {+0.54/27 1.1} Be8 {-0.06/12 1.4} 57. Nbc5 {+0.57/32 0.3} Bxc5
{-0.42/13 1.4} 58. Nxc5 {+0.54/31} Ke7 {-0.47/13 1.4} 59. Kf3
{+0.60/32 0.3} Bf7 {-0.42/13 1.4} 60. Ke2 {+0.56/35 1.2} Kd8 {-0.42/13 1.4}
61. Be3 {+0.56/33 1.3} Kc8 {-0.37/12 1.4} 62. Bd2 {+0.57/30 1.4} Ng3+
{-0.37/13 1.4} 63. Kf2 {+0.55/33 1.4} Nf5 {-0.42/13 1.4} 64. Kf1
{+0.56/37 0.1} Kb8 {-0.38/14 1.4} 65. Be1 {+0.52/31 1.5} Bg8 {-0.37/13 1.4}
66. Bf2 {+0.55/34 2.5} Kc8 {-0.45/13 1.4} 67. Ke2 {+0.52/31 0.2} Bf7
{-0.35/13 1.4} 68. Kd3 {+0.57/33 1.6} h4 {-0.40/13 1.4} 69. Ke2
{+1.50/30 2.2} h3 {-1.44/14 1.4} 70. Kf1 {+1.41/35 0.6} Ng7 {-0.84/14 1.4}
71. Kg1 {+1.35/35 1.6} Nh5 {-1.32/15 1.4} 72. Nd3 {+1.37/34 0.4} c5
{-1.30/14 1.4} 73. Nxc5 {+1.35/35 0.7} Nxf4 {-1.43/15 1.4} 74. Kh2
{+1.34/38 1.3} c6 {-1.37/14 1.4} 75. Be3 {+1.82/35 2.7} Ng2 {-1.44/15 1.4}
76. Bc1 {+1.81/42 1.2} Nh4 {-1.42/15 1.4} 77. Kxh3 {+1.81/45 2.0} Nf5
{-1.40/14 1.4} 78. Kg2 {+1.81/44 2.0} Kd8 {-1.40/12 1.4} 79. Kf3
{+1.81/46 3} Ke7 {-1.45/13 1.4} 80. Bf4 {+1.81/45 5} Ke8 {-1.46/13 1.4} 81.
Ke2 {+1.82/42 1.3} Ng7 {-1.49/14 2.0} 82. Kd3 {+1.82/37 1.1} Kf8
{-1.55/14 2.0} 83. Kc2 {+1.81/31 1.1} Ke7 {-1.46/14 1.9} 84. Kb1
{+1.82/39 0.3} Nh5 {-1.44/14 1.8} 85. Be3 {+1.82/36 1.1} Ng3 {-1.43/14 1.8}
86. Kc2 {+1.82/38 1.4} Nf5 {-1.44/14 1.7} 87. Bd2 {+1.81/39 1.1} Nh4
{-1.46/14 1.7} 88. Kb3 {+1.88/29 1.3} Nf3 {-1.44/14 1.6} 89. Bc1
{+1.94/27 1.2} Nh4 {-1.44/13 1.6} 90. Ka4 {+1.94/32 1.1} Nf5 {-1.44/14 1.5}
91. Ka5 {+2.09/33 2.4} Ng3 {-1.45/14 1.5} 92. Kb6 {+2.78/27 1.4} Be8
{-1.50/15 1.4} 93. Ba3 {+3.06/27 0.5} Ne2 {-1.50/15 1.4} 94. Nb7
{+3.25/27 0.2} Kd7 {-1.73/15 1.4} 95. Bb2 {+3.42/28} Nf4 {-1.87/15 1.4} 96.
Nd6 {+5.61/31 1.4} Nd3 {-2.08/16 1.4} 97. Ba3 {+7.30/32 2.0} Ne1
{-3.01/16 1.4} 98. Nxe8 {+7.68/30 0.4} Kxe8 {-4.49/17 1.4} 99. Kxc6
{+14.16/35 0.4} Nc2 {-4.93/17 1.4} 100. Bc1 {+17.31/37 2.1} Na1
{-6.14/17 1.4} 101. b5 {+17.73/33 1.5} Nb3 {-8.02/17 1.4} 102. Kc7
{+23.68/28 0.1} Nxc1 {-9.06/18 1.4} 103. b6 {+1000.14/33 0.1} Ne2
{-9.22/17 1.4} 104. b7 {+1000.10/19} Kf7 {-9.23/15 1.4} 105. b8=Q
{+1000.11/22 0.1} Nxc3 {-9.59/13 1.4} 106. Kd7 {+1000.09/23 0.2} Ne4
{-104.85/12 0.4} 107. Qh8 {+1000.07/44} Nxg5 {-104.85/9} 108. Qf6+
{+1000.06/44} Kg8 109. Qxg6+ {+1000.05/49} Kf8 {-104.85/7} 110. Qxg5
{+1000.04/7} Kf7 111. Kd6 {+1000.03/6} Kf8 {-104.85/5} 112. Kxe6
{+1000.02/3} Ke8 113. Qe7# {+1000.01/1 0.1}
{Xboard adjudication: Checkmate} 1-0
[/pgn]
Thanks for testing Sapeli!
Surprised Sapeli was able to hang on with your engine.
On __unix__: MacOS is supposed to be real Unix and Linux just Unix like. I need to study these constants. Might remove support for Windows then I don't need that #if defined spaghetti.
Here is Sapeli 1.91 analysis. It sees h4 is bad but not fast enough. After 17M nodes.
It usually wants to play something to keep the game alive. If it thinks it's ahead. This time with bad results. Usually it messes with material imbalances.
My latest speedups should help.
Code: Select all
dep score nodes time (not shown: tbhits knps seldep)
16 -0,44 1,32G 4:01.93 Kb8
15 -0,37 332,3M 1:02.33 Kb8
14 -0,40 142,2M 0:27.11 Kb8
13 -0,37 39,3M 0:07.92 Kb8
12 -0,37 17,2M 0:03.65 Kb8
11 -0,40 7,44M 0:01.70 h4
10 -0,06 738235 0:00.34 h4
9 -0,08 258536 0:00.21 h4
8 -0,05 95785 0:00.15 h4
7 -0,07 41558 0:00.11 h4
6 -0,06 17871 0:00.09 h4
5 -0,10 5701 0:00.05 h4
4 -0,10 2387 0:00.02 h4
3 -0,12 1090 0:00.02 h4
2 -0,31 276 0:00.00 h4
1 -0,44 40 0:00.00 h4
0 #
-
- Posts: 725
- Joined: Tue Dec 18, 2007 9:38 pm
- Location: Munich, Germany
- Full name: Dr. Oliver Brausch
Re: "It must be a clone of some sort..."
I saw that Sapeli beat ST12 92 times in 3000 games. OliThink is far away from this.
Windows support can be important. My tip is to use "_WIN32" for Windows and "ELSE" for Unix.On __unix__: MacOS is supposed to be real Unix and Linux just Unix like. I need to study these constants. Might remove support for Windows then I don't need that #if defined spaghetti.
Later, I analyzed this position with ST11 and Leela and was very surprised they didn't see the clear win for white after h4 either. Stockfish saw the fall of the pawn though.Here is Sapeli 1.91 analysis. It sees h4 is bad but not fast enough. After 17M nodes.