From 1188141aa78d01c361582daaa73de5154b6d09b1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ste=CC=81phane=20Nicolet?= Date: Thu, 21 Jan 2021 18:53:29 +0100 Subject: [PATCH] Improve play for closed positions This patch give a small bonus to incite the attacking side to keep more pawns on the board. A consequence of this bonus is that Stockfish will tend to play positions slightly more closed on average than master, especially when it believes that it has an advantage. To lower the risk of blockades where Stockfish start shuffling without progress, we also implement a progressive decrease of the evaluation value with the 50 moves counter (along with the necessary aging of the transposition table to reduce the impact of the Graph History Interaction problem): since the evaluation decreases during shuffling phases, the engine will tend to examine the consequences of pawn breaks faster during the search. Passed STC: LLR: 2.96 (-2.94,2.94) {-0.25,1.25} Total: 26184 W: 2406 L: 2252 D: 21526 Ptnml(0-2): 85, 1784, 9223, 1892, 108 https://tests.stockfishchess.org/tests/view/600cc08b735dd7f0f0352c06 Passed LCT: LLR: 2.95 (-2.94,2.94) {0.25,1.25} Total: 199768 W: 7695 L: 7191 D: 184882 Ptnml(0-2): 85, 6478, 86269, 6952, 100 https://tests.stockfishchess.org/tests/view/600ccd28735dd7f0f0352c10 Closes https://github.com/official-stockfish/Stockfish/pull/3321 Bench: 3988915 --- src/evaluate.cpp | 4 ++-- src/position.cpp | 2 +- src/position.h | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 76266937..6bd3c08b 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -1052,8 +1052,8 @@ Value Eval::evaluate(const Position& pos) { { // Scale and shift NNUE for compatibility with search and classical evaluation auto adjusted_NNUE = [&](){ - int mat = pos.non_pawn_material() + PawnValueMg * pos.count(); - return NNUE::evaluate(pos) * (679 + mat / 32) / 1024 + Tempo; + int mat = pos.non_pawn_material() + 2 * PawnValueMg * pos.count(); + return NNUE::evaluate(pos) * (641 + mat / 32 - 4 * pos.rule50_count()) / 1024 + Tempo; }; // If there is PSQ imbalance use classical eval, with small probability if it is small diff --git a/src/position.cpp b/src/position.cpp index 12b1bd9a..8c97160b 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -1017,7 +1017,7 @@ void Position::do_null_move(StateInfo& newSt) { } st->key ^= Zobrist::side; - prefetch(TT.first_entry(st->key)); + prefetch(TT.first_entry(key())); ++st->rule50; st->pliesFromNull = 0; diff --git a/src/position.h b/src/position.h index 93e0f91d..928366bc 100644 --- a/src/position.h +++ b/src/position.h @@ -322,7 +322,8 @@ inline int Position::pawns_on_same_color_squares(Color c, Square s) const { } inline Key Position::key() const { - return st->key; + return st->rule50 < 14 ? st->key + : st->key ^ make_key((st->rule50 - 14) / 8); } inline Key Position::pawn_key() const { -- 2.39.2