Example #1
0
        public static int Evaluate(BoardState board, int color, int openingPhase, int endingPhase)
        {
            var positionOpeningScore = board.Position[color][GamePhase.Opening];
            var positionEndingScore  = board.Position[color][GamePhase.Ending];

            return(TaperedEvaluation.AdjustToPhase(positionOpeningScore, positionEndingScore, openingPhase, endingPhase));
        }
        public static int Evaluate(BoardState board, int color, int openingPhase, int endingPhase)
        {
            var kingSidePawnsPattern   = color == Color.White ? KingSideWhitePawnsPattern : KingSideBlackPawnsPattern;
            var kingSideBishopPattern  = color == Color.White ? KingSideWhiteBishopPattern : KingSideBlackBishopPattern;
            var queenSidePawnsPattern  = color == Color.White ? QueenSideWhitePawnsPattern : QueenSideBlackPawnsPattern;
            var queenSideBishopPattern = color == Color.White ? QueenSideWhiteBishopPattern : QueenSideBlackBishopPattern;

            var pawns   = board.Pieces[color][Piece.Pawn];
            var bishops = board.Pieces[color][Piece.Bishop];

            var fianchettoOpeningScore        = EvaluationConstants.Fianchetto;
            var fianchettoPenaltyOpeningScore = EvaluationConstants.FianchettoWithoutBishop;

            if ((pawns & kingSidePawnsPattern) == kingSidePawnsPattern)
            {
                if ((bishops & kingSideBishopPattern) == kingSideBishopPattern)
                {
                    return(TaperedEvaluation.AdjustToPhase(fianchettoOpeningScore, 0, openingPhase, endingPhase));
                }

                return(TaperedEvaluation.AdjustToPhase(fianchettoPenaltyOpeningScore, 0, openingPhase, endingPhase));
            }

            if ((pawns & queenSidePawnsPattern) == queenSidePawnsPattern)
            {
                if ((bishops & queenSideBishopPattern) == queenSideBishopPattern)
                {
                    return(TaperedEvaluation.AdjustToPhase(fianchettoOpeningScore, 0, openingPhase, endingPhase));
                }

                return(TaperedEvaluation.AdjustToPhase(fianchettoPenaltyOpeningScore, 0, openingPhase, endingPhase));
            }

            return(0);
        }
Example #3
0
        public static int Evaluate(BoardState board, int color, int openingPhase, int endingPhase)
        {
            var pairOfBishops = 0;

            if (BitOperations.Count(board.Pieces[color][Piece.Bishop]) > 1)
            {
                pairOfBishops = 1;
            }

            var fianchettos = 0;
            var fianchettosWithoutBishop = 0;
            var kingPattern   = color == Color.White ? WhiteKingFianchettoPattern : BlackKingFianchettoPatteren;
            var pawnsPattern  = color == Color.White ? WhitePawnsFianchettoPattern : BlackPawnsFianchettoPattern;
            var bishopPattern = color == Color.White ? WhiteBishopFianchettoPattern : BlackBishopFianchettoPattern;

            if (board.CastlingDone[color] && (board.Pieces[color][Piece.King] & kingPattern) != 0 && (board.Pieces[color][Piece.Pawn] & pawnsPattern) == pawnsPattern)
            {
                if ((board.Pieces[color][Piece.Bishop] & bishopPattern) == bishopPattern)
                {
                    fianchettos++;
                }
                else
                {
                    fianchettosWithoutBishop++;
                }
            }

            var pairOfBishopsOpeningScore     = pairOfBishops * EvaluationConstants.PairOfBishops;
            var fianchettosScore              = fianchettos * EvaluationConstants.Fianchetto;
            var fianchettosWithoutBishopScore = fianchettosWithoutBishop * EvaluationConstants.FianchettoWithoutBishop;
            var openingScore = pairOfBishopsOpeningScore + fianchettosScore + fianchettosWithoutBishopScore;

            return(TaperedEvaluation.AdjustToPhase(openingScore, 0, openingPhase, endingPhase));
        }
