// Check for some early stop condition
if (!StopRequest && Limits.useTimeManagement())
{
- // Stop search early when the last two iterations returned a mate score
- if ( depth >= 5
- && abs(bestValues[depth]) >= VALUE_MATE_IN_PLY_MAX
- && abs(bestValues[depth - 1]) >= VALUE_MATE_IN_PLY_MAX)
- StopRequest = true;
-
// Stop search early if one move seems to be much better than the
// others or if there is only a single legal move. Also in the latter
// case we search up to some depth anyway to get a proper score.
if (PvNode && thread.maxPly < ss->ply)
thread.maxPly = ss->ply;
- // Step 1. Initialize node.
+ // Step 1. Initialize node and poll. Polling can abort search
if (!SpNode)
{
ss->currentMove = ss->bestMove = threatMove = (ss+1)->excludedMove = MOVE_NONE;
goto split_point_start;
}
+ if (pos.thread() == 0 && ++NodesSincePoll > NodesBetweenPolls)
+ {
+ NodesSincePoll = 0;
+ poll(pos);
+ }
+
+ // Step 2. Check for aborted search and immediate draw
+ if (( StopRequest
+ || pos.is_draw<false>()
+ || ss->ply > PLY_MAX) && !RootNode)
+ return VALUE_DRAW;
+
// Step 3. Mate distance pruning
if (!RootNode)
{
if (pos.pl_move_is_legal(move, ci.pinned))
{
pos.do_move(move, st, ci, pos.move_gives_check(move, ci));
-
- if (pos.is_draw<false>() || ss->ply + 1 > PLY_MAX)
- value = VALUE_DRAW;
- else
- value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth);
-
+ value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth);
pos.undo_move(move);
if (value >= rbeta)
return value;
// Step 14. Make the move
pos.do_move(move, st, ci, givesCheck);
- // Step XX. Poll. Check if search should be aborted.
- if (pos.thread() == 0 && ++NodesSincePoll > NodesBetweenPolls)
- {
- NodesSincePoll = 0;
- poll(pos);
- }
-
- // Step XX. Check for aborted search and immediate draw
- if ( StopRequest
- || pos.is_draw<false>()
- || ss->ply + 1 > PLY_MAX)
- {
- value = VALUE_DRAW;
- goto undo;
- }
-
// Step extra. pv search (only in PV nodes)
// The first move in list is the expected PV
if (isPvMove)
}
// Step 17. Undo move
-undo:
pos.undo_move(move);
assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);