X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fevaluate.cpp;h=ab71fa67df0cc40161ad0fca2259eb3e82b76058;hb=ad926d34c0105d523bfa5cb92cbcf9f337d54c08;hp=28689f1d4167a33f55c7adf343abbdefda5099a1;hpb=88f17a814d80cdb32ccf9efb7b56bb36d7bf052b;p=stockfish diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 28689f1d..ab71fa67 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -1,6 +1,6 @@ /* Stockfish, a UCI chess playing engine derived from Glaurung 2.1 - Copyright (C) 2004-2021 The Stockfish developers (see AUTHORS file) + Copyright (C) 2004-2022 The Stockfish developers (see AUTHORS file) Stockfish is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1082,22 +1082,28 @@ make_v: Value Eval::evaluate(const Position& pos) { Value v; + bool useClassical = false; // 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. - if ( !useNNUE || abs(eg_value(pos.psq_score())) * 5 > (850 + pos.non_pawn_material() / 64) * (5 + pos.rule50_count())) - v = Evaluation(pos).value(); // classical - else { - int scale = 1136 - + 20 * pos.non_pawn_material() / 1024; + v = Evaluation(pos).value(); // classical + useClassical = abs(v) >= 300; + } + // If result of a classical evaluation is much lower than threshold fall back to NNUE + if (useNNUE && !useClassical) + { Value nnue = NNUE::evaluate(pos, true); // NNUE + int scale = 1136 + 20 * pos.non_pawn_material() / 1024; Color stm = pos.side_to_move(); Value optimism = pos.this_thread()->optimism[stm]; + Value psq = (stm == WHITE ? 1 : -1) * eg_value(pos.psq_score()); + int complexity = abs(nnue - psq) / 256; + optimism *= (1 + complexity); v = (nnue + optimism) * scale / 1024 - optimism; if (pos.is_chess960())