X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fevaluate.cpp;h=eaad4d556722cb0b2f99d8e0984865f2c549f8c1;hb=15ac117ac492e3147b391aa0ee3665fe8876be63;hp=7d5876758c0836e5ad43e363e4dd9f5f719502aa;hpb=5f290352cd91beb9374671f6ae489165bd8ac2c0;p=stockfish diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 7d587675..eaad4d55 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -1053,34 +1053,29 @@ Value Eval::evaluate(const Position& pos, int* complexity) { Value v; Color stm = pos.side_to_move(); Value psq = pos.psq_eg_stm(); - // Deciding between classical and NNUE eval (~10 Elo): for high PSQ imbalance we use classical, - // but we switch to NNUE during long shuffling or with high material on the board. - bool useClassical = (pos.count() > 7) - && abs(psq) * 5 > (856 + pos.non_pawn_material() / 64) * (10 + pos.rule50_count()); - // Deciding between classical and NNUE eval (~10 Elo): for high PSQ imbalance we use classical, + // Deciding between classical and NNUE eval: for high PSQ imbalance we use classical, // but we switch to NNUE during long shuffling or with high material on the board. - if (!useNNUE || useClassical) - { - v = Evaluation(pos).value(); - useClassical = abs(v) >= 297; - } + bool useClassical = !useNNUE || + ((pos.count() > 7) + && abs(psq) * 5 > (856 + pos.non_pawn_material() / 64) * (10 + pos.rule50_count())); - // If result of a classical evaluation is much lower than threshold fall back to NNUE - if (useNNUE && !useClassical) + if (useClassical) + v = Evaluation(pos).value(); + else { - int nnueComplexity; - int scale = 1064 + 106 * pos.non_pawn_material() / 5120; - Value optimism = pos.this_thread()->optimism[stm]; - - Value nnue = NNUE::evaluate(pos, true, &nnueComplexity); - // Blend nnue complexity with (semi)classical complexity - nnueComplexity = (104 * nnueComplexity + 131 * abs(nnue - psq)) / 256; - if (complexity) // Return hybrid NNUE complexity to caller - *complexity = nnueComplexity; - - optimism = optimism * (269 + nnueComplexity) / 256; - v = (nnue * scale + optimism * (scale - 754)) / 1024; + int nnueComplexity; + int scale = 1064 + 106 * pos.non_pawn_material() / 5120; + Value optimism = pos.this_thread()->optimism[stm]; + + Value nnue = NNUE::evaluate(pos, true, &nnueComplexity); + // Blend nnue complexity with (semi)classical complexity + nnueComplexity = (104 * nnueComplexity + 131 * abs(nnue - psq)) / 256; + if (complexity) // Return hybrid NNUE complexity to caller + *complexity = nnueComplexity; + + optimism = optimism * (269 + nnueComplexity) / 256; + v = (nnue * scale + optimism * (scale - 754)) / 1024; } // Damp down the evaluation linearly when shuffling @@ -1091,7 +1086,7 @@ Value Eval::evaluate(const Position& pos, int* complexity) { // When not using NNUE, return classical complexity to caller if (complexity && (!useNNUE || useClassical)) - *complexity = abs(v - psq); + *complexity = abs(v - psq); return v; }