Skip to content

Commit

Permalink
Simplify verification search (#1362)
Browse files Browse the repository at this point in the history
1. avoid recursive call of verification.
   For the interested side to move recursion makes no sense.
   For the other side it could make sense in case of mutual zugzwang,
   but I was not able to figure out any concrete problematic position.
   Allows the removal of 2 local variables.
   
2. avoid further reduction by removing R += ONE_PLY;

Benchmark with zugzwang-suite (see #1338), max 45 secs per position:
Patch  solves 33 out of 37
Master solves 31 out of 37

STC:
LLR: 2.95 (-2.94,2.94) [-3.00,1.00]
Total: 76188 W: 13866 L: 13840 D: 48482
http://tests.stockfishchess.org/tests/view/5a5612ed0ebc590297da516c

LTC:
LLR: 2.95 (-2.94,2.94) [-3.00,1.00]
Total: 40479 W: 5247 L: 5152 D: 30080
http://tests.stockfishchess.org/tests/view/5a56f7d30ebc590299e4550e

bench: 5340015
  • Loading branch information
pb00068 authored and mcostalba committed Jan 13, 2018
1 parent aa88261 commit 1b64591
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 12 deletions.
13 changes: 5 additions & 8 deletions src/search.cpp
Expand Up @@ -676,7 +676,7 @@ namespace {
if ( !PvNode
&& eval >= beta
&& ss->staticEval >= beta - 36 * depth / ONE_PLY + 225
&& (ss->ply >= thisThread->nmp_ply || ss->ply % 2 == thisThread->pair))
&& (ss->ply >= thisThread->nmp_ply || ss->ply % 2 != thisThread->nmp_odd))
{

assert(eval - beta >= 0);
Expand All @@ -698,21 +698,18 @@ namespace {
if (nullValue >= VALUE_MATE_IN_MAX_PLY)
nullValue = beta;

if (depth < 12 * ONE_PLY && abs(beta) < VALUE_KNOWN_WIN)
if (abs(beta) < VALUE_KNOWN_WIN && (depth < 12 * ONE_PLY || thisThread->nmp_ply))
return nullValue;

// Do verification search at high depths
R += ONE_PLY;
// disable null move pruning for side to move for the first part of the remaining search tree
int nmp_ply = thisThread->nmp_ply;
int pair = thisThread->pair;
thisThread->nmp_ply = ss->ply + 3 * (depth-R) / 4;
thisThread->pair = (ss->ply % 2) == 0;
thisThread->nmp_odd = ss->ply % 2;

Value v = depth-R < ONE_PLY ? qsearch<NonPV, false>(pos, ss, beta-1, beta)
: search<NonPV>(pos, ss, beta-1, beta, depth-R, false, true);
thisThread->pair = pair;
thisThread->nmp_ply = nmp_ply;

thisThread->nmp_odd = thisThread->nmp_ply = 0;

if (v >= beta)
return nullValue;
Expand Down
4 changes: 1 addition & 3 deletions src/thread.cpp
Expand Up @@ -187,12 +187,10 @@ void ThreadPool::start_thinking(Position& pos, StateListPtr& states,

for (Thread* th : *this)
{
th->nodes = th->tbHits = 0;
th->nodes = th->tbHits = th->nmp_ply = th->nmp_odd = 0;
th->rootDepth = th->completedDepth = DEPTH_ZERO;
th->rootMoves = rootMoves;
th->rootPos.set(pos.fen(), pos.is_chess960(), &setupStates->back(), th);
th->nmp_ply = 0;
th->pair = -1;
}

setupStates->back() = tmp;
Expand Down
2 changes: 1 addition & 1 deletion src/thread.h
Expand Up @@ -61,7 +61,7 @@ class Thread {
Material::Table materialTable;
Endgames endgames;
size_t PVIdx;
int selDepth, nmp_ply, pair;
int selDepth, nmp_ply, nmp_odd;
std::atomic<uint64_t> nodes, tbHits;

Position rootPos;
Expand Down

0 comments on commit 1b64591

Please sign in to comment.