X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=d090f4042177a04cc9975552959930a75f183d9a;hp=515405ca5fe935b16d0eef5fedd103910e9b4968;hb=d66b765eb6b3725b468a3c5f8f2cdb9693fd6bdf;hpb=b1f57e92cea7bd36126ef8c26928d8991b74baef diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 515405ca..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 = 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 = 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)