X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fevaluate.cpp;h=38123c9a7edcb21e76a913a0f8d333d1bacbce3e;hb=3107e68c03ed1e227a8058f3cb478862f9c667e4;hp=981c97db9b33628ca7fa7237de74a7c956dcc61d;hpb=15d265cc664e0e49fa82cccb7471da0a5612ce25;p=stockfish diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 981c97db..38123c9a 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -45,13 +45,7 @@ namespace { // Middle and end game position's static evaluations Score value; - // margin[color] stores the evaluation margins we should consider for - // the given position. This is a kind of uncertainty estimation and - // typically is used by the search for pruning decisions. - Value margin[2]; - - // Pointers to material and pawn hash table entries - MaterialInfo* mi; + // Pointer to pawn hash table entry PawnInfo* pi; // attackedBy[color][piece type] is a bitboard representing all squares @@ -244,7 +238,7 @@ namespace { Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei); template - void evaluate_king(const Position& pos, EvalInfo& ei); + void evaluate_king(const Position& pos, EvalInfo& ei, Value margins[]); template void evaluate_threats(const Position& pos, EvalInfo& ei); @@ -300,18 +294,22 @@ Value do_evaluate(const Position& pos, Value margins[]) { // position object (material + piece square tables). ei.value = pos.value(); + // margins[color] stores the uncertainty estimation of position's evaluation + // and typically is used by the search for pruning decisions. + margins[WHITE] = margins[BLACK] = VALUE_ZERO; + // Probe the material hash table - ei.mi = MaterialTable[pos.thread()]->get_material_info(pos); - ei.value += ei.mi->material_value(); + MaterialInfo* mi = MaterialTable[pos.thread()]->get_material_info(pos); + ei.value += mi->material_value(); // If we have a specialized evaluation function for the current material // configuration, call it and return. - if (ei.mi->specialized_eval_exists()) - return ei.mi->evaluate(pos); + if (mi->specialized_eval_exists()) + return mi->evaluate(pos); // After get_material_info() call that modifies them - factor[WHITE] = ei.mi->scale_factor(pos, WHITE); - factor[BLACK] = ei.mi->scale_factor(pos, BLACK); + factor[WHITE] = mi->scale_factor(pos, WHITE); + factor[BLACK] = mi->scale_factor(pos, BLACK); // Probe the pawn hash table ei.pi = PawnTable[pos.thread()]->get_pawn_info(pos); @@ -329,8 +327,8 @@ Value do_evaluate(const Position& pos, Value margins[]) { // Kings. Kings are evaluated after all other pieces for both sides, // because we need complete attack information for all pieces when computing // the king safety evaluation. - evaluate_king(pos, ei); - evaluate_king(pos, ei); + evaluate_king(pos, ei, margins); + evaluate_king(pos, ei, margins); // Evaluate tactical threats, we need full attack info including king evaluate_threats(pos, ei); @@ -340,7 +338,7 @@ Value do_evaluate(const Position& pos, Value margins[]) { evaluate_passed_pawns(pos, ei); evaluate_passed_pawns(pos, ei); - Phase phase = ei.mi->game_phase(); + Phase phase = mi->game_phase(); // Middle-game specific evaluation terms if (phase > PHASE_ENDGAME) @@ -357,10 +355,10 @@ Value do_evaluate(const Position& pos, Value margins[]) { 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) + if (mi->space_weight() > 0) { int s = evaluate_space(pos, ei) - evaluate_space(pos, ei); - ei.value += apply_weight(make_score(s * ei.mi->space_weight(), 0), Weights[Space]); + ei.value += apply_weight(make_score(s * mi->space_weight(), 0), Weights[Space]); } } @@ -393,10 +391,6 @@ Value do_evaluate(const Position& pos, Value margins[]) { factor[BLACK] = sf; } - // Populate margins[] - margins[WHITE] = ei.margin[WHITE]; - margins[BLACK] = ei.margin[BLACK]; - // Interpolate between the middle game and the endgame score return Sign[pos.side_to_move()] * scale_by_game_phase(ei.value, phase, factor); } @@ -681,7 +675,7 @@ namespace { // evaluate_king<>() assigns bonuses and penalties to a king of a given color template - void evaluate_king(const Position& pos, EvalInfo& ei) { + void evaluate_king(const Position& pos, EvalInfo& ei, Value margins[]) { const Color Them = (Us == WHITE ? BLACK : WHITE); @@ -767,9 +761,8 @@ namespace { // 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.margin[Us] = mg_value(KingDangerTable[Us][attackUnits]); - } else - ei.margin[Us] = VALUE_ZERO; + margins[Us] += mg_value(KingDangerTable[Us][attackUnits]); + } }