Introducing Gyatso – My Open-Source Chess Engine

Discussion of chess software programming and technical issues.

Moderator: Ras

User avatar
Steve Maughan
Posts: 1308
Joined: Wed Mar 08, 2006 8:28 pm
Location: Florida, USA

Re: Introducing Gyatso – My Open-Source Chess Engine

Post by Steve Maughan »

I tested perft 7 from the initial position:

Gyatso: 9.5 mnps
Juggernaut: 125 mnps

After searching 20 ply from the initial starting position:

Gyatso: 1.1 mnps
Juggernaut: 6.2 mnps

Note, Juggernaut is doing bulk counting when calculating perft i.e. only generating legal moves. This is faster than pseudo move generation. Does Gyatso do legal or pseudo-legal move generation?

How sophisticated is Gyatso's evaluation?

— Steve
http://www.chessprogramming.net - Juggernaut & Maverick Chess Engine
jorose
Posts: 376
Joined: Thu Jan 22, 2015 3:21 pm
Location: Zurich, Switzerland
Full name: Jonathan Rosenthal

Re: Introducing Gyatso – My Open-Source Chess Engine

Post by jorose »

I was in the mood to try out your engine so I cloned the repo and installed a nim compiler. Unfortunately I had a compilation issue and have never touched nim, so I am not sure what the issue is. This is on an Ubuntu system.

Code: Select all

(base) jonathan@JRFW13:~/git/GyatsoChess$ ./compile.sh 
Compiling Gyatso...
Hint: used config file '/etc/nim/nim.cfg' [Conf]
Hint: used config file '/etc/nim/config.nims' [Conf]
................................................................................................
/usr/lib/nim/lib/pure/bitops.nim(63, 37) Error: 'sizeof' requires '.importc' types to be '.completeStruct'
Compilation finished.
-Jonathan
GyatsoYT
Posts: 37
Joined: Fri May 09, 2025 12:27 pm
Full name: Gyatso Neesham

Re: Introducing Gyatso – My Open-Source Chess Engine

Post by GyatsoYT »

Steve Maughan wrote: Thu Dec 18, 2025 1:20 pm I can do that. I assume I'll use the "Gyatso-v1-avx2.exe" file. How do I run a perft?
GyatsoYT wrote: Thu Dec 18, 2025 12:07 pm<snip>If you could test gyatso's speed on your cpu then I can get a relative idea of how it performs relative to juggernaut's speed.<snip>
If your cpu supports avx 512 then try that though avx2 works well
Anyways the command for perft is
perft <depth>
And command for searching x depth is
go depth x

Try searching both threaded vs multithreaded
GyatsoYT
Posts: 37
Joined: Fri May 09, 2025 12:27 pm
Full name: Gyatso Neesham

Re: Introducing Gyatso – My Open-Source Chess Engine

Post by GyatsoYT »

jorose wrote: Thu Dec 18, 2025 4:16 pm I was in the mood to try out your engine so I cloned the repo and installed a nim compiler. Unfortunately I had a compilation issue and have never touched nim, so I am not sure what the issue is. This is on an Ubuntu system.

Code: Select all

(base) jonathan@JRFW13:~/git/GyatsoChess$ ./compile.sh 
Compiling Gyatso...
Hint: used config file '/etc/nim/nim.cfg' [Conf]
Hint: used config file '/etc/nim/config.nims' [Conf]
................................................................................................
/usr/lib/nim/lib/pure/bitops.nim(63, 37) Error: 'sizeof' requires '.importc' types to be '.completeStruct'
Compilation finished.
Thanks for trying to build Gyatso and for reporting this — I appreciate you taking the time to test it.

This looks like a Nim toolchain / version issue rather than a platform-specific problem. Gyatso currently requires a fairly recent Nim compiler, as older versions can trigger errors like the bitops.nim / sizeof issue you’re seeing.

Could you please check your Nim version? Gyatso is known to compile with Nim ≥ 2.0. If you’re on an older version (some Ubuntu repos still ship older Nim releases), upgrading should resolve this.

If possible, installing Nim via choosenim instead of the system package manager is recommended:
https://github.com/dom96/choosenim

I’ll also add a note to the repository about the required Nim version to avoid this confusion in the future. Thanks again for the report.

I have already tried compiling in linux and it works without any errors on my side so I guess it's the issue of versions.
GyatsoYT
Posts: 37
Joined: Fri May 09, 2025 12:27 pm
Full name: Gyatso Neesham

Re: Introducing Gyatso – My Open-Source Chess Engine

Post by GyatsoYT »

Steve Maughan wrote: Thu Dec 18, 2025 1:38 pm I tested perft 7 from the initial position:

Gyatso: 9.5 mnps
Juggernaut: 125 mnps

After searching 20 ply from the initial starting position:

Gyatso: 1.1 mnps
Juggernaut: 6.2 mnps

Note, Juggernaut is doing bulk counting when calculating perft i.e. only generating legal moves. This is faster than pseudo move generation. Does Gyatso do legal or pseudo-legal move generation?

How sophisticated is Gyatso's evaluation?

— Steve
It does pseudo-legal move gen
And it doesn't do bulk counting.

I would say that the evaluation is moderate nothing too fancy and nothing too bad it's not tuned yet bcz I have no idea on how to do that.
But anyways you can see the evaluation file to see how good/bad the evaluation is the code is pretty readable.
jorose
Posts: 376
Joined: Thu Jan 22, 2015 3:21 pm
Location: Zurich, Switzerland
Full name: Jonathan Rosenthal

Re: Introducing Gyatso – My Open-Source Chess Engine

Post by jorose »

Thank you for the response, updating Nim versions fixed the issue!

Regarding the speeds, I got the following on my core i7 1360P laptop for Gyatso and Winter:

Code: Select all

id name Gyatso 1.0.0
id author Gyatso Neesham
option name Hash type spin default 64 min 1 max 1024
option name Threads type spin default 1 min 1 max 128
option name Ponder type check default false
uciok
perft 6
Performance test to depth 6
Nodes: 119060324
Time: 4785.4457059999995 ms
NPS: 24879672

Code: Select all

