X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=dfe5efa922840b8cc398152495c292045b2e5993;hp=882fee6f0ee8ec5940c54b2601f085581dd88918;hb=81ae7cad2d5f1bdce7e065699bf680da8b5487b8;hpb=2a14123550eb6ebce6be3a0c4d3938e533e748b2 diff --git a/src/search.cpp b/src/search.cpp index 882fee6f..dfe5efa9 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -87,7 +87,7 @@ namespace { Depth depth, bool mateThreat, int* moves, MovePicker* mp, int master, bool pvNode); private: - friend void poll(SearchStack ss[], int ply); + friend void poll(); int ActiveThreads; volatile bool AllThreadsShouldExit, AllThreadsShouldSleep; @@ -259,9 +259,6 @@ namespace { bool UseTimeManagement, InfiniteSearch, PonderSearch, StopOnPonderhit; bool FirstRootMove, AbortSearch, Quit, AspirationFailLow; - // Show current line? - bool ShowCurrentLine; - // Log file bool UseLogFile; std::ofstream LogFile; @@ -297,7 +294,7 @@ namespace { Depth extension(const Position&, Move, bool, bool, bool, bool, bool, bool*); bool ok_to_do_nullmove(const Position& pos); bool ok_to_prune(const Position& pos, Move m, Move threat); - bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply); + bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply, bool allowNullmove); Value refine_eval(const TTEntry* tte, Value defaultEval, int ply); void update_history(const Position& pos, Move move, Depth depth, Move movesSearched[], int moveCount); void update_killers(Move m, SearchStack& ss); @@ -305,7 +302,7 @@ namespace { int current_search_time(); int nps(); - void poll(SearchStack ss[], int ply); + void poll(); void ponderhit(); void wait_for_stop_or_ponderhit(); void init_ss_array(SearchStack ss[]); @@ -390,7 +387,7 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move, if (get_option_value_string("Book File") != OpeningBook.file_name()) OpeningBook.open(get_option_value_string("Book File")); - Move bookMove = OpeningBook.get_move(pos); + Move bookMove = OpeningBook.get_move(pos, get_option_value_bool("Best Book Move")); if (bookMove != MOVE_NONE) { if (PonderSearch) @@ -425,7 +422,6 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move, MinimumSplitDepth = get_option_value_int("Minimum Split Depth") * OnePly; MaxThreadsPerSplitPoint = get_option_value_int("Maximum Number of Threads per Split Point"); - ShowCurrentLine = get_option_value_bool("UCI_ShowCurrLine"); MultiPV = get_option_value_int("MultiPV"); Chess960 = get_option_value_bool("UCI_Chess960"); UseLogFile = get_option_value_bool("Use Search Log"); @@ -1303,7 +1299,7 @@ namespace { tte = TT.retrieve(posKey); ttMove = (tte ? tte->move() : MOVE_NONE); - if (tte && ok_to_use_TT(tte, depth, beta, ply)) + if (tte && ok_to_use_TT(tte, depth, beta, ply, allowNullmove)) { ss[ply].currentMove = ttMove; // Can be MOVE_NONE return value_from_tt(tte->value(), ply); @@ -1383,13 +1379,18 @@ namespace { if (nullValue >= value_mate_in(PLY_MAX)) nullValue = beta; - if (depth < 6 * OnePly) - return nullValue; + // Do zugzwang verification search for high depths, don't store in TT + // if search was stopped. + if ( ( depth < 6 * OnePly + || search(pos, ss, beta, depth-5*OnePly, ply, false, threadID) >= beta) + && !AbortSearch + && !TM.thread_should_stop(threadID)) + { + assert(value_to_tt(nullValue, ply) == nullValue); - // Do zugzwang verification search - Value v = search(pos, ss, beta, depth-5*OnePly, ply, false, threadID); - if (v >= beta) + TT.store(posKey, nullValue, VALUE_TYPE_NS_LO, depth, MOVE_NONE); return nullValue; + } } else { // The null move failed low, which means that we may be faced with // some kind of threat. If the previous move was reduced, check if @@ -1624,7 +1625,7 @@ namespace { tte = TT.retrieve(pos.get_key()); ttMove = (tte ? tte->move() : MOVE_NONE); - if (!pvNode && tte && ok_to_use_TT(tte, depth, beta, ply)) + if (!pvNode && tte && ok_to_use_TT(tte, depth, beta, ply, true)) { assert(tte->type() != VALUE_TYPE_EVAL); @@ -1665,7 +1666,7 @@ namespace { alpha = bestValue; // If we are near beta then try to get a cutoff pushing checks a bit further - bool deepChecks = depth == -OnePly && staticValue >= beta - PawnValueMidgame / 8; + bool deepChecks = (depth == -OnePly && staticValue >= beta - PawnValueMidgame / 8); // Initialize a MovePicker object for the current position, and prepare // to search the moves. Because the depth is <= 0 here, only captures, @@ -1711,7 +1712,7 @@ namespace { // Detect blocking evasions that are candidate to be pruned evasionPrunable = isCheck - && bestValue != -VALUE_INFINITE + && bestValue > value_mated_in(PLY_MAX) && !pos.move_is_capture(move) && pos.type_of_piece_on(move_from(move)) != KING && !pos.can_castle(pos.side_to_move()); @@ -2050,7 +2051,7 @@ namespace { NodesSincePoll++; if (NodesSincePoll >= NodesBetweenPolls) { - poll(ss, ply); + poll(); NodesSincePoll = 0; } } @@ -2305,14 +2306,18 @@ namespace { } - // ok_to_use_TT() returns true if a transposition table score - // can be used at a given point in search. + // ok_to_use_TT() returns true if a transposition table score can be used at a + // given point in search. To avoid zugzwang issues TT cutoffs at the root node + // of a null move verification search are not allowed if the TT value was found + // by a null search, this is implemented testing allowNullmove and TT entry type. - bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply) { + bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply, bool allowNullmove) { Value v = value_from_tt(tte->value(), ply); - return ( tte->depth() >= depth + return (allowNullmove || !(tte->type() & VALUE_TYPE_NULL)) + + && ( tte->depth() >= depth || v >= Max(value_mate_in(PLY_MAX), beta) || v < Min(value_mated_in(PLY_MAX), beta)) @@ -2413,7 +2418,7 @@ namespace { // looks at the time consumed so far and decides if it's time to abort the // search. - void poll(SearchStack ss[], int ply) { + void poll() { static int lastInfoTime; int t = current_search_time(); @@ -2464,16 +2469,6 @@ namespace { cout << "info nodes " << TM.nodes_searched() << " nps " << nps() << " time " << t << " hashfull " << TT.full() << endl; - - // We only support current line printing in single thread mode - if (ShowCurrentLine && TM.active_threads() == 1) - { - cout << "info currline"; - for (int p = 0; p < ply; p++) - cout << " " << ss[p].currentMove; - - cout << endl; - } } // Should we stop the search? @@ -2778,7 +2773,7 @@ namespace { } // Wait until the thread has finished launching and is gone to sleep - while (threads[i].state != THREAD_SLEEPING); + while (threads[i].state != THREAD_SLEEPING) {} } } @@ -2819,7 +2814,7 @@ namespace { SplitPoint* sp; - for (sp = threads[threadID].splitPoint; sp && !sp->stopRequest; sp = sp->parent); + for (sp = threads[threadID].splitPoint; sp && !sp->stopRequest; sp = sp->parent) {} return sp != NULL; }