From: Marco Costalba Date: Mon, 3 Oct 2011 07:02:46 +0000 (+0100) Subject: Small touches to book.cpp X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=80dd90f9722ecedb48605a6cd59e2d59a1bb2495;hp=c2c185423b13b0227c86009c6006e48e8d258896 Small touches to book.cpp No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/book.cpp b/src/book.cpp index 7dac7e72..243583ff 100644 --- a/src/book.cpp +++ b/src/book.cpp @@ -361,8 +361,8 @@ Book::~Book() { } -/// Book::close() closes the file only if it is open, otherwise -/// we can end up in a little mess due to how std::ifstream works. +/// Book::close() closes the file only if it is open, otherwise the call fails +/// and the failbit internal state flag is set. 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) { // Close old file before opening the new 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 if (!bookFile.is_open()) return; - // Get the book size in number of entries - bookFile.seekg(0, ios::end); + // Get the book size in number of entries, we are already at the file end bookSize = long(bookFile.tellg()) / sizeof(BookEntry); 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 -/// MOVE_NONE if no book move is found. If findBestMove is true then -/// return always the highest rated book move. +/// Book::probe() gets a book move for a given position. Returns MOVE_NONE +/// if no book move is found. If findBest is true then returns always the +/// 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()) return MOVE_NONE; BookEntry entry; - int bookMove = MOVE_NONE; - unsigned score, scoresSum = 0, bestScore = 0; + unsigned scoresSum = 0, bestScore = 0, bookMove = 0; uint64_t key = book_key(pos); + int idx = first_entry(key) - 1; // 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); - - if (entry.key != key) - break; - - score = entry.count; - - 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() % scoresSum < score) - bookMove = entry.move; - } - else if (score > bestScore) - { - bestScore = score; + scoresSum += entry.count; + + // 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. + if ( RKiss.rand() % scoresSum < entry.count + || (findBest && entry.count > bestScore)) bookMove = entry.move; - } + + if (entry.count > bestScore) + bestScore = entry.count; } if (!bookMove) @@ -458,12 +447,12 @@ Move Book::get_move(const Position& pos, bool findBestMove) { int promotion = (bookMove >> 12) & 7; if (promotion) - bookMove = int(make_promotion_move(move_from(Move(bookMove)), - move_to(Move(bookMove)), - PieceType(promotion + 1))); + bookMove = make_promotion_move(move_from(Move(bookMove)), + move_to(Move(bookMove)), + PieceType(promotion + 1)); // Verify the book move is legal for (MoveList 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 MOVE_NONE; diff --git a/src/book.h b/src/book.h index 07c00b45..0690d32b 100644 --- a/src/book.h +++ b/src/book.h @@ -44,7 +44,7 @@ public: ~Book(); void open(const std::string& fileName); void close(); - Move get_move(const Position& pos, bool findBestMove); + Move probe(const Position& pos, bool findBestMove); const std::string name() const { return bookName; } private: diff --git a/src/search.cpp b/src/search.cpp index 61a394a1..eea091d4 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -391,7 +391,7 @@ bool think(Position& pos, const SearchLimits& limits, Move searchMoves[]) { if (Options["Book File"].value() != book.name()) book.open(Options["Book File"].value()); - Move bookMove = book.get_move(pos, Options["Best Book Move"].value()); + Move bookMove = book.probe(pos, Options["Best Book Move"].value()); if (bookMove != MOVE_NONE) { if (Limits.ponder)