X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=97ed196acede459112754e6892f2b88fba8a75cc;hp=02907a80f9d63dcc883a508c6791f76fd7660bfa;hb=e7bad2687a26655e128fec04b58bbcdaaaf910cd;hpb=55b6464d4096edae032c67d829acff69705b22a6 diff --git a/src/search.cpp b/src/search.cpp index 02907a80..97ed196a 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -144,7 +144,7 @@ namespace { bool UseFutilityPruning = true; // Margins for futility pruning in the quiescence search, at frontier - // nodes, and at pre-frontier nodes: + // nodes, and at pre-frontier nodes Value FutilityMargin0 = Value(0x80); Value FutilityMargin1 = Value(0x100); Value FutilityMargin2 = Value(0x300); @@ -167,21 +167,22 @@ namespace { Depth PawnEndgameExtension[2] = {OnePly, OnePly}; Depth MateThreatExtension[2] = {Depth(0), Depth(0)}; - // Search depth at iteration 1: + // Search depth at iteration 1 const Depth InitialDepth = OnePly /*+ OnePly/2*/; // Node counters int NodesSincePoll; int NodesBetweenPolls = 30000; - // Iteration counter: + // Iteration counter int Iteration; + bool LastIterations; // Scores and number of times the best move changed for each iteration: Value ValueByIteration[PLY_MAX_PLUS_2]; int BestMoveChangesByIteration[PLY_MAX_PLUS_2]; - // MultiPV mode: + // MultiPV mode int MultiPV = 1; // Time managment variables @@ -617,6 +618,7 @@ namespace { ValueByIteration[0] = Value(0); ValueByIteration[1] = rml.get_move_score(0); Iteration = 1; + LastIterations = false; EasyMove = rml.scan_for_easy_move(); @@ -675,6 +677,9 @@ namespace { if (ExtraSearchTime > 0 && TimeAdvantage > 2 * MaxSearchTime) ExtraSearchTime += MaxSearchTime / 2; + // Try to guess if the current iteration is the last one or the last two + LastIterations = (current_search_time() > ((MaxSearchTime + ExtraSearchTime)*58) / 128); + // Stop search if most of MaxSearchTime is consumed at the end of the // iteration. We probably don't have enough time to search the first // move at the next iteration anyway. @@ -960,11 +965,11 @@ namespace { movesSearched[moveCount++] = ss[ply].currentMove = move; if (moveIsCapture) - ss[ply].currentMoveCaptureValue = pos.midgame_value_of_piece_on(move_to(move)); + ss[ply].currentMoveCaptureValue = pos.midgame_value_of_piece_on(move_to(move)); else if (move_is_ep(move)) - ss[ply].currentMoveCaptureValue = PawnValueMidgame; + ss[ply].currentMoveCaptureValue = PawnValueMidgame; else - ss[ply].currentMoveCaptureValue = Value(0); + ss[ply].currentMoveCaptureValue = Value(0); // Decide the new search depth Depth ext = extension(pos, move, true, moveIsCheck, singleReply, mateThreat); @@ -1143,7 +1148,8 @@ namespace { UndoInfo u; pos.do_null_move(u); - Value nullValue = -search(pos, ss, -(beta-1), depth-4*OnePly, ply+1, false, threadID); + int R = (depth > 7 ? 4 : 3); + Value nullValue = -search(pos, ss, -(beta-1), depth-R*OnePly, ply+1, false, threadID); pos.undo_null_move(u); if (nullValue >= beta)