Calculate min distance between king and his pawns
authorMarco Costalba <mcostalba@gmail.com>
Sun, 17 Jun 2012 08:03:05 +0000 (09:03 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 17 Jun 2012 08:41:18 +0000 (09:41 +0100)
Just added infrastructure.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/bitboard.cpp
src/bitboard.h
src/pawns.cpp
src/pawns.h

index 8be7cea4b6ae6b098dfa2537904d0885ed2daa8f..03080d15657500ffec995248646bb4816d7fcc83 100644 (file)
@@ -45,6 +45,7 @@ Bitboard ThisAndAdjacentFilesBB[8];
 Bitboard InFrontBB[2][8];
 Bitboard StepAttacksBB[16][64];
 Bitboard BetweenBB[64][64];
+Bitboard DistanceRingsBB[64][8];
 Bitboard ForwardBB[2][64];
 Bitboard PassedPawnMask[2][64];
 Bitboard AttackSpanMask[2][64];
@@ -195,6 +196,12 @@ void Bitboards::init() {
       for (Square s2 = SQ_A1; s2 <= SQ_H8; s2++)
           SquareDistance[s1][s2] = std::max(file_distance(s1, s2), rank_distance(s1, s2));
 
+  for (Square s1 = SQ_A1; s1 <= SQ_H8; s1++)
+      for (int d = 1; d < 8; d++)
+          for (Square s2 = SQ_A1; s2 <= SQ_H8; s2++)
+              if (SquareDistance[s1][s2] == d)
+                  DistanceRingsBB[s1][d - 1] |= s2;
+
   for (int i = 0; i < 64; i++)
       if (!Is64Bit) // Matt Taylor's folding trick for 32 bit systems
       {
index cc039397e3330728022f22c2905891a20849a343..d187102ff1bf17914dd806c250b85bf8d757049f 100644 (file)
@@ -50,6 +50,7 @@ extern Bitboard ThisAndAdjacentFilesBB[8];
 extern Bitboard InFrontBB[2][8];
 extern Bitboard StepAttacksBB[16][64];
 extern Bitboard BetweenBB[64][64];
+extern Bitboard DistanceRingsBB[64][8];
 extern Bitboard ForwardBB[2][64];
 extern Bitboard PassedPawnMask[2][64];
 extern Bitboard AttackSpanMask[2][64];
index 049e73bf9fb3e41e41ee5e1ee325d93b8b82143a..f71e2a3970f8cbd520e8567ec7d6729126b05eb8 100644 (file)
@@ -261,6 +261,11 @@ Score PawnEntry::update_safety(const Position& pos, Square ksq) {
 
   kingSquares[Us] = ksq;
   castleRights[Us] = pos.can_castle(Us);
+  minKPdistance[Us] = 0;
+
+  Bitboard pawns = pos.pieces(Us, PAWN);
+  if (pawns)
+      while (!(DistanceRingsBB[ksq][minKPdistance[Us]++] & pawns)) {}
 
   if (relative_rank(Us, ksq) > RANK_4)
       return kingSafety[Us] = SCORE_ZERO;
index 4fee93165f187a4cd400a91cc8c774348c8c6c18..e6bc2c315a344b5987fe3ba2b1a1c100fafcc144 100644 (file)
@@ -59,6 +59,7 @@ private:
   Bitboard passedPawns[2];
   Bitboard pawnAttacks[2];
   Square kingSquares[2];
+  int minKPdistance[2];
   int castleRights[2];
   Score value;
   int halfOpenFiles[2];