Skip to content

Commit

Permalink
Remove skipEarlyPruning argument to search()
Browse files Browse the repository at this point in the history
Remove nine boolean arguments and the corresponding skipEarlyPruning variable.
Instead, skip early pruning only when there is an excluded move, and try null
move pruning only if the previous move was not itself a null move.

passed STC:
LLR: 2.95 (-2.94,2.94) [-3.00,1.00]
Total: 33623 W: 6853 L: 6755 D: 20015
http://tests.stockfishchess.org/tests/view/5aef462a0ebc5902a409a10e

passed LTC:
LLR: 2.95 (-2.94,2.94) [-3.00,1.00]
Total: 39474 W: 5882 L: 5789 D: 27803
http://tests.stockfishchess.org/tests/view/5aefd4b80ebc5902a409a164

Closes #1585

Bench: 4953556
  • Loading branch information
vondele authored and snicolet committed May 8, 2018
1 parent 155d541 commit 8d1625d
Showing 1 changed file with 13 additions and 14 deletions.
27 changes: 13 additions & 14 deletions src/search.cpp
Expand Up @@ -107,7 +107,7 @@ namespace {
};

template <NodeType NT>
Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, bool cutNode, bool skipEarlyPruning);
Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, bool cutNode);

template <NodeType NT>
Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth = DEPTH_ZERO);
Expand Down Expand Up @@ -390,7 +390,7 @@ void Thread::search() {
// high/low anymore.
while (true)
{
bestValue = ::search<PV>(rootPos, ss, alpha, beta, rootDepth, false, false);
bestValue = ::search<PV>(rootPos, ss, alpha, beta, rootDepth, false);

// Bring the best move to the front. It is critical that sorting
// is done with a stable algorithm because all the values but the
Expand Down Expand Up @@ -517,7 +517,7 @@ namespace {
// search<>() is the main search function for both PV and non-PV nodes

template <NodeType NT>
Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, bool cutNode, bool skipEarlyPruning) {
Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, bool cutNode) {

// Use quiescence search when needed
if (depth < ONE_PLY)
Expand Down Expand Up @@ -713,7 +713,7 @@ namespace {
improving = ss->staticEval >= (ss-2)->staticEval
||(ss-2)->staticEval == VALUE_NONE;

if (skipEarlyPruning || !pos.non_pawn_material(pos.side_to_move()))
if (ss->excludedMove || !pos.non_pawn_material(pos.side_to_move()))
goto moves_loop;

// Step 7. Razoring (skipped when in check, ~2 Elo)
Expand All @@ -736,6 +736,7 @@ namespace {

// Step 9. Null move search with verification search (~40 Elo)
if ( !PvNode
&& (ss-1)->currentMove != MOVE_NULL
&& eval >= beta
&& ss->staticEval >= beta - 36 * depth / ONE_PLY + 225
&& (ss->ply >= thisThread->nmp_ply || ss->ply % 2 != thisThread->nmp_odd))
Expand All @@ -750,7 +751,7 @@ namespace {

pos.do_null_move(st);

Value nullValue = -search<NonPV>(pos, ss+1, -beta, -beta+1, depth-R, !cutNode, true);
Value nullValue = -search<NonPV>(pos, ss+1, -beta, -beta+1, depth-R, !cutNode);

pos.undo_null_move();

Expand All @@ -768,7 +769,7 @@ namespace {
thisThread->nmp_ply = ss->ply + 3 * (depth-R) / 4;
thisThread->nmp_odd = ss->ply % 2;

Value v = search<NonPV>(pos, ss, beta-1, beta, depth-R, false, true);
Value v = search<NonPV>(pos, ss, beta-1, beta, depth-R, false);

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

Expand All @@ -784,8 +785,6 @@ namespace {
&& depth >= 5 * ONE_PLY
&& abs(beta) < VALUE_MATE_IN_MAX_PLY)
{
assert(is_ok((ss-1)->currentMove));

Value rbeta = std::min(beta + 216 - 48 * improving, VALUE_INFINITE);
MovePicker mp(pos, ttMove, rbeta - ss->staticEval, &thisThread->captureHistory);
int probCutCount = 0;
Expand All @@ -808,7 +807,7 @@ namespace {

// If the qsearch held perform the regular search
if (value >= rbeta)
value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, depth - 4 * ONE_PLY, !cutNode, false);
value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, depth - 4 * ONE_PLY, !cutNode);

pos.undo_move(move);

Expand All @@ -822,7 +821,7 @@ namespace {
&& !ttMove)
{
Depth d = 3 * depth / 4 - 2 * ONE_PLY;
search<NT>(pos, ss, alpha, beta, d, cutNode, true);
search<NT>(pos, ss, alpha, beta, d, cutNode);

tte = TT.probe(posKey, ttHit);
ttValue = ttHit ? value_from_tt(tte->value(), ss->ply) : VALUE_NONE;
Expand Down Expand Up @@ -897,7 +896,7 @@ namespace {
{
Value rBeta = std::max(ttValue - 2 * depth / ONE_PLY, -VALUE_MATE);
ss->excludedMove = move;
value = search<NonPV>(pos, ss, rBeta - 1, rBeta, depth / 2, cutNode, true);
value = search<NonPV>(pos, ss, rBeta - 1, rBeta, depth / 2, cutNode);
ss->excludedMove = MOVE_NONE;

if (value < rBeta)
Expand Down Expand Up @@ -1027,7 +1026,7 @@ namespace {

Depth d = std::max(newDepth - r, ONE_PLY);

value = -search<NonPV>(pos, ss+1, -(alpha+1), -alpha, d, true, false);
value = -search<NonPV>(pos, ss+1, -(alpha+1), -alpha, d, true);

doFullDepthSearch = (value > alpha && d != newDepth);
}
Expand All @@ -1036,7 +1035,7 @@ namespace {

// Step 17. Full depth search when LMR is skipped or fails high
if (doFullDepthSearch)
value = -search<NonPV>(pos, ss+1, -(alpha+1), -alpha, newDepth, !cutNode, false);
value = -search<NonPV>(pos, ss+1, -(alpha+1), -alpha, newDepth, !cutNode);

// For PV nodes only, do a full PV search on the first move or after a fail
// high (in the latter case search only if value < beta), otherwise let the
Expand All @@ -1046,7 +1045,7 @@ namespace {
(ss+1)->pv = pv;
(ss+1)->pv[0] = MOVE_NONE;

value = -search<PV>(pos, ss+1, -beta, -alpha, newDepth, false, false);
value = -search<PV>(pos, ss+1, -beta, -alpha, newDepth, false);
}

// Step 18. Undo move
Expand Down

0 comments on commit 8d1625d

Please sign in to comment.