]> git.sesse.net Git - stockfish/commitdiff
Introduce update_gains() and refactor some code
authorMarco Costalba <mcostalba@gmail.com>
Wed, 27 Jan 2010 09:55:19 +0000 (10:55 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Wed, 27 Jan 2010 10:09:07 +0000 (11:09 +0100)
No functional change

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

index 8c1ff48a3a44946cf8983f931406a9c71912228d..394cc225d6a69251d0c01a014544814e0987fa9e 100644 (file)
@@ -47,12 +47,8 @@ void MaxGain::clear() {
 
 /// MaxGain::store
 
 
 /// MaxGain::store
 
-void MaxGain::store(Piece p, Square from, Square to, Value prev, Value curr)
+void MaxGain::store(Piece p, Square from, Square to, Value delta)
 {
 {
-  if (prev == VALUE_NONE || curr == VALUE_NONE)
-    return;
-
-  Value delta = curr - prev;
   if (delta >= maxStaticValueDelta[p][from][to])
     maxStaticValueDelta[p][from][to] = delta;
   else
   if (delta >= maxStaticValueDelta[p][from][to])
     maxStaticValueDelta[p][from][to] = delta;
   else
index 6bdc5b87fcf2991890394797f6d03804a0d7b08a..2b7777b2b03b685ff4f1b5af778f0ea8f340a659 100644 (file)
@@ -39,7 +39,7 @@ class MaxGain {
 public:
   MaxGain();
   void clear();
 public:
   MaxGain();
   void clear();
-  void store(Piece p, Square from, Square to, Value prev, Value curr);
+  void store(Piece p, Square from, Square to, Value delta);
   Value retrieve(Piece p, Square from, Square to);
 
 private:
   Value retrieve(Piece p, Square from, Square to);
 
 private:
index 6bc77d3ba61224197a72a5ada11e509ef08103c6..defe00d6f16fde3353b1cdf9c99840d796b8b166 100644 (file)
@@ -289,6 +289,7 @@ namespace {
   Value refine_eval(const TTEntry* tte, Value defaultEval, int ply);
   void update_history(const Position& pos, Move move, Depth depth, Move movesSearched[], int moveCount);
   void update_killers(Move m, SearchStack& ss);
   Value refine_eval(const TTEntry* tte, Value defaultEval, int ply);
   void update_history(const Position& pos, Move move, Depth depth, Move movesSearched[], int moveCount);
   void update_killers(Move m, SearchStack& ss);
+  void update_gains(const Position& pos, Move move, Value before, Value after);
 
   bool fail_high_ply_1();
   int current_search_time();
 
   bool fail_high_ply_1();
   int current_search_time();
@@ -1165,21 +1166,14 @@ namespace {
         tte = TT.retrieve(pos.get_key());
     }
 
         tte = TT.retrieve(pos.get_key());
     }
 
-    // Evaluate the position statically
     isCheck = pos.is_check();
     isCheck = pos.is_check();
-    EvalInfo ei;
     if (!isCheck)
     {
     if (!isCheck)
     {
+        // Update gain statistics of the previous move that lead
+        // us in this position.
+        EvalInfo ei;
         ss[ply].eval = evaluate(pos, ei, threadID);
         ss[ply].eval = evaluate(pos, ei, threadID);
-
-        // Store gain statistics
-        Move m = ss[ply - 1].currentMove;
-        if (   m != MOVE_NULL
-            && pos.captured_piece() == NO_PIECE_TYPE
-            && !move_is_castle(m)
-            && !move_is_promotion(m))
-            MG.store(pos.piece_on(move_to(m)), move_from(m), move_to(m), ss[ply - 1].eval, -ss[ply].eval);
-
+        update_gains(pos, ss[ply - 1].currentMove, ss[ply - 1].eval, ss[ply].eval);
     }
 
     // Initialize a MovePicker object for the current position, and prepare
     }
 
     // Initialize a MovePicker object for the current position, and prepare
@@ -1419,14 +1413,7 @@ namespace {
         ss[ply].eval = staticValue;
         futilityValue = staticValue + PostFutilityValueMargin; //FIXME: Remove me, only for split
         staticValue = refine_eval(tte, staticValue, ply); // Enhance accuracy with TT value if possible
         ss[ply].eval = staticValue;
         futilityValue = staticValue + PostFutilityValueMargin; //FIXME: Remove me, only for split
         staticValue = refine_eval(tte, staticValue, ply); // Enhance accuracy with TT value if possible
-
-        // Store gain statistics
-        Move m = ss[ply - 1].currentMove;
-        if (   m != MOVE_NULL
-            && pos.captured_piece() == NO_PIECE_TYPE
-            && !move_is_castle(m)
-            && !move_is_promotion(m))
-            MG.store(pos.piece_on(move_to(m)), move_from(m), move_to(m), ss[ply - 1].eval, -ss[ply].eval);
+        update_gains(pos, ss[ply - 1].currentMove, ss[ply - 1].eval, ss[ply].eval);
     }
 
     // Post futility pruning
     }
 
     // Post futility pruning
@@ -1764,16 +1751,9 @@ namespace {
     if (!isCheck)
     {
         ss[ply].eval = staticValue;
     if (!isCheck)
     {
         ss[ply].eval = staticValue;
-        // Store gain statistics
-        Move m = ss[ply - 1].currentMove;
-        if (   m != MOVE_NULL
-            && pos.captured_piece() == NO_PIECE_TYPE
-            && !move_is_castle(m)
-            && !move_is_promotion(m))
-            MG.store(pos.piece_on(move_to(m)), move_from(m), move_to(m), ss[ply - 1].eval, -ss[ply].eval);
+        update_gains(pos, ss[ply - 1].currentMove, ss[ply - 1].eval, ss[ply].eval);
     }
 
     }
 
-
     // Initialize "stand pat score", and return it immediately if it is
     // at least beta.
     bestValue = staticValue;
     // Initialize "stand pat score", and return it immediately if it is
     // at least beta.
     bestValue = staticValue;
@@ -2655,6 +2635,21 @@ namespace {
   }
 
 
   }
 
 
+  // update_gains() updates the gains table of a non-capture move given
+  // the static position evaluation before and after the move.
+
+  void update_gains(const Position& pos, Move m, Value before, Value after) {
+
+    if (   m != MOVE_NULL
+        && before != VALUE_NONE
+        && after != VALUE_NONE
+        && pos.captured_piece() == NO_PIECE_TYPE
+        && !move_is_castle(m)
+        && !move_is_promotion(m))
+        MG.store(pos.piece_on(move_to(m)), move_from(m), move_to(m), -(before + after));
+  }
+
+
   // fail_high_ply_1() checks if some thread is currently resolving a fail
   // high at ply 1 at the node below the first root node.  This information
   // is used for time management.
   // fail_high_ply_1() checks if some thread is currently resolving a fail
   // high at ply 1 at the node below the first root node.  This information
   // is used for time management.