Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Instability thing...

Author: Stuart Cracraft

Date: 10:19:12 09/18/04

Go up one level in this thread


On September 18, 2004 at 11:09:26, Robert Hyatt wrote:

>On September 18, 2004 at 04:05:38, Sune Fischer wrote:
>
>>
>>I decided to try out the triangular PV thing Bob
>>speaks so highly of, to see if it improves move ordering...
>>
>>I was careful to terminate the PV on all exact scores - of course.
>>Still I was getting illegal moves in the PV.
>>
>>It turned out to be a hash/nullmove problem.
>>
>>See, in the hash I adjust the window down on UPPER bounds, ie.
>>something like:
>> if (flag==UPPER && score<beta)
>>    beta = score;
>
>Are you doing PVS?  If so you won't do this a dozen times during a long search,
>most likely.  But I do this in Crafty as well, and it doesn't _ever_ get illegal
>moves in the PV.
>
>
>>
>>The idea is that if we know the score is in the interval [x,y]
>>then there is no reason to search with a window of [x,y+z].
>>It's a common trick I believe.
>>
>>Unfortunately, the search will occasionally fail high on the new beta, in my
>>case it was a nullmove that failed-high.
>>
>>That's clearly contradictive with what the hash just told us so
>>it doesn't actually make any sense, but apparently it happens anyway
>>(instability?).
>>
>>Now the score at the previous node might be an exact value (or a fail high later
>>on), and the PV will now be concatenated from an old search branch.
>>
>
>That can't happen.  You don't update the PV on a fail high, ever.  Only if score
>is > alpha and < beta...
>
>
>
>
>
>>
>>I can't see that I am doing anything wrong.
>>Perhaps adjusting beta is just not a good idea?
>>
>>-S.


Anyone see anything obviously wrong with hashing, null move,
triangular array handling, or best move updating in the following
pseudo-code?

search(depth,ply,alpha,beta)
  save original entry depth in sdepth
  :
  extensions checked here modify depth variable
  if modified depth <= 0 return quiescence(alpha,beta)
  hashed=0
  if (retrieve(&length, &score, &flag, &hashmv))
    if (length >= sdepth)
      if (flag == VALID) return(score);
      if (flag == LBOUND) alpha = MAX(alpha, score);
      if (flag == UBOUND) beta = MIN(beta, score);
      if (alpha >= beta) return(score);
      if (legalmove2(bd,hashmv)) hashed=1
    fi
  fi
  best = alpha
  nulled=0
  if (okay to do null move && not in check && not inside pv)
     nulled=1
     make null move
#define R 2
     value = -search(sdepth-R-1,ply+1,-beta,-beta+1)
     unmake null move
     if value >= beta return(value)
  fi
  if hash move legal or if no hash move, generate moves, sort, process 1st mv
    incremental legal move counter
    search move (may be hash)
    best = -search(modified depth,ply+1,-beta,-alpha)
  fi
  while (best < beta)
    if (best > alpha)
      backup the pv in the triangular array
      if ply == 0 save move as best as long as no time control timeout
      update history heuristic for this move to be += (1<<modified depth)
    fi
    if (timeout()) return(best) and set flag so that best move won't be changed
    make next move
    if side on move not in check
      increment legal move counter
      value = -search(modified depth-1,-alpha-1,-alpha)
      if (value > alpha && value < beta)
        value = -search(modified depth-1,-beta,-value
      else if (value > best)
        best = value
        if top ply save move as best as long as no time control timeout
        backup the pv in the triangular array
      fi
      unmakemove
    fi
    if legal move counter is 0
    if in check
      best = -MATE + ply
    else
      best = STALEMATE
    fi
  fi
done:
  flag = VALID
  if best <= alpha flag = UBOUND
  if best >= beta flag = LBOUND
  if length <= depth
     store(depth,best,flag,best move)
  return best

Stuart



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.