X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=e2006425a3fefac5003f9c4865ed6ee89c2b61ef;hp=13a0175aae57a728c0f8d3635da1be34ba1d795d;hb=f6e11ee2a34fb074ebe588bd44a156b001d9b0d9;hpb=3b7bf34b0255cc3f66c37b187ca9db398f34ef69 diff --git a/src/search.cpp b/src/search.cpp index 13a0175a..e2006425 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1243,7 +1243,10 @@ split_point_start: // At split points actual search starts from here 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 @@ -1364,24 +1367,29 @@ split_point_start: // At split points actual search starts from here 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; } } @@ -2259,9 +2267,9 @@ split_point_start: // At split points actual search starts from here if (tsp->pvNode) search(pos, ss, tsp->alpha, tsp->beta, tsp->depth, tsp->ply); - else + else { search(pos, ss, tsp->alpha, tsp->beta, tsp->depth, tsp->ply); - + } assert(threads[threadID].state == THREAD_SEARCHING); threads[threadID].state = THREAD_AVAILABLE; @@ -2443,9 +2451,8 @@ split_point_start: // At split points actual search starts from here // 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 void ThreadsManager::split(const Position& p, SearchStack* ss, int ply, Value* alpha,