X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=8a5b6618851a8b33745e324d305a822ac2bb4d9e;hp=849185b67e497246048fdf508e040b1cf58b48b4;hb=3361ad42420e578362dcafb94b639738609bf7d7;hpb=f30f384757499508ebc670a1c58b99737e2449db diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 849185b6..8a5b6618 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -150,6 +150,9 @@ namespace { #undef S + // Bonus for having the side to move (modified by Joona Kiiski) + const Score Tempo = make_score(24, 11); + // Rooks and queens on the 7th rank (modified by Joona Kiiski) const Score RookOn7thBonus = make_score(47, 98); const Score QueenOn7thBonus = make_score(27, 54); @@ -362,14 +365,15 @@ Value do_evaluate(const Position& pos, Value& margin) { Value margins[2]; Score score, mobilityWhite, mobilityBlack; - // Initialize score by reading the incrementally updated scores included - // in the position object (material + piece square tables). - score = pos.psq_score(); - // margins[] store the uncertainty estimation of position's evaluation // that typically is used by the search for pruning decisions. margins[WHITE] = margins[BLACK] = VALUE_ZERO; + // Initialize score by reading the incrementally updated scores included + // in the position object (material + piece square tables) and adding + // Tempo bonus. Score is computed from the point of view of white. + score = pos.psq_score() + (pos.side_to_move() == WHITE ? Tempo : -Tempo); + // Probe the material hash table ei.mi = pos.this_thread()->materialTable.probe(pos); score += ei.mi->material_value(); @@ -515,8 +519,8 @@ Value do_evaluate(const Position& pos, Value& margin) { // no minor piece which can exchange the outpost piece. if (bonus && (ei.attackedBy[Us][PAWN] & s)) { - if ( !pos.pieces(KNIGHT, Them) - && !(same_color_squares(s) & pos.pieces(BISHOP, Them))) + if ( !pos.pieces(Them, KNIGHT) + && !(same_color_squares(s) & pos.pieces(Them, BISHOP))) bonus += bonus + bonus / 2; else bonus += bonus / 2; @@ -547,9 +551,9 @@ Value do_evaluate(const Position& pos, Value& margin) { if (Piece == KNIGHT || Piece == QUEEN) b = pos.attacks_from(s); else if (Piece == BISHOP) - b = attacks_bb(s, pos.pieces() ^ pos.pieces(QUEEN, Us)); + b = attacks_bb(s, pos.pieces() ^ pos.pieces(Us, QUEEN)); else if (Piece == ROOK) - b = attacks_bb(s, pos.pieces() ^ pos.pieces(ROOK, QUEEN, Us)); + b = attacks_bb(s, pos.pieces() ^ pos.pieces(Us, ROOK, QUEEN)); else assert(false); @@ -577,7 +581,7 @@ Value do_evaluate(const Position& pos, Value& margin) { assert(b); - if (single_bit(b) && (b & pos.pieces(Them))) + if (!more_than_one(b) && (b & pos.pieces(Them))) score += ThreatBonus[Piece][type_of(pos.piece_on(first_1(b)))]; } @@ -588,7 +592,7 @@ Value do_evaluate(const Position& pos, Value& margin) { // Bishop and knight outposts squares if ( (Piece == BISHOP || Piece == KNIGHT) - && !(pos.pieces(PAWN, Them) & attack_span_mask(Us, s))) + && !(pos.pieces(Them, PAWN) & attack_span_mask(Us, s))) score += evaluate_outposts(pos, ei, s); // Queen or rook on 7th rank @@ -610,7 +614,7 @@ Value do_evaluate(const Position& pos, Value& margin) { Square d = pawn_push(Us) + (file_of(s) == FILE_A ? DELTA_E : DELTA_W); if (pos.piece_on(s + d) == make_piece(Us, PAWN)) { - if (!pos.square_empty(s + d + pawn_push(Us))) + if (!pos.is_empty(s + d + pawn_push(Us))) score -= 2*TrappedBishopA1H1Penalty; else if (pos.piece_on(s + 2*d) == make_piece(Us, PAWN)) score -= TrappedBishopA1H1Penalty; @@ -685,8 +689,8 @@ Value do_evaluate(const Position& pos, Value& margin) { & ~ei.attackedBy[Them][0]; if (undefendedMinors) - score += single_bit(undefendedMinors) ? UndefendedMinorPenalty - : UndefendedMinorPenalty * 2; + score += more_than_one(undefendedMinors) ? UndefendedMinorPenalty * 2 + : UndefendedMinorPenalty; // Enemy pieces not defended by a pawn and under our attack weakEnemies = pos.pieces(Them) @@ -771,7 +775,7 @@ Value do_evaluate(const Position& pos, Value& margin) { attackUnits = std::min(25, (ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them]) / 2) + 3 * (ei.kingAdjacentZoneAttacksCount[Them] + popcount(undefended)) + InitKingDanger[relative_square(Us, ksq)] - - mg_value(ei.pi->king_safety(pos, ksq)) / 32; + - mg_value(score) / 32; // Analyse enemy's safe queen contact checks. First find undefended // squares around the king attacked by enemy queen... @@ -890,16 +894,16 @@ Value do_evaluate(const Position& pos, Value& margin) { ebonus -= Value(square_distance(pos.king_square(Us), blockSq + pawn_push(Us)) * rr); // If the pawn is free to advance, increase bonus - if (pos.square_empty(blockSq)) + if (pos.is_empty(blockSq)) { - squaresToQueen = squares_in_front_of(Us, s); + squaresToQueen = forward_bb(Us, s); defendedSquares = squaresToQueen & ei.attackedBy[Us][0]; // If there is an enemy rook or queen attacking the pawn from behind, // add all X-ray attacks by the rook or queen. Otherwise consider only // the squares in the pawn's path attacked or occupied by the enemy. - if ( (squares_in_front_of(Them, s) & pos.pieces(ROOK, QUEEN, Them)) - && (squares_in_front_of(Them, s) & pos.pieces(ROOK, QUEEN, Them) & pos.attacks_from(s))) + if ( (forward_bb(Them, s) & pos.pieces(Them, ROOK, QUEEN)) + && (forward_bb(Them, s) & pos.pieces(Them, ROOK, QUEEN) & pos.attacks_from(s))) unsafeSquares = squaresToQueen; else unsafeSquares = squaresToQueen & (ei.attackedBy[Them][0] | pos.pieces(Them)); @@ -919,7 +923,7 @@ Value do_evaluate(const Position& pos, Value& margin) { // Increase the bonus if the passed pawn is supported by a friendly pawn // on the same rank and a bit smaller if it's on the previous rank. - supportingPawns = pos.pieces(PAWN, Us) & adjacent_files_bb(file_of(s)); + supportingPawns = pos.pieces(Us, PAWN) & adjacent_files_bb(file_of(s)); if (supportingPawns & rank_bb(s)) ebonus += Value(r * 20); @@ -936,7 +940,7 @@ Value do_evaluate(const Position& pos, Value& margin) { { if (pos.non_pawn_material(Them) <= KnightValueMidgame) ebonus += ebonus / 4; - else if (pos.pieces(ROOK, QUEEN, Them)) + else if (pos.pieces(Them, ROOK, QUEEN)) ebonus -= ebonus / 4; } score += make_score(mbonus, ebonus); @@ -974,7 +978,7 @@ Value do_evaluate(const Position& pos, Value& margin) { { s = pop_1st_bit(&b); queeningSquare = relative_square(c, make_square(file_of(s), RANK_8)); - queeningPath = squares_in_front_of(c, s); + queeningPath = forward_bb(c, s); // Compute plies to queening and check direct advancement movesToGo = rank_distance(s, queeningSquare) - int(relative_rank(c, s) == RANK_2); @@ -1009,7 +1013,7 @@ Value do_evaluate(const Position& pos, Value& margin) { loserSide = ~winnerSide; // Step 3. Can the losing side possibly create a new passed pawn and thus prevent the loss? - b = candidates = pos.pieces(PAWN, loserSide); + b = candidates = pos.pieces(loserSide, PAWN); while (b) { @@ -1022,7 +1026,7 @@ Value do_evaluate(const Position& pos, Value& margin) { // Check if (without even considering any obstacles) we're too far away or doubled if ( pliesToQueen[winnerSide] + 3 <= pliesToGo - || (squares_in_front_of(loserSide, s) & pos.pieces(PAWN, loserSide))) + || (forward_bb(loserSide, s) & pos.pieces(loserSide, PAWN))) candidates ^= s; } @@ -1046,8 +1050,8 @@ Value do_evaluate(const Position& pos, Value& margin) { // Generate list of blocking pawns and supporters supporters = adjacent_files_bb(file_of(s)) & candidates; - opposed = squares_in_front_of(loserSide, s) & pos.pieces(PAWN, winnerSide); - blockers = passed_pawn_mask(loserSide, s) & pos.pieces(PAWN, winnerSide); + opposed = forward_bb(loserSide, s) & pos.pieces(winnerSide, PAWN); + blockers = passed_pawn_mask(loserSide, s) & pos.pieces(winnerSide, PAWN); assert(blockers); @@ -1104,7 +1108,7 @@ Value do_evaluate(const Position& pos, Value& margin) { } // Winning pawn is unstoppable and will promote as first, return big score - Score score = make_score(0, (Value) 0x500 - 0x20 * pliesToQueen[winnerSide]); + Score score = make_score(0, (Value) 1280 - 32 * pliesToQueen[winnerSide]); return winnerSide == WHITE ? score : -score; } @@ -1124,12 +1128,12 @@ Value do_evaluate(const Position& pos, Value& margin) { // SpaceMask[]. A square is unsafe if it is attacked by an enemy // pawn, or if it is undefended and attacked by an enemy piece. Bitboard safe = SpaceMask[Us] - & ~pos.pieces(PAWN, Us) + & ~pos.pieces(Us, PAWN) & ~ei.attackedBy[Them][PAWN] & (ei.attackedBy[Us][0] | ~ei.attackedBy[Them][0]); // Find all squares which are at most three squares behind some friendly pawn - Bitboard behind = pos.pieces(PAWN, Us); + Bitboard behind = pos.pieces(Us, PAWN); behind |= (Us == WHITE ? behind >> 8 : behind << 8); behind |= (Us == WHITE ? behind >> 16 : behind << 16);