mirror of
https://github.com/official-stockfish/Stockfish.git
synced 2026-07-24 05:37:13 +00:00
Remove code unneeded for playing, refactor, update to latest master dev
This commit is contained in:
+100
-158
@@ -80,7 +80,7 @@ std::ostream& operator<<(std::ostream& os, const Position& pos) {
|
||||
{
|
||||
StateInfo st;
|
||||
Position p;
|
||||
p.set(pos.fen(), pos.is_chess960(), &st, pos.this_thread());
|
||||
p.set(pos.fen(), pos.is_chess960(), pos.use_nnue(), &st, pos.this_thread());
|
||||
Tablebases::ProbeState s1, s2;
|
||||
Tablebases::WDLScore wdl = Tablebases::probe_wdl(p, &s1);
|
||||
int dtz = Tablebases::probe_dtz(p, &s2);
|
||||
@@ -154,7 +154,7 @@ void Position::init() {
|
||||
/// This function is not very robust - make sure that input FENs are correct,
|
||||
/// this is assumed to be the responsibility of the GUI.
|
||||
|
||||
Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Thread* th) {
|
||||
Position& Position::set(const string& fenStr, bool isChess960, bool useNnue, StateInfo* si, Thread* th) {
|
||||
/*
|
||||
A FEN string defines a particular position using only the ASCII character set.
|
||||
|
||||
@@ -200,14 +200,8 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th
|
||||
std::fill_n(&pieceList[0][0], sizeof(pieceList) / sizeof(Square), SQ_NONE);
|
||||
st = si;
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
// clear evalList. It is cleared when memset is cleared to zero above...
|
||||
evalList.clear();
|
||||
|
||||
// In updating the PieceList, we have to set which piece is where,
|
||||
// A counter of how much each piece has been used
|
||||
PieceNumber next_piece_number = PIECE_NUMBER_ZERO;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
// Each piece on board gets a unique ID used to track the piece later
|
||||
PieceId piece_id, next_piece_id = PIECE_ID_ZERO;
|
||||
|
||||
ss >> std::noskipws;
|
||||
|
||||
@@ -225,13 +219,15 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th
|
||||
auto pc = Piece(idx);
|
||||
put_piece(pc, sq);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber piece_no =
|
||||
(idx == W_KING) ?PIECE_NUMBER_WKING : //
|
||||
(idx == B_KING) ?PIECE_NUMBER_BKING : // back ball
|
||||
next_piece_number++; // otherwise
|
||||
evalList.put_piece(piece_no, sq, pc); // Place the pc piece in the sq box
|
||||
#endif // defined(EVAL_NNUE)
|
||||
if (useNnue)
|
||||
{
|
||||
// Kings get a fixed ID, other pieces get ID in order of placement
|
||||
piece_id =
|
||||
(idx == W_KING) ? PIECE_ID_WKING :
|
||||
(idx == B_KING) ? PIECE_ID_BKING :
|
||||
next_piece_id++;
|
||||
evalList.put_piece(piece_id, sq, pc);
|
||||
}
|
||||
|
||||
++sq;
|
||||
}
|
||||
@@ -299,13 +295,11 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th
|
||||
gamePly = std::max(2 * (gamePly - 1), 0) + (sideToMove == BLACK);
|
||||
|
||||
chess960 = isChess960;
|
||||
nnue = useNnue;
|
||||
thisThread = th;
|
||||
set_state(st);
|
||||
|
||||
assert(pos_is_ok());
|
||||
#if defined(EVAL_NNUE)
|
||||
assert(evalList.is_valid(*this));
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
return *this;
|
||||
}
|
||||
@@ -410,7 +404,7 @@ Position& Position::set(const string& code, Color c, StateInfo* si) {
|
||||
string fenStr = "8/" + sides[0] + char(8 - sides[0].length() + '0') + "/8/8/8/8/"
|
||||
+ sides[1] + char(8 - sides[1].length() + '0') + "/8 w - - 0 10";
|
||||
|
||||
return set(fenStr, false, si, nullptr);
|
||||
return set(fenStr, false, use_nnue(), si, nullptr);
|
||||
}
|
||||
|
||||
|
||||
@@ -727,10 +721,13 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
++st->rule50;
|
||||
++st->pliesFromNull;
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
// Used by NNUE
|
||||
st->accumulator.computed_accumulation = false;
|
||||
st->accumulator.computed_score = false;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
PieceId dp0 = PIECE_ID_NONE;
|
||||
PieceId dp1 = PIECE_ID_NONE;
|
||||
auto& dp = st->dirtyPiece;
|
||||
dp.dirty_num = 1;
|
||||
|
||||
Color us = sideToMove;
|
||||
Color them = ~us;
|
||||
@@ -739,20 +736,10 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
Piece pc = piece_on(from);
|
||||
Piece captured = type_of(m) == ENPASSANT ? make_piece(them, PAWN) : piece_on(to);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber piece_no0 = PIECE_NUMBER_NB;
|
||||
PieceNumber piece_no1 = PIECE_NUMBER_NB;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
assert(color_of(pc) == us);
|
||||
assert(captured == NO_PIECE || color_of(captured) == (type_of(m) != CASTLING ? them : us));
|
||||
assert(type_of(captured) != KING);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
auto& dp = st->dirtyPiece;
|
||||
dp.dirty_num = 1;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
if (type_of(m) == CASTLING)
|
||||
{
|
||||
assert(pc == make_piece(us, KING));
|
||||
@@ -782,37 +769,23 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
assert(relative_rank(us, to) == RANK_6);
|
||||
assert(piece_on(to) == NO_PIECE);
|
||||
assert(piece_on(capsq) == make_piece(them, PAWN));
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
piece_no1 = piece_no_of(capsq);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
//board[capsq] = NO_PIECE; // Not done by remove_piece()
|
||||
#if defined(EVAL_NNUE)
|
||||
evalList.piece_no_list_board[capsq] = PIECE_NUMBER_NB;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
else {
|
||||
#if defined(EVAL_NNUE)
|
||||
piece_no1 = piece_no_of(capsq);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
st->pawnKey ^= Zobrist::psq[captured][capsq];
|
||||
}
|
||||
else {
|
||||
else
|
||||
st->nonPawnMaterial[them] -= PieceValue[MG][captured];
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
piece_no1 = piece_no_of(capsq);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
if (use_nnue())
|
||||
dp1 = piece_id_on(capsq);
|
||||
|
||||
// Update board and piece lists
|
||||
remove_piece(capsq);
|
||||
|
||||
if (type_of(m) == ENPASSANT)
|
||||
{
|
||||
board[capsq] = NO_PIECE;
|
||||
}
|
||||
|
||||
// Update material hash key and prefetch access to materialTable
|
||||
k ^= Zobrist::psq[captured][capsq];
|
||||
@@ -822,20 +795,17 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
// Reset rule 50 counter
|
||||
st->rule50 = 0;
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
dp.dirty_num = 2; // 2 pieces moved
|
||||
|
||||
dp.pieceNo[1] = piece_no1;
|
||||
dp.changed_piece[1].old_piece = evalList.bona_piece(piece_no1);
|
||||
// Do not use Eval::EvalList::put_piece() because the piece is removed
|
||||
// from the game, and the corresponding elements of the piece lists
|
||||
// needs to be Eval::BONA_PIECE_ZERO.
|
||||
evalList.set_piece_on_board(piece_no1, Eval::BONA_PIECE_ZERO, Eval::BONA_PIECE_ZERO, capsq);
|
||||
// Set PIECE_NUMBER_NB to piece_no_of_board[capsq] directly because it
|
||||
// will not be overritten to pc if the move type is enpassant.
|
||||
evalList.piece_no_list_board[capsq] = PIECE_NUMBER_NB;
|
||||
dp.changed_piece[1].new_piece = evalList.bona_piece(piece_no1);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
if (use_nnue())
|
||||
{
|
||||
dp.dirty_num = 2; // 2 pieces moved
|
||||
dp.pieceId[1] = dp1;
|
||||
dp.old_piece[1] = evalList.piece_with_id(dp1);
|
||||
// Do not use EvalList::put_piece() because the piece is removed
|
||||
// from the game, and the corresponding elements of the piece lists
|
||||
// needs to be PS_NONE.
|
||||
evalList.put_piece(dp1, capsq, NO_PIECE);
|
||||
dp.new_piece[1] = evalList.piece_with_id(dp1);
|
||||
}
|
||||
}
|
||||
|
||||
// Update hash key
|
||||
@@ -858,19 +828,16 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
|
||||
// Move the piece. The tricky Chess960 castling is handled earlier
|
||||
if (type_of(m) != CASTLING) {
|
||||
#if defined(EVAL_NNUE)
|
||||
piece_no0 = piece_no_of(from);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
move_piece(from, to);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
dp.pieceNo[0] = piece_no0;
|
||||
dp.changed_piece[0].old_piece = evalList.bona_piece(piece_no0);
|
||||
evalList.piece_no_list_board[from] = PIECE_NUMBER_NB;
|
||||
evalList.put_piece(piece_no0, to, pc);
|
||||
dp.changed_piece[0].new_piece = evalList.bona_piece(piece_no0);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
if (use_nnue())
|
||||
{
|
||||
dp0 = piece_id_on(from);
|
||||
dp.pieceId[0] = dp0;
|
||||
dp.old_piece[0] = evalList.piece_with_id(dp0);
|
||||
evalList.put_piece(dp0, to, pc);
|
||||
dp.new_piece[0] = evalList.piece_with_id(dp0);
|
||||
}
|
||||
}
|
||||
|
||||
// If the moving piece is a pawn do some special extra work
|
||||
@@ -894,14 +861,12 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
remove_piece(to);
|
||||
put_piece(promotion, to);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
piece_no0 = piece_no_of(to);
|
||||
//dp.pieceNo[0] = piece_no0;
|
||||
//dp.changed_piece[0].old_piece = evalList.bona_piece(piece_no0);
|
||||
assert(evalList.piece_no_list_board[from] == PIECE_NUMBER_NB);
|
||||
evalList.put_piece(piece_no0, to, promotion);
|
||||
dp.changed_piece[0].new_piece = evalList.bona_piece(piece_no0);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
if (use_nnue())
|
||||
{
|
||||
dp0 = piece_id_on(to);
|
||||
evalList.put_piece(dp0, to, promotion);
|
||||
dp.new_piece[0] = evalList.piece_with_id(dp0);
|
||||
}
|
||||
|
||||
// Update hash keys
|
||||
k ^= Zobrist::psq[pc][to] ^ Zobrist::psq[promotion][to];
|
||||
@@ -953,12 +918,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
}
|
||||
}
|
||||
|
||||
//std::cout << *this << std::endl;
|
||||
|
||||
assert(pos_is_ok());
|
||||
#if defined(EVAL_NNUE)
|
||||
assert(evalList.is_valid(*this));
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
|
||||
@@ -988,11 +948,6 @@ void Position::undo_move(Move m) {
|
||||
remove_piece(to);
|
||||
pc = make_piece(us, PAWN);
|
||||
put_piece(pc, to);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber piece_no0 = st->dirtyPiece.pieceNo[0];
|
||||
evalList.put_piece(piece_no0, to, pc);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
if (type_of(m) == CASTLING)
|
||||
@@ -1005,11 +960,11 @@ void Position::undo_move(Move m) {
|
||||
|
||||
move_piece(to, from); // Put the piece back at the source square
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber piece_no0 = st->dirtyPiece.pieceNo[0];
|
||||
evalList.put_piece(piece_no0, from, pc);
|
||||
evalList.piece_no_list_board[to] = PIECE_NUMBER_NB;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
if (use_nnue())
|
||||
{
|
||||
PieceId dp0 = st->dirtyPiece.pieceId[0];
|
||||
evalList.put_piece(dp0, from, pc);
|
||||
}
|
||||
|
||||
if (st->capturedPiece)
|
||||
{
|
||||
@@ -1028,12 +983,13 @@ void Position::undo_move(Move m) {
|
||||
|
||||
put_piece(st->capturedPiece, capsq); // Restore the captured piece
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber piece_no1 = st->dirtyPiece.pieceNo[1];
|
||||
assert(evalList.bona_piece(piece_no1).fw == Eval::BONA_PIECE_ZERO);
|
||||
assert(evalList.bona_piece(piece_no1).fb == Eval::BONA_PIECE_ZERO);
|
||||
evalList.put_piece(piece_no1, capsq, st->capturedPiece);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
if (use_nnue())
|
||||
{
|
||||
PieceId dp1 = st->dirtyPiece.pieceId[1];
|
||||
assert(evalList.piece_with_id(dp1).fw == PS_NONE);
|
||||
assert(evalList.piece_with_id(dp1).fb == PS_NONE);
|
||||
evalList.put_piece(dp1, capsq, st->capturedPiece);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1042,9 +998,6 @@ void Position::undo_move(Move m) {
|
||||
--gamePly;
|
||||
|
||||
assert(pos_is_ok());
|
||||
#if defined(EVAL_NNUE)
|
||||
assert(evalList.is_valid(*this));
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
|
||||
@@ -1052,32 +1005,12 @@ void Position::undo_move(Move m) {
|
||||
/// is a bit tricky in Chess960 where from/to squares can overlap.
|
||||
template<bool Do>
|
||||
void Position::do_castling(Color us, Square from, Square& to, Square& rfrom, Square& rto) {
|
||||
#if defined(EVAL_NNUE)
|
||||
auto& dp = st->dirtyPiece;
|
||||
// Record the moved pieces in StateInfo for difference calculation.
|
||||
dp.dirty_num = 2; // 2 pieces moved
|
||||
|
||||
PieceNumber piece_no0;
|
||||
PieceNumber piece_no1;
|
||||
|
||||
if (Do) {
|
||||
piece_no0 = piece_no_of(from);
|
||||
piece_no1 = piece_no_of(to);
|
||||
}
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
bool kingSide = to > from;
|
||||
rfrom = to; // Castling is encoded as "king captures friendly rook"
|
||||
rto = relative_square(us, kingSide ? SQ_F1 : SQ_D1);
|
||||
to = relative_square(us, kingSide ? SQ_G1 : SQ_C1);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
if (!Do) {
|
||||
piece_no0 = piece_no_of(to);
|
||||
piece_no1 = piece_no_of(rto);
|
||||
}
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
// Remove both pieces first since squares could overlap in Chess960
|
||||
remove_piece(Do ? from : to);
|
||||
remove_piece(Do ? rfrom : rto);
|
||||
@@ -1085,27 +1018,31 @@ void Position::do_castling(Color us, Square from, Square& to, Square& rfrom, Squ
|
||||
put_piece(make_piece(us, KING), Do ? to : from);
|
||||
put_piece(make_piece(us, ROOK), Do ? rto : rfrom);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
if (Do) {
|
||||
dp.pieceNo[0] = piece_no0;
|
||||
dp.changed_piece[0].old_piece = evalList.bona_piece(piece_no0);
|
||||
evalList.piece_no_list_board[from] = PIECE_NUMBER_NB;
|
||||
evalList.put_piece(piece_no0, to, make_piece(us, KING));
|
||||
dp.changed_piece[0].new_piece = evalList.bona_piece(piece_no0);
|
||||
if (use_nnue())
|
||||
{
|
||||
PieceId dp0, dp1;
|
||||
auto& dp = st->dirtyPiece;
|
||||
dp.dirty_num = 2; // 2 pieces moved
|
||||
|
||||
dp.pieceNo[1] = piece_no1;
|
||||
dp.changed_piece[1].old_piece = evalList.bona_piece(piece_no1);
|
||||
evalList.piece_no_list_board[rfrom] = PIECE_NUMBER_NB;
|
||||
evalList.put_piece(piece_no1, rto, make_piece(us, ROOK));
|
||||
dp.changed_piece[1].new_piece = evalList.bona_piece(piece_no1);
|
||||
if (Do) {
|
||||
dp0 = piece_id_on(from);
|
||||
dp1 = piece_id_on(rfrom);
|
||||
dp.pieceId[0] = dp0;
|
||||
dp.old_piece[0] = evalList.piece_with_id(dp0);
|
||||
evalList.put_piece(dp0, to, make_piece(us, KING));
|
||||
dp.new_piece[0] = evalList.piece_with_id(dp0);
|
||||
dp.pieceId[1] = dp1;
|
||||
dp.old_piece[1] = evalList.piece_with_id(dp1);
|
||||
evalList.put_piece(dp1, rto, make_piece(us, ROOK));
|
||||
dp.new_piece[1] = evalList.piece_with_id(dp1);
|
||||
}
|
||||
else {
|
||||
dp0 = piece_id_on(to);
|
||||
dp1 = piece_id_on(rto);
|
||||
evalList.put_piece(dp0, from, make_piece(us, KING));
|
||||
evalList.put_piece(dp1, rfrom, make_piece(us, ROOK));
|
||||
}
|
||||
}
|
||||
else {
|
||||
evalList.piece_no_list_board[to] = PIECE_NUMBER_NB;
|
||||
evalList.put_piece(piece_no0, from, make_piece(us, KING));
|
||||
evalList.piece_no_list_board[rto] = PIECE_NUMBER_NB;
|
||||
evalList.put_piece(piece_no1, rfrom, make_piece(us, ROOK));
|
||||
}
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
|
||||
@@ -1130,9 +1067,8 @@ void Position::do_null_move(StateInfo& newSt) {
|
||||
st->key ^= Zobrist::side;
|
||||
prefetch(TT.first_entry(st->key));
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
st->accumulator.computed_score = false;
|
||||
#endif
|
||||
if (use_nnue())
|
||||
st->accumulator.computed_score = false;
|
||||
|
||||
++st->rule50;
|
||||
st->pliesFromNull = 0;
|
||||
@@ -1388,7 +1324,7 @@ void Position::flip() {
|
||||
std::getline(ss, token); // Half and full moves
|
||||
f += token;
|
||||
|
||||
set(f, is_chess960(), st, this_thread());
|
||||
set(f, is_chess960(), use_nnue(), st, this_thread());
|
||||
|
||||
assert(pos_is_ok());
|
||||
}
|
||||
@@ -1464,12 +1400,18 @@ bool Position::pos_is_ok() const {
|
||||
return true;
|
||||
}
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber Position::piece_no_of(Square sq) const
|
||||
StateInfo* Position::state() const {
|
||||
return st;
|
||||
}
|
||||
|
||||
const EvalList* Position::eval_list() const {
|
||||
return &evalList;
|
||||
}
|
||||
|
||||
PieceId Position::piece_id_on(Square sq) const
|
||||
{
|
||||
assert(piece_on(sq) != NO_PIECE);
|
||||
PieceNumber n = evalList.piece_no_of_board(sq);
|
||||
assert(is_ok(n));
|
||||
return n;
|
||||
PieceId pid = evalList.piece_id_list[sq];
|
||||
assert(is_ok(pid));
|
||||
return pid;
|
||||
}
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
Reference in New Issue
Block a user