]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Use posKey instead of pos.get_key() after NonPVIID
[stockfish] / src / search.cpp
index e379ecfdcce197e960ce9a6343c69cf0cebd99d3..6090233089bdcacd7d1f514507925e029e4730cf 100644 (file)
@@ -142,17 +142,6 @@ namespace {
   // better than the second best move.
   const Value EasyMoveMargin = Value(0x200);
 
-  // Problem margin. If the score of the first move at iteration N+1 has
-  // dropped by more than this since iteration N, the boolean variable
-  // "Problem" is set to true, which will make the program spend some extra
-  // time looking for a better move.
-  const Value ProblemMargin = Value(0x28);
-
-  // No problem margin. If the boolean "Problem" is true, and a new move
-  // is found at the root which is less than NoProblemMargin worse than the
-  // best move from the previous iteration, Problem is set back to false.
-  const Value NoProblemMargin = Value(0x14);
-
   // Null move margin. A null move search will not be done if the static
   // evaluation of the position is more than NullMoveMargin below beta.
   const Value NullMoveMargin = Value(0x200);
@@ -209,7 +198,7 @@ namespace {
   int MaxSearchTime, AbsoluteMaxSearchTime, ExtraSearchTime, ExactMaxTime;
   bool UseTimeManagement, InfiniteSearch, PonderSearch, StopOnPonderhit;
   bool AbortSearch, Quit;
-  bool FailLow, Problem;
+  bool AspirationFailLow;
 
   // Show current line?
   bool ShowCurrentLine;
@@ -351,7 +340,7 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move,
 
   // Initialize global search variables
   Idle = StopOnPonderhit = AbortSearch = Quit = false;
-  FailLow = Problem = false;
+  AspirationFailLow = false;
   NodesSincePoll = 0;
   SearchStartTime = get_system_time();
   ExactMaxTime = maxTime;
@@ -362,7 +351,7 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move,
   UseTimeManagement = !ExactMaxTime && !MaxDepth && !MaxNodes && !InfiniteSearch;
 
   // Look for a book move, only during games, not tests
-  if (UseTimeManagement && !ponder && get_option_value_bool("OwnBook"))
+  if (UseTimeManagement && get_option_value_bool("OwnBook"))
   {
       Move bookMove;
       if (get_option_value_string("Book File") != OpeningBook.file_name())
@@ -371,6 +360,9 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move,
       bookMove = OpeningBook.get_move(pos);
       if (bookMove != MOVE_NONE)
       {
+          if (PonderSearch)
+              wait_for_stop_or_ponderhit();
+
           cout << "bestmove " << bookMove << endl;
           return true;
       }
@@ -760,8 +752,6 @@ namespace {
         if (ss[0].pv[0] != EasyMove)
             EasyMove = MOVE_NONE;
 
-        Problem = false;
-
         if (UseTimeManagement)
         {
             // Time to stop?
@@ -931,16 +921,6 @@ namespace {
                         alpha = -VALUE_INFINITE;
 
                     value = -search_pv(pos, ss, -beta, -alpha, newDepth, 1, 0);
-
-                    // If the value has dropped a lot compared to the last iteration,
-                    // set the boolean variable Problem to true. This variable is used
-                    // for time managment: When Problem is true, we try to complete the
-                    // current iteration before playing a move.
-                    Problem = (   Iteration >= 2
-                               && value <= ValueByIteration[Iteration - 1] - ProblemMargin);
-
-                    if (Problem && StopOnPonderhit)
-                        StopOnPonderhit = false;
                 }
                 else
                 {
@@ -1076,11 +1056,6 @@ namespace {
                     }
                     if (value > alpha)
                         alpha = value;
-
-                    // Reset the global variable Problem to false if the value isn't too
-                    // far below the final value from the last iteration.
-                    if (value > ValueByIteration[Iteration - 1] - NoProblemMargin)
-                        Problem = false;
                 }
                 else // MultiPV > 1
                 {
@@ -1106,7 +1081,10 @@ namespace {
 
             assert(alpha >= oldAlpha);
 
-            FailLow = (alpha == oldAlpha);
+            AspirationFailLow = (alpha == oldAlpha);
+
+            if (AspirationFailLow && StopOnPonderhit)
+                StopOnPonderhit = false;
         }
 
         // Can we exit fail low loop ?
@@ -1292,13 +1270,6 @@ namespace {
               if (value == value_mate_in(ply + 1))
                   ss[ply].mateKiller = move;
           }
-          // If we are at ply 1, and we are searching the first root move at
-          // ply 0, set the 'Problem' variable if the score has dropped a lot
-          // (from the computer's point of view) since the previous iteration.
-          if (   ply == 1
-              && Iteration >= 2
-              && -value <= ValueByIteration[Iteration-1] - ProblemMargin)
-              Problem = true;
       }
 
       // Split?
@@ -1502,7 +1473,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());
+        tte = TT.retrieve(posKey);
     }
 
     // Initialize a MovePicker object for the current position, and prepare
@@ -2128,13 +2099,6 @@ namespace {
                   if (value == value_mate_in(sp->ply + 1))
                       ss[sp->ply].mateKiller = move;
               }
-              // If we are at ply 1, and we are searching the first root move at
-              // ply 0, set the 'Problem' variable if the score has dropped a lot
-              // (from the computer's point of view) since the previous iteration.
-              if (   sp->ply == 1
-                     && Iteration >= 2
-                     && -value <= ValueByIteration[Iteration-1] - ProblemMargin)
-                  Problem = true;
           }
           lock_release(&(sp->lock));
       }
@@ -2722,7 +2686,7 @@ namespace {
         return;
 
     bool stillAtFirstMove =    RootMoveNumber == 1
-                           && !FailLow
+                           && !AspirationFailLow
                            &&  t > MaxSearchTime + ExtraSearchTime;
 
     bool noMoreTime =   t > AbsoluteMaxSearchTime
@@ -2745,7 +2709,7 @@ namespace {
     PonderSearch = false;
 
     bool stillAtFirstMove =    RootMoveNumber == 1
-                           && !FailLow
+                           && !AspirationFailLow
                            &&  t > MaxSearchTime + ExtraSearchTime;
 
     bool noMoreTime =   t > AbsoluteMaxSearchTime
@@ -3065,7 +3029,7 @@ namespace {
     for (int i = 0; i < ActiveThreads; i++)
         if (i == master || splitPoint->slaves[i])
         {
-            memcpy(splitPoint->sstack[i] + ply - 1, sstck + ply - 1, 3 * sizeof(SearchStack));
+            memcpy(splitPoint->sstack[i] + ply - 1, sstck + ply - 1, 4 * sizeof(SearchStack));
             Threads[i].workIsWaiting = true; // This makes the slave to exit from idle_loop()
         }