id name Winter 4.09 BMI2
id author Jonathan Rosenthal
option name Hash type spin default 32 min 1 max 104576
option name Threads type spin default 1 min 1 max 256
option name Contempt type spin default 0 min -100 max 100
option name Armageddon type check default false
option name UCI_ShowWDL type check default true
option name UCI_Chess960 type check default false
uciok
perft 6
b1a3 depth: 5 perft: 4856835
b1c3 depth: 5 perft: 5708064
g1f3 depth: 5 perft: 5723523
g1h3 depth: 5 perft: 4877234
a2a3 depth: 5 perft: 4463267
b2b3 depth: 5 perft: 5310358
c2c3 depth: 5 perft: 5417640
d2d3 depth: 5 perft: 8073082
e2e3 depth: 5 perft: 9726018
f2f3 depth: 5 perft: 4404141
g2g3 depth: 5 perft: 5346260
h2h3 depth: 5 perft: 4463070
a2a4 depth: 5 perft: 5363555
b2b4 depth: 5 perft: 5293555
c2c4 depth: 5 perft: 5866666
d2d4 depth: 5 perft: 8879566
e2e4 depth: 5 perft: 9771632
f2f4 depth: 5 perft: 4890429
g2g4 depth: 5 perft: 5239875
h2h4 depth: 5 perft: 5385554
Ended perft
depth: 6 perft: 119060324 time: 593 nps: 200438255
Winter does bulk counting, so I think these results are in the same ballpark as other engines mentioned earlier in the thread, with Juggernaut clearly being faster (~13x faster than Gyatso vs ~8x faster, with both doing bulk counting compared to Gyatso not doing so).

As for start position search outputs:

Code: Select all

go movetime 10000
info depth 1 score cp 49 nodes 52 nps 0 time 0 pv b1c3 
info depth 2 score cp 15 nodes 240 nps 0 time 0 pv b1c3 b8c6 
info depth 3 score cp 49 nodes 1250 nps 1250000 time 1 pv b1c3 b8c6 g1f3 
info depth 4 score cp 15 nodes 1664 nps 832000 time 2 pv b1c3 b8c6 g1f3 g8f6 
info depth 5 score cp -6 nodes 5297 nps 1059400 time 5 pv b1c3 b8c6 g1h3 g8f6 h3f4 
info depth 6 score cp 15 nodes 7261 nps 1037285 time 7 pv b1c3 b8c6 g1f3 g8f6 a1b1 a8b8 
info depth 7 score cp 11 nodes 16491 nps 1099400 time 15 pv b1c3 g8f6 g1f3 b8c6 d2d3 f6g4 c1f4 
info depth 8 score cp 17 nodes 24408 nps 1284631 time 19 pv b1c3 g8f6 g1f3 b8c6 d2d3 e7e6 c1e3 f8d6 
info depth 9 score cp 0 nodes 50311 nps 1796821 time 28 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1d3 f8d6 e1g1 
info depth 10 score cp 15 nodes 80542 nps 2119526 time 38 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1d3 f8d6 e1g1 e8g8 
info depth 11 score cp 8 nodes 168557 nps 2407957 time 70 pv d2d3 b8c6 g1f3 g8f6 b1c3 e7e6 c1d2 f8d6 a1b1 
info depth 12 score cp 12 nodes 309237 nps 2555677 time 121 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1b5 f8d6 b5c6 d7c6 f3d4 e8g8 
info depth 13 score cp 9 nodes 491880 nps 2644516 time 186 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1d3 f8b4 e1g1 b4c3 d2c3 f6d5 f3d4 
info depth 14 score cp 9 nodes 793884 nps 2646280 time 300 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1b5 f8b4 e1g1 e8f8 b5c6 d7c6 f3e5 b4c3 
info depth 15 score cp 6 nodes 1572657 nps 2625470 time 599 pv b1c3 g8f6 g1f3 b8c6 d2d4 e7e6 d4d5 e6d5 c3d5 f6d5 d1d5 d8f6 d5e4 f8e7 c1e3 
info depth 16 score cp 8 nodes 2913017 nps 2553038 time 1141 pv b1c3 b8c6 g1f3 e7e6 e2e3 g8f6 f1b5 f8b4 e1g1 e8g8 b5c6 b7c6 d1e2 b4c3 d2c3 f6e4 
info depth 17 score cp 1 nodes 6872617 nps 2451879 time 2803 pv b1c3 e7e6 g1f3 b8c6 d2d4 f8b4 
info depth 18 score cp 11 nodes 12256376 nps 2404153 time 5098 pv b1c3 b8c6 
info depth 19 score cp 9 nodes 17490278 nps 2400532 time 7286 pv b1c3 
bestmove b1c3 ponder b8c6

Code: Select all

