Ensure correct NNUE king index (#643)
authorFabian Fichter <ianfab@users.noreply.github.com>
Fri, 14 Apr 2023 14:44:37 +0000 (16:44 +0200)
committerGitHub <noreply@github.com>
Fri, 14 Apr 2023 14:44:37 +0000 (16:44 +0200)
src/types.h
src/variant.h

index 0c39841..12de0c6 100644 (file)
@@ -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);
index c7df2f7..a6dbee5 100644 (file)
@@ -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;