X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=e470e61350ca268fdced0c37e8b186448aed535b;hp=ee93f11f13cda2b3e776221282534969c18512ed;hb=2acda1fde3e1542a0b1bfc5a0885559e6daf142a;hpb=0dc3b0978dca0459ceb483ada3792080f4caad15 diff --git a/src/evaluate.cpp b/src/evaluate.cpp index ee93f11f..e470e613 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -211,23 +211,24 @@ namespace { const Score KingProtector[] = { S(-3, -5), S(-4, -3), S(-3, 0), S(-1, 1) }; // Assorted bonuses and penalties used by evaluation - const Score MinorBehindPawn = S( 16, 0); - const Score BishopPawns = S( 8, 12); - const Score LongRangedBishop = S( 22, 0); - const Score RookOnPawn = S( 8, 24); - const Score TrappedRook = S( 92, 0); - const Score WeakQueen = S( 50, 10); - const Score OtherCheck = S( 10, 10); - const Score CloseEnemies = S( 7, 0); - const Score PawnlessFlank = S( 20, 80); - const Score ThreatByHangingPawn = S( 71, 61); - const Score ThreatBySafePawn = S(192,175); - const Score ThreatByRank = S( 16, 3); - const Score Hanging = S( 48, 27); - const Score WeakUnopposedPawn = S( 5, 25); - const Score ThreatByPawnPush = S( 38, 22); - const Score HinderPassedPawn = S( 7, 0); - const Score TrappedBishopA1H1 = S( 50, 50); + const Score MinorBehindPawn = S( 16, 0); + const Score BishopPawns = S( 8, 12); + const Score LongRangedBishop = S( 22, 0); + const Score RookOnPawn = S( 8, 24); + const Score TrappedRook = S( 92, 0); + const Score WeakQueen = S( 50, 10); + const Score OtherCheck = S( 10, 10); + const Score CloseEnemies = S( 7, 0); + const Score PawnlessFlank = S( 20, 80); + const Score ThreatByHangingPawn = S( 71, 61); + const Score ThreatBySafePawn = S(192,175); + const Score ThreatByRank = S( 16, 3); + const Score Hanging = S( 48, 27); + const Score WeakUnopposedPawn = S( 5, 25); + const Score ThreatByPawnPush = S( 38, 22); + const Score ThreatByAttackOnQueen = S( 38, 22); + const Score HinderPassedPawn = S( 7, 0); + const Score TrappedBishopA1H1 = S( 50, 50); #undef S #undef V @@ -303,6 +304,9 @@ namespace { attackedBy[Us][Pt] = 0; + if (Pt == QUEEN) + attackedBy[Us][QUEEN_DIAGONAL] = 0; + while ((s = *pl++) != SQ_NONE) { // Find attacked squares, including x-ray attacks for bishops and rooks @@ -316,6 +320,9 @@ namespace { attackedBy2[Us] |= attackedBy[Us][ALL_PIECES] & b; attackedBy[Us][ALL_PIECES] |= attackedBy[Us][Pt] |= b; + if (Pt == QUEEN) + attackedBy[Us][QUEEN_DIAGONAL] |= b & PseudoAttacks[BISHOP][s]; + if (b & kingRing[Them]) { kingAttackersCount[Us]++; @@ -335,12 +342,12 @@ namespace { // Bonus for outpost squares bb = OutpostRanks & ~pe->pawn_attacks_span(Them); if (bb & s) - score += Outpost[Pt == BISHOP][!!(attackedBy[Us][PAWN] & s)] * 2; + score += Outpost[Pt == BISHOP][bool(attackedBy[Us][PAWN] & s)] * 2; else { bb &= b & ~pos.pieces(Us); if (bb) - score += Outpost[Pt == BISHOP][!!(attackedBy[Us][PAWN] & bb)]; + score += Outpost[Pt == BISHOP][bool(attackedBy[Us][PAWN] & bb)]; } // Bonus when behind a pawn @@ -381,7 +388,7 @@ namespace { // Bonus when on an open or semi-open file if (pe->semiopen_file(Us, file_of(s))) - score += RookOnFile[!!pe->semiopen_file(Them, file_of(s))]; + score += RookOnFile[bool(pe->semiopen_file(Them, file_of(s)))]; // Penalty when trapped by the king, even more if the king cannot castle else if (mob <= 3) @@ -421,7 +428,7 @@ namespace { : AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB); const Square ksq = pos.square(Us); - Bitboard kingOnlyDefended, undefended, b, b1, b2, safe, other; + Bitboard weak, b, b1, b2, safe, other; int kingDanger; // King shelter and enemy pawns storm @@ -430,16 +437,10 @@ namespace { // Main king safety evaluation if (kingAttackersCount[Them] > (1 - pos.count(Them))) { - // Find the attacked squares which are defended only by our king... - kingOnlyDefended = attackedBy[Them][ALL_PIECES] - & attackedBy[Us][KING] - & ~attackedBy2[Us]; - - // ... and those which are not defended at all in the larger king ring - undefended = attackedBy[Them][ALL_PIECES] - & ~attackedBy[Us][ALL_PIECES] - & kingRing[Us] - & ~pos.pieces(Them); + // Attacked squares defended at most once by our queen or king + weak = attackedBy[Them][ALL_PIECES] + & ~attackedBy2[Us] + & (attackedBy[Us][KING] | attackedBy[Us][QUEEN] | ~attackedBy[Us][ALL_PIECES]); // Initialize the 'kingDanger' variable, which will be transformed // later into a king danger score. The initial value is based on the @@ -448,29 +449,23 @@ namespace { // the quality of the pawn shelter (current 'score' value). kingDanger = kingAttackersCount[Them] * kingAttackersWeight[Them] + 102 * kingAdjacentZoneAttacksCount[Them] - + 191 * popcount(kingOnlyDefended | undefended) - + 143 * !!pos.pinned_pieces(Us) + + 191 * popcount(kingRing[Us] & weak) + + 143 * bool(pos.pinned_pieces(Us)) - 848 * !pos.count(Them) - 9 * mg_value(score) / 8 + 40; // Analyse the safe enemy's checks which are possible on next move safe = ~pos.pieces(Them); - safe &= ~attackedBy[Us][ALL_PIECES] | (kingOnlyDefended & attackedBy2[Them]); + safe &= ~attackedBy[Us][ALL_PIECES] | (weak & attackedBy2[Them]); b1 = pos.attacks_from< ROOK>(ksq); b2 = pos.attacks_from(ksq); // Enemy queen safe checks - if ((b1 | b2) & attackedBy[Them][QUEEN] & safe) + if ((b1 | b2) & attackedBy[Them][QUEEN] & safe & ~attackedBy[Us][QUEEN]) kingDanger += QueenCheck; - // For minors and rooks, also consider the square safe if attacked twice, - // and only defended by our queen. - safe |= attackedBy2[Them] - & ~(attackedBy2[Us] | pos.pieces(Them)) - & attackedBy[Us][QUEEN]; - // Some other potential checks are also analysed, even from squares // currently occupied by the opponent own pieces, as long as the square // is not attacked by our pawns, and is not occupied by a blocked pawn. @@ -621,6 +616,13 @@ namespace { score += ThreatByPawnPush * popcount(b); + // Add a bonus for safe slider attack threats on opponent queen + safeThreats = ~pos.pieces(Us) & ~attackedBy2[Them] & attackedBy2[Us]; + b = (attackedBy[Us][BISHOP] & attackedBy[Them][QUEEN_DIAGONAL]) + | (attackedBy[Us][ROOK ] & attackedBy[Them][QUEEN] & ~attackedBy[Them][QUEEN_DIAGONAL]); + + score += ThreatByAttackOnQueen * popcount(b & safeThreats); + if (T) Trace::add(THREAT, Us, score);