X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsearch.cpp;h=0dccf934e82c2f823ed0f1b013589daf2ac6384a;hb=13bc6ba2c69f326017dcc771d1e45a096e23e0c4;hp=218ce1aa2ec577962279cb3377429c5519968f1d;hpb=1e7c6fc76163336c3e642d33d46c802a39044bab;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index 218ce1aa..0dccf934 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -49,7 +49,7 @@ namespace { const bool FakeSplit = false; // Different node types, used as template parameter - enum NodeType { Root, PV, NonPV, SplitPointPV, SplitPointNonPV }; + enum NodeType { Root, PV, NonPV, SplitPointRoot, SplitPointPV, SplitPointNonPV }; // RootMove struct is used for moves at the root of the tree. For each root // move, we store a score, a node count, and a PV (really a refutation @@ -216,14 +216,14 @@ namespace { // MovePickerExt template class extends MovePicker and allows to choose at compile // time the proper moves source according to the type of node. In the default case // we simply create and use a standard MovePicker object. - template struct MovePickerExt : public MovePicker { + template struct MovePickerExt : public MovePicker { MovePickerExt(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss, Value b) : MovePicker(p, ttm, d, h, ss, b) {} }; // In case of a SpNode we use split point's shared MovePicker object as moves source - template<> struct MovePickerExt : public MovePicker { + template<> struct MovePickerExt : public MovePicker { MovePickerExt(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss, Value b) : MovePicker(p, ttm, d, h, ss, b), mp(ss->sp->mp) {} @@ -232,12 +232,6 @@ namespace { MovePicker* mp; }; - template<> struct MovePickerExt : public MovePickerExt { - - MovePickerExt(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss, Value b) - : MovePickerExt(p, ttm, d, h, ss, b) {} - }; - // Overload operator<<() to make it easier to print moves in a coordinate // notation compatible with UCI protocol. std::ostream& operator<<(std::ostream& os, Move m) { @@ -699,9 +693,9 @@ namespace { template Value search(Position& pos, SearchStack* ss, Value alpha, Value beta, Depth depth) { - const bool PvNode = (NT == PV || NT == Root || NT == SplitPointPV); - const bool SpNode = (NT == SplitPointPV || NT == SplitPointNonPV); - const bool RootNode = (NT == Root); + const bool PvNode = (NT == PV || NT == Root || NT == SplitPointPV || NT == SplitPointRoot); + const bool SpNode = (NT == SplitPointPV || NT == SplitPointNonPV || NT == SplitPointRoot); + const bool RootNode = (NT == Root || NT == SplitPointRoot); assert(alpha >= -VALUE_INFINITE && alpha <= VALUE_INFINITE); assert(beta > alpha && beta <= VALUE_INFINITE); @@ -946,7 +940,7 @@ namespace { split_point_start: // At split points actual search starts from here // Initialize a MovePicker object for the current position - MovePickerExt mp(pos, ttMove, depth, H, ss, PvNode ? -VALUE_INFINITE : beta); + MovePickerExt mp(pos, ttMove, depth, H, ss, PvNode ? -VALUE_INFINITE : beta); CheckInfo ci(pos); ss->bestMove = MOVE_NONE; futilityBase = ss->eval + ss->evalMargin; @@ -1002,14 +996,14 @@ split_point_start: // At split points actual search starts from here // If it's time to send nodes info, do it here where we have the // correct accumulated node counts searched by each thread. - if (SendSearchedNodes) + if (!SpNode && SendSearchedNodes) { SendSearchedNodes = false; cout << "info" << speed_to_uci(pos.nodes_searched()) << endl; } // For long searches send current move info to GUI - if (current_search_time() > 2000) + if (pos.thread() == 0 && current_search_time() > 2000) cout << "info" << depth_to_uci(depth) << " currmove " << move << " currmovenumber " << moveCount + MultiPVIteration << endl; @@ -1176,25 +1170,6 @@ split_point_start: // At split points actual search starts from here alpha = sp->alpha; } - if (value > bestValue) - { - bestValue = value; - ss->bestMove = move; - - if ( !RootNode - && PvNode - && value > alpha - && value < beta) // We want always alpha < beta - alpha = value; - - if (SpNode && !thread.cutoff_occurred()) - { - sp->bestValue = value; - sp->ss->bestMove = move; - sp->alpha = alpha; - sp->is_betaCutoff = (value >= beta); - } - } if (RootNode) { @@ -1222,10 +1197,6 @@ split_point_start: // At split points actual search starts from here // the best move changes frequently, we allocate some more time. if (!isPvMove && MultiPV == 1) Rml.bestMoveChanges++; - - // Update alpha - if (value > alpha) - alpha = value; } else // All other moves but the PV are set to the lowest value, this @@ -1235,6 +1206,25 @@ split_point_start: // At split points actual search starts from here } // RootNode + if (value > bestValue) + { + bestValue = value; + ss->bestMove = move; + + if ( PvNode + && value > alpha + && value < beta) // We want always alpha < beta + alpha = value; + + if (SpNode && !thread.cutoff_occurred()) + { + sp->bestValue = value; + sp->ss->bestMove = move; + sp->alpha = alpha; + sp->is_betaCutoff = (value >= beta); + } + } + // Step 19. Check for split if ( !RootNode && !SpNode