Skip to content

Commit

Permalink
Introduce mean squared score for delta adjustments
Browse files Browse the repository at this point in the history
This patch introduces the value `meanSquaredScore`, which makes the
initial delta sensitive to unstable iterative deepening scores.

Passed STC:
https://tests.stockfishchess.org/tests/view/66fed74286d5ee47d953bb42
LLR: 2.98 (-2.94,2.94) <0.00,2.00>
Total: 71104 W: 18635 L: 18262 D: 34207
Ptnml(0-2): 234, 8365, 17993, 8714, 246

Passed LTC:
https://tests.stockfishchess.org/tests/view/6700088e86d5ee47d953bbe9
LLR: 2.95 (-2.94,2.94) <0.50,2.50>
Total: 212544 W: 54238 L: 53560 D: 104746
Ptnml(0-2): 120, 23093, 59172, 23763, 124

closes official-stockfish#5627

Bench: 1395505
  • Loading branch information
Nonlinear2 authored and Disservin committed Oct 12, 2024
1 parent d4358dd commit aaadbe0
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 11 deletions.
8 changes: 6 additions & 2 deletions src/search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -312,8 +312,8 @@ void Search::Worker::iterative_deepening() {
selDepth = 0;

// Reset aspiration window starting size
delta = 5 + std::abs(rootMoves[pvIdx].meanSquaredScore) / 13797;
Value avg = rootMoves[pvIdx].averageScore;
delta = 5 + avg * avg / 11797;
alpha = std::max(avg - delta, -VALUE_INFINITE);
beta = std::min(avg + delta, VALUE_INFINITE);

Expand Down Expand Up @@ -1065,7 +1065,7 @@ Value Search::Worker::search(
// (alpha, beta), then that move is singular and should be extended. To
// verify this we do a reduced search on the position excluding the ttMove
// and if the result is lower than ttValue minus a margin, then we will
// extend the ttMove. Recursive singular search is avoided.
// extend the ttMove. Recursive singular search is avoided.

// Note: the depth margin and singularBeta margin are known for having
// non-linear scaling. Their values are optimized to time controls of
Expand Down Expand Up @@ -1265,6 +1265,10 @@ Value Search::Worker::search(
rm.averageScore =
rm.averageScore != -VALUE_INFINITE ? (value + rm.averageScore) / 2 : value;

rm.meanSquaredScore = rm.meanSquaredScore != -VALUE_INFINITE * VALUE_INFINITE
? (value * std::abs(value) + rm.meanSquaredScore) / 2
: value * std::abs(value);

// PV move or new best move?
if (moveCount == 1 || value > alpha)
{
Expand Down
19 changes: 10 additions & 9 deletions src/search.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,15 +91,16 @@ struct RootMove {
return m.score != score ? m.score < score : m.previousScore < previousScore;
}

uint64_t effort = 0;
Value score = -VALUE_INFINITE;
Value previousScore = -VALUE_INFINITE;
Value averageScore = -VALUE_INFINITE;
Value uciScore = -VALUE_INFINITE;
bool scoreLowerbound = false;
bool scoreUpperbound = false;
int selDepth = 0;
int tbRank = 0;
uint64_t effort = 0;
Value score = -VALUE_INFINITE;
Value previousScore = -VALUE_INFINITE;
Value averageScore = -VALUE_INFINITE;
Value meanSquaredScore = -VALUE_INFINITE * VALUE_INFINITE;
Value uciScore = -VALUE_INFINITE;
bool scoreLowerbound = false;
bool scoreUpperbound = false;
int selDepth = 0;
int tbRank = 0;
Value tbScore;
std::vector<Move> pv;
};
Expand Down

0 comments on commit aaadbe0

Please sign in to comment.