Save futilityMargin for both colors
authorMarco Costalba <mcostalba@gmail.com>
Mon, 1 Feb 2010 19:06:56 +0000 (20:06 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Mon, 1 Feb 2010 19:06:56 +0000 (20:06 +0100)
It will be needed by future patches.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/evaluate.cpp
src/evaluate.h
src/search.cpp

index 07a1e2102abd7a923ddbc0bbb98a055ada85ea19..d225de26fff69994013aabd9762dc373abe730f6 100644 (file)
@@ -860,11 +860,8 @@ namespace {
       // capturing a single attacking piece can therefore result in a score
       // change far bigger than the value of the captured piece.
       Score v = apply_weight(make_score(SafetyTable[attackUnits], 0), WeightKingSafety[Us]);
-
       ei.value -= Sign[Us] * v;
-
-      if (Us == pos.side_to_move())
-          ei.futilityMargin += mg_value(v);
+      ei.futilityMargin[Us] += mg_value(v);
     }
   }
 
index f33774acea4246adc50e3e7ad3376ab6cb64b7e4..067baa3cf2e0c717f98a3f136f6f13ece186a6bf 100644 (file)
@@ -47,7 +47,7 @@ class Position;
 
 struct EvalInfo {
 
-  EvalInfo() : futilityMargin(Value(0)) {}
+  EvalInfo() { futilityMargin[0] = futilityMargin[1] = Value(0); }
 
   // Middle game and endgame evaluations
   Score value;
@@ -96,8 +96,8 @@ struct EvalInfo {
   Score mobility;
 
   // Extra futility margin. This is added to the standard futility margin
-  // in the quiescence search.
-  Value futilityMargin;
+  // in the quiescence search. One for each color.
+  Value futilityMargin[2];
 };
 
 
index 84b1d78a6d16fddd80087827dba82c042f020600..4ea31a0b36dcde97bda492310b681fcec6025cf5 100644 (file)
@@ -1821,7 +1821,7 @@ namespace {
     if (bestValue >= beta)
     {
         // Store the score to avoid a future costly evaluation() call
-        if (!isCheck && !tte && ei.futilityMargin == 0)
+        if (!isCheck && !tte && ei.futilityMargin[pos.side_to_move()] == 0)
             TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_EV_LO, Depth(-127*OnePly), MOVE_NONE);
 
         return bestValue;
@@ -1840,7 +1840,7 @@ namespace {
     MovePicker mp = MovePicker(pos, ttMove, deepChecks ? Depth(0) : depth, H);
     CheckInfo ci(pos);
     enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame;
-    futilityBase = staticValue + FutilityMarginQS + ei.futilityMargin;
+    futilityBase = staticValue + FutilityMarginQS + ei.futilityMargin[pos.side_to_move()];
 
     // Loop through the moves until no moves remain or a beta cutoff
     // occurs.
@@ -1920,7 +1920,7 @@ namespace {
     {
         // If bestValue isn't changed it means it is still the static evaluation
         // of the node, so keep this info to avoid a future evaluation() call.
-        ValueType type = (bestValue == staticValue && !ei.futilityMargin ? VALUE_TYPE_EV_UP : VALUE_TYPE_UPPER);
+        ValueType type = (bestValue == staticValue && !ei.futilityMargin[pos.side_to_move()] ? VALUE_TYPE_EV_UP : VALUE_TYPE_UPPER);
         TT.store(pos.get_key(), value_to_tt(bestValue, ply), type, d, MOVE_NONE);
     }
     else if (bestValue >= beta)