Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Another funky hash problem

Author: Robert Hyatt

Date: 22:04:08 08/24/99

Go up one level in this thread


On August 24, 1999 at 22:02:33, James Robertson wrote:

>I was looking at my code and noticed that I never get any cutoffs when there is
>no available hash move. I modifed my code a little, and it sped up, but then I
>noticed tactical problems; on a certain test position it never finds a fairly
>obvious move. Anyway, here is my hash code in my search function.
>
>The third line checks to see if the hash move is legal. Since an UPPER flagged
>position may occassionally have no move, the 'blank move' is considered illegal
>and it skips any chance of a cutoff. I changed line 3 to
>if (!hr.move || board.IsLegal(hr.move)) {
>and got the problems I mentioned above. Can anyone help me with this?
>
>Thanks,
>James
>
>  HashRec hr;
>  if (!hash_move[ply] && hash_table.Probe(&board, &hr)) {
>    if (board.IsLegal(hr.move)) {
>      // Adjust mate score.
>      if (hr.score > MATE>>1) hr.score -= ply-1;
>      else if (hr.score < -MATE>>1) hr.score += ply-1;
>      if (hr.draft >= depth) {
>	if (hr.flags & EXACT) {
>	  return hr.score;
>	} else if (hr.flags & UPPER) {
>	  if (hr.score <= alpha) return hr.score;
>	} else if (hr.flags & LOWER) {
>	  if (hr.score >= beta) return hr.score;
>	}
>      }
>      hash_move[ply] = hr.move;
>    }
>  }


Before I try to understand your code, here is how it ought to work:

in the top of Search(), you call hashprobe() or whatever you call it, and
you make the cutoff decisions there regardless of whether there is a hash
move or not.  IE if probe() returns EXACT you just return that score...

here is the relevant code from Crafty (search.c):

  switch (HashProbe(tree,ply,depth,wtm,&alpha,&beta,&threat)) {
    case EXACT:
      if(alpha < beta) SavePV(tree,ply,alpha,1);
      return(alpha);
    case LOWER:
      return(beta);
    case UPPER:
      return(alpha);
    case AVOID_NULL_MOVE:
      do_null=0;
  }


Forget the "avoid null" case for the moment.  Notice that if HashProbe()
returns a non-zero value, it means that the 'draft' (depth) of the entry was
fine, and that one of the following three things happened after the depth was
tested and found ok:

return EXACT if the score in the table is an exact score.

return UPPER if the bound in the table is marked as UPPER and it is >= than the
current beta value.

return LOWER if the bound in the table is marked as LOWER and it is <= than the
current alpha value.

After you do the above tests, _then_ you start searching moves.  And the
first move you should search is the move from the hash table.  But it has
_nothing_ to do with whether you take a cutoff now or not...



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.