Author: Uri Blass
Date: 10:03:03 01/04/03
Go up one level in this thread
On January 04, 2003 at 12:35:33, Robert Hyatt wrote:
>On January 04, 2003 at 11:04:02, Russell Reagan wrote:
>
>>I believe I got rid of all of the bugs in my move generator. I'm not sure
>>exactly what the problem was, but I made a few changes to the castling rights in
>>some special cases (capturing a rook on its original square, rook moving from
>>its original square, and so on) and it seems to work ok now. So I tried the
>>following position.
>>
>>[D]r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1
>>
>>The above position is from "kiwipete" (Peter McKenzie). It has a little bit of
>>everything so it's a good position to use for perft. Anyway, I let it run last
>>night, and I thought I had switched my perft function to use 64-bit integer for
>>the counter, but these are the results I got.
>>
>>> setboard r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1
>>> perft 6
>>48 0
>>2039 0
>>97862 0.254
>>4085603 10.295
>>193690690 525.25
>>3736680389 29450.8
>>total time: 29986.6
>>
>>Through the first 5 plies it finds the correct values. At ply 6 the value it
>>gives is off by a few billion, but the exact value of the difference isn't just
>>any old value. It is 4,294,967,296, which is 2^32, which suggests that my
>>counter is getting truncated somewhere.
>>
>>Is it safe to assume my perft function is working correctly (at least in this
>>position), and that the counter just wrapped around?
>>
>>Russell
>
>
>How are you printing the thing? %d will _not_ work with a 64 bit integer.
>Microsoft does it one way. If you are using gcc, use %llu to print a 64 bit
>counter (assuming it is unsigned which makes sense).
I can post my code of the perft function that is not chess related
Maybe it can help Russell(the name mone has only significance in hebrew and not
in english and I could also do better in choosing significant varaibles but the
function is short and can work for legal move generator in every game and not
only for chess.
I use a function to translate int64 to string based on suggestion that I got
here in the past.
My perft(depth) practically calculates perft(depth+1) so I need to calculate
perft(depth-1) in order to get what is considered to be perft(depth).
static void Uint64ToString (__int64 x, char *s)
{
unsigned int a = (unsigned int)(x/1000000000),b = (unsigned int)(x%1000000000);
if (x>1000000000)
sprintf(s,"%u%09u",a,b);
else
sprintf(s,"%u",b);
}
__int64 perft(int depth)
{
int numplies;
__int64 mone,p;
int a[20];
int diff[20];
int i;
mone=0;
p=0;
pinnumber[0]=pinnumber[ply];
ply=0;
generatepinarray();
gen();
memset(a,0,sizeof a);
diff[0]=first_move[1]-first_move[0];
if (depth==0)
return diff[0];
mone=0;
while (a[0]<diff[0])
{
for (numplies=ply;numplies<depth;numplies++)
{
if (a[ply]==0)
gen();
diff[ply]=first_move[ply+1]-first_move[ply];
if (diff[ply]>0)
makemove(gen_dat[first_move[ply]+a[ply]].m.b);
else
numplies=100;
}
if (numplies<100)
gen();
diff[ply]=first_move[ply+1]-first_move[ply];
mone=mone+diff[ply];
undomove();
while ((a[ply]==diff[ply]-1)&&(ply>0))
undomove();
a[ply]++;
i=ply+1;
while (i<depth)
{
a[i]=0;
i++;
}
}
return mone;
}
For priniting what is considered to be perft(i)
I have in another function the following commands
char perftnum[128];
Uint64ToString(perft(i-1),perftnum);
Uri
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.