mirror of
https://github.com/sockspls/badfish
synced 2025-05-02 01:29:36 +00:00

A lot of optimizations happend since the NNUE was introduced and since then some parts of the code were left unused. This got to the point where asserts were have to be made just to let people know that modifying something will not have any effects or may even break everything due to the assumptions being made. Removing these parts removes those inexisting "false dependencies". Additionally: * append_changed_indices now takes the king pos and stateinfo explicitly, no more misleading pos parameter * IndexList is removed in favor of a generic ValueList. Feature transformer just instantiates the type it needs. * The update cost and refresh requirement is deferred to the feature set once again, but now doesn't go through the whole FeatureSet machinery and just calls HalfKP directly. * accumulator no longer has a singular dimension. * The PS constants and the PieceSquareIndex array are made local to the HalfKP feature set because they are specific to it and DO differ for other feature sets. * A few names are changed to more descriptive Passed STC non-regression: https://tests.stockfishchess.org/tests/view/608421dd95e7f1852abd2790 LLR: 2.95 (-2.94,2.94) <-2.50,0.50> Total: 180008 W: 16186 L: 16258 D: 147564 Ptnml(0-2): 587, 12593, 63725, 12503, 596 closes https://github.com/official-stockfish/Stockfish/pull/3441 No functional change
86 lines
2.8 KiB
C++
86 lines
2.8 KiB
C++
/*
|
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
|
Copyright (C) 2004-2021 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
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
Stockfish is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
//Definition of input features HalfKP of NNUE evaluation function
|
|
|
|
#include "half_kp.h"
|
|
|
|
#include "../../position.h"
|
|
|
|
namespace Stockfish::Eval::NNUE::Features {
|
|
|
|
// Orient a square according to perspective (rotates by 180 for black)
|
|
inline Square HalfKP::orient(Color perspective, Square s) {
|
|
return Square(int(s) ^ (bool(perspective) * 63));
|
|
}
|
|
|
|
// Index of a feature for a given king position and another piece on some square
|
|
inline IndexType HalfKP::make_index(Color perspective, Square s, Piece pc, Square ksq) {
|
|
return IndexType(orient(perspective, s) + PieceSquareIndex[perspective][pc] + PS_NB * ksq);
|
|
}
|
|
|
|
// Get a list of indices for active features
|
|
void HalfKP::append_active_indices(
|
|
const Position& pos,
|
|
Color perspective,
|
|
ValueListInserter<IndexType> active
|
|
) {
|
|
Square ksq = orient(perspective, pos.square<KING>(perspective));
|
|
Bitboard bb = pos.pieces() & ~pos.pieces(KING);
|
|
while (bb)
|
|
{
|
|
Square s = pop_lsb(bb);
|
|
active.push_back(make_index(perspective, s, pos.piece_on(s), ksq));
|
|
}
|
|
}
|
|
|
|
|
|
// append_changed_indices() : get a list of indices for recently changed features
|
|
|
|
void HalfKP::append_changed_indices(
|
|
Square ksq,
|
|
StateInfo* st,
|
|
Color perspective,
|
|
ValueListInserter<IndexType> removed,
|
|
ValueListInserter<IndexType> added
|
|
) {
|
|
const auto& dp = st->dirtyPiece;
|
|
Square oriented_ksq = orient(perspective, ksq);
|
|
for (int i = 0; i < dp.dirty_num; ++i) {
|
|
Piece pc = dp.piece[i];
|
|
if (type_of(pc) == KING) continue;
|
|
if (dp.from[i] != SQ_NONE)
|
|
removed.push_back(make_index(perspective, dp.from[i], pc, oriented_ksq));
|
|
if (dp.to[i] != SQ_NONE)
|
|
added.push_back(make_index(perspective, dp.to[i], pc, oriented_ksq));
|
|
}
|
|
}
|
|
|
|
int HalfKP::update_cost(StateInfo* st) {
|
|
return st->dirtyPiece.dirty_num;
|
|
}
|
|
|
|
int HalfKP::refresh_cost(const Position& pos) {
|
|
return pos.count<ALL_PIECES>() - 2;
|
|
}
|
|
|
|
bool HalfKP::requires_refresh(StateInfo* st, Color perspective) {
|
|
return st->dirtyPiece.piece[0] == make_piece(perspective, KING);
|
|
}
|
|
|
|
} // namespace Stockfish::Eval::NNUE::Features
|