Author: Uri Blass
Date: 04:44:52 10/25/02
Go up one level in this thread
On October 25, 2002 at 07:35:13, Alessandro Damiani wrote:
>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
I understand but what do you do if the hash move does not give you a cutoff.
Do you generate it and compare your move to the hash move to be sure that
you do not search it again?
Another question:
Do you work on improving fortress?
I find that Fortress was not updated in Leo's tournament and he used exactly the
same version in the 3th edition and the 2nd edition.
Uri
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.