From: Stefan Geschwentner Date: Thu, 10 Mar 2016 09:28:25 +0000 (+0100) Subject: Add followup moves history for move ordering X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=a273b6ef8c899f546cf585ace584a1b498c04144 Add followup moves history for move ordering STC: LLR: 2.96 (-2.94,2.94) [0.00,5.00] Total: 7955 W: 1538 L: 1378 D: 5039 LTC: LLR: 2.95 (-2.94,2.94) [0.00,5.00] Total: 5323 W: 778 L: 642 D: 3903 Bench: 8261839 Resolves #599 --- diff --git a/src/movepick.cpp b/src/movepick.cpp index 9002c64c..0859d772 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -68,8 +68,8 @@ namespace { /// ordering is at the current node. MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats& h, - const CounterMoveStats& cmh, Move cm, Search::Stack* s) - : pos(p), history(h), counterMoveHistory(&cmh), ss(s), countermove(cm), depth(d) { + const CounterMoveStats& cmh, const CounterMoveStats& fmh, Move cm, Search::Stack* s) + : pos(p), history(h), counterMoveHistory(&cmh), followupMoveHistory(&fmh), ss(s), countermove(cm), depth(d) { assert(d > DEPTH_ZERO); @@ -80,7 +80,7 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats& MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats& h, Square s) - : pos(p), history(h), counterMoveHistory(nullptr) { + : pos(p), history(h), counterMoveHistory(nullptr), followupMoveHistory(nullptr) { assert(d <= DEPTH_ZERO); @@ -105,7 +105,7 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, } MovePicker::MovePicker(const Position& p, Move ttm, const HistoryStats& h, Value th) - : pos(p), history(h), counterMoveHistory(nullptr), threshold(th) { + : pos(p), history(h), counterMoveHistory(nullptr), followupMoveHistory(nullptr), threshold(th) { assert(!pos.checkers()); @@ -142,7 +142,8 @@ void MovePicker::score() { for (auto& m : *this) m.value = history[pos.moved_piece(m)][to_sq(m)] - + (*counterMoveHistory)[pos.moved_piece(m)][to_sq(m)]; + + (*counterMoveHistory)[pos.moved_piece(m)][to_sq(m)] + + (*followupMoveHistory)[pos.moved_piece(m)][to_sq(m)]; } template<> diff --git a/src/movepick.h b/src/movepick.h index e703cbc9..a7140846 100644 --- a/src/movepick.h +++ b/src/movepick.h @@ -85,7 +85,7 @@ public: MovePicker(const Position&, Move, Depth, const HistoryStats&, Square); MovePicker(const Position&, Move, const HistoryStats&, Value); - MovePicker(const Position&, Move, Depth, const HistoryStats&, const CounterMoveStats&, Move, Search::Stack*); + MovePicker(const Position&, Move, Depth, const HistoryStats&, const CounterMoveStats&, const CounterMoveStats&, Move, Search::Stack*); Move next_move(); @@ -98,6 +98,7 @@ private: const Position& pos; const HistoryStats& history; const CounterMoveStats* counterMoveHistory; + const CounterMoveStats* followupMoveHistory; Search::Stack* ss; Move countermove; Depth depth; diff --git a/src/search.cpp b/src/search.cpp index 72711b69..39131bd5 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -870,10 +870,12 @@ namespace { moves_loop: // When in check search starts from here Square prevSq = to_sq((ss-1)->currentMove); + Square ownPrevSq = to_sq((ss-2)->currentMove); Move cm = thisThread->counterMoves[pos.piece_on(prevSq)][prevSq]; const CounterMoveStats& cmh = CounterMoveHistory[pos.piece_on(prevSq)][prevSq]; + const CounterMoveStats& fmh = CounterMoveHistory[pos.piece_on(ownPrevSq)][ownPrevSq]; - MovePicker mp(pos, ttMove, depth, thisThread->history, cmh, cm, ss); + MovePicker mp(pos, ttMove, depth, thisThread->history, cmh, fmh, cm, ss); CheckInfo ci(pos); value = bestValue; // Workaround a bogus 'uninitialized' warning under gcc improving = ss->staticEval >= (ss-2)->staticEval @@ -1442,7 +1444,9 @@ moves_loop: // When in check search starts from here Value bonus = Value((depth / ONE_PLY) * (depth / ONE_PLY) + depth / ONE_PLY - 1); Square prevSq = to_sq((ss-1)->currentMove); + Square ownPrevSq = to_sq((ss-2)->currentMove); CounterMoveStats& cmh = CounterMoveHistory[pos.piece_on(prevSq)][prevSq]; + CounterMoveStats& fmh = CounterMoveHistory[pos.piece_on(ownPrevSq)][ownPrevSq]; Thread* thisThread = pos.this_thread(); thisThread->history.update(pos.moved_piece(move), to_sq(move), bonus); @@ -1453,6 +1457,9 @@ moves_loop: // When in check search starts from here cmh.update(pos.moved_piece(move), to_sq(move), bonus); } + if (is_ok((ss-2)->currentMove)) + fmh.update(pos.moved_piece(move), to_sq(move), bonus); + // Decrease all the other played quiet moves for (int i = 0; i < quietsCnt; ++i) { @@ -1460,6 +1467,9 @@ moves_loop: // When in check search starts from here if (is_ok((ss-1)->currentMove)) cmh.update(pos.moved_piece(quiets[i]), to_sq(quiets[i]), -bonus); + + if (is_ok((ss-2)->currentMove)) + fmh.update(pos.moved_piece(quiets[i]), to_sq(quiets[i]), -bonus); } // Extra penalty for a quiet TT move in previous ply when it gets refuted