go movetime 10000
info depth 1 seldepth 1 time 0 nodes 23 nps 23000 score cp 37 wdl 332 479 188 pv d2d4
info depth 2 seldepth 2 time 0 nodes 63 nps 63000 score cp 18 wdl 287 496 216 pv d2d4 g8f6
info depth 3 seldepth 3 time 1 nodes 122 nps 61000 score cp 26 wdl 299 502 198 pv d2d4 g8f6 g1f3
info depth 4 seldepth 4 time 1 nodes 230 nps 115000 score cp 27 wdl 309 488 202 pv d2d4 b8c6 g1f3 g8f6
info depth 5 seldepth 8 time 3 nodes 619 nps 154750 score cp 25 wdl 308 483 208 pv e2e4 b8c6 b1c3 g8f6 g1f3
info depth 6 seldepth 9 time 5 nodes 1125 nps 187500 score cp 24 wdl 335 425 239 pv e2e4 e7e5 g1f3 g8f6 f3e5 f6e4
info depth 7 seldepth 11 time 9 nodes 2291 nps 229100 score cp 26 wdl 283 534 182 pv b1c3 g8f6 g1f3 b8c6 d2d4 d7d5 c1f4
info depth 8 seldepth 12 time 14 nodes 3753 nps 250200 score cp 16 wdl 266 532 201 pv b1c3 g8f6 e2e4 e7e5 d2d4 e5d4 d1d4 b8c6
info depth 9 seldepth 16 time 22 nodes 6679 nps 290391 score cp 23 wdl 288 514 197 pv g1f3 g8f6 b1c3 d7d5 d2d4 f6e4 d1d3 e4c3 d3c3 f7f6
info depth 10 seldepth 18 time 36 nodes 16653 nps 450081 score cp 6 wdl 251 523 225 pv g1f3 g8f6 b1c3 d7d5 d2d4 c8f5 c1f4 c7c6 d1d2 b8d7 e1c1 d8b6 f3g5 h7h6
info depth 11 seldepth 24 time 84 nodes 50289 nps 591635 score cp 18 wdl 253 564 181 pv g1f3 b8c6 d2d4 d7d5 e2e3 f7f6 b1c3 e7e6 f1e2 f8d6
info depth 12 seldepth 25 time 122 nodes 78661 nps 639520 score cp 17 wdl 275 517 207 pv g1f3 g8f6 c2c4 e7e6 d2d4 d7d5 e2e3 f8e7 f1d3 e8g8 e1g1 b8c6 c4c5 f6e4
info depth 13 seldepth 25 time 162 nodes 108329 nps 664595 score cp 11 wdl 238 568 192 pv g1f3 g8f6 c2c4 e7e6 d2d4 d7d5 e2e3 f8e7 f1d3 e8g8 e1g1 c7c5 b1c3 b8c6 a2a3 c5d4 e3d4 d5c4 d3c4
info depth 14 seldepth 29 time 265 nodes 188382 nps 708203 score cp 11 wdl 196 653 150 pv g1f3 g8f6 d2d4 d7d5 c1f4 c8f5 e2e3 e7e6 f1d3 f8d6 d3f5 e6f5 f4d6 d8d6 e1g1 e8g8
info depth 15 seldepth 31 time 476 nodes 355583 nps 745457 score cp 10 wdl 243 553 203 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c4d5 e6d5 c1f4 e8g8 e2e3 c7c5 f1d3 b8c6 a2a3 b4c3 b2c3
info depth 16 seldepth 32 time 677 nodes 512212 nps 755474 score cp 13 wdl 145 764 90 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c4d5 e6d5 c1f4 e8g8 e2e3 c8f5 a1c1 f8e8 f1e2 c7c6 e1g1 b8d7 d1b3
info depth 17 seldepth 35 time 782 nodes 594840 nps 759693 score cp 13 wdl 203 644 152 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c4d5 e6d5 c1f4 e8g8 e2e3 c8f5 a1c1 c7c6 f1e2 b8d7 e1g1 f8e8 f3h4 f5e6 e2d3 f6e4 h4f3 b4c3 b2c3
info depth 18 seldepth 38 time 919 nodes 708215 nps 769798 score cp 12 wdl 235 578 186 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c4d5 e6d5 c1f4 e8g8 e2e3 c8f5 a1c1 c7c6 f1e2 b8d7 a2a3 b4c3 c1c3 f6e4 c3c1 d8a5 f3d2 f8e8 f2f3 e4d2 d1d2
info depth 19 seldepth 38 time 1849 nodes 1471729 nps 795529 hashfull 429 score cp 23 wdl 245 601 153 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c1g5 e8g8 a1c1 b8d7 e2e3 h7h6 g5f4 f6h5 f4g3 h5g3 h2g3 d7f6 f1d3 c7c5 e1g1 c8d7 a2a3 b4c3 c1c3
info depth 20 seldepth 42 time 2503 nodes 2013095 nps 803951 hashfull 545 score cp 22 wdl 287 511 201 pv g1f3 g8f6 d2d4 d7d5 c2c4 c7c6 b1c3 d5c4 e2e4 b7b5 f1e2 e7e6 e1g1 f8e7 b2b3 e8g8 b3c4 b5b4 c3a4 f6e4 f1e1 e4f6 e2d3 b8d7
info depth 21 seldepth 42 time 3771 nodes 3018490 nps 800235 hashfull 710 score cp 13 wdl 238 575 186 pv g1f3 d7d5 d2d4 e7e6 c2c4 c7c5 c4d5 e6d5 b1c3 b8c6 c1f4 g8f6 e2e3 c5c4 f1e2 f8e7 e1g1 e8g8 f3e5 c8e6 e2f3 c6e5 d4e5
info depth 22 seldepth 45 time 9635 nodes 7836676 nps 813270 hashfull 962 score cp 18 wdl 240 591 168 pv d2d4 g8f6 c2c4 e7e6 b1c3 f8b4 g1f3 e8g8 c1g5 h7h6 g5h4 d7d5 e2e3 c7c5 d4c5 b8d7 c4d5 e6d5 a1c1 d7c5 f1e2 c5e4 e1g1 b4c3 b2c3
info depth 22 seldepth 45 time 9900 nodes 8053112 nps 813363 hashfull 967 score cp 18 wdl 240 591 168 pv d2d4 g8f6 c2c4 e7e6 b1c3 f8b4 g1f3 e8g8 c1g5 h7h6 g5h4 c7c5 e2e3 d7d6 f1d3 c5d4 e3d4 b8c6 a1c1 e6e5 e1g1 b4c3 b2c3 c8g4 h2h3 e5e4 h3g4
bestmove d2d4
In terms of speed:

Gyatso: 2.4 MN/s
Winter: 0.8 MN/s

The bottleneck for Winter is not the move generation. It is an entry level TCEC engine and the bottleneck will primarily be the neural network based evaluation function, which in Winter's case has a linear slowdown in the number of pieces, so endgame speeds will be noticeably faster. You can compare speeds of other TCEC engines by clicking through games from the current Swiss event. Note that most other engines there are running on 512 threads (there are 2 processors with 128 physical cores / 256 logical cores) while Winter runs on 256 threads, this means direct comparison is not possible, but it should give you an understanding of the rough speed ballpark that your engine is compared to top tier engines playing those events. Also double check how engines define how to count nodes. This is not well defined and varies between engines.

Based on the strength level that was being mentioned, the first thing I notice is that Gyatso is very selective and reaches a high depth relative to what I expect of engines in that strength range. You might want to add support for hash-full outputs (estimate how full your hash table is by checking how many of the first X entries contain new values). It is not easy to say much more based on just a simple start position go command.
-Jonathan
GyatsoYT
Posts: 37
Joined: Fri May 09, 2025 12:27 pm
Full name: Gyatso Neesham

Re: Introducing Gyatso – My Open-Source Chess Engine

Post by GyatsoYT »

jorose wrote: Sun Dec 21, 2025 11:08 am Thank you for the response, updating Nim versions fixed the issue!

Regarding the speeds, I got the following on my core i7 1360P laptop for Gyatso and Winter:

Code: Select all

id name Gyatso 1.0.0
id author Gyatso Neesham
option name Hash type spin default 64 min 1 max 1024
option name Threads type spin default 1 min 1 max 128
option name Ponder type check default false
uciok
perft 6
Performance test to depth 6
Nodes: 119060324
Time: 4785.4457059999995 ms
NPS: 24879672

Code: Select all

