Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

time function #90

Open
caissist opened this issue Sep 13, 2024 · 5 comments
Open

time function #90

caissist opened this issue Sep 13, 2024 · 5 comments

Comments

@caissist
Copy link

Hello Adam,
thank you for such an original engine - I love this idea!
Patricia was running on a chess server for me and I noticed a time management issue?!
A basic idea is: do not start a new iteration without first checking whether there is still enough time available to complete the new iteration.
And from my observation, Patricia doesn't do that?! Example game:

[Event "Engine matches"]
[Site "?"]
[Date "2024.9.13"]
[Time "16:21:20"]
[White "?"]
[Black "Patricia 3.1"]
[Result "0-1"]
[WhiteElo "2213"]
[BlackElo "2214"]
[Opening "A09 Reti Opening: Advance Variation, 3.g3"]

{Time control = 5 1 Book(s): Cerebellum 3Merge 2020-09-16.bk ICCF GM 2500+ 2019+_20240909.bk playchess + infinitechess games 2500+_2020+.bk}

  1. Nf3 d5 {0,00/0 0.0 } 2. c4 d4 {0,00/0 0.5 } 3. g3 Nf6 {0,00/0 0.0 } 4. d3 c5 {0,00/0 0.5 } 5. Bf4 Nc6 {-0,45/17 8.4 } 6. Nbd2 Nh5 {-0,82/16 7.3 } 7. Bg2 g6 {-0,92/15 7.6 } 8. Bg5 h6 {-1,21/15 6.8 } 9. Bf4 Bg7 {-1,37/15 7.2 } 10. Nb3 Nxf4 {-1,42/15 8.7 } 11. gxf4 O-O {0,00/1 8.2 } 12. Nfd2 e5 {-1,87/14 8.8 } 13. fxe5 Nxe5 {-1,63/14 6.0 } 14. Nxc5 Re8 {-1,77/13 7.6 } 15. Ndb3 Qh4 {-2,45/13 5.7 } 16. O-O Ng4 {-3,06/13 5.5 } 17. h3 Nf6 {-3,23/14 5.7 } 18. Kh2 Bxh3 {-7,86/14 6.2 } 19. Bxh3 Re3 {-7,44/13 5.0 } 20. f3 Rae8 {-7,89/13 5.0 } 21. Rg1 Nh5 {-9,04/14 5.8 } 22. Qf1 Rxe2+ {-10,03/14 5.5 } 23. Rg2 Nf4 {-10,86/14 4.8 } 24. Rxe2 Rxe2+ {-11,49/14 4.5 } 25. Kh1 Qg3 {-M 07/14 5.5 } 26. Qxe2 Nxe2 {opponent resigns} 0-1

for move 11:

  • the last finished iteration:
    16:23:15.491<-info multipv 2 depth 15 seldepth 31 score cp 150 nodes 4351853 nps 545003 time 7985 pv e8g8 d1d2 d8d6 h2h4 a7a5 a2a4 e7e5 f4e5 d6e7 e1f1 a8a7 e5e6 c8e6 h4h5
  • the last (not finished) iteration:
    16:23:15.491<-bestmove e8g8

move statistics in game notation: 0,00/1 8.2 (PV is missing because of unfinished iteration)

Thank you!

@Adam-Kulju
Copy link
Owner

Hi, thank you for the feedback!

Patricia's time management works as such: if she completes an iteration and time is above some number A, she stops searching. If she hasn't completed an iteration, and time gets above A, she keeps searching to try and finish the iteration, but if it reaches some number B, she immediately stops searching so as to not run out of time.

This is a standard time management method that many engines use, and it gains a lot of Elo.

Here it seems that she searched for a little bit less than A time, then the next iteration took a very long time and it reached B time before it completed. This does happen occasionally, but there's no good way to predict if it is likely to happen, and it doesn't happen often enough to offset the benefits of the time management scheme.

If she doesn't print out the iteration while other engines do, it's because other engines print when they hit B, while Patricia only prints the best move and returns.

@caissist
Copy link
Author

Hi, thank you for feedback!

and it doesn't happen often enough to offset the benefits of the time management scheme.

Well, it happens in almost all games, and also several times in same game. Here another examples, please note my annotations:

[Event "Engine matches"]
[Site "?"]
[Date "2024.9.18"]
[Round "?"]
[White "Patricia 3.1 ver Aug 7, 2024"]
[Black "?"]
[Result "1-0"]
[BlackElo "2197"]
[Opening "C65 Spanish: Berlin, Beverwijk Variation"]
[Time "18:48:36"]
[WhiteElo "2214"]

