From 367304e930e967d90523025b34f25c2a9b60de8f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ondrej=20Mosn=C3=A1=C4=8Dek?= Date: Wed, 14 Mar 2018 16:47:45 +0100 Subject: [PATCH] Fix dynamic contempt for MultiPV Use rootMoves[PVIdx].previousScore instead of bestValue for dynamic contempt. This is equivalent for MultiPV=1 (bench remained the same, even for higher depths), but more correct for MultiPV. STC (MultiPV=3): LLR: 2.95 (-2.94,2.94) [0.00,5.00] Total: 2657 W: 1079 L: 898 D: 680 http://tests.stockfishchess.org/tests/view/5aaa47cb0ebc590297330403 LTC (MultiPV=3): LLR: 2.95 (-2.94,2.94) [0.00,5.00] Total: 2390 W: 874 L: 706 D: 810 http://tests.stockfishchess.org/tests/view/5aaa593a0ebc59029733040b VLTC 240+2.4 (MultiPV=3): LLR: 2.96 (-2.94,2.94) [0.00,5.00] Total: 2399 W: 861 L: 694 D: 844 http://tests.stockfishchess.org/tests/view/5aaf983e0ebc5902a182131f LTC (MultiPV=4, Skill Level=17): LLR: 2.95 (-2.94,2.94) [0.00,5.00] Total: 747 W: 333 L: 175 D: 239 http://tests.stockfishchess.org/tests/view/5aabccee0ebc5902997ff006 Note: although the ELO differences seem huge, they are inflated by the nature of Skill Level / MultiPV search, so I don't think they can be reasonably compared with classic ELO strength. See https://github.com/official-stockfish/Stockfish/pull/1491 for some verifications searches with MultiPV = 10 at depths 12 and 24 from the starting position and the position after 1.e4, comparing the outputs of the full PV by the old master and by this patch. No functional change for MultiPV=1 --- src/search.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 1a516ff8..7b7737ea 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -343,14 +343,15 @@ void Thread::search() { // Reset aspiration window starting size if (rootDepth >= 5 * ONE_PLY) { + Value previousScore = rootMoves[PVIdx].previousScore; delta = Value(18); - alpha = std::max(rootMoves[PVIdx].previousScore - delta,-VALUE_INFINITE); - beta = std::min(rootMoves[PVIdx].previousScore + delta, VALUE_INFINITE); + alpha = std::max(previousScore - delta,-VALUE_INFINITE); + beta = std::min(previousScore + delta, VALUE_INFINITE); ct = Options["Contempt"] * PawnValueEg / 100; // From centipawns - // Adjust contempt based on current bestValue (dynamic contempt) - ct += int(std::round(48 * atan(float(bestValue) / 128))); + // Adjust contempt based on root move's previousScore (dynamic contempt) + ct += int(std::round(48 * atan(float(previousScore) / 128))); Eval::Contempt = (us == WHITE ? make_score(ct, ct / 2) : -make_score(ct, ct / 2)); -- 2.39.2