mirror of
https://github.com/official-stockfish/Stockfish.git
synced 2026-07-25 14:17:13 +00:00
Merge remote-tracking branch 'upstream/master' into clusterMergeMaster4
This commit is contained in:
+30
-49
@@ -230,10 +230,9 @@ void MainThread::search() {
|
||||
// Threads.stop. However, if we are pondering or in an infinite search,
|
||||
// the UCI protocol states that we shouldn't print the best move before the
|
||||
// GUI sends a "stop" or "ponderhit" command. We therefore simply wait here
|
||||
// until the GUI sends one of those commands (which also raises Threads.stop).
|
||||
Threads.stopOnPonderhit = true;
|
||||
// until the GUI sends one of those commands.
|
||||
|
||||
while (!Threads.stop && (Threads.ponder || Limits.infinite))
|
||||
while (!Threads.stop && (ponder || Limits.infinite))
|
||||
{ Cluster::signals_poll(); } // Busy wait for a stop or a ponder reset
|
||||
|
||||
// Stop the threads if not already stopped (also raise the stop if
|
||||
@@ -265,27 +264,23 @@ void MainThread::search() {
|
||||
|
||||
// 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
|
||||
auto square = [](int64_t x) { return x * x; };
|
||||
for (Thread* th : Threads)
|
||||
votes[th->rootMoves[0].pv[0]] += 200 + (square(th->rootMoves[0].score - minScore + 1)
|
||||
* int64_t(th->completedDepth));
|
||||
|
||||
// Select best thread
|
||||
int64_t bestVote = votes[this->rootMoves[0].pv[0]];
|
||||
for (Thread* th : Threads)
|
||||
{
|
||||
int64_t s = th->rootMoves[0].score - minScore + 1;
|
||||
votes[th->rootMoves[0].pv[0]] += 200 + s * s * int(th->completedDepth);
|
||||
}
|
||||
|
||||
// Select best thread
|
||||
auto 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -482,7 +477,7 @@ void Thread::search() {
|
||||
{
|
||||
failedHighCnt = 0;
|
||||
failedLow = true;
|
||||
Threads.stopOnPonderhit = false;
|
||||
mainThread->stopOnPonderhit = false;
|
||||
}
|
||||
}
|
||||
else if (bestValue >= beta)
|
||||
@@ -534,16 +529,13 @@ void Thread::search() {
|
||||
// Do we have time for the next iteration? Can we stop searching now?
|
||||
if ( Limits.use_time_management()
|
||||
&& !Threads.stop
|
||||
&& !Threads.stopOnPonderhit)
|
||||
&& !mainThread->stopOnPonderhit)
|
||||
{
|
||||
double fallingEval = (306 + 119 * failedLow + 6 * (mainThread->previousScore - bestValue)) / 581.0;
|
||||
fallingEval = std::max(0.5, std::min(1.5, fallingEval));
|
||||
|
||||
// If the bestMove is stable over several iterations, reduce time accordingly
|
||||
timeReduction = 1.0;
|
||||
for (int i : {3, 4, 5})
|
||||
if (lastBestMoveDepth * i < completedDepth)
|
||||
timeReduction *= 1.25;
|
||||
timeReduction = lastBestMoveDepth + 10 * ONE_PLY < completedDepth ? 1.95 : 1.0;
|
||||
|
||||
// Use part of the gained time from a previous stable move for the current move
|
||||
double bestMoveInstability = 1.0 + mainThread->bestMoveChanges;
|
||||
@@ -555,8 +547,8 @@ void Thread::search() {
|
||||
{
|
||||
// If we are allowed to ponder do not stop the search now but
|
||||
// keep pondering until the GUI sends "ponderhit" or "stop".
|
||||
if (Threads.ponder)
|
||||
Threads.stopOnPonderhit = true;
|
||||
if (mainThread->ponder)
|
||||
mainThread->stopOnPonderhit = true;
|
||||
else
|
||||
Threads.stop = true;
|
||||
}
|
||||
@@ -614,8 +606,8 @@ namespace {
|
||||
Move ttMove, move, excludedMove, bestMove;
|
||||
Depth extension, newDepth;
|
||||
Value bestValue, value, ttValue, eval, maxValue, pureStaticEval;
|
||||
bool ttHit, pvHit, inCheck, givesCheck, improving;
|
||||
bool captureOrPromotion, doFullDepthSearch, moveCountPruning, skipQuiets, ttCapture, pvExact;
|
||||
bool ttHit, ttPv, inCheck, givesCheck, improving;
|
||||
bool captureOrPromotion, doFullDepthSearch, moveCountPruning, skipQuiets, ttCapture;
|
||||
Piece movedPiece;
|
||||
int moveCount, captureCount, quietCount;
|
||||
|
||||
@@ -680,7 +672,7 @@ namespace {
|
||||
ttValue = ttHit ? value_from_tt(tte->value(), ss->ply) : VALUE_NONE;
|
||||
ttMove = rootNode ? thisThread->rootMoves[thisThread->pvIdx].pv[0]
|
||||
: ttHit ? tte->move() : MOVE_NONE;
|
||||
pvHit = ttHit ? tte->pv_hit() : false;
|
||||
ttPv = (ttHit && tte->is_pv()) || (PvNode && depth > 4 * ONE_PLY);
|
||||
|
||||
// At non-PV nodes we check for an early TT cutoff
|
||||
if ( !PvNode
|
||||
@@ -714,11 +706,6 @@ namespace {
|
||||
return ttValue;
|
||||
}
|
||||
|
||||
if ( depth > 6 * ONE_PLY
|
||||
&& !excludedMove
|
||||
&& PvNode)
|
||||
pvHit = true;
|
||||
|
||||
// Step 5. Tablebases probe
|
||||
if (!rootNode && TB::Cardinality)
|
||||
{
|
||||
@@ -753,7 +740,7 @@ namespace {
|
||||
|| (b == BOUND_LOWER ? value >= beta : value <= alpha))
|
||||
{
|
||||
Cluster::save(thisThread, tte,
|
||||
posKey, value_to_tt(value, ss->ply), pvHit, b,
|
||||
posKey, value_to_tt(value, ss->ply), ttPv, b,
|
||||
std::min(DEPTH_MAX - ONE_PLY, depth + 6 * ONE_PLY),
|
||||
MOVE_NONE, VALUE_NONE);
|
||||
|
||||
@@ -794,9 +781,7 @@ namespace {
|
||||
{
|
||||
if ((ss-1)->currentMove != MOVE_NULL)
|
||||
{
|
||||
int p = (ss-1)->statScore;
|
||||
int bonus = p > 0 ? (-p - 2500) / 512 :
|
||||
p < 0 ? (-p + 2500) / 512 : 0;
|
||||
int bonus = -(ss-1)->statScore / 512;
|
||||
|
||||
pureStaticEval = evaluate(pos);
|
||||
ss->staticEval = eval = pureStaticEval + bonus;
|
||||
@@ -805,7 +790,7 @@ namespace {
|
||||
ss->staticEval = eval = pureStaticEval = -(ss-1)->staticEval + 2 * Eval::Tempo;
|
||||
|
||||
Cluster::save(thisThread, tte,
|
||||
posKey, VALUE_NONE, pvHit, BOUND_NONE, DEPTH_NONE, MOVE_NONE,
|
||||
posKey, VALUE_NONE, ttPv, BOUND_NONE, DEPTH_NONE, MOVE_NONE,
|
||||
pureStaticEval);
|
||||
}
|
||||
|
||||
@@ -921,7 +906,6 @@ namespace {
|
||||
tte = TT.probe(posKey, ttHit);
|
||||
ttValue = ttHit ? value_from_tt(tte->value(), ss->ply) : VALUE_NONE;
|
||||
ttMove = ttHit ? tte->move() : MOVE_NONE;
|
||||
pvHit = ttHit ? tte->pv_hit() : false;
|
||||
}
|
||||
|
||||
moves_loop: // When in check, search starts from here
|
||||
@@ -938,7 +922,6 @@ moves_loop: // When in check, search starts from here
|
||||
|
||||
skipQuiets = false;
|
||||
ttCapture = ttMove && pos.capture_or_promotion(ttMove);
|
||||
pvExact = PvNode && ttHit && tte->bound() == BOUND_EXACT;
|
||||
|
||||
// Step 12. Loop through all pseudo-legal moves until no moves remain
|
||||
// or a beta cutoff occurs.
|
||||
@@ -1006,11 +989,13 @@ moves_loop: // When in check, search starts from here
|
||||
else if (cutNode && singularBeta > beta)
|
||||
return beta;
|
||||
}
|
||||
else if ( givesCheck // Check extension (~2 Elo)
|
||||
&& pos.see_ge(move))
|
||||
|
||||
// Check extension (~2 Elo)
|
||||
else if ( givesCheck
|
||||
&& (pos.blockers_for_king(~us) & from_sq(move) || pos.see_ge(move)))
|
||||
extension = ONE_PLY;
|
||||
|
||||
// Extension if castling
|
||||
// Castling extension
|
||||
else if (type_of(move) == CASTLING)
|
||||
extension = ONE_PLY;
|
||||
|
||||
@@ -1083,7 +1068,7 @@ moves_loop: // When in check, search starts from here
|
||||
Depth r = reduction<PvNode>(improving, depth, moveCount);
|
||||
|
||||
// Decrease reduction if position is or has been on the PV
|
||||
if (pvHit && !PvNode)
|
||||
if (ttPv)
|
||||
r -= ONE_PLY;
|
||||
|
||||
// Decrease reduction if opponent's move count is high (~10 Elo)
|
||||
@@ -1092,10 +1077,6 @@ moves_loop: // When in check, search starts from here
|
||||
|
||||
if (!captureOrPromotion)
|
||||
{
|
||||
// Decrease reduction for exact PV nodes (~0 Elo)
|
||||
if (pvExact)
|
||||
r -= ONE_PLY;
|
||||
|
||||
// Increase reduction if ttMove is a capture (~0 Elo)
|
||||
if (ttCapture)
|
||||
r += ONE_PLY;
|
||||
@@ -1269,7 +1250,7 @@ moves_loop: // When in check, search starts from here
|
||||
|
||||
if (!excludedMove)
|
||||
Cluster::save(thisThread, tte,
|
||||
posKey, value_to_tt(bestValue, ss->ply), pvHit,
|
||||
posKey, value_to_tt(bestValue, ss->ply), ttPv,
|
||||
bestValue >= beta ? BOUND_LOWER :
|
||||
PvNode && bestMove ? BOUND_EXACT : BOUND_UPPER,
|
||||
depth, bestMove, pureStaticEval);
|
||||
@@ -1333,7 +1314,7 @@ moves_loop: // When in check, search starts from here
|
||||
tte = TT.probe(posKey, ttHit);
|
||||
ttValue = ttHit ? value_from_tt(tte->value(), ss->ply) : VALUE_NONE;
|
||||
ttMove = ttHit ? tte->move() : MOVE_NONE;
|
||||
pvHit = ttHit ? tte->pv_hit() : false;
|
||||
pvHit = ttHit && tte->is_pv();
|
||||
|
||||
if ( !PvNode
|
||||
&& ttHit
|
||||
@@ -1654,10 +1635,10 @@ void MainThread::check_time() {
|
||||
Cluster::signals_poll();
|
||||
|
||||
// We should not stop pondering until told so by the GUI
|
||||
if (Threads.ponder)
|
||||
if (ponder)
|
||||
return;
|
||||
|
||||
if ( (Limits.use_time_management() && elapsed > Time.maximum() - 10)
|
||||
if ( (Limits.use_time_management() && (elapsed > Time.maximum() - 10 || stopOnPonderhit))
|
||||
|| (Limits.movetime && elapsed >= Limits.movetime)
|
||||
|| (Limits.nodes && Cluster::nodes_searched() >= (uint64_t)Limits.nodes))
|
||||
Threads.stop = true;
|
||||
|
||||
Reference in New Issue
Block a user