X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=c8211bb0573d07e82dc2f83e0ca92eca984b4efb;hp=2f9cec5cb2891ef48f043c79ff0ed4886f6a387c;hb=f4ace94f91c31631a280b929d50fbe7077305dc2;hpb=e8cc5c996818c7e128bd8db7947d1c4c43be865f diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 2f9cec5c..c8211bb0 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -124,7 +124,8 @@ namespace { S( 94, 99), S( 96,100), S(99,111), S(99,112) } }; - // Outpost[knight/bishop][supported by pawn] + // 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 @@ -145,6 +146,17 @@ namespace { S(0, 0), S(0, 0), S(107, 138), S(84, 122), S(114, 203), S(121, 217) }; + // PassedPawnsBonusMg[Rank] and PassedPawnsBonusEg[Rank] + //contains bonuses for midgame and endgame for passed pawns according to + //the rank of the pawn. + const Value PassedPawnsBonusMg[6] = { + V(0), V(1), V(34), V(90), V(214), V(328) + }; + + const Value PassedPawnsBonusEg[6] = { + V(7), V(14), V(37), V(63), V(134), V(189) + }; + const Score ThreatenedByHangingPawn = S(40, 60); // Assorted bonuses and penalties used by evaluation @@ -207,7 +219,7 @@ namespace { ei.pinnedPieces[Us] = pos.pinned_pieces(Us); ei.attackedBy[Us][ALL_PIECES] = ei.attackedBy[Us][PAWN] = ei.pi->pawn_attacks(Us); - Bitboard b = ei.attackedBy[Them][KING] = pos.attacks_from(pos.king_square(Them)); + Bitboard b = ei.attackedBy[Them][KING] = pos.attacks_from(pos.square(Them)); // Init king safety tables only if we are going to use them if (pos.non_pawn_material(Us) >= QueenValueMg) @@ -233,7 +245,7 @@ namespace { const PieceType NextPt = (Us == WHITE ? Pt : PieceType(Pt + 1)); const Color Them = (Us == WHITE ? BLACK : WHITE); - const Square* pl = pos.list(Us); + const Square* pl = pos.squares(Us); ei.attackedBy[Us][Pt] = 0; @@ -245,7 +257,7 @@ namespace { : pos.attacks_from(s); if (ei.pinnedPieces[Us] & s) - b &= LineBB[pos.king_square(Us)][s]; + b &= LineBB[pos.square(Us)][s]; ei.attackedBy[Us][ALL_PIECES] |= ei.attackedBy[Us][Pt] |= b; @@ -315,7 +327,7 @@ namespace { // Penalize when trapped by the king, even more if king cannot castle if (mob <= 3 && !ei.pi->semiopen_file(Us, file_of(s))) { - Square ksq = pos.king_square(Us); + Square ksq = pos.square(Us); if ( ((file_of(ksq) < FILE_E) == (file_of(s) < file_of(ksq))) && (rank_of(ksq) == rank_of(s) || relative_rank(Us, ksq) == RANK_1) @@ -347,7 +359,7 @@ namespace { Bitboard undefended, b, b1, b2, safe; int attackUnits; - const Square ksq = pos.king_square(Us); + const Square ksq = pos.square(Us); // King shelter and enemy pawns storm Score score = ei.pi->king_safety(pos, ksq); @@ -566,20 +578,20 @@ namespace { int r = relative_rank(Us, s) - RANK_2; int rr = r * (r - 1); - // Base bonus based on rank - Value mbonus = Value(17 * rr), ebonus = Value(7 * (rr + r + 1)); + Value mbonus = PassedPawnsBonusMg[r], + ebonus = PassedPawnsBonusEg[r]; if (rr) { Square blockSq = s + pawn_push(Us); // Adjust bonus based on the king's proximity - ebonus += distance(pos.king_square(Them), blockSq) * 5 * rr - - distance(pos.king_square(Us ), blockSq) * 2 * rr; + ebonus += distance(pos.square(Them), blockSq) * 5 * rr + - distance(pos.square(Us ), blockSq) * 2 * rr; // If blockSq is not the queening square then consider also a second push if (relative_rank(Us, blockSq) != RANK_8) - ebonus -= distance(pos.king_square(Us), blockSq + pawn_push(Us)) * rr; + ebonus -= distance(pos.square(Us), blockSq + pawn_push(Us)) * rr; // If the pawn is free to advance, then increase the bonus if (pos.empty(blockSq)) @@ -700,9 +712,18 @@ namespace { ei.attackedBy[WHITE][ALL_PIECES] |= ei.attackedBy[WHITE][KING]; ei.attackedBy[BLACK][ALL_PIECES] |= ei.attackedBy[BLACK][KING]; - // Do not include in mobility squares protected by enemy pawns or occupied by our pawns or king - Bitboard mobilityArea[] = { ~(ei.attackedBy[BLACK][PAWN] | pos.pieces(WHITE, PAWN, KING)), - ~(ei.attackedBy[WHITE][PAWN] | pos.pieces(BLACK, PAWN, KING)) }; + // Pawns blocked or on ranks 2 and 3. Will be excluded from the mobility area + Bitboard blockedPawns[] = { + pos.pieces(WHITE, PAWN) & (shift_bb(pos.pieces()) | Rank2BB | Rank3BB), + pos.pieces(BLACK, PAWN) & (shift_bb(pos.pieces()) | Rank7BB | Rank6BB) + }; + + // Do not include in mobility squares protected by enemy pawns, or occupied + // by our blocked pawns or king. + Bitboard mobilityArea[] = { + ~(ei.attackedBy[BLACK][PAWN] | blockedPawns[WHITE] | pos.square(WHITE)), + ~(ei.attackedBy[WHITE][PAWN] | blockedPawns[BLACK] | pos.square(BLACK)) + }; // Evaluate pieces and mobility score += evaluate_pieces(pos, ei, mobility, mobilityArea); @@ -762,7 +783,7 @@ namespace { // pawns are drawish. else if ( abs(eg_value(score)) <= BishopValueEg && ei.pi->pawn_span(strongSide) <= 1 - && !pos.pawn_passed(~strongSide, pos.king_square(~strongSide))) + && !pos.pawn_passed(~strongSide, pos.square(~strongSide))) sf = ei.pi->pawn_span(strongSide) ? ScaleFactor(56) : ScaleFactor(38); }