Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: and finally?

Author: Gerd Isenberg

Date: 23:45:26 03/25/04

Go up one level in this thread


On March 25, 2004 at 18:49:34, Gerd Isenberg wrote:

>On March 25, 2004 at 18:30:17, Gerd Isenberg wrote:
>
>>On March 25, 2004 at 08:36:18, Vasik Rajlich wrote:
>>
>>>On March 24, 2004 at 18:59:02, Gerd Isenberg wrote:
>>>
>>>>Some minor changes because inOne == inThree is not general enough.
>>>>Better to look for no further growing:
>>>>if ( (inThree & ~(fromBB|inOne|inTwo)) == 0 && ...
>>>>
>>>>
>>>>// fixed is subset of tabu (may be equal), the set of all own blocked
>>>>//  and backward pawns.
>>>>// tabu may contain enemy pawn attacks which don't terminate the attack ray
>>>>
>>>>BitBoard getTrappedBishopSquares(BitBoard fixed, BitBoard tabu, int n)
>>>>{
>>>>   BitBoard trappedBishopSquares = 0;
>>>>   BitBoard potb = ~tabu;
>>>>   while ( potb ) {
>>>>      BitBoard fromBB  = potb & -potb;
>>>>      BitBoard inOne   = fillBishopAttacks(fromBB, ~fixed) & ~tabu;
>>>>      BitBoard inTwo   = fillBishopAttacks(inOne,  ~fixed) & ~tabu;
>>>>      BitBoard inThree = fillBishopAttacks(inTwo,  ~fixed) & ~tabu;
>>>>      // tag all reachable in up to three moves as done
>>>>      potb    &= ~(fromBB|inOne|inTwo|inThree);
>>>>      inThree &= ~(fromBB|inOne|inTwo); // growing?
>>>>      if ( inThree == 0 && popCount(inOne|inTwo) < n )
>>>>         trappedBishopSquares |= (fromBB|inOne|inTwo);
>>>>   }
>>>>   return trappedBishopSquares;
>>>>}
>>>>
>>>>popCount > n considers the whole fill area reachable in two moves.
>>>
>>>Gerd,
>>>
>>>thanks, I'll try it in Rybka.
>>
>>I'll too in IsiChessXMM ;-)
>>
>>As Sune already mentioned,
>>
>>fillBishopOccluded(fromBB, ~tabu)
>>
>>is a bit faster (one 64-bit shift,two ands less for each of four directions)
>>than
>>
>>fillBishopAttacks(fromBB, ~tabu) & ~tabu;
>>
>>But the latter has the option, to distinguish between mechanical own fixed pawns
>>(or defended enemy pawns) and additional enemy pawn controls ...
>>
>>fillBishopAttacks(fromBB, ~fixed) & ~tabu;
>
>
>oups wrong! fillOccluded is still faster here than getAttacks and may even
>supplied with an additional masking out of enemy pawn attacks.
>
>fillBishopOccluded(fromBB, ~fixed) & ~tabu;
>
>
>
>// fixed is subset of taboo (may be equal), the set of all own blocked
>//  and backward pawns.
>// tabu may contain enemy pawn attacks which don't terminate the attack ray
>
>BitBoard getTrappedBishopSquares(BitBoard fixed, BitBoard taboo, int n)
>{
>   BitBoard trappedBishopSquares = 0;
>   BitBoard potb = ~taboo;
>   while ( potb ) {
>      BitBoard fromBB  = potb & -potb;
>      BitBoard inOne   = fillBishopOccluded(fromBB, ~fixed) & ~taboo;
>      BitBoard inTwo   = fillBishopOccluded(inOne,  ~fixed) & ~taboo;
>      BitBoard inThree = fillBishopOccluded(inTwo,  ~fixed) & ~taboo;
>      // tag all reachable in up to three moves as done
>      potb    &= ~inThree;
>      inThree &= ~inTwo; // growing?
>      if ( inThree == 0 && popCount(inTwo) < n )
>         trappedBishopSquares |= inTwo;
>   }
>   return trappedBishopSquares;
>}


Some more notes about n in this algo.
With 3 consecutive fills n should be not greater than 3+1.
Otherwise there are cases, where the traversing order may influence the result.

[D] 8/2b5/5p1k/1p1p4/pP1Pp2K/P1P1P3/5P2/2B5 w - -

Eg. with n == 6 in this position, the bishop on c1 doesn't grow after two fills.
{a1,b2,c1,d2,e1} is consired trapped. But bishops on a1,b2,d2,e1 still grow by
one more square after two fills. With n == 4 whole bishops are not considered
trapped - otherwise one has to use one or two more fill cycles...

One more reason to use Sune's approach!
Anyway, the corrected one...

// fixed is subset of taboo (may be equal), the set of all own blocked
//  and backward pawns.
// tabu may contain enemy pawn attacks which don't terminate the attack ray

BitBoard getTrappedBishopSquares(BitBoard fixed, BitBoard taboo)
{
   BitBoard trappedBishopSquares = 0;
   BitBoard potb = ~taboo;
   while ( potb ) {
      BitBoard fromBB  = potb & -potb;
      BitBoard inOne   = fillBishopOccluded(fromBB, ~fixed) & ~taboo;
      BitBoard inTwo   = fillBishopOccluded(inOne,  ~fixed) & ~taboo;
      BitBoard inThree = fillBishopOccluded(inTwo,  ~fixed) & ~taboo;
      // tag all reachable in up to three moves as done
      potb    &= ~inThree;
      inThree &= ~inTwo; // growing?
      if ( inThree == 0 && popCount(inTwo) < 4 )
         trappedBishopSquares |= inTwo;
   }
   return trappedBishopSquares;
}

Gerd




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.