Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: About history pruning...

Author: Harald Lüßen

Date: 12:52:05 10/27/05

Go up one level in this thread


On October 27, 2005 at 06:35:38, Tord Romstad wrote:

>On October 26, 2005 at 19:13:22, Harald Lüßen wrote:
>
>>I want to understand this. Let me try to explain it in my words
>>and pseudo code. I have left out everything else.
>>
>>search(a,b,d) {
>>  try nullmove
>>  for moves M
>>    r=0 but reduce late moves with r=1 (or fraction?)
>>    do move
>>again:
>>      search(-b,-a,d-1-r)
>>      --> {
>>           try nullmove
>>           if it fails low because of move N
>>              and M was reduced (M.r > 0)
>>              and M.piece == N.piece
>>              then return cancel_reason_tords_enhancement
>>           for moves m
>>             ...
>>           next move
>>          }
>>      <--
>>      if r>0 and returned cancel_reason_tords_enhancement
>>        r = 0
>>        goto again
>>    undo move
>>  next move
>>}
>>
>>In 'and M.piece == N.piece' is it important that it is
>>exactly the same piece or can it be the same piece-type?
>>
>>Can you confirm this or correct me?
>
>If I understand your code correctly, everything between
>"-->" and "<--" isn't really supposed to be located exactly
>where it is printed above, but rather directly below the
>"try nullmove" near the top of the code.  In this case, it

Yes. I wrote the recursively called (same) search
function, or the important essentials, inside --> <--.

>looks correct, though the exact implementation is slightly
>different from mine.  Here is what I do, in compact pseudo
>code (there could be bugs here):

The only 'implementation' I have is the pseudo code above.

>int search(int alpha, int beta, int depth) {
>   int value, moves_searched;
>
>   do_nullmove();
>   value = -search(-beta, -beta + 1, depth - 4);
>   undo_nullmove();
>   if(value >= beta) return value;
>   else {
>     ThreatMove[Ply] = BestMove[Ply+1];
>     if(Reduction[Ply-1] &&
>        from_square(ThreatMove[Ply]) == to_square(CurrentMove[Ply-1]))

OK, that answers the question of 'same piece'.

>       return alpha - 1;

The caller will see this as beta + 1.
Hm? Will there be a cutoff instead of a research? Let's see...

>   }
>
>   generate_moves();
>   moves_searched = 0;
>   while((CurrentMove[Ply] = pick_move()) && alpha < beta) {
>     do_move(CurrentMove[Ply]);
>     if(moves_searched > 3 && ok_to_reduce(move))
      {
        Reduction[ply] = true;  // ?

>       value = -search(-beta, -alpha, depth - 2);

        Reduction[ply] = false;  // ?

This was the reduction.
      }
>     else value = alpha + 1;

And this is just a trick to slip into the if-clause below?
I expected something like
        value = -search(-beta, -alpha, depth - 1);
after the else. Not written because 'compact pseudo code'?

>     undo_move(CurrentMove[Ply]);
>     if(value > alpha) {

Is this the re-search? Why value > alpha? Perhaps value == beta + 1?
Does the normal not reduced search come into this if?

>       value = -search(-beta, -alpha, depth - 1);
>       if(value > alpha) alpha = value;
>     }
>     moves_searched++;
>   }
>   return alpha;
>}
>
>Tord

Thank you. There are a few open questions.
May be I lost you somewhere.

Harald



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.