]> git.sesse.net Git - stockfish/blobdiff - src/nnue/features/half_kp.cpp
Documentation patch: AppendChangedIndices
[stockfish] / src / nnue / features / half_kp.cpp
index ac6317e7da66d4c424f523e39a993e9aa6ecfe51..8e6907ae00291d07a5dfb643a5764f85065b9d09 100644 (file)
@@ -40,13 +40,32 @@ namespace Stockfish::Eval::NNUE::Features {
 
     Square ksq = orient(perspective, pos.square<KING>(perspective));
     Bitboard bb = pos.pieces() & ~pos.pieces(KING);
-    while (bb) {
-      Square s = pop_lsb(&bb);
+    while (bb)
+    {
+      Square s = pop_lsb(bb);
       active->push_back(make_index(perspective, s, pos.piece_on(s), ksq));
     }
   }
 
-  // Get a list of indices for recently changed features
+
+  // AppendChangedIndices() : get a list of indices for recently changed features
+
+  // IMPORTANT: The `pos` in this function is pretty much useless as it
+  // is not always the position the features are updated to. The feature
+  // transformer code right now can update multiple accumulators per move,
+  // but since Stockfish only keeps the full state of the current leaf
+  // search position it is not possible to always pass here the position for
+  // which the accumulator is being updated. Therefore the only thing that
+  // can be reliably extracted from `pos` is the king square for the king
+  // of the `perspective` color (note: not even the other king's square will
+  // match reality in all cases, this is also the reason why `dp` is passed
+  // as a parameter and not extracted from pos.state()). This is of particular
+  // problem for future nets with other feature sets, where updating the active
+  // feature might require more information from the intermediate positions. In
+  // this case the only easy solution is to remove the multiple updates from
+  // the feature transformer update code and only update the accumulator for
+  // the current leaf position (the position after the move).
+
   template <Side AssociatedKing>
   void HalfKP<AssociatedKing>::AppendChangedIndices(
       const Position& pos, const DirtyPiece& dp, Color perspective,