newDepth = depth - ONE_PLY + ext;
// Update current move (this must be done after singular extension search)
- movesSearched[moveCount++] = ss->currentMove = move;
+ movesSearched[moveCount] = ss->currentMove = move;
+
+ if (!SpNode)
+ moveCount++;
// Step 12. Futility pruning (is omitted in PV nodes)
if ( !PvNode
if (value > bestValue && !(SpNode && ThreadsMgr.thread_should_stop(threadID)))
{
bestValue = value;
+
+ if (SpNode)
+ sp->bestValue = value;
+
if (value > alpha)
{
if (SpNode && (!PvNode || value >= beta))
sp->stopRequest = true;
if (PvNode && value < beta) // We want always alpha < beta
+ {
alpha = value;
+ if (SpNode)
+ sp->alpha = value;
+ }
- if (value == value_mate_in(ply + 1))
+ if (!SpNode && value == value_mate_in(ply + 1))
ss->mateKiller = move;
ss->bestMove = move;
- }
- if (SpNode)
- {
- sp->bestValue = bestValue;
- sp->alpha = alpha;
- sp->parentSstack->bestMove = ss->bestMove;
+
+ if (SpNode)
+ sp->parentSstack->bestMove = move;
}
}
if (tsp->pvNode)
search<PV, true>(pos, ss, tsp->alpha, tsp->beta, tsp->depth, tsp->ply);
- else
+ else {
search<NonPV, true>(pos, ss, tsp->alpha, tsp->beta, tsp->depth, tsp->ply);
-
+ }
assert(threads[threadID].state == THREAD_SEARCHING);
threads[threadID].state = THREAD_AVAILABLE;
// split point objects), the function immediately returns. If splitting is
// possible, a SplitPoint object is initialized with all the data that must be
// copied to the helper threads and we tell our helper threads that they have
- // been assigned work. This will cause them to instantly leave their idle loops
- // and call sp_search(). When all threads have returned from sp_search() then
- // split() returns.
+ // been assigned work. This will cause them to instantly leave their idle loops and
+ // call search().When all threads have returned from search() then split() returns.
template <bool Fake>
void ThreadsManager::split(const Position& p, SearchStack* ss, int ply, Value* alpha,