From: Fabian Fichter Date: Fri, 19 Feb 2021 19:34:34 +0000 (+0100) Subject: Enable faster attack calculation for more variants X-Git-Url: http://winboard.nl/cgi-bin?a=commitdiff_plain;h=8c79fd4e75131eae2591209d69c544d0e810f467;p=fairystockfish.git Enable faster attack calculation for more variants 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 --- diff --git a/src/position.cpp b/src/position.cpp index 0b3d7bf..42d955a 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -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(s) & pieces(c, KNIGHT)) - | (attacks_bb< ROOK>(s, occupied) & pieces(c, ROOK, QUEEN, DRAGON)) - | (attacks_bb(s, occupied) & pieces(c, BISHOP, QUEEN, DRAGON_HORSE)) - | (attacks_bb(s) & pieces(c, KING, COMMONER)) - | (attacks_bb(s) & pieces(c, FERS, DRAGON, SILVER)) - | (attacks_bb(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(s) & pieces(c, KNIGHT, ARCHBISHOP, CHANCELLOR)) + | (attacks_bb< ROOK>(s, occupied) & pieces(c, ROOK, QUEEN, CHANCELLOR)) + | (attacks_bb(s, occupied) & pieces(c, BISHOP, QUEEN, ARCHBISHOP)) + | (attacks_bb(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(s) & pieces(c, KNIGHT)) + | (attacks_bb< ROOK>(s, occupied) & ( pieces(c, ROOK, QUEEN, DRAGON) + | (pieces(c, LANCE) & PseudoAttacks[~c][LANCE][s]))) + | (attacks_bb(s, occupied) & pieces(c, BISHOP, QUEEN, DRAGON_HORSE)) + | (attacks_bb(s) & pieces(c, KING, COMMONER)) + | (attacks_bb(s) & pieces(c, FERS, DRAGON, SILVER)) + | (attacks_bb(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; diff --git a/src/variant.h b/src/variant.h index c07b09f..818db65 100644 --- a/src/variant.h +++ b/src/variant.h @@ -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]); })