{Time control = 5 0 Book(s): Cerebellum 3Merge 2020-09-16.bk ICCF GM 2500+
2019+_20240909.bk playchess + infinitechess games 2500+_2020+.bk} 1. e4
{0,00/0 0.0 } 1... e5 2. Nf3 {0,00/0 0.0 } 2... Nc6 3. Bb5 {0,00/0 0.0 }
3... Nf6 4. O-O {0,00/0 0.0 } 4... Bc5 5. Bxc6 {0,00/0 0.6 } 5... dxc6 6. d3
{0,00/0 0.0 } 6... Qe7 7. Nbd2 {0,00/0 0.0 } 7... Ng4 8. h3 {0,00/0 0.0 }
8... h5 9. Nb3 {0,00/0 0.0 } 9... Bb6 10. d4 {0,31/14 7.8 } 10... Be6 11. a4
{0,21/16 6.9 } 11... O-O-O 12. a5 {0,38/15 6.0 } 12... Bxd4 13. Nbxd4
{0,38/16 7.2 } 13... exd4 14. Re1 {0,32/16 6.0 } 14... Nf6 15. Bg5 {1,48/15
6.0 } 15... Qc5 16. e5 {2,03/14 5.2 } 16... Nh7 17. Bxd8 {2,03/15 6.5 }
17... Rxd8 18. a6 {1,90/15 6.7 } 18... b5 19. Qd2 {2,10/15 5.5 } 19... g6
20. Rad1 {2,50/15 5.1 } 20... Qb6 21. Qf4 {0,00/1 5.0 -- unfinished iteration}
21... c5 22. b4 {2,52/15 5.3 } 22... cxb4 23. Nxd4 {2,90/16 5.3 } 23...
Nf8 24. Nxe6 {3,16/16 5.4 } 24... Qxe6 25. Qxb4 {6,04/19 5.8 } 25... c6 26.
Rxd8+ {11,55/18 5.1 } 26... Kxd8 27. Qxf8+ {opponent resigns} 1-0

[Event "Engine matches"]
[Site "?"]
[Date "2024.9.18"]
[Round "?"]
[White "?"]
[Black "Patricia 3.1 ver Aug 7, 2024"]
[Result "0-1"]
[BlackElo "2222"]
[Opening "C50 Giuoco Pianissimo: Italian Four Knights"]
[Time "19:03:32"]
[WhiteElo "2181"]

{Time control = 5 0 Book(s): Cerebellum 3Merge 2020-09-16.bk ICCF GM 2500+
2019+_20240909.bk playchess + infinitechess games 2500+_2020+.bk} 1. e4 e5
{0,00/0 0.0 } 2. Nf3 Nc6 {0,00/0 0.6 } 3. Bc4 Bc5 {0,00/0 0.0 } 4. d3 Nf6
{0,00/0 0.6 } 5. Nc3 O-O {0,00/0 0.0 } 6. Ng5 d6 {0,00/0 0.0 } 7. a3 Bg4
{0,00/0 0.0 } 8. f3 Bc8 {0,00/0 0.0 } 9. h4 a5 {0,00/0 0.0 } 10. g4 Nd4
{0,00/0 0.6 } 11. Kf1 h6 {0,00/0 0.5 } 12. Kg2 c6 {0,00/0 0.0 } 13. Ba2 d5
{0,00/0 0.5 } 14. Rh2 b5 {-2,21/13 6.4 } 15. Bd2 Qd6 {0,00/0 0.6 } 16. Rc1
Rb8 {0,00/1 7.1 -- unfinished iteration} 17. Nh3 b4 {-3,91/14 6.7 } 18. Na4
dxe4 {-3,83/15 9.4 } 19. Nxc5 exf3+ {-4,44/16 6.8 } 20. Kh1 Qxc5 {-4,35/16
6.5 } 21. c3 bxc3 {-5,13/15 5.4 } 22. bxc3 Ne2 {-6,13/15 5.9 } 23. g5 Ng3#
{opponent checkmated} 0-1

Maybe another look on your boundaries "A" and "B"?

Thank you.

@caissist
Copy link
Author

I've watched quite a few games now, and I now know that iterations are aborted in almost every game, and several times in a single game. So these are not occasional situations!
You surely know “HGM” Harm-Geert Muller, a pope in computer chess? I quote:
" H.G. Muller (NOV 21, 2008 on talkchess.com):
In uMax, where the search time is extremely variable, because it always finishes
an iteration, once its starts it, the target time (after which I do not start a
new iteration) must be at most 10% of the remaining time on the clock, or there
is a significant probability that it will forfeit on time with the current move.
On average it uses about 1.5 times as much time as this target time, but the
distribution has a very long tail towards long thinking times.
For the long-run target, you can assume that the game will last 40 more moves,
so that you have timeLeft + 40 * timeInc, and that you want on the average to
spend 4% of that remaining time on the next move.
So you get targetTime = 0.04 * (timeLeft + 40 * timeInc) / 1.5.
This works for any incremental time control, whether the increment is zero
(sudden death), or most of the time must come from the increment."

Just another suggestion...

@caissist
Copy link
Author

caissist commented Oct 1, 2024

Adam, a new run - I did some statistics...

This does happen occasionally, but there's no good way to predict if it is likely to happen, and it doesn't happen often enough to offset the benefits of the time management scheme.

Patricia has played so far: 213 games Fischer clocks 5 1
total number of unfinished iterations: 380
rate of unfinished iterations: 1.784 per game

To me this is not "occasionally". It means in every game almost 2 unfinished iterations, which means

  • wasted thinking time
  • even worse playing out a final move based on an unfinished iteration.

See HGM's statement above based on a very large knowledge and experience...

@caissist
Copy link
Author

caissist commented Oct 3, 2024

This is a standard time management method that many engines use

Are you sure? I watched many debates regarding time function on talkchess.com over the last about 15 years and I learnt: no, there is no standard. Rather, there are many different solutions, and people only agree on very basic things, such as: do not start a new iteration x+1 if it is unlikely that it can be completed regularly.
Here is another example of a final move, without finishing the iteration:
The move 28...Ra2 was finally played - out of the blue - based on an incomplete iteration, and it wasn't even examined in the last 5 search depths?! Would you trust a move like that?
Attached is the game and Patricia's iterations on this move alone.

Patricia games - unfinished iterations #02 - 28...Ra2.txt
Patricia games - unfinished iterations #02 - 28...Ra2 - engine statistics.txt

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants