From ad76a91aabff9f197090f12f130d282a61e1e5dc Mon Sep 17 00:00:00 2001 From: Fabian Fichter Date: Fri, 20 May 2022 13:59:09 +0200 Subject: [PATCH] Add flipello to built-in variants Also adjust NNUE code for othello and other non-chess variants. --- src/nnue/features/half_ka_v2_variants.cpp | 2 +- src/nnue/features/half_ka_v2_variants.h | 2 +- src/variant.cpp | 48 ++++++++++++++++++++++++++++- src/variant.h | 2 +- src/variants.ini | 24 +++----------- 5 files changed, 55 insertions(+), 23 deletions(-) diff --git a/src/nnue/features/half_ka_v2_variants.cpp b/src/nnue/features/half_ka_v2_variants.cpp index eea3b54..8551ebf 100644 --- a/src/nnue/features/half_ka_v2_variants.cpp +++ b/src/nnue/features/half_ka_v2_variants.cpp @@ -103,7 +103,7 @@ namespace Stockfish::Eval::NNUE::Features { } bool HalfKAv2Variants::requires_refresh(StateInfo* st, Color perspective, const Position& pos) { - return st->dirtyPiece.piece[0] == make_piece(perspective, pos.nnue_king()); + return st->dirtyPiece.piece[0] == make_piece(perspective, pos.nnue_king()) || pos.flip_enclosed_pieces(); } } // namespace Stockfish::Eval::NNUE::Features diff --git a/src/nnue/features/half_ka_v2_variants.h b/src/nnue/features/half_ka_v2_variants.h index 4342059..34cb8d6 100644 --- a/src/nnue/features/half_ka_v2_variants.h +++ b/src/nnue/features/half_ka_v2_variants.h @@ -62,7 +62,7 @@ namespace Stockfish::Eval::NNUE::Features { } // Maximum number of simultaneously active features. - static constexpr IndexType MaxActiveDimensions = 64; + static constexpr IndexType MaxActiveDimensions = 128; // Get a list of indices for active features static void append_active_indices( diff --git a/src/variant.cpp b/src/variant.cpp index 2baac0f..f9a88ab 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -871,6 +871,38 @@ namespace { v->materialCounting = UNWEIGHTED_MATERIAL; return v; } + // Flipersi + // https://en.wikipedia.org/wiki/Reversi + Variant* flipersi_variant() { + Variant* v = chess_variant_base()->init(); + v->pieceToCharTable = "P.................p................."; + v->maxRank = RANK_8; + v->maxFile = FILE_H; + v->reset_pieces(); + v->add_piece(IMMOBILE_PIECE, 'p'); + v->startFen = "8/8/8/8/8/8/8/8[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPpppppppppppppppppppppppppppppppp] w 0 1"; + v->promotionPieceTypes = {}; + v->pieceDrops = true; + v->doubleStep = false; + v->castling = false; + v->immobilityIllegal = false; + v->stalemateValue = -VALUE_MATE; + v->stalematePieceCount = true; + v->passOnStalemate = false; + v->enclosingDrop = REVERSI; + v->enclosingDropStart = make_bitboard(SQ_D4, SQ_E4, SQ_D5, SQ_E5); + v->flipEnclosedPieces = REVERSI; + v->materialCounting = UNWEIGHTED_MATERIAL; + return v; + } + // Flipello + // https://en.wikipedia.org/wiki/Reversi#Othello + Variant* flipello_variant() { + Variant* v = flipersi_variant()->init(); + v->startFen = "8/8/8/3pP3/3Pp3/8/8/8[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPpppppppppppppppppppppppppppppppp] w 0 1"; + v->passOnStalemate = true; + return v; + } // Minixiangqi // http://mlwi.magix.net/bg/minixiangqi.htm Variant* minixiangqi_variant() { @@ -1232,7 +1264,7 @@ namespace { return v; } // Clobber 10x10 - // Clobber on a 10x10, mainly played by computers + // Clobber on a 10x10 board, mainly played by computers // https://en.wikipedia.org/wiki/Clobber Variant* clobber10_variant() { Variant* v = clobber_variant()->init(); @@ -1242,6 +1274,17 @@ namespace { "pPpPpPpPpP/PpPpPpPpPp/pPpPpPpPpP/PpPpPpPpPp/pPpPpPpPpP w 0 1"; return v; } + // Flipello 10x10 + // Othello on a 10x10 board, mainly played by computers + // https://en.wikipedia.org/wiki/Reversi + Variant* flipello10_variant() { + Variant* v = flipello_variant()->init(); + v->maxRank = RANK_10; + v->maxFile = FILE_J; + v->startFen = "10/10/10/10/4pP4/4Pp4/10/10/10/10[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp] w - - 0 1"; + v->enclosingDropStart = make_bitboard(SQ_E5, SQ_F5, SQ_E6, SQ_F6); + return v; + } #ifdef ALLVARS // Game of the Amazons // https://en.wikipedia.org/wiki/Game_of_the_Amazons @@ -1434,6 +1477,8 @@ void VariantMap::init() { add("clobber", clobber_variant()); add("breakthrough", breakthrough_variant()); add("ataxx", ataxx_variant()); + add("flipersi", flipersi_variant()); + add("flipello", flipello_variant()); add("minixiangqi", minixiangqi_variant()); #ifdef LARGEBOARDS add("shogi", shogi_variant()); @@ -1456,6 +1501,7 @@ void VariantMap::init() { add("tencubed", tencubed_variant()); add("shako", shako_variant()); add("clobber10", clobber10_variant()); + add("flipello10", flipello10_variant()); #ifdef ALLVARS add("amazons", amazons_variant()); #endif diff --git a/src/variant.h b/src/variant.h index ebb9876..65fb1f6 100644 --- a/src/variant.h +++ b/src/variant.h @@ -218,7 +218,7 @@ struct Variant { nnueKing = NO_PIECE_TYPE; } int nnueSquares = (maxRank + 1) * (maxFile + 1); - nnueUsePockets = (pieceDrops && (!mustDrop || capturesToHand)) || seirawanGating; + nnueUsePockets = (pieceDrops && (capturesToHand || (!mustDrop && !arrowGating && pieceTypes.size() != 1))) || seirawanGating; int nnuePockets = nnueUsePockets ? 2 * int(maxFile + 1) : 0; int nnueNonDropPieceIndices = (2 * pieceTypes.size() - (nnueKing != NO_PIECE_TYPE)) * nnueSquares; int nnuePieceIndices = nnueNonDropPieceIndices + 2 * (pieceTypes.size() - (nnueKing != NO_PIECE_TYPE)) * nnuePockets; diff --git a/src/variants.ini b/src/variants.ini index ac2348d..900643d 100644 --- a/src/variants.ini +++ b/src/variants.ini @@ -430,25 +430,11 @@ immobilityIllegal = false connectN = 4 nMoveRule = 0 -[flipersi] -immobile = p -startFen = 8/8/8/8/8/8/8/8[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPpppppppppppppppppppppppppppppppp] w 0 1 -pieceDrops = true -promotionPieceTypes = - -doubleStep = false -castling = false -stalemateValue = loss -stalematePieceCount = true -materialCounting = unweighted -enclosingDrop = reversi -enclosingDropStart = d4 e4 d5 e5 -immobilityIllegal = false -flipEnclosedPieces = reversi -passOnStalemate = false - -[flipello:flipersi] -startFen = 8/8/8/3pP3/3Pp3/8/8/8[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPpppppppppppppppppppppppppppppppp] w 0 1 -passOnStalemate = true +[flipello6:flipello] +maxRank = 6 +maxFile = 6 +startFen = 6/6/2pP2/2Pp2/6/6[PPPPPPPPPPPPPPPPPPPPPPpppppppppppppppppppppp] w 0 1 +enclosingDropStart = c2 d2 c3 d3 [grandhouse:grand] startFen = r8r/1nbqkcabn1/pppppppppp/10/10/10/10/PPPPPPPPPP/1NBQKCABN1/R8R[] w - - 0 1 -- 1.7.0.4