]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Easy debug macro enabling
[stockfish] / src / search.cpp
index aaed54ce1332e36dd16334d91bf2a87b3d5397c2..3f4ad24ca17652319456568ef0169d1ab1ecd7e4 100644 (file)
@@ -238,7 +238,7 @@ namespace {
                 Depth depth, int ply, int threadID);
   void sp_search(SplitPoint *sp, int threadID);
   void sp_search_pv(SplitPoint *sp, int threadID);
-  void init_search_stack(SearchStack ss);
+  void init_search_stack(SearchStack& ss);
   void init_search_stack(SearchStack ss[]);
   void init_node(const Position &pos, SearchStack ss[], int ply, int threadID);
   void update_pv(SearchStack ss[], int ply);
@@ -251,6 +251,7 @@ namespace {
   bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply);
   bool ok_to_history(const Position &pos, Move m);
   void update_history(const Position& pos, Move m, Depth depth, Move movesSearched[], int moveCount);
+  void update_killers(Move m, SearchStack& ss);
 
   bool fail_high_ply_1();
   int current_search_time();
@@ -429,8 +430,8 @@ void think(const Position &pos, bool infinite, bool ponder, int side_to_move,
   TimeAdvantage = myTime - oppTime;
 
   if (!movesToGo) // Sudden death time control
-  { 
-      if (increment)
+  {
+      if (myIncrement)
       {
           MaxSearchTime = myTime / 30 + myIncrement;
           AbsoluteMaxSearchTime = Max(myTime / 4, myIncrement - 100);
@@ -794,7 +795,7 @@ namespace {
 
             if (Problem && StopOnPonderhit)
                 StopOnPonderhit = false;
-        } 
+        }
         else
         {
             value = -search(pos, ss, -alpha, newDepth, 1, true, 0);
@@ -1079,11 +1080,7 @@ namespace {
         if (ok_to_history(pos, m)) // Only non capture moves are considered
         {
             update_history(pos, m, depth, movesSearched, moveCount);
-            if (m != ss[ply].killers[0])
-            {
-                ss[ply].killers[1] = ss[ply].killers[0];
-                ss[ply].killers[0] = m;
-            }
+            update_killers(m, ss[ply]);
         }
         TT.store(pos, value_to_tt(bestValue, ply), depth, m, VALUE_TYPE_LOWER);
     }
@@ -1329,11 +1326,7 @@ namespace {
         if (ok_to_history(pos, m)) // Only non capture moves are considered
         {
             update_history(pos, m, depth, movesSearched, moveCount);
-            if (m != ss[ply].killers[0])
-            {
-                ss[ply].killers[1] = ss[ply].killers[0];
-                ss[ply].killers[0] = m;
-            }
+            update_killers(m, ss[ply]);
         }
         TT.store(pos, value_to_tt(bestValue, ply), depth, m, VALUE_TYPE_LOWER);
     }
@@ -1437,7 +1430,6 @@ namespace {
       // Don't search captures and checks with negative SEE values
       if (   !isCheck
           && !move_promotion(move)
-          && !pvNode
           && (pos.midgame_value_of_piece_on(move_from(move)) >
               pos.midgame_value_of_piece_on(move_to(move)))
           &&  pos.see(move) < 0)
@@ -1478,12 +1470,7 @@ namespace {
     if (alpha >= beta && ok_to_history(pos, m)) // Only non capture moves are considered
     {
         // Wrong to update history when depth is <= 0
-
-        if (m != ss[ply].killers[0])
-        {
-            ss[ply].killers[1] = ss[ply].killers[0];
-            ss[ply].killers[0] = m;
-        }
+        update_killers(m, ss[ply]);
     }
     return bestValue;
   }
@@ -1891,7 +1878,7 @@ namespace {
 
   // init_search_stack() initializes a search stack at the beginning of a
   // new search from the root.
-  void init_search_stack(SearchStack ss) {
+  void init_search_stack(SearchStack& ss) {
 
     ss.pv[0] = MOVE_NONE;
     ss.pv[1] = MOVE_NONE;
@@ -1899,7 +1886,7 @@ namespace {
     ss.threatMove = MOVE_NONE;
     ss.reduction = Depth(0);
     for (int j = 0; j < KILLER_MAX; j++)
-        ss.killers[j] = MOVE_NONE;    
+        ss.killers[j] = MOVE_NONE;
   }
 
   void init_search_stack(SearchStack ss[]) {
@@ -1939,10 +1926,11 @@ namespace {
 
     ss[ply].pv[ply] = ss[ply].pv[ply+1] = ss[ply].currentMove = MOVE_NONE;
     ss[ply+2].mateKiller = MOVE_NONE;
-    ss[ply+2].killers[0] = ss[ply+2].killers[1] = MOVE_NONE;
     ss[ply].threatMove = MOVE_NONE;
     ss[ply].reduction = Depth(0);
     ss[ply].currentMoveCaptureValue = Value(0);
+    for (int j = 0; j < KILLER_MAX; j++)
+        ss[ply+2].killers[j] = MOVE_NONE;
 
     if(Threads[threadID].printCurrentLine)
       print_current_line(ss, ply, threadID);
@@ -2049,7 +2037,7 @@ namespace {
   // killer moves of that ply.
 
   bool move_is_killer(Move m, const SearchStack& ss) {
-    
+
       const Move* k = ss.killers;
       for (int i = 0; i < KILLER_MAX; i++, k++)
           if (*k == m)
@@ -2088,7 +2076,7 @@ namespace {
             - pos.midgame_value_of_piece_on(move_to(m)) == Value(0))
         && !move_promotion(m))
         result += PawnEndgameExtension[pvNode];
-    
+
     if (   pvNode
         && pos.move_is_capture(m)
         && pos.type_of_piece_on(move_to(m)) != PAWN
@@ -2206,6 +2194,21 @@ namespace {
     }
   }
 
+
+  // update_killers() add a good move that produced a beta-cutoff
+  // among the killer moves of that ply.
+
+  void update_killers(Move m, SearchStack& ss) {
+
+    if (m == ss.killers[0])
+        return;
+
+    for (int i = KILLER_MAX - 1; i > 0; i--)
+        ss.killers[i] = ss.killers[i - 1];
+
+    ss.killers[0] = m;
+  }
+
   // fail_high_ply_1() checks if some thread is currently resolving a fail
   // high at ply 1 at the node below the first root node.  This information
   // is used for time managment.