]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Sync static null conditions with real one
[stockfish] / src / search.cpp
index ab37e480fc5d50bdb10f79b6e3f08b8e2d0d1e5a..92d2eda61d188b007a9cc4f42e7cbb41c196bbee 100644 (file)
@@ -546,14 +546,13 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move,
   return !Quit;
 }
 
-// init_reduction_tables()
-
-void init_reduction_tables(int8_t pvTable[64][64], int8_t nonPvTable[64][64], int pvInhib, int nonPvInhib)
+// init_reduction_tables() is called by init_search() and initializes
+// the tables used by LMR.
+static void init_reduction_tables(int8_t pvTable[64][64], int8_t nonPvTable[64][64], int pvInhib, int nonPvInhib)
 {
   double pvBase = 1.001 - log(3.0) * log(16.0) / pvInhib;
   double nonPvBase = 1.001 - log(3.0) * log(4.0) / nonPvInhib;
 
-  // Init reduction lookup tables
   for (int i = 1; i < 64; i++) // i == depth (OnePly = 1)
       for (int j = 1; j < 64; j++) // j == moveNumber
       {
@@ -566,11 +565,11 @@ void init_reduction_tables(int8_t pvTable[64][64], int8_t nonPvTable[64][64], in
 }
 
 // init_search() is called during startup. It initializes various lookup tables
-
 void init_search() {
 
+  // Init reduction lookup tables
   for (int i = 0; i < 8; i++)
-      init_reduction_tables(PVReductionMatrix[i], NonPVReductionMatrix[i], 4.0 * pow(1.3, i), 2.0 * pow(1.3, i));
+      init_reduction_tables(PVReductionMatrix[i], NonPVReductionMatrix[i], int(4 * pow(1.3, i)), int(2 * pow(1.3, i)));
 
   // Init futility margins array
   for (int i = 0; i < 16; i++) // i == depth (OnePly = 2)
@@ -1369,11 +1368,13 @@ namespace {
 
     // Step 7. Static null move pruning
     // We're betting that the opponent doesn't have a move that will reduce
-    // the score by more than fuility_margin(depth) if we do a null move.
-    if (  !isCheck
-        && allowNullmove
-        && depth < RazorDepth
-        && refinedValue - futility_margin(depth, 0) >= beta)
+    // the score by more than futility_margin(depth) if we do a null move.
+    if (    allowNullmove
+        &&  depth < RazorDepth
+        && !isCheck
+        && !value_is_mate(beta)
+        &&  ok_to_do_nullmove(pos)
+        &&  refinedValue >= beta + futility_margin(depth, 0))
         return refinedValue - futility_margin(depth, 0);
 
     // Step 8. Null move search with verification search
@@ -1389,8 +1390,6 @@ namespace {
     {
         ss[ply].currentMove = MOVE_NULL;
 
-        pos.do_null_move(st);
-
         // Null move dynamic reduction based on depth
         int R = 3 + (depth >= 5 * OnePly ? depth / 8 : 0);
 
@@ -1398,6 +1397,8 @@ namespace {
         if (refinedValue - beta > PawnValueMidgame)
             R++;
 
+        pos.do_null_move(st);
+
         nullValue = -search(pos, ss, -(beta-1), depth-R*OnePly, ply+1, false, threadID);
 
         pos.undo_null_move();