Author: Robert Hyatt
Date: 18:53:35 02/05/99
Go up one level in this thread
On February 05, 1999 at 18:01:34, Eugene Nalimov wrote: >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... >> >>'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 > >Does that mean that when you'll reuse that information stored in >tha hash table during the next iteration (or after correctly >predicted opponents' move), you will use results of the search >that did not probe TB? Even if now ply is shallower, and you should >probe if you'd allowed to search? > >Eugene It is certainly possible... But this was true anyway. However, the next iteration goes 1 ply deeper, so that such things ought not have a big effect, even though it can cause a quirk here and there. The alternative is to not search nearly so deeply, in order to probe everywhere. I ran a lot of tests with special set-up positions and this was able to win over 65% of the games vs the normal prober. Mainly because it was searching significantly deeper overall and when the tablebases don't matter, the new approach was significantly stronger...
This page took 0 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.