X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fevaluate.cpp;h=d090f4042177a04cc9975552959930a75f183d9a;hb=e72b93e44fb95af6b3669e23a8fcd7702ea09ec1;hp=4d47b7e6df64a681bdc1b979626a04d942643d32;hpb=0439a79566d03065317b2025b9b479b9ae9f2d65;p=stockfish diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 4d47b7e6..d090f404 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); @@ -167,8 +170,8 @@ namespace { // happen in Chess960 games. const Score TrappedBishopA1H1Penalty = make_score(100, 100); - // Penalty for BNR that is not defended by anything - const Score UndefendedPiecePenalty = make_score(25, 10); + // Penalty for an undefended bishop or knight + const Score UndefendedMinorPenalty = make_score(25, 10); // 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 @@ -362,16 +365,17 @@ 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 = Threads[pos.this_thread()].materialTable.probe(pos); + ei.mi = pos.this_thread()->materialTable.probe(pos); score += ei.mi->material_value(); // If we have a specialized evaluation function for the current material @@ -383,7 +387,7 @@ Value do_evaluate(const Position& pos, Value& margin) { } // Probe the pawn hash table - ei.pi = Threads[pos.this_thread()].pawnTable.probe(pos); + ei.pi = pos.this_thread()->pawnTable.probe(pos); score += ei.pi->pawns_value(); // Initialize attack and king safety bitboards @@ -676,18 +680,17 @@ Value do_evaluate(const Position& pos, Value& margin) { const Color Them = (Us == WHITE ? BLACK : WHITE); - Bitboard b, undefended, undefendedMinors, weakEnemies; + Bitboard b, undefendedMinors, weakEnemies; Score score = SCORE_ZERO; - // Undefended pieces get penalized even if not under attack - undefended = pos.pieces(Them) & ~ei.attackedBy[Them][0]; - undefendedMinors = undefended & (pos.pieces(BISHOP) | pos.pieces(KNIGHT)); + // Undefended minors get penalized even if not under attack + undefendedMinors = pos.pieces(Them) + & (pos.pieces(BISHOP) | pos.pieces(KNIGHT)) + & ~ei.attackedBy[Them][0]; if (undefendedMinors) - score += single_bit(undefendedMinors) ? UndefendedPiecePenalty - : UndefendedPiecePenalty * 2; - if (undefended & pos.pieces(ROOK)) - score += UndefendedPiecePenalty; + score += single_bit(undefendedMinors) ? UndefendedMinorPenalty + : UndefendedMinorPenalty * 2; // Enemy pieces not defended by a pawn and under our attack weakEnemies = pos.pieces(Them)