X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=8da12118d21979d3941e984743fb6f5e8794235c;hp=888c0d78d91983978c7af29ba24f22e3089eda3c;hb=3f610e2b13340ca65d0f9d63aa0cb8da92e80117;hpb=6e5cf2f3c5c5cae9a40775aca4052c0fe7089397 diff --git a/src/search.cpp b/src/search.cpp index 888c0d78..8da12118 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. @@ -894,12 +899,8 @@ namespace { assert(ply >= 0 && ply < PLY_MAX); assert(threadID >= 0 && threadID < ActiveThreads); - EvalInfo ei; - // Initialize, and make an early exit in case of an aborted search, // an instant draw, maximum ply reached, etc. - Value oldAlpha = alpha; - if (AbortSearch || thread_should_stop(threadID)) return Value(0); @@ -911,19 +912,21 @@ namespace { if (pos.is_draw()) return VALUE_DRAW; + EvalInfo ei; + if (ply >= PLY_MAX - 1) return evaluate(pos, ei, threadID); // Mate distance pruning + Value oldAlpha = alpha; alpha = Max(value_mated_in(ply), alpha); beta = Min(value_mate_in(ply+1), beta); if (alpha >= beta) return alpha; - // Transposition table lookup. At PV nodes, we don't use the TT for + // Transposition table lookup. At PV nodes, we don't use the TT for // pruning, but only for move ordering. const TTEntry* tte = TT.retrieve(pos); - Move ttMove = (tte ? tte->move() : MOVE_NONE); // Go with internal iterative deepening if we don't have a TT move @@ -934,7 +937,7 @@ namespace { } // Initialize a MovePicker object for the current position, and prepare - // to search all moves: + // to search all moves MovePicker mp = MovePicker(pos, true, ttMove, ss[ply].mateKiller, ss[ply].killer1, ss[ply].killer2, depth); @@ -942,6 +945,7 @@ namespace { int moveCount = 0; Value value, bestValue = -VALUE_INFINITE; Bitboard dcCandidates = mp.discovered_check_candidates(); + bool isCheck = pos.is_check(); bool mateThreat = MateThreatExtension[1] > Depth(0) && pos.has_mate_threat(opposite_color(pos.side_to_move())); @@ -953,15 +957,19 @@ namespace { { assert(move_is_ok(move)); - bool singleReply = (pos.is_check() && mp.number_of_moves() == 1); + bool singleReply = (isCheck && mp.number_of_moves() == 1); bool moveIsCheck = pos.move_is_check(move, dcCandidates); bool moveIsCapture = pos.move_is_capture(move); bool moveIsPassedPawnPush = pos.move_is_passed_pawn_push(move); movesSearched[moveCount++] = ss[ply].currentMove = move; - ss[ply].currentMoveCaptureValue = move_is_ep(move) ? - PawnValueMidgame : pos.midgame_value_of_piece_on(move_to(move)); + if (moveIsCapture) + ss[ply].currentMoveCaptureValue = pos.midgame_value_of_piece_on(move_to(move)); + else if (move_is_ep(move)) + ss[ply].currentMoveCaptureValue = PawnValueMidgame; + else + ss[ply].currentMoveCaptureValue = Value(0); // Decide the new search depth Depth ext = extension(pos, move, true, moveIsCheck, singleReply, mateThreat); @@ -1051,7 +1059,7 @@ namespace { // All legal moves have been searched. A special case: If there were // no legal moves, it must be mate or stalemate: if (moveCount == 0) - return (pos.is_check() ? value_mated_in(ply) : VALUE_DRAW); + return (isCheck ? value_mated_in(ply) : VALUE_DRAW); // If the search is not aborted, update the transposition table, // history counters, and killer moves. @@ -1118,7 +1126,6 @@ namespace { // Transposition table lookup const TTEntry* tte = TT.retrieve(pos); - Move ttMove = (tte ? tte->move() : MOVE_NONE); if (tte && ok_to_use_TT(tte, depth, beta, ply)) @@ -1129,10 +1136,11 @@ namespace { Value approximateEval = quick_evaluate(pos); bool mateThreat = false; + bool isCheck = pos.is_check(); // Null move search if ( allowNullmove - && !pos.is_check() + && !isCheck && ok_to_do_nullmove(pos) && approximateEval >= beta - NullMoveMargin) { @@ -1196,7 +1204,6 @@ namespace { Value value, bestValue = -VALUE_INFINITE; Bitboard dcCandidates = mp.discovered_check_candidates(); Value futilityValue = VALUE_NONE; - bool isCheck = pos.is_check(); bool useFutilityPruning = UseFutilityPruning && depth < SelectiveDepth && !isCheck; @@ -1302,7 +1309,7 @@ namespace { } // All legal moves have been searched. A special case: If there were - // no legal moves, it must be mate or stalemate: + // no legal moves, it must be mate or stalemate. if (moveCount == 0) return (pos.is_check() ? value_mated_in(ply) : VALUE_DRAW); @@ -1361,7 +1368,7 @@ namespace { if (tte && ok_to_use_TT(tte, depth, beta, ply)) return value_from_tt(tte->value(), ply); - // Evaluate the position statically: + // Evaluate the position statically Value staticValue = evaluate(pos, ei, threadID); if (ply == PLY_MAX - 1)