public static bool CanRefineEval(TtEntry ttEntry, int eval, int score) { if (ttEntry.Key == 0) { return(false); } return(ttEntry.Flag == FlagExact || ttEntry.Flag == FlagUpper && score < eval || ttEntry.Flag == FlagLower && score > eval); }
public static void AddValue(long key, int score, int ply, int depth, int flag, int move) { if (EngineConstants.Assert) { Assert.IsTrue(depth >= 1); Assert.IsTrue(score >= Util.ShortMin && score <= Util.ShortMax); Assert.IsTrue(score != ChessConstants.ScoreNotRunning); } var index = GetIndex(key); long replacedDepth = int.MaxValue; var replaceIndex = index; for (var i = index; i < index + BucketSize; i++) { if (_entries[i].Key == 0) { replaceIndex = i; break; } var currentEntry = _entries[i]; var currentDepth = currentEntry.Depth; if (_entries[i].Key == key) { if (currentDepth > depth && flag != FlagExact) { return; } replaceIndex = i; break; } // replace the lowest depth if (currentDepth >= replacedDepth) { continue; } replaceIndex = i; replacedDepth = currentDepth; } _entries[replaceIndex] = new TtEntry { Key = key, Move = move, Flag = (byte)flag, Depth = (short)depth }; _entries[replaceIndex].SetScore(score, ply); }
public static string ToString(TtEntry ttEntry) { return("score=" + ttEntry.GetScore(0) + " " + new MoveWrapper(ttEntry.Move) + " depth=" + ttEntry.Depth + " flag=" + ttEntry.Flag); }
public static void TestTtValues(int score, int bestScore, int depth, int bestMove, int flag, TtEntry ttEntry, int ply) { if (ttEntry.Key == 0 || ttEntry.Depth != depth) { return; } score = ttEntry.GetScore(ply); if (ttEntry.Flag == TtUtil.FlagExact && flag == TtUtil.FlagExact) { if (score != bestScore) { Console.WriteLine($"exact-exact: TT-score {score} != bestScore {bestScore}"); } var move = ttEntry.Move; if (move != bestMove) { throw new ArgumentException( $"Error: TT-move {new MoveWrapper(move)} != bestMove {new MoveWrapper(bestMove)}"); } } else if (ttEntry.Flag == TtUtil.FlagLower && flag == TtUtil.FlagExact) { if (score - Margin > bestScore) { Console.WriteLine($"lower-exact: TT-score {score} > bestScore {bestScore}"); } } else if (ttEntry.Flag == TtUtil.FlagUpper && flag == TtUtil.FlagExact) { if (score + Margin < bestScore) { Console.WriteLine($"upper-exact: TT-score {score} < bestScore {bestScore}"); } } else if (ttEntry.Flag == TtUtil.FlagExact && flag == TtUtil.FlagLower) { if (score + Margin < bestScore) { Console.WriteLine($"exact-lower: TT-score {score} < bestScore {bestScore}"); } } else if (ttEntry.Flag == TtUtil.FlagExact && flag == TtUtil.FlagUpper) { if (score - Margin > bestScore) { Console.WriteLine($"exact-upper: TT-score {score} > bestScore {bestScore}"); } } else if (ttEntry.Flag == TtUtil.FlagUpper && flag == TtUtil.FlagLower) { if (score + Margin < bestScore) { Console.WriteLine($"upper-lower: TT-score {score} < bestScore {bestScore}"); } } else if (ttEntry.Flag == TtUtil.FlagLower && flag == TtUtil.FlagUpper) { if (score - Margin > bestScore) { Console.WriteLine($"lower-upper: TT-score {score} > bestScore {bestScore}"); } } }