X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=e39bcb4a8e99721820fa637151ace370d009f5d9;hp=64e0eca40d748b335086d40100906ddd718fcd62;hb=06a8fd2154db41c4e438a1b065c1471d0dfd5815;hpb=759b3c79cf94d101163f646b1eb2a9f9c64293ab diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 64e0eca4..e39bcb4a 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -28,8 +28,7 @@ #include "evaluate.h" #include "material.h" #include "pawns.h" - -std::atomic Eval::Contempt; +#include "thread.h" namespace Trace { @@ -275,6 +274,12 @@ namespace { if (relative_rank(Us, pos.square(Us)) == RANK_1) kingRing[Us] |= shift(kingRing[Us]); + if (file_of(pos.square(Us)) == FILE_H) + kingRing[Us] |= shift(kingRing[Us]); + + else if (file_of(pos.square(Us)) == FILE_A) + kingRing[Us] |= shift(kingRing[Us]); + kingAttackersCount[Them] = popcount(attackedBy[Us][KING] & pe->pawn_attacks(Them)); kingAttacksCount[Them] = kingAttackersWeight[Them] = 0; } @@ -289,7 +294,7 @@ namespace { constexpr Color Them = (Us == WHITE ? BLACK : WHITE); constexpr Bitboard OutpostRanks = (Us == WHITE ? Rank4BB | Rank5BB | Rank6BB - : Rank5BB | Rank4BB | Rank3BB); + : Rank5BB | Rank4BB | Rank3BB); const Square* pl = pos.squares(Us); Bitboard b, bb; @@ -368,7 +373,7 @@ namespace { if (Pt == ROOK) { - // Bonus for aligning rook with with enemy pawns on the same rank/file + // Bonus for aligning rook with enemy pawns on the same rank/file if (relative_rank(Us, s) >= RANK_5) score += RookOnPawn * popcount(pos.pieces(Them, PAWN) & PseudoAttacks[ROOK][s]); @@ -406,7 +411,7 @@ namespace { constexpr Color Them = (Us == WHITE ? BLACK : WHITE); constexpr Bitboard Camp = (Us == WHITE ? AllSquares ^ Rank6BB ^ Rank7BB ^ Rank8BB - : AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB); + : AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB); const Square ksq = pos.square(Us); Bitboard weak, b, b1, b2, safe, unsafeChecks, pinned; @@ -515,17 +520,13 @@ namespace { // Non-pawn enemies attacked by a pawn nonPawnEnemies = pos.pieces(Them) ^ pos.pieces(Them, PAWN); - weak = nonPawnEnemies & attackedBy[Us][PAWN]; - if (weak) - { - // Our safe or protected pawns - b = pos.pieces(Us, PAWN) - & (~attackedBy[Them][ALL_PIECES] | attackedBy[Us][ALL_PIECES]); + // Our safe or protected pawns + b = pos.pieces(Us, PAWN) + & (~attackedBy[Them][ALL_PIECES] | attackedBy[Us][ALL_PIECES]); - safeThreats = pawn_attacks_bb(b) & weak; - score += ThreatBySafePawn * popcount(safeThreats); - } + safeThreats = pawn_attacks_bb(b) & nonPawnEnemies; + score += ThreatBySafePawn * popcount(safeThreats); // Squares strongly protected by the enemy, either because they defend the // square with a pawn, or because they defend the square twice and we don't. @@ -687,7 +688,7 @@ namespace { } else if (pos.pieces(Us) & blockSq) bonus += make_score(w + r * 2, w + r * 2); - } // rr != 0 + } // w != 0 // Scale down bonus for candidate passers which need more than one // pawn push to become passed or have a pawn in front of them. @@ -795,11 +796,10 @@ namespace { { if (pos.opposite_bishops()) { - // Endgame with opposite-colored bishops and no other pieces (ignoring pawns) - // is almost a draw, in case of KBP vs KB, it is even more a draw. + // Endgame with opposite-colored bishops and no other pieces is almost a draw if ( pos.non_pawn_material(WHITE) == BishopValueMg && pos.non_pawn_material(BLACK) == BishopValueMg) - sf = more_than_one(pos.pieces(PAWN)) ? 31 : 9; + sf = 31; // Endgame with opposite-colored bishops, but also other pieces. Still // a bit drawish, but not as drawish as with only the two bishops. @@ -838,7 +838,7 @@ namespace { // Initialize score by reading the incrementally updated scores included in // the position object (material + piece square tables) and the material // imbalance. Score is computed internally from the white point of view. - Score score = pos.psq_score() + me->imbalance() + Eval::Contempt; + Score score = pos.psq_score() + me->imbalance() + pos.this_thread()->contempt; // Probe the pawn hash table pe = Pawns::probe(pos); @@ -909,7 +909,7 @@ std::string Eval::trace(const Position& pos) { std::memset(scores, 0, sizeof(scores)); - Eval::Contempt = SCORE_ZERO; // Reset any dynamic contempt + pos.this_thread()->contempt = SCORE_ZERO; // Reset any dynamic contempt Value v = Evaluation(pos).value();