Thread::search(); // Let's start searching!
}
- // When playing in 'nodes as time' mode, subtract the searched nodes from
- // the available ones before exiting.
- if (Limits.npmsec)
- Time.availableNodes += Limits.inc[us] - Threads.nodes_searched();
-
// When we reach the maximum depth, we can arrive here without a raise of
// 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
if (th != this)
th->wait_for_search_finished();
+ // When playing in 'nodes as time' mode, subtract the searched nodes from
+ // the available ones before exiting.
+ if (Limits.npmsec)
+ Time.availableNodes += Limits.inc[us] - Threads.nodes_searched();
+
// Check if there are threads with a better score than main thread
Thread* bestThread = this;
if ( !this->easyMovePlayed
Depth extension, newDepth;
Value bestValue, value, ttValue, eval;
bool ttHit, inCheck, givesCheck, singularExtensionNode, improving;
- bool captureOrPromotion, doFullDepthSearch, moveCountPruning, skipQuiets, ttCapture;
+ bool captureOrPromotion, doFullDepthSearch, moveCountPruning, skipQuiets, ttCapture, pvExact;
Piece movedPiece;
int moveCount, quietCount;
&& tte->depth() >= depth - 3 * ONE_PLY;
skipQuiets = false;
ttCapture = false;
+ pvExact = PvNode && ttHit && tte->bound() == BOUND_EXACT;
// Step 11. Loop through moves
// Loop through all pseudo-legal moves until no moves remain or a beta cutoff occurs
if ((ss-1)->moveCount > 15)
r -= ONE_PLY;
+ // Decrease reduction for exact PV nodes
+ if (pvExact)
+ r -= ONE_PLY;
+
// Increase reduction if ttMove is a capture
if (ttCapture)
r += ONE_PLY;
- 4000;
// Decrease/increase reduction by comparing opponent's stat score
- if (ss->statScore > 0 && (ss-1)->statScore < 0)
+ if (ss->statScore >= 0 && (ss-1)->statScore < 0)
r -= ONE_PLY;
- else if (ss->statScore < 0 && (ss-1)->statScore > 0)
+ else if ((ss-1)->statScore >= 0 && ss->statScore < 0)
r += ONE_PLY;
// Decrease/increase reduction for moves with a good/bad history