X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsearch.cpp;h=defe00d6f16fde3353b1cdf9c99840d796b8b166;hb=54b3d44194fb0d36a2b4c3cd6d473ec50a4c1ef1;hp=6bc77d3ba61224197a72a5ada11e509ef08103c6;hpb=ea53006a9ded671c5f9deb27c1262d77f9722177;p=stockfish 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.