id name Winter 4.09 BMI2
id author Jonathan Rosenthal
option name Hash type spin default 32 min 1 max 104576
option name Threads type spin default 1 min 1 max 256
option name Contempt type spin default 0 min -100 max 100
option name Armageddon type check default false
option name UCI_ShowWDL type check default true
option name UCI_Chess960 type check default false
uciok
perft 6
b1a3 depth: 5 perft: 4856835
b1c3 depth: 5 perft: 5708064
g1f3 depth: 5 perft: 5723523
g1h3 depth: 5 perft: 4877234
a2a3 depth: 5 perft: 4463267
b2b3 depth: 5 perft: 5310358
c2c3 depth: 5 perft: 5417640
d2d3 depth: 5 perft: 8073082
e2e3 depth: 5 perft: 9726018
f2f3 depth: 5 perft: 4404141
g2g3 depth: 5 perft: 5346260
h2h3 depth: 5 perft: 4463070
a2a4 depth: 5 perft: 5363555
b2b4 depth: 5 perft: 5293555
c2c4 depth: 5 perft: 5866666
d2d4 depth: 5 perft: 8879566
e2e4 depth: 5 perft: 9771632
f2f4 depth: 5 perft: 4890429
g2g4 depth: 5 perft: 5239875
h2h4 depth: 5 perft: 5385554
Ended perft
depth: 6 perft: 119060324 time: 593 nps: 200438255
Winter does bulk counting, so I think these results are in the same ballpark as other engines mentioned earlier in the thread, with Juggernaut clearly being faster (~13x faster than Gyatso vs ~8x faster, with both doing bulk counting compared to Gyatso not doing so).

As for start position search outputs:

Code: Select all

go movetime 10000
info depth 1 score cp 49 nodes 52 nps 0 time 0 pv b1c3 
info depth 2 score cp 15 nodes 240 nps 0 time 0 pv b1c3 b8c6 
info depth 3 score cp 49 nodes 1250 nps 1250000 time 1 pv b1c3 b8c6 g1f3 
info depth 4 score cp 15 nodes 1664 nps 832000 time 2 pv b1c3 b8c6 g1f3 g8f6 
info depth 5 score cp -6 nodes 5297 nps 1059400 time 5 pv b1c3 b8c6 g1h3 g8f6 h3f4 
info depth 6 score cp 15 nodes 7261 nps 1037285 time 7 pv b1c3 b8c6 g1f3 g8f6 a1b1 a8b8 
info depth 7 score cp 11 nodes 16491 nps 1099400 time 15 pv b1c3 g8f6 g1f3 b8c6 d2d3 f6g4 c1f4 
info depth 8 score cp 17 nodes 24408 nps 1284631 time 19 pv b1c3 g8f6 g1f3 b8c6 d2d3 e7e6 c1e3 f8d6 
info depth 9 score cp 0 nodes 50311 nps 1796821 time 28 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1d3 f8d6 e1g1 
info depth 10 score cp 15 nodes 80542 nps 2119526 time 38 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1d3 f8d6 e1g1 e8g8 
info depth 11 score cp 8 nodes 168557 nps 2407957 time 70 pv d2d3 b8c6 g1f3 g8f6 b1c3 e7e6 c1d2 f8d6 a1b1 
info depth 12 score cp 12 nodes 309237 nps 2555677 time 121 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1b5 f8d6 b5c6 d7c6 f3d4 e8g8 
info depth 13 score cp 9 nodes 491880 nps 2644516 time 186 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1d3 f8b4 e1g1 b4c3 d2c3 f6d5 f3d4 
info depth 14 score cp 9 nodes 793884 nps 2646280 time 300 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1b5 f8b4 e1g1 e8f8 b5c6 d7c6 f3e5 b4c3 
info depth 15 score cp 6 nodes 1572657 nps 2625470 time 599 pv b1c3 g8f6 g1f3 b8c6 d2d4 e7e6 d4d5 e6d5 c3d5 f6d5 d1d5 d8f6 d5e4 f8e7 c1e3 
info depth 16 score cp 8 nodes 2913017 nps 2553038 time 1141 pv b1c3 b8c6 g1f3 e7e6 e2e3 g8f6 f1b5 f8b4 e1g1 e8g8 b5c6 b7c6 d1e2 b4c3 d2c3 f6e4 
info depth 17 score cp 1 nodes 6872617 nps 2451879 time 2803 pv b1c3 e7e6 g1f3 b8c6 d2d4 f8b4 
info depth 18 score cp 11 nodes 12256376 nps 2404153 time 5098 pv b1c3 b8c6 
info depth 19 score cp 9 nodes 17490278 nps 2400532 time 7286 pv b1c3 
bestmove b1c3 ponder b8c6

Code: Select all

