X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=6ef74bea5e1a5c7b92951a89961117b37fd60763;hp=76afd5dab4debaea6afaa708b0d751012d7f82a3;hb=e50af36a00ea1df1b395873766408f127dd00c90;hpb=287e2e2f74332d59dae2bd01772a74b909b87d22 diff --git a/src/search.cpp b/src/search.cpp index 76afd5da..6ef74bea 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -149,6 +149,7 @@ namespace { void update_pv(Move* pv, Move move, Move* childPv); void update_continuation_histories(Stack* ss, Piece pc, Square to, int bonus); void update_stats(const Position& pos, Stack* ss, Move move, Move* quiets, int quietsCnt, int bonus); + bool pv_is_draw(Position& pos); // perft() is our utility to verify move generation. All the leaf nodes up // to the given depth are generated and counted, and the sum is returned. @@ -475,11 +476,17 @@ void Thread::search() { // from the previous search and just did a fast verification. const int F[] = { mainThread->failedLow, bestValue - mainThread->previousScore }; - int improvingFactor = std::max(229, std::min(715, 357 + 119 * F[0] - 6 * F[1])); - double unstablePvFactor = 1 + mainThread->bestMoveChanges; + + Color us = rootPos.side_to_move(); + bool thinkHard = DrawValue[us] == bestValue + && Limits.time[us] - Time.elapsed() > Limits.time[~us] + && ::pv_is_draw(rootPos); + + double unstablePvFactor = 1 + mainThread->bestMoveChanges + thinkHard; bool doEasyMove = rootMoves[0].pv[0] == easyMove + && !thinkHard && mainThread->bestMoveChanges < 0.03 && Time.elapsed() > Time.optimum() * 5 / 44; @@ -1427,6 +1434,24 @@ moves_loop: // When in check search starts from here } + // Is the PV leading to a draw position? Assumes all pv moves are legal + bool pv_is_draw(Position& pos) { + + StateInfo st[MAX_PLY]; + auto& pv = pos.this_thread()->rootMoves[0].pv; + + for (size_t i = 0; i < pv.size(); ++i) + pos.do_move(pv[i], st[i]); + + bool isDraw = pos.is_draw(pv.size()); + + for (size_t i = pv.size(); i > 0; --i) + pos.undo_move(pv[i-1]); + + return isDraw; + } + + // When playing with strength handicap, choose best move among a set of RootMoves // using a statistical rule dependent on 'level'. Idea by Heinz van Saanen.