X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbook.cpp;h=243583ff18276000a7c5050f0a54ffe330ff0bff;hp=7dac7e7233ac3d2f052011470ed163ea7f679881;hb=80dd90f9722ecedb48605a6cd59e2d59a1bb2495;hpb=c2c185423b13b0227c86009c6006e48e8d258896 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;