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 },
|
{ f_king, e_king },
|
||||||
{ BONA_PIECE_ZERO, BONA_PIECE_ZERO },
|
{ 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 },
|
{ BONA_PIECE_ZERO, BONA_PIECE_ZERO },
|
||||||
{ e_pawn, f_pawn },
|
{ e_pawn, f_pawn },
|
||||||
{ e_knight, f_knight },
|
{ e_knight, f_knight },
|
||||||
@@ -953,11 +953,11 @@ ExtBonaPiece kpp_board_index[PIECE_NB] = {
|
|||||||
{ e_rook, f_rook },
|
{ e_rook, f_rook },
|
||||||
{ e_queen, f_queen },
|
{ e_queen, f_queen },
|
||||||
{ e_king, f_king },
|
{ 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
|
// Check whether the pieceListFw[] held internally is a correct BonaPiece.
|
||||||
// <EFBFBD><EFBFBD> : <20>f<EFBFBD>o<EFBFBD>b<EFBFBD>O<EFBFBD>p<EFBFBD>B<EFBFBD>x<EFBFBD><78><EFBFBD>B
|
// Note: For debugging. slow.
|
||||||
bool EvalList::is_valid(const Position& pos)
|
bool EvalList::is_valid(const Position& pos)
|
||||||
{
|
{
|
||||||
std::set<PieceNumber> piece_numbers;
|
std::set<PieceNumber> piece_numbers;
|
||||||
@@ -973,28 +973,28 @@ bool EvalList::is_valid(const Position& pos)
|
|||||||
for (int i = 0; i < length(); ++i)
|
for (int i = 0; i < length(); ++i)
|
||||||
{
|
{
|
||||||
BonaPiece fw = pieceListFw[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) {
|
if (fw == Eval::BONA_PIECE_ZERO) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// <EFBFBD>͈͊O
|
// Out of range
|
||||||
if (!(0 <= fw && fw < fe_end))
|
if (!(0 <= fw && fw < fe_end))
|
||||||
return false;
|
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)
|
for (Piece pc = NO_PIECE; pc < PIECE_NB; ++pc)
|
||||||
{
|
{
|
||||||
auto pt = type_of(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;
|
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);
|
auto s = BonaPiece(kpp_board_index[pc].fw);
|
||||||
if (s <= fw && fw < s + SQUARE_NB)
|
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);
|
Square sq = (Square)(fw - s);
|
||||||
Piece pc2 = pos.piece_on(sq);
|
Piece pc2 = pos.piece_on(sq);
|
||||||
|
|
||||||
@@ -1004,7 +1004,7 @@ bool EvalList::is_valid(const Position& pos)
|
|||||||
goto Found;
|
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;
|
return false;
|
||||||
Found:;
|
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);
|
Value compute_eval(const Position& pos);
|
||||||
|
|
||||||
#if defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
#if defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
||||||
// <EFBFBD>]<5D><><EFBFBD><EFBFBD><D690>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>ǂݍ<C782><DD8D>ށB
|
// Read the evaluation function file.
|
||||||
// <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
|
// This is only called once in response to the "is_ready" command. It is not supposed to be called twice.
|
||||||
// (<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)
|
// (However, if isready is sent again after EvalDir (evaluation function folder) has been changed, read it again.)
|
||||||
void load_eval();
|
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) {}
|
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
|
// A type that represents P(Piece) when calling KKP/KPP in Bonanza.
|
||||||
// <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
|
// 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
|
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,
|
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,
|
BONA_PIECE_ZERO = 0,
|
||||||
|
|
||||||
fe_hand_end = BONA_PIECE_ZERO + 1,
|
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
|
// Don't pack the numbers of unrealistic walks and incense on the board like Bonanza.
|
||||||
// <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
|
// 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.
|
||||||
// <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
|
// 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,
|
f_pawn = fe_hand_end,
|
||||||
e_pawn = f_pawn + SQUARE_NB,
|
e_pawn = f_pawn + SQUARE_NB,
|
||||||
f_knight = e_pawn + SQUARE_NB,
|
f_knight = e_pawn + SQUARE_NB,
|
||||||
@@ -84,7 +84,7 @@ enum BonaPiece : int32_t
|
|||||||
fe_end = e_queen + SQUARE_NB,
|
fe_end = e_queen + SQUARE_NB,
|
||||||
f_king = fe_end,
|
f_king = fe_end,
|
||||||
e_king = f_king + SQUARE_NB,
|
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) \
|
#define ENABLE_INCR_OPERATORS_ON(T) \
|
||||||
@@ -95,8 +95,8 @@ ENABLE_INCR_OPERATORS_ON(BonaPiece)
|
|||||||
|
|
||||||
#undef ENABLE_INCR_OPERATORS_ON
|
#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>
|
// 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)
|
||||||
// <EFBFBD>y<EFBFBD>A<EFBFBD>ɂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD>ExtBonaPiece<EFBFBD>^<5E>ƌĂԂ<C482><D482>Ƃɂ<C682><C982><EFBFBD><EFBFBD>B
|
// Let's call the paired one the ExtBonaPiece type.
|
||||||
union ExtBonaPiece
|
union ExtBonaPiece
|
||||||
{
|
{
|
||||||
struct {
|
struct {
|
||||||
@@ -109,28 +109,28 @@ union ExtBonaPiece
|
|||||||
ExtBonaPiece(BonaPiece fw_, BonaPiece fb_) : fw(fw_), fb(fb_) {}
|
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
|
// Information about where the piece has moved from where to by this move.
|
||||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ExtBonaPiece<EFBFBD>\<5C><><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>B
|
// Assume the piece is an ExtBonaPiece expression.
|
||||||
struct ChangedBonaPiece
|
struct ChangedBonaPiece
|
||||||
{
|
{
|
||||||
ExtBonaPiece old_piece;
|
ExtBonaPiece old_piece;
|
||||||
ExtBonaPiece new_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
|
// An array for finding the BonaPiece corresponding to the piece pc on the board of the KPP table.
|
||||||
// <EFBFBD><EFBFBD>)
|
// example)
|
||||||
// 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 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; // <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; // BonaPiece corresponding to pc in sq seen from behind
|
||||||
extern ExtBonaPiece kpp_board_index[PIECE_NB];
|
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
|
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_fw() const { return const_cast<BonaPiece*>(pieceListFw); }
|
||||||
BonaPiece* piece_list_fb() const { return const_cast<BonaPiece*>(pieceListFb); }
|
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 bona_piece(PieceNumber piece_no) const
|
||||||
{
|
{
|
||||||
ExtBonaPiece bp;
|
ExtBonaPiece bp;
|
||||||
@@ -139,36 +139,36 @@ struct EvalList
|
|||||||
return bp;
|
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) {
|
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);
|
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]; }
|
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
|
// Initialize the pieceList.
|
||||||
// <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
|
// Set the value of unused pieces to BONA_PIECE_ZERO in case you want to deal with dropped pieces.
|
||||||
// <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
|
// A normal evaluation function can be used as an evaluation function for missing frames.
|
||||||
// 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
|
// piece_no_list is initialized with PIECE_NUMBER_NB to facilitate debugging.
|
||||||
void clear()
|
void clear()
|
||||||
{
|
{
|
||||||
|
|
||||||
for (auto& p : pieceListFw)
|
for (auto& p: pieceListFw)
|
||||||
p = BONA_PIECE_ZERO;
|
p = BONA_PIECE_ZERO;
|
||||||
|
|
||||||
for (auto& p : pieceListFb)
|
for (auto& p: pieceListFb)
|
||||||
p = BONA_PIECE_ZERO;
|
p = BONA_PIECE_ZERO;
|
||||||
|
|
||||||
for (auto& v : piece_no_list_board)
|
for (auto& v :piece_no_list_board)
|
||||||
v = PIECE_NUMBER_NB;
|
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
|
// Check whether the pieceListFw[] held internally is a correct BonaPiece.
|
||||||
// <EFBFBD><EFBFBD> : <20>f<EFBFBD>o<EFBFBD>b<EFBFBD>O<EFBFBD>p<EFBFBD>B<EFBFBD>x<EFBFBD><78><EFBFBD>B
|
// Note: For debugging. slow.
|
||||||
bool is_valid(const Position& pos);
|
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)
|
inline void set_piece_on_board(PieceNumber piece_no, BonaPiece fw, BonaPiece fb, Square sq)
|
||||||
{
|
{
|
||||||
assert(is_ok(piece_no));
|
assert(is_ok(piece_no));
|
||||||
@@ -177,21 +177,21 @@ struct EvalList
|
|||||||
piece_no_list_board[sq] = piece_no;
|
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>
|
// Length of piece list
|
||||||
// 38<EFBFBD>Œ<EFBFBD>
|
// 38 fixed
|
||||||
public:
|
public:
|
||||||
int length() const { return PIECE_NUMBER_KING; }
|
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
|
// Must be a multiple of 4 to use VPGATHERDD.
|
||||||
// <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>
|
// In addition, the KPPT type evaluation function, etc. is based on the assumption that the 39th and 40th elements are zero.
|
||||||
// <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
|
// Please note that there is a part that is accessed.
|
||||||
static const int MAX_LENGTH = 32;
|
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>
|
// An array that holds the piece number (PieceNumber) for the pieces on the board
|
||||||
// <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
|
// Hold up to +1 for when the ball is moving to SQUARE_NB,
|
||||||
// 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
|
// SQUARE_NB balls are not moved, so this value should never be used.
|
||||||
PieceNumber piece_no_list_board[SQUARE_NB_PLUS1];
|
PieceNumber piece_no_list_board[SQUARE_NB_PLUS1];
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@@ -199,20 +199,20 @@ private:
|
|||||||
BonaPiece pieceListFb[MAX_LENGTH];
|
BonaPiece pieceListFb[MAX_LENGTH];
|
||||||
};
|
};
|
||||||
|
|
||||||
// <EFBFBD>]<5D><><EFBFBD>l<EFBFBD>̍<EFBFBD><CC8D><EFBFBD><EFBFBD>v<EFBFBD>Z<EFBFBD>̊Ǘ<CC8A><C797>p
|
// For management of evaluation value difference calculation
|
||||||
// <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>
|
// A structure for managing the number of pieces that have moved from the previous stage
|
||||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>́A<EFBFBD>ő<EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>B
|
// Up to 2 moving pieces.
|
||||||
struct DirtyPiece
|
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];
|
Eval::ChangedBonaPiece changed_piece[2];
|
||||||
|
|
||||||
// dirty<EFBFBD>ɂȂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԍ<EFBFBD>
|
// The number of dirty pieces
|
||||||
PieceNumber pieceNo[2];
|
PieceNumber pieceNo[2];
|
||||||
|
|
||||||
// dirty<EFBFBD>ɂȂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
// The number of dirty files.
|
||||||
// null move<76><65><EFBFBD><EFBFBD>0<EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>肤<EFBFBD><E882A4><EFBFBD>B
|
// It can be 0 for null move.
|
||||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǝ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃōő<EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>B
|
// Up to 2 moving pieces and taken pieces.
|
||||||
int dirty_num;
|
int dirty_num;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
52
src/misc.cpp
52
src/misc.cpp
@@ -527,11 +527,11 @@ void bindThisThread(size_t idx) {
|
|||||||
|
|
||||||
} // namespace WinProcGroup
|
} // namespace WinProcGroup
|
||||||
|
|
||||||
// 現在時刻を文字列化したもを返す。(評価関数の学習時などに用いる)
|
// Returns a string that represents the current time. (Used when learning evaluation functions)
|
||||||
std::string now_string()
|
std::string now_string()
|
||||||
{
|
{
|
||||||
// std::ctime(), localtime()を使うと、MSVCでセキュアでないという警告が出る。
|
// Using std::ctime(), localtime() gives a warning that MSVC is not secure.
|
||||||
// C++標準的にはそんなことないはずなのだが…。
|
// This shouldn't happen in the C++ standard, but...
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
// C4996 : 'ctime' : This function or variable may be unsafe.Consider using ctime_s instead.
|
// 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 tp = std::chrono::system_clock::to_time_t(now);
|
||||||
auto result = string(std::ctime(&tp));
|
auto result = string(std::ctime(&tp));
|
||||||
|
|
||||||
// 末尾に改行コードが含まれているならこれを除去する
|
// remove line endings if they are included at the end
|
||||||
while (*result.rbegin() == '\n' || (*result.rbegin() == '\r'))
|
while (*result.rbegin() == '\n' || (*result.rbegin() == '\r'))
|
||||||
result.pop_back();
|
result.pop_back();
|
||||||
return result;
|
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);
|
fs.seekg(0, fstream::end);
|
||||||
uint64_t eofPos = (uint64_t)fs.tellg();
|
uint64_t eofPos = (uint64_t)fs.tellg();
|
||||||
fs.clear(); // これをしないと次のseekに失敗することがある。
|
fs.clear(); // Otherwise the next seek may fail.
|
||||||
fs.seekg(0, fstream::beg);
|
fs.seekg(0, fstream::beg);
|
||||||
uint64_t begPos = (uint64_t)fs.tellg();
|
uint64_t begPos = (uint64_t)fs.tellg();
|
||||||
uint64_t file_size = eofPos - begPos;
|
uint64_t file_size = eofPos - begPos;
|
||||||
//std::cout << "filename = " << filename << " , file_size = " << file_size << endl;
|
//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);
|
void* ptr = callback_func(file_size);
|
||||||
|
|
||||||
// バッファが確保できなかった場合や、想定していたファイルサイズと異なった場合は、
|
// If the buffer could not be secured, or if the file size is different from the expected file size,
|
||||||
// nullptrを返すことになっている。このとき、読み込みを中断し、エラーリターンする。
|
// It is supposed to return nullptr. At this time, reading is interrupted and an error is returned.
|
||||||
if (ptr == nullptr)
|
if (ptr == nullptr)
|
||||||
return 2;
|
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)
|
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);
|
uint64_t read_size = (pos + block_size < file_size) ? block_size : (file_size - pos);
|
||||||
fs.read((char*)ptr + pos, read_size);
|
fs.read((char*)ptr + pos, read_size);
|
||||||
|
|
||||||
// ファイルの途中で読み込みエラーに至った。
|
// Read error occurred in the middle of the file.
|
||||||
if (fs.fail())
|
if (fs.fail())
|
||||||
return 2;
|
return 2;
|
||||||
|
|
||||||
@@ -613,10 +613,10 @@ int write_memory_to_file(std::string filename, void* ptr, uint64_t size)
|
|||||||
if (fs.fail())
|
if (fs.fail())
|
||||||
return 1;
|
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)
|
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);
|
uint64_t write_size = (pos + block_size < size) ? block_size : (size - pos);
|
||||||
fs.write((char*)ptr + pos, write_size);
|
fs.write((char*)ptr + pos, write_size);
|
||||||
//cout << ".";
|
//cout << ".";
|
||||||
@@ -629,17 +629,17 @@ int write_memory_to_file(std::string filename, void* ptr, uint64_t size)
|
|||||||
// mkdir wrapper
|
// mkdir wrapper
|
||||||
// ----------------------------
|
// ----------------------------
|
||||||
|
|
||||||
// カレントフォルダ相対で指定する。成功すれば0、失敗すれば非0が返る。
|
// Specify relative to the current folder. Returns 0 on success, non-zero on failure.
|
||||||
// フォルダを作成する。日本語は使っていないものとする。
|
// Create a folder. Japanese is not used.
|
||||||
// どうもmsys2環境下のgccだと_wmkdir()だとフォルダの作成に失敗する。原因不明。
|
// In case of gcc under msys2 environment, folder creation fails with _wmkdir(). Cause unknown.
|
||||||
// 仕方ないので_mkdir()を用いる。
|
// Use _mkdir() because there is no help for it.
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
// Windows用
|
// for Windows
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#include <codecvt> // mkdirするのにwstringが欲しいのでこれが必要
|
#include <codecvt> // I need this because I want wstring to mkdir
|
||||||
#include <locale> // wstring_convertにこれが必要。
|
#include <locale> // This is required for wstring_convert.
|
||||||
|
|
||||||
namespace Dependency {
|
namespace Dependency {
|
||||||
int mkdir(std::string dir_name)
|
int mkdir(std::string dir_name)
|
||||||
@@ -663,9 +663,9 @@ namespace Dependency {
|
|||||||
#endif
|
#endif
|
||||||
#elif defined(__linux__)
|
#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"
|
#include "sys/stat.h"
|
||||||
|
|
||||||
namespace Dependency {
|
namespace Dependency {
|
||||||
@@ -676,8 +676,8 @@ namespace Dependency {
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
// Linux環境かどうかを判定するためにはmakefileを分けないといけなくなってくるな..
|
// In order to judge whether it is a Linux environment, we have to divide the makefile..
|
||||||
// linuxでフォルダ掘る機能は、とりあえずナシでいいや..。評価関数ファイルの保存にしか使ってないし…。
|
// The function to dig a folder on linux is good for the time being... Only used to save the evaluation function file...
|
||||||
|
|
||||||
namespace Dependency {
|
namespace Dependency {
|
||||||
int mkdir(std::string dir_name)
|
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.
|
/// Output values only have 1/8th of their bits set on average.
|
||||||
template<typename T> T sparse_rand()
|
template<typename T> T sparse_rand()
|
||||||
{ return T(rand64() & rand64() & rand64()); }
|
{ return T(rand64() & rand64() & rand64()); }
|
||||||
|
// Returns a random number from 0 to n-1. (Not uniform distribution, but this is enough in reality)
|
||||||
// 0からn-1までの乱数を返す。(一様分布ではないが現実的にはこれで十分)
|
|
||||||
uint64_t rand(uint64_t n) { return rand<uint64_t>() % n; }
|
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; }
|
uint64_t get_seed() const { return s; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// 乱数のseedを表示する。(デバッグ用)
|
// Display a random seed. (For debugging)
|
||||||
inline std::ostream& operator<<(std::ostream& os, PRNG& prng)
|
inline std::ostream& operator<<(std::ostream& os, PRNG& prng)
|
||||||
{
|
{
|
||||||
os << "PRNG::seed = " << std::hex << prng.get_seed() << std::dec;
|
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 {
|
namespace WinProcGroup {
|
||||||
void bindThisThread(size_t idx);
|
void bindThisThread(size_t idx);
|
||||||
}
|
}
|
||||||
|
// sleep for the specified number of milliseconds.
|
||||||
// 指定されたミリ秒だけsleepする。
|
|
||||||
extern void sleep(int ms);
|
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();
|
std::string now_string();
|
||||||
|
|
||||||
// 途中での終了処理のためのwrapper
|
// wrapper for end processing on the way
|
||||||
static void my_exit()
|
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);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// msys2、Windows Subsystem for Linuxなどのgcc/clangでコンパイルした場合、
|
// When compiled with gcc/clang such as msys2, Windows Subsystem for Linux,
|
||||||
// C++のstd::ifstreamで::read()は、一発で2GB以上のファイルの読み書きが出来ないのでそのためのwrapperである。
|
// 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_func of the argument of read_file_to_memory() uses the file size as an argument when the file can be opened
|
||||||
// callbackされるので、バッファを確保して、その先頭ポインタを返す関数を渡すと、そこに読み込んでくれる。
|
// 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.
|
||||||
// これらの関数は、ファイルが見つからないときなどエラーの際には非0を返す。
|
// These functions return non-zero on error, such as when the file cannot be found.
|
||||||
//
|
//
|
||||||
// また、callbackされた関数のなかでバッファが確保できなかった場合や、想定していたファイルサイズと異なった場合は、
|
// Also, if the buffer cannot be allocated in the callback function or if the file size is different from the expected file size,
|
||||||
// nullptrを返せば良い。このとき、read_file_to_memory()は、読み込みを中断し、エラーリターンする。
|
// 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 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);
|
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
|
struct AsyncPRNG
|
||||||
{
|
{
|
||||||
AsyncPRNG(uint64_t seed) : prng(seed) { assert(seed); }
|
AsyncPRNG(uint64_t seed) : prng(seed) { assert(seed); }
|
||||||
// [ASYNC] 乱数を一つ取り出す。
|
// [ASYNC] Extract one random number.
|
||||||
template<typename T> T rand() {
|
template<typename T> T rand() {
|
||||||
std::unique_lock<std::mutex> lk(mutex);
|
std::unique_lock<std::mutex> lk(mutex);
|
||||||
return prng.rand<T>();
|
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) {
|
uint64_t rand(uint64_t n) {
|
||||||
std::unique_lock<std::mutex> lk(mutex);
|
std::unique_lock<std::mutex> lk(mutex);
|
||||||
return prng.rand(n);
|
return prng.rand(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 内部で使用している乱数seedを返す。
|
// Return the random seed used internally.
|
||||||
uint64_t get_seed() const { return prng.get_seed(); }
|
uint64_t get_seed() const { return prng.get_seed(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -208,7 +206,7 @@ protected:
|
|||||||
PRNG prng;
|
PRNG prng;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 乱数のseedを表示する。(デバッグ用)
|
// Display a random seed. (For debugging)
|
||||||
inline std::ostream& operator<<(std::ostream& os, AsyncPRNG& prng)
|
inline std::ostream& operator<<(std::ostream& os, AsyncPRNG& prng)
|
||||||
{
|
{
|
||||||
os << "AsyncPRNG::seed = " << std::hex << prng.get_seed() << std::dec;
|
os << "AsyncPRNG::seed = " << std::hex << prng.get_seed() << std::dec;
|
||||||
@@ -219,18 +217,18 @@ inline std::ostream& operator<<(std::ostream& os, AsyncPRNG& prng)
|
|||||||
// Math
|
// Math
|
||||||
// --------------------
|
// --------------------
|
||||||
|
|
||||||
// 進行度の計算や学習で用いる数学的な関数
|
// Mathematical function used for progress calculation and learning
|
||||||
namespace Math {
|
namespace Math {
|
||||||
// シグモイド関数
|
// Sigmoid function
|
||||||
// = 1.0 / (1.0 + std::exp(-x))
|
// = 1.0 / (1.0 + std::exp(-x))
|
||||||
double sigmoid(double x);
|
double sigmoid(double x);
|
||||||
|
|
||||||
// シグモイド関数の微分
|
// Differentiation of sigmoid function
|
||||||
// = sigmoid(x) * (1.0 - sigmoid(x))
|
// = sigmoid(x) * (1.0-sigmoid(x))
|
||||||
double dsigmoid(double x);
|
double dsigmoid(double x);
|
||||||
|
|
||||||
// vを[lo,hi]の間に収まるようにクリップする。
|
// Clip v so that it fits between [lo,hi].
|
||||||
// ※ Stockfishではこの関数、bitboard.hに書いてある。
|
// * 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) {
|
template<class T> constexpr const T& clamp(const T& v, const T& lo, const T& hi) {
|
||||||
return v < lo ? lo : v > hi ? hi : v;
|
return v < lo ? lo : v > hi ? hi : v;
|
||||||
}
|
}
|
||||||
@@ -241,12 +239,12 @@ namespace Math {
|
|||||||
// Path
|
// Path
|
||||||
// --------------------
|
// --------------------
|
||||||
|
|
||||||
// C#にあるPathクラス的なもの。ファイル名の操作。
|
// Something like Path class in C#. File name manipulation.
|
||||||
// C#のメソッド名に合わせておく。
|
// Match with the C# method name.
|
||||||
struct Path
|
struct Path
|
||||||
{
|
{
|
||||||
// path名とファイル名を結合して、それを返す。
|
// Combine the path name and file name and return it.
|
||||||
// folder名のほうは空文字列でないときに、末尾に'/'か'\\'がなければそれを付与する。
|
// 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)
|
static std::string Combine(const std::string& folder, const std::string& filename)
|
||||||
{
|
{
|
||||||
if (folder.length() >= 1 && *folder.rbegin() != '/' && *folder.rbegin() != '\\')
|
if (folder.length() >= 1 && *folder.rbegin() != '/' && *folder.rbegin() != '\\')
|
||||||
@@ -255,10 +253,10 @@ struct Path
|
|||||||
return folder + filename;
|
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)
|
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_index1 = path.find_last_of("\\") + 1;
|
||||||
auto path_index2 = path.find_last_of("/") + 1;
|
auto path_index2 = path.find_last_of("/") + 1;
|
||||||
auto path_index = std::max(path_index1, path_index2);
|
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);
|
extern void* aligned_malloc(size_t size, size_t align);
|
||||||
static void aligned_free(void* ptr) { _mm_free(ptr); }
|
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>
|
template <typename T>
|
||||||
class AlignedAllocator {
|
class AlignedAllocator {
|
||||||
public:
|
public:
|
||||||
@@ -293,15 +291,15 @@ public:
|
|||||||
|
|
||||||
namespace Dependency
|
namespace Dependency
|
||||||
{
|
{
|
||||||
// Linux環境ではgetline()したときにテキストファイルが'\r\n'だと
|
// In the Linux environment, if you getline() the text file is'\r\n'
|
||||||
// '\r'が末尾に残るのでこの'\r'を除去するためにwrapperを書く。
|
// Since'\r' remains at the end, write a wrapper to remove this'\r'.
|
||||||
// そのため、fstreamに対してgetline()を呼び出すときは、
|
// So when calling getline() on fstream,
|
||||||
// std::getline()ではなく単にgetline()と書いて、この関数を使うべき。
|
// just write getline() instead of std::getline() and use this function.
|
||||||
extern bool getline(std::ifstream& fs, std::string& s);
|
extern bool getline(std::ifstream& fs, std::string& s);
|
||||||
|
|
||||||
// フォルダを作成する。
|
// Create a folder.
|
||||||
// カレントフォルダ相対で指定する。dir_nameに日本語は使っていないものとする。
|
// Specify relative to the current folder. Japanese is not used for dir_name.
|
||||||
// 成功すれば0、失敗すれば非0が返る。
|
// Returns 0 on success, non-zero on failure.
|
||||||
extern int mkdir(std::string dir_name);
|
extern int mkdir(std::string dir_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -209,11 +209,11 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th
|
|||||||
st = si;
|
st = si;
|
||||||
|
|
||||||
#if defined(EVAL_NNUE)
|
#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();
|
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
|
// In updating the PieceList, we have to set which piece is where,
|
||||||
// <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>[
|
// A counter of how much each piece has been used
|
||||||
PieceNumber next_piece_number = PIECE_NUMBER_ZERO;
|
PieceNumber next_piece_number = PIECE_NUMBER_ZERO;
|
||||||
#endif // defined(EVAL_NNUE)
|
#endif // defined(EVAL_NNUE)
|
||||||
|
|
||||||
@@ -235,10 +235,10 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th
|
|||||||
|
|
||||||
#if defined(EVAL_NNUE)
|
#if defined(EVAL_NNUE)
|
||||||
PieceNumber piece_no =
|
PieceNumber piece_no =
|
||||||
(idx == W_KING) ? PIECE_NUMBER_WKING : // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
(idx == W_KING) ?PIECE_NUMBER_WKING : //
|
||||||
(idx == B_KING) ? PIECE_NUMBER_BKING : // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
(idx == B_KING) ?PIECE_NUMBER_BKING : // back ball
|
||||||
next_piece_number++; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȊO
|
next_piece_number++; // otherwise
|
||||||
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>
|
evalList.put_piece(piece_no, sq, pc); // Place the pc piece in the sq box
|
||||||
#endif // defined(EVAL_NNUE)
|
#endif // defined(EVAL_NNUE)
|
||||||
|
|
||||||
++sq;
|
++sq;
|
||||||
@@ -823,7 +823,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
|
|||||||
st->rule50 = 0;
|
st->rule50 = 0;
|
||||||
|
|
||||||
#if defined(EVAL_NNUE)
|
#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.pieceNo[1] = piece_no1;
|
||||||
dp.changed_piece[1].old_piece = evalList.bona_piece(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) {
|
void Position::do_castling(Color us, Square from, Square& to, Square& rfrom, Square& rto) {
|
||||||
#if defined(EVAL_NNUE)
|
#if defined(EVAL_NNUE)
|
||||||
auto& dp = st->dirtyPiece;
|
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
|
// Record the moved pieces in StateInfo for difference calculation.
|
||||||
dp.dirty_num = 2; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>
|
dp.dirty_num = 2; // 2 pieces moved
|
||||||
|
|
||||||
PieceNumber piece_no0;
|
PieceNumber piece_no0;
|
||||||
PieceNumber piece_no1;
|
PieceNumber piece_no1;
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ struct StateInfo {
|
|||||||
#if defined(EVAL_NNUE)
|
#if defined(EVAL_NNUE)
|
||||||
Eval::NNUE::Accumulator accumulator;
|
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;
|
Eval::DirtyPiece dirtyPiece;
|
||||||
#endif // defined(EVAL_NNUE)
|
#endif // defined(EVAL_NNUE)
|
||||||
};
|
};
|
||||||
@@ -82,7 +82,7 @@ typedef std::unique_ptr<std::deque<StateInfo>> StateListPtr;
|
|||||||
/// traversing the search tree.
|
/// traversing the search tree.
|
||||||
class Thread;
|
class Thread;
|
||||||
|
|
||||||
// pack<EFBFBD><EFBFBD><EFBFBD>ꂽsfen
|
// packed sfen
|
||||||
struct PackedSfen { uint8_t data[32]; };
|
struct PackedSfen { uint8_t data[32]; };
|
||||||
|
|
||||||
class Position {
|
class Position {
|
||||||
@@ -181,31 +181,31 @@ public:
|
|||||||
#if defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
#if defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
||||||
// --- StateInfo
|
// --- StateInfo
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD><EFBFBD>݂̋ǖʂɑΉ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>StateInfo<EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><EFBFBD>B
|
// Returns the StateInfo corresponding to the current situation.
|
||||||
// <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
|
// For example, if state()->capturedPiece, the pieces captured in the previous phase are stored.
|
||||||
StateInfo* state() const { return st; }
|
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; }
|
const Eval::EvalList* eval_list() const { return &evalList; }
|
||||||
#endif // defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
#endif // defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
||||||
|
|
||||||
#if 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
|
// Get the packed sfen. Returns to the buffer specified in the argument.
|
||||||
// gamePly<EFBFBD><EFBFBD>pack<EFBFBD>Ɋ܂߂Ȃ<EFBFBD><EFBFBD>B
|
// Do not include gamePly in pack.
|
||||||
void sfen_pack(PackedSfen& sfen);
|
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
|
// <20><> It is slow to go through sfen, so I made a function to set packed sfen directly.
|
||||||
// pos.set(sfen_unpack(data),si,th); <20>Ɠ<EFBFBD><C693><EFBFBD><EFBFBD>B
|
// Equivalent to pos.set(sfen_unpack(data),si,th);.
|
||||||
// <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
|
// If there is a problem with the passed phase and there is an error, non-zero is returned.
|
||||||
// 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
|
// 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);
|
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);
|
//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]; }
|
Square king_square(Color c) const { return pieceList[make_piece(c, KING)][0]; }
|
||||||
#endif // EVAL_LEARN
|
#endif // EVAL_LEARN
|
||||||
|
|
||||||
@@ -223,7 +223,7 @@ private:
|
|||||||
void do_castling(Color us, Square from, Square& to, Square& rfrom, Square& rto);
|
void do_castling(Color us, Square from, Square& to, Square& rfrom, Square& rto);
|
||||||
|
|
||||||
#if defined(EVAL_NNUE)
|
#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;
|
PieceNumber piece_no_of(Square sq) const;
|
||||||
#endif // defined(EVAL_NNUE)
|
#endif // defined(EVAL_NNUE)
|
||||||
|
|
||||||
@@ -245,7 +245,7 @@ private:
|
|||||||
bool chess960;
|
bool chess960;
|
||||||
|
|
||||||
#if defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
#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;
|
Eval::EvalList evalList;
|
||||||
#endif // defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
#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)
|
#if defined (EVAL_LEARN)
|
||||||
|
|
||||||
namespace Learner
|
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
|
// For learning, prepare a stub that can call search,qsearch() from one thread.
|
||||||
// <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>
|
// From now on, it is better to have a Searcher and prepare a substitution table for each thread like Apery.
|
||||||
// <EFBFBD>ǂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m<EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>B
|
// It might have been good.
|
||||||
|
|
||||||
// <EFBFBD>w<EFBFBD>K<EFBFBD>̂<EFBFBD><EFBFBD>߂̏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
// Initialization for learning.
|
||||||
// Learner::search(),Learner::qsearch()<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ăяo<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
// Called from Learner::search(),Learner::qsearch().
|
||||||
void init_for_search(Position& pos, Stack* ss)
|
void init_for_search(Position& pos, Stack* ss)
|
||||||
{
|
{
|
||||||
|
|
||||||
// RootNode<EFBFBD><EFBFBD>ss->ply == 0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
// RootNode requires ss->ply == 0.
|
||||||
// <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
|
// Because it clears to zero, ss->ply == 0, so it's okay...
|
||||||
|
|
||||||
std::memset(ss - 7, 0, 10 * sizeof(Stack));
|
std::memset(ss - 7, 0, 10 * sizeof(Stack));
|
||||||
|
|
||||||
// Search::Limits<EFBFBD>Ɋւ<EFBFBD><EFBFBD><EFBFBD>
|
// About Search::Limits
|
||||||
// <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
|
// Be careful because this member variable is global and affects other threads.
|
||||||
{
|
{
|
||||||
auto& limits = Search::Limits;
|
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;
|
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;
|
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;
|
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;
|
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;
|
//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;
|
//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>
|
// Because it is not prepared for each thread
|
||||||
// <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
|
// May be overwritten by another thread. There is no help for it.
|
||||||
// <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
|
// If that happens, I think it should be 0.
|
||||||
//drawValueTable[REPETITION_DRAW][BLACK] = VALUE_ZERO;
|
//drawValueTable[REPETITION_DRAW][BLACK] = VALUE_ZERO;
|
||||||
//drawValueTable[REPETITION_DRAW][WHITE] = VALUE_ZERO;
|
//drawValueTable[REPETITION_DRAW][WHITE] = VALUE_ZERO;
|
||||||
}
|
}
|
||||||
|
|
||||||
// this_thread<EFBFBD>Ɋւ<EFBFBD><EFBFBD>āB
|
// Regarding this_thread.
|
||||||
|
|
||||||
{
|
{
|
||||||
auto th = pos.this_thread();
|
auto th = pos.this_thread();
|
||||||
|
|
||||||
@@ -1999,10 +2000,10 @@ namespace Learner
|
|||||||
th->selDepth = 0;
|
th->selDepth = 0;
|
||||||
th->rootDepth = 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;
|
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();
|
// th->clear();
|
||||||
|
|
||||||
int ct = int(Options["Contempt"]) * PawnValueEg / 100; // From centipawns
|
int ct = int(Options["Contempt"]) * PawnValueEg / 100; // From centipawns
|
||||||
@@ -2023,57 +2024,57 @@ namespace Learner
|
|||||||
for (int i = 7; i > 0; i--)
|
for (int i = 7; i > 0; i--)
|
||||||
(ss - i)->continuationHistory = &th->continuationHistory[0][0][NO_PIECE][0]; // Use as a sentinel
|
(ss - i)->continuationHistory = &th->continuationHistory[0][0][NO_PIECE][0]; // Use as a sentinel
|
||||||
|
|
||||||
// rootMoves<EFBFBD>̐ݒ<EFBFBD>
|
// set rootMoves
|
||||||
auto& rootMoves = th->rootMoves;
|
auto& rootMoves = th->rootMoves;
|
||||||
|
|
||||||
rootMoves.clear();
|
rootMoves.clear();
|
||||||
for (auto m : MoveList<LEGAL>(pos))
|
for (auto m: MoveList<LEGAL>(pos))
|
||||||
rootMoves.push_back(Search::RootMove(m));
|
rootMoves.push_back(Search::RootMove(m));
|
||||||
|
|
||||||
assert(!rootMoves.empty());
|
assert(!rootMoves.empty());
|
||||||
|
|
||||||
//#if defined(USE_GLOBAL_OPTIONS)
|
//#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
|
// Since the generation of the substitution table for each search thread should be managed,
|
||||||
// <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
|
// Increase the generation of the substitution table for this thread because it is a new search.
|
||||||
//TT.new_search(th->thread_id());
|
//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
|
// ↑ If you call new_search here, it may be a loss because you can't use the previous search result.
|
||||||
// <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
|
// 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
|
//#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;
|
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
|
// Precondition) Search thread is set by pos.set_this_thread(Threads[thread_id]).
|
||||||
// <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
|
// Also, when Threads.stop arrives, the search is interrupted, so the PV at that time is not correct.
|
||||||
// <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
|
// After returning from search(), if Threads.stop == true, do not use the search result.
|
||||||
// <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
|
// 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>
|
//Although it was possible to specify alpha and beta with arguments, this will show the result when searching in that window
|
||||||
// <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>
|
// Because it writes to the substitution table, the value that can be pruned is written to that window when learning
|
||||||
// <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
|
// As it has a bad effect, I decided to stop allowing the window range to be specified.
|
||||||
ValueAndPV qsearch(Position& pos)
|
ValueAndPV qsearch(Position& pos)
|
||||||
{
|
{
|
||||||
Stack stack[MAX_PLY + 10], * ss = stack + 7;
|
Stack stack[MAX_PLY + 10], * ss = stack + 7;
|
||||||
Move pv[MAX_PLY + 1];
|
Move pv[MAX_PLY + 1];
|
||||||
|
|
||||||
init_for_search(pos, ss);
|
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)) {
|
if (pos.is_draw(0)) {
|
||||||
// Return draw value if draw.
|
// Return draw value if draw.
|
||||||
return { VALUE_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)
|
if (MoveList<LEGAL>(pos).size() == 0)
|
||||||
{
|
{
|
||||||
// Return the mated value if checkmated.
|
// Return the mated value if checkmated.
|
||||||
@@ -2082,7 +2083,7 @@ namespace Learner
|
|||||||
|
|
||||||
auto bestValue = ::qsearch<PV>(pos, ss, -VALUE_INFINITE, VALUE_INFINITE, 0);
|
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;
|
std::vector<Move> pvs;
|
||||||
for (Move* p = &ss->pv[0]; is_ok(*p); ++p)
|
for (Move* p = &ss->pv[0]; is_ok(*p); ++p)
|
||||||
pvs.push_back(*p);
|
pvs.push_back(*p);
|
||||||
@@ -2090,21 +2091,21 @@ namespace Learner
|
|||||||
return ValueAndPV(bestValue, pvs);
|
return ValueAndPV(bestValue, pvs);
|
||||||
}
|
}
|
||||||
|
|
||||||
// <EFBFBD>ʏ<EFBFBD><EFBFBD>T<EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>[<5B><>depth(<28><><EFBFBD><EFBFBD><EFBFBD>Ŏw<C58E><77>)<29>B
|
// Normal search. Depth depth (specified as an integer).
|
||||||
// 3<EFBFBD><EFBFBD><EFBFBD>ǂݎ<EFBFBD><EFBFBD>̃X<EFBFBD>R<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>~<7E><><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>A
|
// 3 If you want a score for hand reading,
|
||||||
// auto v = search(pos,3);
|
// auto v = search(pos,3);
|
||||||
// <EFBFBD>̂悤<EFBFBD>ɂ<EFBFBD><EFBFBD>ׂ<EFBFBD><EFBFBD>B
|
// Do something like
|
||||||
// v.first<73>ɕ]<5D><><EFBFBD>l<EFBFBD>Av.second<6E><64>PV<50><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
// Evaluation value is obtained in v.first and PV is obtained in v.second.
|
||||||
// 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
|
// When multi pv is enabled, you can get the PV (reading line) array in pos.this_thread()->rootMoves[N].pv.
|
||||||
// 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>)
|
// Specify multi pv with the argument multiPV of this function. (The value of Options["MultiPV"] is ignored)
|
||||||
//
|
|
||||||
// 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
|
|
||||||
//
|
//
|
||||||
// <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
|
// Declaration win judgment is not done as root (because it is troublesome to handle), so it is not done here.
|
||||||
// <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
|
// Handle it by the caller.
|
||||||
// <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
|
// 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 */)
|
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);
|
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 th = pos.this_thread();
|
||||||
auto& rootDepth = th->rootDepth;
|
auto& rootDepth = th->rootDepth;
|
||||||
auto& pvIdx = th->pvIdx;
|
auto& pvIdx = th->pvIdx;
|
||||||
@@ -2133,13 +2134,13 @@ namespace Learner
|
|||||||
auto& completedDepth = th->completedDepth;
|
auto& completedDepth = th->completedDepth;
|
||||||
auto& selDepth = th->selDepth;
|
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>\
|
// A function to search the top N of this stage as best move
|
||||||
//size_t multiPV = Options["MultiPV"];
|
//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());
|
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;
|
nodesLimit *= multiPV;
|
||||||
|
|
||||||
Value alpha = -VALUE_INFINITE;
|
Value alpha = -VALUE_INFINITE;
|
||||||
@@ -2148,9 +2149,9 @@ namespace Learner
|
|||||||
Value bestValue = -VALUE_INFINITE;
|
Value bestValue = -VALUE_INFINITE;
|
||||||
|
|
||||||
while ((rootDepth += 1) <= depth
|
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>
|
// exit this loop even if the node limit is exceeded
|
||||||
// <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
|
// The number of search nodes is passed in the argument of this function.
|
||||||
&& !(nodesLimit /*node<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ && th->nodes.load(std::memory_order_relaxed) >= nodesLimit)
|
&& !(nodesLimit /* limited nodes */ && th->nodes.load(std::memory_order_relaxed) >= nodesLimit)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
for (RootMove& rm : rootMoves)
|
for (RootMove& rm : rootMoves)
|
||||||
@@ -2170,10 +2171,10 @@ namespace Learner
|
|||||||
break;
|
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;
|
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)
|
if (rootDepth >= 5 * 1)
|
||||||
{
|
{
|
||||||
delta = Value(20);
|
delta = Value(20);
|
||||||
@@ -2194,8 +2195,8 @@ namespace Learner
|
|||||||
stable_sort(rootMoves.begin() + pvIdx, rootMoves.end());
|
stable_sort(rootMoves.begin() + pvIdx, rootMoves.end());
|
||||||
//my_stable_sort(pos.this_thread()->thread_id(),&rootMoves[0] + pvIdx, rootMoves.size() - pvIdx);
|
//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
|
// Expand aspiration window for fail low/high.
|
||||||
// <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
|
// However, if it is the value specified by the argument, it will be treated as fail low/high and break.
|
||||||
if (bestValue <= alpha)
|
if (bestValue <= alpha)
|
||||||
{
|
{
|
||||||
beta = (alpha + beta) / 2;
|
beta = (alpha + beta) / 2;
|
||||||
@@ -2217,7 +2218,7 @@ namespace Learner
|
|||||||
delta += delta / 4 + 5;
|
delta += delta / 4 + 5;
|
||||||
assert(-VALUE_INFINITE <= alpha && beta <= VALUE_INFINITE);
|
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 );
|
//assert(th->nodes.load(std::memory_order_relaxed) <= 1000000 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2229,9 +2230,9 @@ namespace Learner
|
|||||||
completedDepth = rootDepth;
|
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
|
// Pass PV_is(ok) to eliminate this PV, there may be NULL_MOVE in the middle.
|
||||||
// <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
|
// → PV should not be NULL_MOVE because it is PV
|
||||||
// MOVE_WIN<EFBFBD><EFBFBD><EFBFBD>˂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>邱<EFBFBD>Ƃ͂Ȃ<EFBFBD><EFBFBD>B(<28><><EFBFBD>܂̂Ƃ<CC82><C682><EFBFBD>)
|
// MOVE_WIN has never been thrust. (For now)
|
||||||
for (Move move : rootMoves[0].pv)
|
for (Move move : rootMoves[0].pv)
|
||||||
{
|
{
|
||||||
if (!is_ok(move))
|
if (!is_ok(move))
|
||||||
@@ -2241,7 +2242,7 @@ namespace Learner
|
|||||||
|
|
||||||
//sync_cout << rootDepth << sync_endl;
|
//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;
|
bestValue = rootMoves[0].score;
|
||||||
|
|
||||||
return ValueAndPV(bestValue, pvs);
|
return ValueAndPV(bestValue, pvs);
|
||||||
|
|||||||
16
src/types.h
16
src/types.h
@@ -192,7 +192,7 @@ enum Value : int {
|
|||||||
|
|
||||||
MidgameLimit = 15258, EndgameLimit = 3915,
|
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,
|
VALUE_MAX_EVAL = 27000,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -239,7 +239,7 @@ enum Square : int {
|
|||||||
SQ_NONE,
|
SQ_NONE,
|
||||||
|
|
||||||
SQUARE_ZERO = 0, SQUARE_NB = 64,
|
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 {
|
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
|
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); }
|
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)); }
|
constexpr Square Mir(Square sq) { return make_square(File(7 - (int)file_of(sq)), rank_of(sq)); }
|
||||||
|
|
||||||
#if defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
#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
|
enum PieceNumber : uint8_t
|
||||||
{
|
{
|
||||||
PIECE_NUMBER_PAWN = 0,
|
PIECE_NUMBER_PAWN = 0,
|
||||||
@@ -484,7 +484,7 @@ enum PieceNumber : uint8_t
|
|||||||
PIECE_NUMBER_QUEEN = 28,
|
PIECE_NUMBER_QUEEN = 28,
|
||||||
PIECE_NUMBER_KING = 30,
|
PIECE_NUMBER_KING = 30,
|
||||||
PIECE_NUMBER_WKING = 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_ZERO = 0,
|
||||||
PIECE_NUMBER_NB = 32,
|
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); }
|
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; }
|
constexpr bool is_ok(PieceNumber pn) { return pn < PIECE_NUMBER_NB; }
|
||||||
#endif // defined(EVAL_NNUE) || defined(EVAL_LEARN)
|
#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
|
// FEN string of the initial position, normal chess
|
||||||
const char* StartFEN = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
|
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)
|
#if defined (EVAL_LEARN)
|
||||||
namespace Learner
|
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);
|
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);
|
void learn(Position& pos, istringstream& is);
|
||||||
|
|
||||||
#if defined(GENSFEN2019)
|
#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);
|
void gen_sfen2019(Position& pos, istringstream& is);
|
||||||
#endif
|
#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;
|
typedef std::pair<Value, std::vector<Move> > ValueAndPV;
|
||||||
|
|
||||||
ValueAndPV qsearch(Position& pos);
|
ValueAndPV qsearch(Position& pos);
|
||||||
@@ -71,7 +71,7 @@ namespace Learner
|
|||||||
#if defined(EVAL_NNUE) && defined(ENABLE_TEST_CMD)
|
#if defined(EVAL_NNUE) && defined(ENABLE_TEST_CMD)
|
||||||
void test_cmd(Position& pos, istringstream& is)
|
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();
|
is_ready();
|
||||||
|
|
||||||
std::string param;
|
std::string param;
|
||||||
@@ -221,21 +221,21 @@ namespace {
|
|||||||
<< "\nNodes/second : " << 1000 * nodes / elapsed << endl;
|
<< "\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;
|
uint64_t eval_sum;
|
||||||
} // namespace
|
} // 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>)
|
// Make is_ready_cmd() callable from outside. (Because I want to call it from the bench command etc.)
|
||||||
// <EFBFBD>ǖʂ͏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>̂Œ<EFBFBD><EFBFBD>ӁB
|
// Note that the phase is not initialized.
|
||||||
void is_ready(bool skipCorruptCheck)
|
void is_ready(bool skipCorruptCheck)
|
||||||
{
|
{
|
||||||
#if defined(EVAL_NNUE)
|
#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>)
|
// After receiving "isready", modify so that a line feed is sent every 5 seconds until "readyok" is returned. (keep alive processing)
|
||||||
// USI2.0<EFBFBD>̎d<EFBFBD>l<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
// From USI 2.0 specifications.
|
||||||
// -"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
|
// -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,
|
||||||
// <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
|
// You should send some kind of message (breakable) from the thinking engine side.
|
||||||
// -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
|
// -Shogi GUI already does so, so MyShogi will follow along.
|
||||||
// -<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
|
//-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 ended = false;
|
||||||
auto th = std::thread([&ended] {
|
auto th = std::thread([&ended] {
|
||||||
@@ -243,25 +243,25 @@ void is_ready(bool skipCorruptCheck)
|
|||||||
while (!ended)
|
while (!ended)
|
||||||
{
|
{
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
if (++count >= 50 /* 5<EFBFBD>b */)
|
if (++count >= 50 /* 5 seconds */)
|
||||||
{
|
{
|
||||||
count = 0;
|
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
|
// Perform processing that may take time, such as reading the evaluation function, at this timing.
|
||||||
// <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
|
// 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)
|
if (!UCI::load_eval_finished)
|
||||||
{
|
{
|
||||||
// <EFBFBD>]<5D><><EFBFBD><EFBFBD><D690>̓ǂݍ<C782><DD8D><EFBFBD>
|
// Read evaluation function
|
||||||
Eval::load_eval();
|
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();
|
eval_sum = Eval::calc_check_sum();
|
||||||
|
|
||||||
// <EFBFBD>\<5C>t<EFBFBD>g<EFBFBD><67><EFBFBD>̕\<5C><>
|
// display soft name
|
||||||
Eval::print_softname(eval_sum);
|
Eval::print_softname(eval_sum);
|
||||||
|
|
||||||
UCI::load_eval_finished = true;
|
UCI::load_eval_finished = true;
|
||||||
@@ -269,14 +269,14 @@ void is_ready(bool skipCorruptCheck)
|
|||||||
}
|
}
|
||||||
else
|
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
|
// Check the checksum every time to see if the memory has been corrupted.
|
||||||
// <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
|
// 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())
|
if (!skipCorruptCheck && eval_sum != Eval::calc_check_sum())
|
||||||
sync_cout << "Error! : EVAL memory is corrupted" << sync_endl;
|
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>
|
// For isready, it is promised that the next command will not come until it returns readyok.
|
||||||
// <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
|
// Initialize various variables at this timing.
|
||||||
|
|
||||||
TT.resize(Options["Hash"]);
|
TT.resize(Options["Hash"]);
|
||||||
Search::clear();
|
Search::clear();
|
||||||
@@ -284,7 +284,7 @@ void is_ready(bool skipCorruptCheck)
|
|||||||
|
|
||||||
Threads.stop = false;
|
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;
|
ended = true;
|
||||||
th.join();
|
th.join();
|
||||||
#endif // defined(EVAL_NNUE)
|
#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)
|
#if defined(EVAL_LEARN)
|
||||||
@@ -391,10 +391,10 @@ void UCI::loop(int argc, char* argv[]) {
|
|||||||
else if (token == "learn") Learner::learn(pos, is);
|
else if (token == "learn") Learner::learn(pos, is);
|
||||||
|
|
||||||
#if defined (GENSFEN2019)
|
#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);
|
else if (token == "gensfen2019") Learner::gen_sfen2019(pos, is);
|
||||||
#endif
|
#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 == "qsearch") qsearch_cmd(pos);
|
||||||
else if (token == "search") search_cmd(pos, is);
|
else if (token == "search") search_cmd(pos, is);
|
||||||
|
|
||||||
@@ -405,7 +405,7 @@ void UCI::loop(int argc, char* argv[]) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(EVAL_NNUE) && defined(ENABLE_TEST_CMD)
|
#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);
|
else if (token == "test") test_cmd(pos, is);
|
||||||
#endif
|
#endif
|
||||||
else
|
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);
|
std::string pv(const Position& pos, Depth depth, Value alpha, Value beta);
|
||||||
Move to_move(const Position& pos, std::string& str);
|
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;
|
extern bool load_eval_finished; // = false;
|
||||||
} // namespace UCI
|
} // namespace UCI
|
||||||
|
|
||||||
extern UCI::OptionsMap Options;
|
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
|
// Processing when USI "isready" command is called. At this time, the evaluation function is read.
|
||||||
// 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
|
// Used when you want to load the evaluation function when "isready" does not come in handler of benchmark command etc.
|
||||||
// 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
|
// If skipCorruptCheck == true, skip memory corruption check by check sum when reading the evaluation function a second time.
|
||||||
// <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
|
// * This function is inconvenient if it is not available in Stockfish, so add it.
|
||||||
|
|
||||||
void is_ready(bool skipCorruptCheck = false);
|
void is_ready(bool skipCorruptCheck = false);
|
||||||
|
|
||||||
extern const char* StartFEN;
|
extern const char* StartFEN;
|
||||||
|
|||||||
@@ -79,21 +79,21 @@ void init(OptionsMap& o) {
|
|||||||
o["SyzygyProbeDepth"] << Option(1, 1, 100);
|
o["SyzygyProbeDepth"] << Option(1, 1, 100);
|
||||||
o["Syzygy50MoveRule"] << Option(true);
|
o["Syzygy50MoveRule"] << Option(true);
|
||||||
o["SyzygyProbeLimit"] << Option(7, 0, 7);
|
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);
|
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>
|
// When the evaluation function is loaded at the isready timing, it is necessary to convert the new evaluation function.
|
||||||
// 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>
|
// I want to hit the test eval convert command, but there is no new evaluation function
|
||||||
// <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
|
// It ends abnormally before executing this command.
|
||||||
// <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
|
// Therefore, with this hidden option, you can suppress the loading of the evaluation function when isready,
|
||||||
// test evalconvert<EFBFBD>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD><68><EFBFBD>@<40><><EFBFBD>B
|
// Hit the test eval convert command.
|
||||||
o["SkipLoadingEval"] << Option(false);
|
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);
|
o["BookMoves"] << Option(16, 0, 10000);
|
||||||
|
|
||||||
#if defined(EVAL_LEARN)
|
#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
|
// When learning the evaluation function, you can change the folder to save the evaluation function.
|
||||||
// <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
|
// Evalsave by default. This folder shall be prepared in advance.
|
||||||
// <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
|
// Automatically dig a folder under this folder like "0/", "1/", ... and save the evaluation function file there.
|
||||||
o["EvalSaveDir"] << Option("evalsave");
|
o["EvalSaveDir"] << Option("evalsave");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -204,6 +204,6 @@ Option& Option::operator=(const string& v) {
|
|||||||
return *this;
|
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;
|
bool load_eval_finished = false;
|
||||||
} // namespace UCI
|
} // namespace UCI
|
||||||
|
|||||||
Reference in New Issue
Block a user