X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsearch.cpp;h=75b6bd0caefd42ebf5f4c2c7bced970b88d66074;hb=080a4995a3977a0fe7071e62151dc4d716a13302;hp=7e2f9727291df6bffbd90b218ecb854c3f549cf6;hpb=6f39a3fc8071f40289d9599616490014c2321a48;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index 7e2f9727..75b6bd0c 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -201,6 +201,12 @@ namespace { // Depth limit for use of dynamic threat detection Depth ThreatDepth; // heavy SMP read access + // Last seconds noise filtering (LSN) + const bool UseLSNFiltering = true; + const int LSNTime = 4000; // In milliseconds + const Value LSNValue = value_from_centipawns(200); + bool loseOnTime = false; + // Extensions. Array index 0 is used at non-PV nodes, index 1 at PV nodes. // There is heavy SMP read access on these arrays Depth CheckExtension[2], SingleReplyExtension[2], PawnPushTo7thExtension[2]; @@ -367,7 +373,10 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move, // Read UCI option values TT.set_size(get_option_value_int("Hash")); if (button_was_pressed("Clear Hash")) + { TT.clear(); + loseOnTime = false; // reset at the beginning of a new game + } bool PonderingEnabled = get_option_value_bool("Ponder"); MultiPV = get_option_value_int("MultiPV"); @@ -400,10 +409,6 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move, if (UseLogFile) LogFile.open(get_option_value_string("Search Log Filename").c_str(), std::ios::out | std::ios::app); - bool UseLSNFiltering = get_option_value_bool("LSN filtering"); - int LSNTime = get_option_value_int("LSN Time Margin (sec)") * 1000; - Value LSNValue = value_from_centipawns(get_option_value_int("LSN Value Margin")); - MinimumSplitDepth = get_option_value_int("Minimum Split Depth") * OnePly; MaxThreadsPerSplitPoint = get_option_value_int("Maximum Number of Threads per Split Point"); @@ -481,20 +486,19 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move, // We're ready to start thinking. Call the iterative deepening loop function - static bool looseOnTime = false; - + // // FIXME we really need to cleanup all this LSN ugliness - if (!looseOnTime) + if (!loseOnTime) { Value v = id_loop(pos, searchMoves); - looseOnTime = ( UseLSNFiltering + loseOnTime = ( UseLSNFiltering && myTime < LSNTime && myIncrement == 0 && v < -LSNValue); } else { - looseOnTime = false; // reset for next match + loseOnTime = false; // reset for next match while (SearchStartTime + myTime + 1000 > get_system_time()) ; // wait here id_loop(pos, searchMoves); // to fail gracefully @@ -1076,7 +1080,7 @@ namespace { { // Try to reduce non-pv search depth by one ply if move seems not problematic, // if the move fails high will be re-searched at full depth. - if ( depth >= 2*OnePly + if ( depth >= 3*OnePly && moveCount >= LMRPVMoves && !dangerous && !moveIsCapture @@ -1247,6 +1251,9 @@ namespace { if (value_is_mate(nullValue)) { + if (nullValue == value_mated_in(ply + 2)) + mateThreat = true; + /* Do not return unproven mates */ } else if (nullValue >= beta) @@ -1265,9 +1272,6 @@ namespace { // move which was reduced. If a connection is found, return a fail // low score (which will cause the reduced move to fail high in the // parent node, which will trigger a re-search with full depth). - if (nullValue == value_mated_in(ply + 2)) - mateThreat = true; - ss[ply].threatMove = ss[ply + 1].currentMove; if ( depth < ThreatDepth && ss[ply - 1].reduction @@ -1360,7 +1364,7 @@ namespace { // Try to reduce non-pv search depth by one ply if move seems not problematic, // if the move fails high will be re-searched at full depth. - if ( depth >= 2*OnePly + if ( depth >= 3*OnePly && moveCount >= LMRNonPVMoves && !dangerous && !moveIsCapture @@ -1488,7 +1492,6 @@ namespace { else if (tte && tte->type() == VALUE_TYPE_EVAL) { // Use the cached evaluation score if possible - assert(tte->value() == evaluate(pos, ei, threadID)); assert(ei.futilityMargin == Value(0)); staticValue = tte->value(); @@ -1561,9 +1564,7 @@ namespace { // Don't search captures and checks with negative SEE values if ( !isCheck && !move_is_promotion(move) - && (pos.midgame_value_of_piece_on(move_from(move)) > - pos.midgame_value_of_piece_on(move_to(move))) - && pos.see(move) < 0) + && pos.see_sign(move) < 0) continue; // Make and search the move. @@ -2240,7 +2241,7 @@ namespace { if ( pvNode && capture && pos.type_of_piece_on(move_to(m)) != PAWN - && pos.see(m) >= 0) + && pos.see_sign(m) >= 0) { result += OnePly/2; *dangerous = true; @@ -2313,7 +2314,7 @@ namespace { && threat != MOVE_NONE && piece_is_slider(pos.piece_on(tfrom)) && bit_is_set(squares_between(tfrom, tto), mto) - && pos.see(m) >= 0) + && pos.see_sign(m) >= 0) return false; return true;