From d7022031130ef84b801e087c1804d0cf05bc369b Mon Sep 17 00:00:00 2001 From: Joost VandeVondele Date: Tue, 22 May 2018 20:30:58 +0200 Subject: [PATCH] Simplify color usage in search. define Color us and use this instead of pos.side_to_move() and nmp_odd. The latter allows to clarify the nmp verification criterion. Tested for no regression: LLR: 2.95 (-2.94,2.94) [-3.00,1.00] Total: 76713 W: 15303 L: 15284 D: 46126 http://tests.stockfishchess.org/tests/view/5b046a0d0ebc5914abc12971 No functional change. --- src/search.cpp | 19 ++++++++++--------- src/thread.cpp | 2 +- src/thread.h | 3 ++- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 5fd016a6..31b6967c 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -547,6 +547,7 @@ namespace { // Step 1. Initialize node Thread* thisThread = pos.this_thread(); inCheck = pos.checkers(); + Color us = pos.side_to_move(); moveCount = captureCount = quietCount = ss->moveCount = 0; bestValue = -VALUE_INFINITE; maxValue = VALUE_INFINITE; @@ -639,7 +640,7 @@ namespace { else if (!pos.capture_or_promotion(ttMove)) { int penalty = -stat_bonus(depth); - thisThread->mainHistory[pos.side_to_move()][from_to(ttMove)] << penalty; + thisThread->mainHistory[us][from_to(ttMove)] << penalty; update_continuation_histories(ss, pos.moved_piece(ttMove), to_sq(ttMove), penalty); } } @@ -749,8 +750,8 @@ namespace { && eval >= beta && ss->staticEval >= beta - 36 * depth / ONE_PLY + 225 && !excludedMove - && pos.non_pawn_material(pos.side_to_move()) - && (ss->ply >= thisThread->nmp_ply || ss->ply % 2 != thisThread->nmp_odd)) + && pos.non_pawn_material(us) + && (ss->ply > thisThread->nmp_min_ply || us != thisThread->nmp_color)) { assert(eval - beta >= 0); @@ -772,17 +773,17 @@ namespace { if (nullValue >= VALUE_MATE_IN_MAX_PLY) nullValue = beta; - if (abs(beta) < VALUE_KNOWN_WIN && (depth < 12 * ONE_PLY || thisThread->nmp_ply)) + if (abs(beta) < VALUE_KNOWN_WIN && (depth < 12 * ONE_PLY || thisThread->nmp_min_ply)) return nullValue; // Do verification search at high depths. Disable null move pruning // for side to move for the first part of the remaining search tree. - thisThread->nmp_ply = ss->ply + 3 * (depth-R) / 4; - thisThread->nmp_odd = ss->ply % 2; + thisThread->nmp_min_ply = ss->ply + 3 * (depth-R) / 4 - 1; + thisThread->nmp_color = us; Value v = search(pos, ss, beta-1, beta, depth-R, false); - thisThread->nmp_odd = thisThread->nmp_ply = 0; + thisThread->nmp_min_ply = 0; if (v >= beta) return nullValue; @@ -923,7 +924,7 @@ moves_loop: // When in check, search starts from here // Step 14. Pruning at shallow depth (~170 Elo) if ( !rootNode - && pos.non_pawn_material(pos.side_to_move()) + && pos.non_pawn_material(us) && bestValue > VALUE_MATED_IN_MAX_PLY) { if ( !captureOrPromotion @@ -1018,7 +1019,7 @@ moves_loop: // When in check, search starts from here && !pos.see_ge(make_move(to_sq(move), from_sq(move)))) r -= 2 * ONE_PLY; - ss->statScore = thisThread->mainHistory[~pos.side_to_move()][from_to(move)] + ss->statScore = thisThread->mainHistory[us][from_to(move)] + (*contHist[0])[movedPiece][to_sq(move)] + (*contHist[1])[movedPiece][to_sq(move)] + (*contHist[3])[movedPiece][to_sq(move)] diff --git a/src/thread.cpp b/src/thread.cpp index 7fec4724..cab2d382 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -187,7 +187,7 @@ void ThreadPool::start_thinking(Position& pos, StateListPtr& states, for (Thread* th : *this) { - th->nodes = th->tbHits = th->nmp_ply = th->nmp_odd = 0; + th->nodes = th->tbHits = th->nmp_min_ply = 0; th->rootDepth = th->completedDepth = DEPTH_ZERO; th->rootMoves = rootMoves; th->rootPos.set(pos.fen(), pos.is_chess960(), &setupStates->back(), th); diff --git a/src/thread.h b/src/thread.h index 602e1f3b..45124d02 100644 --- a/src/thread.h +++ b/src/thread.h @@ -61,7 +61,8 @@ public: Material::Table materialTable; Endgames endgames; size_t PVIdx, PVLast; - int selDepth, nmp_ply, nmp_odd; + int selDepth, nmp_min_ply; + Color nmp_color; std::atomic nodes, tbHits; Position rootPos; -- 2.39.2