Simplify away bare king rule
authorFabian Fichter <ianfab@users.noreply.github.com>
Fri, 22 May 2020 17:56:04 +0000 (19:56 +0200)
committerFabian Fichter <ianfab@users.noreply.github.com>
Fri, 22 May 2020 17:56:04 +0000 (19:56 +0200)
Merge bare king rule into extinction rules.

losers STC
LLR: 2.95 (-2.94,2.94) [-10.00,5.00]
Total: 710 W: 355 L: 297 D: 58
http://www.variantfishtest.org:6543/tests/view/5ec7ace16e23db36d55f2bcc

src/parser.cpp
src/position.cpp
src/position.h
src/psqt.cpp
src/variant.cpp
src/variant.h
src/variants.ini

index f814862..8c6ccea 100644 (file)
@@ -276,9 +276,8 @@ Variant* VariantParser<DoCheck>::parse(Variant* v) {
     parse_attribute("shogiPawnDropMateIllegal", v->shogiPawnDropMateIllegal);
     parse_attribute("shatarMateRule", v->shatarMateRule);
     parse_attribute("bikjangRule", v->bikjangRule);
-    parse_attribute("bareKingValue", v->bareKingValue);
     parse_attribute("extinctionValue", v->extinctionValue);
-    parse_attribute("bareKingMove", v->bareKingMove);
+    parse_attribute("extinctionClaim", v->extinctionClaim);
     // extinction piece types
     const auto& it_ext = config.find("extinctionPieceTypes");
     if (it_ext != config.end())
index ac0d71e..80307e7 100644 (file)
@@ -1896,28 +1896,13 @@ bool Position::is_optional_game_end(Value& result, int ply, int countStarted) co
 
 bool Position::is_immediate_game_end(Value& result, int ply) const {
 
-  // bare king rule
-  if (    bare_king_value() != VALUE_NONE
-      && !bare_king_move()
-      && !(count<ALL_PIECES>(sideToMove) - count<KING>(sideToMove)))
-  {
-      result = bare_king_value(ply);
-      return true;
-  }
-  if (    bare_king_value() != VALUE_NONE
-      &&  bare_king_move()
-      && !(count<ALL_PIECES>(~sideToMove) - count<KING>(~sideToMove)))
-  {
-      result = -bare_king_value(ply);
-      return true;
-  }
   // extinction
   if (extinction_value() != VALUE_NONE)
   {
       for (Color c : { WHITE, BLACK })
           for (PieceType pt : extinction_piece_types())
               if (   count_with_hand( c, pt) <= var->extinctionPieceCount
-                  && count_with_hand(~c, pt) >= var->extinctionOpponentPieceCount)
+                  && count_with_hand(~c, pt) >= var->extinctionOpponentPieceCount + (extinction_claim() && c == sideToMove))
               {
                   result = c == sideToMove ? extinction_value(ply) : -extinction_value(ply);
                   return true;
index 4254f14..b563843 100644 (file)
@@ -152,9 +152,8 @@ public:
   int n_fold_rule() const;
   Value stalemate_value(int ply = 0) const;
   Value checkmate_value(int ply = 0) const;
-  Value bare_king_value(int ply = 0) const;
   Value extinction_value(int ply = 0) const;
-  bool bare_king_move() const;
+  bool extinction_claim() const;
   const std::set<PieceType>& extinction_piece_types() const;
   int extinction_piece_count() const;
   int extinction_opponent_piece_count() const;
@@ -661,19 +660,14 @@ inline Value Position::checkmate_value(int ply) const {
   return convert_mate_value(var->checkmateValue, ply);
 }
 
-inline Value Position::bare_king_value(int ply) const {
-  assert(var != nullptr);
-  return convert_mate_value(var->bareKingValue, ply);
-}
-
 inline Value Position::extinction_value(int ply) const {
   assert(var != nullptr);
   return convert_mate_value(var->extinctionValue, ply);
 }
 
-inline bool Position::bare_king_move() const {
+inline bool Position::extinction_claim() const {
   assert(var != nullptr);
-  return var->bareKingMove;
+  return var->extinctionClaim;
 }
 
 inline const std::set<PieceType>& Position::extinction_piece_types() const {
index e78a231..e653344 100644 (file)
@@ -183,8 +183,6 @@ void init(const Variant* v) {
       if (   v->extinctionValue == VALUE_MATE
           && v->extinctionPieceTypes.find(ALL_PIECES) != v->extinctionPieceTypes.end())
           score = -make_score(mg_value(score) / 8, eg_value(score) / 8 / (1 + !pi->sliderCapture.size()));
-      else if (v->bareKingValue == VALUE_MATE)
-          score = -make_score(mg_value(score) / 8, eg_value(score) / 8 / (1 + !pi->sliderCapture.size()));
 
       for (Square s = SQ_A1; s <= SQ_MAX; ++s)
       {
index 83814c7..3ebe1b5 100644 (file)
@@ -130,8 +130,11 @@ namespace {
         v->promotionPieceTypes = {FERS};
         v->doubleStep = false;
         v->castling = false;
-        v->bareKingValue = -VALUE_MATE;
-        v->bareKingMove = true;
+        v->extinctionValue = -VALUE_MATE;
+        v->extinctionClaim = true;
+        v->extinctionPieceTypes = {ALL_PIECES};
+        v->extinctionPieceCount = 1;
+        v->extinctionOpponentPieceCount = 2;
         v->stalemateValue = -VALUE_MATE;
         v->nMoveRule = 70;
         return v;
@@ -196,8 +199,9 @@ namespace {
         Variant* v = fairy_variant_base();
         v->checkmateValue = VALUE_MATE;
         v->stalemateValue = VALUE_MATE;
-        v->bareKingValue = VALUE_MATE;
-        v->bareKingMove = false;
+        v->extinctionValue = VALUE_MATE;
+        v->extinctionPieceTypes = {ALL_PIECES};
+        v->extinctionPieceCount = 1;
         v->mustCapture = true;
         return v;
     }
@@ -559,7 +563,9 @@ namespace {
         v->promotionPieceTypes = {BERS};
         v->doubleStep = false;
         v->castling = false;
-        v->bareKingValue = VALUE_DRAW; // Robado
+        v->extinctionValue = VALUE_DRAW; // Robado
+        v->extinctionPieceTypes = {ALL_PIECES};
+        v->extinctionPieceCount = 1;
         v->shatarMateRule = true;
         return v;
     }
@@ -755,8 +761,11 @@ namespace {
         v->promotionPieceTypes = {FERS};
         v->doubleStep = false;
         v->castling = false;
-        v->bareKingValue = -VALUE_MATE;
-        v->bareKingMove = true;
+        v->extinctionValue = -VALUE_MATE;
+        v->extinctionClaim = true;
+        v->extinctionPieceTypes = {ALL_PIECES};
+        v->extinctionPieceCount = 1;
+        v->extinctionOpponentPieceCount = 2;
         v->stalemateValue = -VALUE_MATE;
         return v;
     }
index d9191f7..4551498 100644 (file)
@@ -104,9 +104,8 @@ struct Variant {
   bool shogiPawnDropMateIllegal = false;
   bool shatarMateRule = false;
   bool bikjangRule = false;
-  Value bareKingValue = VALUE_NONE;
   Value extinctionValue = VALUE_NONE;
-  bool bareKingMove = false;
+  bool extinctionClaim = false;
   std::set<PieceType> extinctionPieceTypes = {};
   int extinctionPieceCount = 0;
   int extinctionOpponentPieceCount = 0;
index 99448e6..5fd0578 100644 (file)
 # shogiPawnDropMateIllegal: prohibit checkmate via shogi pawn drops [bool] (default: false)
 # shatarMateRule: enable shatar mating rules [bool] (default: false)
 # bikjangRule: consider Janggi bikjang (facing kings) rule [bool] (default: false)
-# bareKingValue: result when player only has a lone/bare king [Value] (default: none)
 # extinctionValue: result when one of extinctionPieceTypes is extinct [Value] (default: none)
-# bareKingMove: allow additional move by opponent after lone/bare king position [bool] (default: false)
+# extinctionClaim: extinction of opponent pieces can only be claimed as side to move [bool] (default: false)
 # extinctionPieceTypes: list of piece types for extinction rules, e.g., pnbrq (* means all) (default: )
 # extinctionPieceCount: piece count at which the game is decided by extinction rule (default: 0)
 # extinctionOpponentPieceCount: opponent piece count required to adjudicate by extinction rule (default: 0)