This patch simplifies the formulas used to compute the trend and optimism values before each search iteration.
As a side effect, this removes the parameters which make the relationship between the displayed evaluation value
and the expected game result asymmetric.
I've also provided links to the results of isotonic regression analysis of the relationship between the evaluation and game result (statistical data and a graph) for both tests, which demonstrate that the new version has a more symmetric relationship:
STC: [Data and graph](https://github.com/official-stockfish/Stockfish/discussions/4150#discussioncomment-
3548954)
LTC: [Data and graph](https://github.com/official-stockfish/Stockfish/discussions/4150#discussioncomment-
3626311)
See also https://github.com/official-stockfish/Stockfish/issues/4142
passed STC:
https://tests.stockfishchess.org/tests/view/
6313f44b8202a039920e27e6
LLR: 2.96 (-2.94,2.94) <-1.75,0.25>
Total: 108016 W: 28903 L: 28760 D: 50353
Ptnml(0-2): 461, 12075, 28850, 12104, 518
passed LTC:
https://tests.stockfishchess.org/tests/view/
631de45db85daa436625dfe6
LLR: 3.01 (-2.94,2.94) <-1.75,0.25>
Total: 34792 W: 9412 L: 9209 D: 16171
Ptnml(0-2): 24, 3374, 10397, 3577, 24
Furthermore, this does not measurably impact Elo strength against weaker engines,
as demonstrated in a match of master and patch vs SF13:
This patch vs SF 13:
https://tests.stockfishchess.org/tests/view/
631fa34ae1612778c344c6eb
Elo: 141.66 +-1.2 (95%) LOS: 100.0%
Total: 100000 W: 48182 L: 9528 D: 42290
Ptnml(0-2): 96, 1426, 13277, 30130, 5071
nElo: 284.13 +-3.3 (95%) PairsRatio: 23.13
Master vs SF 13:
https://tests.stockfishchess.org/tests/view/
631fa3ece1612778c344c6ff
Elo: 143.26 +-1.2 (95%) LOS: 100.0%
Total: 100000 W: 48525 L: 9479 D: 41996
Ptnml(0-2): 94, 1537, 13098, 29771, 5500
nElo: 281.70 +-3.3 (95%) PairsRatio: 21.63
closes: https://github.com/official-stockfish/Stockfish/pull/4163
Bench:
4425574
};
-/// sigmoid(t, x0, y0, C, P, Q) implements a sigmoid-like function using only integers,
-/// with the following properties:
-///
-/// - sigmoid is centered in (x0, y0)
-/// - sigmoid has amplitude [-P/Q , P/Q] instead of [-1 , +1]
-/// - limit is (y0 - P/Q) when t tends to -infinity
-/// - limit is (y0 + P/Q) when t tends to +infinity
-/// - the slope can be adjusted using C > 0, smaller C giving a steeper sigmoid
-/// - the slope of the sigmoid when t = x0 is P/(Q*C)
-/// - sigmoid is increasing with t when P > 0 and Q > 0
-/// - to get a decreasing sigmoid, change sign of P
-/// - mean value of the sigmoid is y0
-///
-/// Use <https://www.desmos.com/calculator/jhh83sqq92> to draw the sigmoid
-
-inline int64_t sigmoid(int64_t t, int64_t x0,
- int64_t y0,
- int64_t C,
- int64_t P,
- int64_t Q)
-{
- assert(C > 0);
- assert(Q != 0);
- return y0 + P * (t-x0) / (Q * (std::abs(t-x0) + C)) ;
-}
-
-
/// xorshift64star Pseudo-Random Number Generator
/// This class is based on original code written and dedicated
/// to the public domain by Sebastiano Vigna (2014).
complexityAverage.set(155, 1);
- trend = SCORE_ZERO;
- optimism[ us] = Value(37);
- optimism[~us] = -optimism[us];
+ trend = SCORE_ZERO;
+ optimism[us] = optimism[~us] = VALUE_ZERO;
int searchAgainCounter = 0;
beta = std::min(prev + delta, VALUE_INFINITE);
// Adjust trend and optimism based on root move's previousScore
- int tr = sigmoid(prev, 3, 10, 89, 116, 1);
+ int tr = 116 * prev / (std::abs(prev) + 89);
trend = (us == WHITE ? make_score(tr, tr / 2)
: -make_score(tr, tr / 2));
- int opt = sigmoid(prev, 7, 20, 169, 19350, 164);
+ int opt = 118 * prev / (std::abs(prev) + 169);
optimism[ us] = Value(opt);
optimism[~us] = -optimism[us];
}