X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=a38bbff65a6eef38323da1a611cd56ff70e27ee1;hp=c959c75a74b3d651486da1176a211634f8699c39;hb=f40e481fd63d056cbdad78c2c3fcdad0ff3556d9;hpb=d5520977b978ded0cb9d69ff4c35a251c69216cc diff --git a/src/search.cpp b/src/search.cpp index c959c75a..a38bbff6 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -38,6 +38,7 @@ #include "lock.h" #include "san.h" #include "search.h" +#include "timeman.h" #include "thread.h" #include "tt.h" #include "ucioption.h" @@ -198,7 +199,7 @@ namespace { Depth PassedPawnExtension[2], PawnEndgameExtension[2], MateThreatExtension[2]; // Minimum depth for use of singular extension - const Depth SingularExtensionDepth[2] = { 8 * OnePly /* non-PV */, 6 * OnePly /* PV */}; + const Depth SingularExtensionDepth[2] = { 7 * OnePly /* non-PV */, 6 * OnePly /* PV */}; // If the TT move is at least SingularExtensionMargin better then the // remaining ones we will extend it. @@ -473,32 +474,7 @@ bool think(const Position& pos, bool infinite, bool ponder, int time[], int incr int myIncrement = increment[pos.side_to_move()]; if (UseTimeManagement) { - if (!movesToGo) // Sudden death time control - { - if (myIncrement) - { - MaxSearchTime = myTime / 30 + myIncrement; - AbsoluteMaxSearchTime = Max(myTime / 4, myIncrement - 100); - } - else // Blitz game without increment - { - MaxSearchTime = myTime / 30; - AbsoluteMaxSearchTime = myTime / 8; - } - } - else // (x moves) / (y minutes) - { - if (movesToGo == 1) - { - MaxSearchTime = myTime / 2; - AbsoluteMaxSearchTime = (myTime > 3000)? (myTime - 500) : ((myTime * 3) / 4); - } - else - { - MaxSearchTime = myTime / Min(movesToGo, 20); - AbsoluteMaxSearchTime = Min((4 * myTime) / movesToGo, myTime / 3); - } - } + calc_search_times(myTime, myIncrement, movesToGo, pos.startpos_ply_counter(), MaxSearchTime, AbsoluteMaxSearchTime); if (get_option_value_bool("Ponder")) { @@ -1062,7 +1038,7 @@ namespace { // Refresh tte entry to avoid aging TT.store(posKey, tte->value(), tte->type(), tte->depth(), ttMove, tte->static_value(), tte->king_danger()); - ss->currentMove = ttMove; // Can be MOVE_NONE + ss->bestMove = ttMove; // Can be MOVE_NONE return value_from_tt(tte->value(), ply); } @@ -1176,7 +1152,7 @@ namespace { if (nullValue == value_mated_in(ply + 2)) mateThreat = true; - threatMove = (ss+1)->currentMove; + threatMove = (ss+1)->bestMove; if ( depth < ThreatDepth && (ss-1)->reduction && connected_moves(pos, (ss-1)->currentMove, threatMove)) @@ -1213,6 +1189,17 @@ namespace { && is_lower_bound(tte->type()) && tte->depth() >= depth - 3 * OnePly; + // Avoid to do an expensive singular extension search on nodes where + // such search had already failed in the past. + if ( !PvNode + && singularExtensionNode + && depth < SingularExtensionDepth[PvNode] + 5 * OnePly) + { + TTEntry* ttx = TT.retrieve(pos.get_exclusion_key()); + if (ttx && is_lower_bound(ttx->type())) + singularExtensionNode = false; + } + // Step 10. Loop through moves // Loop through all legal moves until no moves remain or a beta cutoff occurs while ( bestValue < beta @@ -1449,7 +1436,7 @@ namespace { if (!PvNode && tte && ok_to_use_TT(tte, depth, beta, ply)) { - ss->currentMove = ttMove; // Can be MOVE_NONE + ss->bestMove = ttMove; // Can be MOVE_NONE return value_from_tt(tte->value(), ply); } @@ -2470,8 +2457,8 @@ namespace { #endif // Initialize global locks - lock_init(&MPLock, NULL); - lock_init(&WaitLock, NULL); + lock_init(&MPLock); + lock_init(&WaitLock); #if !defined(_MSC_VER) pthread_cond_init(&WaitCond, NULL); @@ -2483,7 +2470,7 @@ namespace { // Initialize splitPoints[] locks for (i = 0; i < MAX_THREADS; i++) for (int j = 0; j < MAX_ACTIVE_SPLIT_POINTS; j++) - lock_init(&(threads[i].splitPoints[j].lock), NULL); + lock_init(&(threads[i].splitPoints[j].lock)); // Will be set just before program exits to properly end the threads AllThreadsShouldExit = false;