Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: question about generating incremental move generator

Author: Alessandro Damiani

Date: 04:35:13 10/25/02

Go up one level in this thread


On October 25, 2002 at 07:19:52, Uri Blass wrote:

>On October 25, 2002 at 07:08:13, Alessandro Damiani wrote:
>
>>>>The implementation of generating moves in chunks is easily done by encapsulating
>>>>all work in a method that returns the next move:
>>>>
>>>>    Move nextMove(int ply, ...)
>>>>
>>>>The value 0 is returned, if there is no move anymore.
>>>>
>>>>The method nextMove() has a state for each ply: in which generation phase it
>>>>currently is. For instance, our move ordering is
>>>>
>>>>    1. hashmove
>>>>    2. winning captures
>>>>    3. killer 1
>>>>    4. killer 2
>>>>    5. equal captures
>>>>    6. non captures
>>>>    7. losing captures
>>>>
>>>>We define the following phases:
>>>>
>>>>    PHASE_HASHMOVE        0
>>>>    PHASE_GENCAPTURES     1
>>>>    PHASE_POSCAPTURES     2
>>>>    PHASE_KILLER_1        3
>>>>    PHASE_KILLER_2        4
>>>>    PHASE_EQUALCAPTURES   5
>>>>    PHASE_GENNONCAPTURES  6
>>>>    PHASE_NONCAPTURES     7
>>>>    PHASE_NEGCAPTURES     8
>>>
>>>Today I also have phases nit clearly less phases than you.
>>>
>>
>>As I stated above, this is just an example. I have got more phases.
>>
>>Just to be clear: only phase 1 and phase 6 generate moves (in this example).
>
>I understand now but I still do not understand.
>You do not generate moves in phasehashmove?
>
>what do you do exactly
>Do you say that
>you check if the hash move is legal and if it is legal you generate it?
>
>What do you do in phase 1?
>Do you compare all moves with the hash move to promise that you do not have it
>again in your list or do you generate it again and only in the sort move you
>ignore it.

Below is an excerpt from my engine Fortress.

Just to make you understand my notation: I emulate OO in C. So I access method
isValid() of module Move by writing Move_isValid().

--- nextMove(ply, ...) ---

    ...
    Move m;

    switch (phase[ply]) {
    case PHASE_HASHMOVE:
        phase[ply]= PHASE_GENCAPTURES;

        // establish invariant: last[ply] points behind the last entry in the
        // move list
        MoveGenerator_last[ply]= MoveGenerator_last[ply-1];

        m= MoveGenerator_hashMove[ply];

        if (Move_isValid(m))
            return m;

        // it applies: !Move_isValid(m)
        // continue with next phase:

    case PHASE_GENCAPTURES:
        ...

--------------------------

You notice the following:
- I don't generate the hashmove, since I get it from the hashtable
- I test for validity of the hashmove with method isValid(Move m)

The same method is used for killer moves, since they already exist. I don't need
to generate them.

As you can see, this is optimal: if the hashmove produces a beta cut-off no move
is generated. Method isValid() is fast with bitboards. ;)

Alessandro



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.