X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fevaluate.cpp;h=d5844593fe45a67ce417085012eab41054613e9f;hb=d6b6360ff5dcdffa141f50d0a81d0be7c6324c71;hp=85700bcc60dc2b5d26251c9ebec4d8336a2c6cd9;hpb=f97a86e213fd352a1a7017e5c98608cefc3ef1fa;p=stockfish diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 85700bcc..d5844593 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -1051,25 +1051,33 @@ make_v: Value Eval::evaluate(const Position& pos, int* complexity) { Value v; - Color stm = pos.side_to_move(); Value psq = pos.psq_eg_stm(); // We use the much less accurate but faster Classical eval when the NNUE // option is set to false. Otherwise we use the NNUE eval unless the - // PSQ advantage is decisive and several pieces remain (~3 Elo) + // PSQ advantage is decisive and several pieces remain. (~3 Elo) bool useClassical = !useNNUE || (pos.count() > 7 && abs(psq) > 1760); + if (useClassical) v = Evaluation(pos).value(); else { int nnueComplexity; int scale = 1064 + 106 * pos.non_pawn_material() / 5120; + + Color stm = pos.side_to_move(); 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 + nnueComplexity = ( 416 * nnueComplexity + + 424 * abs(psq - nnue) + + (optimism > 0 ? int(optimism) * int(psq - nnue) : 0) + ) / 1024; + + // Return hybrid NNUE complexity to caller + if (complexity) *complexity = nnueComplexity; optimism = optimism * (269 + nnueComplexity) / 256;