X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fevaluate.cpp;h=d3190bfcbe91a3b3a2185ea58e1cc70dac58dda3;hb=8ca80cb0f1bb50f982f89efd147c45f9b91358a5;hp=cf033317c2d4e12d70ed4bbc63e5db1bb292f8d1;hpb=13a73f67c018e58b2fd46f886c45ef2b75188c8e;p=stockfish diff --git a/src/evaluate.cpp b/src/evaluate.cpp index cf033317..d3190bfc 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -127,8 +127,8 @@ namespace { S( 25, 41), S( 25, 41), S(25, 41), S(25, 41) } }; - // Outpost[PieceType][Square] contains bonuses of knights and bishops, indexed - // by piece type and square (from white's point of view). + // Outpost[PieceType][Square] contains bonuses for knights and bishops outposts, + // indexed by piece type and square (from white's point of view). const Value Outpost[][SQUARE_NB] = { { // A B C D E F G H @@ -150,11 +150,8 @@ namespace { // Threat[attacking][attacked] contains bonuses according to which piece // type attacks which one. const Score Threat[][PIECE_TYPE_NB] = { - {}, {}, - { S(0, 0), S( 7, 39), S( 0, 0), S(24, 49), S(41,100), S(41,100) }, // KNIGHT - { S(0, 0), S( 7, 39), S(24, 49), S( 0, 0), S(41,100), S(41,100) }, // BISHOP - { S(0, 0), S( 0, 22), S(15, 49), S(15, 49), S( 0, 0), S(24, 49) }, // ROOK - { S(0, 0), S(15, 39), S(15, 39), S(15, 39), S(15, 39), S( 0, 0) } // QUEEN + { S(0, 0), S( 7, 39), S(24, 49), S(24, 49), S(41,100), S(41,100) }, // Minor + { S(0, 0), S(15, 39), S(15, 45), S(15, 45), S(15, 45), S(24, 49) }, // Major }; // ThreatenedByPawn[PieceType] contains a penalty according to which piece @@ -185,8 +182,8 @@ namespace { // happen in Chess960 games. const Score TrappedBishopA1H1 = make_score(50, 50); - // The SpaceMask[Color] contains the area of the board which is considered - // by the space evaluation. In the middle game, each side is given a bonus + // SpaceMask[Color] contains the area of the board which is considered + // by the space evaluation. In the middlegame, each side is given a bonus // based on how many squares inside this area are safe and available for // friendly minor pieces. const Bitboard SpaceMask[] = { @@ -195,9 +192,9 @@ namespace { }; // King danger constants and variables. The king danger scores are taken - // from the KingDanger[]. Various little "meta-bonuses" measuring - // the strength of the enemy attack are added up into an integer, which - // is used as an index to KingDanger[]. + // from KingDanger[]. Various little "meta-bonuses" measuring the strength + // of the enemy attack are added up into an integer, which is used as an + // index to KingDanger[]. // // KingAttackWeights[PieceType] contains king attack weights by piece type const int KingAttackWeights[] = { 0, 0, 2, 2, 3, 5 }; @@ -261,7 +258,7 @@ namespace { namespace Eval { /// evaluate() is the main evaluation function. It always computes two - /// values, an endgame score and a middle game score, and interpolates + /// values, an endgame score and a middlegame score, and interpolates /// between them based on the remaining material. Value evaluate(const Position& pos) { @@ -362,14 +359,14 @@ Value do_evaluate(const Position& pos) { score += evaluate_unstoppable_pawns(pos, WHITE, ei) - evaluate_unstoppable_pawns(pos, BLACK, ei); - // Evaluate space for both sides, only in middle-game. + // Evaluate space for both sides, only in middlegame if (ei.mi->space_weight()) { int s = evaluate_space(pos, ei) - evaluate_space(pos, ei); score += apply_weight(s * ei.mi->space_weight(), Weights[Space]); } - // Scale winning side if position is more drawish that what it appears + // Scale winning side if position is more drawish than it appears ScaleFactor sf = eg_value(score) > VALUE_DRAW ? ei.mi->scale_factor(pos, WHITE) : ei.mi->scale_factor(pos, BLACK); @@ -380,7 +377,7 @@ Value do_evaluate(const Position& pos) { && sf == SCALE_FACTOR_NORMAL) { // Ignoring any pawns, do both sides only have a single bishop and no - // other pieces ? + // other pieces? if ( pos.non_pawn_material(WHITE) == BishopValueMg && pos.non_pawn_material(BLACK) == BishopValueMg) { @@ -437,7 +434,7 @@ Value do_evaluate(const Position& pos) { { ei.kingRing[Them] = b | shift_bb(b); b &= ei.attackedBy[Us][PAWN]; - ei.kingAttackersCount[Us] = b ? popcount(b) / 2 : 0; + ei.kingAttackersCount[Us] = b ? popcount(b) : 0; ei.kingAdjacentZoneAttacksCount[Us] = ei.kingAttackersWeight[Us] = 0; } else @@ -445,7 +442,7 @@ Value do_evaluate(const Position& pos) { } - // evaluate_outposts() evaluates bishop and knight outposts squares + // evaluate_outposts() evaluates bishop and knight outpost squares template Score evaluate_outposts(const Position& pos, EvalInfo& ei, Square s) { @@ -458,7 +455,7 @@ Value do_evaluate(const Position& pos) { Value bonus = Outpost[Piece == BISHOP][relative_square(Us, s)]; // Increase bonus if supported by pawn, especially if the opponent has - // no minor piece which can exchange the outpost piece. + // no minor piece which can trade with the outpost piece. if (bonus && (ei.attackedBy[Us][PAWN] & s)) { if ( !pos.pieces(Them, KNIGHT) @@ -643,8 +640,7 @@ Value do_evaluate(const Position& pos) { Score score = ei.pi->king_safety(pos, ksq); // Main king safety evaluation - if ( ei.kingAttackersCount[Them] >= 2 - && ei.kingAdjacentZoneAttacksCount[Them]) + if (ei.kingAttackersCount[Them]) { // Find the attacked squares around the king which have no defenders // apart from the king itself @@ -762,18 +758,17 @@ Value do_evaluate(const Position& pos) { & ~ei.attackedBy[Them][PAWN] & ei.attackedBy[Us][ALL_PIECES]; - // Add bonus according to type of attacked enemy piece and to the - // type of attacking piece, from knights to queens. Kings are not - // considered because are already handled in king evaluation. + // Add a bonus according if the attacking pieces are minor or major if (weakEnemies) - for (PieceType pt1 = KNIGHT; pt1 < KING; ++pt1) - { - b = ei.attackedBy[Us][pt1] & weakEnemies; - if (b) - for (PieceType pt2 = PAWN; pt2 < KING; ++pt2) - if (b & pos.pieces(pt2)) - score += Threat[pt1][pt2]; - } + { + b = weakEnemies & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]); + if (b) + score += Threat[0][type_of(pos.piece_on(lsb(b)))]; + + b = weakEnemies & (ei.attackedBy[Us][ROOK] | ei.attackedBy[Us][QUEEN]); + if (b) + score += Threat[1][type_of(pos.piece_on(lsb(b)))]; + } if (Trace) Tracing::scores[Us][THREAT] = score; @@ -891,7 +886,7 @@ Value do_evaluate(const Position& pos) { if (Trace) Tracing::scores[Us][PASSED] = apply_weight(score, Weights[PassedPawns]); - // Add the scores to the middle game and endgame eval + // Add the scores to the middlegame and endgame eval return apply_weight(score, Weights[PassedPawns]); } @@ -943,7 +938,7 @@ Value do_evaluate(const Position& pos) { } - // interpolate() interpolates between a middle game and an endgame score, + // interpolate() interpolates between a middlegame and an endgame score, // based on game phase. It also scales the return value by a ScaleFactor array. Value interpolate(const Score& v, Phase ph, ScaleFactor sf) {