Add flipello to built-in variants
authorFabian Fichter <ianfab@users.noreply.github.com>
Fri, 20 May 2022 11:59:09 +0000 (13:59 +0200)
committerFabian Fichter <ianfab@users.noreply.github.com>
Sat, 21 May 2022 08:57:06 +0000 (10:57 +0200)
Also adjust NNUE code for othello and other non-chess variants.

src/nnue/features/half_ka_v2_variants.cpp
src/nnue/features/half_ka_v2_variants.h
src/variant.cpp
src/variant.h
src/variants.ini

index eea3b54..8551ebf 100644 (file)
@@ -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
index 4342059..34cb8d6 100644 (file)
@@ -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(
index 2baac0f..f9a88ab 100644 (file)
@@ -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
index ebb9876..65fb1f6 100644 (file)
@@ -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;
index ac2348d..900643d 100644 (file)
@@ -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