/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
- Copyright (C) 2004-2022 The Stockfish developers (see AUTHORS file)
+ Copyright (C) 2004-2023 The Stockfish developers (see AUTHORS file)
Stockfish is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "half_ka_v2_hm.h"
+#include "../../bitboard.h"
#include "../../position.h"
+#include "../../types.h"
+#include "../nnue_common.h"
namespace Stockfish::Eval::NNUE::Features {
- // Index of a feature for a given king position and another piece on some square
- template<Color Perspective>
- inline IndexType HalfKAv2_hm::make_index(Square s, Piece pc, Square ksq) {
- return IndexType((int(s) ^ OrientTBL[Perspective][ksq]) + PieceSquareIndex[Perspective][pc] + KingBuckets[Perspective][ksq]);
- }
-
- // Get a list of indices for active features
- template<Color Perspective>
- void HalfKAv2_hm::append_active_indices(
- const Position& pos,
- IndexList& active
- ) {
- Square ksq = pos.square<KING>(Perspective);
- Bitboard bb = pos.pieces();
+// Index of a feature for a given king position and another piece on some square
+template<Color Perspective>
+inline IndexType HalfKAv2_hm::make_index(Square s, Piece pc, Square ksq) {
+ return IndexType((int(s) ^ OrientTBL[Perspective][ksq]) + PieceSquareIndex[Perspective][pc]
+ + KingBuckets[Perspective][ksq]);
+}
+
+// Get a list of indices for active features
+template<Color Perspective>
+void HalfKAv2_hm::append_active_indices(const Position& pos, IndexList& active) {
+ Square ksq = pos.square<KING>(Perspective);
+ Bitboard bb = pos.pieces();
while (bb)
{
- Square s = pop_lsb(bb);
- active.push_back(make_index<Perspective>(s, pos.piece_on(s), ksq));
+ Square s = pop_lsb(bb);
+ active.push_back(make_index<Perspective>(s, pos.piece_on(s), ksq));
}
- }
-
- // Explicit template instantiations
- template void HalfKAv2_hm::append_active_indices<WHITE>(const Position& pos, IndexList& active);
- template void HalfKAv2_hm::append_active_indices<BLACK>(const Position& pos, IndexList& active);
-
- // append_changed_indices() : get a list of indices for recently changed features
- template<Color Perspective>
- void HalfKAv2_hm::append_changed_indices(
- Square ksq,
- const DirtyPiece& dp,
- IndexList& removed,
- IndexList& added
- ) {
- for (int i = 0; i < dp.dirty_num; ++i) {
- if (dp.from[i] != SQ_NONE)
- removed.push_back(make_index<Perspective>(dp.from[i], dp.piece[i], ksq));
- if (dp.to[i] != SQ_NONE)
- added.push_back(make_index<Perspective>(dp.to[i], dp.piece[i], ksq));
+}
+
+// Explicit template instantiations
+template void HalfKAv2_hm::append_active_indices<WHITE>(const Position& pos, IndexList& active);
+template void HalfKAv2_hm::append_active_indices<BLACK>(const Position& pos, IndexList& active);
+
+// Get a list of indices for recently changed features
+template<Color Perspective>
+void HalfKAv2_hm::append_changed_indices(Square ksq,
+ const DirtyPiece& dp,
+ IndexList& removed,
+ IndexList& added) {
+ for (int i = 0; i < dp.dirty_num; ++i)
+ {
+ if (dp.from[i] != SQ_NONE)
+ removed.push_back(make_index<Perspective>(dp.from[i], dp.piece[i], ksq));
+ if (dp.to[i] != SQ_NONE)
+ added.push_back(make_index<Perspective>(dp.to[i], dp.piece[i], ksq));
}
- }
+}
- // Explicit template instantiations
- template void HalfKAv2_hm::append_changed_indices<WHITE>(Square ksq, const DirtyPiece& dp, IndexList& removed, IndexList& added);
- template void HalfKAv2_hm::append_changed_indices<BLACK>(Square ksq, const DirtyPiece& dp, IndexList& removed, IndexList& added);
+// Explicit template instantiations
+template void HalfKAv2_hm::append_changed_indices<WHITE>(Square ksq,
+ const DirtyPiece& dp,
+ IndexList& removed,
+ IndexList& added);
+template void HalfKAv2_hm::append_changed_indices<BLACK>(Square ksq,
+ const DirtyPiece& dp,
+ IndexList& removed,
+ IndexList& added);
- int HalfKAv2_hm::update_cost(const StateInfo* st) {
- return st->dirtyPiece.dirty_num;
- }
+int HalfKAv2_hm::update_cost(const StateInfo* st) { return st->dirtyPiece.dirty_num; }
- int HalfKAv2_hm::refresh_cost(const Position& pos) {
- return pos.count<ALL_PIECES>();
- }
+int HalfKAv2_hm::refresh_cost(const Position& pos) { return pos.count<ALL_PIECES>(); }
- bool HalfKAv2_hm::requires_refresh(const StateInfo* st, Color perspective) {
+bool HalfKAv2_hm::requires_refresh(const StateInfo* st, Color perspective) {
return st->dirtyPiece.piece[0] == make_piece(perspective, KING);
- }
+}
} // namespace Stockfish::Eval::NNUE::Features