X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fevaluate.cpp;h=4ed5e943efe877d006a7c9158ea18db4cef35686;hb=535435b7fc10640d0481f1a396d34511606c2baf;hp=d1799d6064810e3d58e6d8a380740d9504377f93;hpb=7ae3c05795e79c9bd945607cdcfb08198f4c4b45;p=stockfish diff --git a/src/evaluate.cpp b/src/evaluate.cpp index d1799d60..4ed5e943 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -198,6 +198,9 @@ namespace { const Score Hanging = S(48, 27); const Score ThreatByPawnPush = S(38, 22); const Score Unstoppable = S( 0, 20); + const Score PawnlessFlank = S(20, 80); + const Score HinderPassedPawn = S( 7, 0); + const Score ThreatByRank = S(16, 3); // 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 @@ -346,7 +349,6 @@ namespace { 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) && !ei.pi->semiopen_side(Us, file_of(ksq), file_of(s) < file_of(ksq))) score -= (TrappedRook - make_score(mob * 22, 0)) * (1 + !pos.can_castle(Us)); } @@ -482,7 +484,8 @@ namespace { } // King tropism: firstly, find squares that opponent attacks in our king flank - b = ei.attackedBy[Them][ALL_PIECES] & KingFlank[Us][file_of(ksq)]; + File kf = file_of(ksq); + b = ei.attackedBy[Them][ALL_PIECES] & KingFlank[Us][kf]; assert(((Us == WHITE ? b << 4 : b >> 4) & b) == 0); assert(popcount(Us == WHITE ? b << 4 : b >> 4) == popcount(b)); @@ -494,6 +497,10 @@ namespace { score -= CloseEnemies * popcount(b); + // Penalty when our king is on a pawnless flank + if (!(pos.pieces(PAWN) & (KingFlank[WHITE][kf] | KingFlank[BLACK][kf]))) + score -= PawnlessFlank; + if (DoTrace) Trace::add(KING, Us, score); @@ -554,11 +561,21 @@ namespace { { b = (defended | weak) & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]); while (b) - score += Threat[Minor][type_of(pos.piece_on(pop_lsb(&b)))]; + { + Square s = pop_lsb(&b); + score += Threat[Minor][type_of(pos.piece_on(s))]; + if (type_of(pos.piece_on(s)) != PAWN) + score += ThreatByRank * (int)relative_rank(Them, s); + } b = (pos.pieces(Them, QUEEN) | weak) & ei.attackedBy[Us][ROOK]; while (b) - score += Threat[Rook ][type_of(pos.piece_on(pop_lsb(&b)))]; + { + Square s = pop_lsb(&b); + score += Threat[Rook][type_of(pos.piece_on(s))]; + if (type_of(pos.piece_on(s)) != PAWN) + score += ThreatByRank * (int)relative_rank(Them, s); + } score += Hanging * popcount(weak & ~ei.attackedBy[Them][ALL_PIECES]); @@ -595,7 +612,7 @@ namespace { const Color Them = (Us == WHITE ? BLACK : WHITE); - Bitboard b, squaresToQueen, defendedSquares, unsafeSquares; + Bitboard b, bb, squaresToQueen, defendedSquares, unsafeSquares; Score score = SCORE_ZERO; b = ei.pi->passed_pawns(Us); @@ -607,6 +624,9 @@ namespace { assert(pos.pawn_passed(Us, s)); assert(!(pos.pieces(PAWN) & forward_bb(Us, s))); + bb = forward_bb(Us, s) & (ei.attackedBy[Them][ALL_PIECES] | pos.pieces(Them)); + score -= HinderPassedPawn * popcount(bb); + int r = relative_rank(Us, s) - RANK_2; int rr = r * (r - 1); @@ -632,7 +652,7 @@ namespace { // in the pawn's path attacked or occupied by the enemy. defendedSquares = unsafeSquares = squaresToQueen = forward_bb(Us, s); - Bitboard bb = forward_bb(Them, s) & pos.pieces(ROOK, QUEEN) & pos.attacks_from(s); + bb = forward_bb(Them, s) & pos.pieces(ROOK, QUEEN) & pos.attacks_from(s); if (!(pos.pieces(Us) & bb)) defendedSquares &= ei.attackedBy[Us][ALL_PIECES]; @@ -867,8 +887,9 @@ Value Eval::evaluate(const Position& pos) { Trace::add(IMBALANCE, ei.me->imbalance()); Trace::add(PAWN, ei.pi->pawns_score()); Trace::add(MOBILITY, mobility[WHITE], mobility[BLACK]); - Trace::add(SPACE, evaluate_space(pos, ei) - , evaluate_space(pos, ei)); + if (pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) >= 12222) + Trace::add(SPACE, evaluate_space(pos, ei) + , evaluate_space(pos, ei)); Trace::add(TOTAL, score); }