Remove temporary array of shelters and avoid iterating over it each time to find
if the shelter values after castling are better than the current value.
Work done on top of https://github.com/official-stockfish/Stockfish/pull/2277
Speed benchmark did not measure any difference.
No functional change
Square ksq = pos.square<KING>(Us);
kingSquares[Us] = ksq;
castlingRights[Us] = pos.castling_rights(Us);
Square ksq = pos.square<KING>(Us);
kingSquares[Us] = ksq;
castlingRights[Us] = pos.castling_rights(Us);
+ auto compare = [](Score a, Score b) { return mg_value(a) <= mg_value(b); };
- Score shelters[3] = { evaluate_shelter<Us>(pos, ksq),
- make_score(-VALUE_INFINITE, 0),
- make_score(-VALUE_INFINITE, 0) };
+ Score shelter = evaluate_shelter<Us>(pos, ksq);
// If we can castle use the bonus after castling if it is bigger
// If we can castle use the bonus after castling if it is bigger
if (pos.can_castle(Us & KING_SIDE))
if (pos.can_castle(Us & KING_SIDE))
- shelters[1] = evaluate_shelter<Us>(pos, relative_square(Us, SQ_G1));
+ shelter = std::max(shelter, evaluate_shelter<Us>(pos, relative_square(Us, SQ_G1)), compare);
if (pos.can_castle(Us & QUEEN_SIDE))
if (pos.can_castle(Us & QUEEN_SIDE))
- shelters[2] = evaluate_shelter<Us>(pos, relative_square(Us, SQ_C1));
-
- for (int i : {1, 2})
- if (mg_value(shelters[i]) > mg_value(shelters[0]))
- shelters[0] = shelters[i];
+ shelter = std::max(shelter, evaluate_shelter<Us>(pos, relative_square(Us, SQ_C1)), compare);
// In endgame we like to bring our king near our closest pawn
Bitboard pawns = pos.pieces(Us, PAWN);
// In endgame we like to bring our king near our closest pawn
Bitboard pawns = pos.pieces(Us, PAWN);
else while (pawns)
minPawnDist = std::min(minPawnDist, distance(ksq, pop_lsb(&pawns)));
else while (pawns)
minPawnDist = std::min(minPawnDist, distance(ksq, pop_lsb(&pawns)));
- return shelters[0] - make_score(0, 16 * minPawnDist);
+ return shelter - make_score(0, 16 * minPawnDist);
}
// Explicit template instantiation
}
// Explicit template instantiation