Revert setting a flag when TT value equals static evaluation
authorMarco Costalba <mcostalba@gmail.com>
Tue, 31 Mar 2009 12:57:44 +0000 (14:57 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Tue, 31 Mar 2009 19:41:06 +0000 (20:41 +0100)
Strangely enough it seems that optimization doesn't work.

After 760 games at 1+0: +155 -184 =421 -13 ELO

Probably the overhead, although small, for setting the flag
is not compensated by the saved evaluation call.

This could be due to the fact that after a TT value is stored,
if and when we hit the position again the stored TT value is
actually used as a cut-off so that we don't need to go on
with another search and evaluation is avoided in any case.

No functional change.

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

index 022f3a9..434587a 100644 (file)
@@ -1455,7 +1455,7 @@ namespace {
     if (isCheck)
         staticValue = -VALUE_INFINITE;
 
     if (isCheck)
         staticValue = -VALUE_INFINITE;
 
-    else if (tte && (tte->type() == VALUE_TYPE_EVAL || tte->staticValue()))
+    else if (tte && tte->type() == VALUE_TYPE_EVAL)
     {
         // Use the cached evaluation score if possible
         assert(tte->value() == evaluate(pos, ei, threadID));
     {
         // Use the cached evaluation score if possible
         assert(tte->value() == evaluate(pos, ei, threadID));
@@ -1569,21 +1569,10 @@ namespace {
     if (!pvNode)
     {
         Depth d = (depth == Depth(0) ? Depth(0) : Depth(-1));
     if (!pvNode)
     {
         Depth d = (depth == Depth(0) ? Depth(0) : Depth(-1));
-        Value v = value_to_tt(bestValue, ply);
-        TTEntry* e;
         if (bestValue < beta)
         if (bestValue < beta)
-            e = TT.store(pos, v, d, MOVE_NONE, VALUE_TYPE_UPPER);
+            TT.store(pos, value_to_tt(bestValue, ply), d, MOVE_NONE, VALUE_TYPE_UPPER);
         else
         else
-            e = TT.store(pos, v, d, MOVE_NONE, VALUE_TYPE_LOWER);
-
-        assert(e && e == TT.retrieve(pos));
-        assert(!e->staticValue());
-
-        // If the just stored value happens to be equal to the static evaluation
-        // score then set the flag, so to avoid calling evaluation() next time we
-        // hit this position.
-        if (staticValue == v && !ei.futilityMargin)
-            e->setStaticValue();
+            TT.store(pos, value_to_tt(bestValue, ply), d, MOVE_NONE, VALUE_TYPE_LOWER);
     }
 
     // Update killers only for good check moves
     }
 
     // Update killers only for good check moves
index 82d967c..8c5f3e3 100644 (file)
@@ -104,7 +104,7 @@ void TranspositionTable::clear() {
 /// is bigger than the depth of t2. A TTEntry of type VALUE_TYPE_EVAL
 /// never replaces another entry for the same position.
 
 /// is bigger than the depth of t2. A TTEntry of type VALUE_TYPE_EVAL
 /// never replaces another entry for the same position.
 
-TTEntry* TranspositionTable::store(const Position &pos, Value v, Depth d,
+void TranspositionTable::store(const Position &pos, Value v, Depth d,
                                Move m, ValueType type) {
   TTEntry *tte, *replace;
 
                                Move m, ValueType type) {
   TTEntry *tte, *replace;
 
@@ -116,13 +116,13 @@ TTEntry* TranspositionTable::store(const Position &pos, Value v, Depth d,
         // Do not overwrite position entry when VALUE_TYPE_EVAL
         if (   tte->key()
             && type == VALUE_TYPE_EVAL)
         // Do not overwrite position entry when VALUE_TYPE_EVAL
         if (   tte->key()
             && type == VALUE_TYPE_EVAL)
-            return NULL;
+            return;
 
         if (m == MOVE_NONE)
             m = tte->move();
 
         *tte = TTEntry(pos.get_key(), v, type, d, m, generation);
 
         if (m == MOVE_NONE)
             m = tte->move();
 
         *tte = TTEntry(pos.get_key(), v, type, d, m, generation);
-        return tte;
+        return;
     }
     else if (i == 0)  // replace would be a no-op in this common case
         continue;
     }
     else if (i == 0)  // replace would be a no-op in this common case
         continue;
@@ -136,7 +136,6 @@ TTEntry* TranspositionTable::store(const Position &pos, Value v, Depth d,
   }
   *replace = TTEntry(pos.get_key(), v, type, d, m, generation);
   writes++;
   }
   *replace = TTEntry(pos.get_key(), v, type, d, m, generation);
   writes++;
-  return replace;
 }
 
 
 }
 
 
index a820d94..76ecad8 100644 (file)
--- a/src/tt.h
+++ b/src/tt.h
@@ -46,8 +46,7 @@
 /// the 32 bits of the data field are so defined
 ///
 /// bit  0-16: move
 /// the 32 bits of the data field are so defined
 ///
 /// bit  0-16: move
-/// bit    17: stored value equals static value
-/// bit 18-19: not used
+/// bit 17-19: not used
 /// bit 20-22: value type
 /// bit 23-31: generation
 
 /// bit 20-22: value type
 /// bit 23-31: generation
 
@@ -62,8 +61,6 @@ public:
   Value value() const { return Value(value_); }
   ValueType type() const { return ValueType((data >> 20) & 7); }
   int generation() const { return (data >> 23); }
   Value value() const { return Value(value_); }
   ValueType type() const { return ValueType((data >> 20) & 7); }
   int generation() const { return (data >> 23); }
-  bool staticValue() const { return ((data >> 17) & 1); }
-  void setStaticValue() { data |= (1 << 17); }
 
 private:
   Key key_;
 
 private:
   Key key_;
@@ -83,7 +80,7 @@ public:
   ~TranspositionTable();
   void set_size(unsigned mbSize);
   void clear();
   ~TranspositionTable();
   void set_size(unsigned mbSize);
   void clear();
-  TTEntry* store(const Position &pos, Value v, Depth d, Move m, ValueType type);
+  void store(const Position &pos, Value v, Depth d, Move m, ValueType type);
   TTEntry* retrieve(const Position &pos) const;
   void new_search();
   void insert_pv(const Position &pos, Move pv[]);
   TTEntry* retrieve(const Position &pos) const;
   void new_search();
   void insert_pv(const Position &pos, Move pv[]);