go movetime 10000
info depth 1 seldepth 1 time 0 nodes 23 nps 23000 score cp 37 wdl 332 479 188 pv d2d4
info depth 2 seldepth 2 time 0 nodes 63 nps 63000 score cp 18 wdl 287 496 216 pv d2d4 g8f6
info depth 3 seldepth 3 time 1 nodes 122 nps 61000 score cp 26 wdl 299 502 198 pv d2d4 g8f6 g1f3
info depth 4 seldepth 4 time 1 nodes 230 nps 115000 score cp 27 wdl 309 488 202 pv d2d4 b8c6 g1f3 g8f6
info depth 5 seldepth 8 time 3 nodes 619 nps 154750 score cp 25 wdl 308 483 208 pv e2e4 b8c6 b1c3 g8f6 g1f3
info depth 6 seldepth 9 time 5 nodes 1125 nps 187500 score cp 24 wdl 335 425 239 pv e2e4 e7e5 g1f3 g8f6 f3e5 f6e4
info depth 7 seldepth 11 time 9 nodes 2291 nps 229100 score cp 26 wdl 283 534 182 pv b1c3 g8f6 g1f3 b8c6 d2d4 d7d5 c1f4
info depth 8 seldepth 12 time 14 nodes 3753 nps 250200 score cp 16 wdl 266 532 201 pv b1c3 g8f6 e2e4 e7e5 d2d4 e5d4 d1d4 b8c6
info depth 9 seldepth 16 time 22 nodes 6679 nps 290391 score cp 23 wdl 288 514 197 pv g1f3 g8f6 b1c3 d7d5 d2d4 f6e4 d1d3 e4c3 d3c3 f7f6
info depth 10 seldepth 18 time 36 nodes 16653 nps 450081 score cp 6 wdl 251 523 225 pv g1f3 g8f6 b1c3 d7d5 d2d4 c8f5 c1f4 c7c6 d1d2 b8d7 e1c1 d8b6 f3g5 h7h6
info depth 11 seldepth 24 time 84 nodes 50289 nps 591635 score cp 18 wdl 253 564 181 pv g1f3 b8c6 d2d4 d7d5 e2e3 f7f6 b1c3 e7e6 f1e2 f8d6
info depth 12 seldepth 25 time 122 nodes 78661 nps 639520 score cp 17 wdl 275 517 207 pv g1f3 g8f6 c2c4 e7e6 d2d4 d7d5 e2e3 f8e7 f1d3 e8g8 e1g1 b8c6 c4c5 f6e4
info depth 13 seldepth 25 time 162 nodes 108329 nps 664595 score cp 11 wdl 238 568 192 pv g1f3 g8f6 c2c4 e7e6 d2d4 d7d5 e2e3 f8e7 f1d3 e8g8 e1g1 c7c5 b1c3 b8c6 a2a3 c5d4 e3d4 d5c4 d3c4
info depth 14 seldepth 29 time 265 nodes 188382 nps 708203 score cp 11 wdl 196 653 150 pv g1f3 g8f6 d2d4 d7d5 c1f4 c8f5 e2e3 e7e6 f1d3 f8d6 d3f5 e6f5 f4d6 d8d6 e1g1 e8g8
info depth 15 seldepth 31 time 476 nodes 355583 nps 745457 score cp 10 wdl 243 553 203 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c4d5 e6d5 c1f4 e8g8 e2e3 c7c5 f1d3 b8c6 a2a3 b4c3 b2c3
info depth 16 seldepth 32 time 677 nodes 512212 nps 755474 score cp 13 wdl 145 764 90 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c4d5 e6d5 c1f4 e8g8 e2e3 c8f5 a1c1 f8e8 f1e2 c7c6 e1g1 b8d7 d1b3
info depth 17 seldepth 35 time 782 nodes 594840 nps 759693 score cp 13 wdl 203 644 152 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c4d5 e6d5 c1f4 e8g8 e2e3 c8f5 a1c1 c7c6 f1e2 b8d7 e1g1 f8e8 f3h4 f5e6 e2d3 f6e4 h4f3 b4c3 b2c3
info depth 18 seldepth 38 time 919 nodes 708215 nps 769798 score cp 12 wdl 235 578 186 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c4d5 e6d5 c1f4 e8g8 e2e3 c8f5 a1c1 c7c6 f1e2 b8d7 a2a3 b4c3 c1c3 f6e4 c3c1 d8a5 f3d2 f8e8 f2f3 e4d2 d1d2
info depth 19 seldepth 38 time 1849 nodes 1471729 nps 795529 hashfull 429 score cp 23 wdl 245 601 153 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c1g5 e8g8 a1c1 b8d7 e2e3 h7h6 g5f4 f6h5 f4g3 h5g3 h2g3 d7f6 f1d3 c7c5 e1g1 c8d7 a2a3 b4c3 c1c3
info depth 20 seldepth 42 time 2503 nodes 2013095 nps 803951 hashfull 545 score cp 22 wdl 287 511 201 pv g1f3 g8f6 d2d4 d7d5 c2c4 c7c6 b1c3 d5c4 e2e4 b7b5 f1e2 e7e6 e1g1 f8e7 b2b3 e8g8 b3c4 b5b4 c3a4 f6e4 f1e1 e4f6 e2d3 b8d7
info depth 21 seldepth 42 time 3771 nodes 3018490 nps 800235 hashfull 710 score cp 13 wdl 238 575 186 pv g1f3 d7d5 d2d4 e7e6 c2c4 c7c5 c4d5 e6d5 b1c3 b8c6 c1f4 g8f6 e2e3 c5c4 f1e2 f8e7 e1g1 e8g8 f3e5 c8e6 e2f3 c6e5 d4e5
info depth 22 seldepth 45 time 9635 nodes 7836676 nps 813270 hashfull 962 score cp 18 wdl 240 591 168 pv d2d4 g8f6 c2c4 e7e6 b1c3 f8b4 g1f3 e8g8 c1g5 h7h6 g5h4 d7d5 e2e3 c7c5 d4c5 b8d7 c4d5 e6d5 a1c1 d7c5 f1e2 c5e4 e1g1 b4c3 b2c3
info depth 22 seldepth 45 time 9900 nodes 8053112 nps 813363 hashfull 967 score cp 18 wdl 240 591 168 pv d2d4 g8f6 c2c4 e7e6 b1c3 f8b4 g1f3 e8g8 c1g5 h7h6 g5h4 c7c5 e2e3 d7d6 f1d3 c5d4 e3d4 b8c6 a1c1 e6e5 e1g1 b4c3 b2c3 c8g4 h2h3 e5e4 h3g4
bestmove d2d4
In terms of speed:

Gyatso: 2.4 MN/s
Winter: 0.8 MN/s

The bottleneck for Winter is not the move generation. It is an entry level TCEC engine and the bottleneck will primarily be the neural network based evaluation function, which in Winter's case has a linear slowdown in the number of pieces, so endgame speeds will be noticeably faster. You can compare speeds of other TCEC engines by clicking through games from the current Swiss event. Note that most other engines there are running on 512 threads (there are 2 processors with 128 physical cores / 256 logical cores) while Winter runs on 256 threads, this means direct comparison is not possible, but it should give you an understanding of the rough speed ballpark that your engine is compared to top tier engines playing those events. Also double check how engines define how to count nodes. This is not well defined and varies between engines.

Based on the strength level that was being mentioned, the first thing I notice is that Gyatso is very selective and reaches a high depth relative to what I expect of engines in that strength range. You might want to add support for hash-full outputs (estimate how full your hash table is by checking how many of the first X entries contain new values). It is not easy to say much more based on just a simple start position go command.

Thank you for the response, updating Nim versions fixed the issue!

Regarding the speeds, I got the following on my core i7 1360P laptop for Gyatso and Winter:
Code: Select all

id name Gyatso 1.0.0
id author Gyatso Neesham
option name Hash type spin default 64 min 1 max 1024
option name Threads type spin default 1 min 1 max 128
option name Ponder type check default false
uciok
perft 6
Performance test to depth 6
Nodes: 119060324
Time: 4785.4457059999995 ms
NPS: 24879672
Code: Select all

id name Winter 4.09 BMI2
id author Jonathan Rosenthal
option name Hash type spin default 32 min 1 max 104576
option name Threads type spin default 1 min 1 max 256
option name Contempt type spin default 0 min -100 max 100
option name Armageddon type check default false
option name UCI_ShowWDL type check default true
option name UCI_Chess960 type check default false
uciok
perft 6
b1a3 depth: 5 perft: 4856835
b1c3 depth: 5 perft: 5708064
g1f3 depth: 5 perft: 5723523
g1h3 depth: 5 perft: 4877234
a2a3 depth: 5 perft: 4463267
b2b3 depth: 5 perft: 5310358
c2c3 depth: 5 perft: 5417640
d2d3 depth: 5 perft: 8073082
e2e3 depth: 5 perft: 9726018
f2f3 depth: 5 perft: 4404141
g2g3 depth: 5 perft: 5346260
h2h3 depth: 5 perft: 4463070
a2a4 depth: 5 perft: 5363555
b2b4 depth: 5 perft: 5293555
c2c4 depth: 5 perft: 5866666
d2d4 depth: 5 perft: 8879566
e2e4 depth: 5 perft: 9771632
f2f4 depth: 5 perft: 4890429
g2g4 depth: 5 perft: 5239875
h2h4 depth: 5 perft: 5385554
Ended perft
depth: 6 perft: 119060324 time: 593 nps: 200438255
Winter does bulk counting, so I think these results are in the same ballpark as other engines mentioned earlier in the thread, with Juggernaut clearly being faster (~13x faster than Gyatso vs ~8x faster, with both doing bulk counting compared to Gyatso not doing so).

