}
int16_t score_position_side(const Board &board, const Color side, const uint16_t phase_score) {
U64 bitboard;
using score::Phase::ENDGAME;
using score::Phase::OPENING;
int16_t total = 0, opening = 0, endgame = 0;
U64 bitboard;
int8_t square_i;
const U64 pawns = board.get_bitboard_piece(PAWN);
const U64 pawnsS = board.get_bitboard_piece(PAWN, side);
const U64 pawnsO = pawns & ~pawnsS;
bitboard = board.get_bitboard_piece(PAWN, side);
bitboard_for_each_bit(square_i, bitboard) {
const auto square = static_cast<Square>(square_i);
opening += score::get(PAWN, side, square, OPENING) + score::get(PAWN, OPENING);
endgame += score::get(PAWN, side, square, ENDGAME) + score::get(PAWN, ENDGAME);
// check isolated, doubled and passed pawns
const uint8_t file = get_file(square), rank = get_rank(square);
if (!(mask_isolated[file] & pawnsS)) {
opening -= score::pawn_isolated_opening;
endgame -= score::pawn_isolated_endgame;
}
int16_t total = 0, opening = 0, endgame = 0;
if (bit::count(pawnsS & mask_file[file]) > 1) {
opening -= score::pawn_double_opening;
endgame -= score::pawn_double_endgame;
const U32 hash = board.get_hash_pawn();
const U32 key = ptable.read(hash, side);
if (key == __UINT32_MAX__) {
bitboard = board.get_bitboard_piece(PAWN, side);
bitboard_for_each_bit(square_i, bitboard) {
const auto square = static_cast<Square>(square_i);
opening += score::get(PAWN, side, square, OPENING) + score::get(PAWN, OPENING);
endgame += score::get(PAWN, side, square, ENDGAME) + score::get(PAWN, ENDGAME);
// check isolated, doubled and passed pawns
const uint8_t file = get_file(square), rank = get_rank(square);
if (!(mask_isolated[file] & pawnsS)) {
opening -= score::pawn_isolated_opening;
endgame -= score::pawn_isolated_endgame;
}
if (bit::count(pawnsS & mask_file[file]) > 1) {
opening -= score::pawn_double_opening;
endgame -= score::pawn_double_endgame;
}
if (!(pawnsO & mask_passed[side][square_i])) total += score::pawn_passed[side][rank];
}
if (!(pawnsO & mask_passed[side][square_i])) total += score::pawn_passed[side][rank];
ptable.write(hash, side, opening, endgame, total);
} else {
opening = ptable.read_opening(key);
endgame = ptable.read_endgame(key);
total = ptable.read_total(key);
}
bitboard = board.get_bitboard_piece(KNIGHT, side);