Skip to content

Commit

Permalink
Tweak Late Move Reduction at root
Browse files Browse the repository at this point in the history
Maintain best move counter at the root and allow there only moves which has a counter
of zero for Late Move Reduction. For compensation only the first three moves are excluded
from Late Move Reduction per default instead the first four moves.

What we can further do:

- here we use a simple counting scheme but perhaps some aging to fade out early iterations
  could be helpful
- use the best move counter also at inner nodes for LMR and/or pruning

STC:
LLR: 2.95 (-2.94,2.94) [0.50,4.50]
Total: 17414 W: 3984 L: 3733 D: 9697
http://tests.stockfishchess.org/tests/view/5d6234bb0ebc5939d09f2aa2

LTC:
LLR: 2.96 (-2.94,2.94) [0.00,3.50]
Total: 38058 W: 6448 L: 6166 D: 25444
http://tests.stockfishchess.org/tests/view/5d62681a0ebc5939d09f2f27

Closes official-stockfish#2282

Bench: 3568210
  • Loading branch information
locutus2 authored and snicolet committed Aug 26, 2019
1 parent 0e295fe commit 8fec883
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/search.cpp
Expand Up @@ -472,7 +472,10 @@ void Thread::search() {
++failedHighCnt;
}
else
{
++rootMoves[pvIdx].bestMoveCount;
break;
}

delta += delta / 4 + 5;

Expand Down Expand Up @@ -1072,7 +1075,8 @@ namespace {
// Step 16. Reduced depth search (LMR). If the move fails high it will be
// re-searched at full depth.
if ( depth >= 3 * ONE_PLY
&& moveCount > 1 + 3 * rootNode
&& moveCount > 1 + 2 * rootNode
&& (!rootNode || thisThread->best_move_count(move) == 0)
&& ( !captureOrPromotion
|| moveCountPruning
|| ss->staticEval + PieceValue[EG][pos.captured_piece()] <= alpha
Expand Down
1 change: 1 addition & 0 deletions src/search.h
Expand Up @@ -70,6 +70,7 @@ struct RootMove {
Value previousScore = -VALUE_INFINITE;
int selDepth = 0;
int tbRank = 0;
int bestMoveCount = 0;
Value tbScore;
std::vector<Move> pv;
};
Expand Down
9 changes: 9 additions & 0 deletions src/thread.cpp
Expand Up @@ -52,6 +52,15 @@ Thread::~Thread() {
stdThread.join();
}

/// Thread::bestMoveCount(Move move) return best move counter for the given root move

int Thread::best_move_count(Move move) {

auto rm = std::find(rootMoves.begin() + pvIdx,
rootMoves.begin() + pvLast, move);

return rm != rootMoves.begin() + pvLast ? rm->bestMoveCount : 0;
}

/// Thread::clear() reset histories, usually before a new game

Expand Down
1 change: 1 addition & 0 deletions src/thread.h
Expand Up @@ -56,6 +56,7 @@ class Thread {
void idle_loop();
void start_searching();
void wait_for_search_finished();
int best_move_count(Move move);

Pawns::Table pawnsTable;
Material::Table materialTable;
Expand Down

0 comments on commit 8fec883

Please sign in to comment.