Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Opening book

Author: Dan Newman

Date: 20:39:47 04/04/99

Go up one level in this thread


On April 04, 1999 at 05:26:40, Andrew Williams wrote:

>On April 04, 1999 at 01:46:39, Frank Phillips wrote:
>
>>On April 01, 1999 at 15:56:14, Andrew Williams wrote:
>>
>>>On April 01, 1999 at 14:37:51, Frank Phillips wrote:
>>>
>>>>I have added an opening book to my developing program and am wondering about
>>>>better ways of storing the information.  At the moment I store opening positions
>>>>as a hash-table in a disk file, accessing them as I would a hash table stored in
>>>>RAM by shifting the hash code for  the appropriate number of places to generate
>>>>the index and then performing a lookup as
>>>>fseek(pfile,index*sizeof(record),SEEK_SET)  etc.  This works but involves a lot
>>>>of wasted storage.  For example, I have a 12MB file of about 1million records
>>>>with the order of only 100 000 book entries.  Is it normal having generated the
>>>>book to then sort and search it as a simple linear file instead?  What do others
>>>>do?
>>>
>>>In my program, I don't store blank entries. I simply store the entries that
>>>exist and do a binary search on the file to see if the position is in the
>>>book. The hash key is the same as the one used in the transposition table,
>>>but I use it in a different way.
>>>
>>>Andrew
>>
>>Thanks.    I eventually used a quick sort function found on the internet which
>>seems to work fine. As expected, my book size is now about a tenth of the one
>>storing mainly zero.  There is also no noticeable, practical difference in speed
>>of accessing via binary search compared to hashing.
>>
>>
>>Initially I tried the MSVC 5 qsort() library function but could not work out how
>>to use the  (compare) function with structures.
>>
>>qsort((void*) precord, records, sizeof(BookHashRecordT), compare);
>>
>>int __cdecl compare( const void *a, const void *b )
>>{
>>/*  The thing I want to sort on is in record.top32bits, where record is of type
>>BookHashRecordT. */
>>
>>return( );
>>}
>>
>>(precord is a pointer to the memory area storing the records.  records the
>>number of records.).
>>
>>If anybody can enlighten me I would be interested.
>
>Hi Frank,
>
>I think it should look like this, but maybe I've misunderstood:
>
>int __cdecl compare( const void *a, const void *b )
>{
>	/*	The thing I want to sort on is in record.top32bits, where record
>		is of type BookHashRecordT.
>	*/
>
>	if(a->top32bits > b->top32bits) return 1;
>	else if(a->top32bits == b->top32bits) return 0;
>	else return -1;
>}
>
>Andrew

That's almost correct.  But you'll also need to cast the "a" and "b"
to the correct type of pointer so that the compiler will be able to
figure out where the top32bits member is:

        if( ((BookHashRecordT *)a)->top32bits
          > ((BookHashRecordT *)b)->top32bits ) return 1;

etc.

-Dan.



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.