From f435c8685baae81ec461df15dcddfb3382d2ecaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20C=C3=A1ceres?= Date: Sat, 11 Jan 2025 17:39:19 +0100 Subject: [PATCH] Add simplies incrmeental bishop pair implementation --- src/Lynx/Model/Position.cs | 51 ++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/src/Lynx/Model/Position.cs b/src/Lynx/Model/Position.cs index 8628751ea..ff9a29049 100644 --- a/src/Lynx/Model/Position.cs +++ b/src/Lynx/Model/Position.cs @@ -129,6 +129,18 @@ public GameState MakeMove(Move move) if (promotedPiece != default) { newPiece = promotedPiece; + + //if (_isIncrementalEval && PieceBitBoards[(int)Piece.B + offset] != 0) + //{ + // if (promotedPiece == (int)Piece.B) + // { + // _incrementalEvalAccumulator += BishopPairBonus; + // } + // else if (promotedPiece == (int)Piece.b) + // { + // _incrementalEvalAccumulator -= BishopPairBonus; + // } + //} } PieceBitBoards[piece].PopBit(sourceSquare); @@ -184,6 +196,23 @@ public GameState MakeMove(Move move) _incrementalEvalAccumulator -= PSQT(0, opposideSideBucket, capturedPiece, capturedSquare); _incrementalEvalAccumulator -= PSQT(1, sameSideBucket, capturedPiece, capturedSquare); + + // Remove bishop bonus when a bishop is captured and the other bishop is still on the board + // We'll ignote bishop promotions for now + if (capturedPiece == (int)Piece.B) + { + if (PieceBitBoards[capturedPiece] != 0) + { + _incrementalEvalAccumulator -= BishopPairBonus; + } + } + else if (capturedPiece == (int)Piece.b) + { + if (PieceBitBoards[capturedPiece] != 0) + { + _incrementalEvalAccumulator += BishopPairBonus; + } + } } break; @@ -663,6 +692,17 @@ public bool WasProduceByAValidMove() + PSQT(0, blackBucket, (int)Piece.k, blackKing) + PSQT(1, whiteBucket, (int)Piece.k, blackKing); + // Bishop pair bonus + if (PieceBitBoards[(int)Piece.B].CountBits() >= 2) + { + _incrementalEvalAccumulator += BishopPairBonus; + } + + if (PieceBitBoards[(int)Piece.b].CountBits() >= 2) + { + _incrementalEvalAccumulator -= BishopPairBonus; + } + packedScore += _incrementalEvalAccumulator; _isIncrementalEval = true; } @@ -671,17 +711,6 @@ public bool WasProduceByAValidMove() KingAdditionalEvaluation(whiteKing, (int)Side.White, blackPawnAttacks) - KingAdditionalEvaluation(blackKing, (int)Side.Black, whitePawnAttacks); - // Bishop pair bonus - if (PieceBitBoards[(int)Piece.B].CountBits() >= 2) - { - packedScore += BishopPairBonus; - } - - if (PieceBitBoards[(int)Piece.b].CountBits() >= 2) - { - packedScore -= BishopPairBonus; - } - // Pieces attacked by pawns bonus packedScore += PieceAttackedByPawnPenalty * ((blackPawnAttacks & OccupancyBitBoards[(int)Side.White] /* & (~whitePawns) */).CountBits()