mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 19:49:14 +00:00
Simplify away complexity in evaluation
Simplification STC: https://tests.stockfishchess.org/tests/view/64394bc0605991a801b4f6f0 LLR: 2.95 (-2.94,2.94) <-1.75,0.25> Total: 72360 W: 19313 L: 19138 D: 33909 Ptnml(0-2): 206, 7883, 19800, 8112, 179 Simplification LTC: https://tests.stockfishchess.org/tests/view/6439e788c233ce943b6bdac1 LLR: 2.94 (-2.94,2.94) <-1.75,0.25> Total: 224992 W: 60665 L: 60654 D: 103673 Ptnml(0-2): 96, 21875, 68526, 21920, 79 closes https://github.com/official-stockfish/Stockfish/pull/4530 Bench: 3709369
This commit is contained in:
parent
f9d9c69bc3
commit
c90dd38903
5 changed files with 10 additions and 31 deletions
|
@ -1046,7 +1046,7 @@ make_v:
|
||||||
/// evaluate() is the evaluator for the outer world. It returns a static
|
/// evaluate() is the evaluator for the outer world. It returns a static
|
||||||
/// evaluation of the position from the point of view of the side to move.
|
/// evaluation of the position from the point of view of the side to move.
|
||||||
|
|
||||||
Value Eval::evaluate(const Position& pos, int* complexity) {
|
Value Eval::evaluate(const Position& pos) {
|
||||||
|
|
||||||
assert(!pos.checkers());
|
assert(!pos.checkers());
|
||||||
|
|
||||||
|
@ -1075,10 +1075,6 @@ Value Eval::evaluate(const Position& pos, int* complexity) {
|
||||||
+ (424 + optimism) * abs(psq - nnue)
|
+ (424 + optimism) * abs(psq - nnue)
|
||||||
) / 1024;
|
) / 1024;
|
||||||
|
|
||||||
// Return hybrid NNUE complexity to caller
|
|
||||||
if (complexity)
|
|
||||||
*complexity = nnueComplexity;
|
|
||||||
|
|
||||||
optimism = optimism * (272 + nnueComplexity) / 256;
|
optimism = optimism * (272 + nnueComplexity) / 256;
|
||||||
v = (nnue * scale + optimism * (scale - 748)) / 1024;
|
v = (nnue * scale + optimism * (scale - 748)) / 1024;
|
||||||
}
|
}
|
||||||
|
@ -1089,10 +1085,6 @@ Value Eval::evaluate(const Position& pos, int* complexity) {
|
||||||
// Guarantee evaluation does not hit the tablebase range
|
// Guarantee evaluation does not hit the tablebase range
|
||||||
v = std::clamp(v, VALUE_TB_LOSS_IN_MAX_PLY + 1, VALUE_TB_WIN_IN_MAX_PLY - 1);
|
v = std::clamp(v, VALUE_TB_LOSS_IN_MAX_PLY + 1, VALUE_TB_WIN_IN_MAX_PLY - 1);
|
||||||
|
|
||||||
// When not using NNUE, return classical complexity to caller
|
|
||||||
if (complexity && useClassical)
|
|
||||||
*complexity = abs(v - psq);
|
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ class Position;
|
||||||
namespace Eval {
|
namespace Eval {
|
||||||
|
|
||||||
std::string trace(Position& pos);
|
std::string trace(Position& pos);
|
||||||
Value evaluate(const Position& pos, int* complexity = nullptr);
|
Value evaluate(const Position& pos);
|
||||||
|
|
||||||
extern bool useNNUE;
|
extern bool useNNUE;
|
||||||
extern std::string currentEvalFileName;
|
extern std::string currentEvalFileName;
|
||||||
|
|
|
@ -294,14 +294,6 @@ void Thread::search() {
|
||||||
|
|
||||||
if (mainThread)
|
if (mainThread)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!rootPos.checkers())
|
|
||||||
{
|
|
||||||
int rootComplexity;
|
|
||||||
Eval::evaluate(rootPos, &rootComplexity);
|
|
||||||
mainThread->complexity = std::min(1.03 + (rootComplexity - 241) / 1552.0, 1.45);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mainThread->bestPreviousScore == VALUE_INFINITE)
|
if (mainThread->bestPreviousScore == VALUE_INFINITE)
|
||||||
for (int i = 0; i < 4; ++i)
|
for (int i = 0; i < 4; ++i)
|
||||||
mainThread->iterValue[i] = VALUE_ZERO;
|
mainThread->iterValue[i] = VALUE_ZERO;
|
||||||
|
@ -478,7 +470,7 @@ void Thread::search() {
|
||||||
double reduction = (1.4 + mainThread->previousTimeReduction) / (2.08 * timeReduction);
|
double reduction = (1.4 + mainThread->previousTimeReduction) / (2.08 * timeReduction);
|
||||||
double bestMoveInstability = 1 + 1.8 * totBestMoveChanges / Threads.size();
|
double bestMoveInstability = 1 + 1.8 * totBestMoveChanges / Threads.size();
|
||||||
|
|
||||||
double totalTime = Time.optimum() * fallingEval * reduction * bestMoveInstability * mainThread->complexity;
|
double totalTime = Time.optimum() * fallingEval * reduction * bestMoveInstability;
|
||||||
|
|
||||||
// Cap used time in case of a single legal move for a better viewer experience in tournaments
|
// Cap used time in case of a single legal move for a better viewer experience in tournaments
|
||||||
// yielding correct scores and sufficiently fast moves.
|
// yielding correct scores and sufficiently fast moves.
|
||||||
|
@ -561,7 +553,7 @@ namespace {
|
||||||
bool givesCheck, improving, priorCapture, singularQuietLMR;
|
bool givesCheck, improving, priorCapture, singularQuietLMR;
|
||||||
bool capture, moveCountPruning, ttCapture;
|
bool capture, moveCountPruning, ttCapture;
|
||||||
Piece movedPiece;
|
Piece movedPiece;
|
||||||
int moveCount, captureCount, quietCount, improvement, complexity;
|
int moveCount, captureCount, quietCount, improvement;
|
||||||
|
|
||||||
// Step 1. Initialize node
|
// Step 1. Initialize node
|
||||||
Thread* thisThread = pos.this_thread();
|
Thread* thisThread = pos.this_thread();
|
||||||
|
@ -723,7 +715,6 @@ namespace {
|
||||||
ss->staticEval = eval = VALUE_NONE;
|
ss->staticEval = eval = VALUE_NONE;
|
||||||
improving = false;
|
improving = false;
|
||||||
improvement = 0;
|
improvement = 0;
|
||||||
complexity = 0;
|
|
||||||
goto moves_loop;
|
goto moves_loop;
|
||||||
}
|
}
|
||||||
else if (excludedMove)
|
else if (excludedMove)
|
||||||
|
@ -731,17 +722,15 @@ namespace {
|
||||||
// Providing the hint that this node's accumulator will be used often brings significant Elo gain (13 Elo)
|
// Providing the hint that this node's accumulator will be used often brings significant Elo gain (13 Elo)
|
||||||
Eval::NNUE::hint_common_parent_position(pos);
|
Eval::NNUE::hint_common_parent_position(pos);
|
||||||
eval = ss->staticEval;
|
eval = ss->staticEval;
|
||||||
complexity = abs(ss->staticEval - pos.psq_eg_stm());
|
|
||||||
}
|
}
|
||||||
else if (ss->ttHit)
|
else if (ss->ttHit)
|
||||||
{
|
{
|
||||||
// Never assume anything about values stored in TT
|
// Never assume anything about values stored in TT
|
||||||
ss->staticEval = eval = tte->eval();
|
ss->staticEval = eval = tte->eval();
|
||||||
if (eval == VALUE_NONE)
|
if (eval == VALUE_NONE)
|
||||||
ss->staticEval = eval = evaluate(pos, &complexity);
|
ss->staticEval = eval = evaluate(pos);
|
||||||
else // Fall back to (semi)classical complexity for TT hits, the NNUE complexity is lost
|
else
|
||||||
{
|
{
|
||||||
complexity = abs(ss->staticEval - pos.psq_eg_stm());
|
|
||||||
if (PvNode)
|
if (PvNode)
|
||||||
Eval::NNUE::hint_common_parent_position(pos);
|
Eval::NNUE::hint_common_parent_position(pos);
|
||||||
}
|
}
|
||||||
|
@ -753,7 +742,7 @@ namespace {
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ss->staticEval = eval = evaluate(pos, &complexity);
|
ss->staticEval = eval = evaluate(pos);
|
||||||
// Save static evaluation into transposition table
|
// Save static evaluation into transposition table
|
||||||
tte->save(posKey, VALUE_NONE, ss->ttPv, BOUND_NONE, DEPTH_NONE, MOVE_NONE, eval);
|
tte->save(posKey, VALUE_NONE, ss->ttPv, BOUND_NONE, DEPTH_NONE, MOVE_NONE, eval);
|
||||||
}
|
}
|
||||||
|
@ -799,15 +788,15 @@ namespace {
|
||||||
&& (ss-1)->statScore < 18755
|
&& (ss-1)->statScore < 18755
|
||||||
&& eval >= beta
|
&& eval >= beta
|
||||||
&& eval >= ss->staticEval
|
&& eval >= ss->staticEval
|
||||||
&& ss->staticEval >= beta - 20 * depth - improvement / 13 + 253 + complexity / 25
|
&& ss->staticEval >= beta - 20 * depth - improvement / 13 + 253
|
||||||
&& !excludedMove
|
&& !excludedMove
|
||||||
&& pos.non_pawn_material(us)
|
&& pos.non_pawn_material(us)
|
||||||
&& (ss->ply >= thisThread->nmpMinPly))
|
&& (ss->ply >= thisThread->nmpMinPly))
|
||||||
{
|
{
|
||||||
assert(eval - beta >= 0);
|
assert(eval - beta >= 0);
|
||||||
|
|
||||||
// Null move dynamic reduction based on depth, eval and complexity of position
|
// Null move dynamic reduction based on depth and eval
|
||||||
Depth R = std::min(int(eval - beta) / 172, 6) + depth / 3 + 4 - (complexity > 825);
|
Depth R = std::min(int(eval - beta) / 172, 6) + depth / 3 + 4;
|
||||||
|
|
||||||
ss->currentMove = MOVE_NULL;
|
ss->currentMove = MOVE_NULL;
|
||||||
ss->continuationHistory = &thisThread->continuationHistory[0][0][NO_PIECE][0];
|
ss->continuationHistory = &thisThread->continuationHistory[0][0][NO_PIECE][0];
|
||||||
|
|
|
@ -160,7 +160,6 @@ void ThreadPool::clear() {
|
||||||
main()->bestPreviousScore = VALUE_INFINITE;
|
main()->bestPreviousScore = VALUE_INFINITE;
|
||||||
main()->bestPreviousAverageScore = VALUE_INFINITE;
|
main()->bestPreviousAverageScore = VALUE_INFINITE;
|
||||||
main()->previousTimeReduction = 1.0;
|
main()->previousTimeReduction = 1.0;
|
||||||
main()->complexity = 1.0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,6 @@ struct MainThread : public Thread {
|
||||||
void search() override;
|
void search() override;
|
||||||
void check_time();
|
void check_time();
|
||||||
|
|
||||||
double complexity;
|
|
||||||
double previousTimeReduction;
|
double previousTimeReduction;
|
||||||
Value bestPreviousScore;
|
Value bestPreviousScore;
|
||||||
Value bestPreviousAverageScore;
|
Value bestPreviousAverageScore;
|
||||||
|
|
Loading…
Add table
Reference in a new issue