]> git.sesse.net Git - stockfish/commitdiff
Expose the lazy threshold for the feature transformer PSQT as a parameter.
authorTomasz Sobczyk <tomasz.sobczyk1997@gmail.com>
Tue, 25 May 2021 11:09:40 +0000 (13:09 +0200)
committerJoost VandeVondele <Joost.VandeVondele@gmail.com>
Tue, 25 May 2021 19:40:51 +0000 (21:40 +0200)
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

src/evaluate.cpp
src/evaluate.h
src/nnue/evaluate_nnue.cpp
src/nnue/nnue_feature_transformer.h

index c8094ca828d23af3b6cb2a03732d1ea512ed467e..04d41d5f6b0880d569aca2e14fe11811d66e2c54 100644 (file)
@@ -214,11 +214,12 @@ using namespace Trace;
 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 };
@@ -1119,7 +1120,7 @@ Value Eval::evaluate(const Position& pos) {
 
          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);
index 41aace67fcb7ff00cf52cf7ae552c45a17c389a3..6bc1f0b387b4c02ddde1a9a37ef61ebc7e2fc534 100644 (file)
@@ -43,7 +43,7 @@ namespace Eval {
 
   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();
index cee77fe97e2bb315f77c7d13367262ddd638e152..99711cd564673c1432b4e3ddc599fb85654d86ac 100644 (file)
@@ -134,7 +134,7 @@ namespace Stockfish::Eval::NNUE {
   }
 
   // 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.
@@ -158,7 +158,7 @@ namespace Stockfish::Eval::NNUE {
     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);
index bfa2e25a3e041ea1ef1704f1a8b5d8b48d3e0290..e81f54fa3e0dea266d2ce4e431b062423422237e 100644 (file)
@@ -124,8 +124,6 @@ namespace Stockfish::Eval::NNUE {
     // 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;
@@ -171,7 +169,7 @@ namespace Stockfish::Eval::NNUE {
     }
 
     // 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);
 
@@ -184,7 +182,7 @@ namespace Stockfish::Eval::NNUE {
           - 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)