Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Interesting endgame database probe problem

Author: José de Jesús García Ruvalcaba

Date: 10:03:40 02/06/99

Go up one level in this thread


On February 05, 1999 at 17:51:43, Robert Hyatt wrote:

>On February 05, 1999 at 14:55:49, José de Jesús García Ruvalcaba wrote:
>
>>On February 04, 1999 at 09:40:32, Robert Hyatt wrote:
>>
>>>
>>>I found a pretty neat bug (not really a bug, more like a design problem)
>>>last night.  Crafty had played zarkovx on ICC, and was in a reduced material
>>>position.  It was getting close to repeating a position for the third time
>>>when it announced a mate in 70 (tablebase hit).  The next move it announced a
>>>mate in 73, and after the opponent's next move it realized this was a dead draw
>>>by repetition.
>>>
>>>Here's what was wrong, which might serve as a warning for those of you doing
>>>this in your program.
>>>
>>>I obviously don't do a repetition check at ply=1 in the search, because by the
>>>time I get there, I _must_ choose a move.  If it is drawn at the root, I don't
>>>even call search.  The first time I do a repetition check is at ply=2.  In this
>>>game, crafty could make 1 move and not repeat, but after any _other_ move, the
>>>next move by the opponent would repeat.  What happened was it tried each root
>>>move (remember, move A is a mate in 72 that does not allow a repeat of a prior
>>>position, while any other move leads to a mate in 70, but the next opponent move
>>>is a draw by repetition for any of them)
>>>
>>>Back to the idea (the previous sentence was too long to continue, IMHO) when it
>>>tried move A, at ply=2 it did the rep check and found 'no rep' and then it
>>>probed the database and found mate in 73.  OK so far.  But then it tried the
>>>next choice (again no rep, but if it does this the opponent can choose a move
>>>that is a 3rd rep) and found no rep, but a database hit with a mate in 70.  70
>>>is better than 73, so it took this move.  And played it, and found that the
>>>opponent instantly repeated and drew.
>>>
>>>The fix was to _not_ probe at ply=2 any more...  which means that now, Crafty
>>>has to make a move, _and_ the opponent has to make a move without repeating the
>>>position, _before_ I probe the database at ply=3 after the rep check.  Solved
>>>this rather ugly (and uncommon) problem.
>>>
>>>My search looks like this:
>>>
>>>Search(alpha,beta,etc){
>>>  if (repcheck) return;
>>>  if (EGTBprobe) return;
>>>  do {
>>>    normal move selection/recursive search
>>>  }
>>>  return;
>>>}
>>>
>>>The problem was that I did the EGTB probe at ply=2, _before_ my opponent had a
>>>chance to make a move.  And EGTB has _no clue_ about what has already happened
>>>in the game.  This has been around a while, hope this explanation is clear
>>>enough to help others avoid debugging it.  :)
>>>
>>>Let me know if there are questions...
>>>
>>>Bob
>>>
>>>(and yes, I said mate in 70.  The record on ICC (for crafty, anyway) is now a
>>>mate announcement of mate in 138.  This in a fairly complex ending that Crafty
>>>managed to turn into a ugly KPP vs K ending that was a mate in over 120.  But it
>>>had already searched _very_ deep before it found the TB hit, to give that huge
>>>mate in 138 score.)
>>>
>>>If anyone is interested, I now have a 'dynamic depth adjustment' algorithm in
>>>crafty to prevent the database probes from taking my normal 600-800K nodes per
>>>second down to 10K or so.  I now usually never drop under 300K and it is working
>>>very well...
>>>
>>>Bob
>>
>>Could you please post the score of the game and point the moves you are
>>referring to?
>>Also, a brief description of the "dynamic depth adjustment" would be
>>appreciated.
>>
>>José.
>
>
>Here is the game:
>
>[Event "ICC 5 0"]
>[Site "Internet Chess Club"]
>[Date "1999.01.29"]
>[Round "-"]
>[White "ZarkovX"]
>[Black "crafty"]
>[Result "1/2-1/2"]
>[WhiteElo "2829"]
>[BlackElo "2936"]
>[Opening "Sicilian: Scheveningen, 6.Be2"]
>[ECO "B83"]
>[NIC "SI.19"]
>[Time "21:22:33"]
>[TimeControl "300+0"]
>
>1. e4 c5 2. Nf3 e6 3. d4 cxd4 4. Nxd4 Nf6 5. Nc3 d6 6. Be2 Be7 7. O-O O-O 8. f4
>a6 9. Kh1 Qc7 10. a4 Nc6 11. Be3 Re8 12. Bg1 Rb8 13. f5 Nb4 14. fxe6 fxe6 15.
>Be3 Bd7 16. Qd2 Rbd8 17. Nf3 d5 18. Bf4 Qc5 19. Be3 Qa5 20. exd5 Nfxd5 21. Nxd5
>Qxd5 22. Bd4 Bc6 23. Qc3 Qe4 24. Bc4 Qg4 25. Qb3 Bf8 26. c3 b5 27. axb5 axb5 28.
>Be2 Qg6 29. Rfc1 Nd3 30. Bxd3 Qxd3 31. Ne5 Qe4 32. Nxc6 Qxc6 33. Rd1 Qc4 34. Qc2
>e5 35. Bb6 Rxd1+ 36. Qxd1 Re6 37. Be3 Re8 38. Qd7 Re7 39. Qf5 g6 40. Qg5 Qe2 41.
>b4 Qd3 42. Ra8 Kf7 43. h3 Qd5 44. Rc8 Re8 45. Rc7+ Kg8 46. Qh4 Bg7 47. Bh6 Bh8
>48. Bg5 h5 49. Qg3 e4 50. Bf4 Re6 51. Rc8+ Kh7 52. Qe1 Bf6 53. Rc5 Qd3 54. Kh2
>e3 55. Rc7+ Kg8 56. Rc8+ Kf7 57. Rc7+ Be7 58. Ra7 e2 59. Bg5 Qd6+ 60. g3 Kg7 61.
>Bxe7 Rxe7 62. Rxe7+ Qxe7 63. Kg2 Qe3 64. h4 Kh7 65. Kh1 Qf3+ 66. Kg1 Kg7 67. Qf2
>Qxc3 68. Qxe2 Qxg3+ 69. Kf1 Qf4+ 70. Kg2 Qxb4 71. Qe5+ Kf7 72. Qd5+ Kf8 73. Qd8+
>Kg7 74. Qc7+ Kf6 75. Qc6+ Ke5 76. Qc7+ Qd6 77. Qc3+ Qd4 78. Qg3+ Kd5 79. Qg5+
>Kc4 80. Qxg6 Qd2+ 81. Kg1 Qd4+ 82. Kg2 Qxh4 83. Qc2+ Kb4 84. Qb2+ Ka5 85. Qa3+
>Qa4 86. Qc3+ b4 87. Qc7+ Ka6 88. Qd6+ Kb7 89. Qe7+ Kb6 90. Qe3+ Ka6 91. Qe6+ Ka5
>92. Qd5+ Kb6 93. Qd4+ Kb7 94. Qg7+ Kc6 95. Qg6+ Kd5 96. Qxh5+ Kc4 97. Qe2+ Kc3
>98. Qe5+ Kc4 99. Qe2+ Kd4 100. Qd2+ Kc4 101. Qe2+ {Game drawn by repetition}
>1/2-1/2
>
>
>the problem is black's move 96, Kc4.  Kc5 is a mate in 73 moves.  Kc4 is a mate
>in 70 but allows Qe2 which is an instant 3-fold repetition...  Current version
>does not make this mistake...
>

	96... Kc5 is not a legal move. Also, at this point *no* move allows a
