From 54b3d44194fb0d36a2b4c3cd6d473ec50a4c1ef1 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Wed, 27 Jan 2010 10:55:19 +0100 Subject: [PATCH] Introduce update_gains() and refactor some code No functional change Signed-off-by: Marco Costalba --- src/maxgain.cpp | 6 +----- src/maxgain.h | 2 +- src/search.cpp | 49 ++++++++++++++++++++++--------------------------- 3 files changed, 24 insertions(+), 33 deletions(-) diff --git a/src/maxgain.cpp b/src/maxgain.cpp index 8c1ff48a..394cc225 100644 --- a/src/maxgain.cpp +++ b/src/maxgain.cpp @@ -47,12 +47,8 @@ void MaxGain::clear() { /// 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 diff --git a/src/maxgain.h b/src/maxgain.h index 6bdc5b87..2b7777b2 100644 --- a/src/maxgain.h +++ b/src/maxgain.h @@ -39,7 +39,7 @@ class MaxGain { 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: diff --git a/src/search.cpp b/src/search.cpp index 6bc77d3b..defe00d6 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -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); + void update_gains(const Position& pos, Move move, Value before, Value after); bool fail_high_ply_1(); int current_search_time(); @@ -1165,21 +1166,14 @@ namespace { tte = TT.retrieve(pos.get_key()); } - // Evaluate the position statically isCheck = pos.is_check(); - EvalInfo ei; if (!isCheck) { + // Update gain statistics of the previous move that lead + // us in this position. + EvalInfo ei; 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 @@ -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 - - // 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 @@ -1764,16 +1751,9 @@ namespace { 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; @@ -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. -- 2.39.2