Enable faster attack calculation for more variants
authorFabian Fichter <ianfab@users.noreply.github.com>
Fri, 19 Feb 2021 19:34:34 +0000 (20:34 +0100)
committerFabian Fichter <ianfab@users.noreply.github.com>
Fri, 19 Feb 2021 19:34:34 +0000 (20:34 +0100)
seirawan STC
LLR: 2.95 (-2.94,2.94) [0.00,10.00]
Total: 311 W: 160 L: 75 D: 76
http://www.variantfishtest.org:6543/tests/view/602ff3976e23db669974e93f

capablanca STC
LLR: 2.96 (-2.94,2.94) [0.00,10.00]
Total: 285 W: 151 L: 66 D: 68
http://www.variantfishtest.org:6543/tests/view/603000616e23db669974e943

shogi STC
LLR: 2.97 (-2.94,2.94) [0.00,10.00]
Total: 635 W: 373 L: 261 D: 1
http://www.variantfishtest.org:6543/tests/view/602ff24e6e23db669974e93c

src/position.cpp
src/variant.h

index 0b3d7bf..42d955a 100644 (file)
@@ -792,14 +792,26 @@ Bitboard Position::attackers_to(Square s, Bitboard occupied, Color c, Bitboard j
   // Use a faster version for variants with moderate rule variations
   if (var->fastAttacks)
   {
-      return  (pawn_attacks_bb(~c, s)          & pieces(c, PAWN, GOLD))
-            | (attacks_bb<KNIGHT>(s)           & pieces(c, KNIGHT))
-            | (attacks_bb<  ROOK>(s, occupied) & pieces(c, ROOK, QUEEN, DRAGON))
-            | (attacks_bb<BISHOP>(s, occupied) & pieces(c, BISHOP, QUEEN, DRAGON_HORSE))
-            | (attacks_bb<KING>(s)             & pieces(c, KING, COMMONER))
-            | (attacks_bb<FERS>(s)             & pieces(c, FERS, DRAGON, SILVER))
-            | (attacks_bb<WAZIR>(s)            & pieces(c, WAZIR, DRAGON_HORSE, GOLD))
-            | (LeaperAttacks[~c][SHOGI_PAWN][s]& pieces(c, SHOGI_PAWN, SILVER));
+      return  (pawn_attacks_bb(~c, s)          & pieces(c, PAWN))
+            | (attacks_bb<KNIGHT>(s)           & pieces(c, KNIGHT, ARCHBISHOP, CHANCELLOR))
+            | (attacks_bb<  ROOK>(s, occupied) & pieces(c, ROOK, QUEEN, CHANCELLOR))
+            | (attacks_bb<BISHOP>(s, occupied) & pieces(c, BISHOP, QUEEN, ARCHBISHOP))
+            | (attacks_bb<KING>(s)             & pieces(c, KING, COMMONER));
+  }
+
+  // Use a faster version for selected fairy pieces
+  if (var->fastAttacks2)
+  {
+      return  (pawn_attacks_bb(~c, s)             & pieces(c, PAWN, BREAKTHROUGH_PIECE, GOLD))
+            | (attacks_bb<KNIGHT>(s)              & pieces(c, KNIGHT))
+            | (attacks_bb<  ROOK>(s, occupied)    & (  pieces(c, ROOK, QUEEN, DRAGON)
+                                                     | (pieces(c, LANCE) & PseudoAttacks[~c][LANCE][s])))
+            | (attacks_bb<BISHOP>(s, occupied)    & pieces(c, BISHOP, QUEEN, DRAGON_HORSE))
+            | (attacks_bb<KING>(s)                & pieces(c, KING, COMMONER))
+            | (attacks_bb<FERS>(s)                & pieces(c, FERS, DRAGON, SILVER))
+            | (attacks_bb<WAZIR>(s)               & pieces(c, WAZIR, DRAGON_HORSE, GOLD))
+            | (LeaperAttacks[~c][SHOGI_KNIGHT][s] & pieces(c, SHOGI_KNIGHT))
+            | (LeaperAttacks[~c][SHOGI_PAWN][s]   & pieces(c, SHOGI_PAWN, SILVER));
   }
 
   Bitboard b = 0;
index c07b09f..818db65 100644 (file)
@@ -130,6 +130,7 @@ struct Variant {
 
   // Derived properties
   bool fastAttacks = true;
+  bool fastAttacks2 = true;
 
   void add_piece(PieceType pt, char c, char c2 = ' ') {
       pieceToChar[make_piece(WHITE, pt)] = toupper(c);
@@ -157,9 +158,18 @@ struct Variant {
   Variant* conclude() {
       fastAttacks = std::all_of(pieceTypes.begin(), pieceTypes.end(), [this](PieceType pt) {
                                     return (   pt < FAIRY_PIECES
-                                            || pt == COMMONER || pt == FERS || pt == WAZIR
-                                            || pt == SHOGI_PAWN || pt == GOLD || pt == SILVER
-                                            || pt == DRAGON || pt == DRAGON_HORSE
+                                            || pt == COMMONER || pt == IMMOBILE_PIECE
+                                            || pt == ARCHBISHOP || pt == CHANCELLOR
+                                            || (pt == KING && kingType == KING))
+                                          && !(mobilityRegion[WHITE][pt] || mobilityRegion[BLACK][pt]);
+                                })
+                    && !cambodianMoves
+                    && !diagonalLines;
+      fastAttacks2 = std::all_of(pieceTypes.begin(), pieceTypes.end(), [this](PieceType pt) {
+                                    return (   pt < FAIRY_PIECES
+                                            || pt == COMMONER || pt == FERS || pt == WAZIR || pt == BREAKTHROUGH_PIECE
+                                            || pt == SHOGI_PAWN || pt == GOLD || pt == SILVER || pt == SHOGI_KNIGHT
+                                            || pt == DRAGON || pt == DRAGON_HORSE || pt == LANCE
                                             || (pt == KING && kingType == KING))
                                           && !(mobilityRegion[WHITE][pt] || mobilityRegion[BLACK][pt]);
                                 })