Improve mobility performance by bitboard
And fix mobilityDiff value is wrong when moving.
This commit is contained in:
parent
c0f92c2dcd
commit
d719c70c5a
|
@ -719,28 +719,26 @@ bool Position::put_piece(Square s, bool updateRecord)
|
|||
|
||||
const Piece pc = board[currentSquare];
|
||||
|
||||
board[s] = pc;
|
||||
update_key(s);
|
||||
revert_key(currentSquare);
|
||||
|
||||
updateMobility(MOVETYPE_PLACE, s);
|
||||
|
||||
board[currentSquare] = NO_PIECE;
|
||||
|
||||
updateMobility(MOVETYPE_REMOVE, currentSquare);
|
||||
|
||||
CLEAR_BIT(byTypeBB[ALL_PIECES], currentSquare);
|
||||
CLEAR_BIT(byTypeBB[type_of(pc)], currentSquare);
|
||||
CLEAR_BIT(byColorBB[color_of(pc)], currentSquare);
|
||||
|
||||
updateMobility(MOVETYPE_REMOVE, currentSquare);
|
||||
|
||||
SET_BIT(byTypeBB[ALL_PIECES], s);
|
||||
SET_BIT(byTypeBB[type_of(pc)], s);
|
||||
SET_BIT(byColorBB[color_of(pc)], s);
|
||||
|
||||
updateMobility(MOVETYPE_PLACE, s);
|
||||
|
||||
board[s] = pc;
|
||||
update_key(s);
|
||||
revert_key(currentSquare);
|
||||
|
||||
board[currentSquare] = NO_PIECE;
|
||||
|
||||
currentSquare = s;
|
||||
|
||||
|
||||
|
||||
const int n = mills_count(currentSquare);
|
||||
|
||||
if (n == 0
|
||||
|
@ -792,8 +790,6 @@ bool Position::remove_piece(Square s, bool updateRecord)
|
|||
|
||||
revert_key(s);
|
||||
|
||||
updateMobility(MOVETYPE_REMOVE, s);
|
||||
|
||||
if (rule.hasBannedLocations && phase == Phase::placing) {
|
||||
// Remove and put ban
|
||||
Piece pc = board[s];
|
||||
|
@ -801,6 +797,8 @@ bool Position::remove_piece(Square s, bool updateRecord)
|
|||
CLEAR_BIT(byTypeBB[type_of(pc)], s); // TODO
|
||||
CLEAR_BIT(byColorBB[color_of(pc)], s);
|
||||
|
||||
updateMobility(MOVETYPE_REMOVE, s);
|
||||
|
||||
pc = board[s] = BAN_STONE;
|
||||
update_key(s);
|
||||
|
||||
|
@ -813,6 +811,8 @@ bool Position::remove_piece(Square s, bool updateRecord)
|
|||
CLEAR_BIT(byTypeBB[type_of(pc)], s);
|
||||
CLEAR_BIT(byColorBB[color_of(pc)], s);
|
||||
|
||||
updateMobility(MOVETYPE_REMOVE, s);
|
||||
|
||||
board[s] = NO_PIECE;
|
||||
}
|
||||
|
||||
|
@ -1356,45 +1356,30 @@ void Position::reset_bb()
|
|||
|
||||
void Position::updateMobility(MoveType mt, Square s)
|
||||
{
|
||||
Bitboard adjacentWhiteBB = byColorBB[WHITE] & MoveList<LEGAL>::adjacentSquaresBB[s];
|
||||
Bitboard adjacentBlackBB = byColorBB[BLACK] & MoveList<LEGAL>::adjacentSquaresBB[s];
|
||||
Bitboard adjacentNoColorBB = (~(byColorBB[BLACK] | byColorBB[WHITE])) & MoveList<LEGAL>::adjacentSquaresBB[s];
|
||||
int adjacentWhiteBBCount = popcount(adjacentWhiteBB);
|
||||
int adjacentBlackBBCount = popcount(adjacentBlackBB);
|
||||
int adjacentNoColorBBCount = popcount(adjacentNoColorBB);
|
||||
|
||||
if (mt == MOVETYPE_PLACE) {
|
||||
for (MoveDirection d = MD_BEGIN; d < MD_NB; ++d) {
|
||||
auto adjacentSquare = static_cast<Square>(MoveList<LEGAL>::adjacentSquares[s][d]);
|
||||
mobilityDiff -= adjacentWhiteBBCount;
|
||||
mobilityDiff += adjacentBlackBBCount;
|
||||
|
||||
if (!adjacentSquare) {
|
||||
break;;
|
||||
}
|
||||
|
||||
if (board[adjacentSquare] & W_STONE) {
|
||||
mobilityDiff--;
|
||||
} else if (board[adjacentSquare] & B_STONE) {
|
||||
mobilityDiff++;
|
||||
} else {
|
||||
if (side_to_move() == WHITE) {
|
||||
mobilityDiff++;
|
||||
mobilityDiff += adjacentNoColorBBCount;
|
||||
} else {
|
||||
mobilityDiff--;
|
||||
}
|
||||
}
|
||||
mobilityDiff -= adjacentNoColorBBCount;
|
||||
}
|
||||
} else if (mt == MOVETYPE_REMOVE) {
|
||||
for (MoveDirection d = MD_BEGIN; d < MD_NB; ++d) {
|
||||
auto adjacentSquare = static_cast<Square>(MoveList<LEGAL>::adjacentSquares[s][d]);
|
||||
mobilityDiff += adjacentWhiteBBCount;
|
||||
mobilityDiff -= adjacentBlackBBCount;
|
||||
|
||||
if (!adjacentSquare) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (board[adjacentSquare] & W_STONE) {
|
||||
mobilityDiff++;
|
||||
} else if (board[adjacentSquare] & B_STONE) {
|
||||
mobilityDiff--;
|
||||
if ( color_of(board[s]) == WHITE) {
|
||||
mobilityDiff -= adjacentNoColorBBCount;
|
||||
} else {
|
||||
if (side_to_move() == WHITE) {
|
||||
mobilityDiff++;
|
||||
} else {
|
||||
mobilityDiff--;
|
||||
}
|
||||
}
|
||||
mobilityDiff += adjacentNoColorBBCount;
|
||||
}
|
||||
} else {
|
||||
assert(0);
|
||||
|
|
Loading…
Reference in New Issue