]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Add missing header file to make stockfish compile with latest Inter C++ Compiler...
[stockfish] / src / search.cpp
index d769619d0f2abba82d5b25d113b52b2bd806ee42..4d7195b3e2290905b6d325da28507adcd80ea718 100644 (file)
@@ -23,6 +23,7 @@
 ////
 
 #include <cassert>
+#include <cstring>
 #include <fstream>
 #include <iostream>
 #include <sstream>
@@ -60,11 +61,10 @@ namespace {
 
   struct IterationInfoType {
 
-    IterationInfoType(Value v = Value(0), Value sv = Value(0), bool fh = false, bool fl = false)
-    : value(v), speculatedValue(sv), failHigh(fh), failLow(fl) {}
+    IterationInfoType(Value v = Value(0), Value sv = Value(0))
+    : value(v), speculatedValue(sv) {}
 
     Value value, speculatedValue;
-    bool failHigh, failLow;
   };
 
 
@@ -736,6 +736,7 @@ namespace {
         }
         else if (value <= alpha)
         {
+            assert(value == alpha);
             assert(delta < 0);
 
             fLow = true;
@@ -745,7 +746,7 @@ namespace {
             speculatedValue = value;
 
         speculatedValue = Min(Max(speculatedValue, -VALUE_INFINITE), VALUE_INFINITE);
-        IterationInfo[Iteration] = IterationInfoType(value, speculatedValue, fHigh, fLow);
+        IterationInfo[Iteration] = IterationInfoType(value, speculatedValue);
 
         // Erase the easy move if it differs from the new best move
         if (ss[0].pv[0] != EasyMove)
@@ -867,8 +868,11 @@ namespace {
     {
         if (alpha >= beta)
         {
+            // We failed high, invalidate and skip next moves, leave node-counters
+            // and beta-counters as they are and quickly return, we will try to do
+            // a research at the next iteration with a bigger aspiration window.
             rml.set_move_score(i, -VALUE_INFINITE);
-            continue; // Leave node-counters and beta-counters as they are
+            continue;
         }
         int64_t nodes;
         Move move;
@@ -951,7 +955,7 @@ namespace {
             rml.set_move_score(i, -VALUE_INFINITE);
         else
         {
-            // New best move!
+            // PV move or new best move!
 
             // Update PV
             rml.set_move_score(i, value);
@@ -1513,6 +1517,7 @@ namespace {
             return value_from_tt(tte->value(), ply);
         }
     }
+    Move ttMove = (tte ? tte->move() : MOVE_NONE);
 
     // Evaluate the position statically
     EvalInfo ei;
@@ -1556,7 +1561,7 @@ namespace {
     // Initialize a MovePicker object for the current position, and prepare
     // to search the moves.  Because the depth is <= 0 here, only captures,
     // queen promotions and checks (only if depth == 0) will be generated.
-    MovePicker mp = MovePicker(pos, pvNode, MOVE_NONE, EmptySearchStack, depth);
+    MovePicker mp = MovePicker(pos, pvNode, ttMove, EmptySearchStack, depth);
     Move move;
     int moveCount = 0;
     Bitboard dcCandidates = mp.discovered_check_candidates();
@@ -1633,22 +1638,20 @@ namespace {
     assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
 
     // Update transposition table
+    Move m = ss[ply].pv[ply];
     if (!pvNode)
     {
         Depth d = (depth == Depth(0) ? Depth(0) : Depth(-1));
         if (bestValue < beta)
             TT.store(pos, value_to_tt(bestValue, ply), d, MOVE_NONE, VALUE_TYPE_UPPER);
         else
-            TT.store(pos, value_to_tt(bestValue, ply), d, MOVE_NONE, VALUE_TYPE_LOWER);
+            TT.store(pos, value_to_tt(bestValue, ply), d, m, VALUE_TYPE_LOWER);
     }
 
     // Update killers only for good check moves
-    Move m = ss[ply].currentMove;
     if (alpha >= beta && ok_to_history(pos, m)) // Only non capture moves are considered
-    {
-        // Wrong to update history when depth is <= 0
         update_killers(m, ss[ply]);
-    }
+
     return bestValue;
   }