From 146dd605fd0f8a8eb95159173fc2564ce2178f5b Mon Sep 17 00:00:00 2001 From: Fabian Fichter Date: Fri, 22 May 2020 19:56:04 +0200 Subject: [PATCH] Simplify away bare king rule 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 | 3 +-- src/position.cpp | 17 +---------------- src/position.h | 12 +++--------- src/psqt.cpp | 2 -- src/variant.cpp | 23 ++++++++++++++++------- src/variant.h | 3 +-- src/variants.ini | 3 +-- 7 files changed, 23 insertions(+), 40 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index f814862..8c6ccea 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -276,9 +276,8 @@ Variant* VariantParser::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()) diff --git a/src/position.cpp b/src/position.cpp index ac0d71e..80307e7 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -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(sideToMove) - count(sideToMove))) - { - result = bare_king_value(ply); - return true; - } - if ( bare_king_value() != VALUE_NONE - && bare_king_move() - && !(count(~sideToMove) - count(~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; diff --git a/src/position.h b/src/position.h index 4254f14..b563843 100644 --- a/src/position.h +++ b/src/position.h @@ -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& 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& Position::extinction_piece_types() const { diff --git a/src/psqt.cpp b/src/psqt.cpp index e78a231..e653344 100644 --- a/src/psqt.cpp +++ b/src/psqt.cpp @@ -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) { diff --git a/src/variant.cpp b/src/variant.cpp index 83814c7..3ebe1b5 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -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; } diff --git a/src/variant.h b/src/variant.h index d9191f7..4551498 100644 --- a/src/variant.h +++ b/src/variant.h @@ -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 extinctionPieceTypes = {}; int extinctionPieceCount = 0; int extinctionOpponentPieceCount = 0; diff --git a/src/variants.ini b/src/variants.ini index 99448e6..5fd0578 100644 --- a/src/variants.ini +++ b/src/variants.ini @@ -164,9 +164,8 @@ # 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) -- 1.7.0.4