return nnue;
};
- // If there is PSQ imbalance use classical eval, with small probability if it is small
+ // If there is PSQ imbalance we use the classical eval. We also introduce
+ // a small probability of using the classical eval when PSQ imbalance 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));
// Use classical evaluation for really low piece endgames.
- // The most critical case is a bishop + A/H file pawn vs naked king draw.
- bool strongClassical = pos.non_pawn_material() < 2 * RookValueMg && pos.count<PAWN>() < 2;
+ // One critical case is the draw for bishop + A/H file pawn vs naked king.
+ bool lowPieceEndgame = pos.non_pawn_material() == BishopValueMg
+ || (pos.non_pawn_material() < 2 * RookValueMg && pos.count<PAWN>() < 2);
- v = classical || strongClassical ? Evaluation<NO_TRACE>(pos).value() : adjusted_NNUE();
+ v = classical || lowPieceEndgame ? Evaluation<NO_TRACE>(pos).value()
+ : adjusted_NNUE();
// If the classical eval is small and imbalance large, use NNUE nevertheless.
- // For the case of opposite colored bishops, switch to NNUE eval with
- // small probability if the classical eval is less than the threshold.
- if ( largePsq
- && !strongClassical
+ // For the case of opposite colored bishops, switch to NNUE eval with small
+ // probability if the classical eval is less than the threshold.
+ if ( largePsq
+ && !lowPieceEndgame
&& ( abs(v) * 16 < NNUEThreshold2 * r50
|| ( pos.opposite_bishops()
&& abs(v) * 16 < (NNUEThreshold1 + pos.non_pawn_material() / 64) * r50