Use faster attackers generation for more variants
authorFabian Fichter <ianfab@users.noreply.github.com>
Tue, 16 Feb 2021 21:09:45 +0000 (22:09 +0100)
committerFabian Fichter <ianfab@users.noreply.github.com>
Tue, 16 Feb 2021 21:09:45 +0000 (22:09 +0100)
makruk STC
LLR: 2.98 (-2.94,2.94) [0.00,10.00]
Total: 1175 W: 127 L: 66 D: 982
http://www.variantfishtest.org:6543/tests/view/6026a0606e23db669974e8f7

minishogi STC
LLR: 2.96 (-2.94,2.94) [0.00,10.00]
Total: 3706 W: 1931 L: 1775 D: 0
http://www.variantfishtest.org:6543/tests/view/6026a0516e23db669974e8f4

standard STC
LLR: 3.00 (-2.94,2.94) [-10.00,5.00]
Total: 31166 W: 6843 L: 6953 D: 17370
http://www.variantfishtest.org:6543/tests/view/6026a0686e23db669974e8f9

src/position.cpp
src/position.h
src/variant.h

index 9e8ea44..7145145 100644 (file)
@@ -789,14 +789,18 @@ Bitboard Position::slider_blockers(Bitboard sliders, Square s, Bitboard& pinners
 
 Bitboard Position::attackers_to(Square s, Bitboard occupied, Color c, Bitboard janggiCannons) const {
 
-  // Use a faster version for variants with standard chess pieces
-  if (!var->hasFairy && !var->isRestricted)
+  // Use a faster version for variants with moderate rule variations
+  if (var->fastAttacks)
   {
       return  (pawn_attacks_bb(~c, s)          & pieces(c, PAWN))
             | (attacks_bb<KNIGHT>(s)           & pieces(c, KNIGHT))
-            | (attacks_bb<  ROOK>(s, occupied) & pieces(c, ROOK, QUEEN))
-            | (attacks_bb<BISHOP>(s, occupied) & pieces(c, BISHOP, QUEEN))
-            | (attacks_bb<KING>(s)             & pieces(c, KING, COMMONER));
+            | (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, DRAGON_HORSE))
+            | (attacks_bb<FERS>(s)             & pieces(c, FERS, DRAGON))
+            | (LeaperAttacks[~c][SILVER][s]    & pieces(c, SILVER))
+            | (LeaperAttacks[~c][GOLD][s]      & pieces(c, GOLD))
+            | (LeaperAttacks[~c][SHOGI_PAWN][s]& pieces(c, SHOGI_PAWN));
   }
 
   Bitboard b = 0;
@@ -843,6 +847,7 @@ Bitboard Position::attackers_to(Square s, Bitboard occupied, Color c, Bitboard j
       b |= diags & diagonal_lines();
   }
 
+  // Unpromoted soldiers
   if (b & pieces(SOLDIER) && relative_rank(c, s, max_rank()) < var->soldierPromotionRank)
       b ^= b & pieces(SOLDIER) & ~PseudoAttacks[~c][SHOGI_PAWN][s];
 
index f1d68c2..42022e2 100644 (file)
@@ -200,6 +200,7 @@ public:
   Bitboard pieces(Color c) const;
   Bitboard pieces(Color c, PieceType pt) const;
   Bitboard pieces(Color c, PieceType pt1, PieceType pt2) const;
+  Bitboard pieces(Color c, PieceType pt1, PieceType pt2, PieceType pt3) const;
   Bitboard major_pieces(Color c) const;
   Bitboard non_sliding_riders() const;
   Piece piece_on(Square s) const;
@@ -903,6 +904,10 @@ inline Bitboard Position::pieces(Color c, PieceType pt1, PieceType pt2) const {
   return pieces(c) & (pieces(pt1) | pieces(pt2));
 }
 
+inline Bitboard Position::pieces(Color c, PieceType pt1, PieceType pt2, PieceType pt3) const {
+  return pieces(c) & (pieces(pt1) | pieces(pt2) | pieces(pt3));
+}
+
 inline Bitboard Position::major_pieces(Color c) const {
   return pieces(c) & (pieces(QUEEN) | pieces(AIWOK) | pieces(ARCHBISHOP) | pieces(CHANCELLOR) | pieces(AMAZON));
 }
index 30531cf..8cde421 100644 (file)
@@ -129,8 +129,7 @@ struct Variant {
   CountingRule countingRule = NO_COUNTING;
 
   // Derived properties
-  bool hasFairy = true;
-  bool isRestricted = true;
+  bool fastAttacks = true;
 
   void add_piece(PieceType pt, char c, char c2 = ' ') {
       pieceToChar[make_piece(WHITE, pt)] = toupper(c);
@@ -156,11 +155,14 @@ struct Variant {
 
   // Pre-calculate derived properties
   Variant* conclude() {
-      hasFairy = std::any_of(pieceTypes.begin(), pieceTypes.end(), [this](PieceType pt) { return pt >= FAIRY_PIECES && pt != COMMONER && !(pt == KING && kingType == KING); });
-      isRestricted = std::any_of(pieceTypes.begin(), pieceTypes.end(),
-                                 [this](PieceType pt) {
-                                     return mobilityRegion[WHITE][pt] || mobilityRegion[BLACK][pt];
-                                 });
+      fastAttacks = std::all_of(pieceTypes.begin(), pieceTypes.end(), [this](PieceType pt) {
+                                    return (   pt < FAIRY_PIECES
+                                            || pt == COMMONER || pt == FERS || pt == SILVER
+                                            || pt == SHOGI_PAWN || pt == GOLD
+                                            || pt == DRAGON || pt == DRAGON_HORSE
+                                            || (pt == KING && kingType == KING))
+                                          && !(mobilityRegion[WHITE][pt] || mobilityRegion[BLACK][pt]);
+                                });
       return this;
   }
 };