As for start position search outputs:
Code: Select all

go movetime 10000
info depth 1 score cp 49 nodes 52 nps 0 time 0 pv b1c3
info depth 2 score cp 15 nodes 240 nps 0 time 0 pv b1c3 b8c6
info depth 3 score cp 49 nodes 1250 nps 1250000 time 1 pv b1c3 b8c6 g1f3
info depth 4 score cp 15 nodes 1664 nps 832000 time 2 pv b1c3 b8c6 g1f3 g8f6
info depth 5 score cp -6 nodes 5297 nps 1059400 time 5 pv b1c3 b8c6 g1h3 g8f6 h3f4
info depth 6 score cp 15 nodes 7261 nps 1037285 time 7 pv b1c3 b8c6 g1f3 g8f6 a1b1 a8b8
info depth 7 score cp 11 nodes 16491 nps 1099400 time 15 pv b1c3 g8f6 g1f3 b8c6 d2d3 f6g4 c1f4
info depth 8 score cp 17 nodes 24408 nps 1284631 time 19 pv b1c3 g8f6 g1f3 b8c6 d2d3 e7e6 c1e3 f8d6
info depth 9 score cp 0 nodes 50311 nps 1796821 time 28 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1d3 f8d6 e1g1
info depth 10 score cp 15 nodes 80542 nps 2119526 time 38 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1d3 f8d6 e1g1 e8g8
info depth 11 score cp 8 nodes 168557 nps 2407957 time 70 pv d2d3 b8c6 g1f3 g8f6 b1c3 e7e6 c1d2 f8d6 a1b1
info depth 12 score cp 12 nodes 309237 nps 2555677 time 121 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1b5 f8d6 b5c6 d7c6 f3d4 e8g8
info depth 13 score cp 9 nodes 491880 nps 2644516 time 186 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1d3 f8b4 e1g1 b4c3 d2c3 f6d5 f3d4
info depth 14 score cp 9 nodes 793884 nps 2646280 time 300 pv b1c3 g8f6 g1f3 b8c6 e2e3 e7e6 f1b5 f8b4 e1g1 e8f8 b5c6 d7c6 f3e5 b4c3
info depth 15 score cp 6 nodes 1572657 nps 2625470 time 599 pv b1c3 g8f6 g1f3 b8c6 d2d4 e7e6 d4d5 e6d5 c3d5 f6d5 d1d5 d8f6 d5e4 f8e7 c1e3
info depth 16 score cp 8 nodes 2913017 nps 2553038 time 1141 pv b1c3 b8c6 g1f3 e7e6 e2e3 g8f6 f1b5 f8b4 e1g1 e8g8 b5c6 b7c6 d1e2 b4c3 d2c3 f6e4
info depth 17 score cp 1 nodes 6872617 nps 2451879 time 2803 pv b1c3 e7e6 g1f3 b8c6 d2d4 f8b4
info depth 18 score cp 11 nodes 12256376 nps 2404153 time 5098 pv b1c3 b8c6
info depth 19 score cp 9 nodes 17490278 nps 2400532 time 7286 pv b1c3
bestmove b1c3 ponder b8c6
Code: Select all

