// Start with a small aspiration window and, in case of fail high/low,
// research with bigger window until not failing high/low anymore.
do {
- // Search starting from ss+1 to allow calling update_gains()
+ // Search starting from ss+1 to allow referencing (ss-1). This is
+ // needed by update_gains() and ss copy when splitting at Root.
value = search<Root>(pos, ss+1, alpha, beta, depth * ONE_PLY);
// It is critical that sorting is done with a stable algorithm
alpha = sp->alpha;
}
-
- if (RootNode)
+ // Finished searching the move. If StopRequest is true, the search
+ // was aborted because the user interrupted the search or because we
+ // ran out of time. In this case, the return value of the search cannot
+ // be trusted, and we don't update the best move and/or PV.
+ if (RootNode && !StopRequest)
{
- // Finished searching the move. If StopRequest is true, the search
- // was aborted because the user interrupted the search or because we
- // ran out of time. In this case, the return value of the search cannot
- // be trusted, and we break out of the loop without updating the best
- // move and/or PV.
- if (StopRequest)
- break;
-
// Remember searched nodes counts for this move
RootMove* rm = Rml.find(move);
rm->nodes += pos.nodes_searched() - nodes;
}
// Step 19. Check for split
- if ( !RootNode
- && !SpNode
+ if ( !SpNode
&& depth >= Threads.min_split_depth()
&& bestValue < beta
&& Threads.available_slave_exists(pos.thread())
&& !StopRequest
&& !thread.cutoff_occurred())
Threads.split<FakeSplit>(pos, ss, &alpha, beta, &bestValue, depth,
- threatMove, moveCount, &mp, PvNode);
+ threatMove, moveCount, &mp, NT);
}
// Step 20. Check for mate and stalemate
memcpy(ss, tsp->ss - 1, 4 * sizeof(SearchStack));
(ss+1)->sp = tsp;
- if (tsp->pvNode)
+ if (tsp->nodeType == Root)
+ search<SplitPointRoot>(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth);
+ else if (tsp->nodeType == PV)
search<SplitPointPV>(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth);
- else
+ else if (tsp->nodeType == NonPV)
search<SplitPointNonPV>(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth);
+ else
+ assert(false);
assert(threads[threadID].state == Thread::SEARCHING);
// In helpful master concept a master can help only a sub-tree, and
// because here is all finished is not possible master is booked.
assert(threads[threadID].state == Thread::AVAILABLE);
-
- threads[threadID].state = Thread::SEARCHING;
return;
}
}