mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-17 23:56:23 +08:00
Small touches to book.cpp
No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
61
src/book.cpp
61
src/book.cpp
@@ -361,8 +361,8 @@ Book::~Book() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Book::close() closes the file only if it is open, otherwise
|
/// Book::close() closes the file only if it is open, otherwise the call fails
|
||||||
/// we can end up in a little mess due to how std::ifstream works.
|
/// and the failbit internal state flag is set.
|
||||||
|
|
||||||
void Book::close() {
|
void Book::close() {
|
||||||
|
|
||||||
@@ -374,21 +374,20 @@ void Book::close() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Book::open() opens a book file with a given file name
|
/// Book::open() opens a book file with a given name
|
||||||
|
|
||||||
void Book::open(const string& fileName) {
|
void Book::open(const string& fileName) {
|
||||||
|
|
||||||
// Close old file before opening the new
|
// Close old file before opening the new
|
||||||
close();
|
close();
|
||||||
|
|
||||||
bookFile.open(fileName.c_str(), ifstream::in | ifstream::binary);
|
bookFile.open(fileName.c_str(), ifstream::in | ifstream::binary |ios::ate);
|
||||||
|
|
||||||
// Silently return when asked to open a non-exsistent file
|
// Silently return when asked to open a non-exsistent file
|
||||||
if (!bookFile.is_open())
|
if (!bookFile.is_open())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Get the book size in number of entries
|
// Get the book size in number of entries, we are already at the file end
|
||||||
bookFile.seekg(0, ios::end);
|
|
||||||
bookSize = long(bookFile.tellg()) / sizeof(BookEntry);
|
bookSize = long(bookFile.tellg()) / sizeof(BookEntry);
|
||||||
|
|
||||||
if (!bookFile.good())
|
if (!bookFile.good())
|
||||||
@@ -402,44 +401,34 @@ void Book::open(const string& fileName) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Book::get_move() gets a book move for a given position. Returns
|
/// Book::probe() gets a book move for a given position. Returns MOVE_NONE
|
||||||
/// MOVE_NONE if no book move is found. If findBestMove is true then
|
/// if no book move is found. If findBest is true then returns always the
|
||||||
/// return always the highest rated book move.
|
/// highest rated move otherwise chooses randomly based on the move score.
|
||||||
|
|
||||||
Move Book::get_move(const Position& pos, bool findBestMove) {
|
Move Book::probe(const Position& pos, bool findBest) {
|
||||||
|
|
||||||
if (!bookSize || !bookFile.is_open())
|
if (!bookSize || !bookFile.is_open())
|
||||||
return MOVE_NONE;
|
return MOVE_NONE;
|
||||||
|
|
||||||
BookEntry entry;
|
BookEntry entry;
|
||||||
int bookMove = MOVE_NONE;
|
unsigned scoresSum = 0, bestScore = 0, bookMove = 0;
|
||||||
unsigned score, scoresSum = 0, bestScore = 0;
|
|
||||||
uint64_t key = book_key(pos);
|
uint64_t key = book_key(pos);
|
||||||
|
int idx = first_entry(key) - 1;
|
||||||
|
|
||||||
// Choose a book move among the possible moves for the given position
|
// Choose a book move among the possible moves for the given position
|
||||||
for (int idx = first_entry(key); idx < bookSize; idx++)
|
while (++idx < bookSize && (entry = read_entry(idx), entry.key == key))
|
||||||
{
|
{
|
||||||
entry = read_entry(idx);
|
scoresSum += entry.count;
|
||||||
|
|
||||||
if (entry.key != key)
|
// Choose book move according to its score. If a move has a very
|
||||||
break;
|
// high score it has higher probability to be choosen than a move
|
||||||
|
// with lower score. Note that first entry is always chosen.
|
||||||
score = entry.count;
|
if ( RKiss.rand<unsigned>() % scoresSum < entry.count
|
||||||
|
|| (findBest && entry.count > bestScore))
|
||||||
if (!findBestMove)
|
|
||||||
{
|
|
||||||
// Choose book move according to its score. If a move has a very
|
|
||||||
// high score it has higher probability to be choosen than a move
|
|
||||||
// with lower score. Note that first entry is always chosen.
|
|
||||||
scoresSum += score;
|
|
||||||
if (RKiss.rand<unsigned>() % scoresSum < score)
|
|
||||||
bookMove = entry.move;
|
|
||||||
}
|
|
||||||
else if (score > bestScore)
|
|
||||||
{
|
|
||||||
bestScore = score;
|
|
||||||
bookMove = entry.move;
|
bookMove = entry.move;
|
||||||
}
|
|
||||||
|
if (entry.count > bestScore)
|
||||||
|
bestScore = entry.count;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bookMove)
|
if (!bookMove)
|
||||||
@@ -458,12 +447,12 @@ Move Book::get_move(const Position& pos, bool findBestMove) {
|
|||||||
int promotion = (bookMove >> 12) & 7;
|
int promotion = (bookMove >> 12) & 7;
|
||||||
|
|
||||||
if (promotion)
|
if (promotion)
|
||||||
bookMove = int(make_promotion_move(move_from(Move(bookMove)),
|
bookMove = make_promotion_move(move_from(Move(bookMove)),
|
||||||
move_to(Move(bookMove)),
|
move_to(Move(bookMove)),
|
||||||
PieceType(promotion + 1)));
|
PieceType(promotion + 1));
|
||||||
// Verify the book move is legal
|
// Verify the book move is legal
|
||||||
for (MoveList<MV_LEGAL> ml(pos); !ml.end(); ++ml)
|
for (MoveList<MV_LEGAL> ml(pos); !ml.end(); ++ml)
|
||||||
if ((ml.move() & ~(3 << 14)) == bookMove) // Mask out special flags
|
if (unsigned(ml.move() & ~(3 << 14)) == bookMove) // Mask out special flags
|
||||||
return ml.move();
|
return ml.move();
|
||||||
|
|
||||||
return MOVE_NONE;
|
return MOVE_NONE;
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public:
|
|||||||
~Book();
|
~Book();
|
||||||
void open(const std::string& fileName);
|
void open(const std::string& fileName);
|
||||||
void close();
|
void close();
|
||||||
Move get_move(const Position& pos, bool findBestMove);
|
Move probe(const Position& pos, bool findBestMove);
|
||||||
const std::string name() const { return bookName; }
|
const std::string name() const { return bookName; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -391,7 +391,7 @@ bool think(Position& pos, const SearchLimits& limits, Move searchMoves[]) {
|
|||||||
if (Options["Book File"].value<string>() != book.name())
|
if (Options["Book File"].value<string>() != book.name())
|
||||||
book.open(Options["Book File"].value<string>());
|
book.open(Options["Book File"].value<string>());
|
||||||
|
|
||||||
Move bookMove = book.get_move(pos, Options["Best Book Move"].value<bool>());
|
Move bookMove = book.probe(pos, Options["Best Book Move"].value<bool>());
|
||||||
if (bookMove != MOVE_NONE)
|
if (bookMove != MOVE_NONE)
|
||||||
{
|
{
|
||||||
if (Limits.ponder)
|
if (Limits.ponder)
|
||||||
|
|||||||
Reference in New Issue
Block a user