Example #4
0
        public static int EvaluateWithoutCache(BoardState board, EvaluationStatistics statistics, int openingPhase, int endingPhase)
        {
            var(openingWhiteScore, endingWhiteScore) = Evaluate(board, Color.White, openingPhase, endingPhase);
            var(openingBlackScore, endingBlackScore) = Evaluate(board, Color.Black, openingPhase, endingPhase);

            var openingScore = openingWhiteScore - openingBlackScore;
            var endingScore  = endingWhiteScore - endingBlackScore;

            return(TaperedEvaluation.AdjustToPhase(openingScore, endingScore, openingPhase, endingPhase));
        }
        public static int Evaluate(BoardState board, int color, int openingPhase, int endingPhase, ref ulong fieldsAttackedByColor)
        {
            var mobility = KnightOperator.GetMobility(board, color, ref fieldsAttackedByColor) +
                           BishopOperator.GetMobility(board, color, ref fieldsAttackedByColor) +
                           RookOperator.GetMobility(board, color, ref fieldsAttackedByColor) +
                           QueenOperator.GetMobility(board, color, ref fieldsAttackedByColor);

            var mobilityOpeningScore = mobility * EvaluationConstants.Mobility;

            return(TaperedEvaluation.AdjustToPhase(mobilityOpeningScore, 0, openingPhase, endingPhase));
        }
Example #6
0
        public static int Evaluate(BoardState board, int color, int openingPhase, int endingPhase)
        {
            var doubledRooks    = 0;
            var rooksOnOpenFile = 0;
            var pairOfBishops   = 0;
            var enemyColor      = ColorOperations.Invert(color);

            var rooks = board.Pieces[color][Piece.Rook];

            while (rooks != 0)
            {
                var lsb   = BitOperations.GetLsb(rooks);
                var field = BitOperations.BitScan(lsb);
                rooks = BitOperations.PopLsb(rooks);

                var file                = FilePatternGenerator.GetPattern(field) | lsb;
                var rooksOnFile         = file & board.Pieces[color][Piece.Rook];
                var friendlyPawnsOnFile = file & board.Pieces[color][Piece.Pawn];
                var enemyPawnsOnFile    = file & board.Pieces[enemyColor][Piece.Pawn];

                if (BitOperations.Count(rooksOnFile) > 1)
                {
                    // We don't assume that there will be more than two rooks - even if, then this color is probably anyway winning
                    doubledRooks = 1;
                }

                if (friendlyPawnsOnFile == 0 && enemyPawnsOnFile == 0)
                {
                    rooksOnOpenFile++;
                }
            }

            var bishops = board.Pieces[color][Piece.Bishop];

            if (BitOperations.Count(bishops) > 1)
            {
                pairOfBishops = 1;
            }

            var doubledRooksOpeningScore = doubledRooks * EvaluationConstants.DoubledRooks;
            var doubledRooksAdjusted     = TaperedEvaluation.AdjustToPhase(doubledRooksOpeningScore, 0, openingPhase, endingPhase);

            var rooksOnOpenFileOpeningScore = rooksOnOpenFile * EvaluationConstants.RookOnOpenFile;
            var rooksOnOpenFileAdjusted     = TaperedEvaluation.AdjustToPhase(rooksOnOpenFileOpeningScore, 0, openingPhase, endingPhase);

            var pairOfBishopsOpeningScore = pairOfBishops * EvaluationConstants.PairOfBishops;
            var pairOfBishopsAdjusted     = TaperedEvaluation.AdjustToPhase(pairOfBishopsOpeningScore, 0, openingPhase, endingPhase);

            return(doubledRooksAdjusted + rooksOnOpenFileAdjusted + pairOfBishopsAdjusted);
        }
Example #7
0
        public static int Evaluate(BoardState board, int color, int openingPhase, int endingPhase, ref ulong fieldsAttackedByColor)
        {
            var(knightCenter, knightOutside) = KnightOperator.GetMobility(board, color, ref fieldsAttackedByColor);
            var(bishopCenter, bishopOutside) = BishopOperator.GetMobility(board, color, ref fieldsAttackedByColor);
            var(rookCenter, rookOutside)     = RookOperator.GetMobility(board, color, ref fieldsAttackedByColor);
            var(queenCenter, queenOutside)   = QueenOperator.GetMobility(board, color, ref fieldsAttackedByColor);

            var centerMobility      = knightCenter + bishopCenter + rookCenter + queenCenter;
            var centerMobilityScore = centerMobility * EvaluationConstants.CenterMobilityModifier;

            var outsideMobility      = knightOutside + bishopOutside + rookOutside + queenOutside;
            var outsideMobilityScore = outsideMobility * EvaluationConstants.OutsideMobilityModifier;

            var openingScore = centerMobilityScore + outsideMobilityScore;

            return(TaperedEvaluation.AdjustToPhase(openingScore, 0, openingPhase, endingPhase));
        }
