X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=9ebd8748d4759b56bd20c952c0b2922d8c37ea9c;hp=daf0c1d74d7b2c1e1b5460b5714852ce94ec9e08;hb=4111f36f45fbb5da68142a0be1b4d033d50e7d93;hpb=4a0db9ea3c34d7663a039c40ce810ba9cb743cca diff --git a/src/evaluate.cpp b/src/evaluate.cpp index daf0c1d7..9ebd8748 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -127,7 +127,7 @@ namespace { // RookOnFile[semiopen/open] contains bonuses for each rook when there is // no (friendly) pawn on the rook file. - constexpr Score RookOnFile[] = { S(20, 7), S(45, 20) }; + constexpr Score RookOnFile[] = { S(18, 7), S(44, 20) }; // ThreatByMinor/ByRook[attacked PieceType] contains bonuses according to // which piece type attacks which one. Attacks on lesser pieces which are @@ -151,9 +151,6 @@ namespace { S(-30,-14), S(-9, -8), S( 0, 9), S( -1, 7) }; - // PassedDanger[Rank] contains a term to weight the passed score - constexpr int PassedDanger[RANK_NB] = { 0, 0, 0, 3, 7, 11, 20 }; - // Assorted bonuses and penalties constexpr Score BishopPawns = S( 3, 7); constexpr Score CloseEnemies = S( 6, 0); @@ -165,13 +162,13 @@ namespace { constexpr Score MinorBehindPawn = S( 16, 0); constexpr Score Overload = S( 13, 6); constexpr Score PawnlessFlank = S( 19, 84); - constexpr Score RookOnPawn = S( 10, 30); + constexpr Score RookOnPawn = S( 10, 29); constexpr Score SliderOnQueen = S( 42, 21); constexpr Score ThreatByKing = S( 22, 78); constexpr Score ThreatByPawnPush = S( 45, 40); constexpr Score ThreatByRank = S( 16, 3); constexpr Score ThreatBySafePawn = S(173,102); - constexpr Score TrappedRook = S( 92, 0); + constexpr Score TrappedRook = S( 96, 5); constexpr Score WeakQueen = S( 50, 10); constexpr Score WeakUnopposedPawn = S( 15, 19); @@ -261,6 +258,8 @@ namespace { attackedBy[Us][ALL_PIECES] = attackedBy[Us][KING] | attackedBy[Us][PAWN]; attackedBy2[Us] = attackedBy[Us][KING] & attackedBy[Us][PAWN]; + kingRing[Us] = kingAttackersCount[Them] = 0; + // Init our king safety tables only if we are going to use them if (pos.non_pawn_material(Them) >= RookValueMg + KnightValueMg) { @@ -277,8 +276,6 @@ namespace { kingAttackersCount[Them] = popcount(kingRing[Us] & pe->pawn_attacks(Them)); kingAttacksCount[Them] = kingAttackersWeight[Them] = 0; } - else - kingRing[Us] = kingAttackersCount[Them] = 0; } @@ -415,13 +412,13 @@ namespace { Bitboard kingFlank, weak, b, b1, b2, safe, unsafeChecks; // King shelter and enemy pawns storm - Score score = pe->king_safety(pos, ksq); + Score score = pe->king_safety(pos); // Find the squares that opponent attacks in our king flank, and the squares - // which are attacked twice in that flank but not defended by our pawns. + // which are attacked twice in that flank. kingFlank = KingFlank[file_of(ksq)]; b1 = attackedBy[Them][ALL_PIECES] & kingFlank & Camp; - b2 = b1 & attackedBy2[Them] & ~attackedBy[Us][PAWN]; + b2 = b1 & attackedBy2[Them]; int tropism = popcount(b1) + popcount(b2); @@ -480,15 +477,12 @@ namespace { + 4 * tropism - 873 * !pos.count(Them) - 6 * mg_value(score) / 8 + + mg_value(mobility[Them] - mobility[Us]) - 30; // Transform the kingDanger units into a Score, and subtract it from the evaluation if (kingDanger > 0) - { - int mobilityDanger = mg_value(mobility[Them] - mobility[Us]); - kingDanger = std::max(0, kingDanger + mobilityDanger); score -= make_score(kingDanger * kingDanger / 4096, kingDanger / 16); - } } // Penalty when our king is on a pawnless flank @@ -632,12 +626,12 @@ namespace { assert(!(pos.pieces(Them, PAWN) & forward_file_bb(Us, s + Up))); int r = relative_rank(Us, s); - int w = PassedDanger[r]; Score bonus = PassedRank[r]; - if (w) + if (r > RANK_3) { + int w = (r-2) * (r-2) + 2; Square blockSq = s + Up; // Adjust bonus based on the king's proximity @@ -678,7 +672,7 @@ namespace { bonus += make_score(k * w, k * w); } - } // w != 0 + } // rank > RANK_3 // Scale down bonus for candidate passers which need more than one // pawn push to become passed, or have a pawn in front of them.