Adjust reductions based on history and cmh tables
[stockfish] / src / search.cpp
index 0cee3aa93d382b49d4d5c4566d5fb6980f359514..70052bbc195df4e3b89c4da3a19f33ebdf99befb 100644 (file)
@@ -1000,10 +1000,11 @@ moves_loop: // When in check search starts from here
                   && cmh[pos.piece_on(to_sq(move))][to_sq(move)] <= VALUE_ZERO))
               r += ONE_PLY;
 
                   && cmh[pos.piece_on(to_sq(move))][to_sq(move)] <= VALUE_ZERO))
               r += ONE_PLY;
 
-          // Decrease reduction for moves with a good history
-          if (   thisThread->history[pos.piece_on(to_sq(move))][to_sq(move)] > VALUE_ZERO
-              && cmh[pos.piece_on(to_sq(move))][to_sq(move)] > VALUE_ZERO)
-              r = std::max(DEPTH_ZERO, r - ONE_PLY);
+          // Decrease reduction for moves with a good history and
+          // increase reduction for moves with a bad history
+          int rDecrease = (  thisThread->history[pos.piece_on(to_sq(move))][to_sq(move)] 
+                           + cmh[pos.piece_on(to_sq(move))][to_sq(move)]) / 14980;
+          r = std::max(DEPTH_ZERO, r - rDecrease * ONE_PLY);
 
           // Decrease reduction for moves that escape a capture. Filter out castling
           // moves because are coded as "king captures rook" and break make_move().
 
           // Decrease reduction for moves that escape a capture. Filter out castling
           // moves because are coded as "king captures rook" and break make_move().