]> git.sesse.net Git - stockfish/blobdiff - src/evaluate.cpp
Introduce lazy evaluation
[stockfish] / src / evaluate.cpp
index 02806cc713ef881bf9b16f40fdc8b63d6f958bb6..5621c508f219d7ed7725c68f46b4a28032973fc4 100644 (file)
@@ -221,6 +221,8 @@ namespace {
   const int BishopCheck       = 588;
   const int KnightCheck       = 924;
 
+  // Threshold for lazy evaluation
+  const Value LazyEval = Value(1500);
 
   // eval_init() initializes king and attack bitboards for a given color
   // adding pawn attacks. To be done at the beginning of the evaluation.
@@ -782,6 +784,18 @@ namespace {
     return sf;
   }
 
+
+  Value lazy_eval(Value mg, Value eg) {
+
+    if (mg > LazyEval && eg > LazyEval)
+        return  LazyEval + ((mg + eg) / 2 - LazyEval) / 4;
+
+    else if (mg < -LazyEval && eg < -LazyEval)
+        return -LazyEval + ((mg + eg) / 2 + LazyEval) / 4;
+
+    return VALUE_ZERO;
+  }
+
 } // namespace
 
 
@@ -813,6 +827,12 @@ Value Eval::evaluate(const Position& pos) {
   ei.pi = Pawns::probe(pos);
   score += ei.pi->pawns_score();
 
+  // We have taken into account all cheap evaluation terms.
+  // If score exceeds a threshold return a lazy evaluation.
+  Value lazy = lazy_eval(mg_value(score), eg_value(score));
+  if (lazy)
+      return pos.side_to_move() == WHITE ? lazy : -lazy;
+
   // Initialize attack and king safety bitboards
   ei.attackedBy[WHITE][ALL_PIECES] = ei.attackedBy[BLACK][ALL_PIECES] = 0;
   ei.attackedBy[WHITE][KING] = pos.attacks_from<KING>(pos.square<KING>(WHITE));