// 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
Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei);
template<Color Us, bool HasPopCnt>
- void evaluate_king(const Position& pos, EvalInfo& ei);
+ void evaluate_king(const Position& pos, EvalInfo& ei, Value margins[]);
template<Color Us>
void evaluate_threats(const Position& pos, EvalInfo& ei);
// 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);
// 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<WHITE, HasPopCnt>(pos, ei);
- evaluate_king<BLACK, HasPopCnt>(pos, ei);
+ evaluate_king<WHITE, HasPopCnt>(pos, ei, margins);
+ evaluate_king<BLACK, HasPopCnt>(pos, ei, margins);
// Evaluate tactical threats, we need full attack info including king
evaluate_threats<WHITE>(pos, ei);
evaluate_passed_pawns<WHITE>(pos, ei);
evaluate_passed_pawns<BLACK>(pos, ei);
- Phase phase = ei.mi->game_phase();
+ Phase phase = mi->game_phase();
// Middle-game specific evaluation terms
if (phase > PHASE_ENDGAME)
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<WHITE, HasPopCnt>(pos, ei) - evaluate_space<BLACK, HasPopCnt>(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]);
}
}
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);
}
// evaluate_king<>() assigns bonuses and penalties to a king of a given color
template<Color Us, bool HasPopCnt>
- 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);
// 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]);
+ }
}