Skip to content

Commit

Permalink
Revert "⚡ Optimize castling and en-passant moves Zobrist hashing (#577)"
Browse files Browse the repository at this point in the history
This reverts commit adba5ff
  • Loading branch information
eduherminio committed Jan 8, 2024
1 parent 1123958 commit 36bc0b5
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 64 deletions.
6 changes: 3 additions & 3 deletions src/Lynx/Model/GameState.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
namespace Lynx.Model;
public readonly struct GameState
{
public readonly long ZobristKey;
public readonly sbyte CapturedPiece;

public readonly byte Castle;

public readonly sbyte CapturedPiece;

public readonly BoardSquare EnPassant;

public readonly long ZobristKey;

public GameState(sbyte capturedPiece, byte castle, BoardSquare enpassant, long zobristKey)
{
CapturedPiece = capturedPiece;
Expand Down
56 changes: 24 additions & 32 deletions src/Lynx/ZobristTable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,6 @@ public static class ZobristTable
{
private static readonly long[,] _table = Initialize();

private static readonly long WK_Hash = _table[(int)BoardSquare.a8, (int)Piece.p];
private static readonly long WQ_Hash = _table[(int)BoardSquare.b8, (int)Piece.p];
private static readonly long BK_Hash = _table[(int)BoardSquare.c8, (int)Piece.p];
private static readonly long BQ_Hash = _table[(int)BoardSquare.d8, (int)Piece.p];

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static long PieceHash(int boardSquare, int piece) => _table[boardSquare, piece];

Expand All @@ -39,7 +34,7 @@ public static long EnPassantHash(int enPassantSquare)
}
#endif

var file = enPassantSquare & 0x07; // enPassantSquare % 8
var file = enPassantSquare % 8;

return _table[file, (int)Piece.P];
}
Expand All @@ -62,34 +57,31 @@ public static long SideHash()
/// <param name="castle"></param>
/// <returns></returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static long CastleHash(byte castle)
public static long CastleHash(int castle)
{
return castle switch
long combinedHash = 0;

if ((castle & (int)CastlingRights.WK) != default)
{
0 => 0, // - | -

(byte)CastlingRights.WK => WK_Hash, // K | -
(byte)CastlingRights.WQ => WQ_Hash, // Q | -
(byte)CastlingRights.BK => BK_Hash, // - | k
(byte)CastlingRights.BQ => BQ_Hash, // - | q

(byte)CastlingRights.WK | (byte)CastlingRights.WQ => WK_Hash ^ WQ_Hash, // KQ | -
(byte)CastlingRights.WK | (byte)CastlingRights.BK => WK_Hash ^ BK_Hash, // K | k
(byte)CastlingRights.WK | (byte)CastlingRights.BQ => WK_Hash ^ BQ_Hash, // K | q
(byte)CastlingRights.WQ | (byte)CastlingRights.BK => WQ_Hash ^ BK_Hash, // Q | k
(byte)CastlingRights.WQ | (byte)CastlingRights.BQ => WQ_Hash ^ BQ_Hash, // Q | q
(byte)CastlingRights.BK | (byte)CastlingRights.BQ => BK_Hash ^ BQ_Hash, // - | kq

(byte)CastlingRights.WK | (byte)CastlingRights.WQ | (byte)CastlingRights.BK => WK_Hash ^ WQ_Hash ^ BK_Hash, // KQ | k
(byte)CastlingRights.WK | (byte)CastlingRights.WQ | (byte)CastlingRights.BQ => WK_Hash ^ WQ_Hash ^ BQ_Hash, // KQ | q
(byte)CastlingRights.WK | (byte)CastlingRights.BK | (byte)CastlingRights.BQ => WK_Hash ^ BK_Hash ^ BQ_Hash, // K | kq
(byte)CastlingRights.WQ | (byte)CastlingRights.BK | (byte)CastlingRights.BQ => WQ_Hash ^ BK_Hash ^ BQ_Hash, // Q | kq

(byte)CastlingRights.WK | (byte)CastlingRights.WQ | (byte)CastlingRights.BK | (byte)CastlingRights.BQ => // KQ | kq
WK_Hash ^ WQ_Hash ^ BK_Hash ^ BQ_Hash,

_ => throw new($"Unexpected castle encoded number: {castle}")
};
combinedHash ^= _table[(int)BoardSquare.a8, (int)Piece.p]; // a8
}

if ((castle & (int)CastlingRights.WQ) != default)
{
combinedHash ^= _table[(int)BoardSquare.b8, (int)Piece.p]; // b8
}

if ((castle & (int)CastlingRights.BK) != default)
{
combinedHash ^= _table[(int)BoardSquare.c8, (int)Piece.p]; // c8
}

if ((castle & (int)CastlingRights.BQ) != default)
{
combinedHash ^= _table[(int)BoardSquare.d8, (int)Piece.p]; // d8
}

return combinedHash;
}

/// <summary>
Expand Down
29 changes: 0 additions & 29 deletions tests/Lynx.Test/ZobristTableTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,6 @@ public void CastleHash(string fen)

var castleHash = ZobristTable.CastleHash(position.Castle);

Assert.AreEqual(CalculateCastleHash(position.Castle), castleHash);

Assert.AreEqual(positionWithoutCastlingRightsHash, positionHash ^ castleHash);
}

Expand All @@ -121,33 +119,6 @@ public void PositionHash(string fen)

Assert.AreEqual(originalHash, currentHash);
}

private long CalculateCastleHash(byte castle)
{
long combinedHash = 0;

if ((castle & (int)CastlingRights.WK) != default)
{
combinedHash ^= _zobristTable[(int)BoardSquare.a8, (int)Piece.p]; // a8
}

if ((castle & (int)CastlingRights.WQ) != default)
{
combinedHash ^= _zobristTable[(int)BoardSquare.b8, (int)Piece.p]; // b8
}

if ((castle & (int)CastlingRights.BK) != default)
{
combinedHash ^= _zobristTable[(int)BoardSquare.c8, (int)Piece.p]; // c8
}

if ((castle & (int)CastlingRights.BQ) != default)
{
combinedHash ^= _zobristTable[(int)BoardSquare.d8, (int)Piece.p]; // d8
}

return combinedHash;
}

private static long OriginalPositionHash(Position position)
{
Expand Down

0 comments on commit 36bc0b5

Please sign in to comment.