X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fevaluate.cpp;h=e05383ffcbdabe3ee600ddbb6ae24a905b5da202;hb=cab8b788465c34f5fc3d3caeeaee098c1ea185fe;hp=479deb9fe084bcdb0b50184ac1ab43004bf374f2;hpb=6c0b2f50032da8e4df0013177d6bb7e1bb1fae8e;p=stockfish diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 479deb9f..e05383ff 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -242,6 +242,9 @@ namespace { template Value do_evaluate(const Position& pos, EvalInfo& ei, int threadID); + template + void init_attack_tables(const Position& pos, EvalInfo& ei); + template void evaluate_pieces_of_color(const Position& pos, EvalInfo& ei); @@ -285,7 +288,6 @@ namespace { template Value do_evaluate(const Position& pos, EvalInfo& ei, int threadID) { - Bitboard b; ScaleFactor factor[2]; assert(pos.is_ok()); @@ -315,22 +317,9 @@ Value do_evaluate(const Position& pos, EvalInfo& ei, int threadID) { ei.pi = PawnTable[threadID]->get_pawn_info(pos); ei.value += apply_weight(ei.pi->pawns_value(), Weights[PawnStructure]); - // Initialize king attack bitboards and king attack zones for both sides - ei.attackedBy[WHITE][KING] = pos.attacks_from(pos.king_square(WHITE)); - ei.attackedBy[BLACK][KING] = pos.attacks_from(pos.king_square(BLACK)); - ei.kingZone[WHITE] = ei.attackedBy[BLACK][KING] | (ei.attackedBy[BLACK][KING] >> 8); - ei.kingZone[BLACK] = ei.attackedBy[WHITE][KING] | (ei.attackedBy[WHITE][KING] << 8); - - // Initialize pawn attack bitboards for both sides - ei.attackedBy[WHITE][PAWN] = ei.pi->pawn_attacks(WHITE); - b = ei.attackedBy[WHITE][PAWN] & ei.attackedBy[BLACK][KING]; - if (b) - ei.kingAttackersCount[WHITE] = count_1s_max_15(b)/2; - - ei.attackedBy[BLACK][PAWN] = ei.pi->pawn_attacks(BLACK); - b = ei.attackedBy[BLACK][PAWN] & ei.attackedBy[WHITE][KING]; - if (b) - ei.kingAttackersCount[BLACK] = count_1s_max_15(b)/2; + // Initialize attack bitboards with pawns evaluation + init_attack_tables(pos, ei); + init_attack_tables(pos, ei); // Evaluate pieces evaluate_pieces_of_color(pos, ei); @@ -359,23 +348,23 @@ Value do_evaluate(const Position& pos, EvalInfo& ei, int threadID) { // Middle-game specific evaluation terms if (phase > PHASE_ENDGAME) { - // Pawn storms in positions with opposite castling - if ( square_file(pos.king_square(WHITE)) >= FILE_E - && square_file(pos.king_square(BLACK)) <= FILE_D) + // Pawn storms in positions with opposite castling + if ( square_file(pos.king_square(WHITE)) >= FILE_E + && square_file(pos.king_square(BLACK)) <= FILE_D) - ei.value += make_score(ei.pi->queenside_storm_value(WHITE) - ei.pi->kingside_storm_value(BLACK), 0); + ei.value += make_score(ei.pi->queenside_storm_value(WHITE) - ei.pi->kingside_storm_value(BLACK), 0); - else if ( square_file(pos.king_square(WHITE)) <= FILE_D - && square_file(pos.king_square(BLACK)) >= FILE_E) + else if ( square_file(pos.king_square(WHITE)) <= FILE_D + && square_file(pos.king_square(BLACK)) >= FILE_E) - ei.value += make_score(ei.pi->kingside_storm_value(WHITE) - ei.pi->queenside_storm_value(BLACK), 0); + ei.value += make_score(ei.pi->kingside_storm_value(WHITE) - ei.pi->queenside_storm_value(BLACK), 0); - // Evaluate space for both sides - if (ei.mi->space_weight() > 0) - { - evaluate_space(pos, ei); - evaluate_space(pos, ei); - } + // Evaluate space for both sides + if (ei.mi->space_weight() > 0) + { + evaluate_space(pos, ei); + evaluate_space(pos, ei); + } } // Mobility @@ -481,6 +470,23 @@ void read_weights(Color us) { namespace { + // init_king_tables() initializes king bitboards for both sides adding + // pawn attacks. To be done before other evaluations. + + template + void init_attack_tables(const Position& pos, EvalInfo& ei) { + + const Color Them = (Us == WHITE ? BLACK : WHITE); + + Bitboard b = ei.attackedBy[Them][KING] = pos.attacks_from(pos.king_square(Them)); + ei.kingZone[Us] = (b | (Us == WHITE ? b >> 8 : b << 8)); + ei.attackedBy[Us][PAWN] = ei.pi->pawn_attacks(Us); + b &= ei.attackedBy[Us][PAWN]; + if (b) + ei.kingAttackersCount[Us] = count_1s_max_15(b) / 2; + } + + // evaluate_outposts() evaluates bishop and knight outposts squares template @@ -761,12 +767,6 @@ namespace { if (b) attackUnits += KnightCheckBonus * count_1s_max_15(b); - // Analyse enemy's discovered checks (only for non-pawns right now, - // consider adding pawns later). - b = pos.discovered_check_candidates(Them) & ~pos.pieces(PAWN); - if (b) - attackUnits += DiscoveredCheckBonus * count_1s_max_15(b) * (sente ? 2 : 1); - // To index KingDangerTable[] attackUnits must be in [0, 99] range attackUnits = Min(99, Max(0, attackUnits)); @@ -799,7 +799,7 @@ namespace { assert(pos.pawn_is_passed(Us, s)); int r = int(relative_rank(Us, s) - RANK_2); - int tr = Max(0, r * (r - 1)); + int tr = r * (r - 1); // Base bonus based on rank Value mbonus = Value(20 * tr); @@ -820,9 +820,6 @@ namespace { squaresToQueen = squares_in_front_of(Us, s); defendedSquares = squaresToQueen & ei.attacked_by(Us); - // There are no enemy pawns in the pawn's path - assert(!(squaresToQueen & pos.pieces(PAWN, Them))); - // 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.