X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=da4860fe1ce25b26ae89d44fa97b6392a4ae23ba;hp=eb4cbef7be2eeedb9df4591dcc234eba618bedc2;hb=c7a932bc744f899f53ce0013cbbbaa86915bb2e8;hpb=74033b004e9ba8c345573606ba670df75a795cba diff --git a/src/evaluate.cpp b/src/evaluate.cpp index eb4cbef7..da4860fe 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -23,7 +23,6 @@ //// #include -#include #include "bitcount.h" #include "evaluate.h" @@ -194,7 +193,7 @@ namespace { void init_attack_tables(const Position& pos, EvalInfo& ei); template - void evaluate_pieces_of_color(const Position& pos, EvalInfo& ei); + Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei); template void evaluate_king(const Position& pos, EvalInfo& ei); @@ -242,15 +241,14 @@ template Value do_evaluate(const Position& pos, EvalInfo& ei) { ScaleFactor factor[2]; + Score mobility; assert(pos.is_ok()); assert(pos.thread() >= 0 && pos.thread() < MAX_THREADS); assert(!pos.is_check()); - memset(&ei, 0, sizeof(EvalInfo)); - // Initialize by reading the incrementally updated scores included in the - // position object (material + piece square tables) + // position object (material + piece square tables). ei.value = pos.value(); // Probe the material hash table @@ -258,7 +256,7 @@ Value do_evaluate(const Position& pos, EvalInfo& ei) { ei.value += ei.mi->material_value(); // If we have a specialized evaluation function for the current material - // configuration, call it and return + // configuration, call it and return. if (ei.mi->specialized_eval_exists()) return ei.mi->evaluate(pos); @@ -274,9 +272,10 @@ Value do_evaluate(const Position& pos, EvalInfo& ei) { init_attack_tables(pos, ei); init_attack_tables(pos, ei); - // Evaluate pieces - evaluate_pieces_of_color(pos, ei); - evaluate_pieces_of_color(pos, ei); + // Evaluate pieces and mobility + mobility = evaluate_pieces_of_color(pos, ei) + - evaluate_pieces_of_color(pos, ei); + ei.value += apply_weight(mobility, Weights[Mobility]); // Kings. Kings are evaluated after all other pieces for both sides, // because we need complete attack information for all pieces when computing @@ -316,9 +315,6 @@ Value do_evaluate(const Position& pos, EvalInfo& ei) { } } - // Mobility - ei.value += apply_weight(ei.mobility, Weights[Mobility]); - // If we don't already have an unusual scale factor, check for opposite // colored bishop endgames, and use a lower scale for those if ( phase < PHASE_MIDGAME @@ -431,8 +427,8 @@ namespace { 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; + ei.kingAttackersCount[Us] = b ? count_1s_max_15(b) / 2 : 0; + ei.kingAdjacentZoneAttacksCount[Us] = ei.kingAttackersWeight[Us] = 0; } @@ -465,16 +461,19 @@ namespace { // evaluate_pieces<>() assigns bonuses and penalties to the pieces of a given color template - void evaluate_pieces(const Position& pos, EvalInfo& ei, Bitboard no_mob_area) { + Score evaluate_pieces(const Position& pos, EvalInfo& ei, Bitboard no_mob_area) { Bitboard b; Square s, ksq; int mob; File f; + Score mobility = SCORE_ZERO; const Color Them = (Us == WHITE ? BLACK : WHITE); const Square* ptr = pos.piece_list_begin(Us, Piece); + ei.attackedBy[Us][Piece] = 0; + while ((s = *ptr++) != SQ_NONE) { // Find attacked squares, including x-ray attacks for bishops and rooks @@ -504,7 +503,7 @@ namespace { mob = (Piece != QUEEN ? count_1s_max_15(b & no_mob_area) : count_1s(b & no_mob_area)); - ei.mobility += Sign[Us] * MobilityBonus[Piece][mob]; + mobility += MobilityBonus[Piece][mob]; // Decrease score if we are attacked by an enemy pawn. Remaining part // of threat evaluation must be done later when we have full attack info. @@ -563,6 +562,7 @@ namespace { } } } + return mobility; } @@ -603,22 +603,25 @@ namespace { // pieces of a given color. template - void evaluate_pieces_of_color(const Position& pos, EvalInfo& ei) { + Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei) { const Color Them = (Us == WHITE ? BLACK : WHITE); + Score mobility = SCORE_ZERO; + // Do not include in mobility squares protected by enemy pawns or occupied by our pieces const Bitboard no_mob_area = ~(ei.attackedBy[Them][PAWN] | pos.pieces_of_color(Us)); - evaluate_pieces(pos, ei, no_mob_area); - evaluate_pieces(pos, ei, no_mob_area); - evaluate_pieces(pos, ei, no_mob_area); - evaluate_pieces(pos, ei, no_mob_area); + mobility += evaluate_pieces(pos, ei, no_mob_area); + mobility += evaluate_pieces(pos, ei, no_mob_area); + mobility += evaluate_pieces(pos, ei, no_mob_area); + mobility += evaluate_pieces(pos, ei, no_mob_area); // Sum up all attacked squares ei.attackedBy[Us][0] = ei.attackedBy[Us][PAWN] | ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP] | ei.attackedBy[Us][ROOK] | ei.attackedBy[Us][QUEEN] | ei.attackedBy[Us][KING]; + return mobility; } @@ -706,13 +709,14 @@ namespace { attackUnits = Min(99, Max(0, attackUnits)); // Finally, extract the king danger score from the KingDangerTable[] - // array and subtract the score from evaluation. Set also ei.kingDanger[] + // array and subtract the score from evaluation. Set also ei.margin[] // value that will be used for pruning because this value can sometimes // be very big, and so capturing a single attacking piece can therefore // result in a score change far bigger than the value of the captured piece. ei.value -= Sign[Us] * KingDangerTable[Us][attackUnits]; - ei.kingDanger[Us] = mg_value(KingDangerTable[Us][attackUnits]); - } + ei.margin[Us] = mg_value(KingDangerTable[Us][attackUnits]); + } else + ei.margin[Us] = VALUE_ZERO; } @@ -723,11 +727,14 @@ namespace { const Color Them = (Us == WHITE ? BLACK : WHITE); + Score bonus = SCORE_ZERO; Bitboard squaresToQueen, defendedSquares, unsafeSquares, supportingPawns; Bitboard b = ei.pi->passed_pawns(Us); - while (b) - { + if (!b) + return; + + do { Square s = pop_1st_bit(&b); assert(pos.pawn_is_passed(Us, s)); @@ -802,11 +809,12 @@ namespace { else if (pos.pieces(ROOK, QUEEN, Them)) ebonus -= ebonus / 4; } + bonus += make_score(mbonus, ebonus); - // Add the scores for this pawn to the middle game and endgame eval - ei.value += Sign[Us] * apply_weight(make_score(mbonus, ebonus), Weights[PassedPawns]); + } while (b); - } // while + // Add the scores to the middle game and endgame eval + ei.value += Sign[Us] * apply_weight(bonus, Weights[PassedPawns]); }