From: Fabian Fichter Date: Fri, 14 Apr 2023 14:44:37 +0000 (+0200) Subject: Ensure correct NNUE king index (#643) X-Git-Url: http://winboard.nl/cgi-bin?a=commitdiff_plain;h=00ea5136ea3ea1d811dfe8dd2427ebad43fe597f;p=fairystockfish.git Ensure correct NNUE king index (#643) --- diff --git a/src/types.h b/src/types.h index 0c39841..12de0c6 100644 --- a/src/types.h +++ b/src/types.h @@ -646,9 +646,14 @@ constexpr PieceSet operator| (PieceSet ps1, PieceSet ps2) { return (PieceSet)((u constexpr PieceSet operator| (PieceSet ps, PieceType pt) { return ps | piece_set(pt); } constexpr PieceSet operator& (PieceSet ps1, PieceSet ps2) { return (PieceSet)((uint64_t)ps1 & (uint64_t)ps2); } constexpr PieceSet operator& (PieceSet ps, PieceType pt) { return ps & piece_set(pt); } +constexpr PieceSet operator^ (PieceSet ps1, PieceSet ps2) { return (PieceSet)((uint64_t)ps1 ^ (uint64_t)ps2); } +constexpr PieceSet operator^ (PieceSet ps, PieceType pt) { return ps ^ piece_set(pt); } inline PieceSet& operator|= (PieceSet& ps1, PieceSet ps2) { return (PieceSet&)((uint64_t&)ps1 |= (uint64_t)ps2); } inline PieceSet& operator|= (PieceSet& ps, PieceType pt) { return ps |= piece_set(pt); } inline PieceSet& operator&= (PieceSet& ps1, PieceSet ps2) { return (PieceSet&)((uint64_t&)ps1 &= (uint64_t)ps2); } +//inline PieceSet& operator&= (PieceSet& ps, PieceType pt) does not make sense +inline PieceSet& operator^= (PieceSet& ps1, PieceSet ps2) { return (PieceSet&)((uint64_t&)ps1 ^= (uint64_t)ps2); } +inline PieceSet& operator^= (PieceSet& ps, PieceType pt) { return ps ^= piece_set(pt); } static_assert(piece_set(PAWN) & PAWN); static_assert(piece_set(KING) & KING); diff --git a/src/variant.h b/src/variant.h index c7df2f7..a6dbee5 100644 --- a/src/variant.h +++ b/src/variant.h @@ -258,7 +258,11 @@ struct Variant { int i = 0; for (PieceSet ps = pieceTypes; ps;) { - PieceType pt = pop_lsb(ps); + // Make sure that the nnueKing type gets the last index, since the NNUE architecture relies on that + PieceType pt = lsb(ps != piece_set(nnueKing) ? ps & ~piece_set(nnueKing) : ps); + ps ^= pt; + assert(pt != nnueKing || !ps); + for (Color c : { WHITE, BLACK}) { pieceSquareIndex[c][make_piece(c, pt)] = 2 * i * nnueSquares;