"It must be a clone of some sort..."

Discussion of chess software programming and technical issues.

Moderators: hgm, Rebel, chrisw

mar
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..."

Post by mar »

JohnWoe wrote: Tue Sep 29, 2020 8:56 pm You produce text like GPT-3. Where is your engine? Have you written your engine from scratch? Move generator and everything?
you seem to enjoy being rude. help yourself then. as for my engine - google Cheng 4, that would be mine.
Martin Sedlak
mar
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..."

Post by mar »

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!
Martin Sedlak
OliverBr
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..."

Post by OliverBr »

JohnWoe wrote: Tue Sep 29, 2020 3:49 pm When you look at these fresh 3000 Elo engines. They all have similar 1500 lines super complex search function as SF.
Null move, LMR, IID etc all in the same steps as i in SF. All are the same old AB stuff.
An effective search is probably the most difficult part of an engine.
Chess Engine OliThink: http://brausch.org/home/chess
OliThink GitHub:https://github.com/olithink
User avatar
mvanthoor
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..."

Post by mvanthoor »

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.
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.
Author of Rustic, an engine written in Rust.
Releases | Code | Docs | Progress | CCRL
Joost Buijs
Posts: 1563
Joined: Thu Jul 16, 2009 10:47 am
Location: Almere, The Netherlands

Re: "It must be a clone of some sort..."

Post by Joost Buijs »

mvanthoor wrote: Tue Sep 29, 2020 11:10 pm
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.
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.
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.
JohnWoe
Posts: 491
Joined: Sat Mar 02, 2013 11:31 pm

Re: "It must be a clone of some sort..."

Post by JohnWoe »

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!
Ok, thanks for the feedback.

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.
OliverBr
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..."

Post by OliverBr »

JohnWoe wrote: Tue Sep 29, 2020 8:56 pm Stockfish isn't my engine. It's totally irrelevant.
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?
Now the black pawn can be eaten which happens eventually in move 77 with
[d]2k5/5b2/2p1p1p1/2NpP1P1/1P1P3n/2P4p/7K/2B5 w - - 4 77

Code: Select all

77. Kxh3 
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.

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!
[pgn]
[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]
Chess Engine OliThink: http://brausch.org/home/chess
OliThink GitHub:https://github.com/olithink
OliverBr
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..."

Post by OliverBr »

JohnWoe wrote: Wed Sep 30, 2020 12:37 pm My check function is branchless. It can't be that slow.
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.
Yes I have black/white that's because its branchless(branch prediction).
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").
Chess Engine OliThink: http://brausch.org/home/chess
OliThink GitHub:https://github.com/olithink
JohnWoe
Posts: 491
Joined: Sat Mar 02, 2013 11:31 pm

Re: "It must be a clone of some sort..."

Post by JohnWoe »

OliverBr wrote: Wed Sep 30, 2020 3:49 pm
JohnWoe wrote: Tue Sep 29, 2020 8:56 pm Stockfish isn't my engine. It's totally irrelevant.
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?
Now the black pawn can be eaten which happens eventually in move 77 with
[d]2k5/5b2/2p1p1p1/2NpP1P1/1P1P3n/2P4p/7K/2B5 w - - 4 77

Code: Select all

77. Kxh3 
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.

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!
[pgn]
[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]
Nice!
Thanks for testing Sapeli!
Surprised Sapeli was able to hang on with your engine. :D

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	# 
OliverBr
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..."

Post by OliverBr »

JohnWoe wrote: Thu Oct 01, 2020 1:22 am Nice!
Thanks for testing Sapeli!
Surprised Sapeli was able to hang on with your engine. :D
I saw that Sapeli beat ST12 92 times in 3000 games. OliThink is far away from this.
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.
Windows support can be important. My tip is to use "_WIN32" for Windows and "ELSE" for Unix.
Here is Sapeli 1.91 analysis. It sees h4 is bad but not fast enough. After 17M nodes.
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.
Chess Engine OliThink: http://brausch.org/home/chess
OliThink GitHub:https://github.com/olithink