mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 08:43:09 +00:00
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:
parent
66bf45b99e
commit
38a80c0b47
3 changed files with 11 additions and 34 deletions
26
src/misc.h
26
src/misc.h
|
@ -89,32 +89,6 @@ static inline const union { uint32_t i; char c[4]; } Le = { 0x01020304 };
|
|||
static inline const bool IsLittleEndian = (Le.c[0] == 4);
|
||||
|
||||
|
||||
// RunningAverage : a class to calculate a running average of a series of values.
|
||||
// For efficiency, all computations are done with integers.
|
||||
class RunningAverage {
|
||||
public:
|
||||
|
||||
// Reset the running average to rational value p / q
|
||||
void set(int64_t p, int64_t q)
|
||||
{ average = p * PERIOD * RESOLUTION / q; }
|
||||
|
||||
// Update average with value v
|
||||
void update(int64_t v)
|
||||
{ average = RESOLUTION * v + (PERIOD - 1) * average / PERIOD; }
|
||||
|
||||
// Test if average is strictly greater than rational a / b
|
||||
bool is_greater(int64_t a, int64_t b) const
|
||||
{ return b * average > a * (PERIOD * RESOLUTION); }
|
||||
|
||||
int64_t value() const
|
||||
{ return average / (PERIOD * RESOLUTION); }
|
||||
|
||||
private :
|
||||
static constexpr int64_t PERIOD = 4096;
|
||||
static constexpr int64_t RESOLUTION = 1024;
|
||||
int64_t average;
|
||||
};
|
||||
|
||||
template <typename T, std::size_t MaxSize>
|
||||
class ValueList {
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -60,7 +60,6 @@ public:
|
|||
Pawns::Table pawnsTable;
|
||||
Material::Table materialTable;
|
||||
size_t pvIdx, pvLast;
|
||||
RunningAverage complexityAverage;
|
||||
std::atomic<uint64_t> nodes, tbHits, bestMoveChanges;
|
||||
int selDepth, nmpMinPly;
|
||||
Color nmpColor;
|
||||
|
@ -87,6 +86,7 @@ struct MainThread : public Thread {
|
|||
void search() override;
|
||||
void check_time();
|
||||
|
||||
double complexity;
|
||||
double previousTimeReduction;
|
||||
Value bestPreviousScore;
|
||||
Value bestPreviousAverageScore;
|
||||
|
|
Loading…
Add table
Reference in a new issue