//Definition of input features HalfKP of NNUE evaluation function #include "half_kp.h" #include "index_list.h" namespace Eval::NNUE::Features { // Find the index of the feature quantity from the king position and PieceSquare template inline IndexType HalfKP::MakeIndex(Square sq_k, PieceSquare p) { return static_cast(PS_END) * static_cast(sq_k) + p; } // Get the piece information template inline void HalfKP::GetPieces( const Position& pos, Color perspective, PieceSquare** pieces, Square* sq_target_k) { *pieces = (perspective == BLACK) ? pos.eval_list()->piece_list_fb() : pos.eval_list()->piece_list_fw(); const PieceId target = (AssociatedKing == Side::kFriend) ? static_cast(PIECE_ID_KING + perspective) : static_cast(PIECE_ID_KING + ~perspective); *sq_target_k = static_cast(((*pieces)[target] - PS_W_KING) % SQUARE_NB); } // Get a list of indices with a value of 1 among the features template void HalfKP::AppendActiveIndices( const Position& pos, Color perspective, IndexList* active) { // do nothing if array size is small to avoid compiler warning if (RawFeatures::kMaxActiveDimensions < kMaxActiveDimensions) return; PieceSquare* pieces; Square sq_target_k; GetPieces(pos, perspective, &pieces, &sq_target_k); for (PieceId i = PIECE_ID_ZERO; i < PIECE_ID_KING; ++i) { if (pieces[i] != PS_NONE) { active->push_back(MakeIndex(sq_target_k, pieces[i])); } } } // Get a list of indices whose values ​​have changed from the previous one in the feature quantity template void HalfKP::AppendChangedIndices( const Position& pos, Color perspective, IndexList* removed, IndexList* added) { PieceSquare* pieces; Square sq_target_k; GetPieces(pos, perspective, &pieces, &sq_target_k); const auto& dp = pos.state()->dirtyPiece; for (int i = 0; i < dp.dirty_num; ++i) { if (dp.pieceId[i] >= PIECE_ID_KING) continue; const auto old_p = static_cast( dp.old_piece[i].from[perspective]); if (old_p != PS_NONE) { removed->push_back(MakeIndex(sq_target_k, old_p)); } const auto new_p = static_cast( dp.new_piece[i].from[perspective]); if (new_p != PS_NONE) { added->push_back(MakeIndex(sq_target_k, new_p)); } } } template class HalfKP; } // namespace Eval::NNUE::Features