mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-15 22:56:25 +08:00
Added #ifdef statements to switch the legacy evaluation function and NNUE evaluation function.
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
// NNUE評価関数の計算に関するコード
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
@@ -316,3 +318,5 @@ void print_eval_stat(Position& /*pos*/) {
|
||||
}
|
||||
|
||||
} // namespace Eval
|
||||
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
@@ -865,8 +865,11 @@ namespace {
|
||||
/// evaluation of the position from the point of view of the side to move.
|
||||
|
||||
Value Eval::evaluate(const Position& pos) {
|
||||
//return Evaluation<NO_TRACE>(pos).value();
|
||||
#if defined(EVAL_NNUE)
|
||||
return Eval::NNUE::evaluate(pos);
|
||||
#else
|
||||
return Evaluation<NO_TRACE>(pos).value();
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
|
||||
@@ -910,6 +913,7 @@ std::string Eval::trace(const Position& pos) {
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
namespace Eval {
|
||||
ExtBonaPiece kpp_board_index[PIECE_NB] = {
|
||||
{ BONA_PIECE_ZERO, BONA_PIECE_ZERO },
|
||||
@@ -978,3 +982,4 @@ bool EvalList::is_valid(const Position& pos)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
@@ -35,6 +35,7 @@ std::string trace(const Position& pos);
|
||||
|
||||
Value evaluate(const Position& pos);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
// <20>]<5D><><EFBFBD><EFBFBD><D690>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>ǂݍ<C782><DD8D>ށB
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>́A"is_ready"<22>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD>̉<EFBFBD><CC89><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD>x<EFBFBD><78><EFBFBD><EFBFBD><EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B2<42>x<EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD>Ƃ͑z<CD91>肵<EFBFBD>Ă<EFBFBD><C482>Ȃ<EFBFBD><C882>B
|
||||
// (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AEvalDir(<28>]<5D><><EFBFBD><EFBFBD><D690>t<EFBFBD>H<EFBFBD><48><EFBFBD>_)<29><><EFBFBD>ύX<CF8D>ɂȂ<C982><C882><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƁAisready<64><79><EFBFBD>ēx<C493><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǂ݂Ȃ<DD82><C882><EFBFBD><EFBFBD>B)
|
||||
@@ -206,6 +207,7 @@ struct DirtyPiece
|
||||
int dirty_num;
|
||||
|
||||
};
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
#endif // #ifndef EVALUATE_H_INCLUDED
|
||||
|
||||
@@ -243,6 +243,7 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th
|
||||
std::fill_n(&pieceList[0][0], sizeof(pieceList) / sizeof(Square), SQ_NONE);
|
||||
st = si;
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
// evalList<73><74>clear<61>B<EFBFBD><42><EFBFBD><EFBFBD>memset<65>Ń[<5B><><EFBFBD>N<EFBFBD><4E><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>ɃN<C983><4E><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>邪<EFBFBD>c<EFBFBD>B
|
||||
evalList.clear();
|
||||
|
||||
@@ -256,6 +257,7 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th
|
||||
PIECE_NUMBER_ROOK,
|
||||
PIECE_NUMBER_QUEEN
|
||||
};
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
ss >> std::noskipws;
|
||||
|
||||
@@ -273,11 +275,13 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th
|
||||
auto pc = Piece(idx);
|
||||
put_piece(pc, sq);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber piece_no =
|
||||
(idx == W_KING) ? PIECE_NUMBER_WKING : // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
(idx == B_KING) ? PIECE_NUMBER_BKING : // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
piece_no_count[type_of(Piece(idx))]++; // <20><><EFBFBD><EFBFBD><EFBFBD>ȊO
|
||||
evalList.put_piece(piece_no, sq, pc); // sq<73>̏<EFBFBD><CC8F><EFBFBD>pc<70>̋<EFBFBD><CC8B><EFBFBD><EFBFBD>z<EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD>
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
++sq;
|
||||
}
|
||||
@@ -341,7 +345,9 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th
|
||||
set_state(st);
|
||||
|
||||
assert(pos_is_ok());
|
||||
#if defined(EVAL_NNUE)
|
||||
assert(evalList.is_valid(*this));
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
return *this;
|
||||
}
|
||||
@@ -762,8 +768,10 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
++st->rule50;
|
||||
++st->pliesFromNull;
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
st->accumulator.computed_accumulation = false;
|
||||
st->accumulator.computed_score = false;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
Color us = sideToMove;
|
||||
Color them = ~us;
|
||||
@@ -776,8 +784,10 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
assert(captured == NO_PIECE || color_of(captured) == (type_of(m) != CASTLING ? them : us));
|
||||
assert(type_of(captured) != KING);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
auto& dp = st->dirtyPiece;
|
||||
dp.dirty_num = 1;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
if (type_of(m) == CASTLING)
|
||||
{
|
||||
@@ -795,7 +805,9 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
{
|
||||
Square capsq = to;
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber piece_no1;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
// If the captured piece is a pawn, update pawn hash key, otherwise
|
||||
// update non-pawn material.
|
||||
@@ -811,12 +823,16 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
assert(piece_on(to) == NO_PIECE);
|
||||
assert(piece_on(capsq) == make_piece(them, PAWN));
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
piece_no1 = piece_no_of(capsq);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
board[capsq] = NO_PIECE; // Not done by remove_piece()
|
||||
}
|
||||
else {
|
||||
#if defined(EVAL_NNUE)
|
||||
piece_no1 = piece_no_of(capsq);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
st->pawnKey ^= Zobrist::psq[captured][capsq];
|
||||
@@ -824,7 +840,9 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
else {
|
||||
st->nonPawnMaterial[them] -= PieceValue[MG][captured];
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
piece_no1 = piece_no_of(capsq);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
// Update board and piece lists
|
||||
@@ -838,6 +856,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
// Reset rule 50 counter
|
||||
st->rule50 = 0;
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
dp.dirty_num = 2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32>
|
||||
|
||||
dp.pieceNo[1] = piece_no1;
|
||||
@@ -850,6 +869,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
// will not be overritten to pc if the move type is enpassant.
|
||||
evalList.piece_no_list_board[capsq] = PIECE_NUMBER_NB;
|
||||
dp.changed_piece[1].new_piece = evalList.bona_piece(piece_no1);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
// Update hash key
|
||||
@@ -872,14 +892,18 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
|
||||
// Move the piece. The tricky Chess960 castling is handled earlier
|
||||
if (type_of(m) != CASTLING) {
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber piece_no0 = piece_no_of(from);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
move_piece(pc, from, to);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
dp.pieceNo[0] = piece_no0;
|
||||
dp.changed_piece[0].old_piece = evalList.bona_piece(piece_no0);
|
||||
evalList.put_piece(piece_no0, to, pc);
|
||||
dp.changed_piece[0].new_piece = evalList.bona_piece(piece_no0);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
// If the moving piece is a pawn do some special extra work
|
||||
@@ -903,11 +927,13 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
remove_piece(pc, to);
|
||||
put_piece(promotion, to);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber piece_no0 = piece_no_of(to);
|
||||
dp.pieceNo[0] = piece_no0;
|
||||
dp.changed_piece[0].old_piece = evalList.bona_piece(piece_no0);
|
||||
evalList.put_piece(piece_no0, to, promotion);
|
||||
dp.changed_piece[0].new_piece = evalList.bona_piece(piece_no0);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
// Update hash keys
|
||||
k ^= Zobrist::psq[pc][to] ^ Zobrist::psq[promotion][to];
|
||||
@@ -960,7 +986,9 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
}
|
||||
|
||||
assert(pos_is_ok());
|
||||
#if defined(EVAL_NNUE)
|
||||
assert(evalList.is_valid(*this));
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
|
||||
@@ -991,8 +1019,10 @@ void Position::undo_move(Move m) {
|
||||
pc = make_piece(us, PAWN);
|
||||
put_piece(pc, to);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber piece_no0 = st->dirtyPiece.pieceNo[0];
|
||||
evalList.put_piece(piece_no0, to, pc);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
if (type_of(m) == CASTLING)
|
||||
@@ -1005,8 +1035,10 @@ void Position::undo_move(Move m) {
|
||||
|
||||
move_piece(pc, to, from); // Put the piece back at the source square
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber piece_no0 = st->dirtyPiece.pieceNo[0];
|
||||
evalList.put_piece(piece_no0, from, pc);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
if (st->capturedPiece)
|
||||
{
|
||||
@@ -1025,10 +1057,12 @@ void Position::undo_move(Move m) {
|
||||
|
||||
put_piece(st->capturedPiece, capsq); // Restore the captured piece
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber piece_no1 = st->dirtyPiece.pieceNo[1];
|
||||
assert(evalList.bona_piece(piece_no1).fw == Eval::BONA_PIECE_ZERO);
|
||||
assert(evalList.bona_piece(piece_no1).fb == Eval::BONA_PIECE_ZERO);
|
||||
evalList.put_piece(piece_no1, capsq, st->capturedPiece);
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1037,7 +1071,9 @@ void Position::undo_move(Move m) {
|
||||
--gamePly;
|
||||
|
||||
assert(pos_is_ok());
|
||||
#if defined(EVAL_NNUE)
|
||||
assert(evalList.is_valid(*this));
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
|
||||
@@ -1045,6 +1081,7 @@ void Position::undo_move(Move m) {
|
||||
/// is a bit tricky in Chess960 where from/to squares can overlap.
|
||||
template<bool Do>
|
||||
void Position::do_castling(Color us, Square from, Square& to, Square& rfrom, Square& rto) {
|
||||
#if defined(EVAL_NNUE)
|
||||
auto& dp = st->dirtyPiece;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>Z<EFBFBD>̂<EFBFBD><CC82>߂Ɉړ<C988><DA93><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>StateInfo<66>ɋL<C98B>^<5E><><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>B
|
||||
dp.dirty_num = 2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32>
|
||||
@@ -1056,16 +1093,19 @@ void Position::do_castling(Color us, Square from, Square& to, Square& rfrom, Squ
|
||||
piece_no0 = piece_no_of(from);
|
||||
piece_no1 = piece_no_of(to);
|
||||
}
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
bool kingSide = to > from;
|
||||
rfrom = to; // Castling is encoded as "king captures friendly rook"
|
||||
rto = relative_square(us, kingSide ? SQ_F1 : SQ_D1);
|
||||
to = relative_square(us, kingSide ? SQ_G1 : SQ_C1);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
if (!Do) {
|
||||
piece_no0 = piece_no_of(to);
|
||||
piece_no1 = piece_no_of(rto);
|
||||
}
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
// Remove both pieces first since squares could overlap in Chess960
|
||||
remove_piece(make_piece(us, KING), Do ? from : to);
|
||||
@@ -1074,6 +1114,7 @@ void Position::do_castling(Color us, Square from, Square& to, Square& rfrom, Squ
|
||||
put_piece(make_piece(us, KING), Do ? to : from);
|
||||
put_piece(make_piece(us, ROOK), Do ? rto : rfrom);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
if (Do) {
|
||||
dp.pieceNo[0] = piece_no0;
|
||||
dp.changed_piece[0].old_piece = evalList.bona_piece(piece_no0);
|
||||
@@ -1089,6 +1130,7 @@ void Position::do_castling(Color us, Square from, Square& to, Square& rfrom, Squ
|
||||
evalList.put_piece(piece_no0, from, make_piece(us, KING));
|
||||
evalList.put_piece(piece_no1, rfrom, make_piece(us, ROOK));
|
||||
}
|
||||
#endif // defined(EVAL_NNUE)
|
||||
}
|
||||
|
||||
|
||||
@@ -1426,6 +1468,7 @@ bool Position::pos_is_ok() const {
|
||||
return true;
|
||||
}
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber Position::piece_no_of(Square sq) const
|
||||
{
|
||||
if (piece_on(sq) == NO_PIECE) {
|
||||
@@ -1436,3 +1479,4 @@ PieceNumber Position::piece_no_of(Square sq) const
|
||||
assert(is_ok(n));
|
||||
return n;
|
||||
}
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
@@ -59,10 +59,12 @@ struct StateInfo {
|
||||
Bitboard pinners[COLOR_NB];
|
||||
Bitboard checkSquares[PIECE_TYPE_NB];
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
Eval::NNUE::Accumulator accumulator;
|
||||
|
||||
// <20>]<5D><><EFBFBD>l<EFBFBD>̍<EFBFBD><CC8D><EFBFBD><EFBFBD>v<EFBFBD>Z<EFBFBD>̊Ǘ<CC8A><C797>p
|
||||
Eval::DirtyPiece dirtyPiece;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
};
|
||||
|
||||
/// A list to keep track of the position states along the setup moves (from the
|
||||
@@ -174,6 +176,7 @@ public:
|
||||
bool pos_is_ok() const;
|
||||
void flip();
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
// --- StateInfo
|
||||
|
||||
// <20><><EFBFBD>݂̋ǖʂɑΉ<C991><CE89><EFBFBD><EFBFBD><EFBFBD>StateInfo<66><6F><EFBFBD>Ԃ<EFBFBD><D482>B
|
||||
@@ -182,6 +185,7 @@ public:
|
||||
|
||||
// <20>]<5D><><EFBFBD><EFBFBD><D690>Ŏg<C58E><67><EFBFBD><EFBFBD><EFBFBD>߂́A<CC81>ǂ̋<C782><CC8B>ԍ<EFBFBD><D48D>̋<CC8B>ǂ<EFBFBD><C782>ɂ<EFBFBD><C982>邩<EFBFBD>Ȃǂ̏<C782><CC8F><EFBFBD><EFBFBD>B
|
||||
const Eval::EvalList* eval_list() const { return &evalList; }
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
private:
|
||||
// Initialization helpers (used while setting up a position)
|
||||
@@ -196,8 +200,10 @@ private:
|
||||
template<bool Do>
|
||||
void do_castling(Color us, Square from, Square& to, Square& rfrom, Square& rto);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
// <20>Տ<EFBFBD><D58F><EFBFBD>sq<73>̏<EFBFBD><CC8F>ɂ<EFBFBD><C982><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PieceNumber<65><72><EFBFBD>Ԃ<EFBFBD><D482>B
|
||||
PieceNumber piece_no_of(Square sq) const;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
// Data members
|
||||
Piece board[SQUARE_NB];
|
||||
@@ -216,8 +222,10 @@ private:
|
||||
StateInfo* st;
|
||||
bool chess960;
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
// <20>]<5D><><EFBFBD><EFBFBD><D690>ŗp<C597><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃<EFBFBD><CC83>X<EFBFBD>g
|
||||
Eval::EvalList evalList;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
};
|
||||
|
||||
namespace PSQT {
|
||||
|
||||
@@ -464,6 +464,7 @@ constexpr bool is_ok(Move m) {
|
||||
return from_sq(m) != to_sq(m); // Catch MOVE_NULL and MOVE_NONE
|
||||
}
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
// --------------------
|
||||
// <20>
|
||||
// --------------------
|
||||
@@ -493,5 +494,6 @@ inline PieceNumber& operator--(PieceNumber& d) { return d = PieceNumber(int8_t(d
|
||||
|
||||
// PieceNumber<65>̐<EFBFBD><CC90><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̌<EFBFBD><CC8C><EFBFBD><EFBFBD>Bassert<72>p<EFBFBD>B
|
||||
constexpr bool is_ok(PieceNumber pn) { return pn < PIECE_NUMBER_NB; }
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
#endif // #ifndef TYPES_H_INCLUDED
|
||||
|
||||
@@ -184,6 +184,7 @@ namespace {
|
||||
// <20>ǖʂ͏<CA82><CD8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>̂Œ<CC82><C592>ӁB
|
||||
void is_ready(Position& pos, istringstream& is, StateListPtr& states)
|
||||
{
|
||||
#if defined(EVAL_NNUE)
|
||||
// "isready"<22><><EFBFBD><EFBFBD><F382AF8E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƁA"readyok"<22><><EFBFBD>Ԃ<EFBFBD><D482>܂<EFBFBD>5<EFBFBD>b<EFBFBD><62><EFBFBD>Ƃɉ<C682><C989>s<EFBFBD>𑗂<EFBFBD><F0919782>悤<EFBFBD>ɏC<C98F><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B(keep alive<76>I<EFBFBD>ȏ<EFBFBD><C88F><EFBFBD>)
|
||||
// USI2.0<EFBFBD>̎d<EFBFBD>l<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// -"isready"<22>̂<EFBFBD><CC82>Ƃ<EFBFBD>time out<75><74><EFBFBD>Ԃ́A30<33>b<EFBFBD><62><EFBFBD>x<EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F092B482>āA<C481>]<5D><><EFBFBD><EFBFBD><D690>̏<EFBFBD><CC8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ahash<73>e<EFBFBD>[<5B>u<EFBFBD><75><EFBFBD>̊m<CC8A>ۂ<EFBFBD><DB82><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꍇ<EFBFBD>A
|
||||
@@ -241,6 +242,7 @@ namespace {
|
||||
// keep alive<76>𑗐M<F0919790><4D><EFBFBD>邽<EFBFBD>߂ɐ<DF82><C990><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD>b<EFBFBD>h<EFBFBD><68><EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>ҋ@<40><><EFBFBD><EFBFBD><EFBFBD>B
|
||||
ended = true;
|
||||
th.join();
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
sync_cout << "readyok" << sync_endl;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user