Example #8
0
        public static int Evaluate(BoardState board, int color, int openingPhase, int endingPhase)
        {
            if (board.CastlingDone[color])
            {
                var openingScore = EvaluationConstants.CastlingDone;
                return(TaperedEvaluation.AdjustToPhase(openingScore, 0, openingPhase, endingPhase));
            }

            if (color == Color.White && (board.Castling & Castling.WhiteCastling) == 0 ||
                color == Color.Black && (board.Castling & Castling.BlackCastling) == 0)
            {
                var openingScore = EvaluationConstants.CastlingFailed;
                return(TaperedEvaluation.AdjustToPhase(openingScore, 0, openingPhase, endingPhase));
            }

            return(0);
        }
        public static int Evaluate(BoardState board, int color, int openingPhase, int endingPhase, ulong fieldsAttackedByEnemy)
        {
            var king             = board.Pieces[color][Piece.King];
            var kingField        = BitOperations.BitScan(king);
            var fieldsAroundKing = _kingSafetyMask[color][kingField];

            var attackedFieldsAroundKing = fieldsAroundKing & fieldsAttackedByEnemy;
            var attackersCount           = (int)BitOperations.Count(attackedFieldsAroundKing);

            var pawnsNearKing = fieldsAroundKing & board.Pieces[color][Piece.Pawn];
            var pawnShield    = (int)BitOperations.Count(pawnsNearKing);

            var attackersCountOpeningScore = attackersCount * EvaluationConstants.KingInDanger;
            var attackersCountAdjusted     = TaperedEvaluation.AdjustToPhase(attackersCountOpeningScore, 0, openingPhase, endingPhase);

            var pawnShieldOpeningScore = pawnShield * EvaluationConstants.PawnShield;
            var pawnShieldAdjusted     = TaperedEvaluation.AdjustToPhase(pawnShieldOpeningScore, 0, openingPhase, endingPhase);

            return(attackersCountAdjusted + pawnShieldAdjusted);
        }
Example #10
0
        public static int Evaluate(BoardState board, int color, int openingPhase, int endingPhase, ulong fieldsAttackedByEnemy)
        {
            var enemyColor = ColorOperations.Invert(color);

            var king             = board.Pieces[color][Piece.King];
            var kingField        = BitOperations.BitScan(king);
            var kingPosition     = Position.FromFieldIndex(kingField);
            var fieldsAroundKing = ForwardBoxPatternGenerator.GetPattern(color, kingField);

            var attackedFieldsAroundKing   = fieldsAroundKing & fieldsAttackedByEnemy;
            var attackersCount             = (int)BitOperations.Count(attackedFieldsAroundKing);
            var attackersCountOpeningScore = attackersCount * EvaluationConstants.KingInDanger;

            var pawnShieldOpeningScore   = 0;
            var openFilesNextToKingScore = 0;

            if (board.CastlingDone[color])
            {
                var pawnsNearKing = fieldsAroundKing & board.Pieces[color][Piece.Pawn];
                var pawnShield    = (int)BitOperations.Count(pawnsNearKing);

                pawnShieldOpeningScore = pawnShield * EvaluationConstants.PawnShield;

                var openFileCheckFrom = Math.Max(0, kingPosition.X - 1);
                var openFileCheckTo   = Math.Min(7, kingPosition.X + 1);
                for (var file = openFileCheckFrom; file <= openFileCheckTo; file++)
                {
                    if ((FilePatternGenerator.GetPatternForFile(7 - file) & board.Pieces[color][Piece.Pawn]) == 0)
                    {
                        openFilesNextToKingScore += EvaluationConstants.OpenFileNextToKing;
                    }
                }
            }

            var openingScore = pawnShieldOpeningScore + attackersCountOpeningScore + openFilesNextToKingScore;

            return(TaperedEvaluation.AdjustToPhase(openingScore, 0, openingPhase, endingPhase));
        }
