Two fold or three fold repetition?
Moderators: hgm, Rebel, chrisw
-
- Posts: 4052
- Joined: Thu May 15, 2008 9:57 pm
- Location: Berlin, Germany
- Full name: Sven Schüle
Re: Two fold or three fold repetition?
QS and FP are unrelated to your repetition detection issue. I suggest to unconfuse your thoughts ... Just fixing the bugs according to the input you got here should help.
Sven Schüle (engine author: Jumbo, KnockOut, Surprise)
-
- Posts: 7220
- Joined: Mon May 27, 2013 10:31 am
Re: Two fold or three fold repetition?
I only check for two fold repetitions now. Three fold repetition checks does not work in my implementation. Too difficult to find out what goes wrong. So I resign. (also waste of time)
Somehow P1(2) is stored in TTable when it did not occur twice in the game history and not present in the history from root.
So I now check only if a position occurs once or is not present in the game history and not present in the history from root.
Somehow P1(2) is stored in TTable when it did not occur twice in the game history and not present in the history from root.
So I now check only if a position occurs once or is not present in the game history and not present in the history from root.
-
- Posts: 7220
- Joined: Mon May 27, 2013 10:31 am
Re: Two fold or three fold repetition?
O wait that's wrong. Must be:
if position present in game history or present in the history from root then it is a draw.
if position present in game history or present in the history from root then it is a draw.
-
- Posts: 4052
- Joined: Thu May 15, 2008 9:57 pm
- Location: Berlin, Germany
- Full name: Sven Schüle
Re: Two fold or three fold repetition?
Why should it be a problem that P1(2) is stored in TT? See my "section B)" ... That *does not matter* for repetition detection since you *must not* read the TT before having ensured that the current position is not repeated ...
Should I introduce a counter for the number of times that I posted this?
Sven Schüle (engine author: Jumbo, KnockOut, Surprise)
-
- Posts: 7220
- Joined: Mon May 27, 2013 10:31 am
Re: Two fold or three fold repetition?
I am only talking nonsense. This is too complcated for me and will be waste of time.
I know it picks up somehow a wrong value from TT. You say that is impossible but my computer shows that it is possible.
But my source code giving no clue.
I know it picks up somehow a wrong value from TT. You say that is impossible but my computer shows that it is possible.
But my source code giving no clue.
-
- Posts: 883
- Joined: Sat Mar 13, 2021 1:47 am
- Full name: Amanj Sherwany
Re: Two fold or three fold repetition?
It is clear by now this thread cannot solve your issue Henk, is your code available somewhere that we can look at and give feedback?
-
- Posts: 7220
- Joined: Mon May 27, 2013 10:31 am
Re: Two fold or three fold repetition?
Not much magic. This code returns true if it thinks it is a draw:
What can go wrong? Maybe zobristkey representation wrong value??
If I set threeFoldRep to false. It all works fine. No bad repetition draws. Misery starts when threeFoldRep == true;
Here it is called at start of PVS.
What can go wrong. Maybe remove plyCount > 0 ??
Code: Select all
var count = historyFromRoot.Get(keyRep);
if (count >= 1)
{
return true;
}
var countGameHistory = gameHistory.Get(keyRep);
int nOccurences = threeFoldRep ? 2 : 1;
if (countGameHistory >= nOccurences)
{
return true;
}
If I set threeFoldRep to false. It all works fine. No bad repetition draws. Misery starts when threeFoldRep == true;
Here it is called at start of PVS.
Code: Select all
if (depth >= 0 && plyCount > 0 )
{
if (Board.IsaDraw(true, GamePhase, key.Rep, HistoryFromRoot, PositionHistory))
{
return 0;
}
}
What can go wrong. Maybe remove plyCount > 0 ??
-
- Posts: 7220
- Joined: Mon May 27, 2013 10:31 am
Re: Two fold or three fold repetition?
Only had to play one game to get a repetition draw. With threeFoldRep = true;
[pgn]
[Event "Computer Chess Game"]
[Site "LAPTOP-1FK7MTIP"]
[Date "2021.08.25"]
[Round "-"]
[White "Skipper_8_17"]
[Black "Skipper_8_16"]
[Result "1/2-1/2"]
[TimeControl "60"]
[Annotator "1. +0.26 1... -0.05"]
1. d4 {+0.26/8} Nf6 {-0.05/8 1.0} 2. Nh3 {+0.44/8 1.0} e6 {+0.23/9 1.0} 3.
Nc3 {+0.06/8 1.0} Nc6 {+0.16/8 1.0} 4. e4 {+0.22/9 1.0} Bb4 {+0.01/7 1.0}
5. e5 {+0.31/8 1.0} Nd5 {+0.35/8 1.0} 6. Bd2 {+0.90/8 0.9} O-O
{+0.17/7 0.9} 7. Nxd5 {+1.35/9 0.9} Bxd2+ {+0.06/9 0.9} 8. Qxd2
{+1.06/9 0.9} exd5 {+0.09/9 0.9} 9. c4 {+1.03/7 0.9} dxc4 {+0.10/8 0.9} 10.
Bxc4 {+0.54/8 0.9} d5 {+0.55/8 0.9} 11. Bb3 {+0.82/8 0.9} Bf5 {+0.16/8 0.9}
12. Nf4 {+0.92/8 0.8} h6 {+0.16/6 0.8} 13. Bxd5 {+1.28/7 0.8} g5
{-0.34/7 0.8} 14. Nh5 {+2.10/8 0.8} Be6 {-0.89/8 0.8} 15. Nf6+
{+2.92/8 0.8} Kg7 {-0.93/7 0.8} 16. Qd3 {+2.68/8 0.8} Rh8 {-1.10/7 0.8} 17.
Bxe6 {+2.50/8 0.8} fxe6 {-1.03/7 0.8} 18. O-O-O {+2.60/8 0.8} Kf8
{-1.09/6 0.7} 19. h4 {+1.69/7 0.8} gxh4 {-1.39/8 0.8} 20. Qd2 {+1.56/8 0.7}
Ne7 {-1.02/8 0.8} 21. Rxh4 {+1.74/8 0.7} Nf5 {-1.18/7 0.7} 22. Rhh1
{+2.27/8 0.7} Kf7 {-1.16/7 0.7} 23. b4 {+3.25/7 0.7} c6 {-0.99/7 0.7} 24.
a4 {+3.22/8 0.7} Kg7 {-0.95/8 0.7} 25. f4 {+3.34/7 0.7} Ng3 {-0.90/7 0.7}
26. Rh3 {+3.37/9 0.7} Nf5 {-0.90/8 0.7} 27. a5 {+3.34/8 0.7} Ne7
{-1.05/7 0.7} 28. Rg3+ {+2.89/8 0.7} Kf7 {-1.04/7 0.6} 29. Ne4
{+2.72/8 0.7} Nf5 {-1.01/7 0.6} 30. Rh3 {+3.07/7 0.6} h5 {-1.00/7 0.6} 31.
Nf6 {+2.96/8 0.6} h4 {-1.06/8 0.6} 32. Kb2 {+2.79/7 0.6} b5 {-1.23/7 0.6}
33. Kb1 {+4.21/7 0.6} Qc8 {-1.57/7 0.6} 34. Rc1 {+2.74/8 0.6} Rd8
{-1.71/7 0.6} 35. Rd3 {+2.48/8 0.6} Rb8 {-1.78/7 0.6} 36. Ka1 {+2.47/7 0.6}
Ra8 {-1.83/7 0.6} 37. Qb2 {+2.56/7 0.6} Ne7 {-1.59/6 0.6} 38. Ne4
{+2.75/8 0.6} Nf5 {-1.70/6 0.5} 39. Nc5 {+2.69/8 0.6} a6 {-1.53/7 0.5} 40.
Rh1 {+2.37/8 0.5} Rg8 {-1.57/6 0.5} 41. Rd2 {+2.39/7 0.6} Rg4 {-1.18/7 0.5}
42. Rf2 {+2.09/8 0.5} Rg8 {-1.53/7 0.5} 43. Rd2 {+2.36/8 0.5} Rg4
{+0.00/11 0.5} 44. Rf2 {+2.04/9 0.5} Rg8 {+0.00/11 0.5} 45. Qa2
{+2.25/7 0.5} Rd8 {-1.16/7 0.5} 46. Rd2 {+2.17/8 0.5} Rd5 {-1.29/7 0.5} 47.
Qb2 {+2.51/7 0.5} Qd8 {-1.21/6 0.5} 48. Ne4 {+2.32/7 0.5} Rd7 {-1.34/5 0.4}
49. Nf6 {+2.43/8 0.5} Rxd4 {-0.99/9 0.5} 50. Rxd4 {+1.76/10 0.5} Qxd4
{-1.86/10 0.5} 51. Qxd4 {+2.02/11 0.5} Nxd4 {-2.04/10 0.4} 52. Rxh4
{+2.34/9 0.5} Rb8 {-2.20/9 0.4} 53. Kb2 {+3.04/9 0.5} c5 {-3.19/9 0.4} 54.
Nd7 {+3.70/9 0.5} Rg8 {-3.10/10 0.4} 55. Nxc5 {+3.63/10 0.4} Rxg2+
{-2.74/8 0.4} 56. Kc3 {+3.66/10 0.5} Nf3 {-3.13/9 0.4} 57. Rh7+
{+4.21/9 0.4} Kg8 {-3.39/8 0.4} 58. Rd7 {+4.65/9 0.4} Rg6 {-3.39/8 0.4} 59.
Rd3 {+5.19/10 0.4} Ne1 {-3.14/9 0.4} 60. Rd6 {+4.94/10 0.4} Kf7
{-3.39/9 0.4} 61. Rxa6 {+5.45/9 0.4} Rg3+ {-3.65/10 0.4} 62. Kb2
{+6.21/9 0.4} Rg2+ {-3.96/9 0.4} 63. Kc3 {+5.62/9 0.4} Rg3+ {+0.00/14 0.4}
64. Kb2 {+5.62/10 0.4} Rg2+ {+0.00/13 0.4} 65. Kc3 {+5.62/9 0.4} Rg3+
{+0.00/14 0.4}
{XBoard adjudication: repetition draw} 1/2-1/2
[/pgn]
Skipper_8_16 sees the draw but 8_17 does not.
[pgn]
[Event "Computer Chess Game"]
[Site "LAPTOP-1FK7MTIP"]
[Date "2021.08.25"]
[Round "-"]
[White "Skipper_8_17"]
[Black "Skipper_8_16"]
[Result "1/2-1/2"]
[TimeControl "60"]
[Annotator "1. +0.26 1... -0.05"]
1. d4 {+0.26/8} Nf6 {-0.05/8 1.0} 2. Nh3 {+0.44/8 1.0} e6 {+0.23/9 1.0} 3.
Nc3 {+0.06/8 1.0} Nc6 {+0.16/8 1.0} 4. e4 {+0.22/9 1.0} Bb4 {+0.01/7 1.0}
5. e5 {+0.31/8 1.0} Nd5 {+0.35/8 1.0} 6. Bd2 {+0.90/8 0.9} O-O
{+0.17/7 0.9} 7. Nxd5 {+1.35/9 0.9} Bxd2+ {+0.06/9 0.9} 8. Qxd2
{+1.06/9 0.9} exd5 {+0.09/9 0.9} 9. c4 {+1.03/7 0.9} dxc4 {+0.10/8 0.9} 10.
Bxc4 {+0.54/8 0.9} d5 {+0.55/8 0.9} 11. Bb3 {+0.82/8 0.9} Bf5 {+0.16/8 0.9}
12. Nf4 {+0.92/8 0.8} h6 {+0.16/6 0.8} 13. Bxd5 {+1.28/7 0.8} g5
{-0.34/7 0.8} 14. Nh5 {+2.10/8 0.8} Be6 {-0.89/8 0.8} 15. Nf6+
{+2.92/8 0.8} Kg7 {-0.93/7 0.8} 16. Qd3 {+2.68/8 0.8} Rh8 {-1.10/7 0.8} 17.
Bxe6 {+2.50/8 0.8} fxe6 {-1.03/7 0.8} 18. O-O-O {+2.60/8 0.8} Kf8
{-1.09/6 0.7} 19. h4 {+1.69/7 0.8} gxh4 {-1.39/8 0.8} 20. Qd2 {+1.56/8 0.7}
Ne7 {-1.02/8 0.8} 21. Rxh4 {+1.74/8 0.7} Nf5 {-1.18/7 0.7} 22. Rhh1
{+2.27/8 0.7} Kf7 {-1.16/7 0.7} 23. b4 {+3.25/7 0.7} c6 {-0.99/7 0.7} 24.
a4 {+3.22/8 0.7} Kg7 {-0.95/8 0.7} 25. f4 {+3.34/7 0.7} Ng3 {-0.90/7 0.7}
26. Rh3 {+3.37/9 0.7} Nf5 {-0.90/8 0.7} 27. a5 {+3.34/8 0.7} Ne7
{-1.05/7 0.7} 28. Rg3+ {+2.89/8 0.7} Kf7 {-1.04/7 0.6} 29. Ne4
{+2.72/8 0.7} Nf5 {-1.01/7 0.6} 30. Rh3 {+3.07/7 0.6} h5 {-1.00/7 0.6} 31.
Nf6 {+2.96/8 0.6} h4 {-1.06/8 0.6} 32. Kb2 {+2.79/7 0.6} b5 {-1.23/7 0.6}
33. Kb1 {+4.21/7 0.6} Qc8 {-1.57/7 0.6} 34. Rc1 {+2.74/8 0.6} Rd8
{-1.71/7 0.6} 35. Rd3 {+2.48/8 0.6} Rb8 {-1.78/7 0.6} 36. Ka1 {+2.47/7 0.6}
Ra8 {-1.83/7 0.6} 37. Qb2 {+2.56/7 0.6} Ne7 {-1.59/6 0.6} 38. Ne4
{+2.75/8 0.6} Nf5 {-1.70/6 0.5} 39. Nc5 {+2.69/8 0.6} a6 {-1.53/7 0.5} 40.
Rh1 {+2.37/8 0.5} Rg8 {-1.57/6 0.5} 41. Rd2 {+2.39/7 0.6} Rg4 {-1.18/7 0.5}
42. Rf2 {+2.09/8 0.5} Rg8 {-1.53/7 0.5} 43. Rd2 {+2.36/8 0.5} Rg4
{+0.00/11 0.5} 44. Rf2 {+2.04/9 0.5} Rg8 {+0.00/11 0.5} 45. Qa2
{+2.25/7 0.5} Rd8 {-1.16/7 0.5} 46. Rd2 {+2.17/8 0.5} Rd5 {-1.29/7 0.5} 47.
Qb2 {+2.51/7 0.5} Qd8 {-1.21/6 0.5} 48. Ne4 {+2.32/7 0.5} Rd7 {-1.34/5 0.4}
49. Nf6 {+2.43/8 0.5} Rxd4 {-0.99/9 0.5} 50. Rxd4 {+1.76/10 0.5} Qxd4
{-1.86/10 0.5} 51. Qxd4 {+2.02/11 0.5} Nxd4 {-2.04/10 0.4} 52. Rxh4
{+2.34/9 0.5} Rb8 {-2.20/9 0.4} 53. Kb2 {+3.04/9 0.5} c5 {-3.19/9 0.4} 54.
Nd7 {+3.70/9 0.5} Rg8 {-3.10/10 0.4} 55. Nxc5 {+3.63/10 0.4} Rxg2+
{-2.74/8 0.4} 56. Kc3 {+3.66/10 0.5} Nf3 {-3.13/9 0.4} 57. Rh7+
{+4.21/9 0.4} Kg8 {-3.39/8 0.4} 58. Rd7 {+4.65/9 0.4} Rg6 {-3.39/8 0.4} 59.
Rd3 {+5.19/10 0.4} Ne1 {-3.14/9 0.4} 60. Rd6 {+4.94/10 0.4} Kf7
{-3.39/9 0.4} 61. Rxa6 {+5.45/9 0.4} Rg3+ {-3.65/10 0.4} 62. Kb2
{+6.21/9 0.4} Rg2+ {-3.96/9 0.4} 63. Kc3 {+5.62/9 0.4} Rg3+ {+0.00/14 0.4}
64. Kb2 {+5.62/10 0.4} Rg2+ {+0.00/13 0.4} 65. Kc3 {+5.62/9 0.4} Rg3+
{+0.00/14 0.4}
{XBoard adjudication: repetition draw} 1/2-1/2
[/pgn]
Skipper_8_16 sees the draw but 8_17 does not.
-
- Posts: 883
- Joined: Sat Mar 13, 2021 1:47 am
- Full name: Amanj Sherwany
Re: Two fold or three fold repetition?
Sorry for asking the obvious, but do you ever update gameHistory counts? Can you show that part of the code?Henk wrote: ↑Wed Aug 25, 2021 3:44 pm Not much magic. This code returns true if it thinks it is a draw:
What can go wrong? Maybe zobristkey representation wrong value??Code: Select all
var count = historyFromRoot.Get(keyRep); if (count >= 1) { return true; } var countGameHistory = gameHistory.Get(keyRep); int nOccurences = threeFoldRep ? 2 : 1; if (countGameHistory >= nOccurences) { return true; }
If I set threeFoldRep to false. It all works fine. No bad repetition draws. Misery starts when threeFoldRep == true;
Here it is called at start of PVS.Code: Select all
if (depth >= 0 && plyCount > 0 ) { if (Board.IsaDraw(true, GamePhase, key.Rep, HistoryFromRoot, PositionHistory)) { return 0; } }
What can go wrong. Maybe remove plyCount > 0 ??
-
- Posts: 7220
- Joined: Mon May 27, 2013 10:31 am
Re: Two fold or three fold repetition?
positionHistory and gameHistory are aliases.
Btw. Occupied(move.End.BitBoard) could be replaced by captureLocation != null
Btw. Occupied(move.End.BitBoard) could be replaced by captureLocation != null
Code: Select all
public void Next(IMoveBase move, IPositionHistory positionHistory)
{
Assert(move != null);
var movingPieceKind = PieceKind(move.Start.BitBoard);
var captureLocation = move.GetCaptureLocation(this);
var captureKind = captureLocation == null ? None_Kind : PieceKind(captureLocation.BitBoard);
if (movingPieceKind == Pawn || Occupied(move.End.BitBoard) || move is LongCastling || move is ShortCastling)
{
if (positionHistory != null)
positionHistory.Clear();
}
if (captureLocation == null)
{
NonCaptureMove(move, this.CurPlayer);
}
else
{
Capture(move, this.CurPlayer, captureKind);
}
if (positionHistory != null)
{
var key = new ZobristKey(this, ZobristTable.Instance);
positionHistory.Add(key.Rep);
}
}
Code: Select all
public class PositionHistory : IPositionHistory
{
readonly Dictionary<ulong, int> rep;
public void Add(ulong key)
{
if (rep.ContainsKey(key))
{
rep[key]++;
}
else
{
rep.Add(key, 1);
}
}
Last edited by Henk on Wed Aug 25, 2021 4:50 pm, edited 1 time in total.