X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=8987b0ecd0a72cc7337404f604ecb951b254e889;hp=dd86f35ae112777165005860adf57ec51148f8e2;hb=e7289465b9ecb2ab93b240285f8ab677eea86aeb;hpb=01f2466f6eba4d4b28f0cd6ac7c2fd38d95b9401 diff --git a/src/evaluate.cpp b/src/evaluate.cpp index dd86f35a..8987b0ec 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -156,7 +156,8 @@ namespace { // ThreatBySafePawn[PieceType] contains bonuses according to which piece // type is attacked by a pawn which is protected or is not attacked. const Score ThreatBySafePawn[PIECE_TYPE_NB] = { - S(0, 0), S(0, 0), S(176, 139), S(131, 127), S(217, 218), S(203, 215) }; + S(0, 0), S(0, 0), S(176, 139), S(131, 127), S(217, 218), S(203, 215) + }; // Threat[by minor/by rook][attacked PieceType] contains // bonuses according to which piece type attacks which one. @@ -197,6 +198,9 @@ namespace { const Score Hanging = S(48, 27); const Score ThreatByPawnPush = S(38, 22); const Score Unstoppable = S( 0, 20); + const Score PawnlessFlank = S(20, 80); + const Score HinderPassedPawn = S( 7, 0); + const Score ThreatByRank = S(16, 3); // Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by // a friendly pawn on b2/g2 (b7/g7 for black). This can obviously only @@ -223,8 +227,8 @@ namespace { template void eval_init(const Position& pos, EvalInfo& ei) { - const Color Them = (Us == WHITE ? BLACK : WHITE); - const Square Down = (Us == WHITE ? DELTA_S : DELTA_N); + const Color Them = (Us == WHITE ? BLACK : WHITE); + const Square Down = (Us == WHITE ? SOUTH : NORTH); ei.pinnedPieces[Us] = pos.pinned_pieces(Us); Bitboard b = ei.attackedBy[Them][KING]; @@ -235,7 +239,7 @@ namespace { // Init king safety tables only if we are going to use them if (pos.non_pawn_material(Us) >= QueenValueMg) { - ei.kingRing[Them] = b | shift_bb(b); + ei.kingRing[Them] = b | shift(b); b &= ei.attackedBy[Us][PAWN]; ei.kingAttackersCount[Us] = popcount(b); ei.kingAdjacentZoneAttacksCount[Us] = ei.kingAttackersWeight[Us] = 0; @@ -321,7 +325,7 @@ namespace { && pos.is_chess960() && (s == relative_square(Us, SQ_A1) || s == relative_square(Us, SQ_H1))) { - Square d = pawn_push(Us) + (file_of(s) == FILE_A ? DELTA_E : DELTA_W); + Square d = pawn_push(Us) + (file_of(s) == FILE_A ? EAST : WEST); if (pos.piece_on(s + d) == make_piece(Us, PAWN)) score -= !pos.empty(s + d + pawn_push(Us)) ? TrappedBishopA1H1 * 4 : pos.piece_on(s + d + d) == make_piece(Us, PAWN) ? TrappedBishopA1H1 * 2 @@ -391,8 +395,8 @@ namespace { template Score evaluate_king(const Position& pos, const EvalInfo& ei) { - const Color Them = (Us == WHITE ? BLACK : WHITE); - const Square Up = (Us == WHITE ? DELTA_N : DELTA_S); + const Color Them = (Us == WHITE ? BLACK : WHITE); + const Square Up = (Us == WHITE ? NORTH : SOUTH); Bitboard undefended, b, b1, b2, safe, other; int kingDanger; @@ -419,11 +423,11 @@ namespace { // attacked and undefended squares around our king and the quality of // the pawn shelter (current 'score' value). kingDanger = std::min(807, ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them]) - + 101 * ei.kingAdjacentZoneAttacksCount[Them] - + 235 * popcount(undefended) - + 134 * (popcount(b) + !!ei.pinnedPieces[Us]) - - 717 * !pos.count(Them) - - 7 * mg_value(score) / 5 - 5; + + 101 * ei.kingAdjacentZoneAttacksCount[Them] + + 235 * popcount(undefended) + + 134 * (popcount(b) + !!ei.pinnedPieces[Us]) + - 717 * !pos.count(Them) + - 7 * mg_value(score) / 5 - 5; // Analyse the enemy's safe queen contact checks. Firstly, find the // undefended squares around the king reachable by the enemy queen... @@ -438,7 +442,7 @@ namespace { // ... and some other potential checks, only requiring the square to be // safe from pawn-attacks, and not being occupied by a blocked pawn. other = ~( ei.attackedBy[Us][PAWN] - | (pos.pieces(Them, PAWN) & shift_bb(pos.pieces(PAWN)))); + | (pos.pieces(Them, PAWN) & shift(pos.pieces(PAWN)))); b1 = pos.attacks_from(ksq); b2 = pos.attacks_from(ksq); @@ -481,7 +485,8 @@ namespace { } // King tropism: firstly, find squares that opponent attacks in our king flank - b = ei.attackedBy[Them][ALL_PIECES] & KingFlank[Us][file_of(ksq)]; + File kf = file_of(ksq); + b = ei.attackedBy[Them][ALL_PIECES] & KingFlank[Us][kf]; assert(((Us == WHITE ? b << 4 : b >> 4) & b) == 0); assert(popcount(Us == WHITE ? b << 4 : b >> 4) == popcount(b)); @@ -493,6 +498,10 @@ namespace { score -= CloseEnemies * popcount(b); + // Penalty when our king is on a pawnless flank + if (!(pos.pieces(PAWN) & (KingFlank[WHITE][kf] | KingFlank[BLACK][kf]))) + score -= PawnlessFlank; + if (DoTrace) Trace::add(KING, Us, score); @@ -506,12 +515,12 @@ namespace { template Score evaluate_threats(const Position& pos, const EvalInfo& ei) { - const Color Them = (Us == WHITE ? BLACK : WHITE); - const Square Up = (Us == WHITE ? DELTA_N : DELTA_S); - const Square Left = (Us == WHITE ? DELTA_NW : DELTA_SE); - const Square Right = (Us == WHITE ? DELTA_NE : DELTA_SW); - const Bitboard TRank2BB = (Us == WHITE ? Rank2BB : Rank7BB); - const Bitboard TRank7BB = (Us == WHITE ? Rank7BB : Rank2BB); + const Color Them = (Us == WHITE ? BLACK : WHITE); + const Square Up = (Us == WHITE ? NORTH : SOUTH); + const Square Left = (Us == WHITE ? NORTH_WEST : SOUTH_EAST); + const Square Right = (Us == WHITE ? NORTH_EAST : SOUTH_WEST); + const Bitboard TRank2BB = (Us == WHITE ? Rank2BB : Rank7BB); + const Bitboard TRank7BB = (Us == WHITE ? Rank7BB : Rank2BB); enum { Minor, Rook }; @@ -531,7 +540,7 @@ namespace { b = pos.pieces(Us, PAWN) & ( ~ei.attackedBy[Them][ALL_PIECES] | ei.attackedBy[Us][ALL_PIECES]); - safeThreats = (shift_bb(b) | shift_bb(b)) & weak; + safeThreats = (shift(b) | shift(b)) & weak; if (weak ^ safeThreats) score += ThreatByHangingPawn; @@ -553,11 +562,21 @@ namespace { { b = (defended | weak) & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]); while (b) - score += Threat[Minor][type_of(pos.piece_on(pop_lsb(&b)))]; + { + Square s = pop_lsb(&b); + score += Threat[Minor][type_of(pos.piece_on(s))]; + if (type_of(pos.piece_on(s)) != PAWN) + score += ThreatByRank * (int)relative_rank(Them, s); + } b = (pos.pieces(Them, QUEEN) | weak) & ei.attackedBy[Us][ROOK]; while (b) - score += Threat[Rook ][type_of(pos.piece_on(pop_lsb(&b)))]; + { + Square s = pop_lsb(&b); + score += Threat[Rook][type_of(pos.piece_on(s))]; + if (type_of(pos.piece_on(s)) != PAWN) + score += ThreatByRank * (int)relative_rank(Them, s); + } score += Hanging * popcount(weak & ~ei.attackedBy[Them][ALL_PIECES]); @@ -568,13 +587,13 @@ namespace { // Bonus if some pawns can safely push and attack an enemy piece b = pos.pieces(Us, PAWN) & ~TRank7BB; - b = shift_bb(b | (shift_bb(b & TRank2BB) & ~pos.pieces())); + b = shift(b | (shift(b & TRank2BB) & ~pos.pieces())); b &= ~pos.pieces() & ~ei.attackedBy[Them][PAWN] & (ei.attackedBy[Us][ALL_PIECES] | ~ei.attackedBy[Them][ALL_PIECES]); - b = (shift_bb(b) | shift_bb(b)) + b = (shift(b) | shift(b)) & pos.pieces(Them) & ~ei.attackedBy[Us][PAWN]; @@ -594,7 +613,7 @@ namespace { const Color Them = (Us == WHITE ? BLACK : WHITE); - Bitboard b, squaresToQueen, defendedSquares, unsafeSquares; + Bitboard b, bb, squaresToQueen, defendedSquares, unsafeSquares; Score score = SCORE_ZERO; b = ei.pi->passed_pawns(Us); @@ -606,6 +625,9 @@ namespace { assert(pos.pawn_passed(Us, s)); assert(!(pos.pieces(PAWN) & forward_bb(Us, s))); + bb = forward_bb(Us, s) & (ei.attackedBy[Them][ALL_PIECES] | pos.pieces(Them)); + score -= HinderPassedPawn * popcount(bb); + int r = relative_rank(Us, s) - RANK_2; int rr = r * (r - 1); @@ -631,7 +653,7 @@ namespace { // in the pawn's path attacked or occupied by the enemy. defendedSquares = unsafeSquares = squaresToQueen = forward_bb(Us, s); - Bitboard bb = forward_bb(Them, s) & pos.pieces(ROOK, QUEEN) & pos.attacks_from(s); + bb = forward_bb(Them, s) & pos.pieces(ROOK, QUEEN) & pos.attacks_from(s); if (!(pos.pieces(Us) & bb)) defendedSquares &= ei.attackedBy[Us][ALL_PIECES]; @@ -803,8 +825,8 @@ Value Eval::evaluate(const Position& pos) { // Pawns blocked or on ranks 2 and 3 will be excluded from the mobility area Bitboard blockedPawns[] = { - pos.pieces(WHITE, PAWN) & (shift_bb(pos.pieces()) | Rank2BB | Rank3BB), - pos.pieces(BLACK, PAWN) & (shift_bb(pos.pieces()) | Rank7BB | Rank6BB) + pos.pieces(WHITE, PAWN) & (shift(pos.pieces()) | Rank2BB | Rank3BB), + pos.pieces(BLACK, PAWN) & (shift(pos.pieces()) | Rank7BB | Rank6BB) }; // Do not include in mobility area squares protected by enemy pawns, or occupied