go movetime 10000
info depth 1 seldepth 1 time 0 nodes 23 nps 23000 score cp 37 wdl 332 479 188 pv d2d4
info depth 2 seldepth 2 time 0 nodes 63 nps 63000 score cp 18 wdl 287 496 216 pv d2d4 g8f6
info depth 3 seldepth 3 time 1 nodes 122 nps 61000 score cp 26 wdl 299 502 198 pv d2d4 g8f6 g1f3
info depth 4 seldepth 4 time 1 nodes 230 nps 115000 score cp 27 wdl 309 488 202 pv d2d4 b8c6 g1f3 g8f6
info depth 5 seldepth 8 time 3 nodes 619 nps 154750 score cp 25 wdl 308 483 208 pv e2e4 b8c6 b1c3 g8f6 g1f3
info depth 6 seldepth 9 time 5 nodes 1125 nps 187500 score cp 24 wdl 335 425 239 pv e2e4 e7e5 g1f3 g8f6 f3e5 f6e4
info depth 7 seldepth 11 time 9 nodes 2291 nps 229100 score cp 26 wdl 283 534 182 pv b1c3 g8f6 g1f3 b8c6 d2d4 d7d5 c1f4
info depth 8 seldepth 12 time 14 nodes 3753 nps 250200 score cp 16 wdl 266 532 201 pv b1c3 g8f6 e2e4 e7e5 d2d4 e5d4 d1d4 b8c6
info depth 9 seldepth 16 time 22 nodes 6679 nps 290391 score cp 23 wdl 288 514 197 pv g1f3 g8f6 b1c3 d7d5 d2d4 f6e4 d1d3 e4c3 d3c3 f7f6
info depth 10 seldepth 18 time 36 nodes 16653 nps 450081 score cp 6 wdl 251 523 225 pv g1f3 g8f6 b1c3 d7d5 d2d4 c8f5 c1f4 c7c6 d1d2 b8d7 e1c1 d8b6 f3g5 h7h6
info depth 11 seldepth 24 time 84 nodes 50289 nps 591635 score cp 18 wdl 253 564 181 pv g1f3 b8c6 d2d4 d7d5 e2e3 f7f6 b1c3 e7e6 f1e2 f8d6
info depth 12 seldepth 25 time 122 nodes 78661 nps 639520 score cp 17 wdl 275 517 207 pv g1f3 g8f6 c2c4 e7e6 d2d4 d7d5 e2e3 f8e7 f1d3 e8g8 e1g1 b8c6 c4c5 f6e4
info depth 13 seldepth 25 time 162 nodes 108329 nps 664595 score cp 11 wdl 238 568 192 pv g1f3 g8f6 c2c4 e7e6 d2d4 d7d5 e2e3 f8e7 f1d3 e8g8 e1g1 c7c5 b1c3 b8c6 a2a3 c5d4 e3d4 d5c4 d3c4
info depth 14 seldepth 29 time 265 nodes 188382 nps 708203 score cp 11 wdl 196 653 150 pv g1f3 g8f6 d2d4 d7d5 c1f4 c8f5 e2e3 e7e6 f1d3 f8d6 d3f5 e6f5 f4d6 d8d6 e1g1 e8g8
info depth 15 seldepth 31 time 476 nodes 355583 nps 745457 score cp 10 wdl 243 553 203 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c4d5 e6d5 c1f4 e8g8 e2e3 c7c5 f1d3 b8c6 a2a3 b4c3 b2c3
info depth 16 seldepth 32 time 677 nodes 512212 nps 755474 score cp 13 wdl 145 764 90 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c4d5 e6d5 c1f4 e8g8 e2e3 c8f5 a1c1 f8e8 f1e2 c7c6 e1g1 b8d7 d1b3
info depth 17 seldepth 35 time 782 nodes 594840 nps 759693 score cp 13 wdl 203 644 152 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c4d5 e6d5 c1f4 e8g8 e2e3 c8f5 a1c1 c7c6 f1e2 b8d7 e1g1 f8e8 f3h4 f5e6 e2d3 f6e4 h4f3 b4c3 b2c3
info depth 18 seldepth 38 time 919 nodes 708215 nps 769798 score cp 12 wdl 235 578 186 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c4d5 e6d5 c1f4 e8g8 e2e3 c8f5 a1c1 c7c6 f1e2 b8d7 a2a3 b4c3 c1c3 f6e4 c3c1 d8a5 f3d2 f8e8 f2f3 e4d2 d1d2
info depth 19 seldepth 38 time 1849 nodes 1471729 nps 795529 hashfull 429 score cp 23 wdl 245 601 153 pv g1f3 g8f6 d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c1g5 e8g8 a1c1 b8d7 e2e3 h7h6 g5f4 f6h5 f4g3 h5g3 h2g3 d7f6 f1d3 c7c5 e1g1 c8d7 a2a3 b4c3 c1c3
info depth 20 seldepth 42 time 2503 nodes 2013095 nps 803951 hashfull 545 score cp 22 wdl 287 511 201 pv g1f3 g8f6 d2d4 d7d5 c2c4 c7c6 b1c3 d5c4 e2e4 b7b5 f1e2 e7e6 e1g1 f8e7 b2b3 e8g8 b3c4 b5b4 c3a4 f6e4 f1e1 e4f6 e2d3 b8d7
info depth 21 seldepth 42 time 3771 nodes 3018490 nps 800235 hashfull 710 score cp 13 wdl 238 575 186 pv g1f3 d7d5 d2d4 e7e6 c2c4 c7c5 c4d5 e6d5 b1c3 b8c6 c1f4 g8f6 e2e3 c5c4 f1e2 f8e7 e1g1 e8g8 f3e5 c8e6 e2f3 c6e5 d4e5
info depth 22 seldepth 45 time 9635 nodes 7836676 nps 813270 hashfull 962 score cp 18 wdl 240 591 168 pv d2d4 g8f6 c2c4 e7e6 b1c3 f8b4 g1f3 e8g8 c1g5 h7h6 g5h4 d7d5 e2e3 c7c5 d4c5 b8d7 c4d5 e6d5 a1c1 d7c5 f1e2 c5e4 e1g1 b4c3 b2c3
info depth 22 seldepth 45 time 9900 nodes 8053112 nps 813363 hashfull 967 score cp 18 wdl 240 591 168 pv d2d4 g8f6 c2c4 e7e6 b1c3 f8b4 g1f3 e8g8 c1g5 h7h6 g5h4 c7c5 e2e3 d7d6 f1d3 c5d4 e3d4 b8c6 a1c1 e6e5 e1g1 b4c3 b2c3 c8g4 h2h3 e5e4 h3g4
bestmove d2d4
In terms of speed:

Gyatso: 2.4 MN/s
Winter: 0.8 MN/s

The bottleneck for Winter is not the move generation. It is an entry level TCEC engine and the bottleneck will primarily be the neural network based evaluation function, which in Winter's case has a linear slowdown in the number of pieces, so endgame speeds will be noticeably faster. You can compare speeds of other TCEC engines by clicking through games from the current Swiss event. Note that most other engines there are running on 512 threads (there are 2 processors with 128 physical cores / 256 logical cores) while Winter runs on 256 threads, this means direct comparison is not possible, but it should give you an understanding of the rough speed ballpark that your engine is compared to top tier engines playing those events. Also double check how engines define how to count nodes. This is not well defined and varies between engines.

Based on the strength level that was being mentioned, the first thing I notice is that Gyatso is very selective and reaches a high depth relative to what I expect of engines in that strength range. You might want to add support for hash-full outputs (estimate how full your hash table is by checking how many of the first X entries contain new values). It is not easy to say much more based on just a simple start position go command.

This is what someone wrote in talkchess about my engine lmk all the insights I can take from here and what I should reply + what should I do

Show more
17:35
Great feedback from an experienced engine developer! Here are the key insights:

Main Takeaways
Performance Context:

Your perft speed (24.9 MN/s) is respectable but ~8x slower than Juggernaut due to lack of bulk counting
Winter's much slower search speed (0.8 MN/s vs your 2.4 MN/s) is expected - it uses neural network evaluation which is computationally expensive
Your move generation isn't the bottleneck; it's competitive
Search Characteristics:

Your engine is very selective - reaching depth 19 in 10 seconds at 2.4 MN/s suggests aggressive pruning
This high selectivity is unusual for your strength range and worth examining
Could indicate over-pruning or potential tactical blind spots
Action Items:

Implement hash-full reporting - Shows how efficiently you're using your transposition table
Verify node counting - Ensure you're counting consistently with other engines for fair comparisons
Review selectivity - Your depth-to-nodes ratio suggests you might be pruning too aggressively, which could miss tactics
Suggested Reply:

"Thanks for the detailed analysis! Really helpful context about Winter's NN evaluation bottleneck vs move generation speed.

The high selectivity is interesting - I am using [mention your pruning techniques]. I'll add hash-full reporting and double-check my node counting methodology for consistency. Would you recommend any specific tests to validate whether my selectivity is appropriate for this strength level?"

What aspects would you like to explore further - the selectivity analysis, bulk counting implementation, or hash-full reporting?

GyatsoYT/GyatsoChesss
main

GITHUB

GyatsoYT/GyatsoChesss
main

GITHUB

These are the pruning techniques I use in those files read it and then make a reply

17:39
Based on your code, here's what I can see about your search characteristics and a suggested reply:

Your Pruning/Reduction Techniques
Aggressive Pruning:

Reverse Futility Pruning (RFP): depth < 7, margin = 100 * depth
Null Move Pruning: depth >= 3, R=2
Futility Pruning: depth < 7, margin = 100 * depth for quiets
SEE Pruning: Using StaticPruning tables for both quiets and captures
Delta Pruning in QSearch: 975 centipawn margin
ProbCut: depth >= 5 with 110cp margin
Reductions:

