Simplify away complexityAverage

Instead of tracking the average of complexity values, calculate
complexity of root position at the beginning of the search and use it as
a scaling factor in time management.

Passed non-regression STC:
LLR: 2.94 (-2.94,2.94) <-1.75,0.25>
Total: 58752 W: 15738 L: 15551 D: 27463
Ptnml(0-2): 164, 6194, 16478, 6371, 169
https://tests.stockfishchess.org/tests/view/6423010edb43ab2ba6f9424a

Passed non-regression LTC:
LLR: 2.94 (-2.94,2.94) <-1.75,0.25>
Total: 92872 W: 24865 L: 24729 D: 43278
Ptnml(0-2): 38, 8652, 28929, 8770, 47
https://tests.stockfishchess.org/tests/view/6423c1f0db43ab2ba6f9644f

closes https://github.com/official-stockfish/Stockfish/pull/4472

No functional change
This commit is contained in:
MinetaS
2023-03-30 11:14:30 +00:00
committed by Joost VandeVondele
parent 66bf45b99e
commit 38a80c0b47
3 changed files with 11 additions and 34 deletions

View File

@@ -293,6 +293,15 @@ void Thread::search() {
if (mainThread)
{
int rootComplexity;
if (Eval::useNNUE)
Eval::NNUE::evaluate(rootPos, true, &rootComplexity);
else
Eval::evaluate(rootPos, &rootComplexity);
mainThread->complexity = std::min(1.03 + (rootComplexity - 241) / 1552.0, 1.45);
if (mainThread->bestPreviousScore == VALUE_INFINITE)
for (int i = 0; i < 4; ++i)
mainThread->iterValue[i] = VALUE_ZERO;
@@ -311,8 +320,6 @@ void Thread::search() {
multiPV = std::min(multiPV, rootMoves.size());
complexityAverage.set(153, 1);
optimism[us] = optimism[~us] = VALUE_ZERO;
int searchAgainCounter = 0;
@@ -472,10 +479,8 @@ void Thread::search() {
timeReduction = lastBestMoveDepth + 8 < completedDepth ? 1.57 : 0.65;
double reduction = (1.4 + mainThread->previousTimeReduction) / (2.08 * timeReduction);
double bestMoveInstability = 1 + 1.8 * totBestMoveChanges / Threads.size();
int complexity = mainThread->complexityAverage.value();
double complexPosition = std::min(1.03 + (complexity - 241) / 1552.0, 1.45);
double totalTime = Time.optimum() * fallingEval * reduction * bestMoveInstability * complexPosition;
double totalTime = Time.optimum() * fallingEval * reduction * bestMoveInstability * mainThread->complexity;
// Cap used time in case of a single legal move for a better viewer experience in tournaments
// yielding correct scores and sufficiently fast moves.
@@ -755,8 +760,6 @@ namespace {
tte->save(posKey, VALUE_NONE, ss->ttPv, BOUND_NONE, DEPTH_NONE, MOVE_NONE, eval);
}
thisThread->complexityAverage.update(complexity);
// Use static evaluation difference to improve quiet move ordering (~4 Elo)
if (is_ok((ss-1)->currentMove) && !(ss-1)->inCheck && !priorCapture)
{