unserializable wrote: ↑Tue Feb 02, 2021 3:15 pm
In the samples indeed all that happens is
seldepth increasing monotonously, which seems logical from the way you described the change but kind of weird when it would be reset at iterations?
I wrote some debugging code, and my previous implementation was wrong. There, seldepth contained the last instance where seldepth was larger than the requested search depth, wherever in the tree that might have been.
I've written some debug code to see what maximum ply the engine actually reaches. I set up this position:
[d]4k3/2qp3P/2P2b2/4n3/8/8/1B2Q3/3K4 w - - 0 1
Then I ran a depth 1 search. (With print-statements to see what it does. Warning: long)
Code: Select all
go depth 1
A/B - depth: 1 ply: 1 move_nr: 1 move: Bb2e5
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 2
QS - depth: 1 ply: 2
A/B - depth: 1 ply: 1 move_nr: 2 move: Qe2e5
Check Extend: depth +1
A/B - depth: 1 ply: 2 move_nr: 1 move: Bf6e5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 3
A/B - depth: 1 ply: 1 move_nr: 3 move: c6d7
Check Extend: depth +1
A/B - depth: 1 ply: 2 move_nr: 2 move: Qc7d7
Check Extend: depth +1
A/B - depth: 1 ply: 3 move_nr: 3 move: Kd1c2
A/B - depth: 1 ply: 3 move_nr: 9 move: Bb2d4
A/B - depth: 1 ply: 3 move_nr: 10 move: Kd1c1
A/B - depth: 1 ply: 3 move_nr: 14 move: Qe2d2
A/B - depth: 1 ply: 3 move_nr: 18 move: Qe2d3
A/B - depth: 1 ply: 3 move_nr: 25 move: Kd1e1
A/B - depth: 1 ply: 1 move_nr: 4 move: Kd1d2
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
A/B - depth: 1 ply: 1 move_nr: 5 move: Bb2a1
A/B - depth: 1 ply: 1 move_nr: 6 move: Bb2c1
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
A/B - depth: 1 ply: 1 move_nr: 7 move: Bb2a3
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
A/B - depth: 1 ply: 1 move_nr: 8 move: Bb2c3
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
A/B - depth: 1 ply: 1 move_nr: 9 move: Bb2d4
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
A/B - depth: 1 ply: 1 move_nr: 10 move: Kd1c1
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
A/B - depth: 1 ply: 1 move_nr: 11 move: Qe2e1
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
A/B - depth: 1 ply: 1 move_nr: 12 move: Qe2f1
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
A/B - depth: 1 ply: 1 move_nr: 13 move: Qe2c2
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
A/B - depth: 1 ply: 1 move_nr: 14 move: Qe2d2
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
A/B - depth: 1 ply: 1 move_nr: 15 move: Qe2f2
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
A/B - depth: 1 ply: 1 move_nr: 16 move: Qe2g2
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
A/B - depth: 1 ply: 1 move_nr: 17 move: Qe2h2
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
A/B - depth: 1 ply: 1 move_nr: 18 move: Qe2d3
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 3
A/B - depth: 1 ply: 1 move_nr: 19 move: Qe2e3
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
A/B - depth: 1 ply: 1 move_nr: 20 move: Qe2f3
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 3
A/B - depth: 1 ply: 1 move_nr: 21 move: Qe2c4
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 3
A/B - depth: 1 ply: 1 move_nr: 22 move: Qe2e4
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
A/B - depth: 1 ply: 1 move_nr: 23 move: Qe2g4
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 3
A/B - depth: 1 ply: 1 move_nr: 24 move: Qe2b5
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
A/B - depth: 1 ply: 1 move_nr: 25 move: Kd1e1
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
A/B - depth: 1 ply: 1 move_nr: 26 move: Qe2h5
Check Extend: depth +1
A/B - depth: 1 ply: 2 move_nr: 4 move: Ke8f8
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 7
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
A/B - depth: 1 ply: 2 move_nr: 9 move: Ke8e7
A/B - depth: 1 ply: 2 move_nr: 10 move: Ne5g6
A/B - depth: 1 ply: 2 move_nr: 11 move: Ne5f7
A/B - depth: 1 ply: 2 move_nr: 28 move: Ke8d8
A/B - depth: 1 ply: 1 move_nr: 27 move: Qe2a6
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
A/B - depth: 1 ply: 1 move_nr: 28 move: Kd1c2
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
A/B - depth: 1 ply: 1 move_nr: 29 move: h7h8q
Check Extend: depth +1
A/B - depth: 1 ply: 2 move_nr: 1 move: Bf6h8
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 7
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
A/B - depth: 1 ply: 1 move_nr: 30 move: h7h8r
Check Extend: depth +1
A/B - depth: 1 ply: 2 move_nr: 1 move: Bf6h8
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 7
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
A/B - depth: 1 ply: 1 move_nr: 31 move: h7h8b
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 7
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
A/B - depth: 1 ply: 1 move_nr: 32 move: h7h8n
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 7
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
info score cp -110 depth 1 seldepth 7 time 1 nodes 201 nps 201000 pv e2h5 e8f8
bestmove e2h5
quit
As you can see, it indeed stays at depth 1, but it does reach ply 7 as a maximum. Here it's shown that the check extension works, and that qsearch extends off of that:
Code: Select all
A/B - depth: 1 ply: 1 move_nr: 26 move: Qe2h5
Check Extend: depth +1
A/B - depth: 1 ply: 2 move_nr: 4 move: Ke8f8
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 7
...
The black king is checked, and moves out of check while still in alpha/beta, before qsearch is entered.
In the KiwiPete position, QS is massive.
Code: Select all
go depth 1
....
A/B - depth: 1 ply: 1 move_nr: 39 move: a2a3
QS - depth: 1 ply: 2
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 7
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 7
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 7
QS - depth: 1 ply: 8
QS - depth: 1 ply: 9
QS - depth: 1 ply: 10
QS - depth: 1 ply: 11
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 10
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 7
QS - depth: 1 ply: 8
QS - depth: 1 ply: 9
QS - depth: 1 ply: 10
QS - depth: 1 ply: 11
QS - depth: 1 ply: 12
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 9
QS - depth: 1 ply: 10
QS - depth: 1 ply: 11
QS - depth: 1 ply: 12
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 12
QS - depth: 1 ply: 13
QS - depth: 1 ply: 14
QS - depth: 1 ply: 14
QS - depth: 1 ply: 14
QS - depth: 1 ply: 12
QS - depth: 1 ply: 13
QS - depth: 1 ply: 14
QS - depth: 1 ply: 14
QS - depth: 1 ply: 14
QS - depth: 1 ply: 14
QS - depth: 1 ply: 14
QS - depth: 1 ply: 12
QS - depth: 1 ply: 13
QS - depth: 1 ply: 14
QS - depth: 1 ply: 15
QS - depth: 1 ply: 16
QS - depth: 1 ply: 15
QS - depth: 1 ply: 13
QS - depth: 1 ply: 14
QS - depth: 1 ply: 15
QS - depth: 1 ply: 16
QS - depth: 1 ply: 16
QS - depth: 1 ply: 14
QS - depth: 1 ply: 11
QS - depth: 1 ply: 9
QS - depth: 1 ply: 10
QS - depth: 1 ply: 9
QS - depth: 1 ply: 10
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 10
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 9
QS - depth: 1 ply: 10
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 8
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 8
QS - depth: 1 ply: 9
QS - depth: 1 ply: 10
QS - depth: 1 ply: 10
QS - depth: 1 ply: 10
QS - depth: 1 ply: 10
QS - depth: 1 ply: 10
QS - depth: 1 ply: 8
QS - depth: 1 ply: 9
QS - depth: 1 ply: 10
QS - depth: 1 ply: 11
QS - depth: 1 ply: 12
QS - depth: 1 ply: 12
QS - depth: 1 ply: 12
QS - depth: 1 ply: 10
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 10
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 9
QS - depth: 1 ply: 10
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 11
QS - depth: 1 ply: 7
QS - depth: 1 ply: 8
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 9
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 6
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 7
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 4
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 5
QS - depth: 1 ply: 3
QS - depth: 1 ply: 3
QS - depth: 1 ply: 3
QS - depth: 1 ply: 3
QS - depth: 1 ply: 3
QS - depth: 1 ply: 3
QS - depth: 1 ply: 3
....
info score cp 25 depth 1 seldepth 16 time 13 nodes 1598 nps 122923 pv e2a6 b4c3 b2c3 e6d5
bestmove e2a6
quit
(Somewhere in that output was a QSearch of up to 16 ply)
So Rustic as you tested it, showed an almost random seldepth (from wherever in the tree it last encountered ply > requested depth), and the current version in the master-branch shows the max depth the engine reached at a certain ply, because I have no reductions at this point. In the KiwiPete position, depth 16 seems to be reached before the position is actually quiet.
Obviously, in this case, seldepth will become higher and higher, or at least stay the same:
depth 1 seldepth 12 (reached 12)
depth 2 seldepth 12 (reached 7)
depth 2 seldepth 15 (reached 15)
I also think I know why Stockfish / most engines need to reset seldepth and ply, and I don't (if I don't want to). They probably use global variables, and they keep their information between searches. In my engine, search_info is destroyed at the end of the search (courtesy of Rust), so I don't need to reset it. Between iterations I also don't need to reset, because:
1
reset
1, 2
reset
1, 2, 3
It doesn't matter; if I reset after depth 1, the exact same information will be in the variables after 1 is finshed in the next iteration.
In the Kiwipete position with the current version of Rustic in master, this happens:
Code: Select all
go
info score cp 25 depth 1 seldepth 16 time 0 nodes 1598 nps 0 pv e2a6 b4c3 b2c3 e6d5
info score cp 25 depth 2 seldepth 16 time 0 nodes 3196 nps 0 pv e2a6 b4c3 b2c3 e6d5
info score cp 20 depth 3 seldepth 20 time 2 nodes 8556 nps 4278000 pv e2a6 e6d5 a6b7 b4c3 b7a8 c3d2
info score cp 20 depth 4 seldepth 20 time 6 nodes 21644 nps 3607333 pv e2a6 e6d5 a6b7 b4c3 b7a8 c3d2
info score cp 5 depth 5 seldepth 22 time 27 nodes 80147 nps 2968407 pv e2a6 b4c3 d2c3 e6d5 e4d5 f6d5
info score cp 15 depth 6 seldepth 22 time 131 nodes 313607 nps 2393947 pv e2a6 e6d5 c3d5 b6d5 a6b7 a8d8 b7d5 f6d5
info score cp 5 depth 7 seldepth 24 time 638 nodes 1415412 nps 2218514 pv e2a6 e6d5 c3d5 f6d5 e5c4 f7f5 c4b6 a7b6
info score cp -15 depth 8 seldepth 26 time 3695 nodes 7683695 nps 2079484 pv e2a6 e6d5 c3d5 f6d5 e5d3 f7f5 g2h3 f5e4
info score cp -40 depth 9 seldepth 27 time 21236 nodes 42283163 nps 1991108 pv d5e6 e7e6 e2a6 e6e5 g2h3 b4c3 d2c3 e5e6 c3f6 g7f6
And in the end, it does feel logical now that I have seen the debug output. If depth 1 already causes a massive QSearch of 15 ply (for a seldepth/maxdepth of 16), then it is completely believable, that somewhere int he tree at depth 3, a QSearch of 17 takes place, for a maxdepth/seldepth of 20... and so on.