summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
8559c43)
Increase the first hybrid threshold with more material.
Rewrite the hybrid rules for clarity.
STC:
LLR: 2.94 (-2.94,2.94) {-0.25,1.25}
Total: 24416 W: 3039 L: 2848 D: 18529
Ptnml(0-2): 135, 2136, 7503, 2271, 163
https://tests.stockfishchess.org/tests/view/
5f6451efbb0cae038ca8f4dc
LTC;
LLR: 2.95 (-2.94,2.94) {0.25,1.25}
Total: 65016 W: 3702 L: 3455 D: 57859
Ptnml(0-2): 66, 2991, 26157, 3218, 76
https://tests.stockfishchess.org/tests/view/
5f64b143bb0cae038ca8f51f
closes https://github.com/official-stockfish/Stockfish/pull/3140
Bench:
3973739
Value Eval::evaluate(const Position& pos) {
Value Eval::evaluate(const Position& pos) {
- // Use classical eval if there is a large imbalance
- // If there is a moderate imbalance, use classical eval with probability (1/8),
- // as derived from the node counter.
- bool useClassical = abs(eg_value(pos.psq_score())) * 16 > NNUEThreshold1 * (16 + pos.rule50_count());
- bool classical = !Eval::useNNUE
- || useClassical
- || (abs(eg_value(pos.psq_score())) > PawnValueMg / 4 && !(pos.this_thread()->nodes & 0xB));
- Value v = classical ? Evaluation<NO_TRACE>(pos).value()
- : NNUE::evaluate(pos) * 5 / 4 + Tempo;
-
- if ( useClassical
- && Eval::useNNUE
- && abs(v) * 16 < NNUEThreshold2 * (16 + pos.rule50_count()))
- v = NNUE::evaluate(pos) * 5 / 4 + Tempo;
+ Value v;
+
+ if (!Eval::useNNUE)
+ v = Evaluation<NO_TRACE>(pos).value();
+ else
+ {
+ // scale and shift NNUE for compatibility with search and classical evaluation
+ auto adjusted_NNUE = [&](){ return NNUE::evaluate(pos) * 5 / 4 + Tempo; };
+
+ // if there is PSQ imbalance use classical eval, with small probability if it is small
+ Value psq = Value(abs(eg_value(pos.psq_score())));
+ int r50 = 16 + pos.rule50_count();
+ bool largePsq = psq * 16 > (NNUEThreshold1 + pos.non_pawn_material() / 64) * r50;
+ bool classical = largePsq || (psq > PawnValueMg / 4 && !(pos.this_thread()->nodes & 0xB));
+
+ v = classical ? Evaluation<NO_TRACE>(pos).value() : adjusted_NNUE();
+
+ // if the classical eval is small and imbalance large, use NNUE nevertheless.
+ if ( largePsq
+ && abs(v) * 16 < NNUEThreshold2 * r50)
+ v = adjusted_NNUE();
+ }
// Damp down the evaluation linearly when shuffling
v = v * (100 - pos.rule50_count()) / 100;
// Damp down the evaluation linearly when shuffling
v = v * (100 - pos.rule50_count()) / 100;