X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsearch.cpp;h=89ddfef6397b471ef00b87207dd9daa9338a8d0e;hb=11b1a76f35108316ee37d9d7056f4d621305a7ed;hp=bba0cb6593c2944cf0dccf2e20a3f43ca1850fa7;hpb=fff6b9f0614243a14c7ba6aa8c846d8d4025d3a6;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index bba0cb65..89ddfef6 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -104,6 +105,8 @@ namespace { bool refutes(const Position& pos, Move first, Move second); string uci_pv(const Position& pos, int depth, Value alpha, Value beta); + class stop : public std::exception {}; + struct Skill { Skill(int l) : level(l), best(MOVE_NONE) {} ~Skill() { @@ -356,7 +359,9 @@ namespace { // research with bigger window until not failing high/low anymore. while (true) { - bestValue = search(pos, ss, alpha, beta, depth * ONE_PLY, false); + try { + bestValue = search(pos, ss, alpha, beta, depth * ONE_PLY, false); + } catch (stop&) {} // Bring to front the best move. It is critical that sorting is // done with a stable algorithm because all the values but the first @@ -541,10 +546,13 @@ namespace { if (PvNode && thisThread->maxPly < ss->ply) thisThread->maxPly = ss->ply; + if (Signals.stop || thisThread->cutoff_occurred()) + throw stop(); + if (!RootNode) { // Step 2. Check for aborted search and immediate draw - if (Signals.stop || pos.is_draw() || ss->ply > MAX_PLY) + if (pos.is_draw() || ss->ply > MAX_PLY) return DrawValue[pos.side_to_move()]; // Step 3. Mate distance pruning. Even if we mate at the next move our score @@ -775,7 +783,10 @@ moves_loop: // When in check and at SpNode search starts from here MovePicker mp(pos, ttMove, depth, History, countermoves, ss); CheckInfo ci(pos); value = bestValue; // Workaround a bogus 'uninitialized' warning under gcc - improving = ss->staticEval >= (ss-2)->staticEval; + improving = ss->staticEval >= (ss-2)->staticEval + || ss->staticEval == VALUE_NONE + ||(ss-2)->staticEval == VALUE_NONE; + singularExtensionNode = !RootNode && !SpNode && depth >= (PvNode ? 6 * ONE_PLY : 8 * ONE_PLY) @@ -996,13 +1007,6 @@ moves_loop: // When in check and at SpNode search starts from here alpha = splitPoint->alpha; } - // Finished searching the move. If Signals.stop 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 (Signals.stop || thisThread->cutoff_occurred()) - return value; // To avoid returning VALUE_INFINITE - if (RootNode) { RootMove& rm = *std::find(RootMoves.begin(), RootMoves.end(), move); @@ -1693,21 +1697,26 @@ void Thread::idle_loop() { activePosition = &pos; - switch (sp->nodeType) { - case Root: - search(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode); - break; - case PV: - search(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode); - break; - case NonPV: - search(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode); - break; - default: - assert(false); - } + try { + switch (sp->nodeType) { + case Root: + search(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode); + break; + case PV: + search(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode); + break; + case NonPV: + search(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode); + break; + default: + assert(false); + } - assert(searching); + assert(searching); + } + catch (stop&) { + sp->mutex.lock(); // Exception is thrown out of lock + } searching = false; activePosition = NULL;