Simplify make_index

Refactor index LUT construction to simplify make_index.

Passed STC Non-Regression:
LLR: 2.93 (-2.94,2.94) <-1.75,0.25>
Total: 62432 W: 16193 L: 16006 D: 30233
Ptnml(0-2): 189, 6950, 16764, 7111, 202
https://tests.stockfishchess.org/tests/view/6959985ad844c1ce7cc7eac8

closes https://github.com/official-stockfish/Stockfish/pull/6522

No functional change.
This commit is contained in:
KazApps
2026-01-11 09:09:55 +01:00
committed by Joost VandeVondele
parent d852a9195e
commit e9b2864579
+6 -32
View File
@@ -37,26 +37,6 @@ struct HelperOffsets {
int cumulativePieceOffset, cumulativeOffset; int cumulativePieceOffset, cumulativeOffset;
}; };
// Information on a particular pair of pieces and whether they should be excluded
struct PiecePairData {
// Layout: bits 8..31 are the index contribution of this piece pair, bits 0 and 1 are exclusion info
uint32_t data;
constexpr PiecePairData() :
data(0) {}
constexpr PiecePairData(bool excluded_pair,
bool semi_excluded_pair,
IndexType feature_index_base) :
data((uint32_t(excluded_pair) << 1) | (uint32_t(semi_excluded_pair && !excluded_pair))
| (uint32_t(feature_index_base) << 8)) {}
// lsb: excluded if from < to; 2nd lsb: always excluded
constexpr uint8_t excluded_pair_info() const { return static_cast<uint8_t>(data); }
constexpr IndexType feature_index_base() const { return static_cast<IndexType>(data >> 8); }
};
constexpr std::array<Piece, 12> AllPieces = { constexpr std::array<Piece, 12> AllPieces = {
W_PAWN, W_KNIGHT, W_BISHOP, W_ROOK, W_QUEEN, W_KING, W_PAWN, W_KNIGHT, W_BISHOP, W_ROOK, W_QUEEN, W_KING,
B_PAWN, B_KNIGHT, B_BISHOP, B_ROOK, B_QUEEN, B_KING, B_PAWN, B_KNIGHT, B_BISHOP, B_ROOK, B_QUEEN, B_KING,
@@ -173,7 +153,7 @@ constexpr auto helper_offsets = init_threat_offsets().first;
constexpr auto offsets = init_threat_offsets().second; constexpr auto offsets = init_threat_offsets().second;
constexpr auto init_index_luts() { constexpr auto init_index_luts() {
std::array<std::array<PiecePairData, PIECE_NB>, PIECE_NB> indices{}; std::array<std::array<std::array<uint32_t, 2>, PIECE_NB>, PIECE_NB> indices{};
for (Piece attacker : AllPieces) for (Piece attacker : AllPieces)
{ {
@@ -190,7 +170,9 @@ constexpr auto init_index_luts() {
* helper_offsets[attacker].cumulativePieceOffset; * helper_offsets[attacker].cumulativePieceOffset;
bool excluded = map < 0; bool excluded = map < 0;
indices[attacker][attacked] = PiecePairData(excluded, semi_excluded, feature); indices[attacker][attacked][0] = excluded ? FullThreats::Dimensions : feature;
indices[attacker][attacked][1] =
excluded || semi_excluded ? FullThreats::Dimensions : feature;
} }
} }
@@ -200,7 +182,7 @@ constexpr auto init_index_luts() {
// The final index is calculated from summing data found in these two LUTs, as well // The final index is calculated from summing data found in these two LUTs, as well
// as offsets[attacker][from] // as offsets[attacker][from]
// [attacker][attacked] // [attacker][attacked][from < to]
constexpr auto index_lut1 = init_index_luts(); constexpr auto index_lut1 = init_index_luts();
// [attacker][from][to] // [attacker][from][to]
constexpr auto index_lut2 = index_lut2_array(); constexpr auto index_lut2 = index_lut2_array();
@@ -216,17 +198,9 @@ inline sf_always_inline IndexType FullThreats::make_index(
unsigned attacker_oriented = attacker ^ swap; unsigned attacker_oriented = attacker ^ swap;
unsigned attacked_oriented = attacked ^ swap; unsigned attacked_oriented = attacked ^ swap;
const auto piecePairData = index_lut1[attacker_oriented][attacked_oriented]; return index_lut1[attacker_oriented][attacked_oriented][from_oriented < to_oriented]
const bool less_than = from_oriented < to_oriented;
if ((piecePairData.excluded_pair_info() + less_than) & 2)
return FullThreats::Dimensions;
const IndexType index = piecePairData.feature_index_base()
+ offsets[attacker_oriented][from_oriented] + offsets[attacker_oriented][from_oriented]
+ index_lut2[attacker_oriented][from_oriented][to_oriented]; + index_lut2[attacker_oriented][from_oriented][to_oriented];
sf_assume(index < Dimensions);
return index;
} }
// Get a list of indices for active features in ascending order // Get a list of indices for active features in ascending order