Example #11
0
        public static int Evaluate(BoardState board, EvaluationStatistics statistics, int openingPhase, int endingPhase)
        {
            var entry = PawnHashTable.Get(board.PawnHash);

            if (entry.IsKeyValid(board.PawnHash))
            {
#if DEBUG
                statistics.PHTHits++;
#endif
                return(TaperedEvaluation.AdjustToPhase(entry.OpeningScore, entry.EndingScore, openingPhase, endingPhase));
            }
#if DEBUG
            else
            {
                statistics.PHTNonHits++;

                if (entry.Key != 0 || entry.OpeningScore != 0 || entry.EndingScore != 0)
                {
                    statistics.PHTReplacements++;
                }
            }
#endif

            var(openingWhiteScore, endingWhiteScore) = Evaluate(board, Color.White, openingPhase, endingPhase);
            var(openingBlackScore, endingBlackScore) = Evaluate(board, Color.Black, openingPhase, endingPhase);

            var openingScore = openingWhiteScore - openingBlackScore;
            var endingScore  = endingWhiteScore - endingBlackScore;
            var result       = TaperedEvaluation.AdjustToPhase(openingScore, endingScore, openingPhase, endingPhase);

            PawnHashTable.Add(board.PawnHash, (short)openingScore, (short)endingScore);

#if DEBUG
            statistics.PHTAddedEntries++;
#endif
            return(result);
        }
        public static int Evaluate(BoardState board, int color, int openingPhase, int endingPhase)
        {
            var doubledPawns  = 0;
            var isolatedPawns = 0;
            var chainedPawns  = 0;
            var passingPawns  = 0;
            var enemyColor    = ColorOperations.Invert(color);

            for (var file = 0; file < 8; file++)
            {
                var friendlyPawnsOnInnerMask = board.Pieces[color][Piece.Pawn] & _innerFileMasks[file];
                var friendlyPawnsOnOuterMask = board.Pieces[color][Piece.Pawn] & _outerFileMasks[file];
                var enemyPawnsOnInnerMask    = board.Pieces[enemyColor][Piece.Pawn] & _innerFileMasks[file];
                var enemyPawnsOnOuterMask    = board.Pieces[enemyColor][Piece.Pawn] & _outerFileMasks[file];

                var pawnsCount = BitOperations.Count(friendlyPawnsOnInnerMask);
                if (pawnsCount > 1)
                {
                    doubledPawns += (int)(pawnsCount - 1);
                }

                if (friendlyPawnsOnInnerMask != 0)
                {
                    if (friendlyPawnsOnOuterMask == 0)
                    {
                        isolatedPawns += (int)BitOperations.Count(pawnsCount);
                    }

                    if (enemyPawnsOnInnerMask == 0 && enemyPawnsOnOuterMask == 0)
                    {
                        passingPawns++;
                    }
                }
            }

            var pieces = board.Pieces[color][Piece.Pawn];

            while (pieces != 0)
            {
                var lsb   = BitOperations.GetLsb(pieces);
                var field = BitOperations.BitScan(lsb);
                pieces = BitOperations.PopLsb(pieces);

                var chain = _chainMasks[field] & board.Pieces[color][Piece.Pawn];
                if (chain != 0)
                {
                    chainedPawns += (int)BitOperations.Count(chain);
                }
            }

            var doubledPawnsOpeningScore = doubledPawns * EvaluationConstants.DoubledPawns[GamePhase.Opening];
            var doubledPawnsEndingScore  = doubledPawns * EvaluationConstants.DoubledPawns[GamePhase.Ending];
            var doubledPawnsAdjusted     = TaperedEvaluation.AdjustToPhase(doubledPawnsOpeningScore, doubledPawnsEndingScore, openingPhase, endingPhase);

            var isolatedPawnsOpeningScore = isolatedPawns * EvaluationConstants.IsolatedPawns[GamePhase.Opening];
            var isolatedPawnsEndingScore  = isolatedPawns * EvaluationConstants.IsolatedPawns[GamePhase.Ending];
            var isolatedPawnsAdjusted     = TaperedEvaluation.AdjustToPhase(isolatedPawnsOpeningScore, isolatedPawnsEndingScore, openingPhase, endingPhase);

            var chainedPawnsOpeningScore = chainedPawns * EvaluationConstants.ChainedPawns[GamePhase.Opening];
            var chainedPawnsEndingScore  = chainedPawns * EvaluationConstants.ChainedPawns[GamePhase.Ending];
            var chainedPawnsAdjusted     = TaperedEvaluation.AdjustToPhase(chainedPawnsOpeningScore, chainedPawnsEndingScore, openingPhase, endingPhase);

            var passingPawnsOpeningScore = passingPawns * EvaluationConstants.PassingPawns[GamePhase.Opening];
            var passingPawnsEndingScore  = passingPawns * EvaluationConstants.PassingPawns[GamePhase.Ending];
            var passingPawnsAdjusted     = TaperedEvaluation.AdjustToPhase(passingPawnsOpeningScore, passingPawnsEndingScore, openingPhase, endingPhase);

            return(doubledPawnsAdjusted + isolatedPawnsAdjusted + chainedPawnsAdjusted + passingPawnsAdjusted);
        }