Merge remote-tracking branch 'upstream/master' into clusterMergeMaster4

This commit is contained in:
Joost VandeVondele
2019-02-17 13:18:08 +01:00
16 changed files with 192 additions and 228 deletions
+30 -49
View File
@@ -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;