LMR: Starting at depth 3, movesSearched >= 1, using pre-computed table
Check Extensions: Limited to 16 total extensions
Move Ordering:

TT move
Killer moves (2 per ply)
History heuristics (Main, Counter, Follow-up, Tactical)
Counter moves table
SEE scores
Aspiration Windows: Starting at depth 3 with ±50 window

Suggested Reply
"Thanks for the detailed analysis! Really helpful context about Winter's NN evaluation bottleneck.

Regarding the high selectivity - I'm using fairly aggressive pruning at the moment:

Reverse Futility Pruning and standard Futility Pruning (depth < 7, 100cp/depth margin)
Null Move Pruning (R=2 at depth >= 3)
ProbCut (depth >= 5, 110cp margin)
SEE pruning for both quiets and bad captures using depth-based tables
Delta pruning in QSearch (975cp)
LMR starting at depth 3 with a pre-computed reduction table
The depth-to-nodes ratio does seem high now that you mention it. A few questions:

Would you recommend any specific test suites to validate whether I'm missing tactics due to over-pruning?
For node counting - I'm incrementing at the start of negamax() and qSearch(). Should I also count TT cutoffs, or is the current approach standard?
I'll definitely add hash-full reporting. For implementation, would sampling the first 1000 entries be sufficient, or should I use a different approach?"
GyatsoYT
Posts: 37
Joined: Fri May 09, 2025 12:27 pm
Full name: Gyatso Neesham

Re: Introducing Gyatso – My Open-Source Chess Engine

Post by GyatsoYT »

Wow I wanted to make the wording better and not write big things looks like I copied wrong stuff lmao
Anyways no worries tbh
Aleks Peshkov
Posts: 967
Joined: Sun Nov 19, 2006 9:16 pm
Location: Russia
Full name: Aleks Peshkov

Re: Introducing Gyatso – My Open-Source Chess Engine

Post by Aleks Peshkov »

IMO node counts and reported depth is not important. If you want to outplay the crowd you need to differ from crowd.

I am not sure if your engine has tactical weakness (of course comparing equal Elo opponents). IMO good metric of relative tactical vision is ratio of the most short games won and lost, whether your engine blunder first or penalise others blunders.

In general more aggressive NMP is more tactical for the cost of positional play. Eval-based prunings cost tactical sharpness. Tactics is about temporary sacrifices that futility and similar prunings prune.
gflohr
Posts: 72
Joined: Fri Jul 23, 2021 5:24 pm
Location: Elin Pelin
Full name: Guido Flohr

Re: Introducing Gyatso – My Open-Source Chess Engine

Post by gflohr »

Let’s keep our feet on the ground a bit. Before worrying too much about tuning philosophy, it might be worth first ensuring the engine reliably converts clearly won positions.

I noticed that Gyatso has a relatively high draw rate and — somewhat unusually for an engine — occasionally ends games in an undesired stalemate. Here is one concrete example:

[pgn]
[Event "Computer event"]
[Site "Petkovo"]
[Date "2025.12.20"]
[Round "1"]
[White "bce"]
[Black "Gyatso 1.0.0"]
[Result "1/2-1/2"]
[TimeControl "40/6.5:0.5"]
[Time "01:03:37"]
[Board "35"]
[Termination "stalemate"]
[ECO "B23"]
[Opening "Sicilian"]
[Variation "closed, 2...Nc6"]

1. e4 c5 2. Nc3 Nc6 3. Nf3 {B23: Sicilian, closed, 2...Nc6} e5 4. Bc4 Be7
5. d3 d6 {End of opening} 6. Nd5 Nf6 7. Nxe7 Kxe7 8. O-O Be6
9. Bxe6 Kxe6 10. Be3 Qb6 11. Rb1 Qa5 12. a3 Qa4
13. Ng5+ Ke7 14. f4 Kf8 15. fxe5 Nxe5 16. c3 Qa6
17. d4 Nc4 18. Qd3 Nxe3 19. Qxe3 h6 20. Nf3 Qb6
21. dxc5 Qxc5 22. Qxc5 dxc5 23. e5 Nd5 24. Rfd1 Nb6
25. b3 Ke7 26. c4 Rad8 27. Kh1 Ke6 28. g4 Nc8
29. g5 Ne7 30. gxh6 gxh6 31. b4 cxb4 32. Rxd8 Rxd8
33. Rxb4 b6 34. Rb3 Rd1+ 35. Kg2 Rc1 36. Rd3 Rc2+
37. Kh3 Nf5 38. Rd4 Rc3 39. Rf4 h5 40. a4 Ra3
41. a5 Rxa5 42. Re4 Ra2 43. Ng5+ Ke7 44. Rf4 Ra3+
45. Nf3 Ke6 46. Kg2 Ra4 47. Kf2 b5 48. Re4 Rxc4
49. Ng5+ Kd5 50. Re2 Rf4+ 51. Ke1 Nd4 52. Rf2 Rxf2
53. Kxf2 b4 54. Nh3 b3 55. Nf4+ Kc4 56. Nxh5 b2
57. h3 b1=Q 58. Ng3 Qd3 59. Kg2 Qf3+ 60. Kg1 Qxg3+
61. Kf1 Kd3 62. e6 fxe6 63. h4 Nf5 64. h5 Kc4
65. Ke2 Qh2+ 66. Ke1 Qxh5 67. Kd2 Nd4 68. Ke3 Nf3
69. Ke2 Ne5+ 70. Ke3 Kd5 71. Kd2 Qf3 72. Ke1 Qe3+
73. Kf1 Kd4 74. Kg2 Ke4 75. Kf1 Qd2 76. Kg1 Qe2
77. Kh1 Kd5 78. Kg1 Qe4 79. Kf2 Qc2+ 80. Ke3 Nc4+
81. Kf3 Ne5+ 82. Ke3 Qc4 83. Kf2 Qd3 84. Ke1 Ng4
1/2-1/2
[/pgn]

In this game, the engine spends many moves in clearly winning positions, at times being only one move away from mate, but never manages to convert and eventually stalemates.

From my experience, issues like mate conversion, avoiding trivial draws (stalemate, threefold repetition, 50-move rule), and reliably finishing won games tend to have a much larger impact on playing strength than pruning or tuning choices.

It might be worthwhile to focus on those basics first — for example, by adding a few targeted unit tests for mate-in-1/2/3 and simple won endgames. It’s a bit of upfront work, but it usually pays for itself quickly by preventing regressions later on.
Last edited by gflohr on Sun Dec 21, 2025 7:50 pm, edited 1 time in total.