Use classical evaluation during setup phase to enable NNUE usage.
Value v;
- if (!Eval::useNNUE)
+ if (!Eval::useNNUE || !pos.nnue_applicable())
v = Evaluation<NO_TRACE>(pos).value();
else
{
<< "| Total | " << Term(TOTAL)
<< "+------------+-------------+-------------+-------------+\n";
- if (Eval::useNNUE)
+ if (Eval::useNNUE && pos.nnue_applicable())
ss << '\n' << NNUE::trace(pos) << '\n';
ss << std::showpoint << std::showpos << std::fixed << std::setprecision(2) << std::setw(15);
v = pos.side_to_move() == WHITE ? v : -v;
ss << "\nClassical evaluation " << to_cp(v) << " (white side)\n";
- if (Eval::useNNUE)
+ if (Eval::useNNUE && pos.nnue_applicable())
{
v = NNUE::evaluate(pos, false);
v = pos.side_to_move() == WHITE ? v : -v;
v = evaluate(pos);
v = pos.side_to_move() == WHITE ? v : -v;
ss << "Final evaluation " << to_cp(v) << " (white side)";
- if (Eval::useNNUE)
+ if (Eval::useNNUE && pos.nnue_applicable())
ss << " [with scaled NNUE, hybrid, ...]";
ss << "\n";
}
// Indices for pieces in hand
- if (pos.piece_drops() || pos.seirawan_gating())
+ if (pos.nnue_use_pockets())
for (Color c : {WHITE, BLACK})
for (PieceType pt : pos.piece_types())
for (int i = 0; i < pos.count_in_hand(c, pt); i++)
PieceType castling_rook_piece() const;
PieceType king_type() const;
PieceType nnue_king() const;
+ bool nnue_use_pockets() const;
+ bool nnue_applicable() const;
bool checking_permitted() const;
bool drop_checks() const;
bool must_capture() const;
return var->nnueKing;
}
+inline bool Position::nnue_use_pockets() const {
+ assert(var != nullptr);
+ return var->nnueUsePockets;
+}
+
+inline bool Position::nnue_applicable() const {
+ // Do not use NNUE during setup phases (placement, sittuyin)
+ return !count_in_hand(ALL_PIECES) || nnue_use_pockets();
+}
+
inline bool Position::checking_permitted() const {
assert(var != nullptr);
return var->checking;
v->blackDropRegion = Rank8BB;
v->dropOppositeColoredBishop = true;
v->castlingDroppedPiece = true;
+ v->nnueAlias = "nn-";
return v;
}
// Sittuyin (Burmese chess)
std::string nnueAlias = "";
PieceType nnueKing = KING;
int nnueSquares;
+ bool nnueUsePockets;
int nnuePieceIndices;
int pieceSquareIndex[COLOR_NB][PIECE_NB];
int pieceHandIndex[COLOR_NB][PIECE_NB];
: extinctionPieceTypes.find(COMMONER) != extinctionPieceTypes.end() ? COMMONER
: NO_PIECE_TYPE;
nnueSquares = (maxRank + 1) * (maxFile + 1);
- int nnuePockets = pieceDrops || seirawanGating ? 2 * int(maxFile + 1) : 0;
+ nnueUsePockets = (pieceDrops && (!mustDrop || capturesToHand)) || seirawanGating;
+ int nnuePockets = nnueUsePockets ? 2 * int(maxFile + 1) : 0;
int nnueNonDropPieceIndices = (2 * pieceTypes.size() - 1) * nnueSquares;
nnuePieceIndices = nnueNonDropPieceIndices + 2 * (pieceTypes.size() - 1) * nnuePockets;
int i = 0;