X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fevaluate.cpp;h=130b0e0aa1b345bba0e243aebdc38c96d8db3635;hb=9f5b31c21df72f60ab02417940ae573621ee7b90;hp=383d9e62f1fec595399c722c8dc59baff9938e63;hpb=3e2591d83c285597a7400c79b61ab9dc38875163;p=stockfish diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 383d9e62..130b0e0a 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -144,8 +144,8 @@ namespace { // Outpost[knight/bishop][supported by pawn] contains bonuses for knights and // bishops outposts, bigger if outpost piece is supported by a pawn. const Score Outpost[][2] = { - { S(28, 7), S(42,11) }, // Knights - { S(12, 3), S(18, 5) } // Bishops + { S(42,11), S(63,17) }, // Knights + { S(18, 5), S(27, 8) } // Bishops }; // Threat[defended/weak][minor/major attacking][attacked PieceType] contains @@ -184,6 +184,7 @@ namespace { const Score Unstoppable = S( 0, 20); const Score Hanging = S(31, 26); const Score PawnAttackThreat = S(20, 20); + const Score Checked = S(20, 20); // 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 @@ -296,6 +297,7 @@ namespace { { // Bonus for outpost square if ( relative_rank(Us, s) >= RANK_4 + && relative_rank(Us, s) <= RANK_6 && !(pos.pieces(Them, PAWN) & pawn_attack_span(Us, s))) score += Outpost[Pt == BISHOP][!!(ei.attackedBy[Us][PAWN] & s)]; @@ -439,22 +441,34 @@ namespace { // Enemy queen safe checks b = (b1 | b2) & ei.attackedBy[Them][QUEEN]; if (b) + { attackUnits += QueenCheck * popcount(b); + score -= Checked; + } // Enemy rooks safe checks b = b1 & ei.attackedBy[Them][ROOK]; if (b) + { attackUnits += RookCheck * popcount(b); + score -= Checked; + } // Enemy bishops safe checks b = b2 & ei.attackedBy[Them][BISHOP]; if (b) + { attackUnits += BishopCheck * popcount(b); + score -= Checked; + } // Enemy knights safe checks b = pos.attacks_from(ksq) & ei.attackedBy[Them][KNIGHT] & safe; if (b) + { attackUnits += KnightCheck * popcount(b); + score -= Checked; + } // Finally, extract the king danger score from the KingDanger[] // array and subtract the score from evaluation. @@ -796,6 +810,11 @@ Value Eval::evaluate(const Position& pos) { sf = ei.pi->pawn_span(strongSide) ? ScaleFactor(56) : ScaleFactor(38); } + // Scale endgame by number of pawns + int p = pos.count(WHITE) + pos.count(BLACK); + int v_eg = 1 + abs(int(eg_value(score))); + sf = ScaleFactor(std::max(sf / 2, sf - 7 * SCALE_FACTOR_NORMAL * (14 - p) / v_eg)); + // Interpolate between a middlegame and a (scaled by 'sf') endgame score Value v = mg_value(score) * int(me->game_phase()) + eg_value(score) * int(PHASE_MIDGAME - me->game_phase()) * sf / SCALE_FACTOR_NORMAL;