Definition of the lazy threshold moved to evaluate.cpp where all others are.
Lazy threshold only used for real searches, not used for the "eval" call.
This preserves the purity of NNUE evaluation, which is useful to verify
consistency between the engine and the NNUE trainer.
closes https://github.com/official-stockfish/Stockfish/pull/3499
No functional change
namespace {
// Threshold for lazy and space evaluation
- constexpr Value LazyThreshold1 = Value(1565);
- constexpr Value LazyThreshold2 = Value(1102);
- constexpr Value SpaceThreshold = Value(11551);
- constexpr Value NNUEThreshold1 = Value(682);
- constexpr Value NNUEThreshold2 = Value(176);
+ constexpr Value LazyThreshold1 = Value(1565);
+ constexpr Value LazyThreshold2 = Value(1102);
+ constexpr Value LazyThresholdNNUE = Value(1400);
+ constexpr Value SpaceThreshold = Value(11551);
+ constexpr Value NNUEThreshold1 = Value(682);
+ constexpr Value NNUEThreshold2 = Value(176);
// KingAttackWeights[PieceType] contains king attack weights by piece type
constexpr int KingAttackWeights[PIECE_TYPE_NB] = { 0, 0, 81, 52, 44, 10 };
int scale = 903 + 28 * pos.count<PAWN>() + 28 * pos.non_pawn_material() / 1024;
- Value nnue = NNUE::evaluate(pos, true) * scale / 1024;
+ Value nnue = NNUE::evaluate(pos, true, LazyThresholdNNUE) * scale / 1024;
if (pos.is_chess960())
nnue += fix_FRC(pos);
namespace NNUE {
- Value evaluate(const Position& pos, bool adjusted = false);
+ Value evaluate(const Position& pos, bool adjusted = false, Value lazyThreshold = VALUE_INFINITE);
bool load_eval(std::string name, std::istream& stream);
bool save_eval(std::ostream& stream);
void init();
}
// Evaluation function. Perform differential calculation.
- Value evaluate(const Position& pos, bool adjusted) {
+ Value evaluate(const Position& pos, bool adjusted, Value lazyThreshold) {
// We manually align the arrays on the stack because with gcc < 9.3
// overaligning stack variables with alignas() doesn't work correctly.
ASSERT_ALIGNED(buffer, alignment);
const std::size_t bucket = (pos.count<ALL_PIECES>() - 1) / 4;
- const auto [psqt, lazy] = featureTransformer->transform(pos, transformedFeatures, bucket);
+ const auto [psqt, lazy] = featureTransformer->transform(pos, transformedFeatures, bucket, lazyThreshold);
if (lazy)
return static_cast<Value>(psqt / OutputScale);
// Number of output dimensions for one side
static constexpr IndexType HalfDimensions = TransformedFeatureDimensions;
- static constexpr int LazyThreshold = 1400;
-
#ifdef VECTOR
static constexpr IndexType TileHeight = NumRegs * sizeof(vec_t) / 2;
static constexpr IndexType PsqtTileHeight = NumPsqtRegs * sizeof(psqt_vec_t) / 4;
}
// Convert input features
- std::pair<std::int32_t, bool> transform(const Position& pos, OutputType* output, int bucket) const {
+ std::pair<std::int32_t, bool> transform(const Position& pos, OutputType* output, int bucket, Value lazyThreshold) const {
update_accumulator(pos, WHITE);
update_accumulator(pos, BLACK);
- psqtAccumulation[static_cast<int>(perspectives[1])][bucket]
) / 2;
- if (abs(psqt) > LazyThreshold * OutputScale)
+ if (abs(psqt) > (int)lazyThreshold * OutputScale)
return { psqt, true };
#if defined(USE_AVX512)