From 0d4aa8b0a16c1ee2bcaf4120ef37ba4d1492206e Mon Sep 17 00:00:00 2001 From: "H.G. Muller" Date: Wed, 11 May 2011 23:06:20 +0200 Subject: [PATCH] Take account of holdings in book key The board is numbered by rank, for comptibility with Polyglot format, starting at a1. We then continue counting in the holdings 'files', in up-rank direction, each holding spanning the full board height (even if it is not fully used). Firstthe left (black) holdings, then the right, Even in Shogi this limits the square number to < 99, which is below the absolute limit of 128 (where we would run out of hash keys). --- book.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/book.c b/book.c index e5a6030b..3a764b9d 100644 --- a/book.c +++ b/book.c @@ -276,17 +276,21 @@ uint64 *RandomTurn =Random64+780; uint64 hash(int moveNr) { int r, f, p_enc, squareNr, pieceGroup; - uint64 key=0, Zobrist; + uint64 key=0, holdingsKey=0, Zobrist; - for(f=BOARD_LEFT; f= (int)BlackPawn) ? (int)BlackPawn :(int)WhitePawn; if(j > (int)WhiteQueen) j++; // make space for King if(j > (int) WhiteKing) j = (int)WhiteQueen + 1; p_enc = 2*j + ((int)p < (int)BlackPawn); + // holdings squares get nmbers immediately after board; first left, then right holdings + if(f == BOARD_LEFT-2) squareNr = (BOARD_RGHT - BOARD_LEFT)*BOARD_HEIGHT + r; else + if(f == BOARD_RGHT+1) squareNr = (BOARD_RGHT - BOARD_LEFT + 1)*BOARD_HEIGHT + r; else squareNr = (BOARD_RGHT - BOARD_LEFT)*r + (f - BOARD_LEFT); // note that in normal Chess squareNr < 64 and p_enc < 12. The following code // maps other pieces and squares in this range, and then modify the corresponding @@ -306,11 +310,13 @@ uint64 hash(int moveNr) break; } if(squareNr >= 64) Zobrist = (Zobrist << 8) ^ (Zobrist >> 56); + // holdings have separate (additive) key, to encode presence of multiple pieces on same square + if(f == BOARD_LEFT-2) holdingsKey += Zobrist * boards[moveNr][r][f+1]; else + if(f == BOARD_RGHT+1) holdingsKey += Zobrist * boards[moveNr][r][f-1]; else key ^= Zobrist; } } } - // Holdings not implemented yet! if(boards[moveNr][CASTLING][2] != NoRights) { if(boards[moveNr][CASTLING][0] != NoRights) key^=RandomCastle[0]; @@ -341,7 +347,7 @@ uint64 hash(int moveNr) if(WhiteOnMove(moveNr)){ key^=RandomTurn[0]; } - return key; + return key + holdingsKey; } #define MOVE_BUF 100 -- 2.17.1