Computer Chess Club Archives


Search

Terms

Messages

Subject: Position-based learning glitch

Author: Stuart Cracraft

Date: 13:32:41 06/13/98


Hi,

My program has a strange problem. Perhaps sharing this
will make a lightbulb light up somewhere... I'm fresh out of bulbs.

I added position-based learning awhile back. The goal
is to note those positions that are "significantly worse"
(about 3/4 of a pawn) at the final iteration than the best
of the previous iterations, mark them PERMANENT in
the hash table and write them out to disk.

When a new game starts, hash table is zeroed, learned positions
are read back in and marked PERMANENT.

Fine, it runs well with test positions from Slate's article in
the ICCA Journal. After three "shocks" it's written out
3x28 bytes of information and learns plays Slate's examples
well enough to play all the exact moves as Slate's Mouse program,
avoiding the bad variations it would have naturally gone into
and even avoiding a bad move in a position with quite afew
different pieces and locations than in the learned position
illustrating the sharing of learning experience in some class
of overlapping families of related positions in the search-tree.

So I now let it run on ICS. After a time I come back and
it's written out an ODD number of bytes!!!  Impossible.
It is doing only write()'s of sizeof the hash entry which is
28 bytes. I use open and read to read it, nothing buffered.
The effect is when a "bad record" is written, the learn
file restore stops and the program continues but with
far fewer learnt positions than are actually in the
buggy learn file.

The point is: how could it output an odd number of bytes
to the learn file on disk when the only thing it is written
is an even number of bytes each time, e.g.

When the last iteration is significantly worse than the best
previous iteration:

  /* set buf to hash table entry plus some additional info, omitted */
  fd = open(filename,O_WRONLY);
  write(fd,buf,28);
  close(fd);

and when reading them in at game's start

  fd = open(filename,O_RDONLY);
  read(fd,buf,28);
  /* restore buf to hash table here, omitted */
  close(fd);

the fd is not used for anything else except the above
and is closed after each use

I've tried seemingly everything:

  - disable all interrupts during write operation
  - stop using buffered fopen/fwrite/fflush/fclose in favor of
    unbuffered

My learn file position entry is:

typedef struct
{
   short side;
   int move;
   HashType hashkey;
   int score;
   short flag;
   short depth;
   long nodes;
} LearnHashSlot;

where HashType is long long. Actually I could shorten
this and avoid storing *move* and *nodes* since they
aren't used but I don't see how that will help.

How can write(...) possibly write out an odd number of
bytes with an even number of bytes specified in its call?

By the way, the learn file positions are read at game startup
and written out after each appropriate search completes
by simply appending the latest position learned to the end
of the file, e.g.

  fd = open(...,O_WRONLY)
  lseek(fd,0,SEEK_END);
  write(fd,buf,sizeof(LearnHashSlot));
  close(fd);

Help Obi-Wan-Kenobi!

--Stuart



This page took 0.01 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.