th->counterMoves.clear();
}
- Threads.main()->previousMoveScore = VALUE_INFINITE;
+ Threads.main()->previousScore = VALUE_INFINITE;
}
bestThread = th;
}
- previousMoveScore = bestThread->rootMoves[0].score;
+ previousScore = bestThread->rootMoves[0].score;
// Send new PV when needed
if (bestThread != this)
// 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".
&& 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
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)
{