From b020f19d863dab8cc4b3c9268a76b9c0ac752392 Mon Sep 17 00:00:00 2001 From: Fabian Fichter Date: Tue, 16 Feb 2021 22:09:45 +0100 Subject: [PATCH] Use faster attackers generation for more variants 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 | 15 ++++++++++----- src/position.h | 5 +++++ src/variant.h | 16 +++++++++------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/position.cpp b/src/position.cpp index 9e8ea44..7145145 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -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(s) & pieces(c, KNIGHT)) - | (attacks_bb< ROOK>(s, occupied) & pieces(c, ROOK, QUEEN)) - | (attacks_bb(s, occupied) & pieces(c, BISHOP, QUEEN)) - | (attacks_bb(s) & pieces(c, KING, COMMONER)); + | (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, DRAGON_HORSE)) + | (attacks_bb(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]; diff --git a/src/position.h b/src/position.h index f1d68c2..42022e2 100644 --- a/src/position.h +++ b/src/position.h @@ -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)); } diff --git a/src/variant.h b/src/variant.h index 30531cf..8cde421 100644 --- a/src/variant.h +++ b/src/variant.h @@ -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; } }; -- 1.7.0.4