&& !Skill(Options["Skill Level"]).enabled()
&& rootMoves[0].pv[0] != MOVE_NONE)
{
- for (Thread* th : Threads)
- {
- Depth depthDiff = th->completedDepth - bestThread->completedDepth;
- Value scoreDiff = th->rootMoves[0].score - bestThread->rootMoves[0].score;
+ std::map<Move, int> votes;
+ Value minScore = this->rootMoves[0].score;
- // Select the thread with the best score, always if it is a mate
- if ( scoreDiff > 0
- && (depthDiff >= 0 || th->rootMoves[0].score >= VALUE_MATE_IN_MAX_PLY))
- bestThread = th;
+ // Find out minimum score and reset votes for moves which can be voted
+ for (Thread* th: Threads){
+ minScore = std::min(minScore, th->rootMoves[0].score);
+ votes[th->rootMoves[0].pv[0]] = 0;
+ }
+
+ // Vote according to score and depth
+ for (Thread* th : Threads)
+ votes[th->rootMoves[0].pv[0]] += int(th->rootMoves[0].score - minScore) + int(th->completedDepth);
+
+ // Select best thread
+ int bestVote = votes[this->rootMoves[0].pv[0]];
+ for (Thread* th : Threads){
+ if (votes[th->rootMoves[0].pv[0]] > bestVote){
+ bestVote = votes[th->rootMoves[0].pv[0]];
+ bestThread = th;
+ }
}
}
+
previousScore = bestThread->rootMoves[0].score;
// Send again PV info if we have a new best thread