Author: Matthias Gemuh
Date: 16:08:12 11/21/02
Go up one level in this thread
On November 21, 2002 at 15:39:27, Robert Hyatt wrote:
>On November 21, 2002 at 12:39:24, Matthias Gemuh wrote:
>
>>On November 21, 2002 at 11:07:38, Robert Hyatt wrote:
>>
>>>On November 21, 2002 at 08:26:48, Matthias Gemuh wrote:
>>>
>>>>On November 21, 2002 at 08:15:50, Georg v. Zimmermann wrote:
>>>>
>>>>>On November 21, 2002 at 07:13:10, Vladimir Medvedev wrote:
>>>>>
>>>>>>depth = 9, from initial position:
>>>>>>
>>>>>>pawn hash = 1 entry -- 28% successful hits
>>>>>>2 -- 33%
>>>>>>3 -- 37%
>>>>>>4 -- 38%
>>>>>>5 -- 41%
>>>>>>7 -- 43%
>>>>>>10 -- 45%
>>>>>>100 -- 60%
>>>>>>...
>>>>>>65K -- 84%
>>>>>>
>>>>>>I was quite surprised with this :)
>>>>>>Even 1-node pawn "hash" helps a lot!
>>>>>
>>>>>Doesnt one get something around 99% with big tables ?
>>>>
>>>>
>>>>
>>>>With 2x65kB. More is not needed, if only pawns are considered.
>>>
>>>
>>>There are more possible pawn positions than that. White has 8, black has 8.
>>>there are
>>>48 possible squares any of them can be on... That is a pretty big number.
>>
>>
>>
>>Some hasty and wrong thinking then, when I implemented my pawn hash.
>>Maybe I somehow excluded strange positions like all pawns on 2nd and 3rd rows.
>>I shall check my code and logic later.
>>I generate keys such that they lie in range 1..2x64kB and use them as index.
>>I hit 95%..99% in middle game and WAC.
>>
>>Thanks,
>>Matthias.
>>
>>Thanks,
>>Matthias.
>
>Just one white pawn gives you 48 different positions. one white pawn and one
>black
>pawn gives you 48*48 different positions. or, rounding down a bit, 48 could be
>replaced by 2^5 (32). 48*48 could be approximated by 2^10 or 1024. two more
>pawns
>and we are going to blow past 64K positions.
Without looking at my code, I explained my appraoch wrongly.
I use 64K entries as follows:
typedef struct {
unsigned short int PawnHashLock;
BITBOARD PassedPawns[2], WeakPawns[2];
short int Score;
} PAWNHASHENTRY;
PAWNHASHENTRY PawnHashEntry[66000]; // lazy 64K
PawnHashKey and PawnHashLock are "unsigned short int";
I store PawnHashLock with hash entry for verification and use
PawnHashKey as index.
void MakePawnHashKey(HASHTABLE *HashTable, CHESSPOSITION *ChsPos) {
register int i;
register BITBOARD BitS;
ChsPos->PawnHashKey = 0; ChsPos->PawnHashLock = 0;
BitS = ChsPos->piece[0][1]; // black pawns
while (BitS) {
i = LastOne(BitS); BitS ^= ChsPos->Mask[i];
ChsPos->PawnHashKey ^= HashTable->PawnHashKey[0][i];
ChsPos->PawnHashLock ^= HashTable->PawnHashLock[0][i];
}
BitS = ChsPos->piece[1][1]; // white pawns
while (BitS) {
i = FirstOne(BitS); BitS ^= ChsPos->Mask[i];
ChsPos->PawnHashKey ^= HashTable->PawnHashKey[1][i];
ChsPos->PawnHashLock ^= HashTable->PawnHashLock[1][i];
}
}
int RetrievePawnHashEntry(HASHTABLE *HashTable, unsigned short int HashKey,
unsigned short int HashLock,
int *Score, BITBOARD *PassedPawns, BITBOARD *WeakPawns) {
*Score=0;
nCounters.nPawnHashProbes++;
if (HashTable->PawnHashEntry[HashKey].PawnHashLock != HashLock) return(0);
*Score = HashTable->PawnHashEntry[HashKey].Score;
PassedPawns[0] = HashTable->PawnHashEntry[HashKey].PassedPawns[0];
PassedPawns[1] = HashTable->PawnHashEntry[HashKey].PassedPawns[1];
WeakPawns[0] = HashTable->PawnHashEntry[HashKey].WeakPawns[0];
WeakPawns[1] = HashTable->PawnHashEntry[HashKey].WeakPawns[1];
nCounters.nPawnHashReads++;
return(1);
}
This hits 95%...99%
Considering the stored verification key, we have 32 bit hashing.
Regards,
Matthias.
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.