X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=95d8be98bc858cad282f233abf5dad0b011eb3fc;hp=24ae2f631227ee0c412a31e21c44a8151dd74f26;hb=1a7047f544b29cc16c970df1379752f0541ed90f;hpb=cd0c7373cdc95acd7b4096860df21826eb7faace diff --git a/src/search.cpp b/src/search.cpp index 24ae2f63..95d8be98 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -527,18 +527,12 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move, // LSN filtering. Used only for developing purpose. Disabled by default. - if (UseLSNFiltering) + if ( UseLSNFiltering + && loseOnTime) { // Step 2. If after last move we decided to lose on time, do it now! - if ( loseOnTime - && myTime < LSNTime // double check: catches some very rear false positives! - && myIncrement == 0 - && movesToGo == 0) - { - while (SearchStartTime + myTime + 1000 > get_system_time()) - ; // wait here - } else if (loseOnTime) // false positive, reset flag - loseOnTime = false; + while (SearchStartTime + myTime + 1000 > get_system_time()) + ; // wait here } // We're ready to start thinking. Call the iterative deepening loop function @@ -547,7 +541,8 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move, // LSN filtering. Used only for developing purpose. Disabled by default. if (UseLSNFiltering) { - // Step 1. If this is sudden death game and our position is hopeless, decide to lose on time. + // Step 1. If this is sudden death game and our position is hopeless, + // decide to lose on time. if ( !loseOnTime // If we already lost on time, go to step 3. && myTime < LSNTime && myIncrement == 0 @@ -1126,7 +1121,14 @@ namespace { return alpha; // Transposition table lookup. At PV nodes, we don't use the TT for - // pruning, but only for move ordering. + // pruning, but only for move ordering. This is to avoid problems in + // the following areas: + // + // * Repetition draw detection + // * Fifty move rule detection + // * Searching for a mate + // * Printing of full PV line + // tte = TT.retrieve(pos.get_key()); ttMove = (tte ? tte->move() : MOVE_NONE); @@ -1135,6 +1137,10 @@ namespace { { search_pv(pos, ss, alpha, beta, depth-2*OnePly, ply, threadID); ttMove = ss[ply].pv[ply]; + tte = TT.retrieve(pos.get_key()); + + // If tte->move() != MOVE_NONE then it equals ttMove + assert(!(tte && tte->move()) || tte->move() == ttMove); } // Initialize a MovePicker object for the current position, and prepare @@ -1163,8 +1169,9 @@ namespace { // To verify this we do a reduced search on all the other moves but the ttMove, // if result is lower then TT value minus a margin then we assume ttMove is the // only one playable. It is a kind of relaxed single reply extension. - if ( depth >= 4 * OnePly - && move == ttMove + if ( depth >= 6 * OnePly + && tte + && move == tte->move() && ext < OnePly && is_lower_bound(tte->type()) && tte->depth() >= depth - 3 * OnePly) @@ -1173,8 +1180,7 @@ namespace { if (abs(ttValue) < VALUE_KNOWN_WIN) { - Depth d = Max(Min(depth / 2, depth - 4 * OnePly), OnePly); - Value excValue = search(pos, ss, ttValue - SingleReplyMargin, d, ply, false, threadID, ttMove); + Value excValue = search(pos, ss, ttValue - SingleReplyMargin, depth / 2, ply, false, threadID, move); // If search result is well below the foreseen score of the ttMove then we // assume ttMove is the only one realistically playable and we extend it. @@ -1429,6 +1435,7 @@ namespace { { search(pos, ss, beta, Min(depth/2, depth-2*OnePly), ply, false, threadID); ttMove = ss[ply].pv[ply]; + tte = TT.retrieve(pos.get_key()); } // Initialize a MovePicker object for the current position, and prepare @@ -1466,9 +1473,10 @@ namespace { // To verify this we do a reduced search on all the other moves but the ttMove, // if result is lower then TT value minus a margin then we assume ttMove is the // only one playable. It is a kind of relaxed single reply extension. - if ( depth >= 4 * OnePly - && !excludedMove // do not allow recursive single-reply search - && move == ttMove + if ( depth >= 8 * OnePly + && tte + && move == tte->move() + && !excludedMove // Do not allow recursive single-reply search && ext < OnePly && is_lower_bound(tte->type()) && tte->depth() >= depth - 3 * OnePly) @@ -1477,13 +1485,12 @@ namespace { if (abs(ttValue) < VALUE_KNOWN_WIN) { - Depth d = Max(Min(depth / 2, depth - 4 * OnePly), OnePly); - Value excValue = search(pos, ss, ttValue - SingleReplyMargin, d, ply, false, threadID, ttMove); + Value excValue = search(pos, ss, ttValue - SingleReplyMargin, depth / 2, ply, false, threadID, move); // If search result is well below the foreseen score of the ttMove then we // assume ttMove is the only one realistically playable and we extend it. if (excValue < ttValue - SingleReplyMargin) - ext = (depth >= 8 * OnePly) ? OnePly : ext + OnePly / 2; + ext = OnePly; } }