Skip to content

Commit

Permalink
Reduce use of lazyEval
Browse files Browse the repository at this point in the history
In case the evaluation at root is large, discourage the use of lazyEval.

This fixes #3772
or at least improves it significantly. In this case, poor play with large
odds can be observed, in extreme cases leading to a loss despite large
advantage:

r1bq1b1r/ppp3p1/3p1nkp/n3p3/2B1P2N/2NPB3/PPP2PPP/R3K2R b KQ - 5 9

With this patch the poor move is only considered up to depth 13, in master
up to depth 28.

The patch did not pass at LTC with Elo gainer bounds, but with slightly
positive Elo nevertheless (95% LOS).

STC:
LLR: 2.94 (-2.94,2.94) <0.00,2.50>
Total: 40368 W: 10318 L: 10041 D: 20009
Ptnml(0-2): 103, 4493, 10725, 4750, 113
https://tests.stockfishchess.org/tests/view/61800ad259e71df00dcc420d

LTC:
LLR: -2.94 (-2.94,2.94) <0.50,3.00>
Total: 212288 W: 52997 L: 52692 D: 106599
Ptnml(0-2): 112, 22038, 61549, 22323, 122
https://tests.stockfishchess.org/tests/view/618050d959e71df00dcc426d

closes #3780

Bench: 7127040
  • Loading branch information
vondele authored and snicolet committed Nov 8, 2021
1 parent a0259d8 commit 7b278aa
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 2 deletions.
5 changes: 4 additions & 1 deletion src/evaluate.cpp
Expand Up @@ -988,7 +988,9 @@ namespace {

// Early exit if score is high
auto lazy_skip = [&](Value lazyThreshold) {
return abs(mg_value(score) + eg_value(score)) > lazyThreshold + pos.non_pawn_material() / 32;
return abs(mg_value(score) + eg_value(score)) > lazyThreshold
+ std::abs(pos.this_thread()->bestValue) * 5 / 4
+ pos.non_pawn_material() / 32;
};

if (lazy_skip(LazyThreshold1))
Expand Down Expand Up @@ -1126,6 +1128,7 @@ std::string Eval::trace(Position& pos) {
std::memset(scores, 0, sizeof(scores));

pos.this_thread()->trend = SCORE_ZERO; // Reset any dynamic contempt
pos.this_thread()->bestValue = VALUE_ZERO; // Reset bestValue for lazyEval

v = Evaluation<TRACE>(pos).value();

Expand Down
2 changes: 1 addition & 1 deletion src/search.cpp
Expand Up @@ -286,7 +286,7 @@ void Thread::search() {
// The latter is needed for statScore and killer initialization.
Stack stack[MAX_PLY+10], *ss = stack+7;
Move pv[MAX_PLY+1];
Value bestValue, alpha, beta, delta;
Value alpha, beta, delta;
Move lastBestMove = MOVE_NONE;
Depth lastBestMoveDepth = 0;
MainThread* mainThread = (this == Threads.main() ? Threads.main() : nullptr);
Expand Down
1 change: 1 addition & 0 deletions src/thread.h
Expand Up @@ -64,6 +64,7 @@ class Thread {
uint64_t nodesLastExplosive;
uint64_t nodesLastNormal;
std::atomic<uint64_t> nodes, tbHits, bestMoveChanges;
Value bestValue;
int selDepth, nmpMinPly;
Color nmpColor;
ExplosionState state;
Expand Down

0 comments on commit 7b278aa

Please sign in to comment.