three-fold repetition, as white's last move was a pawn capture. I guess you mean
black's hundreth move.
	Is 100. Qd2+ a decisive mistake by white? What should white play at this point?

>'dynamic depth adjustment' simply limits the depth in the tree that tablebase
>probes are done, based on the overall speed of the program.  What normally used
>to happen is that the search would 'stall' when you reach a point where the
>tablebase probes are at the max rate possible on your hardware.  And there is
>no way to do another iteration since that takes you a ply deeper, which means
>even _more_ probes.  The current plan finds some 'level of comfort' in the
>tree where probing beyond that point slows the search to an unacceptable level.
>Crafty limits the probes to that depth and below, which allows it to continue
>searching deeper and deeper (on successive iterations) without hitting that
>I/O "wall" and stalling.
>
>The danger is that tablebase probes can slow you enough that you walk into
>tactical traps because the depth is limited.  This way I probe the databases
>at about the same depth as when it 'stalled' but I can continue to go deeper
>and deeper (iterations).
>
>If you need more info or clarification, feel free to ask...
>
>Bob

	Is it neccesary to search deeper a branch of the tree for which you know the
theoretical value of the game?
	I mean, if you hit a tablebase position at some depth, you do not need to look
at its sons in the next iteration (unless you are in swindle mode, of course). I
think it is posible to concentrate efforts on other branches, and that may lead
to finding the theoretical value of non-tablebase positions (perhaps even the
root).
	I know that tablebase probes are slower than normal evaluation. Is it a good
idea to store the result of a tablebase probe in the hash table? (that would
require doing a hash probe before each tablebase probe, but can save a lot of
tablebase probes).
	I see that time is a critical resource, and particularly the rate of access to
tablebases is critical and should be kept under a reasonable bound.
	How does 'dynamic depth adjustment' adjust the depth of tablebase probesto
achieve that? (it should be different when you get a faster harddisk).

José.



This page took 0.01 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.