mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-20 17:16:33 +08:00
More comment translation
including 11 files in /src
This commit is contained in:
@@ -945,7 +945,7 @@ ExtBonaPiece kpp_board_index[PIECE_NB] = {
|
||||
{ f_king, e_king },
|
||||
{ BONA_PIECE_ZERO, BONA_PIECE_ZERO },
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD>肩<EFBFBD>猩<EFBFBD><EFBFBD><EFBFBD>ꍇ<EFBFBD>Bf<EFBFBD><EFBFBD>e<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ւ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// When viewed from behind. f and e are exchanged.
|
||||
{ BONA_PIECE_ZERO, BONA_PIECE_ZERO },
|
||||
{ e_pawn, f_pawn },
|
||||
{ e_knight, f_knight },
|
||||
@@ -953,11 +953,11 @@ ExtBonaPiece kpp_board_index[PIECE_NB] = {
|
||||
{ e_rook, f_rook },
|
||||
{ e_queen, f_queen },
|
||||
{ e_king, f_king },
|
||||
{ BONA_PIECE_ZERO, BONA_PIECE_ZERO }, // <EFBFBD><EFBFBD><EFBFBD>̐<EFBFBD><EFBFBD><EFBFBD><EFBFBD>͂Ȃ<EFBFBD>
|
||||
{ BONA_PIECE_ZERO, BONA_PIECE_ZERO }, // no money
|
||||
};
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŕێ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD>pieceListFw[]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BonaPiece<63>ł<EFBFBD><C582>邩<EFBFBD><E982A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// <EFBFBD><EFBFBD> : <20>f<EFBFBD>o<EFBFBD>b<EFBFBD>O<EFBFBD>p<EFBFBD>B<EFBFBD>x<EFBFBD><78><EFBFBD>B
|
||||
// Check whether the pieceListFw[] held internally is a correct BonaPiece.
|
||||
// Note: For debugging. slow.
|
||||
bool EvalList::is_valid(const Position& pos)
|
||||
{
|
||||
std::set<PieceNumber> piece_numbers;
|
||||
@@ -973,28 +973,28 @@ bool EvalList::is_valid(const Position& pos)
|
||||
for (int i = 0; i < length(); ++i)
|
||||
{
|
||||
BonaPiece fw = pieceListFw[i];
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>fw<EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD>ɑ<EFBFBD><C991>݂<EFBFBD><DD82>邩<EFBFBD><E982A9>Position<6F>N<EFBFBD><4E><EFBFBD>X<EFBFBD>̂ق<CC82><D982>ɒ<EFBFBD><C992>ׂɍs<C98D><73><EFBFBD>B
|
||||
// Go to the Position class to see if this fw really exists.
|
||||
|
||||
if (fw == Eval::BONA_PIECE_ZERO) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// <EFBFBD>͈͊O
|
||||
// Out of range
|
||||
if (!(0 <= fw && fw < fe_end))
|
||||
return false;
|
||||
|
||||
// <EFBFBD>Տ<EFBFBD><EFBFBD>̋<EFBFBD><EFBFBD>Ȃ̂ł<EFBFBD><EFBFBD>̋<EFBFBD>{<7B><><EFBFBD>ɑ<EFBFBD><C991>݂<EFBFBD><DD82>邩<EFBFBD><E982A9><EFBFBD>ׂɂ<D782><C982><EFBFBD><EFBFBD>B
|
||||
// Since it is a piece on the board, I will check if this piece really exists.
|
||||
for (Piece pc = NO_PIECE; pc < PIECE_NB; ++pc)
|
||||
{
|
||||
auto pt = type_of(pc);
|
||||
if (pt == NO_PIECE_TYPE || pt == 7) // <EFBFBD><EFBFBD><EFBFBD>݂<EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD><EFBFBD>
|
||||
if (pt == NO_PIECE_TYPE || pt == 7) // non-existing piece
|
||||
continue;
|
||||
|
||||
// <EFBFBD><EFBFBD>pc<EFBFBD><EFBFBD>BonaPiece<EFBFBD>̊J<EFBFBD>n<EFBFBD>ԍ<EFBFBD>
|
||||
// BonaPiece start number of piece pc
|
||||
auto s = BonaPiece(kpp_board_index[pc].fw);
|
||||
if (s <= fw && fw < s + SQUARE_NB)
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ł<EFBFBD><EFBFBD>̋sq<EFBFBD>̒n<EFBFBD>_<EFBFBD>ɂ<EFBFBD><EFBFBD>邩<EFBFBD>ׂ<EFBFBD><EFBFBD>B
|
||||
// Since it was found, check if this piece is at sq.
|
||||
Square sq = (Square)(fw - s);
|
||||
Piece pc2 = pos.piece_on(sq);
|
||||
|
||||
@@ -1004,7 +1004,7 @@ bool EvalList::is_valid(const Position& pos)
|
||||
goto Found;
|
||||
}
|
||||
}
|
||||
// <EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>݂<EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
|
||||
// It was a piece that did not exist for some reason..
|
||||
return false;
|
||||
Found:;
|
||||
}
|
||||
|
||||
112
src/evaluate.h
112
src/evaluate.h
@@ -38,39 +38,39 @@ void evaluate_with_no_return(const Position& pos);
|
||||
Value compute_eval(const Position& pos);
|
||||
|
||||
#if defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
||||
// <EFBFBD>]<5D><><EFBFBD><EFBFBD><D690>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>ǂݍ<C782><DD8D>ށB
|
||||
// <EFBFBD><EFBFBD><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
|
||||
// (<EFBFBD><EFBFBD><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)
|
||||
// Read the evaluation function file.
|
||||
// This is only called once in response to the "is_ready" command. It is not supposed to be called twice.
|
||||
// (However, if isready is sent again after EvalDir (evaluation function folder) has been changed, read it again.)
|
||||
void load_eval();
|
||||
|
||||
static uint64_t calc_check_sum() { return 0; }
|
||||
static uint64_t calc_check_sum() {return 0;}
|
||||
|
||||
static void print_softname(uint64_t check_sum) {}
|
||||
|
||||
// --- <EFBFBD>]<5D><><EFBFBD><EFBFBD><D690>Ŏg<C58E><67><EFBFBD>萔 KPP(<28>ʂƔC<C694><43>2<EFBFBD><32>)<29><>P<EFBFBD>ɑ<EFBFBD><C991><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>enum
|
||||
// --- enum corresponding to P of constant KPP (ball and arbitrary 2 pieces) used in evaluation function
|
||||
|
||||
// (<EFBFBD>]<5D><><EFBFBD><EFBFBD><D690>̎<EFBFBD><CC8E><EFBFBD><EFBFBD>̂Ƃ<CC82><C682>ɂ́ABonaPiece<63>͎<EFBFBD><CD8E>R<EFBFBD>ɒ<EFBFBD><C992>`<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ł<CC82><C582><EFBFBD><EFBFBD>ł͒<C582><CD92>`<60><><EFBFBD>Ȃ<EFBFBD><C882>B)
|
||||
// (BonaPiece wants to define freely in experiment of evaluation function, so I don't define it here.)
|
||||
|
||||
|
||||
// Bonanza<EFBFBD><EFBFBD>KKP/KPP<50>ƌ<EFBFBD><C68C><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD>P(Piece)<29><><EFBFBD>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>^<5E>B
|
||||
// <EFBFBD><EFBFBD> KPP<50><50><EFBFBD><EFBFBD><EFBFBD>߂<EFBFBD><DF82>Ƃ<EFBFBD><C682>ɁA39<33>̒n<CC92>_<EFBFBD>̕<EFBFBD><CC95>̂悤<CC82>ɁA<C981><41><EFBFBD>~<7E><><EFBFBD><EFBFBD><EFBFBD>ɑ<C991><CE82>Ĉ<EFBFBD><C488>ӂȔԍ<C894><D48D><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD>ƂȂ<C682><C882>B
|
||||
// A type that represents P(Piece) when calling KKP/KPP in Bonanza.
|
||||
// When you ask for <20><> KPP, you need a unique number for each box <20>~ piece type, like the step at 39 points.
|
||||
enum BonaPiece : int32_t
|
||||
{
|
||||
// f = friend(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>̈Ӗ<CC88><D396>Be = enemy(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>̈Ӗ<CC88>
|
||||
// Meaning of f = friend (<28><>first move). Meaning of e = enemy (<28><>rear)
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̎<EFBFBD><EFBFBD>̒l
|
||||
// Value when uninitialized
|
||||
BONA_PIECE_NOT_INIT = -1,
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȋ<EFBFBD><EFBFBD>B<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂Ƃ<EFBFBD><EFBFBD>Ȃǂ́A<EFBFBD>s<EFBFBD>v<EFBFBD>ȋ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ɉړ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// Invalid piece. When you drop a piece, move unnecessary pieces here.
|
||||
BONA_PIECE_ZERO = 0,
|
||||
|
||||
fe_hand_end = BONA_PIECE_ZERO + 1,
|
||||
|
||||
// Bonanza<7A>̂悤<CC82>ɔՏ<C994><D58F>̂<EFBFBD><CC82>肦<EFBFBD>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD>̕<EFBFBD><CC95>⍁<EFBFBD>̔ԍ<CC94><D48D><EFBFBD><EFBFBD>l<EFBFBD>߂Ȃ<DF82><C882>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD>R1) <20>w<EFBFBD>K<EFBFBD>̂Ƃ<CC82><C682>ɑ<EFBFBD><C991><EFBFBD>PP<50><50>1<EFBFBD>i<EFBFBD>ڂɍ<DA82><C98D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>āA<C481><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>ϊ<EFBFBD><CF8A>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>Đ<EFBFBD><C490><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><CC82><EFBFBD><EF82B5><EFBFBD>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD>R2) <20>c<EFBFBD>^Bitboard<72><64><EFBFBD><EFBFBD>Square<72><65><EFBFBD><EFBFBD><EFBFBD>̕ϊ<CC95><CF8A>ɍ<EFBFBD><C98D><EFBFBD><EFBFBD>B
|
||||
// Don't pack the numbers of unrealistic walks and incense on the board like Bonanza.
|
||||
// Reason 1) When learning, there are times when the incense is on the first stage in relative PP, and it is difficult to display it correctly in the inverse transformation.
|
||||
// Reason 2) It is difficult to convert from Square with vertical Bitboard.
|
||||
|
||||
// --- <EFBFBD>Տ<EFBFBD><EFBFBD>̋<EFBFBD>
|
||||
// --- Pieces on the board
|
||||
f_pawn = fe_hand_end,
|
||||
e_pawn = f_pawn + SQUARE_NB,
|
||||
f_knight = e_pawn + SQUARE_NB,
|
||||
@@ -84,7 +84,7 @@ enum BonaPiece : int32_t
|
||||
fe_end = e_queen + SQUARE_NB,
|
||||
f_king = fe_end,
|
||||
e_king = f_king + SQUARE_NB,
|
||||
fe_end2 = e_king + SQUARE_NB, // <EFBFBD>ʂ<EFBFBD><EFBFBD>܂߂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̔ԍ<EFBFBD><EFBFBD>B
|
||||
fe_end2 = e_king + SQUARE_NB, // Last number including balls.
|
||||
};
|
||||
|
||||
#define ENABLE_INCR_OPERATORS_ON(T) \
|
||||
@@ -95,8 +95,8 @@ ENABLE_INCR_OPERATORS_ON(BonaPiece)
|
||||
|
||||
#undef ENABLE_INCR_OPERATORS_ON
|
||||
|
||||
// BonaPiece<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>肩<EFBFBD>猩<EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>39<33>̕<EFBFBD><CC95><EFBFBD><EFBFBD><EFBFBD><EFBFBD>肩<EFBFBD>猩<EFBFBD><E78CA9><EFBFBD>ƌ<EFBFBD><C68C><EFBFBD><EFBFBD><EFBFBD>71<37>̕<EFBFBD>)<29>̔ԍ<CC94><D48D>Ƃ<EFBFBD>
|
||||
// <EFBFBD>y<EFBFBD>A<EFBFBD>ɂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD>ExtBonaPiece<EFBFBD>^<5E>ƌĂԂ<C482><D482>Ƃɂ<C682><C982><EFBFBD><EFBFBD>B
|
||||
// The number when you look at BonaPiece from the back (the number of steps from the previous 39 to the number 71 from the back)
|
||||
// Let's call the paired one the ExtBonaPiece type.
|
||||
union ExtBonaPiece
|
||||
{
|
||||
struct {
|
||||
@@ -109,28 +109,28 @@ union ExtBonaPiece
|
||||
ExtBonaPiece(BonaPiece fw_, BonaPiece fb_) : fw(fw_), fb(fb_) {}
|
||||
};
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̎w<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ăǂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǂ<EFBFBD><EFBFBD>Ɉړ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><EFBFBD>̏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ExtBonaPiece<EFBFBD>\<5C><><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>B
|
||||
// Information about where the piece has moved from where to by this move.
|
||||
// Assume the piece is an ExtBonaPiece expression.
|
||||
struct ChangedBonaPiece
|
||||
{
|
||||
ExtBonaPiece old_piece;
|
||||
ExtBonaPiece new_piece;
|
||||
};
|
||||
|
||||
// KPP<EFBFBD>e<EFBFBD>[<5B>u<EFBFBD><75><EFBFBD>̔Տ<CC94><D58F>̋<EFBFBD>pc<70>ɑΉ<C991><CE89><EFBFBD><EFBFBD><EFBFBD>BonaPiece<63><65><EFBFBD><EFBFBD><EFBFBD>߂邽<DF82>߂̔z<CC94><7A><EFBFBD>B
|
||||
// <EFBFBD><EFBFBD>)
|
||||
// BonaPiece fb = kpp_board_index[pc].fb + sq; // <EFBFBD><EFBFBD><EFBFBD>肩<EFBFBD>猩<EFBFBD><EFBFBD>sq<EFBFBD>ɂ<EFBFBD><EFBFBD><EFBFBD>pc<EFBFBD>ɑΉ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BonaPiece
|
||||
// BonaPiece fw = kpp_board_index[pc].fw + sq; // <EFBFBD><EFBFBD><EFBFBD>肩<EFBFBD>猩<EFBFBD><EFBFBD>sq<EFBFBD>ɂ<EFBFBD><EFBFBD><EFBFBD>pc<EFBFBD>ɑΉ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BonaPiece
|
||||
// An array for finding the BonaPiece corresponding to the piece pc on the board of the KPP table.
|
||||
// example)
|
||||
// BonaPiece fb = kpp_board_index[pc].fb + sq; // BonaPiece corresponding to pc in sq seen from the front
|
||||
// BonaPiece fw = kpp_board_index[pc].fw + sq; // BonaPiece corresponding to pc in sq seen from behind
|
||||
extern ExtBonaPiece kpp_board_index[PIECE_NB];
|
||||
|
||||
// <EFBFBD>]<5D><><EFBFBD><EFBFBD><D690>ŗp<C597><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>B<EFBFBD>ǂ̋<C782>(PieceNumber)<29><><EFBFBD>ǂ<EFBFBD><C782>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>̂<EFBFBD>(BonaPiece)<29><><EFBFBD>ێ<EFBFBD><DB8E><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>\<5C><><EFBFBD><EFBFBD>
|
||||
// List of pieces used in the evaluation function. A structure holding which piece (PieceNumber) is where (BonaPiece)
|
||||
struct EvalList
|
||||
{
|
||||
// <EFBFBD>]<5D><><EFBFBD><EFBFBD>(FV38<33>^)<29>ŗp<C597><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԍ<EFBFBD><D48D>̃<EFBFBD><CC83>X<EFBFBD>g
|
||||
// List of frame numbers used in evaluation function (FV38 type)
|
||||
BonaPiece* piece_list_fw() const { return const_cast<BonaPiece*>(pieceListFw); }
|
||||
BonaPiece* piece_list_fb() const { return const_cast<BonaPiece*>(pieceListFb); }
|
||||
|
||||
// <EFBFBD>w<EFBFBD>肳<EFBFBD>ꂽpiece_no<EFBFBD>̋<EFBFBD><EFBFBD><EFBFBD>ExtBonaPiece<EFBFBD>^<5E>ɕϊ<C995><CF8A><EFBFBD><EFBFBD>ĕԂ<C495><D482>B
|
||||
// Convert the specified piece_no piece to ExtBonaPiece type and return it.
|
||||
ExtBonaPiece bona_piece(PieceNumber piece_no) const
|
||||
{
|
||||
ExtBonaPiece bp;
|
||||
@@ -139,36 +139,36 @@ struct EvalList
|
||||
return bp;
|
||||
}
|
||||
|
||||
// <EFBFBD>Տ<EFBFBD><EFBFBD><EFBFBD>sq<EFBFBD>̏<EFBFBD><EFBFBD><EFBFBD>piece_no<EFBFBD><EFBFBD>pc<EFBFBD>̋<EFBFBD><EFBFBD><EFBFBD><EFBFBD>z<EFBFBD>u<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// Place the piece_no pc piece in the sq box on the board
|
||||
void put_piece(PieceNumber piece_no, Square sq, Piece pc) {
|
||||
set_piece_on_board(piece_no, BonaPiece(kpp_board_index[pc].fw + sq), BonaPiece(kpp_board_index[pc].fb + Inv(sq)), sq);
|
||||
}
|
||||
|
||||
// <EFBFBD>Տ<EFBFBD><EFBFBD>̂<EFBFBD><EFBFBD>鏡sq<EFBFBD>ɑΉ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PieceNumber<EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD>B
|
||||
// Returns the PieceNumber corresponding to a box on the board.
|
||||
PieceNumber piece_no_of_board(Square sq) const { return piece_no_list_board[sq]; }
|
||||
|
||||
// pieceList<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɑΉ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鎞<EFBFBD>̂<EFBFBD><EFBFBD>߂ɁA<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>p<EFBFBD>̋<EFBFBD><EFBFBD>̒l<EFBFBD><EFBFBD>BONA_PIECE_ZERO<EFBFBD>ɂ<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// <EFBFBD>ʏ<EFBFBD><EFBFBD>̕]<5D><><EFBFBD><EFBFBD><D690><EFBFBD><EFBFBD><EFBFBD><EE978E><EFBFBD>̕]<5D><><EFBFBD><EFBFBD><D690>Ƃ<EFBFBD><C682>ė<EFBFBD><C497>p<EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>B
|
||||
// piece_no_list<EFBFBD>̂ق<EFBFBD><EFBFBD>̓f<EFBFBD>o<EFBFBD>b<EFBFBD>O<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD><EFBFBD>PIECE_NUMBER_NB<EFBFBD>ŏ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// Initialize the pieceList.
|
||||
// Set the value of unused pieces to BONA_PIECE_ZERO in case you want to deal with dropped pieces.
|
||||
// A normal evaluation function can be used as an evaluation function for missing frames.
|
||||
// piece_no_list is initialized with PIECE_NUMBER_NB to facilitate debugging.
|
||||
void clear()
|
||||
{
|
||||
|
||||
for (auto& p : pieceListFw)
|
||||
for (auto& p: pieceListFw)
|
||||
p = BONA_PIECE_ZERO;
|
||||
|
||||
for (auto& p : pieceListFb)
|
||||
for (auto& p: pieceListFb)
|
||||
p = BONA_PIECE_ZERO;
|
||||
|
||||
for (auto& v : piece_no_list_board)
|
||||
for (auto& v :piece_no_list_board)
|
||||
v = PIECE_NUMBER_NB;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŕێ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD>pieceListFw[]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BonaPiece<63>ł<EFBFBD><C582>邩<EFBFBD><E982A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// <EFBFBD><EFBFBD> : <20>f<EFBFBD>o<EFBFBD>b<EFBFBD>O<EFBFBD>p<EFBFBD>B<EFBFBD>x<EFBFBD><78><EFBFBD>B
|
||||
// Check whether the pieceListFw[] held internally is a correct BonaPiece.
|
||||
// Note: For debugging. slow.
|
||||
bool is_valid(const Position& pos);
|
||||
|
||||
// <EFBFBD>Տ<EFBFBD>sq<EFBFBD>ɂ<EFBFBD><EFBFBD><EFBFBD>piece_no<EFBFBD>̋<EFBFBD><EFBFBD><EFBFBD>BonaPiece<EFBFBD><EFBFBD>fb,fw<66>ł<EFBFBD><C582>邱<EFBFBD>Ƃ<EFBFBD><C682>ݒ肷<DD92><E882B7><EFBFBD>B
|
||||
// Set that the BonaPiece of the piece_no piece on the board sq is fb,fw.
|
||||
inline void set_piece_on_board(PieceNumber piece_no, BonaPiece fw, BonaPiece fb, Square sq)
|
||||
{
|
||||
assert(is_ok(piece_no));
|
||||
@@ -177,21 +177,21 @@ struct EvalList
|
||||
piece_no_list_board[sq] = piece_no;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>ԍ<EFBFBD>(PieceNumber)<29><><EFBFBD><EFBFBD><EFBFBD>̋<CC8B>ǂ<EFBFBD><C782>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>̂<EFBFBD>(BonaPiece)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BFV38<EFBFBD>Ȃǂŗp<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// Piece list. Piece Number Shows how many pieces are in place (Bona Piece). Used in FV38 etc.
|
||||
|
||||
// <EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>̒<EFBFBD><EFBFBD><EFBFBD>
|
||||
// 38<EFBFBD>Œ<EFBFBD>
|
||||
// Length of piece list
|
||||
// 38 fixed
|
||||
public:
|
||||
int length() const { return PIECE_NUMBER_KING; }
|
||||
|
||||
// VPGATHERDD<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><EFBFBD><EFBFBD>s<EFBFBD><EFBFBD><EFBFBD>A4<EFBFBD>̔{<7B><><EFBFBD>łȂ<C582><C882><EFBFBD><EFBFBD>Ȃ<CE82><C882>Ȃ<EFBFBD><C882>B
|
||||
// <EFBFBD>܂<EFBFBD><EFBFBD>AKPPT<EFBFBD>^<5E>]<5D><><EFBFBD><EFBFBD><D690>Ȃǂ́A39,40<34>Ԗڂ̗v<CC97>f<EFBFBD><66><EFBFBD>[<5B><><EFBFBD>ł<EFBFBD><C582>邱<EFBFBD>Ƃ<EFBFBD><C682>O<EFBFBD><4F><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD>
|
||||
// <EFBFBD>A<EFBFBD>N<EFBFBD>Z<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӏ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂Œ<EFBFBD><EFBFBD>ӂ<EFBFBD><EFBFBD>邱<EFBFBD>ƁB
|
||||
// Must be a multiple of 4 to use VPGATHERDD.
|
||||
// In addition, the KPPT type evaluation function, etc. is based on the assumption that the 39th and 40th elements are zero.
|
||||
// Please note that there is a part that is accessed.
|
||||
static const int MAX_LENGTH = 32;
|
||||
|
||||
// <EFBFBD>Տ<EFBFBD><EFBFBD>̋<EFBFBD><EFBFBD>ɑ<EFBFBD><EFBFBD>āA<EFBFBD><EFBFBD><EFBFBD>̋<EFBFBD><EFBFBD>ԍ<EFBFBD>(PieceNumber)<29><><EFBFBD>ێ<EFBFBD><DB8E><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>z<EFBFBD><7A>
|
||||
// <EFBFBD>ʂ<EFBFBD>SQUARE_NB<EFBFBD>Ɉړ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><EFBFBD>p<EFBFBD><EFBFBD>+1<>܂ŕێ<C595><DB8E><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A
|
||||
// SQUARE_NB<EFBFBD>̋ʂ<EFBFBD><EFBFBD>ړ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>̂ŁA<EFBFBD><EFBFBD><EFBFBD>̒l<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ͂Ȃ<EFBFBD><EFBFBD>͂<EFBFBD><EFBFBD>B
|
||||
// An array that holds the piece number (PieceNumber) for the pieces on the board
|
||||
// Hold up to +1 for when the ball is moving to SQUARE_NB,
|
||||
// SQUARE_NB balls are not moved, so this value should never be used.
|
||||
PieceNumber piece_no_list_board[SQUARE_NB_PLUS1];
|
||||
private:
|
||||
|
||||
@@ -199,20 +199,20 @@ private:
|
||||
BonaPiece pieceListFb[MAX_LENGTH];
|
||||
};
|
||||
|
||||
// <EFBFBD>]<5D><><EFBFBD>l<EFBFBD>̍<EFBFBD><CC8D><EFBFBD><EFBFBD>v<EFBFBD>Z<EFBFBD>̊Ǘ<CC8A><C797>p
|
||||
// <EFBFBD>O<EFBFBD>̋ǖʂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ړ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԍ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǘ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>邽<EFBFBD>߂̍\<5C><><EFBFBD><EFBFBD>
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>́A<EFBFBD>ő<EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>B
|
||||
// For management of evaluation value difference calculation
|
||||
// A structure for managing the number of pieces that have moved from the previous stage
|
||||
// Up to 2 moving pieces.
|
||||
struct DirtyPiece
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD>̋<EFBFBD><EFBFBD>ԍ<EFBFBD><EFBFBD>̋<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>牽<EFBFBD>ɕς<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD>
|
||||
// What changed from the piece with that piece number
|
||||
Eval::ChangedBonaPiece changed_piece[2];
|
||||
|
||||
// dirty<EFBFBD>ɂȂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԍ<EFBFBD>
|
||||
// The number of dirty pieces
|
||||
PieceNumber pieceNo[2];
|
||||
|
||||
// dirty<EFBFBD>ɂȂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// null move<76><65><EFBFBD><EFBFBD>0<EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>肤<EFBFBD><E882A4><EFBFBD>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǝ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃōő<EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>B
|
||||
// The number of dirty files.
|
||||
// It can be 0 for null move.
|
||||
// Up to 2 moving pieces and taken pieces.
|
||||
int dirty_num;
|
||||
|
||||
};
|
||||
|
||||
52
src/misc.cpp
52
src/misc.cpp
@@ -527,11 +527,11 @@ void bindThisThread(size_t idx) {
|
||||
|
||||
} // namespace WinProcGroup
|
||||
|
||||
// 現在時刻を文字列化したもを返す。(評価関数の学習時などに用いる)
|
||||
// Returns a string that represents the current time. (Used when learning evaluation functions)
|
||||
std::string now_string()
|
||||
{
|
||||
// std::ctime(), localtime()を使うと、MSVCでセキュアでないという警告が出る。
|
||||
// C++標準的にはそんなことないはずなのだが…。
|
||||
// Using std::ctime(), localtime() gives a warning that MSVC is not secure.
|
||||
// This shouldn't happen in the C++ standard, but...
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
// C4996 : 'ctime' : This function or variable may be unsafe.Consider using ctime_s instead.
|
||||
@@ -542,7 +542,7 @@ std::string now_string()
|
||||
auto tp = std::chrono::system_clock::to_time_t(now);
|
||||
auto result = string(std::ctime(&tp));
|
||||
|
||||
// 末尾に改行コードが含まれているならこれを除去する
|
||||
// remove line endings if they are included at the end
|
||||
while (*result.rbegin() == '\n' || (*result.rbegin() == '\r'))
|
||||
result.pop_back();
|
||||
return result;
|
||||
@@ -572,31 +572,31 @@ int read_file_to_memory(std::string filename, std::function<void* (uint64_t)> ca
|
||||
|
||||
fs.seekg(0, fstream::end);
|
||||
uint64_t eofPos = (uint64_t)fs.tellg();
|
||||
fs.clear(); // これをしないと次のseekに失敗することがある。
|
||||
fs.clear(); // Otherwise the next seek may fail.
|
||||
fs.seekg(0, fstream::beg);
|
||||
uint64_t begPos = (uint64_t)fs.tellg();
|
||||
uint64_t file_size = eofPos - begPos;
|
||||
//std::cout << "filename = " << filename << " , file_size = " << file_size << endl;
|
||||
|
||||
// ファイルサイズがわかったのでcallback_funcを呼び出してこの分のバッファを確保してもらい、
|
||||
// そのポインターをもらう。
|
||||
// I know the file size, so call callback_func to get a buffer for this,
|
||||
// Get the pointer.
|
||||
void* ptr = callback_func(file_size);
|
||||
|
||||
// バッファが確保できなかった場合や、想定していたファイルサイズと異なった場合は、
|
||||
// nullptrを返すことになっている。このとき、読み込みを中断し、エラーリターンする。
|
||||
// If the buffer could not be secured, or if the file size is different from the expected file size,
|
||||
// It is supposed to return nullptr. At this time, reading is interrupted and an error is returned.
|
||||
if (ptr == nullptr)
|
||||
return 2;
|
||||
|
||||
// 細切れに読み込む
|
||||
// read in pieces
|
||||
|
||||
const uint64_t block_size = 1024 * 1024 * 1024; // 1回のreadで読み込む要素の数(1GB)
|
||||
const uint64_t block_size = 1024 * 1024 * 1024; // number of elements to read in one read (1GB)
|
||||
for (uint64_t pos = 0; pos < file_size; pos += block_size)
|
||||
{
|
||||
// 今回読み込むサイズ
|
||||
// size to read this time
|
||||
uint64_t read_size = (pos + block_size < file_size) ? block_size : (file_size - pos);
|
||||
fs.read((char*)ptr + pos, read_size);
|
||||
|
||||
// ファイルの途中で読み込みエラーに至った。
|
||||
// Read error occurred in the middle of the file.
|
||||
if (fs.fail())
|
||||
return 2;
|
||||
|
||||
@@ -613,10 +613,10 @@ int write_memory_to_file(std::string filename, void* ptr, uint64_t size)
|
||||
if (fs.fail())
|
||||
return 1;
|
||||
|
||||
const uint64_t block_size = 1024 * 1024 * 1024; // 1回のwriteで書き出す要素の数(1GB)
|
||||
const uint64_t block_size = 1024 * 1024 * 1024; // number of elements to write in one write (1GB)
|
||||
for (uint64_t pos = 0; pos < size; pos += block_size)
|
||||
{
|
||||
// 今回書き出すメモリサイズ
|
||||
// Memory size to write this time
|
||||
uint64_t write_size = (pos + block_size < size) ? block_size : (size - pos);
|
||||
fs.write((char*)ptr + pos, write_size);
|
||||
//cout << ".";
|
||||
@@ -629,17 +629,17 @@ int write_memory_to_file(std::string filename, void* ptr, uint64_t size)
|
||||
// mkdir wrapper
|
||||
// ----------------------------
|
||||
|
||||
// カレントフォルダ相対で指定する。成功すれば0、失敗すれば非0が返る。
|
||||
// フォルダを作成する。日本語は使っていないものとする。
|
||||
// どうもmsys2環境下のgccだと_wmkdir()だとフォルダの作成に失敗する。原因不明。
|
||||
// 仕方ないので_mkdir()を用いる。
|
||||
// Specify relative to the current folder. Returns 0 on success, non-zero on failure.
|
||||
// Create a folder. Japanese is not used.
|
||||
// In case of gcc under msys2 environment, folder creation fails with _wmkdir(). Cause unknown.
|
||||
// Use _mkdir() because there is no help for it.
|
||||
|
||||
#if defined(_WIN32)
|
||||
// Windows用
|
||||
// for Windows
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#include <codecvt> // mkdirするのにwstringが欲しいのでこれが必要
|
||||
#include <locale> // wstring_convertにこれが必要。
|
||||
#include <codecvt> // I need this because I want wstring to mkdir
|
||||
#include <locale> // This is required for wstring_convert.
|
||||
|
||||
namespace Dependency {
|
||||
int mkdir(std::string dir_name)
|
||||
@@ -663,9 +663,9 @@ namespace Dependency {
|
||||
#endif
|
||||
#elif defined(__linux__)
|
||||
|
||||
// linux環境において、この_LINUXというシンボルはmakefileにて定義されるものとする。
|
||||
// In the linux environment, this symbol _LINUX is defined in the makefile.
|
||||
|
||||
// Linux用のmkdir実装。
|
||||
// mkdir implementation for Linux.
|
||||
#include "sys/stat.h"
|
||||
|
||||
namespace Dependency {
|
||||
@@ -676,8 +676,8 @@ namespace Dependency {
|
||||
}
|
||||
#else
|
||||
|
||||
// Linux環境かどうかを判定するためにはmakefileを分けないといけなくなってくるな..
|
||||
// linuxでフォルダ掘る機能は、とりあえずナシでいいや..。評価関数ファイルの保存にしか使ってないし…。
|
||||
// In order to judge whether it is a Linux environment, we have to divide the makefile..
|
||||
// The function to dig a folder on linux is good for the time being... Only used to save the evaluation function file...
|
||||
|
||||
namespace Dependency {
|
||||
int mkdir(std::string dir_name)
|
||||
|
||||
86
src/misc.h
86
src/misc.h
@@ -115,15 +115,14 @@ public:
|
||||
/// Output values only have 1/8th of their bits set on average.
|
||||
template<typename T> T sparse_rand()
|
||||
{ return T(rand64() & rand64() & rand64()); }
|
||||
|
||||
// 0からn-1までの乱数を返す。(一様分布ではないが現実的にはこれで十分)
|
||||
// Returns a random number from 0 to n-1. (Not uniform distribution, but this is enough in reality)
|
||||
uint64_t rand(uint64_t n) { return rand<uint64_t>() % n; }
|
||||
|
||||
// 内部で使用している乱数seedを返す。
|
||||
// Return the random seed used internally.
|
||||
uint64_t get_seed() const { return s; }
|
||||
};
|
||||
|
||||
// 乱数のseedを表示する。(デバッグ用)
|
||||
// Display a random seed. (For debugging)
|
||||
inline std::ostream& operator<<(std::ostream& os, PRNG& prng)
|
||||
{
|
||||
os << "PRNG::seed = " << std::hex << prng.get_seed() << std::dec;
|
||||
@@ -153,54 +152,53 @@ inline uint64_t mul_hi64(uint64_t a, uint64_t b) {
|
||||
namespace WinProcGroup {
|
||||
void bindThisThread(size_t idx);
|
||||
}
|
||||
|
||||
// 指定されたミリ秒だけsleepする。
|
||||
// sleep for the specified number of milliseconds.
|
||||
extern void sleep(int ms);
|
||||
|
||||
// 現在時刻を文字列化したもを返す。(評価関数の学習時などにログ出力のために用いる)
|
||||
// Returns a string that represents the current time. (Used for log output when learning evaluation function)
|
||||
std::string now_string();
|
||||
|
||||
// 途中での終了処理のためのwrapper
|
||||
// wrapper for end processing on the way
|
||||
static void my_exit()
|
||||
{
|
||||
sleep(3000); // エラーメッセージが出力される前に終了するのはまずいのでwaitを入れておく。
|
||||
sleep(3000); // It is bad to finish before the error message is output, so put wait.
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
// msys2、Windows Subsystem for Linuxなどのgcc/clangでコンパイルした場合、
|
||||
// C++のstd::ifstreamで::read()は、一発で2GB以上のファイルの読み書きが出来ないのでそのためのwrapperである。
|
||||
// When compiled with gcc/clang such as msys2, Windows Subsystem for Linux,
|
||||
// In C++ std::ifstream, ::read() is a wrapper for that because it is not possible to read and write files larger than 2GB in one shot.
|
||||
//
|
||||
// read_file_to_memory()の引数のcallback_funcは、ファイルがオープン出来た時点でそのファイルサイズを引数として
|
||||
// callbackされるので、バッファを確保して、その先頭ポインタを返す関数を渡すと、そこに読み込んでくれる。
|
||||
// これらの関数は、ファイルが見つからないときなどエラーの際には非0を返す。
|
||||
// callback_func of the argument of read_file_to_memory() uses the file size as an argument when the file can be opened
|
||||
// It will be called back, so if you allocate a buffer and pass a function that returns the first pointer, it will be read there.
|
||||
// These functions return non-zero on error, such as when the file cannot be found.
|
||||
//
|
||||
// また、callbackされた関数のなかでバッファが確保できなかった場合や、想定していたファイルサイズと異なった場合は、
|
||||
// nullptrを返せば良い。このとき、read_file_to_memory()は、読み込みを中断し、エラーリターンする。
|
||||
// Also, if the buffer cannot be allocated in the callback function or if the file size is different from the expected file size,
|
||||
// Return nullptr. At this time, read_file_to_memory() interrupts reading and returns with an error.
|
||||
|
||||
int read_file_to_memory(std::string filename, std::function<void* (uint64_t)> callback_func);
|
||||
int write_memory_to_file(std::string filename, void* ptr, uint64_t size);
|
||||
|
||||
// --------------------
|
||||
// PRNGのasync版
|
||||
// async version of PRNG
|
||||
// --------------------
|
||||
|
||||
// PRNGのasync版
|
||||
// async version of PRNG
|
||||
struct AsyncPRNG
|
||||
{
|
||||
AsyncPRNG(uint64_t seed) : prng(seed) { assert(seed); }
|
||||
// [ASYNC] 乱数を一つ取り出す。
|
||||
// [ASYNC] Extract one random number.
|
||||
template<typename T> T rand() {
|
||||
std::unique_lock<std::mutex> lk(mutex);
|
||||
return prng.rand<T>();
|
||||
}
|
||||
|
||||
// [ASYNC] 0からn-1までの乱数を返す。(一様分布ではないが現実的にはこれで十分)
|
||||
// [ASYNC] Returns a random number from 0 to n-1. (Not uniform distribution, but this is enough in reality)
|
||||
uint64_t rand(uint64_t n) {
|
||||
std::unique_lock<std::mutex> lk(mutex);
|
||||
return prng.rand(n);
|
||||
}
|
||||
|
||||
// 内部で使用している乱数seedを返す。
|
||||
// Return the random seed used internally.
|
||||
uint64_t get_seed() const { return prng.get_seed(); }
|
||||
|
||||
protected:
|
||||
@@ -208,7 +206,7 @@ protected:
|
||||
PRNG prng;
|
||||
};
|
||||
|
||||
// 乱数のseedを表示する。(デバッグ用)
|
||||
// Display a random seed. (For debugging)
|
||||
inline std::ostream& operator<<(std::ostream& os, AsyncPRNG& prng)
|
||||
{
|
||||
os << "AsyncPRNG::seed = " << std::hex << prng.get_seed() << std::dec;
|
||||
@@ -219,18 +217,18 @@ inline std::ostream& operator<<(std::ostream& os, AsyncPRNG& prng)
|
||||
// Math
|
||||
// --------------------
|
||||
|
||||
// 進行度の計算や学習で用いる数学的な関数
|
||||
// Mathematical function used for progress calculation and learning
|
||||
namespace Math {
|
||||
// シグモイド関数
|
||||
// = 1.0 / (1.0 + std::exp(-x))
|
||||
// Sigmoid function
|
||||
// = 1.0 / (1.0 + std::exp(-x))
|
||||
double sigmoid(double x);
|
||||
|
||||
// シグモイド関数の微分
|
||||
// = sigmoid(x) * (1.0 - sigmoid(x))
|
||||
// Differentiation of sigmoid function
|
||||
// = sigmoid(x) * (1.0-sigmoid(x))
|
||||
double dsigmoid(double x);
|
||||
|
||||
// vを[lo,hi]の間に収まるようにクリップする。
|
||||
// ※ Stockfishではこの関数、bitboard.hに書いてある。
|
||||
// Clip v so that it fits between [lo,hi].
|
||||
// * In Stockfish, this function is written in bitboard.h.
|
||||
template<class T> constexpr const T& clamp(const T& v, const T& lo, const T& hi) {
|
||||
return v < lo ? lo : v > hi ? hi : v;
|
||||
}
|
||||
@@ -241,12 +239,12 @@ namespace Math {
|
||||
// Path
|
||||
// --------------------
|
||||
|
||||
// C#にあるPathクラス的なもの。ファイル名の操作。
|
||||
// C#のメソッド名に合わせておく。
|
||||
// Something like Path class in C#. File name manipulation.
|
||||
// Match with the C# method name.
|
||||
struct Path
|
||||
{
|
||||
// path名とファイル名を結合して、それを返す。
|
||||
// folder名のほうは空文字列でないときに、末尾に'/'か'\\'がなければそれを付与する。
|
||||
// Combine the path name and file name and return it.
|
||||
// If the folder name is not an empty string, append it if there is no'/' or'\\' at the end.
|
||||
static std::string Combine(const std::string& folder, const std::string& filename)
|
||||
{
|
||||
if (folder.length() >= 1 && *folder.rbegin() != '/' && *folder.rbegin() != '\\')
|
||||
@@ -255,10 +253,10 @@ struct Path
|
||||
return folder + filename;
|
||||
}
|
||||
|
||||
// full path表現から、(フォルダ名を除いた)ファイル名の部分を取得する。
|
||||
// Get the file name part (excluding the folder name) from the full path expression.
|
||||
static std::string GetFileName(const std::string& path)
|
||||
{
|
||||
// "\"か"/"か、どちらを使ってあるかはわからない。
|
||||
// I don't know which "\" or "/" is used.
|
||||
auto path_index1 = path.find_last_of("\\") + 1;
|
||||
auto path_index2 = path.find_last_of("/") + 1;
|
||||
auto path_index = std::max(path_index1, path_index2);
|
||||
@@ -270,8 +268,8 @@ struct Path
|
||||
extern void* aligned_malloc(size_t size, size_t align);
|
||||
static void aligned_free(void* ptr) { _mm_free(ptr); }
|
||||
|
||||
// alignasを指定しているのにnewのときに無視される&STLのコンテナがメモリ確保するときに無視するので、
|
||||
// そのために用いるカスタムアロケーター。
|
||||
// It is ignored when new even though alignas is specified & because it is ignored when the STL container allocates memory,
|
||||
// A custom allocator used for that.
|
||||
template <typename T>
|
||||
class AlignedAllocator {
|
||||
public:
|
||||
@@ -293,15 +291,15 @@ public:
|
||||
|
||||
namespace Dependency
|
||||
{
|
||||
// Linux環境ではgetline()したときにテキストファイルが'\r\n'だと
|
||||
// '\r'が末尾に残るのでこの'\r'を除去するためにwrapperを書く。
|
||||
// そのため、fstreamに対してgetline()を呼び出すときは、
|
||||
// std::getline()ではなく単にgetline()と書いて、この関数を使うべき。
|
||||
// In the Linux environment, if you getline() the text file is'\r\n'
|
||||
// Since'\r' remains at the end, write a wrapper to remove this'\r'.
|
||||
// So when calling getline() on fstream,
|
||||
// just write getline() instead of std::getline() and use this function.
|
||||
extern bool getline(std::ifstream& fs, std::string& s);
|
||||
|
||||
// フォルダを作成する。
|
||||
// カレントフォルダ相対で指定する。dir_nameに日本語は使っていないものとする。
|
||||
// 成功すれば0、失敗すれば非0が返る。
|
||||
// Create a folder.
|
||||
// Specify relative to the current folder. Japanese is not used for dir_name.
|
||||
// Returns 0 on success, non-zero on failure.
|
||||
extern int mkdir(std::string dir_name);
|
||||
}
|
||||
|
||||
|
||||
@@ -209,11 +209,11 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th
|
||||
st = si;
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
// evalList<EFBFBD><EFBFBD>clear<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD><EFBFBD>memset<EFBFBD>Ń[<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
|
||||
// clear evalList. It is cleared when memset is cleared to zero above...
|
||||
evalList.clear();
|
||||
|
||||
// PieceList<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>V<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŁA<EFBFBD>ǂ̋<EFBFBD>ǂ<EFBFBD><EFBFBD>ɂ<EFBFBD><EFBFBD>邩<EFBFBD><EFBFBD><EFBFBD>ݒ肵<EFBFBD>Ȃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>A
|
||||
// <EFBFBD><EFBFBD><EFBFBD>ꂼ<EFBFBD><EFBFBD><EFBFBD>̋<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǂ<EFBFBD><EFBFBD>܂Ŏg<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃J<EFBFBD>E<EFBFBD><EFBFBD><EFBFBD>^<5E>[
|
||||
// In updating the PieceList, we have to set which piece is where,
|
||||
// A counter of how much each piece has been used
|
||||
PieceNumber next_piece_number = PIECE_NUMBER_ZERO;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
@@ -235,10 +235,10 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
PieceNumber piece_no =
|
||||
(idx == W_KING) ? PIECE_NUMBER_WKING : // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
(idx == B_KING) ? PIECE_NUMBER_BKING : // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
next_piece_number++; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȊO
|
||||
evalList.put_piece(piece_no, sq, pc); // sq<EFBFBD>̏<EFBFBD><EFBFBD><EFBFBD>pc<EFBFBD>̋<EFBFBD><EFBFBD><EFBFBD><EFBFBD>z<EFBFBD>u<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
(idx == W_KING) ?PIECE_NUMBER_WKING : //
|
||||
(idx == B_KING) ?PIECE_NUMBER_BKING : // back ball
|
||||
next_piece_number++; // otherwise
|
||||
evalList.put_piece(piece_no, sq, pc); // Place the pc piece in the sq box
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
++sq;
|
||||
@@ -823,7 +823,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
||||
st->rule50 = 0;
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
dp.dirty_num = 2; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>
|
||||
dp.dirty_num = 2; // 2 pieces moved
|
||||
|
||||
dp.pieceNo[1] = piece_no1;
|
||||
dp.changed_piece[1].old_piece = evalList.bona_piece(piece_no1);
|
||||
@@ -1054,8 +1054,8 @@ 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;
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>Z<EFBFBD>̂<EFBFBD><EFBFBD>߂Ɉړ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>StateInfo<EFBFBD>ɋL<EFBFBD>^<5E><><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>B
|
||||
dp.dirty_num = 2; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>
|
||||
// Record the moved pieces in StateInfo for difference calculation.
|
||||
dp.dirty_num = 2; // 2 pieces moved
|
||||
|
||||
PieceNumber piece_no0;
|
||||
PieceNumber piece_no1;
|
||||
|
||||
@@ -63,7 +63,7 @@ struct StateInfo {
|
||||
#if defined(EVAL_NNUE)
|
||||
Eval::NNUE::Accumulator accumulator;
|
||||
|
||||
// <EFBFBD>]<5D><><EFBFBD>l<EFBFBD>̍<EFBFBD><CC8D><EFBFBD><EFBFBD>v<EFBFBD>Z<EFBFBD>̊Ǘ<CC8A><C797>p
|
||||
// For management of evaluation value difference calculation
|
||||
Eval::DirtyPiece dirtyPiece;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
};
|
||||
@@ -82,7 +82,7 @@ typedef std::unique_ptr<std::deque<StateInfo>> StateListPtr;
|
||||
/// traversing the search tree.
|
||||
class Thread;
|
||||
|
||||
// pack<EFBFBD><EFBFBD><EFBFBD>ꂽsfen
|
||||
// packed sfen
|
||||
struct PackedSfen { uint8_t data[32]; };
|
||||
|
||||
class Position {
|
||||
@@ -181,31 +181,31 @@ public:
|
||||
#if defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
||||
// --- StateInfo
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD>݂̋ǖʂɑΉ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>StateInfo<EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><EFBFBD>Astate()->capturedPiece<EFBFBD>ł<EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>O<EFBFBD>ǖʂŕߊl<EFBFBD><EFBFBD><EFBFBD>ꂽ<EFBFBD><EFBFBD>i<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>B
|
||||
// Returns the StateInfo corresponding to the current situation.
|
||||
// For example, if state()->capturedPiece, the pieces captured in the previous phase are stored.
|
||||
StateInfo* state() const { return st; }
|
||||
|
||||
// <EFBFBD>]<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
|
||||
// Information such as where and which piece number is used for the evaluation function.
|
||||
const Eval::EvalList* eval_list() const { return &evalList; }
|
||||
#endif // defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
||||
|
||||
#if defined(EVAL_LEARN)
|
||||
// -- sfen<EFBFBD><EFBFBD><EFBFBD>w<EFBFBD><EFBFBD><EFBFBD>p
|
||||
// --sfenization helper
|
||||
|
||||
// pack<EFBFBD><EFBFBD><EFBFBD>ꂽsfen<EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ɏw<EFBFBD>肵<EFBFBD><EFBFBD><EFBFBD>o<EFBFBD>b<EFBFBD>t<EFBFBD>@<40>ɕԂ<C995><D482>B
|
||||
// gamePly<EFBFBD><EFBFBD>pack<EFBFBD>Ɋ܂߂Ȃ<EFBFBD><EFBFBD>B
|
||||
// Get the packed sfen. Returns to the buffer specified in the argument.
|
||||
// Do not include gamePly in pack.
|
||||
void sfen_pack(PackedSfen& sfen);
|
||||
|
||||
// <20><>sfen<EFBFBD><EFBFBD><EFBFBD>o<EFBFBD>R<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƒx<EFBFBD><EFBFBD><EFBFBD>̂Œ<EFBFBD><EFBFBD><EFBFBD>pack<EFBFBD><EFBFBD><EFBFBD>ꂽsfen<EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD>b<EFBFBD>g<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// pos.set(sfen_unpack(data),si,th); <20>Ɠ<EFBFBD><C693><EFBFBD><EFBFBD>B
|
||||
// <EFBFBD>n<EFBFBD><EFBFBD><EFBFBD>ꂽ<EFBFBD>ǖʂɖ<EFBFBD><EFBFBD>肪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>āA<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>[<5B>̂Ƃ<CC82><C682>͔<EFBFBD>0<EFBFBD><30><EFBFBD>Ԃ<EFBFBD><D482>B
|
||||
// PackedSfen<EFBFBD><EFBFBD>gamePly<EFBFBD>͊܂܂Ȃ<EFBFBD><EFBFBD>̂ŕ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>B<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݒ肵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ł<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Έ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŏw<EFBFBD>肷<EFBFBD>邱<EFBFBD>ƁB
|
||||
// <20><> It is slow to go through sfen, so I made a function to set packed sfen directly.
|
||||
// Equivalent to pos.set(sfen_unpack(data),si,th);.
|
||||
// If there is a problem with the passed phase and there is an error, non-zero is returned.
|
||||
// PackedSfen does not include gamePly so it cannot be restored. If you want to set it, specify it with an argument.
|
||||
int set_from_packed_sfen(const PackedSfen& sfen, StateInfo* si, Thread* th, bool mirror = false);
|
||||
|
||||
// <EFBFBD>ՖʂƎ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD>^<5E><><EFBFBD>āA<C481><41><EFBFBD><EFBFBD>sfen<65><6E><EFBFBD>Ԃ<EFBFBD><D482>B
|
||||
// Give the board, hand piece, and turn, and return the sfen.
|
||||
//static std::string sfen_from_rawdata(Piece board[81], Hand hands[2], Color turn, int gamePly);
|
||||
|
||||
// c<EFBFBD><EFBFBD><EFBFBD>̋ʂ̈ʒu<EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD>B
|
||||
// Returns the position of the ball on the c side.
|
||||
Square king_square(Color c) const { return pieceList[make_piece(c, KING)][0]; }
|
||||
#endif // EVAL_LEARN
|
||||
|
||||
@@ -223,7 +223,7 @@ private:
|
||||
void do_castling(Color us, Square from, Square& to, Square& rfrom, Square& rto);
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
// <EFBFBD>Տ<EFBFBD><EFBFBD><EFBFBD>sq<EFBFBD>̏<EFBFBD><EFBFBD>ɂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PieceNumber<EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD>B
|
||||
// Returns the PieceNumber of the piece in the sq box on the board.
|
||||
PieceNumber piece_no_of(Square sq) const;
|
||||
#endif // defined(EVAL_NNUE)
|
||||
|
||||
@@ -245,7 +245,7 @@ private:
|
||||
bool chess960;
|
||||
|
||||
#if defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
||||
// <EFBFBD>]<5D><><EFBFBD><EFBFBD><D690>ŗp<C597><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃<EFBFBD><CC83>X<EFBFBD>g
|
||||
// List of pieces used in the evaluation function
|
||||
Eval::EvalList evalList;
|
||||
#endif // defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
||||
};
|
||||
|
||||
151
src/search.cpp
151
src/search.cpp
@@ -1938,60 +1938,61 @@ void Tablebases::rank_root_moves(Position& pos, Search::RootMoves& rootMoves) {
|
||||
}
|
||||
}
|
||||
|
||||
// --- <EFBFBD>w<EFBFBD>K<EFBFBD><EFBFBD><EFBFBD>ɗp<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Adepth<EFBFBD>Œ<EFBFBD><EFBFBD>T<EFBFBD><EFBFBD><EFBFBD>Ȃǂ̊<EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><EFBFBD><EFBFBD>ɑ<EFBFBD><EFBFBD>Č<EFBFBD><EFBFBD>J
|
||||
// --- expose the functions such as fixed depth search used for learning to the outside
|
||||
|
||||
#if defined (EVAL_LEARN)
|
||||
|
||||
namespace Learner
|
||||
{
|
||||
// <EFBFBD>w<EFBFBD>K<EFBFBD>p<EFBFBD>ɁA1<EFBFBD>̃X<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>h<EFBFBD><EFBFBD><EFBFBD><EFBFBD>search,qsearch()<29><><EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ȃX<C883>^<5E>u<EFBFBD><75><EFBFBD>p<EFBFBD>ӂ<EFBFBD><D382><EFBFBD><EFBFBD>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD>܂ɂ<EFBFBD><EFBFBD>Ďv<EFBFBD><EFBFBD><EFBFBD>AApery<EFBFBD>̂悤<EFBFBD><EFBFBD>Searcher<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ăX<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>h<EFBFBD><EFBFBD><EFBFBD>Ƃɒu<EFBFBD><EFBFBD><EFBFBD>\<5C>Ȃǂ<C882><C782>p<EFBFBD>ӂ<EFBFBD><D382><EFBFBD><EFBFBD>ق<EFBFBD><D982><EFBFBD>
|
||||
// <EFBFBD>ǂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m<EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>B
|
||||
// For learning, prepare a stub that can call search,qsearch() from one thread.
|
||||
// From now on, it is better to have a Searcher and prepare a substitution table for each thread like Apery.
|
||||
// It might have been good.
|
||||
|
||||
// <EFBFBD>w<EFBFBD>K<EFBFBD>̂<EFBFBD><EFBFBD>߂̏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// Learner::search(),Learner::qsearch()<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ăяo<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// Initialization for learning.
|
||||
// Called from Learner::search(),Learner::qsearch().
|
||||
void init_for_search(Position& pos, Stack* ss)
|
||||
{
|
||||
|
||||
// RootNode<EFBFBD><EFBFBD>ss->ply == 0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// <EFBFBD>[<5B><><EFBFBD>N<EFBFBD><4E><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>̂ŁAss->ply == 0<>ƂȂ<C682><C882>̂ő<CC82><C591><EFBFBD><EFBFBD>v<EFBFBD>c<EFBFBD>B
|
||||
// RootNode requires ss->ply == 0.
|
||||
// Because it clears to zero, ss->ply == 0, so it's okay...
|
||||
|
||||
std::memset(ss - 7, 0, 10 * sizeof(Stack));
|
||||
|
||||
// Search::Limits<EFBFBD>Ɋւ<EFBFBD><EFBFBD><EFBFBD>
|
||||
// <EFBFBD><EFBFBD><EFBFBD>̃<EFBFBD><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD>[<5B>ϐ<EFBFBD><CF90><EFBFBD>global<61>Ȃ̂ő<CC82><C591>̃X<CC83><58><EFBFBD>b<EFBFBD>h<EFBFBD>ɉe<C989><65><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD>ڂ<EFBFBD><DA82>̂ŋC<C58B><43><EFBFBD><EFBFBD><C282>邱<EFBFBD>ƁB
|
||||
// About Search::Limits
|
||||
// Be careful because this member variable is global and affects other threads.
|
||||
{
|
||||
auto& limits = Search::Limits;
|
||||
|
||||
// <EFBFBD>T<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"go infinite"<22>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>B(time management<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƍ<EFBFBD><EFBFBD>邽<EFBFBD><EFBFBD>)
|
||||
// Make the search equivalent to the "go infinite" command. (Because it is troublesome if time management is done)
|
||||
limits.infinite = true;
|
||||
|
||||
// PV<EFBFBD><EFBFBD><EFBFBD>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǝז<C68E><D796>Ȃ̂ŏ<CC82><C58F><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>B
|
||||
// Since PV is an obstacle when displayed, erase it.
|
||||
limits.silent = true;
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ɗe<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>h<EFBFBD><EFBFBD>nodes<EFBFBD><EFBFBD><EFBFBD>ώZ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂Ɣ<EFBFBD><EFBFBD>r<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD>B<EFBFBD>䂦<EFBFBD>Ɏg<EFBFBD>p<EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>B
|
||||
// If you use this, it will be compared with the accumulated nodes of each thread. Therefore, do not use it.
|
||||
limits.nodes = 0;
|
||||
|
||||
// depth<EFBFBD><EFBFBD><EFBFBD>ALearner::search()<29>̈<EFBFBD><CC88><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>ēn<C493><6E><EFBFBD>ꂽ<EFBFBD><EA82BD><EFBFBD>̂ŏ<CC82><C58F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// depth is also processed by the one passed as an argument of Learner::search().
|
||||
limits.depth = 0;
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>߂̎萔<EFBFBD>ň<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̒l<EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD>̂<EFBFBD><EFBFBD>h<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߂ɑ傫<EFBFBD>Ȓl<EFBFBD>ɂ<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// Set a large value to prevent the draw value from being returned due to the number of moves near the draw.
|
||||
//limits.max_game_ply = 1 << 16;
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD>ʃ<EFBFBD><EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>ƈ<EFBFBD><C688><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɂȂ<C982><C882>Č<EFBFBD><C48C><EFBFBD><EFBFBD><EFBFBD><C282>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>B
|
||||
// If you do not include the ball entry rule, it will be a draw and it will be difficult to settle.
|
||||
//limits.enteringKingRule = EnteringKingRule::EKR_27_POINT;
|
||||
}
|
||||
|
||||
// DrawValue<EFBFBD>̐ݒ<EFBFBD>
|
||||
// Set DrawValue
|
||||
{
|
||||
// <EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>h<EFBFBD><EFBFBD><EFBFBD>Ƃɗp<EFBFBD>ӂ<EFBFBD><EFBFBD>ĂȂ<EFBFBD><EFBFBD>̂<EFBFBD>
|
||||
// <EFBFBD><EFBFBD><EFBFBD>̃X<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>h<EFBFBD>ŏ㏑<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꂩ<EFBFBD>˂Ȃ<EFBFBD><EFBFBD>B<EFBFBD>d<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// <EFBFBD>ǂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>A0<EFBFBD>ɂ<EFBFBD><EFBFBD>ׂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǝv<EFBFBD><EFBFBD><EFBFBD>B
|
||||
// Because it is not prepared for each thread
|
||||
// May be overwritten by another thread. There is no help for it.
|
||||
// If that happens, I think it should be 0.
|
||||
//drawValueTable[REPETITION_DRAW][BLACK] = VALUE_ZERO;
|
||||
//drawValueTable[REPETITION_DRAW][WHITE] = VALUE_ZERO;
|
||||
}
|
||||
|
||||
// this_thread<EFBFBD>Ɋւ<EFBFBD><EFBFBD>āB
|
||||
// Regarding this_thread.
|
||||
|
||||
{
|
||||
auto th = pos.this_thread();
|
||||
|
||||
@@ -1999,10 +2000,10 @@ namespace Learner
|
||||
th->selDepth = 0;
|
||||
th->rootDepth = 0;
|
||||
|
||||
// <20>T<EFBFBD><54><EFBFBD>m<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD>̃[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// Zero initialization of the number of search nodes
|
||||
th->nodes = 0;
|
||||
|
||||
// history<EFBFBD>ނ<EFBFBD><EFBFBD>S<EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>̏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>邵<EFBFBD>A<EFBFBD>T<EFBFBD><EFBFBD><EFBFBD>̐<EFBFBD><EFBFBD>x<EFBFBD>͂ނ<EFBFBD><EFBFBD>뉺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂őP<EFBFBD><EFBFBD><EFBFBD>͂悭<EFBFBD>킩<EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>B
|
||||
// Clear all history types. This initialization takes a little time, and the accuracy of the search is rather low, so the good and bad are not well understood.
|
||||
// th->clear();
|
||||
|
||||
int ct = int(Options["Contempt"]) * PawnValueEg / 100; // From centipawns
|
||||
@@ -2023,57 +2024,57 @@ namespace Learner
|
||||
for (int i = 7; i > 0; i--)
|
||||
(ss - i)->continuationHistory = &th->continuationHistory[0][0][NO_PIECE][0]; // Use as a sentinel
|
||||
|
||||
// rootMoves<EFBFBD>̐ݒ<EFBFBD>
|
||||
// set rootMoves
|
||||
auto& rootMoves = th->rootMoves;
|
||||
|
||||
rootMoves.clear();
|
||||
for (auto m : MoveList<LEGAL>(pos))
|
||||
for (auto m: MoveList<LEGAL>(pos))
|
||||
rootMoves.push_back(Search::RootMove(m));
|
||||
|
||||
assert(!rootMoves.empty());
|
||||
|
||||
//#if defined(USE_GLOBAL_OPTIONS)
|
||||
// <EFBFBD>T<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>h<EFBFBD><EFBFBD><EFBFBD>Ƃ̒u<EFBFBD><EFBFBD><EFBFBD>\<5C>̐<EFBFBD><CC90><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǘ<EFBFBD><C797><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>͂<EFBFBD><CD82>Ȃ̂ŁA
|
||||
// <EFBFBD>V<EFBFBD>K<EFBFBD>̒T<EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD>邩<EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>̃X<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>h<EFBFBD>ɑ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD><EFBFBD><EFBFBD>\<5C>̐<EFBFBD><CC90><EFBFBD><EFBFBD>𑝂₷<F0919D82>B
|
||||
// Since the generation of the substitution table for each search thread should be managed,
|
||||
// Increase the generation of the substitution table for this thread because it is a new search.
|
||||
//TT.new_search(th->thread_id());
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>new_search<EFBFBD><EFBFBD><EFBFBD>Ăяo<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>̒T<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʂ<EFBFBD><EFBFBD>g<EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>đ<EFBFBD><EFBFBD>Ƃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ͂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ł́c<EFBFBD>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD><EFBFBD><EFBFBD>͂<EFBFBD><EFBFBD>炸<EFBFBD>ɁA<EFBFBD>Ăяo<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD>ǂ<EFBFBD><EFBFBD>Ƃ<EFBFBD>TT.new_search(th->thread_id())<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ׂ<EFBFBD><EFBFBD>ł́c<EFBFBD>B
|
||||
// ↑ If you call new_search here, it may be a loss because you can't use the previous search result.
|
||||
// Do not do this here, but caller should do TT.new_search(th->thread_id()) for each station ...
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD>̏I<CC8F>ǐ}<7D>Ɏ<EFBFBD><C98E><EFBFBD><EFBFBD>̂<EFBFBD><CC82><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ŁA<C581><41><EFBFBD>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɂ͒u<CD92><75><EFBFBD>\<5C>͑S<CD91>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>ʂŎg<C58E><67><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>B
|
||||
// →Because we want to avoid reaching the same final diagram, use the substitution table commonly for all threads when generating teachers.
|
||||
//#endif
|
||||
}
|
||||
}
|
||||
|
||||
// <EFBFBD>ǂƕ]<5D><><EFBFBD>l<EFBFBD>̃y<CC83>A<EFBFBD>BLearner::search(),Learner::qsearch()<EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD>B
|
||||
// A pair of reader and evaluation value. Returned by Learner::search(),Learner::qsearch().
|
||||
typedef std::pair<Value, std::vector<Move> > ValueAndPV;
|
||||
|
||||
// <EFBFBD>Î~<7E>T<EFBFBD><54><EFBFBD>B
|
||||
// Stationary search.
|
||||
//
|
||||
// <EFBFBD>O<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) pos.set_this_thread(Threads[thread_id])<EFBFBD>ŒT<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>h<EFBFBD><EFBFBD><EFBFBD>ݒ肳<EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>邱<EFBFBD>ƁB
|
||||
// <EFBFBD>@<40>܂<EFBFBD><DC82>AThreads.stop<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƒT<EFBFBD><EFBFBD><EFBFBD>𒆒f<EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD>̂ŁA<EFBFBD><EFBFBD><EFBFBD>̂Ƃ<EFBFBD><EFBFBD><EFBFBD>PV<EFBFBD>͐<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>B
|
||||
// <EFBFBD>@search()<29><><EFBFBD><EFBFBD><EFBFBD>߂<EFBFBD><DF82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƁAThreads.stop == true<75>Ȃ<EFBFBD><C882>A<EFBFBD><41><EFBFBD>̒T<CC92><54><EFBFBD><EFBFBD><EFBFBD>ʂ<EFBFBD><CA82>p<EFBFBD><70><EFBFBD>Ă͂Ȃ<CD82><C882>Ȃ<EFBFBD><C882>B
|
||||
// <EFBFBD>@<40><><EFBFBD>ƁA<C681>Ăяo<D18F><6F><EFBFBD>O<EFBFBD>́AThreads.stop == false<73>̏<EFBFBD><CC8F>ԂŌĂяo<D18F><6F><EFBFBD>Ȃ<EFBFBD><C882>ƁA<C681>T<EFBFBD><54><EFBFBD>𒆒f<F0928692><66><EFBFBD>ĕԂ<C495><D482>Ă<EFBFBD><C482>܂<EFBFBD><DC82>̂Œ<CC82><C592>ӁB
|
||||
// Precondition) Search thread is set by pos.set_this_thread(Threads[thread_id]).
|
||||
// Also, when Threads.stop arrives, the search is interrupted, so the PV at that time is not correct.
|
||||
// After returning from search(), if Threads.stop == true, do not use the search result.
|
||||
// Also, note that before calling, if you do not call it with Threads.stop == false, the search will be interrupted and it will return.
|
||||
//
|
||||
// <EFBFBD>l<EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꍇ<EFBFBD>́APV<EFBFBD>z<EFBFBD><EFBFBD><EFBFBD><EFBFBD>MOVE_RESIGN<EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD>B
|
||||
// If it is clogged, MOVE_RESIGN is returned in the PV array.
|
||||
//
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>alpha,beta<74><61><EFBFBD>w<EFBFBD><77><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD>ꂪ<EFBFBD><EA82AA><EFBFBD>̑<EFBFBD><CC91>ŒT<C592><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>̌<EFBFBD><CC8C>ʂ<EFBFBD>
|
||||
// <EFBFBD>u<EFBFBD><EFBFBD><EFBFBD>\<5C>ɏ<EFBFBD><C98F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ނ̂ŁA<C581><41><EFBFBD>̑<EFBFBD><CC91>ɑ<C991><CE82>Ď}<7D><><EFBFBD>肪<EFBFBD>o<EFBFBD><6F><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>Ȓl<C892><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82>Ċw<C48A>K<EFBFBD>̂Ƃ<CC82><C682><EFBFBD>
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>e<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ŁA<EFBFBD><EFBFBD><EFBFBD>͈̔͂<EFBFBD><EFBFBD>w<EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>߂邱<EFBFBD>Ƃɂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
//Although it was possible to specify alpha and beta with arguments, this will show the result when searching in that window
|
||||
// Because it writes to the substitution table, the value that can be pruned is written to that window when learning
|
||||
// As it has a bad effect, I decided to stop allowing the window range to be specified.
|
||||
ValueAndPV qsearch(Position& pos)
|
||||
{
|
||||
Stack stack[MAX_PLY + 10], * ss = stack + 7;
|
||||
Move pv[MAX_PLY + 1];
|
||||
|
||||
init_for_search(pos, ss);
|
||||
ss->pv = pv; // <EFBFBD>Ƃ肠<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>~<7E>[<5B>łǂ<C582><C782><EFBFBD><EFBFBD>o<EFBFBD>b<EFBFBD>t<EFBFBD>@<40><><EFBFBD>Ȃ<EFBFBD><C882>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>B
|
||||
ss->pv = pv; // For the time being, it must be a dummy and somewhere with a buffer.
|
||||
|
||||
if (pos.is_draw(0)) {
|
||||
// Return draw value if draw.
|
||||
return { VALUE_DRAW, {} };
|
||||
}
|
||||
|
||||
// <EFBFBD>l<EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD>
|
||||
// Is it stuck?
|
||||
if (MoveList<LEGAL>(pos).size() == 0)
|
||||
{
|
||||
// Return the mated value if checkmated.
|
||||
@@ -2082,7 +2083,7 @@ namespace Learner
|
||||
|
||||
auto bestValue = ::qsearch<PV>(pos, ss, -VALUE_INFINITE, VALUE_INFINITE, 0);
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꂽPV<EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD>B
|
||||
// Returns the PV obtained.
|
||||
std::vector<Move> pvs;
|
||||
for (Move* p = &ss->pv[0]; is_ok(*p); ++p)
|
||||
pvs.push_back(*p);
|
||||
@@ -2090,21 +2091,21 @@ namespace Learner
|
||||
return ValueAndPV(bestValue, pvs);
|
||||
}
|
||||
|
||||
// <EFBFBD>ʏ<EFBFBD><EFBFBD>T<EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>[<5B><>depth(<28><><EFBFBD><EFBFBD><EFBFBD>Ŏw<C58E><77>)<29>B
|
||||
// 3<EFBFBD><EFBFBD><EFBFBD>ǂݎ<EFBFBD><EFBFBD>̃X<EFBFBD>R<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>~<7E><><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>A
|
||||
// auto v = search(pos,3);
|
||||
// <EFBFBD>̂悤<EFBFBD>ɂ<EFBFBD><EFBFBD>ׂ<EFBFBD><EFBFBD>B
|
||||
// v.first<73>ɕ]<5D><><EFBFBD>l<EFBFBD>Av.second<6E><64>PV<50><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// multi pv<EFBFBD><EFBFBD><EFBFBD>L<EFBFBD><EFBFBD><EFBFBD>̂Ƃ<EFBFBD><EFBFBD>́Apos.this_thread()->rootMoves[N].pv<EFBFBD>ɂ<EFBFBD><EFBFBD><EFBFBD>PV(<28>ǂ<C782>)<29>̔z<CC94><EFBFBD><F182AA93><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// multi pv<70>̎w<CC8E><77><EFBFBD>͂<EFBFBD><CD82>̊<CC8A><D690>̈<EFBFBD><CC88><EFBFBD>multiPV<50>ōs<C58D>Ȃ<EFBFBD><C882>B(Options["MultiPV"]<EFBFBD>̒l<EFBFBD>͖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
//
|
||||
// root<6F>ł̐錾<CC90><E98CBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͂<EFBFBD><CD82>Ȃ<EFBFBD><C882>̂<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʓ|<7C>Ȃ̂<C882>)<29>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>ł͍s<CD8D><73><EFBFBD>Ȃ<EFBFBD><C882>B
|
||||
// <20>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD>ŏ<EFBFBD><C58F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>邱<EFBFBD>ƁB
|
||||
// Normal search. Depth depth (specified as an integer).
|
||||
// 3 If you want a score for hand reading,
|
||||
// auto v = search(pos,3);
|
||||
// Do something like
|
||||
// Evaluation value is obtained in v.first and PV is obtained in v.second.
|
||||
// When multi pv is enabled, you can get the PV (reading line) array in pos.this_thread()->rootMoves[N].pv.
|
||||
// Specify multi pv with the argument multiPV of this function. (The value of Options["MultiPV"] is ignored)
|
||||
//
|
||||
// <EFBFBD>O<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) pos.set_this_thread(Threads[thread_id])<29>ŒT<C592><54><EFBFBD>X<EFBFBD><58><EFBFBD>b<EFBFBD>h<EFBFBD><68><EFBFBD>ݒ肳<DD92><E882B3><EFBFBD>Ă<EFBFBD><C482>邱<EFBFBD>ƁB
|
||||
// <EFBFBD>@<40>܂<EFBFBD><DC82>AThreads.stop<6F><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƒT<C692><54><EFBFBD>𒆒f<F0928692><66><EFBFBD>Ă<EFBFBD><C482>܂<EFBFBD><DC82>̂ŁA<C581><41><EFBFBD>̂Ƃ<CC82><C682><EFBFBD>PV<50>͐<EFBFBD><CD90><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>B
|
||||
// <20>@search()<29><><EFBFBD><EFBFBD><EFBFBD>߂<EFBFBD><DF82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƁAThreads.stop == true<75>Ȃ<EFBFBD><C882>A<EFBFBD><41><EFBFBD>̒T<CC92><54><EFBFBD><EFBFBD><EFBFBD>ʂ<EFBFBD><CA82>p<EFBFBD><70><EFBFBD>Ă͂Ȃ<CD82><C882>Ȃ<EFBFBD><C882>B
|
||||
// <EFBFBD>@<40><><EFBFBD>ƁA<C681>Ăяo<D18F><6F><EFBFBD>O<EFBFBD>́AThreads.stop == false<73>̏<EFBFBD><CC8F>ԂŌĂяo<D18F><6F><EFBFBD>Ȃ<EFBFBD><C882>ƁA<C681>T<EFBFBD><54><EFBFBD>𒆒f<F0928692><66><EFBFBD>ĕԂ<C495><D482>Ă<EFBFBD><C482>܂<EFBFBD><DC82>̂Œ<CC82><C592>ӁB
|
||||
// Declaration win judgment is not done as root (because it is troublesome to handle), so it is not done here.
|
||||
// Handle it by the caller.
|
||||
//
|
||||
// Precondition) Search thread is set by pos.set_this_thread(Threads[thread_id]).
|
||||
// Also, when Threads.stop arrives, the search is interrupted, so the PV at that time is not correct.
|
||||
// After returning from search(), if Threads.stop == true, do not use the search result.
|
||||
// Also, note that before calling, if you do not call it with Threads.stop == false, the search will be interrupted and it will return.
|
||||
|
||||
ValueAndPV search(Position& pos, int depth_, size_t multiPV /* = 1 */, uint64_t nodesLimit /* = 0 */)
|
||||
{
|
||||
@@ -2122,9 +2123,9 @@ namespace Learner
|
||||
|
||||
init_for_search(pos, ss);
|
||||
|
||||
ss->pv = pv; // <EFBFBD>Ƃ肠<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>~<7E>[<5B>łǂ<C582><C782><EFBFBD><EFBFBD>o<EFBFBD>b<EFBFBD>t<EFBFBD>@<40><><EFBFBD>Ȃ<EFBFBD><C882>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>B
|
||||
ss->pv = pv; // For the time being, it must be a dummy and somewhere with a buffer.
|
||||
|
||||
// this_thread<EFBFBD>Ɋ֘A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϐ<EFBFBD><EFBFBD>̏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// Initialize the variables related to this_thread
|
||||
auto th = pos.this_thread();
|
||||
auto& rootDepth = th->rootDepth;
|
||||
auto& pvIdx = th->pvIdx;
|
||||
@@ -2133,13 +2134,13 @@ namespace Learner
|
||||
auto& completedDepth = th->completedDepth;
|
||||
auto& selDepth = th->selDepth;
|
||||
|
||||
// bestmove<EFBFBD>Ƃ<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̋ǖʂ̏<EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>T<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40>\
|
||||
//size_t multiPV = Options["MultiPV"];
|
||||
// A function to search the top N of this stage as best move
|
||||
//size_t multiPV = Options["MultiPV"];
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD>̋ǖʂł̎w<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̐<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă͂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD>
|
||||
// Do not exceed the number of moves in this situation
|
||||
multiPV = std::min(multiPV, rootMoves.size());
|
||||
|
||||
// <EFBFBD>m<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MultiPV<50>̒l<CC92><6C><EFBFBD>|<7C><><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>ƁAdepth<74>Œ<EFBFBD><C592>AMultiPV<50><56><EFBFBD><EFBFBD><EFBFBD>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD>1<EFBFBD>̌<C282><CC8C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɓ<EFBFBD><C993><EFBFBD>node<64><65><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƂɂȂ<C982><C882>Ȃ<EFBFBD><C882>B
|
||||
// If you do not multiply the node limit by the value of MultiPV, you will not be thinking about the same node for one candidate hand when you fix the depth and have MultiPV.
|
||||
nodesLimit *= multiPV;
|
||||
|
||||
Value alpha = -VALUE_INFINITE;
|
||||
@@ -2148,9 +2149,9 @@ namespace Learner
|
||||
Value bestValue = -VALUE_INFINITE;
|
||||
|
||||
while ((rootDepth += 1) <= depth
|
||||
// node<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F092B482><EFBFBD><EFBFBD>ꍇ<EFBFBD><EA8D87><EFBFBD><EFBFBD><EFBFBD>̃<EFBFBD><CC83>[<5B>v<EFBFBD><EFBFBD><F094B282><EFBFBD>
|
||||
// <EFBFBD>T<EFBFBD><EFBFBD><EFBFBD>m<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD>́A<CD81><41><EFBFBD>̊<CC8A><D690>̈<EFBFBD><CC88><EFBFBD><EFBFBD>œn<C593><6E><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>B
|
||||
&& !(nodesLimit /*node<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ && th->nodes.load(std::memory_order_relaxed) >= nodesLimit)
|
||||
// exit this loop even if the node limit is exceeded
|
||||
// The number of search nodes is passed in the argument of this function.
|
||||
&& !(nodesLimit /* limited nodes */ && th->nodes.load(std::memory_order_relaxed) >= nodesLimit)
|
||||
)
|
||||
{
|
||||
for (RootMove& rm : rootMoves)
|
||||
@@ -2170,10 +2171,10 @@ namespace Learner
|
||||
break;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD>ꂼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>depth<EFBFBD><EFBFBD>PV line<6E>ɑ<C991><CE82><EFBFBD>USI info<66>ŏo<C58F>͂<EFBFBD><CD82><EFBFBD>selDepth
|
||||
// selDepth output with USI info for each depth and PV line
|
||||
selDepth = 0;
|
||||
|
||||
// depth 5<>ȏ<EFBFBD><C88F>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>Ă<EFBFBD>aspiration search<63>ɐ<C990><D882>ւ<EFBFBD><D682><EFBFBD><EFBFBD>B
|
||||
// Switch to aspiration search for depth 5 and above.
|
||||
if (rootDepth >= 5 * 1)
|
||||
{
|
||||
delta = Value(20);
|
||||
@@ -2194,8 +2195,8 @@ namespace Learner
|
||||
stable_sort(rootMoves.begin() + pvIdx, rootMoves.end());
|
||||
//my_stable_sort(pos.this_thread()->thread_id(),&rootMoves[0] + pvIdx, rootMoves.size() - pvIdx);
|
||||
|
||||
// fail low/high<67>ɑ<C991><CE82><EFBFBD>aspiration window<6F><77><EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŏw<EFBFBD>肳<EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>ɂȂ<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD><EFBFBD>fail low/high<67><68><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD>break<61><6B><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// Expand aspiration window for fail low/high.
|
||||
// However, if it is the value specified by the argument, it will be treated as fail low/high and break.
|
||||
if (bestValue <= alpha)
|
||||
{
|
||||
beta = (alpha + beta) / 2;
|
||||
@@ -2217,7 +2218,7 @@ namespace Learner
|
||||
delta += delta / 4 + 5;
|
||||
assert(-VALUE_INFINITE <= alpha && beta <= VALUE_INFINITE);
|
||||
|
||||
// <EFBFBD>\<5C><><EFBFBD>`<60>F<EFBFBD>b<EFBFBD>N
|
||||
// runaway check
|
||||
//assert(th->nodes.load(std::memory_order_relaxed) <= 1000000 );
|
||||
}
|
||||
|
||||
@@ -2229,9 +2230,9 @@ namespace Learner
|
||||
completedDepth = rootDepth;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>PV<EFBFBD>A<EFBFBD>r<EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL_MOVE<EFBFBD>̉\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>邩<EFBFBD><E982A9><EFBFBD>m<EFBFBD><6D><EFBFBD>Ȃ<EFBFBD><C882>̂Ŕr<C594><72><EFBFBD><EFBFBD><EFBFBD>邽<EFBFBD>߂<EFBFBD>is_ok()<29><><EFBFBD>ʂ<EFBFBD><CA82>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD>@PV<50>Ȃ̂<C882>NULL_MOVE<56>͂<EFBFBD><CD82>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD>ƂɂȂ<C982><C882>Ă<EFBFBD><C482><EFBFBD><EFBFBD>͂<EFBFBD><CD82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A
|
||||
// MOVE_WIN<EFBFBD><EFBFBD><EFBFBD>˂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>邱<EFBFBD>Ƃ͂Ȃ<EFBFBD><EFBFBD>B(<28><><EFBFBD>܂̂Ƃ<CC82><C682><EFBFBD>)
|
||||
// Pass PV_is(ok) to eliminate this PV, there may be NULL_MOVE in the middle.
|
||||
// → PV should not be NULL_MOVE because it is PV
|
||||
// MOVE_WIN has never been thrust. (For now)
|
||||
for (Move move : rootMoves[0].pv)
|
||||
{
|
||||
if (!is_ok(move))
|
||||
@@ -2241,7 +2242,7 @@ namespace Learner
|
||||
|
||||
//sync_cout << rootDepth << sync_endl;
|
||||
|
||||
// multiPV<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>āArootMoves[0]<5D><>score<72><65>bestValue<75>Ƃ<EFBFBD><C682>ĕԂ<C495><D482>B
|
||||
// Considering multiPV, the score of rootMoves[0] is returned as bestValue.
|
||||
bestValue = rootMoves[0].score;
|
||||
|
||||
return ValueAndPV(bestValue, pvs);
|
||||
|
||||
16
src/types.h
16
src/types.h
@@ -192,7 +192,7 @@ enum Value : int {
|
||||
|
||||
MidgameLimit = 15258, EndgameLimit = 3915,
|
||||
|
||||
// <EFBFBD>]<5D><><EFBFBD><EFBFBD><D690>̕Ԃ<CC95><D482>l<EFBFBD>̍ő<CC8D><C591>l(2**14<31><34><EFBFBD>炢<EFBFBD>Ɏ<EFBFBD><C98E>܂<EFBFBD><DC82>Ă<EFBFBD><C482>ė~<7E><><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>낾<EFBFBD><EB82BE>..)
|
||||
// Maximum value returned by the evaluation function (I want it to be around 2**14..)
|
||||
VALUE_MAX_EVAL = 27000,
|
||||
};
|
||||
|
||||
@@ -239,7 +239,7 @@ enum Square : int {
|
||||
SQ_NONE,
|
||||
|
||||
SQUARE_ZERO = 0, SQUARE_NB = 64,
|
||||
SQUARE_NB_PLUS1 = SQUARE_NB + 1, // <EFBFBD>ʂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>ꍇ<EFBFBD>ASQUARE_NB<EFBFBD>Ɉړ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂Ƃ<EFBFBD><EFBFBD>Ĉ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߁A<EFBFBD>z<EFBFBD><EFBFBD><EFBFBD><EFBFBD>SQUARE_NB+1<>Ŋm<C58A>ۂ<EFBFBD><DB82>Ȃ<EFBFBD><C882>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ł<CC82><C582>̒萔<CC92><E89094><EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>B
|
||||
SQUARE_NB_PLUS1 = SQUARE_NB + 1, // If there are no balls, it is treated as having moved to SQUARE_NB, so it may be necessary to secure the array with SQUARE_NB+1, so this constant is used.
|
||||
};
|
||||
|
||||
enum Direction : int {
|
||||
@@ -463,18 +463,18 @@ constexpr bool is_ok(Move m) {
|
||||
return from_sq(m) != to_sq(m); // Catch MOVE_NULL and MOVE_NONE
|
||||
}
|
||||
|
||||
// <EFBFBD>Ֆʂ<EFBFBD>180<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><EFBFBD>̏<EFBFBD><EFBFBD>ڂ<EFBFBD><EFBFBD>Ԃ<EFBFBD>
|
||||
// Return squares when turning the board 180<38><EFBFBD>
|
||||
constexpr Square Inv(Square sq) { return (Square)((SQUARE_NB - 1) - sq); }
|
||||
|
||||
// <EFBFBD>Ֆʂ<EFBFBD><EFBFBD>~<7E><><EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>̏<EFBFBD><CC8F>ڂ<EFBFBD><DA82>Ԃ<EFBFBD>
|
||||
// Return squares when mirroring the board
|
||||
constexpr Square Mir(Square sq) { return make_square(File(7 - (int)file_of(sq)), rank_of(sq)); }
|
||||
|
||||
#if defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
||||
// --------------------
|
||||
// <20>
|
||||
// piece box
|
||||
// --------------------
|
||||
|
||||
// Position<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>ŗp<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD>X<EFBFBD>g(<28>ǂ̋<CC8B>ǂ<EFBFBD><C782>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>̂<EFBFBD>)<29><><EFBFBD>Ǘ<EFBFBD><C797><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>̔ԍ<CC94><D48D>B
|
||||
// A number used to manage the piece list (which piece is where) used in the Position class.
|
||||
enum PieceNumber : uint8_t
|
||||
{
|
||||
PIECE_NUMBER_PAWN = 0,
|
||||
@@ -484,7 +484,7 @@ enum PieceNumber : uint8_t
|
||||
PIECE_NUMBER_QUEEN = 28,
|
||||
PIECE_NUMBER_KING = 30,
|
||||
PIECE_NUMBER_WKING = 30,
|
||||
PIECE_NUMBER_BKING = 31, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̋ʂ̔ԍ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD>ȏꍇ<EFBFBD>͂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
PIECE_NUMBER_BKING = 31, // Use this if you need the numbers of the first and second balls
|
||||
PIECE_NUMBER_ZERO = 0,
|
||||
PIECE_NUMBER_NB = 32,
|
||||
};
|
||||
@@ -497,7 +497,7 @@ inline PieceNumber operator++(PieceNumber& d, int) {
|
||||
}
|
||||
inline PieceNumber& operator--(PieceNumber& d) { return d = PieceNumber(int8_t(d) - 1); }
|
||||
|
||||
// PieceNumber<EFBFBD>̐<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̌<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bassert<EFBFBD>p<EFBFBD>B
|
||||
// Piece Number integrity check. for assert.
|
||||
constexpr bool is_ok(PieceNumber pn) { return pn < PIECE_NUMBER_NB; }
|
||||
#endif // defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
||||
|
||||
|
||||
62
src/uci.cpp
62
src/uci.cpp
@@ -44,22 +44,22 @@ extern vector<string> setup_bench(const Position&, istream&);
|
||||
// FEN string of the initial position, normal chess
|
||||
const char* StartFEN = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>}<7D><><EFBFBD>h
|
||||
// Command to automatically generate a game record
|
||||
#if defined (EVAL_LEARN)
|
||||
namespace Learner
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>ǖʂ̎<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// Automatic generation of teacher position
|
||||
void gen_sfen(Position& pos, istringstream& is);
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̊w<EFBFBD>K
|
||||
// Learning from the generated game record
|
||||
void learn(Position& pos, istringstream& is);
|
||||
|
||||
#if defined(GENSFEN2019)
|
||||
// <EFBFBD>J<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̋<EFBFBD><EFBFBD>t<EFBFBD>ǖʂ̎<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>}<7D><><EFBFBD>h
|
||||
// Automatic generation command of teacher phase under development
|
||||
void gen_sfen2019(Position& pos, istringstream& is);
|
||||
#endif
|
||||
|
||||
// <EFBFBD>ǂƕ]<5D><><EFBFBD>l<EFBFBD>̃y<CC83>A<EFBFBD>BLearner::search(),Learner::qsearch()<EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD>B
|
||||
// A pair of reader and evaluation value. Returned by Learner::search(),Learner::qsearch().
|
||||
typedef std::pair<Value, std::vector<Move> > ValueAndPV;
|
||||
|
||||
ValueAndPV qsearch(Position& pos);
|
||||
@@ -71,7 +71,7 @@ namespace Learner
|
||||
#if defined(EVAL_NNUE) && defined(ENABLE_TEST_CMD)
|
||||
void test_cmd(Position& pos, istringstream& is)
|
||||
{
|
||||
// <EFBFBD>T<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>邩<EFBFBD><EFBFBD><EFBFBD>m<EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>̂ŏ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// Initialize as it may be searched.
|
||||
is_ready();
|
||||
|
||||
std::string param;
|
||||
@@ -221,21 +221,21 @@ namespace {
|
||||
<< "\nNodes/second : " << 1000 * nodes / elapsed << endl;
|
||||
}
|
||||
|
||||
// check sum<75><6D><EFBFBD>v<EFBFBD>Z<EFBFBD><5A><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۑ<EFBFBD><DB91><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>Ă<EFBFBD><C482>ƂŎ<C682><C58E><EFBFBD><EFBFBD>ȍ~<7E>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD>s<EFBFBD>Ȃ<EFBFBD><C882>B
|
||||
// When you calculate check sum, save it and check the consistency later.
|
||||
uint64_t eval_sum;
|
||||
} // namespace
|
||||
|
||||
// is_ready_cmd()<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ăяo<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B(bench<63>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD>Ȃǂ<C882><C782><EFBFBD><EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
// <EFBFBD>ǖʂ͏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>̂Œ<EFBFBD><EFBFBD>ӁB
|
||||
// Make is_ready_cmd() callable from outside. (Because I want to call it from the bench command etc.)
|
||||
// Note that the phase is not initialized.
|
||||
void is_ready(bool skipCorruptCheck)
|
||||
{
|
||||
#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"<EFBFBD>̂<EFBFBD><EFBFBD>Ƃ<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
|
||||
// <20>v<EFBFBD>l<EFBFBD>G<EFBFBD><47><EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD>ɉ<EFBFBD><C989>炩<EFBFBD>̃<EFBFBD><CC83>b<EFBFBD>Z<EFBFBD>[<5B>W(<28><><EFBFBD>s<EFBFBD><73>)<29>𑗂<EFBFBD><F0919782>ׂ<EFBFBD><D782>ł<EFBFBD><C582><EFBFBD><EFBFBD>B
|
||||
// -ShogiGUI<EFBFBD>ł͂<EFBFBD><EFBFBD>łɂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ŁAMyShogi<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɒǐ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// -<2D>܂<EFBFBD><DC82>A<EFBFBD><41><EFBFBD>˂<EFBFBD><CB82>牤<EFBFBD>̃G<CC83><47><EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>́A"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
|
||||
// After receiving "isready", modify so that a line feed is sent every 5 seconds until "readyok" is returned. (keep alive processing)
|
||||
// From USI 2.0 specifications.
|
||||
// -The time out time after "is ready" is about 30 seconds. Beyond this, if you want to initialize the evaluation function and secure the hash table,
|
||||
// You should send some kind of message (breakable) from the thinking engine side.
|
||||
// -Shogi GUI already does so, so MyShogi will follow along.
|
||||
//-Also, the engine side of Yaneura King modifies it so that after "isready" is received, a line feed is sent every 5 seconds until "readyok" is returned.
|
||||
|
||||
auto ended = false;
|
||||
auto th = std::thread([&ended] {
|
||||
@@ -243,25 +243,25 @@ void is_ready(bool skipCorruptCheck)
|
||||
while (!ended)
|
||||
{
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||
if (++count >= 50 /* 5<EFBFBD>b */)
|
||||
if (++count >= 50 /* 5 seconds */)
|
||||
{
|
||||
count = 0;
|
||||
sync_cout << sync_endl; // <EFBFBD><EFBFBD><EFBFBD>s<EFBFBD>𑗐M<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
sync_cout << sync_endl; // Send a line break.
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// <EFBFBD>]<5D><><EFBFBD><EFBFBD><D690>̓ǂݍ<C782><DD8D>݂Ȃǎ<C882><C78E>Ԃ̂<D482><CC82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><C582>낤<EFBFBD><EB82A4><EFBFBD><EFBFBD><EFBFBD>͂<EFBFBD><CD82>̃^<5E>C<EFBFBD>~<7E><><EFBFBD>O<EFBFBD>ōs<C58D>Ȃ<EFBFBD><C882>B
|
||||
// <EFBFBD>N<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ɏ<EFBFBD><EFBFBD>Ԃ̂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>鏈<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD>Ə<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>^<5E>C<EFBFBD><43><EFBFBD>A<EFBFBD>E<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>āA<C481>v<EFBFBD>l<EFBFBD>G<EFBFBD><47><EFBFBD>W<EFBFBD><57><EFBFBD>Ƃ<EFBFBD><C682>Ă̔F<CC94><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>^<5E>C<EFBFBD>A<EFBFBD><41><EFBFBD>Ă<EFBFBD><C482>܂<EFBFBD><DC82>B
|
||||
// Perform processing that may take time, such as reading the evaluation function, at this timing.
|
||||
// If you do a time-consuming process at startup, Shogi place will make a timeout judgment and retire the recognition as a thinking engine.
|
||||
if (!UCI::load_eval_finished)
|
||||
{
|
||||
// <EFBFBD>]<5D><><EFBFBD><EFBFBD><D690>̓ǂݍ<C782><DD8D><EFBFBD>
|
||||
// Read evaluation function
|
||||
Eval::load_eval();
|
||||
|
||||
// <EFBFBD>`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD>T<EFBFBD><54><EFBFBD>̌v<CC8C>Z<EFBFBD>ƕۑ<C695>(<28><><EFBFBD>̌<EFBFBD><CC8C>̃<EFBFBD><CC83><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><6A><EFBFBD>̃`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD>̂<EFBFBD><CC82><EFBFBD>)
|
||||
// Calculate and save checksum (to check for subsequent memory corruption)
|
||||
eval_sum = Eval::calc_check_sum();
|
||||
|
||||
// <EFBFBD>\<5C>t<EFBFBD>g<EFBFBD><67><EFBFBD>̕\<5C><>
|
||||
// display soft name
|
||||
Eval::print_softname(eval_sum);
|
||||
|
||||
UCI::load_eval_finished = true;
|
||||
@@ -269,14 +269,14 @@ void is_ready(bool skipCorruptCheck)
|
||||
}
|
||||
else
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ׂ邽<EFBFBD>߂Ƀ`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD>T<EFBFBD><54><EFBFBD>ׂ<F192B282><D782>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>邪.. 0.1<EFBFBD>b<EFBFBD><EFBFBD><EFBFBD>炢<EFBFBD>̂<EFBFBD><EFBFBD>ƂȂ̂ŗǂ<EFBFBD><EFBFBD>Ƃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// Check the checksum every time to see if the memory has been corrupted.
|
||||
// It seems that the time is a little wasteful, but it is good because it is about 0.1 seconds.
|
||||
if (!skipCorruptCheck && eval_sum != Eval::calc_check_sum())
|
||||
sync_cout << "Error! : EVAL memory is corrupted" << sync_endl;
|
||||
}
|
||||
|
||||
// isready<EFBFBD>ɑ<EFBFBD><EFBFBD>Ă<EFBFBD>readyok<EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD>܂Ŏ<EFBFBD><EFBFBD>̃R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD>Ƃ͖<CD96><F191A982><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>̂<EFBFBD>
|
||||
// <EFBFBD><EFBFBD><EFBFBD>̃^<5E>C<EFBFBD>~<7E><><EFBFBD>O<EFBFBD>Ŋe<C58A><65><EFBFBD>ϐ<EFBFBD><CF90>̏<EFBFBD><CC8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>B
|
||||
// For isready, it is promised that the next command will not come until it returns readyok.
|
||||
// Initialize various variables at this timing.
|
||||
|
||||
TT.resize(Options["Hash"]);
|
||||
Search::clear();
|
||||
@@ -284,7 +284,7 @@ void is_ready(bool skipCorruptCheck)
|
||||
|
||||
Threads.stop = false;
|
||||
|
||||
// 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
|
||||
// Terminate the thread created to send keep alive and wait.
|
||||
ended = true;
|
||||
th.join();
|
||||
#endif // defined(EVAL_NNUE)
|
||||
@@ -294,7 +294,7 @@ void is_ready(bool skipCorruptCheck)
|
||||
|
||||
|
||||
// --------------------
|
||||
// <EFBFBD>e<EFBFBD>X<EFBFBD>g<EFBFBD>p<EFBFBD><EFBFBD>qsearch(),search()<EFBFBD>ڌĂ<EFBFBD>
|
||||
// Call qsearch(),search() directly for testing
|
||||
// --------------------
|
||||
|
||||
#if defined(EVAL_LEARN)
|
||||
@@ -391,10 +391,10 @@ void UCI::loop(int argc, char* argv[]) {
|
||||
else if (token == "learn") Learner::learn(pos, is);
|
||||
|
||||
#if defined (GENSFEN2019)
|
||||
// <20>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD>̋<EFBFBD><CC8B>t<EFBFBD>ǖʐ<C796><CA90><EFBFBD><EFBFBD>R<EFBFBD>}<7D><><EFBFBD>h
|
||||
// Command to generate teacher phase under development
|
||||
else if (token == "gensfen2019") Learner::gen_sfen2019(pos, is);
|
||||
#endif
|
||||
// <EFBFBD>e<EFBFBD>X<EFBFBD>g<EFBFBD>p<EFBFBD><EFBFBD>qsearch(),search()<EFBFBD>ڌĂԃR<EFBFBD>}<7D><><EFBFBD>h
|
||||
// Command to call qsearch(),search() directly for testing
|
||||
else if (token == "qsearch") qsearch_cmd(pos);
|
||||
else if (token == "search") search_cmd(pos, is);
|
||||
|
||||
@@ -405,7 +405,7 @@ void UCI::loop(int argc, char* argv[]) {
|
||||
#endif
|
||||
|
||||
#if defined(EVAL_NNUE) && defined(ENABLE_TEST_CMD)
|
||||
// <EFBFBD>e<EFBFBD>X<EFBFBD>g<EFBFBD>R<EFBFBD>}<7D><><EFBFBD>h
|
||||
// test command
|
||||
else if (token == "test") test_cmd(pos, is);
|
||||
#endif
|
||||
else
|
||||
|
||||
11
src/uci.h
11
src/uci.h
@@ -75,16 +75,17 @@ std::string move(Move m, bool chess960);
|
||||
std::string pv(const Position& pos, Depth depth, Value alpha, Value beta);
|
||||
Move to_move(const Position& pos, std::string& str);
|
||||
|
||||
// <EFBFBD>]<5D><><EFBFBD><EFBFBD><D690><EFBFBD><EFBFBD>ǂݍ<C782><DD8D><EFBFBD><F182BE82>̃t<CC83><74><EFBFBD>O<EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>evaldir<69>̕ύX<CF8D>ɂƂ<C982><C682>Ȃ<EFBFBD><C882><EFBFBD>false<73>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>B
|
||||
// Flag that read the evaluation function. This is set to false when evaldir is changed.
|
||||
extern bool load_eval_finished; // = false;
|
||||
} // namespace UCI
|
||||
|
||||
extern UCI::OptionsMap Options;
|
||||
|
||||
// USI<EFBFBD><EFBFBD>"isready"<EFBFBD>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD><68><EFBFBD>Ăяo<D18F><6F><EFBFBD>ꂽ<EFBFBD>Ƃ<EFBFBD><C682>̏<EFBFBD><CC8F><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD>̂Ƃ<CC82><C682>ɕ]<5D><><EFBFBD><EFBFBD><D690>̓ǂݍ<C782><DD8D>݂Ȃǂ<C882><C782>s<EFBFBD>Ȃ<EFBFBD><C882>B
|
||||
// benchmark<EFBFBD>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD>̃n<CC83><6E><EFBFBD>h<EFBFBD><68><EFBFBD>Ȃǂ<C882>"isready"<22><><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>Ȃ<EFBFBD><C882>Ƃ<EFBFBD><C682>ɕ]<5D><><EFBFBD><EFBFBD><D690><EFBFBD><EFBFBD>ǂݍ<C782><DD8D>܂<EFBFBD><DC82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>ɗp<C997><70><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// skipCorruptCheck == true<EFBFBD>̂Ƃ<EFBFBD><EFBFBD>͕]<5D><><EFBFBD><EFBFBD><D690><EFBFBD>2<EFBFBD>x<EFBFBD>ڂ̓ǂݍ<C782><DD8D>݂̂Ƃ<CC82><C682><EFBFBD>check sum<75>ɂ<EFBFBD><C982>郁<EFBFBD><E98381><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><6A><EFBFBD>`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD>ȗ<EFBFBD><C897><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD>̊<CC8A><D690>́AStockfish<73>ɂ͂Ȃ<CD82><C882><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>ƕs<C695>ւȂ̂Œlj<C592><C789><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>B
|
||||
// Processing when USI "isready" command is called. At this time, the evaluation function is read.
|
||||
// Used when you want to load the evaluation function when "isready" does not come in handler of benchmark command etc.
|
||||
// If skipCorruptCheck == true, skip memory corruption check by check sum when reading the evaluation function a second time.
|
||||
// * This function is inconvenient if it is not available in Stockfish, so add it.
|
||||
|
||||
void is_ready(bool skipCorruptCheck = false);
|
||||
|
||||
extern const char* StartFEN;
|
||||
|
||||
@@ -79,21 +79,21 @@ void init(OptionsMap& o) {
|
||||
o["SyzygyProbeDepth"] << Option(1, 1, 100);
|
||||
o["Syzygy50MoveRule"] << Option(true);
|
||||
o["SyzygyProbeLimit"] << Option(7, 0, 7);
|
||||
// <EFBFBD>]<5D><><EFBFBD><EFBFBD><D690>t<EFBFBD>H<EFBFBD><48><EFBFBD>_<EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ύX<CF8D><58><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>A<EFBFBD>]<5D><><EFBFBD><EFBFBD><D690><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>isready<64>^<5E>C<EFBFBD>~<7E><><EFBFBD>O<EFBFBD>œǂݒ<C782><DD92><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// Evaluation function folder. When this is changed, it is necessary to reread the evaluation function at the next isready timing.
|
||||
o["EvalDir"] << Option("eval", on_eval_dir);
|
||||
// isready<EFBFBD>^<5E>C<EFBFBD>~<7E><><EFBFBD>O<EFBFBD>ŕ]<5D><><EFBFBD><EFBFBD><D690><EFBFBD><EFBFBD>ǂݍ<C782><DD8D>܂<EFBFBD><DC82><EFBFBD><EFBFBD>ƁA<C681>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD>]<5D><><EFBFBD><EFBFBD><D690>̕ϊ<CC95><CF8A>̂<EFBFBD><CC82>߂<EFBFBD>
|
||||
// test evalconvert<EFBFBD>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD><68><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ɁA<C981><41><EFBFBD>̐V<CC90><56><EFBFBD><EFBFBD><EFBFBD>]<5D><><EFBFBD><EFBFBD><D690><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߂<EFBFBD>
|
||||
// <EFBFBD><EFBFBD><EFBFBD>̃R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD>̎<EFBFBD><CC8E>s<EFBFBD>O<EFBFBD>Ɉُ<C988><D98F>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>܂<EFBFBD><DC82>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD>̉B<EFBFBD><EFBFBD><EFBFBD>I<EFBFBD>v<EFBFBD>V<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>isready<EFBFBD><EFBFBD><EFBFBD>̕]<5D><><EFBFBD><EFBFBD><D690>̓ǂݍ<C782><DD8D>݂<EFBFBD><DD82>}<7D><><EFBFBD><EFBFBD><EFBFBD>āA
|
||||
// test evalconvert<EFBFBD>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD><68><EFBFBD>@<40><><EFBFBD>B
|
||||
// When the evaluation function is loaded at the isready timing, it is necessary to convert the new evaluation function.
|
||||
// I want to hit the test eval convert command, but there is no new evaluation function
|
||||
// It ends abnormally before executing this command.
|
||||
// Therefore, with this hidden option, you can suppress the loading of the evaluation function when isready,
|
||||
// Hit the test eval convert command.
|
||||
o["SkipLoadingEval"] << Option(false);
|
||||
// <EFBFBD><EFBFBD><EFBFBD>Ղ̎w<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڂ܂ŗp<EFBFBD><EFBFBD><EFBFBD>邩
|
||||
// how many moves to use a fixed move
|
||||
o["BookMoves"] << Option(16, 0, 10000);
|
||||
|
||||
#if defined(EVAL_LEARN)
|
||||
// <EFBFBD>]<5D><><EFBFBD><EFBFBD><D690>̊w<CC8A>K<EFBFBD><4B><EFBFBD>s<EFBFBD>Ȃ<EFBFBD><C882>Ƃ<EFBFBD><C682>́A<CD81>]<5D><><EFBFBD><EFBFBD><D690>̕ۑ<CC95><DB91><EFBFBD><EFBFBD>̃t<CC83>H<EFBFBD><48><EFBFBD>_<EFBFBD><5F><EFBFBD>ύX<CF8D>ł<EFBFBD><C582><EFBFBD><EFBFBD>B
|
||||
// <EFBFBD>f<EFBFBD>t<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>ł<EFBFBD>evalsave<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>̃t<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>͎<EFBFBD><EFBFBD>O<EFBFBD>ɗp<EFBFBD>ӂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂Ƃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// <EFBFBD><EFBFBD><EFBFBD>̃t<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>z<EFBFBD><EFBFBD><EFBFBD>Ƀt<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD><EFBFBD>"0/","1/",<EFBFBD>c<EFBFBD>̂悤<EFBFBD>Ɏ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD>Ɍ@<40><><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>ɕ]<5D><><EFBFBD><EFBFBD><D690>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>ۑ<EFBFBD><DB91><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
// When learning the evaluation function, you can change the folder to save the evaluation function.
|
||||
// Evalsave by default. This folder shall be prepared in advance.
|
||||
// Automatically dig a folder under this folder like "0/", "1/", ... and save the evaluation function file there.
|
||||
o["EvalSaveDir"] << Option("evalsave");
|
||||
#endif
|
||||
}
|
||||
@@ -204,6 +204,6 @@ Option& Option::operator=(const string& v) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
// <EFBFBD>]<5D><><EFBFBD><EFBFBD><D690><EFBFBD><EFBFBD>ǂݍ<C782><DD8D><EFBFBD><F182BE82>̃t<CC83><74><EFBFBD>O<EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>evaldir<69>̕ύX<CF8D>ɂƂ<C982><C682>Ȃ<EFBFBD><C882><EFBFBD>false<73>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>B
|
||||
// Flag that read the evaluation function. This is set to false when evaldir is changed.
|
||||
bool load_eval_finished = false;
|
||||
} // namespace UCI
|
||||
|
||||
Reference in New Issue
Block a user