}
else
{
- for (Thread* th : Threads)
- {
- th->bestMoveChanges = 0;
- if (th != this)
- th->start_searching();
- }
-
- Thread::search(); // Let's start searching!
+ Threads.start_searching(); // start non-main threads
+ Thread::search(); // main thread start searching
}
// When we reach the maximum depth, we can arrive here without a raise of
Threads.stop = true;
// Wait until all threads have finished
- for (Thread* th : Threads)
- if (th != this)
- th->wait_for_search_finished();
+ Threads.wait_for_search_finished();
// When playing in 'nodes as time' mode, subtract the searched nodes from
// the available ones before exiting.
Thread* bestThread = this;
- // Check if there are threads with a better score than main thread
- if ( int(Options["MultiPV"]) == 1
- && !Limits.depth
- && !(Skill(Options["Skill Level"]).enabled() || int(Options["UCI_LimitStrength"]))
- && rootMoves[0].pv[0] != MOVE_NONE)
- {
- std::map<Move, int64_t> votes;
- Value minScore = this->rootMoves[0].score;
-
- // Find minimum score
- for (Thread* th: Threads)
- minScore = std::min(minScore, th->rootMoves[0].score);
-
- // Vote according to score and depth, and select the best thread
- for (Thread* th : Threads)
- {
- votes[th->rootMoves[0].pv[0]] +=
- (th->rootMoves[0].score - minScore + 14) * int(th->completedDepth);
-
- 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
- if (th->rootMoves[0].score > bestThread->rootMoves[0].score)
- bestThread = th;
- }
- else if ( th->rootMoves[0].score >= VALUE_TB_WIN_IN_MAX_PLY
- || ( th->rootMoves[0].score > VALUE_TB_LOSS_IN_MAX_PLY
- && votes[th->rootMoves[0].pv[0]] > votes[bestThread->rootMoves[0].pv[0]]))
- bestThread = th;
- }
- }
+ if (int(Options["MultiPV"]) == 1 &&
+ !Limits.depth &&
+ !(Skill(Options["Skill Level"]).enabled() || int(Options["UCI_LimitStrength"])) &&
+ rootMoves[0].pv[0] != MOVE_NONE)
+ bestThread = Threads.get_best_thread();
bestPreviousScore = bestThread->rootMoves[0].score;
}
double bestMoveInstability = 1 + totBestMoveChanges / Threads.size();
- // Stop the search if we have only one legal move, or if available time elapsed
- if ( rootMoves.size() == 1
- || Time.elapsed() > Time.optimum() * fallingEval * reduction * bestMoveInstability)
+ double totalTime = rootMoves.size() == 1 ? 0 :
+ Time.optimum() * fallingEval * reduction * bestMoveInstability;
+
+ // Stop the search if we have exceeded the totalTime, at least 1ms search.
+ if (Time.elapsed() > totalTime)
{
// If we are allowed to ponder do not stop the search now but
// keep pondering until the GUI sends "ponderhit" or "stop".
}
else if ( Threads.increaseDepth
&& !mainThread->ponder
- && Time.elapsed() > Time.optimum() * fallingEval * reduction * bestMoveInstability * 0.6)
+ && Time.elapsed() > totalTime * 0.6)
Threads.increaseDepth = false;
else
Threads.increaseDepth = true;
Depth extension, newDepth;
Value bestValue, value, ttValue, eval, maxValue;
bool ttHit, ttPv, formerPv, givesCheck, improving, didLMR, priorCapture;
- bool captureOrPromotion, doFullDepthSearch, moveCountPruning, ttCapture, singularLMR;
+ bool captureOrPromotion, doFullDepthSearch, moveCountPruning,
+ ttCapture, singularQuietLMR;
Piece movedPiece;
int moveCount, captureCount, quietCount;
contHist,
countermove,
ss->killers,
- depth > 12 ? ss->ply : MAX_PLY);
+ ss->ply);
value = bestValue;
- singularLMR = moveCountPruning = false;
+ singularQuietLMR = moveCountPruning = false;
ttCapture = ttMove && pos.capture_or_promotion(ttMove);
// Mark this node as being searched
&& ss->staticEval + 235 + 172 * lmrDepth <= alpha
&& (*contHist[0])[movedPiece][to_sq(move)]
+ (*contHist[1])[movedPiece][to_sq(move)]
- + (*contHist[3])[movedPiece][to_sq(move)] < 27400)
+ + (*contHist[3])[movedPiece][to_sq(move)]
+ + (*contHist[5])[movedPiece][to_sq(move)] / 2 < 31400)
continue;
// Prune moves with negative SEE (~20 Elo)
if (value < singularBeta)
{
extension = 1;
- singularLMR = true;
+ singularQuietLMR = !ttCapture;
}
// Multi-cut pruning
r--;
// Decrease reduction if ttMove has been singularly extended (~3 Elo)
- if (singularLMR)
+ if (singularQuietLMR)
r -= 1 + formerPv;
if (!captureOrPromotion)