From 1093047e7d72ed0c82e143c2cc0af9ef7b0380ed Mon Sep 17 00:00:00 2001 From: Alain SAVARD Date: Thu, 8 Mar 2018 20:04:33 -0500 Subject: [PATCH] Two steps slider threats on queen MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Allow a potential slider threat from a square currently occupied by a harmless attacker, just as the recent "knight on queen" patch. Also from not completely safe squares, use the mobilityArea instead of excluding all pawns for both SlidersOnQueen and KnightOnQueen We now compute the potential sliders threat on queen only if opponent has one queen. Run as SPRT [0,4] since it is some kind of simplification but maybe not clearly one. STC: http://tests.stockfishchess.org/tests/view/5aa1ddf10ebc590297cb63d8 LLR: 2.95 (-2.94,2.94) [0.00,4.00] Total: 22997 W: 4817 L: 4570 D: 13610 LTC: http://tests.stockfishchess.org/tests/view/5aa1fe6b0ebc590297cb63e5 LLR: 2.95 (-2.94,2.94) [0.00,4.00] Total: 11926 W: 1891 L: 1705 D: 8330 After this patch is committed, we may try to: • re-introduce some "threat by queen" bonus to make Stockfish's queen more aggressive (attacking aspect) • introduce a concept of "queen overload" to force the opponent queen into passivity and protecting duties (defensive aspect) • more generally, re-tune the queen mobility array since patches in the last three months have affected a lot the location/activity of queens. Closes https://github.com/official-stockfish/Stockfish/pull/1473 bench: 5788691 --- src/evaluate.cpp | 34 +++++++++++++--------------------- src/types.h | 1 - 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 1e5c588a..56c97594 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -172,10 +172,10 @@ namespace { const Score MinorBehindPawn = S( 16, 0); const Score PawnlessFlank = S( 20, 80); const Score RookOnPawn = S( 8, 24); + const Score SliderOnQueen = S( 42, 21); const Score ThreatByPawnPush = S( 47, 26); const Score ThreatByRank = S( 16, 3); const Score ThreatBySafePawn = S(175,168); - const Score ThreatOnQueen = S( 42, 21); const Score TrappedBishopA1H1 = S( 50, 50); const Score TrappedRook = S( 92, 0); const Score WeakQueen = S( 50, 10); @@ -211,7 +211,7 @@ namespace { // attackedBy[color][piece type] is a bitboard representing all squares // attacked by a given color and piece type. Special "piece types" which - // are also calculated are QUEEN_DIAGONAL and ALL_PIECES. + // is also calculated is ALL_PIECES. Bitboard attackedBy[COLOR_NB][PIECE_TYPE_NB]; // attackedBy2[color] are the squares attacked by 2 pieces of a given color, @@ -297,9 +297,6 @@ 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 @@ -314,9 +311,6 @@ namespace { attackedBy[Us][Pt] |= b; attackedBy[Us][ALL_PIECES] |= b; - if (Pt == QUEEN) - attackedBy[Us][QUEEN_DIAGONAL] |= b & PseudoAttacks[BISHOP][s]; - if (b & kingRing[Them]) { kingAttackersCount[Us]++; @@ -589,22 +583,20 @@ namespace { score += ThreatByPawnPush * popcount(b); - // Bonus for safe slider threats on the next move toward enemy 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 += ThreatOnQueen * popcount(b & safeThreats); - - // Bonus for knight threats on the next moves against enemy queen + // Bonus for threats on the next moves against enemy queen if (pos.count(Them) == 1) { - b = pos.attacks_from(pos.square(Them)) - & attackedBy[Us][KNIGHT] - & ~pos.pieces(Us, PAWN, KING) - & ~stronglyProtected; + Square s = pos.square(Them); + safeThreats = mobilityArea[Us] & ~stronglyProtected; + + b = attackedBy[Us][KNIGHT] & pos.attacks_from(s); + + score += KnightOnQueen * popcount(b & safeThreats); + + b = (attackedBy[Us][BISHOP] & pos.attacks_from(s)) + | (attackedBy[Us][ROOK ] & pos.attacks_from(s)); - score += KnightOnQueen * popcount(b); + score += SliderOnQueen * popcount(b & safeThreats & attackedBy2[Us]); } if (T) diff --git a/src/types.h b/src/types.h index 009a933a..3415a620 100644 --- a/src/types.h +++ b/src/types.h @@ -195,7 +195,6 @@ enum Value : int { enum PieceType { NO_PIECE_TYPE, PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING, ALL_PIECES = 0, - QUEEN_DIAGONAL = 7, PIECE_TYPE_NB = 8 }; -- 2.39.2