bestPreviousScore = bestThread->rootMoves[0].score;
bestPreviousAverageScore = bestThread->rootMoves[0].averageScore;
+ for (Thread* th : Threads)
+ th->previousDepth = bestThread->completedDepth;
+
// Send again PV info if we have a new best thread
if (bestThread != this)
sync_cout << UCI::pv(bestThread->rootPos, bestThread->completedDepth, -VALUE_INFINITE, VALUE_INFINITE) << sync_endl;
// a reduced search on all the other moves but the ttMove and if the
// result is lower than ttValue minus a margin, then we will extend the ttMove.
if ( !rootNode
- && depth >= 4 + 2 * (PvNode && tte->is_pv())
+ && depth >= 4 - (thisThread->previousDepth > 27) + 2 * (PvNode && tte->is_pv())
&& move == ttMove
&& !excludedMove // Avoid recursive singular search
/* && ttValue != VALUE_NONE Already implicit in the next condition */
update_pv(ss->pv, move, (ss+1)->pv);
if (PvNode && value < beta) // Update alpha! Always alpha < beta
+ {
alpha = value;
+
+ // Reduce other moves if we have found at least one score improvement
+ if ( depth > 2
+ && depth < 7
+ && beta < VALUE_KNOWN_WIN
+ && alpha > -VALUE_KNOWN_WIN)
+ depth -= 1;
+
+ assert(depth > 0);
+ }
else
{
ss->cutoffCnt++;