From: Marco Costalba Date: Sat, 16 Jan 2016 08:03:56 +0000 (+0100) Subject: Rewrite time formula X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=356147d99ae6783d79861c32f128a98685024c58;hp=89723339d93c87f52e148080d5b1dc101ee76685 Rewrite time formula Time management is really too complex, our aim is to simplify it, but for time being at least rewrite in an understandable way. No functional change. --- diff --git a/src/search.cpp b/src/search.cpp index a5203b2e..a4bf172a 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -188,7 +188,7 @@ void Search::clear() { th->counterMoves.clear(); } - Threads.main()->previousMoveScore = VALUE_INFINITE; + Threads.main()->previousScore = VALUE_INFINITE; } @@ -338,7 +338,7 @@ void MainThread::search() { bestThread = th; } - previousMoveScore = bestThread->rootMoves[0].score; + previousScore = bestThread->rootMoves[0].score; // Send new PV when needed if (bestThread != this) @@ -538,13 +538,18 @@ void Thread::search() { // Stop the search if only one legal move is available, or if all // of the available time has been used, or if we matched an easyMove // from the previous search and just did a fast verification. + const bool F[] = { !mainThread->failedLow, + bestValue >= mainThread->previousScore }; + + int improvingFactor = 640 - 160*F[0] - 126*F[1] - 124*F[0]*F[1]; + + bool doEasyMove = rootMoves[0].pv[0] == easyMove + && mainThread->bestMoveChanges < 0.03 + && Time.elapsed() > Time.available() * 25 / 206; + if ( rootMoves.size() == 1 - || Time.elapsed() > Time.available() * ( 640 - 160 * !mainThread->failedLow - - 126 * (bestValue >= mainThread->previousMoveScore) - - 124 * (bestValue >= mainThread->previousMoveScore && !mainThread->failedLow))/640 - || ( mainThread->easyMovePlayed = ( rootMoves[0].pv[0] == easyMove - && mainThread->bestMoveChanges < 0.03 - && Time.elapsed() > Time.available() * 25/206))) + || Time.elapsed() > Time.available() * improvingFactor / 640 + || (mainThread->easyMovePlayed = doEasyMove)) { // If we are allowed to ponder do not stop the search now but // keep pondering until the GUI sends "ponderhit" or "stop". @@ -999,11 +1004,10 @@ moves_loop: // When in check search starts from here && cmh[pos.piece_on(to_sq(move))][to_sq(move)] <= VALUE_ZERO)) r += ONE_PLY; - // Decrease reduction for moves with a good history and - // increase reduction for moves with a bad history - int rDecrease = ( thisThread->history[pos.piece_on(to_sq(move))][to_sq(move)] - + cmh[pos.piece_on(to_sq(move))][to_sq(move)]) / 14980; - r = std::max(DEPTH_ZERO, r - rDecrease * ONE_PLY); + // Decrease/increase reduction for moves with a good/bad history + int rHist = ( thisThread->history[pos.piece_on(to_sq(move))][to_sq(move)] + + cmh[pos.piece_on(to_sq(move))][to_sq(move)]) / 14980; + r = std::max(DEPTH_ZERO, r - rHist * ONE_PLY); // Decrease reduction for moves that escape a capture. Filter out // castling moves, because they are coded as "king captures rook" and @@ -1472,7 +1476,7 @@ moves_loop: // When in check search starts from here int maxScore = -VALUE_INFINITE; // Choose best move. For each move score we add two terms, both dependent on - // weakness. One is deterministic and bigger for weaker levels, and one is + // weakness. One is deterministic and bigger for weaker levels, and one is // random. Then we choose the move with the resulting highest score. for (size_t i = 0; i < multiPV; ++i) { diff --git a/src/thread.h b/src/thread.h index 54f4ba06..43ddfbb7 100644 --- a/src/thread.h +++ b/src/thread.h @@ -80,7 +80,7 @@ struct MainThread : public Thread { bool easyMovePlayed, failedLow; double bestMoveChanges; - Value previousMoveScore; + Value previousScore; };