public static int CalculateScore(ChessBoard cb, ThreadData threadData) { var score = MaterialUtil.ScoreUnknown; if (BitOperations.PopCount((ulong)cb.AllPieces) <= 5) { score = MaterialUtil.IsDrawByMaterial(cb) ? EvalConstants.ScoreDraw : MaterialUtil.CalculateEndgameScore(cb); } if (score == MaterialUtil.ScoreUnknown) { score = TaperedEval(cb, threadData); if (score > 25) { score = AdjustEndgame(cb, score, White, threadData.MaterialCache); } else if (score < -25) { score = AdjustEndgame(cb, score, Black, threadData.MaterialCache); } } score *= ColorFactor[cb.ColorToMove]; if (EngineConstants.TestEvalCaches) { var cachedScore = EvalCacheUtil.GetScore(cb.ZobristKey, threadData.EvalCache); if (cachedScore != CacheMiss) { if (cachedScore != score) { throw new ArgumentException($"Cached eval score != score: {cachedScore}, {score}"); } } } EvalCacheUtil.AddValue(cb.ZobristKey, score, threadData.EvalCache); if (EngineConstants.TestEvalValues) { ChessBoardTestUtil.CompareScores(cb); } return(score); }
public static int GetScore(ChessBoard cb, ThreadData threadData) { if (Statistics.Enabled) { Statistics.EvalNodes++; } if (EngineConstants.EnableEvalCache && !EngineConstants.TestEvalCaches) { var score = EvalCacheUtil.GetScore(cb.ZobristKey, threadData.EvalCache); if (score != CacheMiss) { return(score); } } return(CalculateScore(cb, threadData)); }