diff --git a/src/misc.h b/src/misc.h index 688d00e7..b9626733 100644 --- a/src/misc.h +++ b/src/misc.h @@ -105,6 +105,9 @@ class RunningAverage { bool is_greater(int64_t a, int64_t b) { return b * average > a * PERIOD * RESOLUTION ; } + int64_t value() + { return average / (PERIOD * RESOLUTION); } + private : static constexpr int64_t PERIOD = 4096; static constexpr int64_t RESOLUTION = 1024; diff --git a/src/search.cpp b/src/search.cpp index c81496d1..c9d5da64 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -329,6 +329,7 @@ void Thread::search() { doubleExtensionAverage[WHITE].set(0, 100); // initialize the running average at 0% doubleExtensionAverage[BLACK].set(0, 100); // initialize the running average at 0% + complexityAverage.set(232, 1); nodesLastExplosive = nodes; nodesLastNormal = nodes; @@ -496,7 +497,10 @@ void Thread::search() { double reduction = (1.47 + mainThread->previousTimeReduction) / (2.32 * timeReduction); double bestMoveInstability = 1.073 + std::max(1.0, 2.25 - 9.9 / rootDepth) * totBestMoveChanges / Threads.size(); - double totalTime = Time.optimum() * fallingEval * reduction * bestMoveInstability; + int complexity = mainThread->complexityAverage.value(); + double complexPosition = std::clamp(1.0 + (complexity - 232) / 1750.0, 0.5, 1.5); + + double totalTime = Time.optimum() * fallingEval * reduction * bestMoveInstability * complexPosition; // Cap used time in case of a single legal move for a better viewer experience in tournaments // yielding correct scores and sufficiently fast moves. @@ -806,6 +810,8 @@ namespace { improving = improvement > 0; complexity = abs(ss->staticEval - (us == WHITE ? eg_value(pos.psq_score()) : -eg_value(pos.psq_score()))); + thisThread->complexityAverage.update(complexity); + // Step 7. Futility pruning: child node (~25 Elo). // The depth condition is important for mate finding. if ( !ss->ttPv diff --git a/src/thread.h b/src/thread.h index a6b0b5a0..c3d38f3c 100644 --- a/src/thread.h +++ b/src/thread.h @@ -61,6 +61,7 @@ public: Material::Table materialTable; size_t pvIdx, pvLast; RunningAverage doubleExtensionAverage[COLOR_NB]; + RunningAverage complexityAverage; uint64_t nodesLastExplosive; uint64_t nodesLastNormal; std::atomic nodes, tbHits, bestMoveChanges;