Beispiel #1
0
 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);
 }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 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}");
                }
            }
        }