]> git.sesse.net Git - stockfish/commitdiff
Fix bestThread selection
authorJoost VandeVondele <Joost.VandeVondele@gmail.com>
Mon, 28 Nov 2022 19:59:38 +0000 (20:59 +0100)
committerJoost VandeVondele <Joost.VandeVondele@gmail.com>
Fri, 2 Dec 2022 19:06:59 +0000 (20:06 +0100)
If multiple threads have the same best move,
pick the thread with the largest contribution to the confidence vote.
This thread will later be used to display PV, so this patch is
about user-friendliness and/or least surprises, it non-functional for playing strenght.

closes https://github.com/official-stockfish/Stockfish/pull/4246

No functional change

src/thread.cpp

index 9ce408e059e02ac119d567a1eda7377f96110f7c..b7471f6026758fc7c2a0763388f9940b9dda37d7 100644 (file)
@@ -221,11 +221,14 @@ Thread* ThreadPool::get_best_thread() const {
         minScore = std::min(minScore, th->rootMoves[0].score);
 
     // Vote according to score and depth, and select the best thread
+    auto thread_value = [minScore](Thread* th) {
+            return (th->rootMoves[0].score - minScore + 14) * int(th->completedDepth);
+        };
+
     for (Thread* th : *this)
-    {
-        votes[th->rootMoves[0].pv[0]] +=
-            (th->rootMoves[0].score - minScore + 14) * int(th->completedDepth);
+        votes[th->rootMoves[0].pv[0]] += thread_value(th);
 
+    for (Thread* th : *this)
         if (abs(bestThread->rootMoves[0].score) >= VALUE_TB_WIN_IN_MAX_PLY)
         {
             // Make sure we pick the shortest mate / TB conversion or stave off mate the longest
@@ -236,9 +239,8 @@ Thread* ThreadPool::get_best_thread() const {
                  || (   th->rootMoves[0].score > VALUE_TB_LOSS_IN_MAX_PLY
                      && (   votes[th->rootMoves[0].pv[0]] > votes[bestThread->rootMoves[0].pv[0]]
                          || (   votes[th->rootMoves[0].pv[0]] == votes[bestThread->rootMoves[0].pv[0]]
-                             && th->rootMoves[0].pv.size() > bestThread->rootMoves[0].pv.size()))))
+                             && thread_value(th) > thread_value(bestThread)))))
             bestThread = th;
-    }
 
     return bestThread;
 }