This patch simplifies Position::do_move() by moving the PSQ score from
StateInfo to Position and updating it inside the put/remove/move_piece
functions.
The downside is that there is now slightly more computation done in
Position::undo_move(), but the fishtest results are Elo neutral.
Passed STC:
LLR: 2.95 (-2.94,2.94) [-3.00,1.00]
Total: 78820 W: 15775 L: 15760 D: 47285
http://tests.stockfishchess.org/tests/view/
5b1cd1d00ebc5902ab9c64ab
Passed LTC:
LLR: 2.96 (-2.94,2.94) [-3.00,1.00]
Total: 32966 W: 5716 L: 5615 D: 21635
http://tests.stockfishchess.org/tests/view/
5b31e1230ebc5902b2e5a833
Closes https://github.com/official-stockfish/Stockfish/pull/1647
No functional change.
-namespace PSQT {
- extern Score psq[PIECE_NB][SQUARE_NB];
-}
-
namespace Zobrist {
Key psq[PIECE_NB][SQUARE_NB];
namespace Zobrist {
Key psq[PIECE_NB][SQUARE_NB];
si->key = si->materialKey = 0;
si->pawnKey = Zobrist::noPawns;
si->nonPawnMaterial[WHITE] = si->nonPawnMaterial[BLACK] = VALUE_ZERO;
si->key = si->materialKey = 0;
si->pawnKey = Zobrist::noPawns;
si->nonPawnMaterial[WHITE] = si->nonPawnMaterial[BLACK] = VALUE_ZERO;
si->checkersBB = attackers_to(square<KING>(sideToMove)) & pieces(~sideToMove);
set_check_info(si);
si->checkersBB = attackers_to(square<KING>(sideToMove)) & pieces(~sideToMove);
set_check_info(si);
Square s = pop_lsb(&b);
Piece pc = piece_on(s);
si->key ^= Zobrist::psq[pc][s];
Square s = pop_lsb(&b);
Piece pc = piece_on(s);
si->key ^= Zobrist::psq[pc][s];
- si->psq += PSQT::psq[pc][s];
}
if (si->epSquare != SQ_NONE)
}
if (si->epSquare != SQ_NONE)
Square rfrom, rto;
do_castling<true>(us, from, to, rfrom, rto);
Square rfrom, rto;
do_castling<true>(us, from, to, rfrom, rto);
- st->psq += PSQT::psq[captured][rto] - PSQT::psq[captured][rfrom];
k ^= Zobrist::psq[captured][rfrom] ^ Zobrist::psq[captured][rto];
captured = NO_PIECE;
}
k ^= Zobrist::psq[captured][rfrom] ^ Zobrist::psq[captured][rto];
captured = NO_PIECE;
}
st->materialKey ^= Zobrist::psq[captured][pieceCount[captured]];
prefetch(thisThread->materialTable[st->materialKey]);
st->materialKey ^= Zobrist::psq[captured][pieceCount[captured]];
prefetch(thisThread->materialTable[st->materialKey]);
- // Update incremental scores
- st->psq -= PSQT::psq[captured][capsq];
-
// Reset rule 50 counter
st->rule50 = 0;
}
// Reset rule 50 counter
st->rule50 = 0;
}
st->materialKey ^= Zobrist::psq[promotion][pieceCount[promotion]-1]
^ Zobrist::psq[pc][pieceCount[pc]];
st->materialKey ^= Zobrist::psq[promotion][pieceCount[promotion]-1]
^ Zobrist::psq[pc][pieceCount[pc]];
- // Update incremental score
- st->psq += PSQT::psq[promotion][to] - PSQT::psq[pc][to];
-
// Update material
st->nonPawnMaterial[us] += PieceValue[MG][promotion];
}
// Update material
st->nonPawnMaterial[us] += PieceValue[MG][promotion];
}
- // Update incremental scores
- st->psq += PSQT::psq[pc][to] - PSQT::psq[pc][from];
-
// Set capture piece
st->capturedPiece = captured;
// Set capture piece
st->capturedPiece = captured;
int castlingRights;
int rule50;
int pliesFromNull;
int castlingRights;
int rule50;
int pliesFromNull;
Square epSquare;
// Not copied when making a move (will be recomputed anyhow)
Square epSquare;
// Not copied when making a move (will be recomputed anyhow)
Bitboard castlingPath[CASTLING_RIGHT_NB];
int gamePly;
Color sideToMove;
Bitboard castlingPath[CASTLING_RIGHT_NB];
int gamePly;
Color sideToMove;
Thread* thisThread;
StateInfo* st;
bool chess960;
};
Thread* thisThread;
StateInfo* st;
bool chess960;
};
+namespace PSQT {
+ extern Score psq[PIECE_NB][SQUARE_NB];
+}
+
extern std::ostream& operator<<(std::ostream& os, const Position& pos);
inline Color Position::side_to_move() const {
extern std::ostream& operator<<(std::ostream& os, const Position& pos);
inline Color Position::side_to_move() const {
}
inline Score Position::psq_score() const {
}
inline Score Position::psq_score() const {
}
inline Value Position::non_pawn_material(Color c) const {
}
inline Value Position::non_pawn_material(Color c) const {
index[s] = pieceCount[pc]++;
pieceList[pc][index[s]] = s;
pieceCount[make_piece(color_of(pc), ALL_PIECES)]++;
index[s] = pieceCount[pc]++;
pieceList[pc][index[s]] = s;
pieceCount[make_piece(color_of(pc), ALL_PIECES)]++;
+ psq += PSQT::psq[pc][s];
}
inline void Position::remove_piece(Piece pc, Square s) {
}
inline void Position::remove_piece(Piece pc, Square s) {
pieceList[pc][index[lastSquare]] = lastSquare;
pieceList[pc][pieceCount[pc]] = SQ_NONE;
pieceCount[make_piece(color_of(pc), ALL_PIECES)]--;
pieceList[pc][index[lastSquare]] = lastSquare;
pieceList[pc][pieceCount[pc]] = SQ_NONE;
pieceCount[make_piece(color_of(pc), ALL_PIECES)]--;
+ psq -= PSQT::psq[pc][s];
}
inline void Position::move_piece(Piece pc, Square from, Square to) {
}
inline void Position::move_piece(Piece pc, Square from, Square to) {
board[to] = pc;
index[to] = index[from];
pieceList[pc][index[to]] = to;
board[to] = pc;
index[to] = index[from];
pieceList[pc][index[to]] = to;
+ psq += PSQT::psq[pc][to] - PSQT::psq[pc][from];
}
inline void Position::do_move(Move m, StateInfo& newSt) {
}
inline void Position::do_move(Move m, StateInfo& newSt) {