Tweak futility pruning for extinction variants
authorFabian Fichter <ianfab@users.noreply.github.com>
Fri, 29 Jan 2021 20:33:17 +0000 (21:33 +0100)
committerFabian Fichter <ianfab@users.noreply.github.com>
Fri, 29 Jan 2021 20:33:17 +0000 (21:33 +0100)
atomic STC
LLR: 2.96 (-2.94,2.94) [0.00,10.00]
Total: 2994 W: 1118 L: 999 D: 877
http://www.variantfishtest.org:6543/tests/view/6014099b6e23db669974e628

atomic LTC
LLR: 2.97 (-2.94,2.94) [0.00,10.00]
Total: 4099 W: 1416 L: 1287 D: 1396
http://www.variantfishtest.org:6543/tests/view/601425556e23db669974e63a

extinction STC
LLR: 2.96 (-2.94,2.94) [0.00,10.00]
Total: 496 W: 279 L: 177 D: 40
http://www.variantfishtest.org:6543/tests/view/601409d26e23db669974e62f

extinction LTC
LLR: 2.97 (-2.94,2.94) [0.00,10.00]
Total: 794 W: 410 L: 305 D: 79
http://www.variantfishtest.org:6543/tests/view/601445566e23db669974e643

kinglet STC
LLR: 2.95 (-2.94,2.94) [0.00,10.00]
Total: 1223 W: 587 L: 479 D: 157
http://www.variantfishtest.org:6543/tests/view/601441fc6e23db669974e641

kinglet LTC
LLR: 2.95 (-2.94,2.94) [0.00,10.00]
Total: 994 W: 480 L: 376 D: 138
http://www.variantfishtest.org:6543/tests/view/601445906e23db669974e645

src/position.h
src/search.cpp

index 3f65599..0cc9915 100644 (file)
@@ -173,6 +173,7 @@ public:
   Value extinction_value(int ply = 0) const;
   bool extinction_claim() const;
   const std::set<PieceType>& extinction_piece_types() const;
+  bool extinction_single_piece() const;
   int extinction_piece_count() const;
   int extinction_opponent_piece_count() const;
   PieceType capture_the_flag_piece() const;
@@ -754,6 +755,14 @@ inline const std::set<PieceType>& Position::extinction_piece_types() const {
   return var->extinctionPieceTypes;
 }
 
+inline bool Position::extinction_single_piece() const {
+  assert(var != nullptr);
+  return   var->extinctionValue == -VALUE_MATE
+        && std::any_of(var->extinctionPieceTypes.begin(),
+                       var->extinctionPieceTypes.end(),
+                       [](PieceType pt) { return pt != ALL_PIECES; });
+}
+
 inline int Position::extinction_piece_count() const {
   assert(var != nullptr);
   return var->extinctionPieceCount;
index 6c5914f..f5bfcf4 100644 (file)
@@ -920,11 +920,8 @@ namespace {
     // Step 8. Futility pruning: child node (~50 Elo)
     if (   !PvNode
         &&  depth < 8
-        && !(   pos.extinction_value() == -VALUE_MATE
-             && !pos.blast_on_capture()
-             && pos.extinction_piece_types().find(ALL_PIECES) == pos.extinction_piece_types().end())
         && !(pos.capture_the_flag_piece() && !pos.checking_permitted())
-        &&  eval - futility_margin(depth, improving) * (1 + pos.check_counting() + 2 * pos.must_capture()) >= beta
+        &&  eval - futility_margin(depth, improving) * (1 + pos.check_counting() + 2 * pos.must_capture() + pos.extinction_single_piece()) >= beta
         &&  eval < VALUE_KNOWN_WIN) // Do not return unproven wins
         return eval;